@pixpilot/scaffoldfy 0.23.0 → 0.24.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.cjs CHANGED
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- const e=require(`./utils-CdfjwUZm.cjs`),t=require(`./src-C2AFidMo.cjs`);let n=require(`node:fs`);n=e._(n);let r=require(`node:path`);r=e._(r);let i=require(`node:process`);i=e._(i);let a=require(`commander`);a=e._(a);let o=require(`node:url`);o=e._(o);let s=require(`ajv`);s=e._(s);const c=1,l=(0,o.fileURLToPath)(require(`url`).pathToFileURL(__filename).href),u=r.default.dirname(l);function d(){return new s.default({allErrors:!0,verbose:!0,strict:!1,discriminator:!0})}function f(){let e=r.default.join(u,`..`,`schema`,`tasks.schema.json`);try{let t=n.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 p(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 m(t,n={}){try{let e=d(),r=f(),i=e.compile(r);if(!i(t)&&i.errors){let e=p(i.errors);return e.length===0?{valid:!0,errors:[]}:(n.silent||h(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.i(`❌ Schema validation error:`,`error`),e.i(` ${r}`,`error`)),{valid:!1,errors:[r]}}}function h(t){e.i(`❌ Schema validation failed:`,`error`),e.i(``,`error`),e.i(`The following validation errors were found:`,`error`),e.i(``,`error`);for(let n of t)e.i(` • ${n}`,`error`);e.i(``,`error`),e.i(`Please fix these errors in your template configuration file.`,`error`),e.i(``,`error`),e.i(`For schema documentation, see: https://github.com/pixpilot/scaffoldfy/tree/main/packages/scaffoldfy/schema`,`info`)}const g=new a.Command,_=r.default.join(__dirname,`..`,`package.json`);let v=`0.0.0`;try{v=JSON.parse(n.default.readFileSync(_,`utf-8`)).version??`0.0.0`}catch{}g.name(`scaffoldfy`).description(`Automate project setup and configuration with customizable tasks`).version(v),g.option(`--dry-run`,`Run in dry mode without making any changes`).option(`--force`,`Force execution even if checks fail`).option(`--tasks-file <path>`,`Path to JSON file containing task definitions`,`./template-tasks.json`).option(`--tasks-ts <path>`,`Path to TypeScript file exporting tasks`,`./template-tasks.ts`).option(`--no-validate`,`Skip schema validation of task configuration (validation is enabled by default)`).action(async a=>{try{let o=[],s,c,l,u;if(a.tasksTs!=null&&a.tasksTs!==``){let t=r.default.resolve(i.default.cwd(),a.tasksTs);if(n.default.existsSync(t)){e.i(`Loading tasks from TypeScript file: ${a.tasksTs}`,`info`),u=t;try{let n=await import(t);o=n.default??n.tasks??[],(!Array.isArray(o)||o.length===0)&&(e.i(`⚠️ No tasks found in TypeScript file or invalid format`,`warn`),e.i(`Expected default export or named export "tasks" with TaskDefinition[]`,`info`))}catch(t){e.i(`Failed to load TypeScript tasks file: ${a.tasksTs}`,`error`),t instanceof Error&&e.i(` Error: ${t.message}`,`error`),i.default.exit(1)}}}if(o.length===0&&a.tasksFile!=null&&a.tasksFile!==``){let d=r.default.resolve(i.default.cwd(),a.tasksFile);if(n.default.existsSync(d)){u=d;try{if(a.validate!==!1){e.i(`Validating task configuration against schema...`,`info`);let t=n.default.readFileSync(d,`utf-8`);m(JSON.parse(t),{silent:!1}).valid||(e.i(``,`error`),e.i(`💡 You can skip validation with --no-validate flag, but this is not recommended.`,`info`),i.default.exit(1)),e.i(`✓ Schema validation passed`,`success`)}let r=await t.q(d);o=r.tasks,s=r.variables,c=r.prompts,l=r.enabled,Array.isArray(o)||(e.i(`❌ Invalid tasks file format`,`error`),e.i(`Expected JSON with { "tasks": [...] } structure`,`info`),i.default.exit(1))}catch(t){e.i(`Failed to load JSON tasks file: ${a.tasksFile}`,`error`),t instanceof Error&&e.i(` Error: ${t.message}`,`error`),i.default.exit(1)}}else e.i(`Tasks file not found: ${a.tasksFile}`,`warn`)}let d=c!=null&&c.length>0||s!=null&&s.length>0;o.length===0&&!d&&(e.i(`❌ No tasks defined`,`error`),e.i(`Please provide tasks using one of these methods:`,`info`),e.i(` 1. Create a template-tasks.json file in the current directory`,`info`),e.i(` 2. Create a template-tasks.ts file in the current directory`,`info`),e.i(` 3. Use --tasks-file option to specify a different JSON file`,`info`),e.i(` 4. Use --tasks-ts option to specify a different TypeScript file`,`info`),e.i(`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)),i.default.exit(1)),o.length===0?e.i(`Loaded template with 0 tasks (template may only provide prompts/variables for extending)`,`info`):e.i(`Loaded ${o.length} task(s)`,`success`),await t.n(o,{dryRun:a.dryRun,force:a.force,tasksFilePath:u,globalVariables:s,globalPrompts:c,templateEnabled:l})}catch(t){if(e.i(`❌ CLI execution failed`,`error`),t instanceof Error){e.i(`Error: ${t.message}`,`error`);let n=i.default.env.DEBUG;n!=null&&n!==``&&console.error(t.stack)}else console.error(t);i.default.exit(1)}}),g.parse(i.default.argv);
2
+ const e=require(`./utils-Bhsv13ij.cjs`);require(`./config-DlJs75hK.cjs`);const t=require(`./run-tasks-Bn4lboAE.cjs`),n=require(`./src-BlvCkBsJ.cjs`);let r=require(`node:fs`);r=e._(r);let i=require(`node:path`);i=e._(i);let a=require(`node:process`);a=e._(a);let o=require(`commander`);o=e._(o);let s=require(`node:url`);s=e._(s);let c=require(`ajv`);c=e._(c);const l=1,u=(0,s.fileURLToPath)(require(`url`).pathToFileURL(__filename).href),d=i.default.dirname(u);function f(){return new c.default({allErrors:!0,verbose:!0,strict:!1,discriminator:!0})}function p(){let e=i.default.join(d,`..`,`schema`,`tasks.schema.json`);try{let t=r.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 m(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 h(t,n={}){try{let e=f(),r=p(),i=e.compile(r);if(!i(t)&&i.errors){let e=m(i.errors);return e.length===0?{valid:!0,errors:[]}:(n.silent||g(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.i(`❌ Schema validation error:`,`error`),e.i(` ${r}`,`error`)),{valid:!1,errors:[r]}}}function g(t){e.i(`❌ Schema validation failed:`,`error`),e.i(``,`error`),e.i(`The following validation errors were found:`,`error`),e.i(``,`error`);for(let n of t)e.i(` • ${n}`,`error`);e.i(``,`error`),e.i(`Please fix these errors in your template configuration file.`,`error`),e.i(``,`error`),e.i(`For schema documentation, see: https://github.com/pixpilot/scaffoldfy/tree/main/packages/scaffoldfy/schema`,`info`)}const _=new o.Command,v=i.default.join(__dirname,`..`,`package.json`);let y=`0.0.0`;try{y=JSON.parse(r.default.readFileSync(v,`utf-8`)).version??`0.0.0`}catch{}_.name(`scaffoldfy`).description(`Automate project setup and configuration with customizable tasks`).version(y),_.option(`--dry-run`,`Run in dry mode without making any changes`).option(`--force`,`Force execution even if checks fail`).option(`--tasks-file <path>`,`Path to JSON file containing task definitions`,`./template-tasks.json`).option(`--tasks-ts <path>`,`Path to TypeScript file exporting tasks`,`./template-tasks.ts`).option(`--no-validate`,`Skip schema validation of task configuration (validation is enabled by default)`).action(async o=>{try{let s=[],c,l,u,d;if(o.tasksTs!=null&&o.tasksTs!==``){let t=i.default.resolve(a.default.cwd(),o.tasksTs);if(r.default.existsSync(t)){e.i(`Loading tasks from TypeScript file: ${o.tasksTs}`,`info`),d=t;try{let n=await import(t);s=n.default??n.tasks??[],(!Array.isArray(s)||s.length===0)&&(e.i(`⚠️ No tasks found in TypeScript file or invalid format`,`warn`),e.i(`Expected default export or named export "tasks" with TaskDefinition[]`,`info`))}catch(t){e.i(`Failed to load TypeScript tasks file: ${o.tasksTs}`,`error`),t instanceof Error&&e.i(` Error: ${t.message}`,`error`),a.default.exit(1)}}}if(s.length===0&&o.tasksFile!=null&&o.tasksFile!==``){let n=i.default.resolve(a.default.cwd(),o.tasksFile);if(r.default.existsSync(n)){d=n;try{if(o.validate!==!1){e.i(`Validating task configuration against schema...`,`info`);let t=r.default.readFileSync(n,`utf-8`);h(JSON.parse(t),{silent:!1}).valid||(e.i(``,`error`),e.i(`💡 You can skip validation with --no-validate flag, but this is not recommended.`,`info`),a.default.exit(1)),e.i(`✓ Schema validation passed`,`success`)}let i=await t.q(n,{sequential:!0});if(i.templates!=null&&i.templates.length>0){e.i(`Using sequential template processing mode`,`info`);let{runTemplatesSequentially:t}=await Promise.resolve().then(()=>require(`./run-tasks-BZQH28T_.cjs`)),{createInitialConfig:r}=await Promise.resolve().then(()=>require(`./config-DmK0Erv2.cjs`));await t(i.templates,{dryRun:o.dryRun??!1,force:o.force??!1,tasksFilePath:n},r()),a.default.exit(0)}s=i.tasks,c=i.variables,l=i.prompts,u=i.enabled,Array.isArray(s)||(e.i(`❌ Invalid tasks file format`,`error`),e.i(`Expected JSON with { "tasks": [...] } structure`,`info`),a.default.exit(1))}catch(t){e.i(`Failed to load JSON tasks file: ${o.tasksFile}`,`error`),t instanceof Error&&e.i(` Error: ${t.message}`,`error`),a.default.exit(1)}}else e.i(`Tasks file not found: ${o.tasksFile}`,`warn`)}let f=l!=null&&l.length>0||c!=null&&c.length>0;s.length===0&&!f&&(e.i(`❌ No tasks defined`,`error`),e.i(`Please provide tasks using one of these methods:`,`info`),e.i(` 1. Create a template-tasks.json file in the current directory`,`info`),e.i(` 2. Create a template-tasks.ts file in the current directory`,`info`),e.i(` 3. Use --tasks-file option to specify a different JSON file`,`info`),e.i(` 4. Use --tasks-ts option to specify a different TypeScript file`,`info`),e.i(`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)),a.default.exit(1)),s.length===0?e.i(`Loaded template with 0 tasks (template may only provide prompts/variables for extending)`,`info`):e.i(`Loaded ${s.length} task(s)`,`success`),await n.n(s,{dryRun:o.dryRun,force:o.force,tasksFilePath:d,globalVariables:c,globalPrompts:l,templateEnabled:u})}catch(t){if(e.i(`❌ CLI execution failed`,`error`),t instanceof Error){e.i(`Error: ${t.message}`,`error`);let n=a.default.env.DEBUG;n!=null&&n!==``&&console.error(t.stack)}else console.error(t);a.default.exit(1)}}),_.parse(a.default.argv);
package/dist/cli.js CHANGED
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- import{n as e,q as t}from"./src-DNp4KfEG.js";import{i as n}from"./utils-DfD7I1u2.js";import r from"node:path";import{fileURLToPath as i}from"node:url";import a from"node:fs";import o from"node:process";import{Command as s}from"commander";import c from"ajv";const l=()=>i(import.meta.url),u=(()=>r.dirname(l()))(),d=i(import.meta.url),f=r.dirname(d);function p(){return new c({allErrors:!0,verbose:!0,strict:!1,discriminator:!0})}function m(){let e=r.join(f,`..`,`schema`,`tasks.schema.json`);try{let t=a.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,t={}){try{let n=p(),r=m(),i=n.compile(r);if(!i(e)&&i.errors){let e=h(i.errors);return e.length===0?{valid:!0,errors:[]}:(t.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 t.silent||(n(`❌ Schema validation error:`,`error`),n(` ${r}`,`error`)),{valid:!1,errors:[r]}}}function _(e){n(`❌ Schema validation failed:`,`error`),n(``,`error`),n(`The following validation errors were found:`,`error`),n(``,`error`);for(let t of e)n(` • ${t}`,`error`);n(``,`error`),n(`Please fix these errors in your template configuration file.`,`error`),n(``,`error`),n(`For schema documentation, see: https://github.com/pixpilot/scaffoldfy/tree/main/packages/scaffoldfy/schema`,`info`)}const v=new s,y=r.join(u,`..`,`package.json`);let b=`0.0.0`;try{b=JSON.parse(a.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(`--tasks-file <path>`,`Path to JSON file containing task definitions`,`./template-tasks.json`).option(`--tasks-ts <path>`,`Path to TypeScript file exporting tasks`,`./template-tasks.ts`).option(`--no-validate`,`Skip schema validation of task configuration (validation is enabled by default)`).action(async i=>{try{let s=[],c,l,u,d;if(i.tasksTs!=null&&i.tasksTs!==``){let e=r.resolve(o.cwd(),i.tasksTs);if(a.existsSync(e)){n(`Loading tasks from TypeScript file: ${i.tasksTs}`,`info`),d=e;try{let t=await import(e);s=t.default??t.tasks??[],(!Array.isArray(s)||s.length===0)&&(n(`⚠️ No tasks found in TypeScript file or invalid format`,`warn`),n(`Expected default export or named export "tasks" with TaskDefinition[]`,`info`))}catch(e){n(`Failed to load TypeScript tasks file: ${i.tasksTs}`,`error`),e instanceof Error&&n(` Error: ${e.message}`,`error`),o.exit(1)}}}if(s.length===0&&i.tasksFile!=null&&i.tasksFile!==``){let e=r.resolve(o.cwd(),i.tasksFile);if(a.existsSync(e)){d=e;try{if(i.validate!==!1){n(`Validating task configuration against schema...`,`info`);let t=a.readFileSync(e,`utf-8`);g(JSON.parse(t),{silent:!1}).valid||(n(``,`error`),n(`💡 You can skip validation with --no-validate flag, but this is not recommended.`,`info`),o.exit(1)),n(`✓ Schema validation passed`,`success`)}let r=await t(e);s=r.tasks,c=r.variables,l=r.prompts,u=r.enabled,Array.isArray(s)||(n(`❌ Invalid tasks file format`,`error`),n(`Expected JSON with { "tasks": [...] } structure`,`info`),o.exit(1))}catch(e){n(`Failed to load JSON tasks file: ${i.tasksFile}`,`error`),e instanceof Error&&n(` Error: ${e.message}`,`error`),o.exit(1)}}else n(`Tasks file not found: ${i.tasksFile}`,`warn`)}let f=l!=null&&l.length>0||c!=null&&c.length>0;s.length===0&&!f&&(n(`❌ No tasks defined`,`error`),n(`Please provide tasks using one of these methods:`,`info`),n(` 1. Create a template-tasks.json file in the current directory`,`info`),n(` 2. Create a template-tasks.ts file in the current directory`,`info`),n(` 3. Use --tasks-file option to specify a different JSON file`,`info`),n(` 4. Use --tasks-ts option to specify a different TypeScript file`,`info`),n(`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.exit(1)),s.length===0?n(`Loaded template with 0 tasks (template may only provide prompts/variables for extending)`,`info`):n(`Loaded ${s.length} task(s)`,`success`),await e(s,{dryRun:i.dryRun,force:i.force,tasksFilePath:d,globalVariables:c,globalPrompts:l,templateEnabled:u})}catch(e){if(n(`❌ CLI execution failed`,`error`),e instanceof Error){n(`Error: ${e.message}`,`error`);let t=o.env.DEBUG;t!=null&&t!==``&&console.error(e.stack)}else console.error(e);o.exit(1)}}),v.parse(o.argv);export{};
2
+ import"./config-DfRbCqsT.js";import{i as e}from"./utils-D61aLjOR.js";import{q as t}from"./run-tasks-C859oQ3R.js";import{n}from"./src-DfhwwM_Y.js";import r from"node:path";import{fileURLToPath as i}from"node:url";import a from"node:fs";import o from"node:process";import{Command as s}from"commander";import c from"ajv";const l=()=>i(import.meta.url),u=(()=>r.dirname(l()))(),d=i(import.meta.url),f=r.dirname(d);function p(){return new c({allErrors:!0,verbose:!0,strict:!1,discriminator:!0})}function m(){let e=r.join(f,`..`,`schema`,`tasks.schema.json`);try{let t=a.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(t,n={}){try{let e=p(),r=m(),i=e.compile(r);if(!i(t)&&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(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 _(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 v=new s,y=r.join(u,`..`,`package.json`);let b=`0.0.0`;try{b=JSON.parse(a.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(`--tasks-file <path>`,`Path to JSON file containing task definitions`,`./template-tasks.json`).option(`--tasks-ts <path>`,`Path to TypeScript file exporting tasks`,`./template-tasks.ts`).option(`--no-validate`,`Skip schema validation of task configuration (validation is enabled by default)`).action(async i=>{try{let s=[],c,l,u,d;if(i.tasksTs!=null&&i.tasksTs!==``){let t=r.resolve(o.cwd(),i.tasksTs);if(a.existsSync(t)){e(`Loading tasks from TypeScript file: ${i.tasksTs}`,`info`),d=t;try{let n=await import(t);s=n.default??n.tasks??[],(!Array.isArray(s)||s.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 tasks file: ${i.tasksTs}`,`error`),t instanceof Error&&e(` Error: ${t.message}`,`error`),o.exit(1)}}}if(s.length===0&&i.tasksFile!=null&&i.tasksFile!==``){let n=r.resolve(o.cwd(),i.tasksFile);if(a.existsSync(n)){d=n;try{if(i.validate!==!1){e(`Validating task configuration against schema...`,`info`);let t=a.readFileSync(n,`utf-8`);g(JSON.parse(t),{silent:!1}).valid||(e(``,`error`),e(`💡 You can skip validation with --no-validate flag, but this is not recommended.`,`info`),o.exit(1)),e(`✓ Schema validation passed`,`success`)}let r=await t(n,{sequential:!0});if(r.templates!=null&&r.templates.length>0){e(`Using sequential template processing mode`,`info`);let{runTemplatesSequentially:t}=await import(`./run-tasks-D-CbjBoy.js`),{createInitialConfig:a}=await import(`./config-C8hh88Lc.js`);await t(r.templates,{dryRun:i.dryRun??!1,force:i.force??!1,tasksFilePath:n},a()),o.exit(0)}s=r.tasks,c=r.variables,l=r.prompts,u=r.enabled,Array.isArray(s)||(e(`❌ Invalid tasks file format`,`error`),e(`Expected JSON with { "tasks": [...] } structure`,`info`),o.exit(1))}catch(t){e(`Failed to load JSON tasks file: ${i.tasksFile}`,`error`),t instanceof Error&&e(` Error: ${t.message}`,`error`),o.exit(1)}}else e(`Tasks file not found: ${i.tasksFile}`,`warn`)}let f=l!=null&&l.length>0||c!=null&&c.length>0;s.length===0&&!f&&(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 --tasks-file option to specify a different JSON file`,`info`),e(` 4. Use --tasks-ts option to specify a different TypeScript 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)),o.exit(1)),s.length===0?e(`Loaded template with 0 tasks (template may only provide prompts/variables for extending)`,`info`):e(`Loaded ${s.length} task(s)`,`success`),await n(s,{dryRun:i.dryRun,force:i.force,tasksFilePath:d,globalVariables:c,globalPrompts:l,templateEnabled:u})}catch(t){if(e(`❌ CLI execution failed`,`error`),t instanceof Error){e(`Error: ${t.message}`,`error`);let n=o.env.DEBUG;n!=null&&n!==``&&console.error(t.stack)}else console.error(t);o.exit(1)}}),v.parse(o.argv);export{};
@@ -0,0 +1 @@
1
+ import{t as e}from"./config-DfRbCqsT.js";export{e as createInitialConfig};
@@ -0,0 +1 @@
1
+ function e(){return{}}export{e as t};
@@ -0,0 +1 @@
1
+ function e(){return{}}Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return e}});
@@ -0,0 +1 @@
1
+ const e=require(`./config-DlJs75hK.cjs`);exports.createInitialConfig=e.t;
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- const e=require(`./utils-CdfjwUZm.cjs`),t=require(`./src-C2AFidMo.cjs`);exports.callHook=t.h,exports.clearPlugins=t.g,exports.clearTemplateCache=t.G,exports.collectPrompts=t.p,exports.collectVariables=t.o,exports.createPlugin=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.r,exports.isPluginTaskType=t.S,exports.listPlugins=t.C,exports.loadAndMergeTemplate=t.K,exports.loadTasksWithInheritance=t.q,exports.loadTemplate=t.J,exports.log=e.i,exports.main=t.t,exports.mergeTemplates=t.Y,exports.processTemplate=t.H,exports.prompt=e.a,exports.promptYesNo=e.o,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.runWithTasks=t.n,exports.setNestedProperty=e.s,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
+ const e=require(`./utils-Bhsv13ij.cjs`);require(`./config-DlJs75hK.cjs`);const t=require(`./run-tasks-Bn4lboAE.cjs`),n=require(`./src-BlvCkBsJ.cjs`);exports.callHook=t.h,exports.clearPlugins=t.g,exports.clearTemplateCache=t.G,exports.collectPrompts=t.p,exports.collectVariables=t.o,exports.createPlugin=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.r,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.i,exports.main=n.t,exports.mergeTemplates=t.X,exports.processTemplate=t.H,exports.prompt=e.a,exports.promptYesNo=e.o,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.s,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;
package/dist/index.d.cts CHANGED
@@ -241,8 +241,6 @@ interface TaskDefinition {
241
241
  config: UpdateJsonConfig | WriteConfig | CreateConfig | RegexReplaceConfig | ReplaceInFileConfig | DeleteConfig | RenameConfig | GitInitConfig | ExecConfig | MoveConfig | CopyConfig | AppendConfig | MkdirConfig | Record<string, unknown>;
242
242
  dependencies?: string[];
243
243
  rollback?: RollbackConfig;
244
- prompts?: PromptDefinition[];
245
- variables?: VariableDefinition[];
246
244
  override?: MergeStrategy;
247
245
  $sourceUrl?: string;
248
246
  $templateEnabled?: EnabledValue;
@@ -473,6 +471,32 @@ declare function resolveDefaultValue<T = string | number | boolean>(defaultValue
473
471
  */
474
472
  declare function validatePrompts(prompts: PromptDefinition[]): string[];
475
473
  //#endregion
474
+ //#region src/run-tasks.d.ts
475
+ /**
476
+ * Core task execution logic shared by both main() and runWithTasks()
477
+ */
478
+ declare function runTasks(tasks: TaskDefinition[], options: {
479
+ dryRun: boolean;
480
+ force: boolean;
481
+ tasksFilePath: string | undefined;
482
+ globalVariables?: VariableDefinition[];
483
+ globalPrompts?: PromptDefinition[];
484
+ templateEnabled?: EnabledValue;
485
+ }): Promise<void>;
486
+ /**
487
+ * Run templates sequentially for variables/prompts, then all tasks together
488
+ * Phase 1: Process variables and prompts sequentially from each template
489
+ * Phase 2: Collect all tasks from all enabled templates
490
+ * Phase 3: Execute all tasks together at the end
491
+ * This allows later templates to use values from earlier templates in their conditions,
492
+ * while still executing all tasks together after all variables/prompts are resolved
493
+ */
494
+ declare function runTemplatesSequentially(templates: TasksConfiguration[], options: {
495
+ dryRun: boolean;
496
+ force: boolean;
497
+ tasksFilePath: string | undefined;
498
+ }, config?: InitConfig): Promise<void>;
499
+ //#endregion
476
500
  //#region src/task-executors.d.ts
477
501
  declare function registerBuiltInPlugins(): void;
478
502
  /**
@@ -498,6 +522,14 @@ declare function topologicalSort(tasks: TaskDefinition[]): TaskDefinition[];
498
522
  * @returns The loaded template configuration
499
523
  */
500
524
  declare function loadTemplate(templatePath: string, visitedPaths?: Set<string>): Promise<TasksConfiguration>;
525
+ /**
526
+ * Load all templates in dependency order without merging
527
+ * @param templatePath - Path or URL to the template file
528
+ * @param baseDir - Base directory or URL for resolving relative paths in extends
529
+ * @param visitedPaths - Set of already visited paths
530
+ * @returns Array of sorted templates (in dependency order, ready for sequential processing)
531
+ */
532
+ declare function loadTemplatesInOrder(templatePath: string, baseDir?: string, visitedPaths?: Set<string>): Promise<TasksConfiguration[]>;
501
533
  /**
502
534
  * Recursively load and merge templates
503
535
  * @param templatePath - Path or URL to the template file
@@ -520,13 +552,18 @@ declare function clearTemplateCache(): void;
520
552
  /**
521
553
  * Load tasks from a configuration file with template inheritance support
522
554
  * @param tasksFilePath - Path to the tasks configuration file
555
+ * @param options - Optional configuration
556
+ * @param options.sequential - If true, return templates as separate items for sequential processing
523
557
  * @returns Task configuration with tasks, optional variables, and optional prompts
524
558
  */
525
- declare function loadTasksWithInheritance(tasksFilePath: string): Promise<{
559
+ declare function loadTasksWithInheritance(tasksFilePath: string, options?: {
560
+ sequential?: boolean;
561
+ }): Promise<{
526
562
  tasks: TaskDefinition[];
527
563
  variables?: VariableDefinition[];
528
564
  prompts?: PromptDefinition[];
529
565
  enabled?: EnabledValue;
566
+ templates?: TasksConfiguration[];
530
567
  }>;
531
568
  //#endregion
532
569
  //#region src/template-utils.d.ts
@@ -656,9 +693,13 @@ declare function collectVariables(variables: VariableDefinition[], resolvedValue
656
693
  * Each variable can access values from previous variables and prompts
657
694
  * @param variables - Array of variable definitions
658
695
  * @param context - Optional context for evaluating conditional variables
696
+ * @param options - Optional resolution options
697
+ * @param options.skipConditional - If true, skip conditional variables (they will be resolved later)
659
698
  * @returns Map of variable IDs to their resolved values
660
699
  */
661
- declare function resolveAllVariableValues(variables: VariableDefinition[], context?: InitConfig): Promise<Map<string, unknown>>;
700
+ declare function resolveAllVariableValues(variables: VariableDefinition[], context?: InitConfig, options?: {
701
+ skipConditional?: boolean;
702
+ }): Promise<Map<string, unknown>>;
662
703
  //#endregion
663
704
  //#region src/variables/resolve-variable-value.d.ts
664
705
  /**
@@ -704,4 +745,4 @@ declare function runWithTasks(customTasks: TaskDefinition[], options?: {
704
745
  templateEnabled?: EnabledValue | undefined;
705
746
  }): Promise<void>;
706
747
  //#endregion
707
- 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, createPlugin, 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, log, main, mergeTemplates, processTemplate, prompt, promptYesNo, registerBuiltInPlugins, registerHooks, registerPlugin, resolveAllDefaultValues, resolveAllVariableValues, resolveDefaultValue, resolveVariableValue, runTask, runWithTasks, setNestedProperty, shouldUseHandlebars, topologicalSort, unregisterPlugin, validatePluginTask, validatePrompts, validateTemplateConfig, validateVariables };
748
+ 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, createPlugin, 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 };
package/dist/index.d.ts CHANGED
@@ -241,8 +241,6 @@ interface TaskDefinition {
241
241
  config: UpdateJsonConfig | WriteConfig | CreateConfig | RegexReplaceConfig | ReplaceInFileConfig | DeleteConfig | RenameConfig | GitInitConfig | ExecConfig | MoveConfig | CopyConfig | AppendConfig | MkdirConfig | Record<string, unknown>;
242
242
  dependencies?: string[];
243
243
  rollback?: RollbackConfig;
244
- prompts?: PromptDefinition[];
245
- variables?: VariableDefinition[];
246
244
  override?: MergeStrategy;
247
245
  $sourceUrl?: string;
248
246
  $templateEnabled?: EnabledValue;
@@ -473,6 +471,32 @@ declare function resolveDefaultValue<T = string | number | boolean>(defaultValue
473
471
  */
474
472
  declare function validatePrompts(prompts: PromptDefinition[]): string[];
475
473
  //#endregion
474
+ //#region src/run-tasks.d.ts
475
+ /**
476
+ * Core task execution logic shared by both main() and runWithTasks()
477
+ */
478
+ declare function runTasks(tasks: TaskDefinition[], options: {
479
+ dryRun: boolean;
480
+ force: boolean;
481
+ tasksFilePath: string | undefined;
482
+ globalVariables?: VariableDefinition[];
483
+ globalPrompts?: PromptDefinition[];
484
+ templateEnabled?: EnabledValue;
485
+ }): Promise<void>;
486
+ /**
487
+ * Run templates sequentially for variables/prompts, then all tasks together
488
+ * Phase 1: Process variables and prompts sequentially from each template
489
+ * Phase 2: Collect all tasks from all enabled templates
490
+ * Phase 3: Execute all tasks together at the end
491
+ * This allows later templates to use values from earlier templates in their conditions,
492
+ * while still executing all tasks together after all variables/prompts are resolved
493
+ */
494
+ declare function runTemplatesSequentially(templates: TasksConfiguration[], options: {
495
+ dryRun: boolean;
496
+ force: boolean;
497
+ tasksFilePath: string | undefined;
498
+ }, config?: InitConfig): Promise<void>;
499
+ //#endregion
476
500
  //#region src/task-executors.d.ts
477
501
  declare function registerBuiltInPlugins(): void;
478
502
  /**
@@ -498,6 +522,14 @@ declare function topologicalSort(tasks: TaskDefinition[]): TaskDefinition[];
498
522
  * @returns The loaded template configuration
499
523
  */
500
524
  declare function loadTemplate(templatePath: string, visitedPaths?: Set<string>): Promise<TasksConfiguration>;
525
+ /**
526
+ * Load all templates in dependency order without merging
527
+ * @param templatePath - Path or URL to the template file
528
+ * @param baseDir - Base directory or URL for resolving relative paths in extends
529
+ * @param visitedPaths - Set of already visited paths
530
+ * @returns Array of sorted templates (in dependency order, ready for sequential processing)
531
+ */
532
+ declare function loadTemplatesInOrder(templatePath: string, baseDir?: string, visitedPaths?: Set<string>): Promise<TasksConfiguration[]>;
501
533
  /**
502
534
  * Recursively load and merge templates
503
535
  * @param templatePath - Path or URL to the template file
@@ -520,13 +552,18 @@ declare function clearTemplateCache(): void;
520
552
  /**
521
553
  * Load tasks from a configuration file with template inheritance support
522
554
  * @param tasksFilePath - Path to the tasks configuration file
555
+ * @param options - Optional configuration
556
+ * @param options.sequential - If true, return templates as separate items for sequential processing
523
557
  * @returns Task configuration with tasks, optional variables, and optional prompts
524
558
  */
525
- declare function loadTasksWithInheritance(tasksFilePath: string): Promise<{
559
+ declare function loadTasksWithInheritance(tasksFilePath: string, options?: {
560
+ sequential?: boolean;
561
+ }): Promise<{
526
562
  tasks: TaskDefinition[];
527
563
  variables?: VariableDefinition[];
528
564
  prompts?: PromptDefinition[];
529
565
  enabled?: EnabledValue;
566
+ templates?: TasksConfiguration[];
530
567
  }>;
531
568
  //#endregion
532
569
  //#region src/template-utils.d.ts
@@ -656,9 +693,13 @@ declare function collectVariables(variables: VariableDefinition[], resolvedValue
656
693
  * Each variable can access values from previous variables and prompts
657
694
  * @param variables - Array of variable definitions
658
695
  * @param context - Optional context for evaluating conditional variables
696
+ * @param options - Optional resolution options
697
+ * @param options.skipConditional - If true, skip conditional variables (they will be resolved later)
659
698
  * @returns Map of variable IDs to their resolved values
660
699
  */
661
- declare function resolveAllVariableValues(variables: VariableDefinition[], context?: InitConfig): Promise<Map<string, unknown>>;
700
+ declare function resolveAllVariableValues(variables: VariableDefinition[], context?: InitConfig, options?: {
701
+ skipConditional?: boolean;
702
+ }): Promise<Map<string, unknown>>;
662
703
  //#endregion
663
704
  //#region src/variables/resolve-variable-value.d.ts
664
705
  /**
@@ -704,4 +745,4 @@ declare function runWithTasks(customTasks: TaskDefinition[], options?: {
704
745
  templateEnabled?: EnabledValue | undefined;
705
746
  }): Promise<void>;
706
747
  //#endregion
707
- 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, createPlugin, 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, log, main, mergeTemplates, processTemplate, prompt, promptYesNo, registerBuiltInPlugins, registerHooks, registerPlugin, resolveAllDefaultValues, resolveAllVariableValues, resolveDefaultValue, resolveVariableValue, runTask, runWithTasks, setNestedProperty, shouldUseHandlebars, topologicalSort, unregisterPlugin, validatePluginTask, validatePrompts, validateTemplateConfig, validateVariables };
748
+ 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, createPlugin, 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 };
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- import{A as e,B as t,C as n,D as r,E as i,F as a,G as o,H as s,I as c,J as l,K as u,L as d,M as f,N as p,O as m,P as h,R as g,S as _,T as v,U as y,V as b,W as x,Y as S,_ as C,a as w,b as T,c as E,d as D,f as O,g as k,h as A,i as j,j as M,k as N,l as P,m as F,n as I,o as L,p as R,q as z,r as B,s as V,t as H,u as U,v as W,w as G,x as K,y as q,z as J}from"./src-DNp4KfEG.js";import{a as Y,i as X,n as Z,o as Q,r as $,s as ee,t as te}from"./utils-DfD7I1u2.js";export{A as callHook,k as clearPlugins,o as clearTemplateCache,R as collectPrompts,L as collectVariables,C as createPlugin,m as displayTasksDiff,te as evaluateCondition,W as executePluginTask,E as executeTask,N as getCreateDiff,e as getDeleteDiff,M as getExecDiff,f as getGitInitDiff,Z as getGitRepoInfo,q as getPlugin,T as getPluginForTaskType,K as getPluginTaskDiff,p as getRegexReplaceDiff,h as getRenameDiff,a as getReplaceInFileDiff,c as getTaskDiff,J as getTemplateSourceDescription,d as getUpdateJsonDiff,g as getWriteDiff,t as hasInlineTemplate,b as hasTemplateFile,$ as interpolateTemplate,_ as isPluginTaskType,n as listPlugins,u as loadAndMergeTemplate,z as loadTasksWithInheritance,l as loadTemplate,X as log,H as main,S as mergeTemplates,s as processTemplate,Y as prompt,Q as promptYesNo,P as registerBuiltInPlugins,G as registerHooks,v as registerPlugin,O as resolveAllDefaultValues,j as resolveAllVariableValues,F as resolveDefaultValue,w as resolveVariableValue,U as runTask,I as runWithTasks,ee as setNestedProperty,y as shouldUseHandlebars,V as topologicalSort,i as unregisterPlugin,r as validatePluginTask,D as validatePrompts,x as validateTemplateConfig,B as validateVariables};
1
+ import"./config-DfRbCqsT.js";import{a as e,i as t,n,o as r,r as i,s as a,t as o}from"./utils-D61aLjOR.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-C859oQ3R.js";import{n as re,t as ie}from"./src-DfhwwM_Y.js";export{R as callHook,L as clearPlugins,p as clearTemplateCache,K as collectPrompts,G as collectVariables,j as createPlugin,x as displayTasksDiff,o as evaluateCondition,Q as executePluginTask,P as executeTask,V as getCreateDiff,s as getDeleteDiff,B as getExecDiff,y as getGitInitDiff,n 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,i as interpolateTemplate,w as isPluginTaskType,l as listPlugins,_ as loadAndMergeTemplate,q as loadTasksWithInheritance,g as loadTemplate,A as loadTemplatesInOrder,t as log,ie as main,k as mergeTemplates,m as processTemplate,e as prompt,r 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,a as setNestedProperty,E as shouldUseHandlebars,Y as topologicalSort,d as unregisterPlugin,u as validatePluginTask,F as validatePrompts,O as validateTemplateConfig,J as validateVariables};
@@ -0,0 +1 @@
1
+ require(`./utils-Bhsv13ij.cjs`),require(`./config-DlJs75hK.cjs`);const e=require(`./run-tasks-Bn4lboAE.cjs`);exports.runTasks=e.t,exports.runTemplatesSequentially=e.n;
@@ -0,0 +1,29 @@
1
+ const e=require(`./utils-Bhsv13ij.cjs`),t=require(`./config-DlJs75hK.cjs`);let n=require(`node:fs`);n=e._(n);let r=require(`node:path`);r=e._(r);let i=require(`node:process`);i=e._(i);let a=require(`node:util`);a=e._(a);let o=require(`node:child_process`);o=e._(o);let s=require(`@inquirer/prompts`);s=e._(s);var c=class t extends e.g{constructor(e,t,n,r){super(e,`DUPLICATE_ID`),this.id=t,this.type=n,this.existingType=r,this.name=`DuplicateIdError`}static forId(e,n,r){return new t(`Duplicate ID "${e}" found in ${n}. This ID is already used in ${r??`unknown`}`,e,n,r)}},l=class t extends e.g{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(e,n,r){return new t(`Task ID conflict: "${e}" 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.`,e,`task`,n,r)}static forVariable(e){return new t(`Variable ID conflict: "${e}" 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.`,e,`variable`)}static forPrompt(e){return new t(`Prompt ID conflict: "${e}" 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.`,e,`prompt`)}},u=class t extends e.g{constructor(e,t){super(e,`TASK_NOT_FOUND`),this.taskId=t,this.name=`TaskNotFoundError`}static forId(e){return new t(`Task not found: ${e}`,e)}},d=class t extends e.g{constructor(e,t,n){super(e,`PROMPT_VALIDATION_ERROR`),this.promptId=t,this.reason=n,this.name=`PromptValidationError`}static required(e){return new t(`Prompt "${e}" is required`,e,`required`)}static unknownType(e){return new t(`Unknown prompt type: ${e}`,e,`unknown_type`)}},f=class t extends e.g{constructor(e,t,n){super(e,`PLUGIN_CONFIGURATION_ERROR`),this.pluginType=t,this.configIssue=n,this.name=`PluginConfigurationError`}static templateMissingTemplateOrFile(){return new t(`Template task requires either "template" (inline) or "templateFile" (file path) to be specified`,`template`,`missing_template_or_file`)}static templateHasBothTemplateAndFile(){return new t(`Template task cannot have both "template" and "templateFile" specified. Use one or the other.`,`template`,`both_template_and_file`)}static createMissingTemplateOrFile(){return new t(`Create task requires either "template" (inline) or "templateFile" (file path) to be specified`,`create`,`missing_template_or_file`)}static createHasBothTemplateAndFile(){return new t(`Create task cannot have both "template" and "templateFile" specified. Use one or the other.`,`create`,`both_template_and_file`)}};const p=(0,a.promisify)(n.default.readFile);function m(t){let n=new Map;for(let e of t){let t=n.get(e.name)||[];t.push(e),n.set(e.name,t)}if(Array.from(n.values()).some(e=>e.length>1))return t;let r=[],i=new Set,a=new Set,o=new Map;for(let e of t)o.set(e.name,e);function s(t){if(i.has(t))return;if(a.has(t))throw e.h.forTemplateDependencies(Array.from(a),t);a.add(t);let n=o.get(t);if(n!=null&&n.dependencies!=null&&n.dependencies.length>0)for(let e of n.dependencies)s(e);a.delete(t),i.add(t),n!=null&&r.push(n)}for(let e of t)s(e.name);return r}const h={template:[[`template`,`templateFile`]]};function g(e){if(e==null||e===``)return`current template`;if(_(e))return e;let t=i.default.cwd();return e.startsWith(t)?r.default.relative(t,e):e}function _(e){try{let t=new URL(e);return t.protocol===`http:`||t.protocol===`https:`}catch{return!1}}function ee(t,n){if(_(t))return t;if(n==null||n===``)return r.default.isAbsolute(t)?t:r.default.resolve(i.default.cwd(),t);if(_(n))try{let e=new URL(`.`,n);return new URL(t,e).href}catch{throw e.m.forRemoteTemplate(t,n)}let a=r.default.dirname(n);return r.default.isAbsolute(t)?t:r.default.resolve(a,t)}async function te(t){if(_(t))return ne(t);if(!n.default.existsSync(t))throw e.f.forPath(t);return p(t,`utf-8`)}async function ne(t){try{let n=await fetch(t);if(!n.ok)throw e.d.forUrl(t,n.status,n.statusText);return await n.text()}catch(n){throw n instanceof Error&&n.message.includes(`Failed to fetch`)?n:e.d.forUrl(t,n instanceof Error?n:void 0)}}const v=new Map;async function re(t,a=new Set){let o=_(t),s;if(s=o||r.default.isAbsolute(t)?t:r.default.resolve(i.default.cwd(),t),v.has(s))return v.get(s);if(a.has(s))throw e.h.forTemplateInheritance(a,s);a.add(s);let c;if(o)c=await ne(s);else{if(!n.default.existsSync(s))throw e.f.forPath(s);c=await p(s,`utf-8`)}let l;try{l=JSON.parse(c)}catch(t){throw e.p.forFile(s,t instanceof Error?t:Error(String(t)))}if(l.name==null||l.name.trim()===``)throw e.u.missingName(s);if(!/^[a-z\d]+(?:-[a-z\d]+)*$/u.test(l.name))throw e.u.invalidNameFormat(s,l.name);if(l.tasks!==void 0&&!Array.isArray(l.tasks))throw e.u.tasksNotArray(s);l.tasks===void 0&&(l.tasks=[]);for(let e of l.tasks)e.$sourceUrl=s;return v.set(s,l),l}async function ie(t,n,a,o,s){let c=_(t),l;if(l=c||r.default.isAbsolute(t)?t:n==null?r.default.resolve(i.default.cwd(),t):_(n)?new URL(t,n).href:r.default.resolve(n,t),a.has(l))return;if(o.has(l))throw e.h.forTemplateInheritance(o,l);o.add(l);let u=await re(l),d=_(l)?new URL(`.`,l).href:r.default.dirname(l);if(u.extends!=null&&u.extends!==``){let e=Array.isArray(u.extends)?u.extends:[u.extends];for(let t of e)await ie(t,d,a,o,s)}o.delete(l),a.add(l),s.push(u)}async function y(e,t,n=new Set){let r=[];return await ie(e,t,n,new Set,r),m(r)}async function ae(e,t,n=new Set){return le(await y(e,t,n))}function oe(e,t,n){let r=new Map;for(let t of e){if(r.has(t.id))throw c.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 c.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 c.forId(e.id,`prompt`,r.get(e.id));r.set(e.id,`prompt`)}}function se(t,n){if((n.override??`merge`)===`replace`){e.i(` → Variable "${n.id}" using 'replace' strategy`,`info`);let{override:t,...r}=n;return r}e.i(` → Variable "${n.id}" merged (value replaced)`,`info`);let r={...t,...n};return delete r.override,r}function ce(t,n){if((n.override??`merge`)===`replace`){e.i(` → Prompt "${n.id}" using 'replace' strategy`,`info`);let{override:t,...r}=n;return r}e.i(` → Prompt "${n.id}" merged`,`info`);let r={...t,...n};return delete r.override,r}function le(t){if(t.length===0)return{name:`Empty Template`,tasks:[]};if(t.length===1){let e=t[0];return oe(e.tasks??[],e.variables,e.prompts),e}let n=new Map,r=new Map,i=new Map,a={};for(let o of t){if(o.enabled!=null&&(a[o.name]=o.enabled),o.enabled===!1){e.i(`⊘ 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 l.forPrompt(e.id);let t=ce(i.get(e.id),e);o.enabled!=null&&(t.$templateEnabled=o.enabled),i.set(e.id,t)}else{let t={...e};o.enabled!=null&&(t.$templateEnabled=o.enabled),i.set(e.id,t)}if(o.variables!=null)for(let e of o.variables)if(r.has(e.id)){if(e.override==null)throw l.forVariable(e.id);let t=se(r.get(e.id),e);o.enabled!=null&&(t.$templateEnabled=o.enabled),r.set(e.id,t)}else{let t={...e};o.enabled!=null&&(t.$templateEnabled=o.enabled),r.set(e.id,t)}for(let e of o.tasks??[])if(n.has(e.id)){if(e.override==null){let t=n.get(e.id);throw l.forTask(e.id,g(t.$sourceUrl),g(e.$sourceUrl))}let t=fe(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)}}let o=Array.from(n.values()),s=i.size>0?Array.from(i.values()):void 0,c=r.size>0?Array.from(r.values()):void 0;oe(o,c,s);let u=t[t.length-1],d={name:u.name,tasks:o};return u.description!=null&&(d.description=u.description),u.dependencies!=null&&(d.dependencies=u.dependencies),u.enabled!=null&&(d.enabled=u.enabled),s!=null&&(d.prompts=s),c!=null&&(d.variables=c),d}function ue(e,t){let n=h[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=h[n]??[];for(let[e,n]of Object.entries(t)){for(let t of i)if(t.includes(e)){for(let n of t)n!==e&&delete r[n];break}r[e]=n}return r}function fe(t,n){if((n.override??`merge`)===`replace`){e.i(` → Task "${n.id}" using 'replace' strategy - completely replacing base task`,`info`),e.i(` Base: ${g(t.$sourceUrl)}`,`info`),e.i(` Override: ${g(n.$sourceUrl)}`,`info`);let{override:r,...i}=n;return i}e.i(` → Merging task "${n.id}"`,`info`),e.i(` Base: ${g(t.$sourceUrl)}`,`info`),e.i(` Override: ${g(n.$sourceUrl)}`,`info`);let r;if(typeof t.config==`object`&&t.config!==null&&typeof n.config==`object`&&n.config!==null){r=de(t.config,n.config,n.type);let i=ue(n.type,r);i!==null&&i.length>0&&(e.i(` ⚠️ Warning: Conflicting config fields detected: ${i.join(`, `)}`,`warn`),e.i(` Please use override: "replace" or specify only one of these fields`,`warn`))}else r=n.config??t.config;let i=[...t.dependencies??[],...n.dependencies??[]],a=i.length>0?[...new Set(i)]:void 0,o=n.$sourceUrl??t.$sourceUrl,s={...t,...n,config:r,...a!=null&&{dependencies:a},...o!=null&&{$sourceUrl:o}};return delete s.override,s}function pe(){v.clear()}async function me(t,n){if(e.i(`Loading tasks from ${t}...`,`info`),n?.sequential===!0){let n=await y(t);return e.i(`Loaded ${n.length} template(s) for sequential processing`,`info`),{tasks:[],templates:n}}let r=await ae(t);e.i(`Loaded ${r.tasks?.length??0} task(s)`,`info`),r.extends!=null&&r.extends!==``&&e.i(`Extended from: ${(Array.isArray(r.extends)?r.extends:[r.extends]).join(`, `)}`,`info`),r.prompts!=null&&r.prompts.length>0&&e.i(`Found ${r.prompts.length} top-level prompt(s)`,`info`),r.variables!=null&&r.variables.length>0&&e.i(`Found ${r.variables.length} top-level variable(s)`,`info`);let i={tasks:r.tasks??[]};return r.prompts!=null&&(i.prompts=r.prompts),r.variables!=null&&(i.variables=r.variables),r.enabled!=null&&(i.enabled=r.enabled),i}function b(e){return e.template!=null&&e.template!==``}function x(e){return e.templateFile!=null&&e.templateFile!==``}function S(e){return e.endsWith(`.hbs`)}function C(e){let t=b(e),n=x(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 w(t,n,r,i={}){let{enableHandlebars:a=!0,sourceUrl:o=r?.$sourceUrl}=i,s=b(t),c=x(t);if(s)return e.r(t.template,n);if(c){let r=t.templateFile,i=a&&S(r),s=await te(ee(r,o));return i?(await import(`handlebars`)).default.compile(s)(n):e.r(s,n)}throw Error(`No template content available`)}function he(e){return b(e)?`inline template`:x(e)?`template file: ${e.templateFile}`:`no template source`}const T=(0,a.promisify)(n.default.readFile),ge=2,_e=10,ve=55,E={reset:`\x1B[0m`,red:`\x1B[31m`,green:`\x1B[32m`,yellow:`\x1B[33m`,blue:`\x1B[34m`,cyan:`\x1B[36m`,gray:`\x1B[90m`};function D(e,t){switch(t){case`add`:return`${E.green}+ ${e}${E.reset}`;case`remove`:return`${E.red}- ${e}${E.reset}`;case`context`:return`${E.gray} ${e}${E.reset}`;default:return e}}function O(e,t){let n=e.split(`
2
+ `),r=t.split(`
3
+ `),i=[],a=Math.max(n.length,r.length);for(let e=0;e<a;e++){let t=n[e],a=r[e];t===a?t!==void 0&&i.push(D(t,`context`)):(t!==void 0&&i.push(D(t,`remove`)),a!==void 0&&i.push(D(a,`add`)))}return i}async function k(t,a){if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,a))return`${E.yellow}⊘ Condition not met - task would be skipped${E.reset}`;let o=r.default.join(i.default.cwd(),t.file);if(!n.default.existsSync(o))return`${E.red}✗ File not found: ${t.file}${E.reset}`;try{let n=await T(o,`utf-8`),r=JSON.parse(n),i={...r};function s(t){if(typeof t==`string`)return e.r(t,a);if(Array.isArray(t))return t.map(e=>s(e));if(typeof t==`object`&&t){let e={};for(let[n,r]of Object.entries(t))e[n]=s(r);return e}return t}for(let[n,i]of Object.entries(t.updates)){let t=s(i);n.includes(`.`)?e.s(r,n,t):r[n]=t}let c=JSON.stringify(i,null,2),l=JSON.stringify(r,null,2);if(c===l)return`${E.cyan}→ No changes${E.reset}`;let u=O(c,l);return`${E.blue}File: ${t.file}${E.reset}\n${u.join(`
4
+ `)}`}catch(e){return`${E.red}✗ Error: ${e instanceof Error?e.message:String(e)}${E.reset}`}}async function A(t,a){if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,a))return`${E.yellow}⊘ Condition not met - task would be skipped${E.reset}`;if(t.template==null||t.template===``)return`${E.red}✗ No template content provided for file: ${t.file}${E.reset}`;let o=r.default.join(i.default.cwd(),t.file),s=e.r(t.template,a);if(!n.default.existsSync(o)){let e=s.split(`
5
+ `).slice(0,10).join(`
6
+ `),n=s.split(`
7
+ `).length>10;return`${E.blue}File: ${t.file}${E.reset}\n${E.green}+ New file would be created${E.reset}\n${E.gray}Content preview:${E.reset}\n${e}${n?`
8
+ ...`:``}`}try{let e=await T(o,`utf-8`);if(e===s)return`${E.cyan}→ No changes${E.reset}`;let n=O(e,s);return`${E.blue}File: ${t.file}${E.reset}\n${n.join(`
9
+ `)}`}catch(e){return`${E.red}✗ Error: ${e instanceof Error?e.message:String(e)}${E.reset}`}}async function j(t,a,o){if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,a))return`${E.yellow}⊘ Condition not met - task would be skipped${E.reset}`;let s=r.default.join(i.default.cwd(),t.file);if(n.default.existsSync(s))return`${E.cyan}→ File already exists, would be skipped: ${t.file}${E.reset}`;try{if(b(t)){let e=await w(t,a,o),n=e.split(`
10
+ `).slice(0,10).join(`
11
+ `),r=e.split(`
12
+ `).length>10;return`${E.blue}File: ${t.file}${E.reset}\n${E.green}+ New file would be created${E.reset}\n${E.gray}Content preview:${E.reset}\n${n}${r?`
13
+ ...`:``}`}let e=he(t);return`${E.blue}File: ${t.file}${E.reset}\n${E.green}+ New file would be created from ${e}${E.reset}`}catch(e){return`${E.red}✗ Error: ${e instanceof Error?e.message:String(e)}${E.reset}`}}async function M(t,a){if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,a))return`${E.yellow}⊘ Condition not met - task would be skipped${E.reset}`;let o=r.default.join(i.default.cwd(),t.file);if(!n.default.existsSync(o))return`${E.red}✗ File not found: ${t.file}${E.reset}`;try{let n=await T(o,`utf-8`),r=new RegExp(t.pattern,t.flags??`g`),i=e.r(t.replacement,a),s=n.replace(r,i);if(n===s)return`${E.cyan}→ No matches found${E.reset}`;let c=O(n,s);return`${E.blue}File: ${t.file}${E.reset}\n${c.join(`
14
+ `)}`}catch(e){return`${E.red}✗ Error: ${e instanceof Error?e.message:String(e)}${E.reset}`}}async function N(t,a){if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,a))return`${E.yellow}⊘ Condition not met - task would be skipped${E.reset}`;let o=r.default.join(i.default.cwd(),t.file);if(!n.default.existsSync(o))return`${E.red}✗ File not found: ${t.file}${E.reset}`;try{let n=await T(o,`utf-8`),r=n;for(let{find:r,replace:i}of t.replacements){let t=e.r(r,a),o=e.r(i,a);n=n.replace(t,o)}if(r===n)return`${E.cyan}→ No changes${E.reset}`;let i=O(r,n);return`${E.blue}File: ${t.file}${E.reset}\n${i.join(`
15
+ `)}`}catch(e){return`${E.red}✗ Error: ${e instanceof Error?e.message:String(e)}${E.reset}`}}function P(t,a){if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,a))return`${E.yellow}⊘ Condition not met - task would be skipped${E.reset}`;let o=t.paths.map(t=>e.r(t,a)).filter(e=>n.default.existsSync(r.default.join(i.default.cwd(),e)));return o.length===0?`${E.cyan}→ No files/directories to delete${E.reset}`:`${E.red}Would delete:${E.reset}\n${o.map(e=>`${E.red} - ${e}${E.reset}`).join(`
16
+ `)}`}function F(t,a){if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,a))return`${E.yellow}⊘ Condition not met - task would be skipped${E.reset}`;let o=e.r(t.from,a),s=e.r(t.to,a),c=r.default.join(i.default.cwd(),o),l=r.default.join(i.default.cwd(),s);return n.default.existsSync(c)?n.default.existsSync(l)?`${E.yellow}⚠ Destination already exists: ${s}${E.reset}\n${E.cyan}Would rename: ${o} → ${s}${E.reset}`:`${E.cyan}Would rename: ${o} → ${s}${E.reset}`:`${E.red}✗ Source not found: ${o}${E.reset}`}function ye(e){if(e.condition!=null&&e.condition!==``)return`${E.yellow}⊘ Condition check skipped in dry-run${E.reset}`;let t=r.default.join(i.default.cwd(),`.git`),a=n.default.existsSync(t),o=[];if(e.removeExisting&&a&&o.push(`${E.red}Would remove existing .git directory${E.reset}`),o.push(`${E.green}Would initialize git repository${E.reset}`),e.initialCommit){let t=e.message??`Initial commit`;o.push(`${E.green}Would create initial commit: "${t}"${E.reset}`)}return o.join(`
17
+ `)}function be(t,n){if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,n))return`${E.yellow}⊘ Condition not met - task would be skipped${E.reset}`;let r=e.r(t.command,n),a=t.cwd==null?i.default.cwd():e.r(t.cwd,n);return`${E.yellow}Would execute:${E.reset}\n${E.cyan} Command: ${r}${E.reset}\n${E.cyan} Working directory: ${a}${E.reset}`}function xe(t,a){if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,a))return`${E.yellow}⊘ Condition not met - task would be skipped${E.reset}`;let o=e.r(t.from,a),s=e.r(t.to,a),c=r.default.join(i.default.cwd(),o),l=r.default.join(i.default.cwd(),s);return n.default.existsSync(c)?n.default.existsSync(l)?`${E.yellow}⚠ Destination already exists: ${s}${E.reset}\n${E.cyan}Would move: ${o} → ${s}${E.reset}`:`${E.cyan}Would move: ${o} → ${s}${E.reset}`:`${E.red}✗ Source not found: ${o}${E.reset}`}function Se(t,a){if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,a))return`${E.yellow}⊘ Condition not met - task would be skipped${E.reset}`;let o=e.r(t.from,a),s=e.r(t.to,a),c=r.default.join(i.default.cwd(),o),l=r.default.join(i.default.cwd(),s);if(!n.default.existsSync(c))return`${E.red}✗ Source not found: ${o}${E.reset}`;let u=n.default.statSync(c).isDirectory()?`directory`:`file`;return n.default.existsSync(l)?`${E.yellow}⚠ Destination already exists: ${s}${E.reset}\n${E.cyan}Would copy ${u}: ${o} → ${s}${E.reset}`:`${E.cyan}Would copy ${u}: ${o} → ${s}${E.reset}`}async function Ce(t,a,o){if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,a))return`${E.yellow}⊘ Condition not met - task would be skipped${E.reset}`;let s=r.default.join(i.default.cwd(),t.file),c={};t.content==null?t.template!=null&&(c.template=t.template):c.template=t.content,t.templateFile!=null&&(c.templateFile=t.templateFile);try{let e=await w(c,a,o),r=e.split(`
18
+ `).slice(0,10).join(`
19
+ `),i=e.split(`
20
+ `).length>10;return n.default.existsSync(s)?`${E.blue}File: ${t.file}${E.reset}\n${E.green}+ Would append content${E.reset}\n${E.gray}Content preview:${E.reset}\n${r}${i?`
21
+ ...`:``}`:`${E.blue}File: ${t.file}${E.reset}\n${E.green}+ New file would be created with content${E.reset}\n${E.gray}Content preview:${E.reset}\n${r}${i?`
22
+ ...`:``}`}catch(e){return`${E.red}✗ Error: ${e instanceof Error?e.message:String(e)}${E.reset}`}}function we(t,a){if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,a))return`${E.yellow}⊘ Condition not met - task would be skipped${E.reset}`;let o=e.r(t.path,a),s=r.default.join(i.default.cwd(),o);return n.default.existsSync(s)?`${E.cyan}→ Directory already exists: ${o}${E.reset}`:`${E.green}+ Would create directory: ${o}${E.reset}`}async function Te(e,t){try{switch(e.type){case`update-json`:return await k(e.config,t);case`write`:return await A(e.config,t);case`create`:return await j(e.config,t,e);case`regex-replace`:return await M(e.config,t);case`replace-in-file`:return await N(e.config,t);case`delete`:return P(e.config,t);case`rename`:return F(e.config,t);case`move`:return xe(e.config,t);case`copy`:return Se(e.config,t);case`append`:return await Ce(e.config,t,e);case`mkdir`:return we(e.config,t);case`git-init`:return ye(e.config);case`exec`:return be(e.config,t);default:{let t=e.type;return`${E.yellow}⚠ Diff not available for task type: ${t}${E.reset}`}}}catch(e){return`${E.red}✗ Error generating diff: ${e instanceof Error?e.message:String(e)}${E.reset}`}}async function I(e,t){console.log(`${E.blue}═══════════════════════════════════════════════════════${E.reset}`),console.log(`${E.blue} DRY RUN - Preview of changes${E.reset}`),console.log(`${E.blue}═══════════════════════════════════════════════════════${E.reset}`);for(let n of e){console.log(`${E.cyan}▶ Task: ${n.name}${E.reset}`),n.description!=null&&n.description!==``&&console.log(`${E.gray} ${n.description}${E.reset}`);let e=await Te(n,t);console.log(e),console.log(`${E.gray}${`─`.repeat(55)}${E.reset}`)}console.log(`${E.blue}═══════════════════════════════════════════════════════${E.reset}`),console.log(`${E.yellow} No changes were applied (dry-run mode)${E.reset}`),console.log(`${E.blue}═══════════════════════════════════════════════════════${E.reset}`)}const L=new Map,R={},z=new Map;function B(t){if(t.name==null||t.name===``)throw TypeError(`Plugin name is required`);if(!Array.isArray(t.taskTypes)||t.taskTypes.length===0)throw TypeError(`Plugin ${t.name} must define at least one task type`);if(typeof t.execute!=`function`)throw TypeError(`Plugin ${t.name} must provide an execute function`);if(L.has(t.name))throw TypeError(`Plugin ${t.name} is already registered`);for(let e of t.taskTypes)if(z.has(e)){let t=z.get(e);throw TypeError(`Task type "${e}" is already registered by plugin "${t}"`)}L.set(t.name,t);for(let e of t.taskTypes)z.set(e,t.name);e.i(`✓ Registered plugin: ${t.name}${t.version==null?``:` v${t.version}`}`,`info`)}function Ee(e){let t=L.get(e);if(t!=null){for(let e of t.taskTypes)z.delete(e);L.delete(e)}}function De(e){return L.get(e)}function V(e){let t=z.get(e);if(t!=null)return L.get(t)}function H(e){return z.has(e)}function Oe(){return Array.from(L.keys())}function ke(){L.clear(),z.clear()}function Ae(e){e.beforeAll!=null&&(R.beforeAll=e.beforeAll),e.afterAll!=null&&(R.afterAll=e.afterAll),e.beforeTask!=null&&(R.beforeTask=e.beforeTask),e.afterTask!=null&&(R.afterTask=e.afterTask),e.onError!=null&&(R.onError=e.onError)}async function U(t,...n){let r=R[t];if(r!=null)try{t===`beforeAll`||t===`afterAll`?await r(n[0]):(t===`beforeTask`||t===`afterTask`||t===`onError`)&&await r(n[0],n[1])}catch(n){e.i(`Error in ${t} hook: ${n instanceof Error?n.message:String(n)}`,`error`)}}async function je(e,t,n){let r=V(e.type);if(r==null)throw TypeError(`No plugin found for task type: ${e.type}`);await r.execute(e,t,n)}async function Me(e,t){let n=V(e.type);if(!(n==null||n.getDiff==null))return n.getDiff(e,t)}function Ne(e){let t=V(e.type);return t==null?[`No plugin found for task type: ${e.type}`]:t.validate==null?[]:t.validate(e)}function Pe(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}}}async function W(t,n,r){if(t===void 0)return;if(typeof t!=`object`||!t||Array.isArray(t))return typeof t==`string`&&r&&/\{\{\w+\}\}/u.test(t)?e.r(t,r):t;let i=t;if(i.type===`conditional`){if(!r)return;if(typeof i.condition!=`string`){e.i(`Prompt "${n}": conditional default must have a string condition`,`error`);return}try{let{evaluateCondition:t}=await Promise.resolve().then(()=>require(`./utils-BpeIOLcI.cjs`)),n=t(i.condition,r)?i.ifTrue:i.ifFalse;return typeof n==`string`&&/\{\{\w+\}\}/u.test(n)&&(n=e.r(n,r)),n}catch(t){e.i(`Prompt "${n}": failed to evaluate conditional default: ${t instanceof Error?t.message:`Unknown error`}`,`warn`);return}}if(i.type===`exec`){let t=i.value;if(typeof t!=`string`){e.i(`Prompt "${n}": exec default value must have a string command`,`error`);return}try{let e=(0,o.execSync)(t,{encoding:`utf-8`,stdio:[`pipe`,`pipe`,`pipe`],timeout:1e4}).trim();if(e.startsWith(`{`)||e.startsWith(`[`))try{return JSON.parse(e)}catch{return e}if(/^-?\d+(?:\.\d+)?$/u.test(e)){let t=Number.parseFloat(e);if(!Number.isNaN(t))return t}return e===`true`||e===`false`?e===`true`:e}catch(t){e.i(`Prompt "${n}": failed to execute default value command: ${t instanceof Error?t.message:`Unknown error`}`,`warn`);return}}else if(i.type===`static`)return i.value;else if(i.type!==void 0){e.i(`Prompt "${n}": unknown default value type "${i.type}". Expected "static", "exec", or "conditional".`,`error`);return}return t}async function G(t,n=new Map,r={}){let i={};if(t.length===0)return i;for(let a of t){if(a.$templateEnabled!=null&&!await e.l(a.$templateEnabled,{...r,...i}))continue;let t={...r,...i};if(await e.l(a.enabled,t))try{let r,o=n.get(a.id);switch(a.default!==void 0&&(o=await W(a.default,a.id,t)),a.type){case`input`:{let t={message:a.message};if(o!==void 0&&(t.default=String(o)),a.required!==void 0&&(t.required=a.required),r=await(0,s.input)(t),a.required&&(r==null||typeof r==`string`&&r.trim()===``))throw e.i(`${a.message} is required`,`error`),d.required(a.id);break}case`password`:if(r=await(0,s.password)({message:a.message,mask:`*`}),a.required&&(r==null||typeof r==`string`&&r.trim()===``))throw e.i(`${a.message} is required`,`error`),d.required(a.id);break;case`number`:{let t={message:a.message};if(o!==void 0&&(t.default=Number(o)),a.required!==void 0&&(t.required=a.required),a.min!==void 0&&(t.min=a.min),a.max!==void 0&&(t.max=a.max),r=await(0,s.number)(t),a.required&&r==null)throw e.i(`${a.message} is required`,`error`),d.required(a.id);break}case`select`:{let e={message:a.message,choices:a.choices.map(e=>({name:e.name,value:e.value}))};o!==void 0&&(e.default=o),r=await(0,s.select)(e);break}case`confirm`:{let e=o===void 0?!1:!!o;r=await(0,s.confirm)({message:a.message,default:e});break}default:throw e.i(`Unknown prompt type: ${a.type}`,`error`),d.unknownType(a.type)}i[a.id]=r}catch(t){throw t instanceof Error&&e.i(`Failed to collect prompt "${a.id}": ${t.message}`,`error`),t}}return i}async function K(e){let t=new Map,n=e.map(async e=>{if(e.default!==void 0){let n=await W(e.default,e.id);n!==void 0&&t.set(e.id,n)}});return await Promise.all(n),t}function q(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 Fe=(0,a.promisify)(n.default.appendFile),Ie=(0,a.promisify)(n.default.readFile),Le=(0,a.promisify)(n.default.stat);async function Re(t,n,a){if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,n)){e.i(`Condition not met, skipping append task`,`info`);return}let o=r.default.join(i.default.cwd(),t.file),s={};t.content==null?t.template!=null&&(s.template=t.template):s.template=t.content,t.templateFile!=null&&(s.templateFile=t.templateFile);let c=C(s);if(!c.isValid)throw c.error?.includes(`cannot have both`)?f.templateHasBothTemplateAndFile():f.templateMissingTemplateOrFile();let l=await w(s,n,a),u=!1,d=!1;try{await Le(o),u=!0;let e=await Ie(o,`utf-8`);e.length>0&&!e.endsWith(`
23
+ `)&&(d=t.newline!==!1)}catch{}u&&d?await Fe(o,`\n${l}`):await Fe(o,l),e.i(`Appended content to ${t.file}`,`success`)}const ze={name:`append`,version:`1.0.0`,taskTypes:[`append`],execute:async(e,t,n)=>{n.dryRun||await Re(e.config,t,e)}},Be=(0,a.promisify)(n.default.copyFile),Ve=(0,a.promisify)(n.default.stat),He=(0,a.promisify)(n.default.mkdir),Ue=(0,a.promisify)(n.default.readdir);async function We(e,t){await He(t,{recursive:!0});let n=await Ue(e,{withFileTypes:!0});await Promise.all(n.map(async n=>{let i=r.default.join(e,n.name),a=r.default.join(t,n.name);n.isDirectory()?await We(i,a):await Be(i,a)}))}async function Ge(t,n){if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,n)){e.i(`Condition not met, skipping copy task`,`info`);return}let a=r.default.join(i.default.cwd(),t.from),o=r.default.join(i.default.cwd(),t.to),s;try{s=await Ve(a)}catch{e.i(`Source path does not exist: ${a}`,`warn`);return}await He(r.default.dirname(o),{recursive:!0}),s.isDirectory()?(await We(a,o),e.i(`Copied directory ${t.from} to ${t.to}`,`success`)):(await Be(a,o),e.i(`Copied file ${t.from} to ${t.to}`,`success`))}const Ke={name:`copy`,version:`1.0.0`,taskTypes:[`copy`],execute:async(e,t,n)=>{n.dryRun||await Ge(e.config,t)}},qe=(0,a.promisify)(n.default.writeFile);async function Je(t,a,o){if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,a)){e.i(`Condition not met, skipping create task`,`info`);return}let s=r.default.join(i.default.cwd(),t.file);if(n.default.existsSync(s)){e.i(`File already exists, skipping: ${t.file}`,`info`);return}let c=C(t);if(!c.isValid)throw c.error?.includes(`cannot have both`)?f.createHasBothTemplateAndFile():f.createMissingTemplateOrFile();let l=await w(t,a,o),u=r.default.dirname(s);n.default.existsSync(u)||n.default.mkdirSync(u,{recursive:!0}),await qe(s,l),e.i(`Created file: ${t.file}`,`success`)}const Ye={name:`create`,version:`1.0.0`,taskTypes:[`create`],execute:async(e,t,n)=>{n.dryRun||await Je(e.config,t,e)}};async function Xe(t,a){let{paths:o,condition:s}=t;if(s!=null&&s!==``){if(!a){e.i(`Condition specified but no config provided, skipping deletion`,`warn`);return}if(!e.t(s,a)){e.i(`Condition not met, skipping deletion`,`info`);return}}for(let e of o){let t=r.default.join(i.default.cwd(),e);n.default.existsSync(t)&&n.default.rmSync(t,{recursive:!0,force:!0})}}const Ze={name:`delete`,version:`1.0.0`,taskTypes:[`delete`],execute:async(e,t,n)=>{n.dryRun||await Xe(e.config,t)}};async function Qe(t,n){if(t.condition!=null&&t.condition!==``){if(!n){e.i(`Condition specified but no config provided, skipping exec`,`warn`);return}if(!e.t(t.condition,n)){e.i(`Condition not met, skipping exec task`,`info`);return}}let a=t.cwd==null?i.default.cwd():r.default.join(i.default.cwd(),t.cwd);(0,o.execSync)(t.command,{cwd:a,stdio:`inherit`})}const $e={name:`exec`,version:`1.0.0`,taskTypes:[`exec`],execute:async(e,t,n)=>{n.dryRun||await Qe(e.config,t)}};async function et(t,a){if(t.condition!=null&&t.condition!==``){if(!a){e.i(`Condition specified but no config provided, skipping git-init`,`warn`);return}if(!e.t(t.condition,a)){e.i(`Condition not met, skipping git-init task`,`info`);return}}if(t.removeExisting){let e=r.default.join(i.default.cwd(),`.git`);n.default.existsSync(e)&&n.default.rmSync(e,{recursive:!0,force:!0})}if((0,o.execSync)(`git init`,{stdio:`inherit`}),t.initialCommit){let e=t.message??`Initial commit`;(0,o.execSync)(`git add .`,{stdio:`inherit`}),(0,o.execSync)(`git commit -m "${e}"`,{stdio:`inherit`})}}const tt={name:`git-init`,version:`1.0.0`,taskTypes:[`git-init`],execute:async(e,t,n)=>{n.dryRun||await et(e.config,t)}},nt=(0,a.promisify)(n.default.mkdir);async function rt(t,n){if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,n)){e.i(`Condition not met, skipping mkdir task`,`info`);return}await nt(r.default.join(i.default.cwd(),t.path),{recursive:!0}),e.i(`Created directory: ${t.path}`,`success`)}const it={name:`mkdir`,version:`1.0.0`,taskTypes:[`mkdir`],execute:async(e,t,n)=>{n.dryRun||await rt(e.config,t)}},at=(0,a.promisify)(n.default.rename),ot=(0,a.promisify)(n.default.stat),st=(0,a.promisify)(n.default.mkdir);async function ct(t,n){if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,n)){e.i(`Condition not met, skipping move task`,`info`);return}let a=r.default.join(i.default.cwd(),t.from),o=r.default.join(i.default.cwd(),t.to);try{await ot(a)}catch{e.i(`Source path does not exist: ${a}`,`warn`);return}await st(r.default.dirname(o),{recursive:!0}),await at(a,o),e.i(`Moved ${t.from} to ${t.to}`,`success`)}const lt={name:`move`,version:`1.0.0`,taskTypes:[`move`],execute:async(e,t,n)=>{n.dryRun||await ct(e.config,t)}},ut=(0,a.promisify)(n.default.readFile),dt=(0,a.promisify)(n.default.writeFile);async function ft(t,n){if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,n)){e.i(`Condition not met, skipping regex-replace task`,`info`);return}let a=r.default.join(i.default.cwd(),t.file),{pattern:o}=t,s=t.flags??``,c=t.replacement||``,l=await ut(a,`utf-8`),u=new RegExp(o,s);l=l.replace(u,e.r(c,n)),await dt(a,l)}const pt={name:`regex-replace`,version:`1.0.0`,taskTypes:[`regex-replace`],execute:async(e,t,n)=>{n.dryRun||await ft(e.config,t)}},mt=(0,a.promisify)(n.default.rename);async function ht(t,a){if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,a)){e.i(`Condition not met, skipping rename task`,`info`);return}let o=r.default.join(i.default.cwd(),e.r(t.from,a)),s=r.default.join(i.default.cwd(),e.r(t.to,a));if(!n.default.existsSync(o)){e.i(`Source path does not exist: ${o}`,`warn`);return}await mt(o,s)}const gt={name:`rename`,version:`1.0.0`,taskTypes:[`rename`],execute:async(e,t,n)=>{n.dryRun||await ht(e.config,t)}},_t=(0,a.promisify)(n.default.readFile),vt=(0,a.promisify)(n.default.writeFile);async function yt(t,a){if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,a)){e.i(`Condition not met, skipping replace-in-file task`,`info`);return}let o=r.default.join(i.default.cwd(),t.file),{replacements:s}=t;if(!n.default.existsSync(o)){e.i(`File not found: ${o}, skipping`,`warn`);return}let c=await _t(o,`utf-8`);for(let{find:t,replace:n}of s){let r=e.r(n,a);c=c.replace(new RegExp(t,`gu`),r)}await vt(o,c)}const bt={name:`replace-in-file`,version:`1.0.0`,taskTypes:[`replace-in-file`],execute:async(e,t,n)=>{n.dryRun||await yt(e.config,t)}},xt=(0,a.promisify)(n.default.readFile),St=(0,a.promisify)(n.default.writeFile),Ct=2;async function wt(t,n){if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,n)){e.i(`Condition not met, skipping update-json task`,`info`);return}let a=r.default.join(i.default.cwd(),t.file),{updates:o}=t,s=await xt(a,`utf-8`),c=JSON.parse(s);function l(t){if(typeof t==`string`)return e.r(t,n);if(Array.isArray(t))return t.map(e=>l(e));if(typeof t==`object`&&t){let e={};for(let[n,r]of Object.entries(t))e[n]=l(r);return e}return t}for(let[t,n]of Object.entries(o)){let r=l(n);t.includes(`.`)?e.s(c,t,r):c[t]=r}await St(a,`${JSON.stringify(c,null,2)}\n`)}const Tt={name:`update-json`,version:`1.0.0`,taskTypes:[`update-json`],execute:async(e,t,n)=>{n.dryRun||await wt(e.config,t)}},Et=(0,a.promisify)(n.default.writeFile);async function Dt(t,a,o){let{allowCreate:s=!0}=t;if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,a)){e.i(`Condition not met, skipping write task`,`info`);return}let c=r.default.join(i.default.cwd(),t.file);if(!n.default.existsSync(c)){if(s===!1)throw Error(`Write task failed: file does not exist (${t.file})`);e.i(`File not found, creating new file: ${t.file}`,`info`)}let l=C(t);if(!l.isValid)throw l.error?.includes(`cannot have both`)?f.templateHasBothTemplateAndFile():f.templateMissingTemplateOrFile();let u=await w(t,a,o),d=r.default.dirname(c);n.default.existsSync(d)||n.default.mkdirSync(d,{recursive:!0}),await Et(c,u)}const Ot={name:`write`,version:`1.0.0`,taskTypes:[`write`],execute:async(e,t,n)=>{n.dryRun||await Dt(e.config,t,e)}};function J(){H(`update-json`)||(B(Tt),B(Ot),B(Ye),B(pt),B(bt),B(Ze),B(gt),B(tt),B($e),B(lt),B(Ke),B(ze),B(it))}async function kt(t,n,r=!1){if(J(),r){e.i(`[DRY RUN] Would execute: ${t.name}`,`info`);return}if(H(t.type)){await je(t,n,{dryRun:r});return}throw TypeError(`Unknown task type: ${t.type}`)}async function Y(t,n,r,a,o=!1){try{return e.i(`[${r}/${a}] Running: ${t.name}...`,`info`),await kt(t,n,o),e.i(`✓ ${t.name}`,`success`),!0}catch(n){return e.i(`✗ Failed: ${t.name}`,`error`),n instanceof Error&&(e.i(` Reason: ${n.message}`,`error`),n.stack!=null&&i.default.env.DEBUG!=null&&console.error(n.stack)),(t.required??!0)&&e.i(` This is a required task. Initialization cannot continue.`,`error`),!1}}function X(t){let n=[],r=new Set,i=new Set,a=new Map(t.map(e=>[e.id,e]));function o(t){if(r.has(t))return;if(i.has(t))throw e.h.forTaskDependency(t);i.add(t);let s=a.get(t);if(!s)throw u.forId(t);if(s.dependencies)for(let e of s.dependencies)o(e);i.delete(t),r.add(t),n.push(s)}for(let e of t)r.has(e.id)||o(e.id);return n}function At(e){let t=[];for(let n of e)if(!H(n.type))t.push(`Task "${n.id}" (${n.name}): Unknown task type "${n.type}"`);else if(n.type===`write`){let e=jt(n);t.push(...e)}return t}function jt(e){let t=[],n=e.config,r=typeof n.template==`string`?n.template:void 0,i=typeof n.templateFile==`string`?n.templateFile:void 0,a=C({...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 Mt(t){e.i(`❌ Template validation failed:`,`error`),e.i(``,`error`);for(let n of t)e.i(` • ${n}`,`error`);e.i(``,`error`),e.i(`Please fix these errors before continuing.`,`error`)}function Z(e,t=new Map){let n={};for(let r of e){let e=t.get(r.id);e!==void 0&&(n[r.id]=e)}return n}async function Nt(t,n,r){if(t==null)return;if(typeof t!=`object`||!t||Array.isArray(t))return t;let i=t;if(i.type===`conditional`){if(!r){e.i(`Variable "${n}": conditional value requires context but none provided`,`warn`);return}if(typeof i.condition!=`string`){e.i(`Variable "${n}": conditional value must have a string condition`,`error`);return}try{let{evaluateCondition:e,interpolateTemplate:t}=await Promise.resolve().then(()=>require(`./utils-BpeIOLcI.cjs`)),n=e(i.condition,r)?i.ifTrue:i.ifFalse;return typeof n==`string`&&/\{\{\w+\}\}/u.test(n)&&(n=t(n,r)),n}catch(t){e.i(`Variable "${n}": failed to evaluate conditional value: ${t instanceof Error?t.message:`Unknown error`}`,`warn`);return}}if(i.type===`exec`){let t=i.value;if(typeof t!=`string`){e.i(`Variable "${n}": exec value must have a string command`,`error`);return}try{let e=(0,o.execSync)(t,{encoding:`utf-8`,stdio:[`pipe`,`pipe`,`pipe`],timeout:1e4}).trim();if(e.startsWith(`{`)||e.startsWith(`[`))try{return JSON.parse(e)}catch{return e}if(/^-?\d+(?:\.\d+)?$/u.test(e)){let t=Number.parseFloat(e);if(!Number.isNaN(t))return t}return e===`true`||e===`false`?e===`true`:e}catch(t){e.i(`Variable "${n}": failed to execute command: ${t instanceof Error?t.message:`Unknown error`}`,`warn`);return}}else if(i.type===`static`)return i.value;return t}async function Q(t,n,r){let i=new Map;for(let a of t){if(r?.skipConditional===!0&&typeof a.value==`object`&&a.value!==null&&!Array.isArray(a.value)&&a.value.type===`conditional`)continue;if(a.$templateEnabled!=null){let t={...n};for(let[e,n]of i.entries())t[e]=n;if(!await e.l(a.$templateEnabled,t))continue}let t={...n};for(let[e,n]of i.entries())t[e]=n;let o=await Nt(a.value,a.id,t);o!==void 0&&i.set(a.id,o)}return i}function $(e){let t=[],n=new Set;for(let r of e)if(n.has(r.id)&&t.push(`Duplicate variable ID: "${r.id}"`),n.add(r.id),/^[a-zA-Z_$][a-zA-Z0-9_$]*$/u.test(r.id)||t.push(`Variable ID "${r.id}" is invalid. Must be a valid JavaScript identifier (start with letter, underscore, or $, followed by letters, digits, underscores, or $).`),r.value===void 0||r.value===null)t.push(`Variable "${r.id}" must have a value`);else if(typeof r.value==`object`&&!Array.isArray(r.value)&&r.value!==null){let e=r.value;e.type==null||e.type===``?t.push(`Variable "${r.id}": value object must have a "type" field ("static", "exec", or "conditional")`):e.type!==`static`&&e.type!==`exec`&&e.type!==`conditional`&&t.push(`Variable "${r.id}": type must be "static", "exec", or "conditional", got "${e.type}"`),(e.type===`static`||e.type===`exec`)&&(e.value===void 0||e.value===null)&&t.push(`Variable "${r.id}": value config must have a "value" field`),e.type===`exec`&&typeof e.value!=`string`&&t.push(`Variable "${r.id}": exec type must have a string command as value`),e.type===`conditional`&&((e.condition===void 0||e.condition===null||e.condition===``||typeof e.condition!=`string`)&&t.push(`Variable "${r.id}": conditional type must have a "condition" field with a string expression`),e.ifTrue===void 0&&t.push(`Variable "${r.id}": conditional type must have an "ifTrue" field`),e.ifFalse===void 0&&t.push(`Variable "${r.id}": conditional type must have an "ifFalse" field`))}return t}async function Pt(n,r){let a=t.t();if(!await e.l(r.templateEnabled,a,{lazy:!0})){e.i(`⊘ Template is disabled - skipping all execution`,`info`);return}J(),e.i(`Validating task configurations...`,`info`);let o=At(n);o.length>0&&(Mt(o),i.default.exit(1)),e.i(`✓ All tasks validated successfully`,`success`);let s=n.filter(n=>e.c(n.enabled,t.t(),{lazy:!0}));e.i(`Resolving task dependencies...`,`info`);let c=X(s);e.i(`Welcome! Let's execute your tasks.`,`info`),r.dryRun&&e.i(`🔍 DRY RUN MODE - No changes will be made`,`warn`),e.i(`This will execute your project tasks based on the defined configuration.`,`info`);let l=a,u=[...r.globalVariables??[]];if(u.length>0){let t=$(u);t.length>0&&(e.i(`❌ Variable validation errors:`,`error`),t.forEach(t=>e.i(` - ${t}`,`error`)),i.default.exit(1)),e.i(`Resolving variable values...`,`info`);let n=Z(u,await Q(u,l,{skipConditional:!0}));Object.assign(l,n),Object.keys(n).length>0&&e.i(`✓ Resolved ${Object.keys(n).length} variable(s)`,`success`)}let d=r.globalPrompts??[],f=[...d];if(f.length>0){let t=q(f);t.length>0&&(e.i(`❌ Prompt validation errors:`,`error`),t.forEach(t=>e.i(` - ${t}`,`error`)),i.default.exit(1)),e.i(`Resolving prompt default values...`,`info`);let n=await K(f);if(d.length>0){e.i(`📋 Collecting prompts (available to all tasks):`,`info`);let t=await G(d,n,l);Object.assign(l,t)}}if(u.length>0){let t=u.filter(e=>typeof e.value==`object`&&e.value!==null&&!Array.isArray(e.value)?e.value.type===`conditional`:!1);if(t.length>0){e.i(`Re-resolving conditional variables with prompt values...`,`info`);let n=Z(t,await Q(t,l));Object.assign(l,n),Object.keys(n).length>0&&e.i(`✓ Resolved ${Object.keys(n).length} conditional variable(s)`,`success`)}}if(!await e.l(r.templateEnabled,l)){e.i(`⊘ Template is disabled after variable resolution - skipping all execution`,`info`);return}let p=[];for(let t of c)t.$templateEnabled!=null&&!await e.l(t.$templateEnabled,l)||await e.l(t.enabled,l)&&p.push(t);if(e.i(`${p.length} of ${c.length} task(s) enabled for execution`,`info`),r.dryRun){await I(p,l),e.i(`🔍 Dry run completed - no changes were made`,`info`),e.i(`Run without --dry-run to apply changes`,`info`);return}e.i(`Starting task execution...`,`info`),await U(`beforeAll`,l);let m=p.length,h=0,g=0,_=[];for(let t=0;t<p.length;t++){let n=p[t];if(n!=null)if(await U(`beforeTask`,n,l),await Y(n,l,t+1,m,r.dryRun))h++,_.push(n.id),await U(`afterTask`,n,l);else if(n.required??!0){g++,await U(`onError`,Error(`Task ${n.name} failed`),n);break}else e.i(`⚠️ Non-critical task failed, continuing...`,`warn`),await U(`onError`,Error(`Task ${n.name} failed`),n)}g>0&&(e.i(`❌ Task execution failed with ${g} critical error(s)`,`error`),e.i(`✓ Completed: ${h}/${m} tasks`,`info`),i.default.exit(1)),await U(`afterAll`,l),e.i(`✅ All tasks completed successfully!`,`success`),e.i(`✓ Completed: ${h}/${m} tasks`,`success`)}async function Ft(t,n,r={}){e.i(`Running templates with sequential variable/prompt resolution...`,`info`),e.i(`Total templates to process: ${t.length}`,`info`),J();let a=[];e.i(`
24
+ 📋 Phase 1: Resolving variables and prompts from all templates...`,`info`);for(let n=0;n<t.length;n++){let o=t[n];if(o==null)continue;let s=`=`.repeat(60);if(e.i(`\n${s}`,`info`),e.i(`Processing template ${n+1}/${t.length}: "${o.name}"`,`info`),e.i(s,`info`),i.default.env.DEBUG!=null&&e.i(`Current config keys: ${Object.keys(r).join(`, `)}`,`info`),!await e.l(o.enabled,r)){e.i(`⊘ Template "${o.name}" is disabled - skipping`,`info`),o.enabled!=null&&i.default.env.DEBUG!=null&&e.i(` Enabled condition: ${JSON.stringify(o.enabled)}`,`info`);continue}let c=o.variables??[];if(c.length>0){e.i(`Processing ${c.length} variable(s) for template "${o.name}"...`,`info`);let t=$(c);t.length>0&&(e.i(`❌ Variable validation errors:`,`error`),t.forEach(t=>e.i(` - ${t}`,`error`)),i.default.exit(1));let n=Z(c,await Q(c,r,{skipConditional:!0}));Object.assign(r,n);let a=c.filter(e=>typeof e.value==`object`&&e.value!==null&&!Array.isArray(e.value)?e.value.type===`conditional`:!1),s=0;if(a.length>0){let t=Z(a,await Q(a,r));if(s=Object.keys(t).length,Object.assign(r,t),s>0&&(e.i(`✓ Resolved ${s} conditional variable(s)`,`success`),i.default.env.DEBUG!=null))for(let[n,r]of Object.entries(t))e.i(` ${n} = ${JSON.stringify(r)}`,`info`)}let l=Object.keys(n).length+s;l>0&&e.i(`✓ Total variables resolved for template: ${l}`,`success`)}let l=o.prompts??[];if(l.length>0){e.i(`Processing ${l.length} prompt(s) for template "${o.name}"...`,`info`);let t=q(l);t.length>0&&(e.i(`❌ Prompt validation errors:`,`error`),t.forEach(t=>e.i(` - ${t}`,`error`)),i.default.exit(1));let n=await G(l,await K(l),r);Object.assign(r,n),e.i(`✓ Collected ${Object.keys(n).length} prompt answer(s)`,`success`)}if(!await e.l(o.enabled,r)){e.i(`⊘ Template "${o.name}" became disabled after variable/prompt resolution - skipping tasks`,`info`);continue}let u=o.tasks??[];u.length>0&&(e.i(`Found ${u.length} task(s) in template "${o.name}" (will execute later)`,`info`),a.push(...u))}if(e.i(`
25
+ 🔧 Phase 2: Validating and filtering all collected tasks...`,`info`),a.length===0){e.i(`No tasks found in any template`,`info`);return}e.i(`Total tasks collected: ${a.length}`,`info`);let o=At(a);o.length>0&&(Mt(o),i.default.exit(1)),e.i(`✓ All tasks validated successfully`,`success`);let s=[];for(let t of a)await e.l(t.enabled,r)&&s.push(t);if(e.i(`${s.length} of ${a.length} task(s) enabled`,`info`),s.length===0){e.i(`No enabled tasks to execute`,`info`);return}let c=X(s);if(n.dryRun){e.i(`
26
+ 🔍 Phase 3: Dry run - showing task changes...`,`info`),await I(c,r),e.i(`
27
+ 🔍 Dry run completed - no changes were made`,`info`),e.i(`Run without --dry-run to apply changes`,`info`);return}e.i(`
28
+ ⚙️ Phase 3: Executing all tasks...`,`info`),e.i(`Starting task execution (${c.length} tasks)...`,`info`),await U(`beforeAll`,r);let l=0,u=0;for(let t=0;t<c.length;t++){let i=c[t];if(i!=null)if(await U(`beforeTask`,i,r),await Y(i,r,t+1,c.length,n.dryRun))l++,await U(`afterTask`,i,r);else if(i.required??!0){u++,await U(`onError`,Error(`Task ${i.name} failed`),i),e.i(`❌ Critical task failed: ${i.name}`,`error`);break}else e.i(`⚠️ Non-critical task failed: ${i.name}, continuing...`,`warn`),await U(`onError`,Error(`Task ${i.name} failed`),i)}await U(`afterAll`,r),u>0&&(e.i(`\n❌ Task execution failed with ${u} critical error(s)`,`error`),e.i(`✓ Completed: ${l}/${c.length} tasks`,`info`),i.default.exit(1)),e.i(`
29
+ ✅ All tasks completed successfully!`,`success`),e.i(`✓ Completed: ${l}/${c.length} tasks`,`success`)}Object.defineProperty(exports,`A`,{enumerable:!0,get:function(){return P}}),Object.defineProperty(exports,`B`,{enumerable:!0,get:function(){return b}}),Object.defineProperty(exports,`C`,{enumerable:!0,get:function(){return Oe}}),Object.defineProperty(exports,`D`,{enumerable:!0,get:function(){return Ne}}),Object.defineProperty(exports,`E`,{enumerable:!0,get:function(){return Ee}}),Object.defineProperty(exports,`F`,{enumerable:!0,get:function(){return N}}),Object.defineProperty(exports,`G`,{enumerable:!0,get:function(){return pe}}),Object.defineProperty(exports,`H`,{enumerable:!0,get:function(){return w}}),Object.defineProperty(exports,`I`,{enumerable:!0,get:function(){return Te}}),Object.defineProperty(exports,`J`,{enumerable:!0,get:function(){return re}}),Object.defineProperty(exports,`K`,{enumerable:!0,get:function(){return ae}}),Object.defineProperty(exports,`L`,{enumerable:!0,get:function(){return k}}),Object.defineProperty(exports,`M`,{enumerable:!0,get:function(){return ye}}),Object.defineProperty(exports,`N`,{enumerable:!0,get:function(){return M}}),Object.defineProperty(exports,`O`,{enumerable:!0,get:function(){return I}}),Object.defineProperty(exports,`P`,{enumerable:!0,get:function(){return F}}),Object.defineProperty(exports,`R`,{enumerable:!0,get:function(){return A}}),Object.defineProperty(exports,`S`,{enumerable:!0,get:function(){return H}}),Object.defineProperty(exports,`T`,{enumerable:!0,get:function(){return B}}),Object.defineProperty(exports,`U`,{enumerable:!0,get:function(){return S}}),Object.defineProperty(exports,`V`,{enumerable:!0,get:function(){return x}}),Object.defineProperty(exports,`W`,{enumerable:!0,get:function(){return C}}),Object.defineProperty(exports,`X`,{enumerable:!0,get:function(){return le}}),Object.defineProperty(exports,`Y`,{enumerable:!0,get:function(){return y}}),Object.defineProperty(exports,`_`,{enumerable:!0,get:function(){return Pe}}),Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return Nt}}),Object.defineProperty(exports,`b`,{enumerable:!0,get:function(){return V}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return kt}}),Object.defineProperty(exports,`d`,{enumerable:!0,get:function(){return q}}),Object.defineProperty(exports,`f`,{enumerable:!0,get:function(){return K}}),Object.defineProperty(exports,`g`,{enumerable:!0,get:function(){return ke}}),Object.defineProperty(exports,`h`,{enumerable:!0,get:function(){return U}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return Q}}),Object.defineProperty(exports,`j`,{enumerable:!0,get:function(){return be}}),Object.defineProperty(exports,`k`,{enumerable:!0,get:function(){return j}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return J}}),Object.defineProperty(exports,`m`,{enumerable:!0,get:function(){return W}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return Ft}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return Z}}),Object.defineProperty(exports,`p`,{enumerable:!0,get:function(){return G}}),Object.defineProperty(exports,`q`,{enumerable:!0,get:function(){return me}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return $}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return X}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return Pt}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return Y}}),Object.defineProperty(exports,`v`,{enumerable:!0,get:function(){return je}}),Object.defineProperty(exports,`w`,{enumerable:!0,get:function(){return Ae}}),Object.defineProperty(exports,`x`,{enumerable:!0,get:function(){return Me}}),Object.defineProperty(exports,`y`,{enumerable:!0,get:function(){return De}}),Object.defineProperty(exports,`z`,{enumerable:!0,get:function(){return he}});
@@ -0,0 +1,29 @@
1
+ import{t as e}from"./config-DfRbCqsT.js";import{c as t,d as n,f as r,g as i,h as a,i as o,l as s,m as c,p as l,r as u,s as d,t as f,u as p}from"./utils-D61aLjOR.js";import m from"node:path";import h from"node:fs";import g from"node:process";import{promisify as _}from"node:util";import{execSync as v}from"node:child_process";import{confirm as ee,input as te,number as ne,password as re,select as ie}from"@inquirer/prompts";var y=class e extends i{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)}},b=class e extends i{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`)}},ae=class e extends i{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)}},x=class e extends i{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`)}},S=class e extends i{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`)}};const oe=_(h.readFile);function se(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=[],r=new Set,i=new Set,o=new Map;for(let t of e)o.set(t.name,t);function s(e){if(r.has(e))return;if(i.has(e))throw a.forTemplateDependencies(Array.from(i),e);i.add(e);let t=o.get(e);if(t!=null&&t.dependencies!=null&&t.dependencies.length>0)for(let e of t.dependencies)s(e);i.delete(e),r.add(e),t!=null&&n.push(t)}for(let t of e)s(t.name);return n}const ce={template:[[`template`,`templateFile`]]};function C(e){if(e==null||e===``)return`current template`;if(w(e))return e;let t=g.cwd();return e.startsWith(t)?m.relative(t,e):e}function w(e){try{let t=new URL(e);return t.protocol===`http:`||t.protocol===`https:`}catch{return!1}}function le(e,t){if(w(e))return e;if(t==null||t===``)return m.isAbsolute(e)?e:m.resolve(g.cwd(),e);if(w(t))try{let n=new URL(`.`,t);return new URL(e,n).href}catch{throw c.forRemoteTemplate(e,t)}let n=m.dirname(t);return m.isAbsolute(e)?e:m.resolve(n,e)}async function ue(e){if(w(e))return de(e);if(!h.existsSync(e))throw r.forPath(e);return oe(e,`utf-8`)}async function de(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 T=new Map;async function fe(e,t=new Set){let n=w(e),i;if(i=n||m.isAbsolute(e)?e:m.resolve(g.cwd(),e),T.has(i))return T.get(i);if(t.has(i))throw a.forTemplateInheritance(t,i);t.add(i);let o;if(n)o=await de(i);else{if(!h.existsSync(i))throw r.forPath(i);o=await oe(i,`utf-8`)}let s;try{s=JSON.parse(o)}catch(e){throw l.forFile(i,e instanceof Error?e:Error(String(e)))}if(s.name==null||s.name.trim()===``)throw p.missingName(i);if(!/^[a-z\d]+(?:-[a-z\d]+)*$/u.test(s.name))throw p.invalidNameFormat(i,s.name);if(s.tasks!==void 0&&!Array.isArray(s.tasks))throw p.tasksNotArray(i);s.tasks===void 0&&(s.tasks=[]);for(let e of s.tasks)e.$sourceUrl=i;return T.set(i,s),s}async function pe(e,t,n,r,i){let o=w(e),s;if(s=o||m.isAbsolute(e)?e:t==null?m.resolve(g.cwd(),e):w(t)?new URL(e,t).href:m.resolve(t,e),n.has(s))return;if(r.has(s))throw a.forTemplateInheritance(r,s);r.add(s);let c=await fe(s),l=w(s)?new URL(`.`,s).href:m.dirname(s);if(c.extends!=null&&c.extends!==``){let e=Array.isArray(c.extends)?c.extends:[c.extends];for(let t of e)await pe(t,l,n,r,i)}r.delete(s),n.add(s),i.push(c)}async function E(e,t,n=new Set){let r=[];return await pe(e,t,n,new Set,r),se(r)}async function me(e,t,n=new Set){return ve(await E(e,t,n))}function he(e,t,n){let r=new Map;for(let t of e){if(r.has(t.id))throw y.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 y.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 y.forId(e.id,`prompt`,r.get(e.id));r.set(e.id,`prompt`)}}function ge(e,t){if((t.override??`merge`)===`replace`){o(` → Variable "${t.id}" using 'replace' strategy`,`info`);let{override:e,...n}=t;return n}o(` → Variable "${t.id}" merged (value replaced)`,`info`);let n={...e,...t};return delete n.override,n}function _e(e,t){if((t.override??`merge`)===`replace`){o(` → Prompt "${t.id}" using 'replace' strategy`,`info`);let{override:e,...n}=t;return n}o(` → Prompt "${t.id}" merged`,`info`);let n={...e,...t};return delete n.override,n}function ve(e){if(e.length===0)return{name:`Empty Template`,tasks:[]};if(e.length===1){let t=e[0];return he(t.tasks??[],t.variables,t.prompts),t}let t=new Map,n=new Map,r=new Map,i={};for(let a of e){if(a.enabled!=null&&(i[a.name]=a.enabled),a.enabled===!1){o(`⊘ Skipping disabled template "${a.name}" - its tasks, prompts, and variables will not be included`,`info`);continue}if(a.prompts!=null)for(let e of a.prompts)if(r.has(e.id)){if(e.override==null)throw b.forPrompt(e.id);let t=_e(r.get(e.id),e);a.enabled!=null&&(t.$templateEnabled=a.enabled),r.set(e.id,t)}else{let t={...e};a.enabled!=null&&(t.$templateEnabled=a.enabled),r.set(e.id,t)}if(a.variables!=null)for(let e of a.variables)if(n.has(e.id)){if(e.override==null)throw b.forVariable(e.id);let t=ge(n.get(e.id),e);a.enabled!=null&&(t.$templateEnabled=a.enabled),n.set(e.id,t)}else{let t={...e};a.enabled!=null&&(t.$templateEnabled=a.enabled),n.set(e.id,t)}for(let e of a.tasks??[])if(t.has(e.id)){if(e.override==null){let n=t.get(e.id);throw b.forTask(e.id,C(n.$sourceUrl),C(e.$sourceUrl))}let n=xe(t.get(e.id),e);a.enabled!=null&&(n.$templateEnabled=a.enabled),t.set(e.id,n)}else{let n={...e};a.enabled!=null&&(n.$templateEnabled=a.enabled),t.set(e.id,n)}}let a=Array.from(t.values()),s=r.size>0?Array.from(r.values()):void 0,c=n.size>0?Array.from(n.values()):void 0;he(a,c,s);let l=e[e.length-1],u={name:l.name,tasks:a};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 ye(e,t){let n=ce[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 be(e,t,n){let r={...e},i=ce[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 xe(e,t){if((t.override??`merge`)===`replace`){o(` → Task "${t.id}" using 'replace' strategy - completely replacing base task`,`info`),o(` Base: ${C(e.$sourceUrl)}`,`info`),o(` Override: ${C(t.$sourceUrl)}`,`info`);let{override:n,...r}=t;return r}o(` → Merging task "${t.id}"`,`info`),o(` Base: ${C(e.$sourceUrl)}`,`info`),o(` Override: ${C(t.$sourceUrl)}`,`info`);let n;if(typeof e.config==`object`&&e.config!==null&&typeof t.config==`object`&&t.config!==null){n=be(e.config,t.config,t.type);let r=ye(t.type,n);r!==null&&r.length>0&&(o(` ⚠️ Warning: Conflicting config fields detected: ${r.join(`, `)}`,`warn`),o(` Please use override: "replace" or specify only one of these fields`,`warn`))}else n=t.config??e.config;let r=[...e.dependencies??[],...t.dependencies??[]],i=r.length>0?[...new Set(r)]:void 0,a=t.$sourceUrl??e.$sourceUrl,s={...e,...t,config:n,...i!=null&&{dependencies:i},...a!=null&&{$sourceUrl:a}};return delete s.override,s}function Se(){T.clear()}async function Ce(e,t){if(o(`Loading tasks from ${e}...`,`info`),t?.sequential===!0){let t=await E(e);return o(`Loaded ${t.length} template(s) for sequential processing`,`info`),{tasks:[],templates:t}}let n=await me(e);o(`Loaded ${n.tasks?.length??0} task(s)`,`info`),n.extends!=null&&n.extends!==``&&o(`Extended from: ${(Array.isArray(n.extends)?n.extends:[n.extends]).join(`, `)}`,`info`),n.prompts!=null&&n.prompts.length>0&&o(`Found ${n.prompts.length} top-level prompt(s)`,`info`),n.variables!=null&&n.variables.length>0&&o(`Found ${n.variables.length} top-level variable(s)`,`info`);let r={tasks:n.tasks??[]};return n.prompts!=null&&(r.prompts=n.prompts),n.variables!=null&&(r.variables=n.variables),n.enabled!=null&&(r.enabled=n.enabled),r}function D(e){return e.template!=null&&e.template!==``}function O(e){return e.templateFile!=null&&e.templateFile!==``}function we(e){return e.endsWith(`.hbs`)}function k(e){let t=D(e),n=O(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 A(e,t,n,r={}){let{enableHandlebars:i=!0,sourceUrl:a=n?.$sourceUrl}=r,o=D(e),s=O(e);if(o)return u(e.template,t);if(s){let n=e.templateFile,r=i&&we(n),o=await ue(le(n,a));return r?(await import(`handlebars`)).default.compile(o)(t):u(o,t)}throw Error(`No template content available`)}function Te(e){return D(e)?`inline template`:O(e)?`template file: ${e.templateFile}`:`no template source`}const j=_(h.readFile),M={reset:`\x1B[0m`,red:`\x1B[31m`,green:`\x1B[32m`,yellow:`\x1B[33m`,blue:`\x1B[34m`,cyan:`\x1B[36m`,gray:`\x1B[90m`};function N(e,t){switch(t){case`add`:return`${M.green}+ ${e}${M.reset}`;case`remove`:return`${M.red}- ${e}${M.reset}`;case`context`:return`${M.gray} ${e}${M.reset}`;default:return e}}function P(e,t){let n=e.split(`
2
+ `),r=t.split(`
3
+ `),i=[],a=Math.max(n.length,r.length);for(let e=0;e<a;e++){let t=n[e],a=r[e];t===a?t!==void 0&&i.push(N(t,`context`)):(t!==void 0&&i.push(N(t,`remove`)),a!==void 0&&i.push(N(a,`add`)))}return i}async function Ee(e,t){if(e.condition!=null&&e.condition!==``&&!f(e.condition,t))return`${M.yellow}⊘ Condition not met - task would be skipped${M.reset}`;let n=m.join(g.cwd(),e.file);if(!h.existsSync(n))return`${M.red}✗ File not found: ${e.file}${M.reset}`;try{let r=await j(n,`utf-8`),i=JSON.parse(r),a={...i};function o(e){if(typeof e==`string`)return u(e,t);if(Array.isArray(e))return e.map(e=>o(e));if(typeof e==`object`&&e){let t={};for(let[n,r]of Object.entries(e))t[n]=o(r);return t}return e}for(let[t,n]of Object.entries(e.updates)){let e=o(n);t.includes(`.`)?d(i,t,e):i[t]=e}let s=JSON.stringify(a,null,2),c=JSON.stringify(i,null,2);if(s===c)return`${M.cyan}→ No changes${M.reset}`;let l=P(s,c);return`${M.blue}File: ${e.file}${M.reset}\n${l.join(`
4
+ `)}`}catch(e){return`${M.red}✗ Error: ${e instanceof Error?e.message:String(e)}${M.reset}`}}async function De(e,t){if(e.condition!=null&&e.condition!==``&&!f(e.condition,t))return`${M.yellow}⊘ Condition not met - task would be skipped${M.reset}`;if(e.template==null||e.template===``)return`${M.red}✗ No template content provided for file: ${e.file}${M.reset}`;let n=m.join(g.cwd(),e.file),r=u(e.template,t);if(!h.existsSync(n)){let t=r.split(`
5
+ `).slice(0,10).join(`
6
+ `),n=r.split(`
7
+ `).length>10;return`${M.blue}File: ${e.file}${M.reset}\n${M.green}+ New file would be created${M.reset}\n${M.gray}Content preview:${M.reset}\n${t}${n?`
8
+ ...`:``}`}try{let t=await j(n,`utf-8`);if(t===r)return`${M.cyan}→ No changes${M.reset}`;let i=P(t,r);return`${M.blue}File: ${e.file}${M.reset}\n${i.join(`
9
+ `)}`}catch(e){return`${M.red}✗ Error: ${e instanceof Error?e.message:String(e)}${M.reset}`}}async function Oe(e,t,n){if(e.condition!=null&&e.condition!==``&&!f(e.condition,t))return`${M.yellow}⊘ Condition not met - task would be skipped${M.reset}`;let r=m.join(g.cwd(),e.file);if(h.existsSync(r))return`${M.cyan}→ File already exists, would be skipped: ${e.file}${M.reset}`;try{if(D(e)){let r=await A(e,t,n),i=r.split(`
10
+ `).slice(0,10).join(`
11
+ `),a=r.split(`
12
+ `).length>10;return`${M.blue}File: ${e.file}${M.reset}\n${M.green}+ New file would be created${M.reset}\n${M.gray}Content preview:${M.reset}\n${i}${a?`
13
+ ...`:``}`}let r=Te(e);return`${M.blue}File: ${e.file}${M.reset}\n${M.green}+ New file would be created from ${r}${M.reset}`}catch(e){return`${M.red}✗ Error: ${e instanceof Error?e.message:String(e)}${M.reset}`}}async function ke(e,t){if(e.condition!=null&&e.condition!==``&&!f(e.condition,t))return`${M.yellow}⊘ Condition not met - task would be skipped${M.reset}`;let n=m.join(g.cwd(),e.file);if(!h.existsSync(n))return`${M.red}✗ File not found: ${e.file}${M.reset}`;try{let r=await j(n,`utf-8`),i=new RegExp(e.pattern,e.flags??`g`),a=u(e.replacement,t),o=r.replace(i,a);if(r===o)return`${M.cyan}→ No matches found${M.reset}`;let s=P(r,o);return`${M.blue}File: ${e.file}${M.reset}\n${s.join(`
14
+ `)}`}catch(e){return`${M.red}✗ Error: ${e instanceof Error?e.message:String(e)}${M.reset}`}}async function Ae(e,t){if(e.condition!=null&&e.condition!==``&&!f(e.condition,t))return`${M.yellow}⊘ Condition not met - task would be skipped${M.reset}`;let n=m.join(g.cwd(),e.file);if(!h.existsSync(n))return`${M.red}✗ File not found: ${e.file}${M.reset}`;try{let r=await j(n,`utf-8`),i=r;for(let{find:n,replace:i}of e.replacements){let e=u(n,t),a=u(i,t);r=r.replace(e,a)}if(i===r)return`${M.cyan}→ No changes${M.reset}`;let a=P(i,r);return`${M.blue}File: ${e.file}${M.reset}\n${a.join(`
15
+ `)}`}catch(e){return`${M.red}✗ Error: ${e instanceof Error?e.message:String(e)}${M.reset}`}}function je(e,t){if(e.condition!=null&&e.condition!==``&&!f(e.condition,t))return`${M.yellow}⊘ Condition not met - task would be skipped${M.reset}`;let n=e.paths.map(e=>u(e,t)).filter(e=>h.existsSync(m.join(g.cwd(),e)));return n.length===0?`${M.cyan}→ No files/directories to delete${M.reset}`:`${M.red}Would delete:${M.reset}\n${n.map(e=>`${M.red} - ${e}${M.reset}`).join(`
16
+ `)}`}function Me(e,t){if(e.condition!=null&&e.condition!==``&&!f(e.condition,t))return`${M.yellow}⊘ Condition not met - task would be skipped${M.reset}`;let n=u(e.from,t),r=u(e.to,t),i=m.join(g.cwd(),n),a=m.join(g.cwd(),r);return h.existsSync(i)?h.existsSync(a)?`${M.yellow}⚠ Destination already exists: ${r}${M.reset}\n${M.cyan}Would rename: ${n} → ${r}${M.reset}`:`${M.cyan}Would rename: ${n} → ${r}${M.reset}`:`${M.red}✗ Source not found: ${n}${M.reset}`}function Ne(e){if(e.condition!=null&&e.condition!==``)return`${M.yellow}⊘ Condition check skipped in dry-run${M.reset}`;let t=m.join(g.cwd(),`.git`),n=h.existsSync(t),r=[];if(e.removeExisting&&n&&r.push(`${M.red}Would remove existing .git directory${M.reset}`),r.push(`${M.green}Would initialize git repository${M.reset}`),e.initialCommit){let t=e.message??`Initial commit`;r.push(`${M.green}Would create initial commit: "${t}"${M.reset}`)}return r.join(`
17
+ `)}function Pe(e,t){if(e.condition!=null&&e.condition!==``&&!f(e.condition,t))return`${M.yellow}⊘ Condition not met - task would be skipped${M.reset}`;let n=u(e.command,t),r=e.cwd==null?g.cwd():u(e.cwd,t);return`${M.yellow}Would execute:${M.reset}\n${M.cyan} Command: ${n}${M.reset}\n${M.cyan} Working directory: ${r}${M.reset}`}function Fe(e,t){if(e.condition!=null&&e.condition!==``&&!f(e.condition,t))return`${M.yellow}⊘ Condition not met - task would be skipped${M.reset}`;let n=u(e.from,t),r=u(e.to,t),i=m.join(g.cwd(),n),a=m.join(g.cwd(),r);return h.existsSync(i)?h.existsSync(a)?`${M.yellow}⚠ Destination already exists: ${r}${M.reset}\n${M.cyan}Would move: ${n} → ${r}${M.reset}`:`${M.cyan}Would move: ${n} → ${r}${M.reset}`:`${M.red}✗ Source not found: ${n}${M.reset}`}function Ie(e,t){if(e.condition!=null&&e.condition!==``&&!f(e.condition,t))return`${M.yellow}⊘ Condition not met - task would be skipped${M.reset}`;let n=u(e.from,t),r=u(e.to,t),i=m.join(g.cwd(),n),a=m.join(g.cwd(),r);if(!h.existsSync(i))return`${M.red}✗ Source not found: ${n}${M.reset}`;let o=h.statSync(i).isDirectory()?`directory`:`file`;return h.existsSync(a)?`${M.yellow}⚠ Destination already exists: ${r}${M.reset}\n${M.cyan}Would copy ${o}: ${n} → ${r}${M.reset}`:`${M.cyan}Would copy ${o}: ${n} → ${r}${M.reset}`}async function Le(e,t,n){if(e.condition!=null&&e.condition!==``&&!f(e.condition,t))return`${M.yellow}⊘ Condition not met - task would be skipped${M.reset}`;let r=m.join(g.cwd(),e.file),i={};e.content==null?e.template!=null&&(i.template=e.template):i.template=e.content,e.templateFile!=null&&(i.templateFile=e.templateFile);try{let a=await A(i,t,n),o=a.split(`
18
+ `).slice(0,10).join(`
19
+ `),s=a.split(`
20
+ `).length>10;return h.existsSync(r)?`${M.blue}File: ${e.file}${M.reset}\n${M.green}+ Would append content${M.reset}\n${M.gray}Content preview:${M.reset}\n${o}${s?`
21
+ ...`:``}`:`${M.blue}File: ${e.file}${M.reset}\n${M.green}+ New file would be created with content${M.reset}\n${M.gray}Content preview:${M.reset}\n${o}${s?`
22
+ ...`:``}`}catch(e){return`${M.red}✗ Error: ${e instanceof Error?e.message:String(e)}${M.reset}`}}function Re(e,t){if(e.condition!=null&&e.condition!==``&&!f(e.condition,t))return`${M.yellow}⊘ Condition not met - task would be skipped${M.reset}`;let n=u(e.path,t),r=m.join(g.cwd(),n);return h.existsSync(r)?`${M.cyan}→ Directory already exists: ${n}${M.reset}`:`${M.green}+ Would create directory: ${n}${M.reset}`}async function ze(e,t){try{switch(e.type){case`update-json`:return await Ee(e.config,t);case`write`:return await De(e.config,t);case`create`:return await Oe(e.config,t,e);case`regex-replace`:return await ke(e.config,t);case`replace-in-file`:return await Ae(e.config,t);case`delete`:return je(e.config,t);case`rename`:return Me(e.config,t);case`move`:return Fe(e.config,t);case`copy`:return Ie(e.config,t);case`append`:return await Le(e.config,t,e);case`mkdir`:return Re(e.config,t);case`git-init`:return Ne(e.config);case`exec`:return Pe(e.config,t);default:{let t=e.type;return`${M.yellow}⚠ Diff not available for task type: ${t}${M.reset}`}}}catch(e){return`${M.red}✗ Error generating diff: ${e instanceof Error?e.message:String(e)}${M.reset}`}}async function F(e,t){console.log(`${M.blue}═══════════════════════════════════════════════════════${M.reset}`),console.log(`${M.blue} DRY RUN - Preview of changes${M.reset}`),console.log(`${M.blue}═══════════════════════════════════════════════════════${M.reset}`);for(let n of e){console.log(`${M.cyan}▶ Task: ${n.name}${M.reset}`),n.description!=null&&n.description!==``&&console.log(`${M.gray} ${n.description}${M.reset}`);let e=await ze(n,t);console.log(e),console.log(`${M.gray}${`─`.repeat(55)}${M.reset}`)}console.log(`${M.blue}═══════════════════════════════════════════════════════${M.reset}`),console.log(`${M.yellow} No changes were applied (dry-run mode)${M.reset}`),console.log(`${M.blue}═══════════════════════════════════════════════════════${M.reset}`)}const I=new Map,L={},R=new Map;function z(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(I.has(e.name))throw TypeError(`Plugin ${e.name} is already registered`);for(let t of e.taskTypes)if(R.has(t)){let e=R.get(t);throw TypeError(`Task type "${t}" is already registered by plugin "${e}"`)}I.set(e.name,e);for(let t of e.taskTypes)R.set(t,e.name);o(`✓ Registered plugin: ${e.name}${e.version==null?``:` v${e.version}`}`,`info`)}function Be(e){let t=I.get(e);if(t!=null){for(let e of t.taskTypes)R.delete(e);I.delete(e)}}function Ve(e){return I.get(e)}function B(e){let t=R.get(e);if(t!=null)return I.get(t)}function V(e){return R.has(e)}function He(){return Array.from(I.keys())}function Ue(){I.clear(),R.clear()}function We(e){e.beforeAll!=null&&(L.beforeAll=e.beforeAll),e.afterAll!=null&&(L.afterAll=e.afterAll),e.beforeTask!=null&&(L.beforeTask=e.beforeTask),e.afterTask!=null&&(L.afterTask=e.afterTask),e.onError!=null&&(L.onError=e.onError)}async function H(e,...t){let n=L[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){o(`Error in ${e} hook: ${t instanceof Error?t.message:String(t)}`,`error`)}}async function Ge(e,t,n){let r=B(e.type);if(r==null)throw TypeError(`No plugin found for task type: ${e.type}`);await r.execute(e,t,n)}async function Ke(e,t){let n=B(e.type);if(!(n==null||n.getDiff==null))return n.getDiff(e,t)}function qe(e){let t=B(e.type);return t==null?[`No plugin found for task type: ${e.type}`]:t.validate==null?[]:t.validate(e)}function Je(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}}}async function U(e,t,n){if(e===void 0)return;if(typeof e!=`object`||!e||Array.isArray(e))return typeof e==`string`&&n&&/\{\{\w+\}\}/u.test(e)?u(e,n):e;let r=e;if(r.type===`conditional`){if(!n)return;if(typeof r.condition!=`string`){o(`Prompt "${t}": conditional default must have a string condition`,`error`);return}try{let{evaluateCondition:e}=await import(`./utils-DCfSA0-O.js`),t=e(r.condition,n)?r.ifTrue:r.ifFalse;return typeof t==`string`&&/\{\{\w+\}\}/u.test(t)&&(t=u(t,n)),t}catch(e){o(`Prompt "${t}": failed to evaluate conditional default: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}if(r.type===`exec`){let e=r.value;if(typeof e!=`string`){o(`Prompt "${t}": exec default value must have a string command`,`error`);return}try{let t=v(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`}`,`warn`);return}}else if(r.type===`static`)return r.value;else if(r.type!==void 0){o(`Prompt "${t}": unknown default value type "${r.type}". Expected "static", "exec", or "conditional".`,`error`);return}return e}async function W(e,t=new Map,n={}){let r={};if(e.length===0)return r;for(let i of e){if(i.$templateEnabled!=null&&!await s(i.$templateEnabled,{...n,...r}))continue;let e={...n,...r};if(await s(i.enabled,e))try{let n,a=t.get(i.id);switch(i.default!==void 0&&(a=await U(i.default,i.id,e)),i.type){case`input`:{let e={message:i.message};if(a!==void 0&&(e.default=String(a)),i.required!==void 0&&(e.required=i.required),n=await te(e),i.required&&(n==null||typeof n==`string`&&n.trim()===``))throw o(`${i.message} is required`,`error`),x.required(i.id);break}case`password`:if(n=await re({message:i.message,mask:`*`}),i.required&&(n==null||typeof n==`string`&&n.trim()===``))throw o(`${i.message} is required`,`error`),x.required(i.id);break;case`number`:{let e={message:i.message};if(a!==void 0&&(e.default=Number(a)),i.required!==void 0&&(e.required=i.required),i.min!==void 0&&(e.min=i.min),i.max!==void 0&&(e.max=i.max),n=await ne(e),i.required&&n==null)throw o(`${i.message} is required`,`error`),x.required(i.id);break}case`select`:{let e={message:i.message,choices:i.choices.map(e=>({name:e.name,value:e.value}))};a!==void 0&&(e.default=a),n=await ie(e);break}case`confirm`:{let e=a===void 0?!1:!!a;n=await ee({message:i.message,default:e});break}default:throw o(`Unknown prompt type: ${i.type}`,`error`),x.unknownType(i.type)}r[i.id]=n}catch(e){throw e instanceof Error&&o(`Failed to collect prompt "${i.id}": ${e.message}`,`error`),e}}return r}async function G(e){let t=new Map,n=e.map(async e=>{if(e.default!==void 0){let n=await U(e.default,e.id);n!==void 0&&t.set(e.id,n)}});return await Promise.all(n),t}function K(e){let t=[],n=new Set;for(let r of e){if(n.has(r.id)&&t.push(`Duplicate prompt ID: ${r.id}`),n.add(r.id),/^[a-zA-Z_$][a-zA-Z0-9_$]*$/u.test(r.id)||t.push(`Invalid prompt ID "${r.id}": must be a valid JavaScript identifier (start with letter, underscore, or $, followed by letters, digits, underscores, or $)`),(!r.message||r.message.trim()===``)&&t.push(`Prompt "${r.id}" must have a non-empty message`),r.type===`select`){r.choices.length===0&&t.push(`Select prompt "${r.id}" must have at least one choice`);for(let e of r.choices)(!e.name||e.name.trim()===``)&&t.push(`Select prompt "${r.id}" has a choice with empty name`),e.value===void 0&&t.push(`Select prompt "${r.id}" has a choice with undefined value`)}r.type===`number`&&r.min!==void 0&&r.max!==void 0&&r.min>r.max&&t.push(`Number prompt "${r.id}" has min greater than max`)}return t}const Ye=_(h.appendFile),Xe=_(h.readFile),Ze=_(h.stat);async function Qe(e,t,n){if(e.condition!=null&&e.condition!==``&&!f(e.condition,t)){o(`Condition not met, skipping append task`,`info`);return}let r=m.join(g.cwd(),e.file),i={};e.content==null?e.template!=null&&(i.template=e.template):i.template=e.content,e.templateFile!=null&&(i.templateFile=e.templateFile);let a=k(i);if(!a.isValid)throw a.error?.includes(`cannot have both`)?S.templateHasBothTemplateAndFile():S.templateMissingTemplateOrFile();let s=await A(i,t,n),c=!1,l=!1;try{await Ze(r),c=!0;let t=await Xe(r,`utf-8`);t.length>0&&!t.endsWith(`
23
+ `)&&(l=e.newline!==!1)}catch{}c&&l?await Ye(r,`\n${s}`):await Ye(r,s),o(`Appended content to ${e.file}`,`success`)}const $e={name:`append`,version:`1.0.0`,taskTypes:[`append`],execute:async(e,t,n)=>{n.dryRun||await Qe(e.config,t,e)}},et=_(h.copyFile),tt=_(h.stat),nt=_(h.mkdir),rt=_(h.readdir);async function it(e,t){await nt(t,{recursive:!0});let n=await rt(e,{withFileTypes:!0});await Promise.all(n.map(async n=>{let r=m.join(e,n.name),i=m.join(t,n.name);n.isDirectory()?await it(r,i):await et(r,i)}))}async function at(e,t){if(e.condition!=null&&e.condition!==``&&!f(e.condition,t)){o(`Condition not met, skipping copy task`,`info`);return}let n=m.join(g.cwd(),e.from),r=m.join(g.cwd(),e.to),i;try{i=await tt(n)}catch{o(`Source path does not exist: ${n}`,`warn`);return}await nt(m.dirname(r),{recursive:!0}),i.isDirectory()?(await it(n,r),o(`Copied directory ${e.from} to ${e.to}`,`success`)):(await et(n,r),o(`Copied file ${e.from} to ${e.to}`,`success`))}const ot={name:`copy`,version:`1.0.0`,taskTypes:[`copy`],execute:async(e,t,n)=>{n.dryRun||await at(e.config,t)}},st=_(h.writeFile);async function ct(e,t,n){if(e.condition!=null&&e.condition!==``&&!f(e.condition,t)){o(`Condition not met, skipping create task`,`info`);return}let r=m.join(g.cwd(),e.file);if(h.existsSync(r)){o(`File already exists, skipping: ${e.file}`,`info`);return}let i=k(e);if(!i.isValid)throw i.error?.includes(`cannot have both`)?S.createHasBothTemplateAndFile():S.createMissingTemplateOrFile();let a=await A(e,t,n),s=m.dirname(r);h.existsSync(s)||h.mkdirSync(s,{recursive:!0}),await st(r,a),o(`Created file: ${e.file}`,`success`)}const lt={name:`create`,version:`1.0.0`,taskTypes:[`create`],execute:async(e,t,n)=>{n.dryRun||await ct(e.config,t,e)}};async function ut(e,t){let{paths:n,condition:r}=e;if(r!=null&&r!==``){if(!t){o(`Condition specified but no config provided, skipping deletion`,`warn`);return}if(!f(r,t)){o(`Condition not met, skipping deletion`,`info`);return}}for(let e of n){let t=m.join(g.cwd(),e);h.existsSync(t)&&h.rmSync(t,{recursive:!0,force:!0})}}const dt={name:`delete`,version:`1.0.0`,taskTypes:[`delete`],execute:async(e,t,n)=>{n.dryRun||await ut(e.config,t)}};async function ft(e,t){if(e.condition!=null&&e.condition!==``){if(!t){o(`Condition specified but no config provided, skipping exec`,`warn`);return}if(!f(e.condition,t)){o(`Condition not met, skipping exec task`,`info`);return}}let n=e.cwd==null?g.cwd():m.join(g.cwd(),e.cwd);v(e.command,{cwd:n,stdio:`inherit`})}const pt={name:`exec`,version:`1.0.0`,taskTypes:[`exec`],execute:async(e,t,n)=>{n.dryRun||await ft(e.config,t)}};async function mt(e,t){if(e.condition!=null&&e.condition!==``){if(!t){o(`Condition specified but no config provided, skipping git-init`,`warn`);return}if(!f(e.condition,t)){o(`Condition not met, skipping git-init task`,`info`);return}}if(e.removeExisting){let e=m.join(g.cwd(),`.git`);h.existsSync(e)&&h.rmSync(e,{recursive:!0,force:!0})}if(v(`git init`,{stdio:`inherit`}),e.initialCommit){let t=e.message??`Initial commit`;v(`git add .`,{stdio:`inherit`}),v(`git commit -m "${t}"`,{stdio:`inherit`})}}const ht={name:`git-init`,version:`1.0.0`,taskTypes:[`git-init`],execute:async(e,t,n)=>{n.dryRun||await mt(e.config,t)}},gt=_(h.mkdir);async function _t(e,t){if(e.condition!=null&&e.condition!==``&&!f(e.condition,t)){o(`Condition not met, skipping mkdir task`,`info`);return}await gt(m.join(g.cwd(),e.path),{recursive:!0}),o(`Created directory: ${e.path}`,`success`)}const vt={name:`mkdir`,version:`1.0.0`,taskTypes:[`mkdir`],execute:async(e,t,n)=>{n.dryRun||await _t(e.config,t)}},yt=_(h.rename),bt=_(h.stat),xt=_(h.mkdir);async function St(e,t){if(e.condition!=null&&e.condition!==``&&!f(e.condition,t)){o(`Condition not met, skipping move task`,`info`);return}let n=m.join(g.cwd(),e.from),r=m.join(g.cwd(),e.to);try{await bt(n)}catch{o(`Source path does not exist: ${n}`,`warn`);return}await xt(m.dirname(r),{recursive:!0}),await yt(n,r),o(`Moved ${e.from} to ${e.to}`,`success`)}const Ct={name:`move`,version:`1.0.0`,taskTypes:[`move`],execute:async(e,t,n)=>{n.dryRun||await St(e.config,t)}},wt=_(h.readFile),Tt=_(h.writeFile);async function Et(e,t){if(e.condition!=null&&e.condition!==``&&!f(e.condition,t)){o(`Condition not met, skipping regex-replace task`,`info`);return}let n=m.join(g.cwd(),e.file),{pattern:r}=e,i=e.flags??``,a=e.replacement||``,s=await wt(n,`utf-8`),c=new RegExp(r,i);s=s.replace(c,u(a,t)),await Tt(n,s)}const Dt={name:`regex-replace`,version:`1.0.0`,taskTypes:[`regex-replace`],execute:async(e,t,n)=>{n.dryRun||await Et(e.config,t)}},Ot=_(h.rename);async function kt(e,t){if(e.condition!=null&&e.condition!==``&&!f(e.condition,t)){o(`Condition not met, skipping rename task`,`info`);return}let n=m.join(g.cwd(),u(e.from,t)),r=m.join(g.cwd(),u(e.to,t));if(!h.existsSync(n)){o(`Source path does not exist: ${n}`,`warn`);return}await Ot(n,r)}const At={name:`rename`,version:`1.0.0`,taskTypes:[`rename`],execute:async(e,t,n)=>{n.dryRun||await kt(e.config,t)}},jt=_(h.readFile),Mt=_(h.writeFile);async function Nt(e,t){if(e.condition!=null&&e.condition!==``&&!f(e.condition,t)){o(`Condition not met, skipping replace-in-file task`,`info`);return}let n=m.join(g.cwd(),e.file),{replacements:r}=e;if(!h.existsSync(n)){o(`File not found: ${n}, skipping`,`warn`);return}let i=await jt(n,`utf-8`);for(let{find:e,replace:n}of r){let r=u(n,t);i=i.replace(new RegExp(e,`gu`),r)}await Mt(n,i)}const Pt={name:`replace-in-file`,version:`1.0.0`,taskTypes:[`replace-in-file`],execute:async(e,t,n)=>{n.dryRun||await Nt(e.config,t)}},Ft=_(h.readFile),It=_(h.writeFile);async function Lt(e,t){if(e.condition!=null&&e.condition!==``&&!f(e.condition,t)){o(`Condition not met, skipping update-json task`,`info`);return}let n=m.join(g.cwd(),e.file),{updates:r}=e,i=await Ft(n,`utf-8`),a=JSON.parse(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[e,t]of Object.entries(r)){let n=s(t);e.includes(`.`)?d(a,e,n):a[e]=n}await It(n,`${JSON.stringify(a,null,2)}\n`)}const Rt={name:`update-json`,version:`1.0.0`,taskTypes:[`update-json`],execute:async(e,t,n)=>{n.dryRun||await Lt(e.config,t)}},zt=_(h.writeFile);async function Bt(e,t,n){let{allowCreate:r=!0}=e;if(e.condition!=null&&e.condition!==``&&!f(e.condition,t)){o(`Condition not met, skipping write task`,`info`);return}let i=m.join(g.cwd(),e.file);if(!h.existsSync(i)){if(r===!1)throw Error(`Write task failed: file does not exist (${e.file})`);o(`File not found, creating new file: ${e.file}`,`info`)}let a=k(e);if(!a.isValid)throw a.error?.includes(`cannot have both`)?S.templateHasBothTemplateAndFile():S.templateMissingTemplateOrFile();let s=await A(e,t,n),c=m.dirname(i);h.existsSync(c)||h.mkdirSync(c,{recursive:!0}),await zt(i,s)}const Vt={name:`write`,version:`1.0.0`,taskTypes:[`write`],execute:async(e,t,n)=>{n.dryRun||await Bt(e.config,t,e)}};function q(){V(`update-json`)||(z(Rt),z(Vt),z(lt),z(Dt),z(Pt),z(dt),z(At),z(ht),z(pt),z(Ct),z(ot),z($e),z(vt))}async function J(e,t,n=!1){if(q(),n){o(`[DRY RUN] Would execute: ${e.name}`,`info`);return}if(V(e.type)){await Ge(e,t,{dryRun:n});return}throw TypeError(`Unknown task type: ${e.type}`)}async function Y(e,t,n,r,i=!1){try{return o(`[${n}/${r}] Running: ${e.name}...`,`info`),await J(e,t,i),o(`✓ ${e.name}`,`success`),!0}catch(t){return o(`✗ Failed: ${e.name}`,`error`),t instanceof Error&&(o(` Reason: ${t.message}`,`error`),t.stack!=null&&g.env.DEBUG!=null&&console.error(t.stack)),(e.required??!0)&&o(` This is a required task. Initialization cannot continue.`,`error`),!1}}function X(e){let t=[],n=new Set,r=new Set,i=new Map(e.map(e=>[e.id,e]));function o(e){if(n.has(e))return;if(r.has(e))throw a.forTaskDependency(e);r.add(e);let s=i.get(e);if(!s)throw ae.forId(e);if(s.dependencies)for(let e of s.dependencies)o(e);r.delete(e),n.add(e),t.push(s)}for(let t of e)n.has(t.id)||o(t.id);return t}function Ht(e){let t=[];for(let n of e)if(!V(n.type))t.push(`Task "${n.id}" (${n.name}): Unknown task type "${n.type}"`);else if(n.type===`write`){let e=Ut(n);t.push(...e)}return t}function Ut(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=k({...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 Wt(e){o(`❌ Template validation failed:`,`error`),o(``,`error`);for(let t of e)o(` • ${t}`,`error`);o(``,`error`),o(`Please fix these errors before continuing.`,`error`)}function Z(e,t=new Map){let n={};for(let r of e){let e=t.get(r.id);e!==void 0&&(n[r.id]=e)}return n}async function Gt(e,t,n){if(e==null)return;if(typeof e!=`object`||!e||Array.isArray(e))return e;let r=e;if(r.type===`conditional`){if(!n){o(`Variable "${t}": conditional value requires context but none provided`,`warn`);return}if(typeof r.condition!=`string`){o(`Variable "${t}": conditional value must have a string condition`,`error`);return}try{let{evaluateCondition:e,interpolateTemplate:t}=await import(`./utils-DCfSA0-O.js`),i=e(r.condition,n)?r.ifTrue:r.ifFalse;return typeof i==`string`&&/\{\{\w+\}\}/u.test(i)&&(i=t(i,n)),i}catch(e){o(`Variable "${t}": failed to evaluate conditional value: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}if(r.type===`exec`){let e=r.value;if(typeof e!=`string`){o(`Variable "${t}": exec value must have a string command`,`error`);return}try{let t=v(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(`Variable "${t}": failed to execute command: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}else if(r.type===`static`)return r.value;return e}async function Q(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 s(i.$templateEnabled,e))continue}let e={...t};for(let[t,n]of r.entries())e[t]=n;let a=await Gt(i.value,i.id,e);a!==void 0&&r.set(i.id,a)}return r}function $(e){let t=[],n=new Set;for(let r of e)if(n.has(r.id)&&t.push(`Duplicate variable ID: "${r.id}"`),n.add(r.id),/^[a-zA-Z_$][a-zA-Z0-9_$]*$/u.test(r.id)||t.push(`Variable ID "${r.id}" is invalid. Must be a valid JavaScript identifier (start with letter, underscore, or $, followed by letters, digits, underscores, or $).`),r.value===void 0||r.value===null)t.push(`Variable "${r.id}" must have a value`);else if(typeof r.value==`object`&&!Array.isArray(r.value)&&r.value!==null){let e=r.value;e.type==null||e.type===``?t.push(`Variable "${r.id}": value object must have a "type" field ("static", "exec", or "conditional")`):e.type!==`static`&&e.type!==`exec`&&e.type!==`conditional`&&t.push(`Variable "${r.id}": type must be "static", "exec", or "conditional", got "${e.type}"`),(e.type===`static`||e.type===`exec`)&&(e.value===void 0||e.value===null)&&t.push(`Variable "${r.id}": value config must have a "value" field`),e.type===`exec`&&typeof e.value!=`string`&&t.push(`Variable "${r.id}": exec type must have a string command as value`),e.type===`conditional`&&((e.condition===void 0||e.condition===null||e.condition===``||typeof e.condition!=`string`)&&t.push(`Variable "${r.id}": conditional type must have a "condition" field with a string expression`),e.ifTrue===void 0&&t.push(`Variable "${r.id}": conditional type must have an "ifTrue" field`),e.ifFalse===void 0&&t.push(`Variable "${r.id}": conditional type must have an "ifFalse" field`))}return t}async function Kt(n,r){let i=e();if(!await s(r.templateEnabled,i,{lazy:!0})){o(`⊘ Template is disabled - skipping all execution`,`info`);return}q(),o(`Validating task configurations...`,`info`);let a=Ht(n);a.length>0&&(Wt(a),g.exit(1)),o(`✓ All tasks validated successfully`,`success`);let c=n.filter(n=>t(n.enabled,e(),{lazy:!0}));o(`Resolving task dependencies...`,`info`);let l=X(c);o(`Welcome! Let's execute your tasks.`,`info`),r.dryRun&&o(`🔍 DRY RUN MODE - No changes will be made`,`warn`),o(`This will execute your project tasks based on the defined configuration.`,`info`);let u=i,d=[...r.globalVariables??[]];if(d.length>0){let e=$(d);e.length>0&&(o(`❌ Variable validation errors:`,`error`),e.forEach(e=>o(` - ${e}`,`error`)),g.exit(1)),o(`Resolving variable values...`,`info`);let t=Z(d,await Q(d,u,{skipConditional:!0}));Object.assign(u,t),Object.keys(t).length>0&&o(`✓ Resolved ${Object.keys(t).length} variable(s)`,`success`)}let f=r.globalPrompts??[],p=[...f];if(p.length>0){let e=K(p);e.length>0&&(o(`❌ Prompt validation errors:`,`error`),e.forEach(e=>o(` - ${e}`,`error`)),g.exit(1)),o(`Resolving prompt default values...`,`info`);let t=await G(p);if(f.length>0){o(`📋 Collecting prompts (available to all tasks):`,`info`);let e=await W(f,t,u);Object.assign(u,e)}}if(d.length>0){let e=d.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...`,`info`);let t=Z(e,await Q(e,u));Object.assign(u,t),Object.keys(t).length>0&&o(`✓ Resolved ${Object.keys(t).length} conditional variable(s)`,`success`)}}if(!await s(r.templateEnabled,u)){o(`⊘ Template is disabled after variable resolution - skipping all execution`,`info`);return}let m=[];for(let e of l)e.$templateEnabled!=null&&!await s(e.$templateEnabled,u)||await s(e.enabled,u)&&m.push(e);if(o(`${m.length} of ${l.length} task(s) enabled for execution`,`info`),r.dryRun){await F(m,u),o(`🔍 Dry run completed - no changes were made`,`info`),o(`Run without --dry-run to apply changes`,`info`);return}o(`Starting task execution...`,`info`),await H(`beforeAll`,u);let h=m.length,_=0,v=0,ee=[];for(let e=0;e<m.length;e++){let t=m[e];if(t!=null)if(await H(`beforeTask`,t,u),await Y(t,u,e+1,h,r.dryRun))_++,ee.push(t.id),await H(`afterTask`,t,u);else if(t.required??!0){v++,await H(`onError`,Error(`Task ${t.name} failed`),t);break}else o(`⚠️ Non-critical task failed, continuing...`,`warn`),await H(`onError`,Error(`Task ${t.name} failed`),t)}v>0&&(o(`❌ Task execution failed with ${v} critical error(s)`,`error`),o(`✓ Completed: ${_}/${h} tasks`,`info`),g.exit(1)),await H(`afterAll`,u),o(`✅ All tasks completed successfully!`,`success`),o(`✓ Completed: ${_}/${h} tasks`,`success`)}async function qt(e,t,n={}){o(`Running templates with sequential variable/prompt resolution...`,`info`),o(`Total templates to process: ${e.length}`,`info`),q();let r=[];o(`
24
+ 📋 Phase 1: Resolving variables and prompts from all templates...`,`info`);for(let t=0;t<e.length;t++){let i=e[t];if(i==null)continue;let a=`=`.repeat(60);if(o(`\n${a}`,`info`),o(`Processing template ${t+1}/${e.length}: "${i.name}"`,`info`),o(a,`info`),g.env.DEBUG!=null&&o(`Current config keys: ${Object.keys(n).join(`, `)}`,`info`),!await s(i.enabled,n)){o(`⊘ Template "${i.name}" is disabled - skipping`,`info`),i.enabled!=null&&g.env.DEBUG!=null&&o(` Enabled condition: ${JSON.stringify(i.enabled)}`,`info`);continue}let c=i.variables??[];if(c.length>0){o(`Processing ${c.length} variable(s) for template "${i.name}"...`,`info`);let e=$(c);e.length>0&&(o(`❌ Variable validation errors:`,`error`),e.forEach(e=>o(` - ${e}`,`error`)),g.exit(1));let t=Z(c,await Q(c,n,{skipConditional:!0}));Object.assign(n,t);let r=c.filter(e=>typeof e.value==`object`&&e.value!==null&&!Array.isArray(e.value)?e.value.type===`conditional`:!1),a=0;if(r.length>0){let e=Z(r,await Q(r,n));if(a=Object.keys(e).length,Object.assign(n,e),a>0&&(o(`✓ Resolved ${a} conditional variable(s)`,`success`),g.env.DEBUG!=null))for(let[t,n]of Object.entries(e))o(` ${t} = ${JSON.stringify(n)}`,`info`)}let s=Object.keys(t).length+a;s>0&&o(`✓ Total variables resolved for template: ${s}`,`success`)}let l=i.prompts??[];if(l.length>0){o(`Processing ${l.length} prompt(s) for template "${i.name}"...`,`info`);let e=K(l);e.length>0&&(o(`❌ Prompt validation errors:`,`error`),e.forEach(e=>o(` - ${e}`,`error`)),g.exit(1));let t=await W(l,await G(l),n);Object.assign(n,t),o(`✓ Collected ${Object.keys(t).length} prompt answer(s)`,`success`)}if(!await s(i.enabled,n)){o(`⊘ Template "${i.name}" became disabled after variable/prompt resolution - skipping tasks`,`info`);continue}let u=i.tasks??[];u.length>0&&(o(`Found ${u.length} task(s) in template "${i.name}" (will execute later)`,`info`),r.push(...u))}if(o(`
25
+ 🔧 Phase 2: Validating and filtering all collected tasks...`,`info`),r.length===0){o(`No tasks found in any template`,`info`);return}o(`Total tasks collected: ${r.length}`,`info`);let i=Ht(r);i.length>0&&(Wt(i),g.exit(1)),o(`✓ All tasks validated successfully`,`success`);let a=[];for(let e of r)await s(e.enabled,n)&&a.push(e);if(o(`${a.length} of ${r.length} task(s) enabled`,`info`),a.length===0){o(`No enabled tasks to execute`,`info`);return}let c=X(a);if(t.dryRun){o(`
26
+ 🔍 Phase 3: Dry run - showing task changes...`,`info`),await F(c,n),o(`
27
+ 🔍 Dry run completed - no changes were made`,`info`),o(`Run without --dry-run to apply changes`,`info`);return}o(`
28
+ ⚙️ Phase 3: Executing all tasks...`,`info`),o(`Starting task execution (${c.length} tasks)...`,`info`),await H(`beforeAll`,n);let l=0,u=0;for(let e=0;e<c.length;e++){let r=c[e];if(r!=null)if(await H(`beforeTask`,r,n),await Y(r,n,e+1,c.length,t.dryRun))l++,await H(`afterTask`,r,n);else if(r.required??!0){u++,await H(`onError`,Error(`Task ${r.name} failed`),r),o(`❌ Critical task failed: ${r.name}`,`error`);break}else o(`⚠️ Non-critical task failed: ${r.name}, continuing...`,`warn`),await H(`onError`,Error(`Task ${r.name} failed`),r)}await H(`afterAll`,n),u>0&&(o(`\n❌ Task execution failed with ${u} critical error(s)`,`error`),o(`✓ Completed: ${l}/${c.length} tasks`,`info`),g.exit(1)),o(`
29
+ ✅ All tasks completed successfully!`,`success`),o(`✓ Completed: ${l}/${c.length} tasks`,`success`)}export{je as A,D as B,He as C,qe as D,Be as E,Ae as F,Se as G,A as H,ze as I,fe as J,me as K,Ee as L,Ne as M,ke as N,F as O,Me as P,De as R,V as S,z as T,we as U,O as V,k as W,ve as X,E as Y,Je as _,Gt as a,B as b,J as c,K as d,G as f,Ue as g,H as h,Q as i,Pe as j,Oe as k,q as l,U as m,qt as n,Z as o,W as p,Ce as q,$ as r,X as s,Kt as t,Y as u,Ge as v,We as w,Ke as x,Ve as y,Te as z};
@@ -0,0 +1 @@
1
+ import"./config-DfRbCqsT.js";import"./utils-D61aLjOR.js";import{n as e,t}from"./run-tasks-C859oQ3R.js";export{t as runTasks,e as runTemplatesSequentially};
@@ -0,0 +1 @@
1
+ const e=require(`./utils-Bhsv13ij.cjs`),t=require(`./run-tasks-Bn4lboAE.cjs`);let n=require(`node:process`);n=e._(n);const r=n.default.argv.includes(`--dry-run`),i=n.default.argv.includes(`--force`);async function a(a){try{let o=a||[];o.length===0&&(e.i(`⚠️ No tasks defined. Use --tasks-file to specify tasks or call runWithTasks() programmatically.`,`warn`),e.i(`Example: scaffoldfy --tasks-file ./tasks.json`,`info`),n.default.exit(1)),await t.t(o,{dryRun:r,force:i,tasksFilePath:void 0})}catch(t){e.i(`❌ Task execution failed`,`error`),t instanceof Error?(e.i(`Error: ${t.message}`,`error`),n.default.env.DEBUG!=null&&console.error(t.stack)):console.error(t),n.default.exit(1)}}async function o(a,o){try{await t.t(a,{dryRun:o?.dryRun??r,force:o?.force??i,tasksFilePath:o?.tasksFilePath??void 0,...o?.globalVariables!=null&&{globalVariables:o.globalVariables},...o?.globalPrompts!=null&&{globalPrompts:o.globalPrompts},...o?.templateEnabled!=null&&{templateEnabled:o.templateEnabled}})}catch(t){e.i(`❌ Task execution failed`,`error`),t instanceof Error?(e.i(`Error: ${t.message}`,`error`),n.default.env.DEBUG!=null&&console.error(t.stack)):console.error(t),n.default.exit(1)}}Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return o}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return a}});
@@ -0,0 +1 @@
1
+ import{i as e}from"./utils-D61aLjOR.js";import{t}from"./run-tasks-C859oQ3R.js";import n from"node:process";const r=n.argv.includes(`--dry-run`),i=n.argv.includes(`--force`);async function a(a){try{let o=a||[];o.length===0&&(e(`⚠️ No tasks defined. Use --tasks-file to specify tasks or call runWithTasks() programmatically.`,`warn`),e(`Example: scaffoldfy --tasks-file ./tasks.json`,`info`),n.exit(1)),await t(o,{dryRun:r,force:i,tasksFilePath:void 0})}catch(t){e(`❌ Task execution failed`,`error`),t instanceof Error?(e(`Error: ${t.message}`,`error`),n.env.DEBUG!=null&&console.error(t.stack)):console.error(t),n.exit(1)}}async function o(a,o){try{await t(a,{dryRun:o?.dryRun??r,force:o?.force??i,tasksFilePath:o?.tasksFilePath??void 0,...o?.globalVariables!=null&&{globalVariables:o.globalVariables},...o?.globalPrompts!=null&&{globalPrompts:o.globalPrompts},...o?.templateEnabled!=null&&{templateEnabled:o.templateEnabled}})}catch(t){e(`❌ Task execution failed`,`error`),t instanceof Error?(e(`Error: ${t.message}`,`error`),n.env.DEBUG!=null&&console.error(t.stack)):console.error(t),n.exit(1)}}export{o as n,a as t};
@@ -0,0 +1 @@
1
+ var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));let c=require(`node:fs`);c=s(c);let l=require(`node:path`);l=s(l);let u=require(`node:process`);u=s(u);let d=require(`node:child_process`);d=s(d);let f=require(`node:readline`);f=s(f),require(`handlebars`);var p=class extends Error{constructor(e,t){super(e),this.code=t,this.name=this.constructor.name}},m=class e extends p{constructor(e,t,n){super(e,`CIRCULAR_DEPENDENCY`),this.dependencyChain=t,this.resolvedPath=n,this.name=`CircularDependencyError`}static forTemplateInheritance(t,n){let r=Array.from(t);return new e(`Circular dependency detected: ${r.join(` -> `)} -> ${n}`,r,n)}static forTaskDependency(t){return new e(`Circular dependency detected involving task: ${t}`,[t])}static forTemplateDependencies(t,n){let r=[...t,n];return new e(`Circular dependency detected in template dependencies: ${r.join(` -> `)}`,r)}},h=class e extends p{constructor(e,t){super(e,`TEMPLATE_FILE_NOT_FOUND`),this.filePath=t,this.name=`TemplateFileNotFoundError`}static forPath(t){return new e(`Template file not found: ${t}`,t)}},g=class e extends p{constructor(e,t,n){super(e,`TEMPLATE_RESOLUTION_ERROR`),this.templateFilePath=t,this.sourceUrl=n,this.name=`TemplateResolutionError`}static forRemoteTemplate(t,n){return new e(`Failed to resolve templateFile "${t}" relative to remote template "${n}"`,t,n)}},_=class e extends p{constructor(e,t,n){super(e,`TEMPLATE_FETCH_ERROR`),this.url=t,this.originalError=n,this.name=`TemplateFetchError`}static forUrl(t,n,r){return typeof n==`number`?new e(`Failed to fetch template from ${t}: ${n} ${r??``}`.trim(),t):new e(`Failed to fetch template from ${t}: ${n?.message??String(n??`Unknown error`)}`,t,n)}},v=class e extends p{constructor(e,t,n){super(e,`TEMPLATE_PARSE_ERROR`),this.filePath=t,this.originalError=n,this.name=`TemplateParseError`}static forFile(t,n){return new e(`Failed to parse template file ${t}: ${n.message}`,t,n)}},y=class e extends p{constructor(e,t){super(e,`INVALID_TEMPLATE`),this.filePath=t,this.name=`InvalidTemplateError`}static forFile(t,n){return new e(`Invalid template file ${t}: ${n}`,t)}static tasksNotArray(t){return new e(`Invalid template file ${t}: 'tasks' must be an array if provided`,t)}static missingName(t){return new e(`Invalid template file ${t}: 'name' field is required`,t)}static invalidNameFormat(t,n){return new e(`Invalid template file ${t}: 'name' field "${n}" must contain only lowercase letters, digits, and hyphens. It cannot start or end with a hyphen, and cannot contain consecutive hyphens.`,t)}};function b(e,t,n){return e===void 0?!0:typeof e==`boolean`?e:typeof e==`string`?O(e,t,n?.lazy===!0?{lazy:!0}:void 0):typeof e==`object`&&`type`in e&&e.type===`exec`?n?.lazy===!0:typeof e==`object`&&`condition`in e?O(e.condition,t,n?.lazy===!0?{lazy:!0}:void 0):!1}async function x(e,t,n){if(e===void 0)return!0;if(typeof e==`boolean`)return e;if(typeof e==`string`)return O(e,t,n?.lazy===!0?{lazy:!0}:void 0);if(typeof e==`object`&&`type`in e&&e.type===`exec`)try{let{execSync:n}=await import(`node:child_process`),{interpolateTemplate:r}=await Promise.resolve().then(()=>require(`./utils-BpeIOLcI.cjs`)),i=n(r(e.value,t),{encoding:`utf-8`}).trim();if(i===``||i===`0`)return!1;let a=i.toLowerCase();return!(a===`false`||a===`no`)}catch(t){let{log:n}=await Promise.resolve().then(()=>require(`./utils-BpeIOLcI.cjs`));return n(`Failed to execute enabled command: ${e.value}`,`warn`),t instanceof Error&&n(` Error: ${t.message}`,`warn`),!1}return typeof e==`object`&&`condition`in e?O(e.condition,t,n?.lazy===!0?{lazy:!0}:void 0):!1}function S(){try{let e=(0,d.execSync)(`git remote get-url origin`,{encoding:`utf-8`}).trim(),t=e.match(/github\.com[:/](?<owner>[^/]+)\/(?<name>[^/]+)$/u);if(t?.groups){let{owner:n,name:r}=t.groups,i=r;return i.endsWith(`.git`)&&(i=i.slice(0,-4)),{owner:n,name:i,url:e}}return null}catch{return null}}async function C(e,t){let n=f.default.createInterface({input:u.default.stdin,output:u.default.stdout});return new Promise(r=>{let i;i=t==null?`${e}: `:`${e} (${t}): `,n.question(i,e=>{n.close(),r(e.trim()||(t??``))})})}async function w(e,t=!1){return C(`${e} (${t?`Y/n`:`y/N`})`,t?`y`:`n`).then(e=>e.toLowerCase()===`y`||e.toLowerCase()===`yes`)}function T(e,t=`info`){console.log(`${{info:`\x1B[36m`,success:`\x1B[32m`,error:`\x1B[31m`,warn:`\x1B[33m`}[t]}${{info:`ℹ`,success:`✓`,error:`✗`,warn:`⚠`}[t]} ${e}`)}function E(e,t){return e.replace(/\{\{(?<key>\w+)\}\}/gu,(e,n)=>t[n]?.toString()??``)}function D(e,t,n){let r=t.split(`.`),i=e;for(let e=0;e<r.length-1;e++){let t=r[e];t!=null&&t!==``&&((!(t in i)||typeof i[t]!=`object`||i[t]===null)&&(i[t]={}),i=i[t])}let a=r[r.length-1];a!=null&&a!==``&&(i[a]=n)}function O(e,t,n){try{let n={...t};return Function(...Object.keys(n),`'use strict'; return (${e})`)(...Object.values(n))}catch(t){return n?.lazy===!0&&t instanceof ReferenceError?!0:(n?.silent!==!0&&(T(`Failed to evaluate condition: ${e}`,`warn`),t instanceof Error&&T(` Error: ${t.message}`,`warn`)),!1)}}Object.defineProperty(exports,`_`,{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return C}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return b}}),Object.defineProperty(exports,`d`,{enumerable:!0,get:function(){return _}}),Object.defineProperty(exports,`f`,{enumerable:!0,get:function(){return h}}),Object.defineProperty(exports,`g`,{enumerable:!0,get:function(){return p}}),Object.defineProperty(exports,`h`,{enumerable:!0,get:function(){return m}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return T}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return x}}),Object.defineProperty(exports,`m`,{enumerable:!0,get:function(){return g}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return S}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return w}}),Object.defineProperty(exports,`p`,{enumerable:!0,get:function(){return v}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return E}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return D}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return O}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return y}});
@@ -1 +1 @@
1
- const e=require(`./utils-CdfjwUZm.cjs`);exports.evaluateCondition=e.t,exports.evaluateEnabled=e.c,exports.evaluateEnabledAsync=e.l,exports.getGitRepoInfo=e.n,exports.interpolateTemplate=e.r,exports.log=e.i,exports.prompt=e.a,exports.promptYesNo=e.o,exports.setNestedProperty=e.s;
1
+ const e=require(`./utils-Bhsv13ij.cjs`);exports.evaluateCondition=e.t,exports.evaluateEnabled=e.c,exports.evaluateEnabledAsync=e.l,exports.getGitRepoInfo=e.n,exports.interpolateTemplate=e.r,exports.log=e.i,exports.prompt=e.a,exports.promptYesNo=e.o,exports.setNestedProperty=e.s;
@@ -0,0 +1 @@
1
+ import e from"node:path";import t from"node:fs";import n from"node:process";import{execSync as r}from"node:child_process";import i from"node:readline";import"handlebars";var a=class extends Error{constructor(e,t){super(e),this.code=t,this.name=this.constructor.name}},o=class e extends a{constructor(e,t,n){super(e,`CIRCULAR_DEPENDENCY`),this.dependencyChain=t,this.resolvedPath=n,this.name=`CircularDependencyError`}static forTemplateInheritance(t,n){let r=Array.from(t);return new e(`Circular dependency detected: ${r.join(` -> `)} -> ${n}`,r,n)}static forTaskDependency(t){return new e(`Circular dependency detected involving task: ${t}`,[t])}static forTemplateDependencies(t,n){let r=[...t,n];return new e(`Circular dependency detected in template dependencies: ${r.join(` -> `)}`,r)}},s=class e extends a{constructor(e,t){super(e,`TEMPLATE_FILE_NOT_FOUND`),this.filePath=t,this.name=`TemplateFileNotFoundError`}static forPath(t){return new e(`Template file not found: ${t}`,t)}},c=class e extends a{constructor(e,t,n){super(e,`TEMPLATE_RESOLUTION_ERROR`),this.templateFilePath=t,this.sourceUrl=n,this.name=`TemplateResolutionError`}static forRemoteTemplate(t,n){return new e(`Failed to resolve templateFile "${t}" relative to remote template "${n}"`,t,n)}},l=class e extends a{constructor(e,t,n){super(e,`TEMPLATE_FETCH_ERROR`),this.url=t,this.originalError=n,this.name=`TemplateFetchError`}static forUrl(t,n,r){return typeof n==`number`?new e(`Failed to fetch template from ${t}: ${n} ${r??``}`.trim(),t):new e(`Failed to fetch template from ${t}: ${n?.message??String(n??`Unknown error`)}`,t,n)}},u=class e extends a{constructor(e,t,n){super(e,`TEMPLATE_PARSE_ERROR`),this.filePath=t,this.originalError=n,this.name=`TemplateParseError`}static forFile(t,n){return new e(`Failed to parse template file ${t}: ${n.message}`,t,n)}},d=class e extends a{constructor(e,t){super(e,`INVALID_TEMPLATE`),this.filePath=t,this.name=`InvalidTemplateError`}static forFile(t,n){return new e(`Invalid template file ${t}: ${n}`,t)}static tasksNotArray(t){return new e(`Invalid template file ${t}: 'tasks' must be an array if provided`,t)}static missingName(t){return new e(`Invalid template file ${t}: 'name' field is required`,t)}static invalidNameFormat(t,n){return new e(`Invalid template file ${t}: 'name' field "${n}" must contain only lowercase letters, digits, and hyphens. It cannot start or end with a hyphen, and cannot contain consecutive hyphens.`,t)}};function f(e,t,n){return e===void 0?!0:typeof e==`boolean`?e:typeof e==`string`?b(e,t,n?.lazy===!0?{lazy:!0}:void 0):typeof e==`object`&&`type`in e&&e.type===`exec`?n?.lazy===!0:typeof e==`object`&&`condition`in e?b(e.condition,t,n?.lazy===!0?{lazy:!0}:void 0):!1}async function p(e,t,n){if(e===void 0)return!0;if(typeof e==`boolean`)return e;if(typeof e==`string`)return b(e,t,n?.lazy===!0?{lazy:!0}:void 0);if(typeof e==`object`&&`type`in e&&e.type===`exec`)try{let{execSync:n}=await import(`node:child_process`),{interpolateTemplate:r}=await import(`./utils-DCfSA0-O.js`),i=n(r(e.value,t),{encoding:`utf-8`}).trim();if(i===``||i===`0`)return!1;let a=i.toLowerCase();return!(a===`false`||a===`no`)}catch(t){let{log:n}=await import(`./utils-DCfSA0-O.js`);return n(`Failed to execute enabled command: ${e.value}`,`warn`),t instanceof Error&&n(` Error: ${t.message}`,`warn`),!1}return typeof e==`object`&&`condition`in e?b(e.condition,t,n?.lazy===!0?{lazy:!0}:void 0):!1}function m(){try{let e=r(`git remote get-url origin`,{encoding:`utf-8`}).trim(),t=e.match(/github\.com[:/](?<owner>[^/]+)\/(?<name>[^/]+)$/u);if(t?.groups){let{owner:n,name:r}=t.groups,i=r;return i.endsWith(`.git`)&&(i=i.slice(0,-4)),{owner:n,name:i,url:e}}return null}catch{return null}}async function h(e,t){let r=i.createInterface({input:n.stdin,output:n.stdout});return new Promise(n=>{let i;i=t==null?`${e}: `:`${e} (${t}): `,r.question(i,e=>{r.close(),n(e.trim()||(t??``))})})}async function g(e,t=!1){return h(`${e} (${t?`Y/n`:`y/N`})`,t?`y`:`n`).then(e=>e.toLowerCase()===`y`||e.toLowerCase()===`yes`)}function _(e,t=`info`){console.log(`${{info:`\x1B[36m`,success:`\x1B[32m`,error:`\x1B[31m`,warn:`\x1B[33m`}[t]}${{info:`ℹ`,success:`✓`,error:`✗`,warn:`⚠`}[t]} ${e}`)}function v(e,t){return e.replace(/\{\{(?<key>\w+)\}\}/gu,(e,n)=>t[n]?.toString()??``)}function y(e,t,n){let r=t.split(`.`),i=e;for(let e=0;e<r.length-1;e++){let t=r[e];t!=null&&t!==``&&((!(t in i)||typeof i[t]!=`object`||i[t]===null)&&(i[t]={}),i=i[t])}let a=r[r.length-1];a!=null&&a!==``&&(i[a]=n)}function b(e,t,n){try{let n={...t};return Function(...Object.keys(n),`'use strict'; return (${e})`)(...Object.values(n))}catch(t){return n?.lazy===!0&&t instanceof ReferenceError?!0:(n?.silent!==!0&&(_(`Failed to evaluate condition: ${e}`,`warn`),t instanceof Error&&_(` Error: ${t.message}`,`warn`)),!1)}}export{h as a,f as c,l as d,s as f,a as g,o as h,_ as i,p as l,c as m,m as n,g as o,u as p,v as r,y as s,b as t,d as u};
@@ -1 +1 @@
1
- import{a as e,c as t,i as n,l as r,n as i,o as a,r as o,s,t as c}from"./utils-DfD7I1u2.js";export{c as evaluateCondition,t as evaluateEnabled,r as evaluateEnabledAsync,i as getGitRepoInfo,o as interpolateTemplate,n as log,e as prompt,a as promptYesNo,s as setNestedProperty};
1
+ import{a as e,c as t,i as n,l as r,n as i,o as a,r as o,s,t as c}from"./utils-D61aLjOR.js";export{c as evaluateCondition,t as evaluateEnabled,r as evaluateEnabledAsync,i as getGitRepoInfo,o as interpolateTemplate,n as log,e as prompt,a as promptYesNo,s as setNestedProperty};
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@pixpilot/scaffoldfy",
3
3
  "type": "module",
4
- "version": "0.23.0",
4
+ "version": "0.24.0",
5
5
  "author": "PixPilot <m.doaie@hotmail.com>",
6
6
  "license": "MIT",
7
7
  "repository": {
@@ -169,11 +169,6 @@
169
169
  "description": "Strategy for merging with base task when extending templates"
170
170
  },
171
171
  "$sourceUrl": { "type": "string" },
172
- "prompts": { "type": "array", "items": { "$ref": "#/$defs/promptItem" } },
173
- "variables": {
174
- "type": "array",
175
- "items": { "$ref": "#/$defs/taskVariableItem" }
176
- },
177
172
  "type": {
178
173
  "type": "string",
179
174
  "enum": [
@@ -467,73 +462,6 @@
467
462
  }
468
463
  }
469
464
  },
470
- "taskVariableItem": {
471
- "type": "object",
472
- "required": ["id", "value"],
473
- "additionalProperties": false,
474
- "properties": {
475
- "id": {
476
- "type": "string",
477
- "description": "Unique identifier for the variable (must be a valid JavaScript identifier: start with letter, underscore, or $, followed by letters, digits, underscores, or $)",
478
- "pattern": "^[a-zA-Z_$][a-zA-Z0-9_$]*$"
479
- },
480
- "value": {
481
- "description": "Variable value. Can be a static value or an object with 'type' and 'value' properties for executable values, or a conditional configuration.",
482
- "oneOf": [
483
- {
484
- "description": "Static value (string, number, or boolean)"
485
- },
486
- {
487
- "type": "object",
488
- "description": "Value configuration for static, executable, or conditional values",
489
- "required": ["type"],
490
- "properties": {
491
- "type": {
492
- "type": "string",
493
- "enum": ["static", "exec", "conditional"],
494
- "description": "Type of value. 'static' for explicit static values, 'exec' for command execution, 'conditional' for condition-based values."
495
- },
496
- "value": {
497
- "description": "For 'static' type: the static value. For 'exec' type: the shell command to execute. Commands output will be trimmed and auto-parsed as JSON, number, or boolean when applicable. Not used for 'conditional' type."
498
- },
499
- "condition": {
500
- "type": "string",
501
- "description": "For 'conditional' type: JavaScript expression to evaluate. Can reference other variables, prompts, and config values."
502
- },
503
- "ifTrue": {
504
- "description": "For 'conditional' type: Value to use if condition evaluates to true. Can be a static value or a template string with {{variables}}."
505
- },
506
- "ifFalse": {
507
- "description": "For 'conditional' type: Value to use if condition evaluates to false. Can be a static value or a template string with {{variables}}."
508
- }
509
- },
510
- "allOf": [
511
- {
512
- "if": {
513
- "properties": {
514
- "type": { "enum": ["static", "exec"] }
515
- }
516
- },
517
- "then": {
518
- "required": ["value"]
519
- }
520
- },
521
- {
522
- "if": {
523
- "properties": {
524
- "type": { "const": "conditional" }
525
- }
526
- },
527
- "then": {
528
- "required": ["condition", "ifTrue", "ifFalse"]
529
- }
530
- }
531
- ]
532
- }
533
- ]
534
- }
535
- }
536
- },
537
465
  "config-update-json": {
538
466
  "title": "Update JSON Config",
539
467
  "type": "object",
@@ -1,23 +0,0 @@
1
- const e=require(`./utils-CdfjwUZm.cjs`);let t=require(`node:fs`);t=e._(t);let n=require(`node:path`);n=e._(n);let r=require(`node:process`);r=e._(r);let i=require(`node:util`);i=e._(i);let a=require(`node:child_process`);a=e._(a);let o=require(`@inquirer/prompts`);o=e._(o);function s(){return{}}var c=class t extends e.g{constructor(e,t,n,r){super(e,`DUPLICATE_ID`),this.id=t,this.type=n,this.existingType=r,this.name=`DuplicateIdError`}static forId(e,n,r){return new t(`Duplicate ID "${e}" found in ${n}. This ID is already used in ${r??`unknown`}`,e,n,r)}},l=class t extends e.g{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(e,n,r){return new t(`Task ID conflict: "${e}" 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.`,e,`task`,n,r)}static forVariable(e){return new t(`Variable ID conflict: "${e}" 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.`,e,`variable`)}static forPrompt(e){return new t(`Prompt ID conflict: "${e}" 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.`,e,`prompt`)}},u=class t extends e.g{constructor(e,t){super(e,`TASK_NOT_FOUND`),this.taskId=t,this.name=`TaskNotFoundError`}static forId(e){return new t(`Task not found: ${e}`,e)}},d=class t extends e.g{constructor(e,t,n){super(e,`PROMPT_VALIDATION_ERROR`),this.promptId=t,this.reason=n,this.name=`PromptValidationError`}static required(e){return new t(`Prompt "${e}" is required`,e,`required`)}static unknownType(e){return new t(`Unknown prompt type: ${e}`,e,`unknown_type`)}},f=class t extends e.g{constructor(e,t,n){super(e,`PLUGIN_CONFIGURATION_ERROR`),this.pluginType=t,this.configIssue=n,this.name=`PluginConfigurationError`}static templateMissingTemplateOrFile(){return new t(`Template task requires either "template" (inline) or "templateFile" (file path) to be specified`,`template`,`missing_template_or_file`)}static templateHasBothTemplateAndFile(){return new t(`Template task cannot have both "template" and "templateFile" specified. Use one or the other.`,`template`,`both_template_and_file`)}static createMissingTemplateOrFile(){return new t(`Create task requires either "template" (inline) or "templateFile" (file path) to be specified`,`create`,`missing_template_or_file`)}static createHasBothTemplateAndFile(){return new t(`Create task cannot have both "template" and "templateFile" specified. Use one or the other.`,`create`,`both_template_and_file`)}};const p=(0,i.promisify)(t.default.readFile),m={template:[[`template`,`templateFile`]]};function h(e){if(e==null||e===``)return`current template`;if(g(e))return e;let t=r.default.cwd();return e.startsWith(t)?n.default.relative(t,e):e}function g(e){try{let t=new URL(e);return t.protocol===`http:`||t.protocol===`https:`}catch{return!1}}function _(t,i){if(g(t))return t;if(i==null||i===``)return n.default.isAbsolute(t)?t:n.default.resolve(r.default.cwd(),t);if(g(i))try{let e=new URL(`.`,i);return new URL(t,e).href}catch{throw e.m.forRemoteTemplate(t,i)}let a=n.default.dirname(i);return n.default.isAbsolute(t)?t:n.default.resolve(a,t)}async function v(n){if(g(n))return y(n);if(!t.default.existsSync(n))throw e.f.forPath(n);return p(n,`utf-8`)}async function y(t){try{let n=await fetch(t);if(!n.ok)throw e.d.forUrl(t,n.status,n.statusText);return await n.text()}catch(n){throw n instanceof Error&&n.message.includes(`Failed to fetch`)?n:e.d.forUrl(t,n instanceof Error?n:void 0)}}const b=new Map;async function ee(i,a=new Set){let o=g(i),s;if(s=o||n.default.isAbsolute(i)?i:n.default.resolve(r.default.cwd(),i),b.has(s))return b.get(s);if(a.has(s))throw e.h.forTemplateInheritance(a,s);a.add(s);let c;if(o)c=await y(s);else{if(!t.default.existsSync(s))throw e.f.forPath(s);c=await p(s,`utf-8`)}let l;try{l=JSON.parse(c)}catch(t){throw e.p.forFile(s,t instanceof Error?t:Error(String(t)))}if(l.name==null||l.name.trim()===``)throw e.u.missingName(s);if(!/^[a-z\d]+(?:-[a-z\d]+)*$/u.test(l.name))throw e.u.invalidNameFormat(s,l.name);if(l.tasks!==void 0&&!Array.isArray(l.tasks))throw e.u.tasksNotArray(s);l.tasks===void 0&&(l.tasks=[]);for(let e of l.tasks)e.$sourceUrl=s;return b.set(s,l),l}async function x(t,i,a=new Set){let o=g(t),s;if(s=o||n.default.isAbsolute(t)?t:i==null?n.default.resolve(r.default.cwd(),t):g(i)?new URL(t,i).href:n.default.resolve(i,t),a.has(s))throw e.h.forTemplateInheritance(a,s);a.add(s);let c=await ee(s);if(c.extends==null||c.extends===``)return c;let l=g(s)?new URL(`.`,s).href:n.default.dirname(s),u=Array.isArray(c.extends)?c.extends:[c.extends],d=[];for(let e of u){let t=await x(e,l,a);d.push(t)}return ie([...d,c])}function te(e,t,n){let r=new Map;for(let t of e){if(r.has(t.id))throw c.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 c.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 c.forId(e.id,`prompt`,r.get(e.id));r.set(e.id,`prompt`)}}function ne(t,n){if((n.override??`merge`)===`replace`){e.i(` → Variable "${n.id}" using 'replace' strategy`,`info`);let{override:t,...r}=n;return r}e.i(` → Variable "${n.id}" merged (value replaced)`,`info`);let r={...t,...n};return delete r.override,r}function re(t,n){if((n.override??`merge`)===`replace`){e.i(` → Prompt "${n.id}" using 'replace' strategy`,`info`);let{override:t,...r}=n;return r}e.i(` → Prompt "${n.id}" merged`,`info`);let r={...t,...n};return delete r.override,r}function ie(t){if(t.length===0)return{name:`Empty Template`,tasks:[]};if(t.length===1){let e=t[0];return te(e.tasks??[],e.variables,e.prompts),e}let n=new Map,r=new Map,i=new Map,a={};for(let o of t){if(o.enabled!=null&&(a[o.name]=o.enabled),o.enabled===!1){e.i(`⊘ 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 l.forPrompt(e.id);let t=re(i.get(e.id),e);o.enabled!=null&&(t.$templateEnabled=o.enabled),i.set(e.id,t)}else{let t={...e};o.enabled!=null&&(t.$templateEnabled=o.enabled),i.set(e.id,t)}if(o.variables!=null)for(let e of o.variables)if(r.has(e.id)){if(e.override==null)throw l.forVariable(e.id);let t=ne(r.get(e.id),e);o.enabled!=null&&(t.$templateEnabled=o.enabled),r.set(e.id,t)}else{let t={...e};o.enabled!=null&&(t.$templateEnabled=o.enabled),r.set(e.id,t)}for(let e of o.tasks??[])if(n.has(e.id)){if(e.override==null){let t=n.get(e.id);throw l.forTask(e.id,h(t.$sourceUrl),h(e.$sourceUrl))}let t=se(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)}}let o=Array.from(n.values()),s=i.size>0?Array.from(i.values()):void 0,c=r.size>0?Array.from(r.values()):void 0;te(o,c,s);let u=t[t.length-1],d={name:u.name,tasks:o};return u.description!=null&&(d.description=u.description),u.dependencies!=null&&(d.dependencies=u.dependencies),u.enabled!=null&&(d.enabled=u.enabled),s!=null&&(d.prompts=s),c!=null&&(d.variables=c),d}function ae(e,t){let n=m[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 oe(e,t,n){let r={...e},i=m[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 se(t,n){if((n.override??`merge`)===`replace`){e.i(` → Task "${n.id}" using 'replace' strategy - completely replacing base task`,`info`),e.i(` Base: ${h(t.$sourceUrl)}`,`info`),e.i(` Override: ${h(n.$sourceUrl)}`,`info`);let{override:r,...i}=n;return i}e.i(` → Merging task "${n.id}"`,`info`),e.i(` Base: ${h(t.$sourceUrl)}`,`info`),e.i(` Override: ${h(n.$sourceUrl)}`,`info`);let r;if(typeof t.config==`object`&&t.config!==null&&typeof n.config==`object`&&n.config!==null){r=oe(t.config,n.config,n.type);let i=ae(n.type,r);i!==null&&i.length>0&&(e.i(` ⚠️ Warning: Conflicting config fields detected: ${i.join(`, `)}`,`warn`),e.i(` Please use override: "replace" or specify only one of these fields`,`warn`))}else r=n.config??t.config;let i=t.prompts?[...t.prompts]:void 0;if(n.prompts&&n.prompts.length>0)if(!i)i=[...n.prompts];else{let e=new Map(i.map(e=>[e.id,e]));for(let t of n.prompts)e.set(t.id,t);i=Array.from(e.values())}let a=t.variables?[...t.variables]:void 0;if(n.variables&&n.variables.length>0)if(!a)a=[...n.variables];else{let e=new Map(a.map(e=>[e.id,e]));for(let t of n.variables)e.set(t.id,t);a=Array.from(e.values())}let o=[...t.dependencies??[],...n.dependencies??[]],s=o.length>0?[...new Set(o)]:void 0,c=n.$sourceUrl??t.$sourceUrl,l={...t,...n,config:r,...i!=null&&{prompts:i},...a!=null&&{variables:a},...s!=null&&{dependencies:s},...c!=null&&{$sourceUrl:c}};return delete l.override,l}function ce(){b.clear()}async function le(t){e.i(`Loading tasks from ${t}...`,`info`);let n=await x(t);e.i(`Loaded ${n.tasks?.length??0} task(s)`,`info`),n.extends!=null&&n.extends!==``&&e.i(`Extended from: ${(Array.isArray(n.extends)?n.extends:[n.extends]).join(`, `)}`,`info`),n.prompts!=null&&n.prompts.length>0&&e.i(`Found ${n.prompts.length} top-level prompt(s)`,`info`),n.variables!=null&&n.variables.length>0&&e.i(`Found ${n.variables.length} top-level variable(s)`,`info`);let r={tasks:n.tasks??[]};return n.prompts!=null&&(r.prompts=n.prompts),n.variables!=null&&(r.variables=n.variables),n.enabled!=null&&(r.enabled=n.enabled),r}function S(e){return e.template!=null&&e.template!==``}function C(e){return e.templateFile!=null&&e.templateFile!==``}function ue(e){return e.endsWith(`.hbs`)}function w(e){let t=S(e),n=C(e);return!t&&!n?{isValid:!1,hasInlineTemplate:t,hasTemplateFile:n,error:`Template configuration requires either "template" (inline) or "templateFile" (file path) to be specified`}:t&&n?{isValid:!1,hasInlineTemplate:t,hasTemplateFile:n,error:`Template configuration cannot have both "template" and "templateFile" specified. Use one or the other.`}:{isValid:!0,hasInlineTemplate:t,hasTemplateFile:n}}async function T(t,n,r,i={}){let{enableHandlebars:a=!0,sourceUrl:o=r?.$sourceUrl}=i,s=S(t),c=C(t);if(s)return e.r(t.template,n);if(c){let r=t.templateFile,i=a&&ue(r),s=await v(_(r,o));return i?(await import(`handlebars`)).default.compile(s)(n):e.r(s,n)}throw Error(`No template content available`)}function de(e){return S(e)?`inline template`:C(e)?`template file: ${e.templateFile}`:`no template source`}const E=(0,i.promisify)(t.default.readFile),fe=2,pe=10,me=55,D={reset:`\x1B[0m`,red:`\x1B[31m`,green:`\x1B[32m`,yellow:`\x1B[33m`,blue:`\x1B[34m`,cyan:`\x1B[36m`,gray:`\x1B[90m`};function O(e,t){switch(t){case`add`:return`${D.green}+ ${e}${D.reset}`;case`remove`:return`${D.red}- ${e}${D.reset}`;case`context`:return`${D.gray} ${e}${D.reset}`;default:return e}}function k(e,t){let n=e.split(`
2
- `),r=t.split(`
3
- `),i=[],a=Math.max(n.length,r.length);for(let e=0;e<a;e++){let t=n[e],a=r[e];t===a?t!==void 0&&i.push(O(t,`context`)):(t!==void 0&&i.push(O(t,`remove`)),a!==void 0&&i.push(O(a,`add`)))}return i}async function A(i,a){if(i.condition!=null&&i.condition!==``&&!e.t(i.condition,a))return`${D.yellow}⊘ Condition not met - task would be skipped${D.reset}`;let o=n.default.join(r.default.cwd(),i.file);if(!t.default.existsSync(o))return`${D.red}✗ File not found: ${i.file}${D.reset}`;try{let t=await E(o,`utf-8`),n=JSON.parse(t),r={...n};function s(t){if(typeof t==`string`)return e.r(t,a);if(Array.isArray(t))return t.map(e=>s(e));if(typeof t==`object`&&t){let e={};for(let[n,r]of Object.entries(t))e[n]=s(r);return e}return t}for(let[t,r]of Object.entries(i.updates)){let i=s(r);t.includes(`.`)?e.s(n,t,i):n[t]=i}let c=JSON.stringify(r,null,2),l=JSON.stringify(n,null,2);if(c===l)return`${D.cyan}→ No changes${D.reset}`;let u=k(c,l);return`${D.blue}File: ${i.file}${D.reset}\n${u.join(`
4
- `)}`}catch(e){return`${D.red}✗ Error: ${e instanceof Error?e.message:String(e)}${D.reset}`}}async function j(i,a){if(i.condition!=null&&i.condition!==``&&!e.t(i.condition,a))return`${D.yellow}⊘ Condition not met - task would be skipped${D.reset}`;if(i.template==null||i.template===``)return`${D.red}✗ No template content provided for file: ${i.file}${D.reset}`;let o=n.default.join(r.default.cwd(),i.file),s=e.r(i.template,a);if(!t.default.existsSync(o)){let e=s.split(`
5
- `).slice(0,10).join(`
6
- `),t=s.split(`
7
- `).length>10;return`${D.blue}File: ${i.file}${D.reset}\n${D.green}+ New file would be created${D.reset}\n${D.gray}Content preview:${D.reset}\n${e}${t?`
8
- ...`:``}`}try{let e=await E(o,`utf-8`);if(e===s)return`${D.cyan}→ No changes${D.reset}`;let t=k(e,s);return`${D.blue}File: ${i.file}${D.reset}\n${t.join(`
9
- `)}`}catch(e){return`${D.red}✗ Error: ${e instanceof Error?e.message:String(e)}${D.reset}`}}async function M(i,a,o){if(i.condition!=null&&i.condition!==``&&!e.t(i.condition,a))return`${D.yellow}⊘ Condition not met - task would be skipped${D.reset}`;let s=n.default.join(r.default.cwd(),i.file);if(t.default.existsSync(s))return`${D.cyan}→ File already exists, would be skipped: ${i.file}${D.reset}`;try{if(S(i)){let e=await T(i,a,o),t=e.split(`
10
- `).slice(0,10).join(`
11
- `),n=e.split(`
12
- `).length>10;return`${D.blue}File: ${i.file}${D.reset}\n${D.green}+ New file would be created${D.reset}\n${D.gray}Content preview:${D.reset}\n${t}${n?`
13
- ...`:``}`}let e=de(i);return`${D.blue}File: ${i.file}${D.reset}\n${D.green}+ New file would be created from ${e}${D.reset}`}catch(e){return`${D.red}✗ Error: ${e instanceof Error?e.message:String(e)}${D.reset}`}}async function N(i,a){if(i.condition!=null&&i.condition!==``&&!e.t(i.condition,a))return`${D.yellow}⊘ Condition not met - task would be skipped${D.reset}`;let o=n.default.join(r.default.cwd(),i.file);if(!t.default.existsSync(o))return`${D.red}✗ File not found: ${i.file}${D.reset}`;try{let t=await E(o,`utf-8`),n=new RegExp(i.pattern,i.flags??`g`),r=e.r(i.replacement,a),s=t.replace(n,r);if(t===s)return`${D.cyan}→ No matches found${D.reset}`;let c=k(t,s);return`${D.blue}File: ${i.file}${D.reset}\n${c.join(`
14
- `)}`}catch(e){return`${D.red}✗ Error: ${e instanceof Error?e.message:String(e)}${D.reset}`}}async function P(i,a){if(i.condition!=null&&i.condition!==``&&!e.t(i.condition,a))return`${D.yellow}⊘ Condition not met - task would be skipped${D.reset}`;let o=n.default.join(r.default.cwd(),i.file);if(!t.default.existsSync(o))return`${D.red}✗ File not found: ${i.file}${D.reset}`;try{let t=await E(o,`utf-8`),n=t;for(let{find:n,replace:r}of i.replacements){let i=e.r(n,a),o=e.r(r,a);t=t.replace(i,o)}if(n===t)return`${D.cyan}→ No changes${D.reset}`;let r=k(n,t);return`${D.blue}File: ${i.file}${D.reset}\n${r.join(`
15
- `)}`}catch(e){return`${D.red}✗ Error: ${e instanceof Error?e.message:String(e)}${D.reset}`}}function F(i,a){if(i.condition!=null&&i.condition!==``&&!e.t(i.condition,a))return`${D.yellow}⊘ Condition not met - task would be skipped${D.reset}`;let o=i.paths.map(t=>e.r(t,a)).filter(e=>t.default.existsSync(n.default.join(r.default.cwd(),e)));return o.length===0?`${D.cyan}→ No files/directories to delete${D.reset}`:`${D.red}Would delete:${D.reset}\n${o.map(e=>`${D.red} - ${e}${D.reset}`).join(`
16
- `)}`}function I(i,a){if(i.condition!=null&&i.condition!==``&&!e.t(i.condition,a))return`${D.yellow}⊘ Condition not met - task would be skipped${D.reset}`;let o=e.r(i.from,a),s=e.r(i.to,a),c=n.default.join(r.default.cwd(),o),l=n.default.join(r.default.cwd(),s);return t.default.existsSync(c)?t.default.existsSync(l)?`${D.yellow}⚠ Destination already exists: ${s}${D.reset}\n${D.cyan}Would rename: ${o} → ${s}${D.reset}`:`${D.cyan}Would rename: ${o} → ${s}${D.reset}`:`${D.red}✗ Source not found: ${o}${D.reset}`}function L(e){if(e.condition!=null&&e.condition!==``)return`${D.yellow}⊘ Condition check skipped in dry-run${D.reset}`;let i=n.default.join(r.default.cwd(),`.git`),a=t.default.existsSync(i),o=[];if(e.removeExisting&&a&&o.push(`${D.red}Would remove existing .git directory${D.reset}`),o.push(`${D.green}Would initialize git repository${D.reset}`),e.initialCommit){let t=e.message??`Initial commit`;o.push(`${D.green}Would create initial commit: "${t}"${D.reset}`)}return o.join(`
17
- `)}function R(t,n){if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,n))return`${D.yellow}⊘ Condition not met - task would be skipped${D.reset}`;let i=e.r(t.command,n),a=t.cwd==null?r.default.cwd():e.r(t.cwd,n);return`${D.yellow}Would execute:${D.reset}\n${D.cyan} Command: ${i}${D.reset}\n${D.cyan} Working directory: ${a}${D.reset}`}function he(i,a){if(i.condition!=null&&i.condition!==``&&!e.t(i.condition,a))return`${D.yellow}⊘ Condition not met - task would be skipped${D.reset}`;let o=e.r(i.from,a),s=e.r(i.to,a),c=n.default.join(r.default.cwd(),o),l=n.default.join(r.default.cwd(),s);return t.default.existsSync(c)?t.default.existsSync(l)?`${D.yellow}⚠ Destination already exists: ${s}${D.reset}\n${D.cyan}Would move: ${o} → ${s}${D.reset}`:`${D.cyan}Would move: ${o} → ${s}${D.reset}`:`${D.red}✗ Source not found: ${o}${D.reset}`}function ge(i,a){if(i.condition!=null&&i.condition!==``&&!e.t(i.condition,a))return`${D.yellow}⊘ Condition not met - task would be skipped${D.reset}`;let o=e.r(i.from,a),s=e.r(i.to,a),c=n.default.join(r.default.cwd(),o),l=n.default.join(r.default.cwd(),s);if(!t.default.existsSync(c))return`${D.red}✗ Source not found: ${o}${D.reset}`;let u=t.default.statSync(c).isDirectory()?`directory`:`file`;return t.default.existsSync(l)?`${D.yellow}⚠ Destination already exists: ${s}${D.reset}\n${D.cyan}Would copy ${u}: ${o} → ${s}${D.reset}`:`${D.cyan}Would copy ${u}: ${o} → ${s}${D.reset}`}async function _e(i,a,o){if(i.condition!=null&&i.condition!==``&&!e.t(i.condition,a))return`${D.yellow}⊘ Condition not met - task would be skipped${D.reset}`;let s=n.default.join(r.default.cwd(),i.file),c={};i.content==null?i.template!=null&&(c.template=i.template):c.template=i.content,i.templateFile!=null&&(c.templateFile=i.templateFile);try{let e=await T(c,a,o),n=e.split(`
18
- `).slice(0,10).join(`
19
- `),r=e.split(`
20
- `).length>10;return t.default.existsSync(s)?`${D.blue}File: ${i.file}${D.reset}\n${D.green}+ Would append content${D.reset}\n${D.gray}Content preview:${D.reset}\n${n}${r?`
21
- ...`:``}`:`${D.blue}File: ${i.file}${D.reset}\n${D.green}+ New file would be created with content${D.reset}\n${D.gray}Content preview:${D.reset}\n${n}${r?`
22
- ...`:``}`}catch(e){return`${D.red}✗ Error: ${e instanceof Error?e.message:String(e)}${D.reset}`}}function ve(i,a){if(i.condition!=null&&i.condition!==``&&!e.t(i.condition,a))return`${D.yellow}⊘ Condition not met - task would be skipped${D.reset}`;let o=e.r(i.path,a),s=n.default.join(r.default.cwd(),o);return t.default.existsSync(s)?`${D.cyan}→ Directory already exists: ${o}${D.reset}`:`${D.green}+ Would create directory: ${o}${D.reset}`}async function z(e,t){try{switch(e.type){case`update-json`:return await A(e.config,t);case`write`:return await j(e.config,t);case`create`:return await M(e.config,t,e);case`regex-replace`:return await N(e.config,t);case`replace-in-file`:return await P(e.config,t);case`delete`:return F(e.config,t);case`rename`:return I(e.config,t);case`move`:return he(e.config,t);case`copy`:return ge(e.config,t);case`append`:return await _e(e.config,t,e);case`mkdir`:return ve(e.config,t);case`git-init`:return L(e.config);case`exec`:return R(e.config,t);default:{let t=e.type;return`${D.yellow}⚠ Diff not available for task type: ${t}${D.reset}`}}}catch(e){return`${D.red}✗ Error generating diff: ${e instanceof Error?e.message:String(e)}${D.reset}`}}async function ye(e,t){console.log(`${D.blue}═══════════════════════════════════════════════════════${D.reset}`),console.log(`${D.blue} DRY RUN - Preview of changes${D.reset}`),console.log(`${D.blue}═══════════════════════════════════════════════════════${D.reset}`);for(let n of e){console.log(`${D.cyan}▶ Task: ${n.name}${D.reset}`),n.description!=null&&n.description!==``&&console.log(`${D.gray} ${n.description}${D.reset}`);let e=await z(n,t);console.log(e),console.log(`${D.gray}${`─`.repeat(55)}${D.reset}`)}console.log(`${D.blue}═══════════════════════════════════════════════════════${D.reset}`),console.log(`${D.yellow} No changes were applied (dry-run mode)${D.reset}`),console.log(`${D.blue}═══════════════════════════════════════════════════════${D.reset}`)}const B=new Map,V={},H=new Map;function U(t){if(t.name==null||t.name===``)throw TypeError(`Plugin name is required`);if(!Array.isArray(t.taskTypes)||t.taskTypes.length===0)throw TypeError(`Plugin ${t.name} must define at least one task type`);if(typeof t.execute!=`function`)throw TypeError(`Plugin ${t.name} must provide an execute function`);if(B.has(t.name))throw TypeError(`Plugin ${t.name} is already registered`);for(let e of t.taskTypes)if(H.has(e)){let t=H.get(e);throw TypeError(`Task type "${e}" is already registered by plugin "${t}"`)}B.set(t.name,t);for(let e of t.taskTypes)H.set(e,t.name);e.i(`✓ Registered plugin: ${t.name}${t.version==null?``:` v${t.version}`}`,`info`)}function be(e){let t=B.get(e);if(t!=null){for(let e of t.taskTypes)H.delete(e);B.delete(e)}}function xe(e){return B.get(e)}function W(e){let t=H.get(e);if(t!=null)return B.get(t)}function G(e){return H.has(e)}function Se(){return Array.from(B.keys())}function Ce(){B.clear(),H.clear()}function we(e){e.beforeAll!=null&&(V.beforeAll=e.beforeAll),e.afterAll!=null&&(V.afterAll=e.afterAll),e.beforeTask!=null&&(V.beforeTask=e.beforeTask),e.afterTask!=null&&(V.afterTask=e.afterTask),e.onError!=null&&(V.onError=e.onError)}async function K(t,...n){let r=V[t];if(r!=null)try{t===`beforeAll`||t===`afterAll`?await r(n[0]):(t===`beforeTask`||t===`afterTask`||t===`onError`)&&await r(n[0],n[1])}catch(n){e.i(`Error in ${t} hook: ${n instanceof Error?n.message:String(n)}`,`error`)}}async function q(e,t,n){let r=W(e.type);if(r==null)throw TypeError(`No plugin found for task type: ${e.type}`);await r.execute(e,t,n)}async function Te(e,t){let n=W(e.type);if(!(n==null||n.getDiff==null))return n.getDiff(e,t)}function Ee(e){let t=W(e.type);return t==null?[`No plugin found for task type: ${e.type}`]:t.validate==null?[]:t.validate(e)}function De(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}}}async function J(t,n,r){if(t===void 0)return;if(typeof t!=`object`||!t||Array.isArray(t))return typeof t==`string`&&r&&/\{\{\w+\}\}/u.test(t)?e.r(t,r):t;let i=t;if(i.type===`conditional`){if(!r)return;if(typeof i.condition!=`string`){e.i(`Prompt "${n}": conditional default must have a string condition`,`error`);return}try{let{evaluateCondition:t}=await Promise.resolve().then(()=>require(`./utils-eYfsIViF.cjs`)),n=t(i.condition,r)?i.ifTrue:i.ifFalse;return typeof n==`string`&&/\{\{\w+\}\}/u.test(n)&&(n=e.r(n,r)),n}catch(t){e.i(`Prompt "${n}": failed to evaluate conditional default: ${t instanceof Error?t.message:`Unknown error`}`,`warn`);return}}if(i.type===`exec`){let t=i.value;if(typeof t!=`string`){e.i(`Prompt "${n}": exec default value must have a string command`,`error`);return}try{let e=(0,a.execSync)(t,{encoding:`utf-8`,stdio:[`pipe`,`pipe`,`pipe`],timeout:1e4}).trim();if(e.startsWith(`{`)||e.startsWith(`[`))try{return JSON.parse(e)}catch{return e}if(/^-?\d+(?:\.\d+)?$/u.test(e)){let t=Number.parseFloat(e);if(!Number.isNaN(t))return t}return e===`true`||e===`false`?e===`true`:e}catch(t){e.i(`Prompt "${n}": failed to execute default value command: ${t instanceof Error?t.message:`Unknown error`}`,`warn`);return}}else if(i.type===`static`)return i.value;else if(i.type!==void 0){e.i(`Prompt "${n}": unknown default value type "${i.type}". Expected "static", "exec", or "conditional".`,`error`);return}return t}async function Y(t,n=new Map,r={}){let i={};if(t.length===0)return i;for(let a of t){if(a.$templateEnabled!=null&&!await e.l(a.$templateEnabled,{...r,...i}))continue;let t={...r,...i};if(await e.l(a.enabled,t))try{let r,s=n.get(a.id);switch(a.default!==void 0&&(s=await J(a.default,a.id,t)),a.type){case`input`:{let t={message:a.message};if(s!==void 0&&(t.default=String(s)),a.required!==void 0&&(t.required=a.required),r=await(0,o.input)(t),a.required&&(r==null||typeof r==`string`&&r.trim()===``))throw e.i(`${a.message} is required`,`error`),d.required(a.id);break}case`password`:if(r=await(0,o.password)({message:a.message,mask:`*`}),a.required&&(r==null||typeof r==`string`&&r.trim()===``))throw e.i(`${a.message} is required`,`error`),d.required(a.id);break;case`number`:{let t={message:a.message};if(s!==void 0&&(t.default=Number(s)),a.required!==void 0&&(t.required=a.required),a.min!==void 0&&(t.min=a.min),a.max!==void 0&&(t.max=a.max),r=await(0,o.number)(t),a.required&&r==null)throw e.i(`${a.message} is required`,`error`),d.required(a.id);break}case`select`:{let e={message:a.message,choices:a.choices.map(e=>({name:e.name,value:e.value}))};s!==void 0&&(e.default=s),r=await(0,o.select)(e);break}case`confirm`:{let e=s===void 0?!1:!!s;r=await(0,o.confirm)({message:a.message,default:e});break}default:throw e.i(`Unknown prompt type: ${a.type}`,`error`),d.unknownType(a.type)}i[a.id]=r}catch(t){throw t instanceof Error&&e.i(`Failed to collect prompt "${a.id}": ${t.message}`,`error`),t}}return i}async function Oe(e){let t=new Map,n=e.map(async e=>{if(e.default!==void 0){let n=await J(e.default,e.id);n!==void 0&&t.set(e.id,n)}});return await Promise.all(n),t}function ke(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 Ae=(0,i.promisify)(t.default.appendFile),je=(0,i.promisify)(t.default.readFile),Me=(0,i.promisify)(t.default.stat);async function Ne(t,i,a){if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,i)){e.i(`Condition not met, skipping append task`,`info`);return}let o=n.default.join(r.default.cwd(),t.file),s={};t.content==null?t.template!=null&&(s.template=t.template):s.template=t.content,t.templateFile!=null&&(s.templateFile=t.templateFile);let c=w(s);if(!c.isValid)throw c.error?.includes(`cannot have both`)?f.templateHasBothTemplateAndFile():f.templateMissingTemplateOrFile();let l=await T(s,i,a),u=!1,d=!1;try{await Me(o),u=!0;let e=await je(o,`utf-8`);e.length>0&&!e.endsWith(`
23
- `)&&(d=t.newline!==!1)}catch{}u&&d?await Ae(o,`\n${l}`):await Ae(o,l),e.i(`Appended content to ${t.file}`,`success`)}const Pe={name:`append`,version:`1.0.0`,taskTypes:[`append`],execute:async(e,t,n)=>{n.dryRun||await Ne(e.config,t,e)}},Fe=(0,i.promisify)(t.default.copyFile),Ie=(0,i.promisify)(t.default.stat),Le=(0,i.promisify)(t.default.mkdir),Re=(0,i.promisify)(t.default.readdir);async function ze(e,t){await Le(t,{recursive:!0});let r=await Re(e,{withFileTypes:!0});await Promise.all(r.map(async r=>{let i=n.default.join(e,r.name),a=n.default.join(t,r.name);r.isDirectory()?await ze(i,a):await Fe(i,a)}))}async function Be(t,i){if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,i)){e.i(`Condition not met, skipping copy task`,`info`);return}let a=n.default.join(r.default.cwd(),t.from),o=n.default.join(r.default.cwd(),t.to),s;try{s=await Ie(a)}catch{e.i(`Source path does not exist: ${a}`,`warn`);return}await Le(n.default.dirname(o),{recursive:!0}),s.isDirectory()?(await ze(a,o),e.i(`Copied directory ${t.from} to ${t.to}`,`success`)):(await Fe(a,o),e.i(`Copied file ${t.from} to ${t.to}`,`success`))}const Ve={name:`copy`,version:`1.0.0`,taskTypes:[`copy`],execute:async(e,t,n)=>{n.dryRun||await Be(e.config,t)}},He=(0,i.promisify)(t.default.writeFile);async function Ue(i,a,o){if(i.condition!=null&&i.condition!==``&&!e.t(i.condition,a)){e.i(`Condition not met, skipping create task`,`info`);return}let s=n.default.join(r.default.cwd(),i.file);if(t.default.existsSync(s)){e.i(`File already exists, skipping: ${i.file}`,`info`);return}let c=w(i);if(!c.isValid)throw c.error?.includes(`cannot have both`)?f.createHasBothTemplateAndFile():f.createMissingTemplateOrFile();let l=await T(i,a,o),u=n.default.dirname(s);t.default.existsSync(u)||t.default.mkdirSync(u,{recursive:!0}),await He(s,l),e.i(`Created file: ${i.file}`,`success`)}const We={name:`create`,version:`1.0.0`,taskTypes:[`create`],execute:async(e,t,n)=>{n.dryRun||await Ue(e.config,t,e)}};async function Ge(i,a){let{paths:o,condition:s}=i;if(s!=null&&s!==``){if(!a){e.i(`Condition specified but no config provided, skipping deletion`,`warn`);return}if(!e.t(s,a)){e.i(`Condition not met, skipping deletion`,`info`);return}}for(let e of o){let i=n.default.join(r.default.cwd(),e);t.default.existsSync(i)&&t.default.rmSync(i,{recursive:!0,force:!0})}}const Ke={name:`delete`,version:`1.0.0`,taskTypes:[`delete`],execute:async(e,t,n)=>{n.dryRun||await Ge(e.config,t)}};async function qe(t,i){if(t.condition!=null&&t.condition!==``){if(!i){e.i(`Condition specified but no config provided, skipping exec`,`warn`);return}if(!e.t(t.condition,i)){e.i(`Condition not met, skipping exec task`,`info`);return}}let o=t.cwd==null?r.default.cwd():n.default.join(r.default.cwd(),t.cwd);(0,a.execSync)(t.command,{cwd:o,stdio:`inherit`})}const Je={name:`exec`,version:`1.0.0`,taskTypes:[`exec`],execute:async(e,t,n)=>{n.dryRun||await qe(e.config,t)}};async function Ye(i,o){if(i.condition!=null&&i.condition!==``){if(!o){e.i(`Condition specified but no config provided, skipping git-init`,`warn`);return}if(!e.t(i.condition,o)){e.i(`Condition not met, skipping git-init task`,`info`);return}}if(i.removeExisting){let e=n.default.join(r.default.cwd(),`.git`);t.default.existsSync(e)&&t.default.rmSync(e,{recursive:!0,force:!0})}if((0,a.execSync)(`git init`,{stdio:`inherit`}),i.initialCommit){let e=i.message??`Initial commit`;(0,a.execSync)(`git add .`,{stdio:`inherit`}),(0,a.execSync)(`git commit -m "${e}"`,{stdio:`inherit`})}}const Xe={name:`git-init`,version:`1.0.0`,taskTypes:[`git-init`],execute:async(e,t,n)=>{n.dryRun||await Ye(e.config,t)}},Ze=(0,i.promisify)(t.default.mkdir);async function Qe(t,i){if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,i)){e.i(`Condition not met, skipping mkdir task`,`info`);return}await Ze(n.default.join(r.default.cwd(),t.path),{recursive:!0}),e.i(`Created directory: ${t.path}`,`success`)}const $e={name:`mkdir`,version:`1.0.0`,taskTypes:[`mkdir`],execute:async(e,t,n)=>{n.dryRun||await Qe(e.config,t)}},et=(0,i.promisify)(t.default.rename),tt=(0,i.promisify)(t.default.stat),nt=(0,i.promisify)(t.default.mkdir);async function rt(t,i){if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,i)){e.i(`Condition not met, skipping move task`,`info`);return}let a=n.default.join(r.default.cwd(),t.from),o=n.default.join(r.default.cwd(),t.to);try{await tt(a)}catch{e.i(`Source path does not exist: ${a}`,`warn`);return}await nt(n.default.dirname(o),{recursive:!0}),await et(a,o),e.i(`Moved ${t.from} to ${t.to}`,`success`)}const it={name:`move`,version:`1.0.0`,taskTypes:[`move`],execute:async(e,t,n)=>{n.dryRun||await rt(e.config,t)}},at=(0,i.promisify)(t.default.readFile),ot=(0,i.promisify)(t.default.writeFile);async function st(t,i){if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,i)){e.i(`Condition not met, skipping regex-replace task`,`info`);return}let a=n.default.join(r.default.cwd(),t.file),{pattern:o}=t,s=t.flags??``,c=t.replacement||``,l=await at(a,`utf-8`),u=new RegExp(o,s);l=l.replace(u,e.r(c,i)),await ot(a,l)}const ct={name:`regex-replace`,version:`1.0.0`,taskTypes:[`regex-replace`],execute:async(e,t,n)=>{n.dryRun||await st(e.config,t)}},lt=(0,i.promisify)(t.default.rename);async function ut(i,a){if(i.condition!=null&&i.condition!==``&&!e.t(i.condition,a)){e.i(`Condition not met, skipping rename task`,`info`);return}let o=n.default.join(r.default.cwd(),e.r(i.from,a)),s=n.default.join(r.default.cwd(),e.r(i.to,a));if(!t.default.existsSync(o)){e.i(`Source path does not exist: ${o}`,`warn`);return}await lt(o,s)}const dt={name:`rename`,version:`1.0.0`,taskTypes:[`rename`],execute:async(e,t,n)=>{n.dryRun||await ut(e.config,t)}},ft=(0,i.promisify)(t.default.readFile),pt=(0,i.promisify)(t.default.writeFile);async function mt(i,a){if(i.condition!=null&&i.condition!==``&&!e.t(i.condition,a)){e.i(`Condition not met, skipping replace-in-file task`,`info`);return}let o=n.default.join(r.default.cwd(),i.file),{replacements:s}=i;if(!t.default.existsSync(o)){e.i(`File not found: ${o}, skipping`,`warn`);return}let c=await ft(o,`utf-8`);for(let{find:t,replace:n}of s){let r=e.r(n,a);c=c.replace(new RegExp(t,`gu`),r)}await pt(o,c)}const ht={name:`replace-in-file`,version:`1.0.0`,taskTypes:[`replace-in-file`],execute:async(e,t,n)=>{n.dryRun||await mt(e.config,t)}},gt=(0,i.promisify)(t.default.readFile),_t=(0,i.promisify)(t.default.writeFile),vt=2;async function yt(t,i){if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,i)){e.i(`Condition not met, skipping update-json task`,`info`);return}let a=n.default.join(r.default.cwd(),t.file),{updates:o}=t,s=await gt(a,`utf-8`),c=JSON.parse(s);function l(t){if(typeof t==`string`)return e.r(t,i);if(Array.isArray(t))return t.map(e=>l(e));if(typeof t==`object`&&t){let e={};for(let[n,r]of Object.entries(t))e[n]=l(r);return e}return t}for(let[t,n]of Object.entries(o)){let r=l(n);t.includes(`.`)?e.s(c,t,r):c[t]=r}await _t(a,`${JSON.stringify(c,null,2)}\n`)}const bt={name:`update-json`,version:`1.0.0`,taskTypes:[`update-json`],execute:async(e,t,n)=>{n.dryRun||await yt(e.config,t)}},xt=(0,i.promisify)(t.default.writeFile);async function St(i,a,o){let{allowCreate:s=!0}=i;if(i.condition!=null&&i.condition!==``&&!e.t(i.condition,a)){e.i(`Condition not met, skipping write task`,`info`);return}let c=n.default.join(r.default.cwd(),i.file);if(!t.default.existsSync(c)){if(s===!1)throw Error(`Write task failed: file does not exist (${i.file})`);e.i(`File not found, creating new file: ${i.file}`,`info`)}let l=w(i);if(!l.isValid)throw l.error?.includes(`cannot have both`)?f.templateHasBothTemplateAndFile():f.templateMissingTemplateOrFile();let u=await T(i,a,o),d=n.default.dirname(c);t.default.existsSync(d)||t.default.mkdirSync(d,{recursive:!0}),await xt(c,u)}const Ct={name:`write`,version:`1.0.0`,taskTypes:[`write`],execute:async(e,t,n)=>{n.dryRun||await St(e.config,t,e)}};function X(){G(`update-json`)||(U(bt),U(Ct),U(We),U(ct),U(ht),U(Ke),U(dt),U(Xe),U(Je),U(it),U(Ve),U(Pe),U($e))}async function wt(t,n,r=!1){if(X(),r){e.i(`[DRY RUN] Would execute: ${t.name}`,`info`);return}if(G(t.type)){await q(t,n,{dryRun:r});return}throw TypeError(`Unknown task type: ${t.type}`)}async function Tt(t,n,i,a,o=!1){try{return e.i(`[${i}/${a}] Running: ${t.name}...`,`info`),await wt(t,n,o),e.i(`✓ ${t.name}`,`success`),!0}catch(n){return e.i(`✗ Failed: ${t.name}`,`error`),n instanceof Error&&(e.i(` Reason: ${n.message}`,`error`),n.stack!=null&&r.default.env.DEBUG!=null&&console.error(n.stack)),(t.required??!0)&&e.i(` This is a required task. Initialization cannot continue.`,`error`),!1}}function Et(t){let n=[],r=new Set,i=new Set,a=new Map(t.map(e=>[e.id,e]));function o(t){if(r.has(t))return;if(i.has(t))throw e.h.forTaskDependency(t);i.add(t);let s=a.get(t);if(!s)throw u.forId(t);if(s.dependencies)for(let e of s.dependencies)o(e);i.delete(t),r.add(t),n.push(s)}for(let e of t)r.has(e.id)||o(e.id);return n}function Dt(e){let t=[];for(let n of e)if(!G(n.type))t.push(`Task "${n.id}" (${n.name}): Unknown task type "${n.type}"`);else if(n.type===`write`){let e=Ot(n);t.push(...e)}return t}function Ot(e){let t=[],n=e.config,r=typeof n.template==`string`?n.template:void 0,i=typeof n.templateFile==`string`?n.templateFile:void 0,a=w({...r!==void 0&&{template:r},...i!==void 0&&{templateFile:i}});return!a.isValid&&a.error!=null&&a.error!==``&&t.push(`Task "${e.id}" (${e.name}): ${a.error}`),(n.file==null||n.file===``)&&t.push(`Task "${e.id}" (${e.name}): Write task requires "file" property to specify the output file path`),t}function kt(t){e.i(`❌ Template validation failed:`,`error`),e.i(``,`error`);for(let n of t)e.i(` • ${n}`,`error`);e.i(``,`error`),e.i(`Please fix these errors before continuing.`,`error`)}function Z(e,t=new Map){let n={};for(let r of e){let e=t.get(r.id);e!==void 0&&(n[r.id]=e)}return n}async function At(t,n,r){if(t==null)return;if(typeof t!=`object`||!t||Array.isArray(t))return t;let i=t;if(i.type===`conditional`){if(!r){e.i(`Variable "${n}": conditional value requires context but none provided`,`warn`);return}if(typeof i.condition!=`string`){e.i(`Variable "${n}": conditional value must have a string condition`,`error`);return}try{let{evaluateCondition:e,interpolateTemplate:t}=await Promise.resolve().then(()=>require(`./utils-eYfsIViF.cjs`)),n=e(i.condition,r)?i.ifTrue:i.ifFalse;return typeof n==`string`&&/\{\{\w+\}\}/u.test(n)&&(n=t(n,r)),n}catch(t){e.i(`Variable "${n}": failed to evaluate conditional value: ${t instanceof Error?t.message:`Unknown error`}`,`warn`);return}}if(i.type===`exec`){let t=i.value;if(typeof t!=`string`){e.i(`Variable "${n}": exec value must have a string command`,`error`);return}try{let e=(0,a.execSync)(t,{encoding:`utf-8`,stdio:[`pipe`,`pipe`,`pipe`],timeout:1e4}).trim();if(e.startsWith(`{`)||e.startsWith(`[`))try{return JSON.parse(e)}catch{return e}if(/^-?\d+(?:\.\d+)?$/u.test(e)){let t=Number.parseFloat(e);if(!Number.isNaN(t))return t}return e===`true`||e===`false`?e===`true`:e}catch(t){e.i(`Variable "${n}": failed to execute command: ${t instanceof Error?t.message:`Unknown error`}`,`warn`);return}}else if(i.type===`static`)return i.value;return t}async function Q(t,n){let r=new Map;for(let i of t){if(i.$templateEnabled!=null){let t={...n};for(let[e,n]of r.entries())t[e]=n;if(!await e.l(i.$templateEnabled,t))continue}let t={...n};for(let[e,n]of r.entries())t[e]=n;let a=await At(i.value,i.id,t);a!==void 0&&r.set(i.id,a)}return r}function jt(e){let t=[],n=new Set;for(let r of e)if(n.has(r.id)&&t.push(`Duplicate variable ID: "${r.id}"`),n.add(r.id),/^[a-zA-Z_$][a-zA-Z0-9_$]*$/u.test(r.id)||t.push(`Variable ID "${r.id}" is invalid. Must be a valid JavaScript identifier (start with letter, underscore, or $, followed by letters, digits, underscores, or $).`),r.value===void 0||r.value===null)t.push(`Variable "${r.id}" must have a value`);else if(typeof r.value==`object`&&!Array.isArray(r.value)&&r.value!==null){let e=r.value;e.type==null||e.type===``?t.push(`Variable "${r.id}": value object must have a "type" field ("static", "exec", or "conditional")`):e.type!==`static`&&e.type!==`exec`&&e.type!==`conditional`&&t.push(`Variable "${r.id}": type must be "static", "exec", or "conditional", got "${e.type}"`),(e.type===`static`||e.type===`exec`)&&(e.value===void 0||e.value===null)&&t.push(`Variable "${r.id}": value config must have a "value" field`),e.type===`exec`&&typeof e.value!=`string`&&t.push(`Variable "${r.id}": exec type must have a string command as value`),e.type===`conditional`&&((e.condition===void 0||e.condition===null||e.condition===``||typeof e.condition!=`string`)&&t.push(`Variable "${r.id}": conditional type must have a "condition" field with a string expression`),e.ifTrue===void 0&&t.push(`Variable "${r.id}": conditional type must have an "ifTrue" field`),e.ifFalse===void 0&&t.push(`Variable "${r.id}": conditional type must have an "ifFalse" field`))}return t}async function Mt(t,n){let i=s();if(!await e.l(n.templateEnabled,i,{lazy:!0})){e.i(`⊘ Template is disabled - skipping all execution`,`info`);return}X(),e.i(`Validating task configurations...`,`info`);let a=Dt(t);a.length>0&&(kt(a),r.default.exit(1)),e.i(`✓ All tasks validated successfully`,`success`);let o=t.filter(t=>e.c(t.enabled,s(),{lazy:!0}));e.i(`Resolving task dependencies...`,`info`);let c=Et(o);e.i(`Welcome! Let's execute your tasks.`,`info`),n.dryRun&&e.i(`🔍 DRY RUN MODE - No changes will be made`,`warn`),e.i(`This will execute your project tasks based on the defined configuration.`,`info`);let l=i,u=n.globalVariables??[],d=[],f=[...u];for(let e of c)if(e.variables&&e.variables.length>0)for(let t of e.variables)d.push(t),f.push(t);if(f.length>0){let t=jt(f);t.length>0&&(e.i(`❌ Variable validation errors:`,`error`),t.forEach(t=>e.i(` - ${t}`,`error`)),r.default.exit(1)),e.i(`Resolving variable values...`,`info`);let n=Z(f,await Q(f,l));Object.assign(l,n),Object.keys(n).length>0&&e.i(`✓ Resolved ${Object.keys(n).length} variable(s)`,`success`)}let p=n.globalPrompts??[],m=[],h=[...p];for(let e of c)if(e.prompts&&e.prompts.length>0)for(let t of e.prompts)m.push(t),h.push(t);if(h.length>0){let t=ke(h);t.length>0&&(e.i(`❌ Prompt validation errors:`,`error`),t.forEach(t=>e.i(` - ${t}`,`error`)),r.default.exit(1)),e.i(`Resolving prompt default values...`,`info`);let n=await Oe(h),i={};if(p.length>0&&(e.i(`📋 Top-level prompts (available to all tasks):`,`info`),i=await Y(p,n,l),Object.assign(l,i)),m.length>0){p.length>0&&e.i(`📋 Task-specific prompts:`,`info`);let t=await Y(m,n,l);Object.assign(l,t)}}if(f.length>0){let t=f.filter(e=>typeof e.value==`object`&&e.value!==null&&!Array.isArray(e.value)?e.value.type===`conditional`:!1);if(t.length>0){e.i(`Re-resolving conditional variables with prompt values...`,`info`);let n=Z(t,await Q(t,l));Object.assign(l,n),Object.keys(n).length>0&&e.i(`✓ Resolved ${Object.keys(n).length} conditional variable(s)`,`success`)}}if(!await e.l(n.templateEnabled,l)){e.i(`⊘ Template is disabled after variable resolution - skipping all execution`,`info`);return}let g=[];for(let t of c)t.$templateEnabled!=null&&!await e.l(t.$templateEnabled,l)||await e.l(t.enabled,l)&&g.push(t);if(e.i(`${g.length} of ${c.length} task(s) enabled for execution`,`info`),n.dryRun){await ye(g,l),e.i(`🔍 Dry run completed - no changes were made`,`info`),e.i(`Run without --dry-run to apply changes`,`info`);return}e.i(`Starting task execution...`,`info`),await K(`beforeAll`,l);let _=g.length,v=0,y=0,b=[];for(let t=0;t<g.length;t++){let r=g[t];if(r!=null)if(await K(`beforeTask`,r,l),await Tt(r,l,t+1,_,n.dryRun))v++,b.push(r.id),await K(`afterTask`,r,l);else if(r.required??!0){y++,await K(`onError`,Error(`Task ${r.name} failed`),r);break}else e.i(`⚠️ Non-critical task failed, continuing...`,`warn`),await K(`onError`,Error(`Task ${r.name} failed`),r)}y>0&&(e.i(`❌ Task execution failed with ${y} critical error(s)`,`error`),e.i(`✓ Completed: ${v}/${_} tasks`,`info`),r.default.exit(1)),await K(`afterAll`,l),e.i(`✅ All tasks completed successfully!`,`success`),e.i(`✓ Completed: ${v}/${_} tasks`,`success`)}const Nt=r.default.argv.includes(`--dry-run`),$=r.default.argv.includes(`--force`);async function Pt(t){try{let n=t||[];n.length===0&&(e.i(`⚠️ No tasks defined. Use --tasks-file to specify tasks or call runWithTasks() programmatically.`,`warn`),e.i(`Example: scaffoldfy --tasks-file ./tasks.json`,`info`),r.default.exit(1)),await Mt(n,{dryRun:Nt,force:$,tasksFilePath:void 0})}catch(t){e.i(`❌ Task execution failed`,`error`),t instanceof Error?(e.i(`Error: ${t.message}`,`error`),r.default.env.DEBUG!=null&&console.error(t.stack)):console.error(t),r.default.exit(1)}}async function Ft(t,n){try{await Mt(t,{dryRun:n?.dryRun??Nt,force:n?.force??$,tasksFilePath:n?.tasksFilePath??void 0,...n?.globalVariables!=null&&{globalVariables:n.globalVariables},...n?.globalPrompts!=null&&{globalPrompts:n.globalPrompts},...n?.templateEnabled!=null&&{templateEnabled:n.templateEnabled}})}catch(t){e.i(`❌ Task execution failed`,`error`),t instanceof Error?(e.i(`Error: ${t.message}`,`error`),r.default.env.DEBUG!=null&&console.error(t.stack)):console.error(t),r.default.exit(1)}}Object.defineProperty(exports,`A`,{enumerable:!0,get:function(){return F}}),Object.defineProperty(exports,`B`,{enumerable:!0,get:function(){return S}}),Object.defineProperty(exports,`C`,{enumerable:!0,get:function(){return Se}}),Object.defineProperty(exports,`D`,{enumerable:!0,get:function(){return Ee}}),Object.defineProperty(exports,`E`,{enumerable:!0,get:function(){return be}}),Object.defineProperty(exports,`F`,{enumerable:!0,get:function(){return P}}),Object.defineProperty(exports,`G`,{enumerable:!0,get:function(){return ce}}),Object.defineProperty(exports,`H`,{enumerable:!0,get:function(){return T}}),Object.defineProperty(exports,`I`,{enumerable:!0,get:function(){return z}}),Object.defineProperty(exports,`J`,{enumerable:!0,get:function(){return ee}}),Object.defineProperty(exports,`K`,{enumerable:!0,get:function(){return x}}),Object.defineProperty(exports,`L`,{enumerable:!0,get:function(){return A}}),Object.defineProperty(exports,`M`,{enumerable:!0,get:function(){return L}}),Object.defineProperty(exports,`N`,{enumerable:!0,get:function(){return N}}),Object.defineProperty(exports,`O`,{enumerable:!0,get:function(){return ye}}),Object.defineProperty(exports,`P`,{enumerable:!0,get:function(){return I}}),Object.defineProperty(exports,`R`,{enumerable:!0,get:function(){return j}}),Object.defineProperty(exports,`S`,{enumerable:!0,get:function(){return G}}),Object.defineProperty(exports,`T`,{enumerable:!0,get:function(){return U}}),Object.defineProperty(exports,`U`,{enumerable:!0,get:function(){return ue}}),Object.defineProperty(exports,`V`,{enumerable:!0,get:function(){return C}}),Object.defineProperty(exports,`W`,{enumerable:!0,get:function(){return w}}),Object.defineProperty(exports,`Y`,{enumerable:!0,get:function(){return ie}}),Object.defineProperty(exports,`_`,{enumerable:!0,get:function(){return De}}),Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return At}}),Object.defineProperty(exports,`b`,{enumerable:!0,get:function(){return W}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return wt}}),Object.defineProperty(exports,`d`,{enumerable:!0,get:function(){return ke}}),Object.defineProperty(exports,`f`,{enumerable:!0,get:function(){return Oe}}),Object.defineProperty(exports,`g`,{enumerable:!0,get:function(){return Ce}}),Object.defineProperty(exports,`h`,{enumerable:!0,get:function(){return K}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return Q}}),Object.defineProperty(exports,`j`,{enumerable:!0,get:function(){return R}}),Object.defineProperty(exports,`k`,{enumerable:!0,get:function(){return M}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return X}}),Object.defineProperty(exports,`m`,{enumerable:!0,get:function(){return J}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return Ft}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return Z}}),Object.defineProperty(exports,`p`,{enumerable:!0,get:function(){return Y}}),Object.defineProperty(exports,`q`,{enumerable:!0,get:function(){return le}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return jt}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return Et}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return Pt}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return Tt}}),Object.defineProperty(exports,`v`,{enumerable:!0,get:function(){return q}}),Object.defineProperty(exports,`w`,{enumerable:!0,get:function(){return we}}),Object.defineProperty(exports,`x`,{enumerable:!0,get:function(){return Te}}),Object.defineProperty(exports,`y`,{enumerable:!0,get:function(){return xe}}),Object.defineProperty(exports,`z`,{enumerable:!0,get:function(){return de}});
@@ -1,23 +0,0 @@
1
- import{c as e,d as t,f as n,g as r,h as i,i as a,l as o,m as s,p as c,r as l,s as u,t as d,u as f}from"./utils-DfD7I1u2.js";import p from"node:path";import m from"node:fs";import h from"node:process";import{promisify as g}from"node:util";import{execSync as _}from"node:child_process";import{confirm as v,input as y,number as b,password as ee,select as te}from"@inquirer/prompts";function ne(){return{}}var x=class e extends r{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)}},S=class e extends r{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`)}},re=class e extends r{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)}},C=class e extends r{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`)}},w=class e extends r{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`)}};const ie=g(m.readFile),ae={template:[[`template`,`templateFile`]]};function T(e){if(e==null||e===``)return`current template`;if(E(e))return e;let t=h.cwd();return e.startsWith(t)?p.relative(t,e):e}function E(e){try{let t=new URL(e);return t.protocol===`http:`||t.protocol===`https:`}catch{return!1}}function oe(e,t){if(E(e))return e;if(t==null||t===``)return p.isAbsolute(e)?e:p.resolve(h.cwd(),e);if(E(t))try{let n=new URL(`.`,t);return new URL(e,n).href}catch{throw s.forRemoteTemplate(e,t)}let n=p.dirname(t);return p.isAbsolute(e)?e:p.resolve(n,e)}async function se(e){if(E(e))return D(e);if(!m.existsSync(e))throw n.forPath(e);return ie(e,`utf-8`)}async function D(e){try{let n=await fetch(e);if(!n.ok)throw t.forUrl(e,n.status,n.statusText);return await n.text()}catch(n){throw n instanceof Error&&n.message.includes(`Failed to fetch`)?n:t.forUrl(e,n instanceof Error?n:void 0)}}const O=new Map;async function k(e,t=new Set){let r=E(e),a;if(a=r||p.isAbsolute(e)?e:p.resolve(h.cwd(),e),O.has(a))return O.get(a);if(t.has(a))throw i.forTemplateInheritance(t,a);t.add(a);let o;if(r)o=await D(a);else{if(!m.existsSync(a))throw n.forPath(a);o=await ie(a,`utf-8`)}let s;try{s=JSON.parse(o)}catch(e){throw c.forFile(a,e instanceof Error?e:Error(String(e)))}if(s.name==null||s.name.trim()===``)throw f.missingName(a);if(!/^[a-z\d]+(?:-[a-z\d]+)*$/u.test(s.name))throw f.invalidNameFormat(a,s.name);if(s.tasks!==void 0&&!Array.isArray(s.tasks))throw f.tasksNotArray(a);s.tasks===void 0&&(s.tasks=[]);for(let e of s.tasks)e.$sourceUrl=a;return O.set(a,s),s}async function A(e,t,n=new Set){let r=E(e),a;if(a=r||p.isAbsolute(e)?e:t==null?p.resolve(h.cwd(),e):E(t)?new URL(e,t).href:p.resolve(t,e),n.has(a))throw i.forTemplateInheritance(n,a);n.add(a);let o=await k(a);if(o.extends==null||o.extends===``)return o;let s=E(a)?new URL(`.`,a).href:p.dirname(a),c=Array.isArray(o.extends)?o.extends:[o.extends],l=[];for(let e of c){let t=await A(e,s,n);l.push(t)}return de([...l,o])}function ce(e,t,n){let r=new Map;for(let t of e){if(r.has(t.id))throw x.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 x.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 x.forId(e.id,`prompt`,r.get(e.id));r.set(e.id,`prompt`)}}function le(e,t){if((t.override??`merge`)===`replace`){a(` → Variable "${t.id}" using 'replace' strategy`,`info`);let{override:e,...n}=t;return n}a(` → Variable "${t.id}" merged (value replaced)`,`info`);let n={...e,...t};return delete n.override,n}function ue(e,t){if((t.override??`merge`)===`replace`){a(` → Prompt "${t.id}" using 'replace' strategy`,`info`);let{override:e,...n}=t;return n}a(` → Prompt "${t.id}" merged`,`info`);let n={...e,...t};return delete n.override,n}function de(e){if(e.length===0)return{name:`Empty Template`,tasks:[]};if(e.length===1){let t=e[0];return ce(t.tasks??[],t.variables,t.prompts),t}let t=new Map,n=new Map,r=new Map,i={};for(let o of e){if(o.enabled!=null&&(i[o.name]=o.enabled),o.enabled===!1){a(`⊘ Skipping disabled template "${o.name}" - its tasks, prompts, and variables will not be included`,`info`);continue}if(o.prompts!=null)for(let e of o.prompts)if(r.has(e.id)){if(e.override==null)throw S.forPrompt(e.id);let t=ue(r.get(e.id),e);o.enabled!=null&&(t.$templateEnabled=o.enabled),r.set(e.id,t)}else{let t={...e};o.enabled!=null&&(t.$templateEnabled=o.enabled),r.set(e.id,t)}if(o.variables!=null)for(let e of o.variables)if(n.has(e.id)){if(e.override==null)throw S.forVariable(e.id);let t=le(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 S.forTask(e.id,T(n.$sourceUrl),T(e.$sourceUrl))}let n=me(t.get(e.id),e);o.enabled!=null&&(n.$templateEnabled=o.enabled),t.set(e.id,n)}else{let n={...e};o.enabled!=null&&(n.$templateEnabled=o.enabled),t.set(e.id,n)}}let o=Array.from(t.values()),s=r.size>0?Array.from(r.values()):void 0,c=n.size>0?Array.from(n.values()):void 0;ce(o,c,s);let l=e[e.length-1],u={name:l.name,tasks:o};return l.description!=null&&(u.description=l.description),l.dependencies!=null&&(u.dependencies=l.dependencies),l.enabled!=null&&(u.enabled=l.enabled),s!=null&&(u.prompts=s),c!=null&&(u.variables=c),u}function fe(e,t){let n=ae[e];if(!n)return null;for(let e of n){let n=e.filter(e=>e in t&&t[e]!=null);if(n.length>1)return n}return null}function pe(e,t,n){let r={...e},i=ae[n]??[];for(let[e,n]of Object.entries(t)){for(let t of i)if(t.includes(e)){for(let n of t)n!==e&&delete r[n];break}r[e]=n}return r}function me(e,t){if((t.override??`merge`)===`replace`){a(` → Task "${t.id}" using 'replace' strategy - completely replacing base task`,`info`),a(` Base: ${T(e.$sourceUrl)}`,`info`),a(` Override: ${T(t.$sourceUrl)}`,`info`);let{override:n,...r}=t;return r}a(` → Merging task "${t.id}"`,`info`),a(` Base: ${T(e.$sourceUrl)}`,`info`),a(` Override: ${T(t.$sourceUrl)}`,`info`);let n;if(typeof e.config==`object`&&e.config!==null&&typeof t.config==`object`&&t.config!==null){n=pe(e.config,t.config,t.type);let r=fe(t.type,n);r!==null&&r.length>0&&(a(` ⚠️ Warning: Conflicting config fields detected: ${r.join(`, `)}`,`warn`),a(` Please use override: "replace" or specify only one of these fields`,`warn`))}else n=t.config??e.config;let r=e.prompts?[...e.prompts]:void 0;if(t.prompts&&t.prompts.length>0)if(!r)r=[...t.prompts];else{let e=new Map(r.map(e=>[e.id,e]));for(let n of t.prompts)e.set(n.id,n);r=Array.from(e.values())}let i=e.variables?[...e.variables]:void 0;if(t.variables&&t.variables.length>0)if(!i)i=[...t.variables];else{let e=new Map(i.map(e=>[e.id,e]));for(let n of t.variables)e.set(n.id,n);i=Array.from(e.values())}let o=[...e.dependencies??[],...t.dependencies??[]],s=o.length>0?[...new Set(o)]:void 0,c=t.$sourceUrl??e.$sourceUrl,l={...e,...t,config:n,...r!=null&&{prompts:r},...i!=null&&{variables:i},...s!=null&&{dependencies:s},...c!=null&&{$sourceUrl:c}};return delete l.override,l}function he(){O.clear()}async function ge(e){a(`Loading tasks from ${e}...`,`info`);let t=await A(e);a(`Loaded ${t.tasks?.length??0} task(s)`,`info`),t.extends!=null&&t.extends!==``&&a(`Extended from: ${(Array.isArray(t.extends)?t.extends:[t.extends]).join(`, `)}`,`info`),t.prompts!=null&&t.prompts.length>0&&a(`Found ${t.prompts.length} top-level prompt(s)`,`info`),t.variables!=null&&t.variables.length>0&&a(`Found ${t.variables.length} top-level variable(s)`,`info`);let n={tasks:t.tasks??[]};return t.prompts!=null&&(n.prompts=t.prompts),t.variables!=null&&(n.variables=t.variables),t.enabled!=null&&(n.enabled=t.enabled),n}function j(e){return e.template!=null&&e.template!==``}function M(e){return e.templateFile!=null&&e.templateFile!==``}function N(e){return e.endsWith(`.hbs`)}function P(e){let t=j(e),n=M(e);return!t&&!n?{isValid:!1,hasInlineTemplate:t,hasTemplateFile:n,error:`Template configuration requires either "template" (inline) or "templateFile" (file path) to be specified`}:t&&n?{isValid:!1,hasInlineTemplate:t,hasTemplateFile:n,error:`Template configuration cannot have both "template" and "templateFile" specified. Use one or the other.`}:{isValid:!0,hasInlineTemplate:t,hasTemplateFile:n}}async function F(e,t,n,r={}){let{enableHandlebars:i=!0,sourceUrl:a=n?.$sourceUrl}=r,o=j(e),s=M(e);if(o)return l(e.template,t);if(s){let n=e.templateFile,r=i&&N(n),o=await se(oe(n,a));return r?(await import(`handlebars`)).default.compile(o)(t):l(o,t)}throw Error(`No template content available`)}function I(e){return j(e)?`inline template`:M(e)?`template file: ${e.templateFile}`:`no template source`}const L=g(m.readFile),R={reset:`\x1B[0m`,red:`\x1B[31m`,green:`\x1B[32m`,yellow:`\x1B[33m`,blue:`\x1B[34m`,cyan:`\x1B[36m`,gray:`\x1B[90m`};function z(e,t){switch(t){case`add`:return`${R.green}+ ${e}${R.reset}`;case`remove`:return`${R.red}- ${e}${R.reset}`;case`context`:return`${R.gray} ${e}${R.reset}`;default:return e}}function B(e,t){let n=e.split(`
2
- `),r=t.split(`
3
- `),i=[],a=Math.max(n.length,r.length);for(let e=0;e<a;e++){let t=n[e],a=r[e];t===a?t!==void 0&&i.push(z(t,`context`)):(t!==void 0&&i.push(z(t,`remove`)),a!==void 0&&i.push(z(a,`add`)))}return i}async function _e(e,t){if(e.condition!=null&&e.condition!==``&&!d(e.condition,t))return`${R.yellow}⊘ Condition not met - task would be skipped${R.reset}`;let n=p.join(h.cwd(),e.file);if(!m.existsSync(n))return`${R.red}✗ File not found: ${e.file}${R.reset}`;try{let r=await L(n,`utf-8`),i=JSON.parse(r),a={...i};function o(e){if(typeof e==`string`)return l(e,t);if(Array.isArray(e))return e.map(e=>o(e));if(typeof e==`object`&&e){let t={};for(let[n,r]of Object.entries(e))t[n]=o(r);return t}return e}for(let[t,n]of Object.entries(e.updates)){let e=o(n);t.includes(`.`)?u(i,t,e):i[t]=e}let s=JSON.stringify(a,null,2),c=JSON.stringify(i,null,2);if(s===c)return`${R.cyan}→ No changes${R.reset}`;let d=B(s,c);return`${R.blue}File: ${e.file}${R.reset}\n${d.join(`
4
- `)}`}catch(e){return`${R.red}✗ Error: ${e instanceof Error?e.message:String(e)}${R.reset}`}}async function ve(e,t){if(e.condition!=null&&e.condition!==``&&!d(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=p.join(h.cwd(),e.file),r=l(e.template,t);if(!m.existsSync(n)){let t=r.split(`
5
- `).slice(0,10).join(`
6
- `),n=r.split(`
7
- `).length>10;return`${R.blue}File: ${e.file}${R.reset}\n${R.green}+ New file would be created${R.reset}\n${R.gray}Content preview:${R.reset}\n${t}${n?`
8
- ...`:``}`}try{let t=await L(n,`utf-8`);if(t===r)return`${R.cyan}→ No changes${R.reset}`;let i=B(t,r);return`${R.blue}File: ${e.file}${R.reset}\n${i.join(`
9
- `)}`}catch(e){return`${R.red}✗ Error: ${e instanceof Error?e.message:String(e)}${R.reset}`}}async function ye(e,t,n){if(e.condition!=null&&e.condition!==``&&!d(e.condition,t))return`${R.yellow}⊘ Condition not met - task would be skipped${R.reset}`;let r=p.join(h.cwd(),e.file);if(m.existsSync(r))return`${R.cyan}→ File already exists, would be skipped: ${e.file}${R.reset}`;try{if(j(e)){let r=await F(e,t,n),i=r.split(`
10
- `).slice(0,10).join(`
11
- `),a=r.split(`
12
- `).length>10;return`${R.blue}File: ${e.file}${R.reset}\n${R.green}+ New file would be created${R.reset}\n${R.gray}Content preview:${R.reset}\n${i}${a?`
13
- ...`:``}`}let r=I(e);return`${R.blue}File: ${e.file}${R.reset}\n${R.green}+ New file would be created from ${r}${R.reset}`}catch(e){return`${R.red}✗ Error: ${e instanceof Error?e.message:String(e)}${R.reset}`}}async function be(e,t){if(e.condition!=null&&e.condition!==``&&!d(e.condition,t))return`${R.yellow}⊘ Condition not met - task would be skipped${R.reset}`;let n=p.join(h.cwd(),e.file);if(!m.existsSync(n))return`${R.red}✗ File not found: ${e.file}${R.reset}`;try{let r=await L(n,`utf-8`),i=new RegExp(e.pattern,e.flags??`g`),a=l(e.replacement,t),o=r.replace(i,a);if(r===o)return`${R.cyan}→ No matches found${R.reset}`;let s=B(r,o);return`${R.blue}File: ${e.file}${R.reset}\n${s.join(`
14
- `)}`}catch(e){return`${R.red}✗ Error: ${e instanceof Error?e.message:String(e)}${R.reset}`}}async function xe(e,t){if(e.condition!=null&&e.condition!==``&&!d(e.condition,t))return`${R.yellow}⊘ Condition not met - task would be skipped${R.reset}`;let n=p.join(h.cwd(),e.file);if(!m.existsSync(n))return`${R.red}✗ File not found: ${e.file}${R.reset}`;try{let r=await L(n,`utf-8`),i=r;for(let{find:n,replace:i}of e.replacements){let e=l(n,t),a=l(i,t);r=r.replace(e,a)}if(i===r)return`${R.cyan}→ No changes${R.reset}`;let a=B(i,r);return`${R.blue}File: ${e.file}${R.reset}\n${a.join(`
15
- `)}`}catch(e){return`${R.red}✗ Error: ${e instanceof Error?e.message:String(e)}${R.reset}`}}function Se(e,t){if(e.condition!=null&&e.condition!==``&&!d(e.condition,t))return`${R.yellow}⊘ Condition not met - task would be skipped${R.reset}`;let n=e.paths.map(e=>l(e,t)).filter(e=>m.existsSync(p.join(h.cwd(),e)));return n.length===0?`${R.cyan}→ No files/directories to delete${R.reset}`:`${R.red}Would delete:${R.reset}\n${n.map(e=>`${R.red} - ${e}${R.reset}`).join(`
16
- `)}`}function Ce(e,t){if(e.condition!=null&&e.condition!==``&&!d(e.condition,t))return`${R.yellow}⊘ Condition not met - task would be skipped${R.reset}`;let n=l(e.from,t),r=l(e.to,t),i=p.join(h.cwd(),n),a=p.join(h.cwd(),r);return m.existsSync(i)?m.existsSync(a)?`${R.yellow}⚠ Destination already exists: ${r}${R.reset}\n${R.cyan}Would rename: ${n} → ${r}${R.reset}`:`${R.cyan}Would rename: ${n} → ${r}${R.reset}`:`${R.red}✗ Source not found: ${n}${R.reset}`}function we(e){if(e.condition!=null&&e.condition!==``)return`${R.yellow}⊘ Condition check skipped in dry-run${R.reset}`;let t=p.join(h.cwd(),`.git`),n=m.existsSync(t),r=[];if(e.removeExisting&&n&&r.push(`${R.red}Would remove existing .git directory${R.reset}`),r.push(`${R.green}Would initialize git repository${R.reset}`),e.initialCommit){let t=e.message??`Initial commit`;r.push(`${R.green}Would create initial commit: "${t}"${R.reset}`)}return r.join(`
17
- `)}function Te(e,t){if(e.condition!=null&&e.condition!==``&&!d(e.condition,t))return`${R.yellow}⊘ Condition not met - task would be skipped${R.reset}`;let n=l(e.command,t),r=e.cwd==null?h.cwd():l(e.cwd,t);return`${R.yellow}Would execute:${R.reset}\n${R.cyan} Command: ${n}${R.reset}\n${R.cyan} Working directory: ${r}${R.reset}`}function Ee(e,t){if(e.condition!=null&&e.condition!==``&&!d(e.condition,t))return`${R.yellow}⊘ Condition not met - task would be skipped${R.reset}`;let n=l(e.from,t),r=l(e.to,t),i=p.join(h.cwd(),n),a=p.join(h.cwd(),r);return m.existsSync(i)?m.existsSync(a)?`${R.yellow}⚠ Destination already exists: ${r}${R.reset}\n${R.cyan}Would move: ${n} → ${r}${R.reset}`:`${R.cyan}Would move: ${n} → ${r}${R.reset}`:`${R.red}✗ Source not found: ${n}${R.reset}`}function De(e,t){if(e.condition!=null&&e.condition!==``&&!d(e.condition,t))return`${R.yellow}⊘ Condition not met - task would be skipped${R.reset}`;let n=l(e.from,t),r=l(e.to,t),i=p.join(h.cwd(),n),a=p.join(h.cwd(),r);if(!m.existsSync(i))return`${R.red}✗ Source not found: ${n}${R.reset}`;let o=m.statSync(i).isDirectory()?`directory`:`file`;return m.existsSync(a)?`${R.yellow}⚠ Destination already exists: ${r}${R.reset}\n${R.cyan}Would copy ${o}: ${n} → ${r}${R.reset}`:`${R.cyan}Would copy ${o}: ${n} → ${r}${R.reset}`}async function Oe(e,t,n){if(e.condition!=null&&e.condition!==``&&!d(e.condition,t))return`${R.yellow}⊘ Condition not met - task would be skipped${R.reset}`;let r=p.join(h.cwd(),e.file),i={};e.content==null?e.template!=null&&(i.template=e.template):i.template=e.content,e.templateFile!=null&&(i.templateFile=e.templateFile);try{let a=await F(i,t,n),o=a.split(`
18
- `).slice(0,10).join(`
19
- `),s=a.split(`
20
- `).length>10;return m.existsSync(r)?`${R.blue}File: ${e.file}${R.reset}\n${R.green}+ Would append content${R.reset}\n${R.gray}Content preview:${R.reset}\n${o}${s?`
21
- ...`:``}`:`${R.blue}File: ${e.file}${R.reset}\n${R.green}+ New file would be created with content${R.reset}\n${R.gray}Content preview:${R.reset}\n${o}${s?`
22
- ...`:``}`}catch(e){return`${R.red}✗ Error: ${e instanceof Error?e.message:String(e)}${R.reset}`}}function ke(e,t){if(e.condition!=null&&e.condition!==``&&!d(e.condition,t))return`${R.yellow}⊘ Condition not met - task would be skipped${R.reset}`;let n=l(e.path,t),r=p.join(h.cwd(),n);return m.existsSync(r)?`${R.cyan}→ Directory already exists: ${n}${R.reset}`:`${R.green}+ Would create directory: ${n}${R.reset}`}async function Ae(e,t){try{switch(e.type){case`update-json`:return await _e(e.config,t);case`write`:return await ve(e.config,t);case`create`:return await ye(e.config,t,e);case`regex-replace`:return await be(e.config,t);case`replace-in-file`:return await xe(e.config,t);case`delete`:return Se(e.config,t);case`rename`:return Ce(e.config,t);case`move`:return Ee(e.config,t);case`copy`:return De(e.config,t);case`append`:return await Oe(e.config,t,e);case`mkdir`:return ke(e.config,t);case`git-init`:return we(e.config);case`exec`:return Te(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 je(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 Ae(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 V=new Map,H={},U=new Map;function W(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(V.has(e.name))throw TypeError(`Plugin ${e.name} is already registered`);for(let t of e.taskTypes)if(U.has(t)){let e=U.get(t);throw TypeError(`Task type "${t}" is already registered by plugin "${e}"`)}V.set(e.name,e);for(let t of e.taskTypes)U.set(t,e.name);a(`✓ Registered plugin: ${e.name}${e.version==null?``:` v${e.version}`}`,`info`)}function Me(e){let t=V.get(e);if(t!=null){for(let e of t.taskTypes)U.delete(e);V.delete(e)}}function Ne(e){return V.get(e)}function G(e){let t=U.get(e);if(t!=null)return V.get(t)}function K(e){return U.has(e)}function Pe(){return Array.from(V.keys())}function Fe(){V.clear(),U.clear()}function Ie(e){e.beforeAll!=null&&(H.beforeAll=e.beforeAll),e.afterAll!=null&&(H.afterAll=e.afterAll),e.beforeTask!=null&&(H.beforeTask=e.beforeTask),e.afterTask!=null&&(H.afterTask=e.afterTask),e.onError!=null&&(H.onError=e.onError)}async function q(e,...t){let n=H[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){a(`Error in ${e} hook: ${t instanceof Error?t.message:String(t)}`,`error`)}}async function Le(e,t,n){let r=G(e.type);if(r==null)throw TypeError(`No plugin found for task type: ${e.type}`);await r.execute(e,t,n)}async function Re(e,t){let n=G(e.type);if(!(n==null||n.getDiff==null))return n.getDiff(e,t)}function ze(e){let t=G(e.type);return t==null?[`No plugin found for task type: ${e.type}`]:t.validate==null?[]:t.validate(e)}function Be(e,t,n,r){return{name:e,...r?.version!=null&&{version:r.version},taskTypes:[t],execute:n,...r?.getDiff!=null&&{getDiff:r.getDiff},...r?.validate!=null&&{validate:r.validate}}}async function J(e,t,n){if(e===void 0)return;if(typeof e!=`object`||!e||Array.isArray(e))return typeof e==`string`&&n&&/\{\{\w+\}\}/u.test(e)?l(e,n):e;let r=e;if(r.type===`conditional`){if(!n)return;if(typeof r.condition!=`string`){a(`Prompt "${t}": conditional default must have a string condition`,`error`);return}try{let{evaluateCondition:e}=await import(`./utils-BkBUxMw3.js`),t=e(r.condition,n)?r.ifTrue:r.ifFalse;return typeof t==`string`&&/\{\{\w+\}\}/u.test(t)&&(t=l(t,n)),t}catch(e){a(`Prompt "${t}": failed to evaluate conditional default: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}if(r.type===`exec`){let e=r.value;if(typeof e!=`string`){a(`Prompt "${t}": exec default value must have a string command`,`error`);return}try{let t=_(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){a(`Prompt "${t}": failed to execute default value command: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}else if(r.type===`static`)return r.value;else if(r.type!==void 0){a(`Prompt "${t}": unknown default value type "${r.type}". Expected "static", "exec", or "conditional".`,`error`);return}return e}async function Y(e,t=new Map,n={}){let r={};if(e.length===0)return r;for(let i of e){if(i.$templateEnabled!=null&&!await o(i.$templateEnabled,{...n,...r}))continue;let e={...n,...r};if(await o(i.enabled,e))try{let n,o=t.get(i.id);switch(i.default!==void 0&&(o=await J(i.default,i.id,e)),i.type){case`input`:{let e={message:i.message};if(o!==void 0&&(e.default=String(o)),i.required!==void 0&&(e.required=i.required),n=await y(e),i.required&&(n==null||typeof n==`string`&&n.trim()===``))throw a(`${i.message} is required`,`error`),C.required(i.id);break}case`password`:if(n=await ee({message:i.message,mask:`*`}),i.required&&(n==null||typeof n==`string`&&n.trim()===``))throw a(`${i.message} is required`,`error`),C.required(i.id);break;case`number`:{let e={message:i.message};if(o!==void 0&&(e.default=Number(o)),i.required!==void 0&&(e.required=i.required),i.min!==void 0&&(e.min=i.min),i.max!==void 0&&(e.max=i.max),n=await b(e),i.required&&n==null)throw a(`${i.message} is required`,`error`),C.required(i.id);break}case`select`:{let e={message:i.message,choices:i.choices.map(e=>({name:e.name,value:e.value}))};o!==void 0&&(e.default=o),n=await te(e);break}case`confirm`:{let e=o===void 0?!1:!!o;n=await v({message:i.message,default:e});break}default:throw a(`Unknown prompt type: ${i.type}`,`error`),C.unknownType(i.type)}r[i.id]=n}catch(e){throw e instanceof Error&&a(`Failed to collect prompt "${i.id}": ${e.message}`,`error`),e}}return r}async function Ve(e){let t=new Map,n=e.map(async e=>{if(e.default!==void 0){let n=await J(e.default,e.id);n!==void 0&&t.set(e.id,n)}});return await Promise.all(n),t}function He(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 Ue=g(m.appendFile),We=g(m.readFile),Ge=g(m.stat);async function Ke(e,t,n){if(e.condition!=null&&e.condition!==``&&!d(e.condition,t)){a(`Condition not met, skipping append task`,`info`);return}let r=p.join(h.cwd(),e.file),i={};e.content==null?e.template!=null&&(i.template=e.template):i.template=e.content,e.templateFile!=null&&(i.templateFile=e.templateFile);let o=P(i);if(!o.isValid)throw o.error?.includes(`cannot have both`)?w.templateHasBothTemplateAndFile():w.templateMissingTemplateOrFile();let s=await F(i,t,n),c=!1,l=!1;try{await Ge(r),c=!0;let t=await We(r,`utf-8`);t.length>0&&!t.endsWith(`
23
- `)&&(l=e.newline!==!1)}catch{}c&&l?await Ue(r,`\n${s}`):await Ue(r,s),a(`Appended content to ${e.file}`,`success`)}const qe={name:`append`,version:`1.0.0`,taskTypes:[`append`],execute:async(e,t,n)=>{n.dryRun||await Ke(e.config,t,e)}},Je=g(m.copyFile),Ye=g(m.stat),Xe=g(m.mkdir),Ze=g(m.readdir);async function Qe(e,t){await Xe(t,{recursive:!0});let n=await Ze(e,{withFileTypes:!0});await Promise.all(n.map(async n=>{let r=p.join(e,n.name),i=p.join(t,n.name);n.isDirectory()?await Qe(r,i):await Je(r,i)}))}async function $e(e,t){if(e.condition!=null&&e.condition!==``&&!d(e.condition,t)){a(`Condition not met, skipping copy task`,`info`);return}let n=p.join(h.cwd(),e.from),r=p.join(h.cwd(),e.to),i;try{i=await Ye(n)}catch{a(`Source path does not exist: ${n}`,`warn`);return}await Xe(p.dirname(r),{recursive:!0}),i.isDirectory()?(await Qe(n,r),a(`Copied directory ${e.from} to ${e.to}`,`success`)):(await Je(n,r),a(`Copied file ${e.from} to ${e.to}`,`success`))}const et={name:`copy`,version:`1.0.0`,taskTypes:[`copy`],execute:async(e,t,n)=>{n.dryRun||await $e(e.config,t)}},tt=g(m.writeFile);async function nt(e,t,n){if(e.condition!=null&&e.condition!==``&&!d(e.condition,t)){a(`Condition not met, skipping create task`,`info`);return}let r=p.join(h.cwd(),e.file);if(m.existsSync(r)){a(`File already exists, skipping: ${e.file}`,`info`);return}let i=P(e);if(!i.isValid)throw i.error?.includes(`cannot have both`)?w.createHasBothTemplateAndFile():w.createMissingTemplateOrFile();let o=await F(e,t,n),s=p.dirname(r);m.existsSync(s)||m.mkdirSync(s,{recursive:!0}),await tt(r,o),a(`Created file: ${e.file}`,`success`)}const rt={name:`create`,version:`1.0.0`,taskTypes:[`create`],execute:async(e,t,n)=>{n.dryRun||await nt(e.config,t,e)}};async function it(e,t){let{paths:n,condition:r}=e;if(r!=null&&r!==``){if(!t){a(`Condition specified but no config provided, skipping deletion`,`warn`);return}if(!d(r,t)){a(`Condition not met, skipping deletion`,`info`);return}}for(let e of n){let t=p.join(h.cwd(),e);m.existsSync(t)&&m.rmSync(t,{recursive:!0,force:!0})}}const at={name:`delete`,version:`1.0.0`,taskTypes:[`delete`],execute:async(e,t,n)=>{n.dryRun||await it(e.config,t)}};async function ot(e,t){if(e.condition!=null&&e.condition!==``){if(!t){a(`Condition specified but no config provided, skipping exec`,`warn`);return}if(!d(e.condition,t)){a(`Condition not met, skipping exec task`,`info`);return}}let n=e.cwd==null?h.cwd():p.join(h.cwd(),e.cwd);_(e.command,{cwd:n,stdio:`inherit`})}const st={name:`exec`,version:`1.0.0`,taskTypes:[`exec`],execute:async(e,t,n)=>{n.dryRun||await ot(e.config,t)}};async function ct(e,t){if(e.condition!=null&&e.condition!==``){if(!t){a(`Condition specified but no config provided, skipping git-init`,`warn`);return}if(!d(e.condition,t)){a(`Condition not met, skipping git-init task`,`info`);return}}if(e.removeExisting){let e=p.join(h.cwd(),`.git`);m.existsSync(e)&&m.rmSync(e,{recursive:!0,force:!0})}if(_(`git init`,{stdio:`inherit`}),e.initialCommit){let t=e.message??`Initial commit`;_(`git add .`,{stdio:`inherit`}),_(`git commit -m "${t}"`,{stdio:`inherit`})}}const lt={name:`git-init`,version:`1.0.0`,taskTypes:[`git-init`],execute:async(e,t,n)=>{n.dryRun||await ct(e.config,t)}},ut=g(m.mkdir);async function dt(e,t){if(e.condition!=null&&e.condition!==``&&!d(e.condition,t)){a(`Condition not met, skipping mkdir task`,`info`);return}await ut(p.join(h.cwd(),e.path),{recursive:!0}),a(`Created directory: ${e.path}`,`success`)}const ft={name:`mkdir`,version:`1.0.0`,taskTypes:[`mkdir`],execute:async(e,t,n)=>{n.dryRun||await dt(e.config,t)}},pt=g(m.rename),mt=g(m.stat),ht=g(m.mkdir);async function gt(e,t){if(e.condition!=null&&e.condition!==``&&!d(e.condition,t)){a(`Condition not met, skipping move task`,`info`);return}let n=p.join(h.cwd(),e.from),r=p.join(h.cwd(),e.to);try{await mt(n)}catch{a(`Source path does not exist: ${n}`,`warn`);return}await ht(p.dirname(r),{recursive:!0}),await pt(n,r),a(`Moved ${e.from} to ${e.to}`,`success`)}const _t={name:`move`,version:`1.0.0`,taskTypes:[`move`],execute:async(e,t,n)=>{n.dryRun||await gt(e.config,t)}},vt=g(m.readFile),yt=g(m.writeFile);async function bt(e,t){if(e.condition!=null&&e.condition!==``&&!d(e.condition,t)){a(`Condition not met, skipping regex-replace task`,`info`);return}let n=p.join(h.cwd(),e.file),{pattern:r}=e,i=e.flags??``,o=e.replacement||``,s=await vt(n,`utf-8`),c=new RegExp(r,i);s=s.replace(c,l(o,t)),await yt(n,s)}const xt={name:`regex-replace`,version:`1.0.0`,taskTypes:[`regex-replace`],execute:async(e,t,n)=>{n.dryRun||await bt(e.config,t)}},St=g(m.rename);async function Ct(e,t){if(e.condition!=null&&e.condition!==``&&!d(e.condition,t)){a(`Condition not met, skipping rename task`,`info`);return}let n=p.join(h.cwd(),l(e.from,t)),r=p.join(h.cwd(),l(e.to,t));if(!m.existsSync(n)){a(`Source path does not exist: ${n}`,`warn`);return}await St(n,r)}const wt={name:`rename`,version:`1.0.0`,taskTypes:[`rename`],execute:async(e,t,n)=>{n.dryRun||await Ct(e.config,t)}},Tt=g(m.readFile),Et=g(m.writeFile);async function Dt(e,t){if(e.condition!=null&&e.condition!==``&&!d(e.condition,t)){a(`Condition not met, skipping replace-in-file task`,`info`);return}let n=p.join(h.cwd(),e.file),{replacements:r}=e;if(!m.existsSync(n)){a(`File not found: ${n}, skipping`,`warn`);return}let i=await Tt(n,`utf-8`);for(let{find:e,replace:n}of r){let r=l(n,t);i=i.replace(new RegExp(e,`gu`),r)}await Et(n,i)}const Ot={name:`replace-in-file`,version:`1.0.0`,taskTypes:[`replace-in-file`],execute:async(e,t,n)=>{n.dryRun||await Dt(e.config,t)}},kt=g(m.readFile),At=g(m.writeFile);async function jt(e,t){if(e.condition!=null&&e.condition!==``&&!d(e.condition,t)){a(`Condition not met, skipping update-json task`,`info`);return}let n=p.join(h.cwd(),e.file),{updates:r}=e,i=await kt(n,`utf-8`),o=JSON.parse(i);function s(e){if(typeof e==`string`)return l(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[e,t]of Object.entries(r)){let n=s(t);e.includes(`.`)?u(o,e,n):o[e]=n}await At(n,`${JSON.stringify(o,null,2)}\n`)}const Mt={name:`update-json`,version:`1.0.0`,taskTypes:[`update-json`],execute:async(e,t,n)=>{n.dryRun||await jt(e.config,t)}},Nt=g(m.writeFile);async function Pt(e,t,n){let{allowCreate:r=!0}=e;if(e.condition!=null&&e.condition!==``&&!d(e.condition,t)){a(`Condition not met, skipping write task`,`info`);return}let i=p.join(h.cwd(),e.file);if(!m.existsSync(i)){if(r===!1)throw Error(`Write task failed: file does not exist (${e.file})`);a(`File not found, creating new file: ${e.file}`,`info`)}let o=P(e);if(!o.isValid)throw o.error?.includes(`cannot have both`)?w.templateHasBothTemplateAndFile():w.templateMissingTemplateOrFile();let s=await F(e,t,n),c=p.dirname(i);m.existsSync(c)||m.mkdirSync(c,{recursive:!0}),await Nt(i,s)}const Ft={name:`write`,version:`1.0.0`,taskTypes:[`write`],execute:async(e,t,n)=>{n.dryRun||await Pt(e.config,t,e)}};function X(){K(`update-json`)||(W(Mt),W(Ft),W(rt),W(xt),W(Ot),W(at),W(wt),W(lt),W(st),W(_t),W(et),W(qe),W(ft))}async function It(e,t,n=!1){if(X(),n){a(`[DRY RUN] Would execute: ${e.name}`,`info`);return}if(K(e.type)){await Le(e,t,{dryRun:n});return}throw TypeError(`Unknown task type: ${e.type}`)}async function Lt(e,t,n,r,i=!1){try{return a(`[${n}/${r}] Running: ${e.name}...`,`info`),await It(e,t,i),a(`✓ ${e.name}`,`success`),!0}catch(t){return a(`✗ Failed: ${e.name}`,`error`),t instanceof Error&&(a(` Reason: ${t.message}`,`error`),t.stack!=null&&h.env.DEBUG!=null&&console.error(t.stack)),(e.required??!0)&&a(` This is a required task. Initialization cannot continue.`,`error`),!1}}function Rt(e){let t=[],n=new Set,r=new Set,a=new Map(e.map(e=>[e.id,e]));function o(e){if(n.has(e))return;if(r.has(e))throw i.forTaskDependency(e);r.add(e);let s=a.get(e);if(!s)throw re.forId(e);if(s.dependencies)for(let e of s.dependencies)o(e);r.delete(e),n.add(e),t.push(s)}for(let t of e)n.has(t.id)||o(t.id);return t}function zt(e){let t=[];for(let n of e)if(!K(n.type))t.push(`Task "${n.id}" (${n.name}): Unknown task type "${n.type}"`);else if(n.type===`write`){let e=Bt(n);t.push(...e)}return t}function Bt(e){let t=[],n=e.config,r=typeof n.template==`string`?n.template:void 0,i=typeof n.templateFile==`string`?n.templateFile:void 0,a=P({...r!==void 0&&{template:r},...i!==void 0&&{templateFile:i}});return!a.isValid&&a.error!=null&&a.error!==``&&t.push(`Task "${e.id}" (${e.name}): ${a.error}`),(n.file==null||n.file===``)&&t.push(`Task "${e.id}" (${e.name}): Write task requires "file" property to specify the output file path`),t}function Vt(e){a(`❌ Template validation failed:`,`error`),a(``,`error`);for(let t of e)a(` • ${t}`,`error`);a(``,`error`),a(`Please fix these errors before continuing.`,`error`)}function Z(e,t=new Map){let n={};for(let r of e){let e=t.get(r.id);e!==void 0&&(n[r.id]=e)}return n}async function Ht(e,t,n){if(e==null)return;if(typeof e!=`object`||!e||Array.isArray(e))return e;let r=e;if(r.type===`conditional`){if(!n){a(`Variable "${t}": conditional value requires context but none provided`,`warn`);return}if(typeof r.condition!=`string`){a(`Variable "${t}": conditional value must have a string condition`,`error`);return}try{let{evaluateCondition:e,interpolateTemplate:t}=await import(`./utils-BkBUxMw3.js`),i=e(r.condition,n)?r.ifTrue:r.ifFalse;return typeof i==`string`&&/\{\{\w+\}\}/u.test(i)&&(i=t(i,n)),i}catch(e){a(`Variable "${t}": failed to evaluate conditional value: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}if(r.type===`exec`){let e=r.value;if(typeof e!=`string`){a(`Variable "${t}": exec value must have a string command`,`error`);return}try{let t=_(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){a(`Variable "${t}": failed to execute command: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}else if(r.type===`static`)return r.value;return e}async function Q(e,t){let n=new Map;for(let r of e){if(r.$templateEnabled!=null){let e={...t};for(let[t,r]of n.entries())e[t]=r;if(!await o(r.$templateEnabled,e))continue}let e={...t};for(let[t,r]of n.entries())e[t]=r;let i=await Ht(r.value,r.id,e);i!==void 0&&n.set(r.id,i)}return n}function Ut(e){let t=[],n=new Set;for(let r of e)if(n.has(r.id)&&t.push(`Duplicate variable ID: "${r.id}"`),n.add(r.id),/^[a-zA-Z_$][a-zA-Z0-9_$]*$/u.test(r.id)||t.push(`Variable ID "${r.id}" is invalid. Must be a valid JavaScript identifier (start with letter, underscore, or $, followed by letters, digits, underscores, or $).`),r.value===void 0||r.value===null)t.push(`Variable "${r.id}" must have a value`);else if(typeof r.value==`object`&&!Array.isArray(r.value)&&r.value!==null){let e=r.value;e.type==null||e.type===``?t.push(`Variable "${r.id}": value object must have a "type" field ("static", "exec", or "conditional")`):e.type!==`static`&&e.type!==`exec`&&e.type!==`conditional`&&t.push(`Variable "${r.id}": type must be "static", "exec", or "conditional", got "${e.type}"`),(e.type===`static`||e.type===`exec`)&&(e.value===void 0||e.value===null)&&t.push(`Variable "${r.id}": value config must have a "value" field`),e.type===`exec`&&typeof e.value!=`string`&&t.push(`Variable "${r.id}": exec type must have a string command as value`),e.type===`conditional`&&((e.condition===void 0||e.condition===null||e.condition===``||typeof e.condition!=`string`)&&t.push(`Variable "${r.id}": conditional type must have a "condition" field with a string expression`),e.ifTrue===void 0&&t.push(`Variable "${r.id}": conditional type must have an "ifTrue" field`),e.ifFalse===void 0&&t.push(`Variable "${r.id}": conditional type must have an "ifFalse" field`))}return t}async function Wt(t,n){let r=ne();if(!await o(n.templateEnabled,r,{lazy:!0})){a(`⊘ Template is disabled - skipping all execution`,`info`);return}X(),a(`Validating task configurations...`,`info`);let i=zt(t);i.length>0&&(Vt(i),h.exit(1)),a(`✓ All tasks validated successfully`,`success`);let s=t.filter(t=>e(t.enabled,ne(),{lazy:!0}));a(`Resolving task dependencies...`,`info`);let c=Rt(s);a(`Welcome! Let's execute your tasks.`,`info`),n.dryRun&&a(`🔍 DRY RUN MODE - No changes will be made`,`warn`),a(`This will execute your project tasks based on the defined configuration.`,`info`);let l=r,u=n.globalVariables??[],d=[],f=[...u];for(let e of c)if(e.variables&&e.variables.length>0)for(let t of e.variables)d.push(t),f.push(t);if(f.length>0){let e=Ut(f);e.length>0&&(a(`❌ Variable validation errors:`,`error`),e.forEach(e=>a(` - ${e}`,`error`)),h.exit(1)),a(`Resolving variable values...`,`info`);let t=Z(f,await Q(f,l));Object.assign(l,t),Object.keys(t).length>0&&a(`✓ Resolved ${Object.keys(t).length} variable(s)`,`success`)}let p=n.globalPrompts??[],m=[],g=[...p];for(let e of c)if(e.prompts&&e.prompts.length>0)for(let t of e.prompts)m.push(t),g.push(t);if(g.length>0){let e=He(g);e.length>0&&(a(`❌ Prompt validation errors:`,`error`),e.forEach(e=>a(` - ${e}`,`error`)),h.exit(1)),a(`Resolving prompt default values...`,`info`);let t=await Ve(g),n={};if(p.length>0&&(a(`📋 Top-level prompts (available to all tasks):`,`info`),n=await Y(p,t,l),Object.assign(l,n)),m.length>0){p.length>0&&a(`📋 Task-specific prompts:`,`info`);let e=await Y(m,t,l);Object.assign(l,e)}}if(f.length>0){let e=f.filter(e=>typeof e.value==`object`&&e.value!==null&&!Array.isArray(e.value)?e.value.type===`conditional`:!1);if(e.length>0){a(`Re-resolving conditional variables with prompt values...`,`info`);let t=Z(e,await Q(e,l));Object.assign(l,t),Object.keys(t).length>0&&a(`✓ Resolved ${Object.keys(t).length} conditional variable(s)`,`success`)}}if(!await o(n.templateEnabled,l)){a(`⊘ Template is disabled after variable resolution - skipping all execution`,`info`);return}let _=[];for(let e of c)e.$templateEnabled!=null&&!await o(e.$templateEnabled,l)||await o(e.enabled,l)&&_.push(e);if(a(`${_.length} of ${c.length} task(s) enabled for execution`,`info`),n.dryRun){await je(_,l),a(`🔍 Dry run completed - no changes were made`,`info`),a(`Run without --dry-run to apply changes`,`info`);return}a(`Starting task execution...`,`info`),await q(`beforeAll`,l);let v=_.length,y=0,b=0,ee=[];for(let e=0;e<_.length;e++){let t=_[e];if(t!=null)if(await q(`beforeTask`,t,l),await Lt(t,l,e+1,v,n.dryRun))y++,ee.push(t.id),await q(`afterTask`,t,l);else if(t.required??!0){b++,await q(`onError`,Error(`Task ${t.name} failed`),t);break}else a(`⚠️ Non-critical task failed, continuing...`,`warn`),await q(`onError`,Error(`Task ${t.name} failed`),t)}b>0&&(a(`❌ Task execution failed with ${b} critical error(s)`,`error`),a(`✓ Completed: ${y}/${v} tasks`,`info`),h.exit(1)),await q(`afterAll`,l),a(`✅ All tasks completed successfully!`,`success`),a(`✓ Completed: ${y}/${v} tasks`,`success`)}const Gt=h.argv.includes(`--dry-run`),$=h.argv.includes(`--force`);async function Kt(e){try{let t=e||[];t.length===0&&(a(`⚠️ No tasks defined. Use --tasks-file to specify tasks or call runWithTasks() programmatically.`,`warn`),a(`Example: scaffoldfy --tasks-file ./tasks.json`,`info`),h.exit(1)),await Wt(t,{dryRun:Gt,force:$,tasksFilePath:void 0})}catch(e){a(`❌ Task execution failed`,`error`),e instanceof Error?(a(`Error: ${e.message}`,`error`),h.env.DEBUG!=null&&console.error(e.stack)):console.error(e),h.exit(1)}}async function qt(e,t){try{await Wt(e,{dryRun:t?.dryRun??Gt,force:t?.force??$,tasksFilePath:t?.tasksFilePath??void 0,...t?.globalVariables!=null&&{globalVariables:t.globalVariables},...t?.globalPrompts!=null&&{globalPrompts:t.globalPrompts},...t?.templateEnabled!=null&&{templateEnabled:t.templateEnabled}})}catch(e){a(`❌ Task execution failed`,`error`),e instanceof Error?(a(`Error: ${e.message}`,`error`),h.env.DEBUG!=null&&console.error(e.stack)):console.error(e),h.exit(1)}}export{Se as A,j as B,Pe as C,ze as D,Me as E,xe as F,he as G,F as H,Ae as I,k as J,A as K,_e as L,we as M,be as N,je as O,Ce as P,ve as R,K as S,W as T,N as U,M as V,P as W,de as Y,Be as _,Ht as a,G as b,It as c,He as d,Ve as f,Fe as g,q as h,Q as i,Te as j,ye as k,X as l,J as m,qt as n,Z as o,Y as p,ge as q,Ut as r,Rt as s,Kt as t,Lt as u,Le as v,Ie as w,Re as x,Ne as y,I as z};
@@ -1 +0,0 @@
1
- var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));let c=require(`node:fs`);c=s(c);let l=require(`node:path`);l=s(l);let u=require(`node:process`);u=s(u);let d=require(`node:child_process`);d=s(d);let f=require(`node:readline`);f=s(f),require(`handlebars`);var p=class extends Error{constructor(e,t){super(e),this.code=t,this.name=this.constructor.name}},m=class e extends p{constructor(e,t,n){super(e,`CIRCULAR_DEPENDENCY`),this.dependencyChain=t,this.resolvedPath=n,this.name=`CircularDependencyError`}static forTemplateInheritance(t,n){let r=Array.from(t);return new e(`Circular dependency detected: ${r.join(` -> `)} -> ${n}`,r,n)}static forTaskDependency(t){return new e(`Circular dependency detected involving task: ${t}`,[t])}},h=class e extends p{constructor(e,t){super(e,`TEMPLATE_FILE_NOT_FOUND`),this.filePath=t,this.name=`TemplateFileNotFoundError`}static forPath(t){return new e(`Template file not found: ${t}`,t)}},g=class e extends p{constructor(e,t,n){super(e,`TEMPLATE_RESOLUTION_ERROR`),this.templateFilePath=t,this.sourceUrl=n,this.name=`TemplateResolutionError`}static forRemoteTemplate(t,n){return new e(`Failed to resolve templateFile "${t}" relative to remote template "${n}"`,t,n)}},_=class e extends p{constructor(e,t,n){super(e,`TEMPLATE_FETCH_ERROR`),this.url=t,this.originalError=n,this.name=`TemplateFetchError`}static forUrl(t,n,r){return typeof n==`number`?new e(`Failed to fetch template from ${t}: ${n} ${r??``}`.trim(),t):new e(`Failed to fetch template from ${t}: ${n?.message??String(n??`Unknown error`)}`,t,n)}},v=class e extends p{constructor(e,t,n){super(e,`TEMPLATE_PARSE_ERROR`),this.filePath=t,this.originalError=n,this.name=`TemplateParseError`}static forFile(t,n){return new e(`Failed to parse template file ${t}: ${n.message}`,t,n)}},y=class e extends p{constructor(e,t){super(e,`INVALID_TEMPLATE`),this.filePath=t,this.name=`InvalidTemplateError`}static forFile(t,n){return new e(`Invalid template file ${t}: ${n}`,t)}static tasksNotArray(t){return new e(`Invalid template file ${t}: 'tasks' must be an array if provided`,t)}static missingName(t){return new e(`Invalid template file ${t}: 'name' field is required`,t)}static invalidNameFormat(t,n){return new e(`Invalid template file ${t}: 'name' field "${n}" must contain only lowercase letters, digits, and hyphens. It cannot start or end with a hyphen, and cannot contain consecutive hyphens.`,t)}};function b(e,t,n){return e===void 0?!0:typeof e==`boolean`?e:typeof e==`string`?O(e,t,n?.lazy===!0?{lazy:!0}:void 0):typeof e==`object`&&`type`in e&&e.type===`exec`?n?.lazy===!0:typeof e==`object`&&`condition`in e?O(e.condition,t,n?.lazy===!0?{lazy:!0}:void 0):!1}async function x(e,t,n){if(e===void 0)return!0;if(typeof e==`boolean`)return e;if(typeof e==`string`)return O(e,t,n?.lazy===!0?{lazy:!0}:void 0);if(typeof e==`object`&&`type`in e&&e.type===`exec`)try{let{execSync:n}=await import(`node:child_process`),{interpolateTemplate:r}=await Promise.resolve().then(()=>require(`./utils-eYfsIViF.cjs`)),i=n(r(e.value,t),{encoding:`utf-8`}).trim();if(i===``||i===`0`)return!1;let a=i.toLowerCase();return!(a===`false`||a===`no`)}catch(t){let{log:n}=await Promise.resolve().then(()=>require(`./utils-eYfsIViF.cjs`));return n(`Failed to execute enabled command: ${e.value}`,`warn`),t instanceof Error&&n(` Error: ${t.message}`,`warn`),!1}return typeof e==`object`&&`condition`in e?O(e.condition,t,n?.lazy===!0?{lazy:!0}:void 0):!1}function S(){try{let e=(0,d.execSync)(`git remote get-url origin`,{encoding:`utf-8`}).trim(),t=e.match(/github\.com[:/](?<owner>[^/]+)\/(?<name>[^/]+)$/u);if(t?.groups){let{owner:n,name:r}=t.groups,i=r;return i.endsWith(`.git`)&&(i=i.slice(0,-4)),{owner:n,name:i,url:e}}return null}catch{return null}}async function C(e,t){let n=f.default.createInterface({input:u.default.stdin,output:u.default.stdout});return new Promise(r=>{let i;i=t==null?`${e}: `:`${e} (${t}): `,n.question(i,e=>{n.close(),r(e.trim()||(t??``))})})}async function w(e,t=!1){return C(`${e} (${t?`Y/n`:`y/N`})`,t?`y`:`n`).then(e=>e.toLowerCase()===`y`||e.toLowerCase()===`yes`)}function T(e,t=`info`){console.log(`${{info:`\x1B[36m`,success:`\x1B[32m`,error:`\x1B[31m`,warn:`\x1B[33m`}[t]}${{info:`ℹ`,success:`✓`,error:`✗`,warn:`⚠`}[t]} ${e}`)}function E(e,t){return e.replace(/\{\{(?<key>\w+)\}\}/gu,(e,n)=>t[n]?.toString()??``)}function D(e,t,n){let r=t.split(`.`),i=e;for(let e=0;e<r.length-1;e++){let t=r[e];t!=null&&t!==``&&((!(t in i)||typeof i[t]!=`object`||i[t]===null)&&(i[t]={}),i=i[t])}let a=r[r.length-1];a!=null&&a!==``&&(i[a]=n)}function O(e,t,n){try{let n={...t};return Function(...Object.keys(n),`'use strict'; return (${e})`)(...Object.values(n))}catch(t){return n?.lazy===!0&&t instanceof ReferenceError?!0:(n?.silent!==!0&&(T(`Failed to evaluate condition: ${e}`,`warn`),t instanceof Error&&T(` Error: ${t.message}`,`warn`)),!1)}}Object.defineProperty(exports,`_`,{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return C}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return b}}),Object.defineProperty(exports,`d`,{enumerable:!0,get:function(){return _}}),Object.defineProperty(exports,`f`,{enumerable:!0,get:function(){return h}}),Object.defineProperty(exports,`g`,{enumerable:!0,get:function(){return p}}),Object.defineProperty(exports,`h`,{enumerable:!0,get:function(){return m}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return T}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return x}}),Object.defineProperty(exports,`m`,{enumerable:!0,get:function(){return g}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return S}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return w}}),Object.defineProperty(exports,`p`,{enumerable:!0,get:function(){return v}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return E}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return D}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return O}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return y}});
@@ -1 +0,0 @@
1
- import e from"node:path";import t from"node:fs";import n from"node:process";import{execSync as r}from"node:child_process";import i from"node:readline";import"handlebars";var a=class extends Error{constructor(e,t){super(e),this.code=t,this.name=this.constructor.name}},o=class e extends a{constructor(e,t,n){super(e,`CIRCULAR_DEPENDENCY`),this.dependencyChain=t,this.resolvedPath=n,this.name=`CircularDependencyError`}static forTemplateInheritance(t,n){let r=Array.from(t);return new e(`Circular dependency detected: ${r.join(` -> `)} -> ${n}`,r,n)}static forTaskDependency(t){return new e(`Circular dependency detected involving task: ${t}`,[t])}},s=class e extends a{constructor(e,t){super(e,`TEMPLATE_FILE_NOT_FOUND`),this.filePath=t,this.name=`TemplateFileNotFoundError`}static forPath(t){return new e(`Template file not found: ${t}`,t)}},c=class e extends a{constructor(e,t,n){super(e,`TEMPLATE_RESOLUTION_ERROR`),this.templateFilePath=t,this.sourceUrl=n,this.name=`TemplateResolutionError`}static forRemoteTemplate(t,n){return new e(`Failed to resolve templateFile "${t}" relative to remote template "${n}"`,t,n)}},l=class e extends a{constructor(e,t,n){super(e,`TEMPLATE_FETCH_ERROR`),this.url=t,this.originalError=n,this.name=`TemplateFetchError`}static forUrl(t,n,r){return typeof n==`number`?new e(`Failed to fetch template from ${t}: ${n} ${r??``}`.trim(),t):new e(`Failed to fetch template from ${t}: ${n?.message??String(n??`Unknown error`)}`,t,n)}},u=class e extends a{constructor(e,t,n){super(e,`TEMPLATE_PARSE_ERROR`),this.filePath=t,this.originalError=n,this.name=`TemplateParseError`}static forFile(t,n){return new e(`Failed to parse template file ${t}: ${n.message}`,t,n)}},d=class e extends a{constructor(e,t){super(e,`INVALID_TEMPLATE`),this.filePath=t,this.name=`InvalidTemplateError`}static forFile(t,n){return new e(`Invalid template file ${t}: ${n}`,t)}static tasksNotArray(t){return new e(`Invalid template file ${t}: 'tasks' must be an array if provided`,t)}static missingName(t){return new e(`Invalid template file ${t}: 'name' field is required`,t)}static invalidNameFormat(t,n){return new e(`Invalid template file ${t}: 'name' field "${n}" must contain only lowercase letters, digits, and hyphens. It cannot start or end with a hyphen, and cannot contain consecutive hyphens.`,t)}};function f(e,t,n){return e===void 0?!0:typeof e==`boolean`?e:typeof e==`string`?b(e,t,n?.lazy===!0?{lazy:!0}:void 0):typeof e==`object`&&`type`in e&&e.type===`exec`?n?.lazy===!0:typeof e==`object`&&`condition`in e?b(e.condition,t,n?.lazy===!0?{lazy:!0}:void 0):!1}async function p(e,t,n){if(e===void 0)return!0;if(typeof e==`boolean`)return e;if(typeof e==`string`)return b(e,t,n?.lazy===!0?{lazy:!0}:void 0);if(typeof e==`object`&&`type`in e&&e.type===`exec`)try{let{execSync:n}=await import(`node:child_process`),{interpolateTemplate:r}=await import(`./utils-BkBUxMw3.js`),i=n(r(e.value,t),{encoding:`utf-8`}).trim();if(i===``||i===`0`)return!1;let a=i.toLowerCase();return!(a===`false`||a===`no`)}catch(t){let{log:n}=await import(`./utils-BkBUxMw3.js`);return n(`Failed to execute enabled command: ${e.value}`,`warn`),t instanceof Error&&n(` Error: ${t.message}`,`warn`),!1}return typeof e==`object`&&`condition`in e?b(e.condition,t,n?.lazy===!0?{lazy:!0}:void 0):!1}function m(){try{let e=r(`git remote get-url origin`,{encoding:`utf-8`}).trim(),t=e.match(/github\.com[:/](?<owner>[^/]+)\/(?<name>[^/]+)$/u);if(t?.groups){let{owner:n,name:r}=t.groups,i=r;return i.endsWith(`.git`)&&(i=i.slice(0,-4)),{owner:n,name:i,url:e}}return null}catch{return null}}async function h(e,t){let r=i.createInterface({input:n.stdin,output:n.stdout});return new Promise(n=>{let i;i=t==null?`${e}: `:`${e} (${t}): `,r.question(i,e=>{r.close(),n(e.trim()||(t??``))})})}async function g(e,t=!1){return h(`${e} (${t?`Y/n`:`y/N`})`,t?`y`:`n`).then(e=>e.toLowerCase()===`y`||e.toLowerCase()===`yes`)}function _(e,t=`info`){console.log(`${{info:`\x1B[36m`,success:`\x1B[32m`,error:`\x1B[31m`,warn:`\x1B[33m`}[t]}${{info:`ℹ`,success:`✓`,error:`✗`,warn:`⚠`}[t]} ${e}`)}function v(e,t){return e.replace(/\{\{(?<key>\w+)\}\}/gu,(e,n)=>t[n]?.toString()??``)}function y(e,t,n){let r=t.split(`.`),i=e;for(let e=0;e<r.length-1;e++){let t=r[e];t!=null&&t!==``&&((!(t in i)||typeof i[t]!=`object`||i[t]===null)&&(i[t]={}),i=i[t])}let a=r[r.length-1];a!=null&&a!==``&&(i[a]=n)}function b(e,t,n){try{let n={...t};return Function(...Object.keys(n),`'use strict'; return (${e})`)(...Object.values(n))}catch(t){return n?.lazy===!0&&t instanceof ReferenceError?!0:(n?.silent!==!0&&(_(`Failed to evaluate condition: ${e}`,`warn`),t instanceof Error&&_(` Error: ${t.message}`,`warn`)),!1)}}export{h as a,f as c,l as d,s as f,a as g,o as h,_ as i,p as l,c as m,m as n,g as o,u as p,v as r,y as s,b as t,d as u};