@pixpilot/scaffoldfy 0.20.0 → 0.22.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-DvPgyPUm.cjs`),t=require(`./src-CKioPF46.cjs`);let n=require(`node:fs`);n=e.g(n);let r=require(`node:path`);r=e.g(r);let i=require(`node:process`);i=e.g(i);let a=require(`commander`);a=e.g(a);let o=require(`node:url`);o=e.g(o);let s=require(`ajv`);s=e.g(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;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`),l=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 u=r.default.resolve(i.default.cwd(),a.tasksFile);if(n.default.existsSync(u)){l=u;try{if(a.validate!==!1){e.i(`Validating task configuration against schema...`,`info`);let t=n.default.readFileSync(u,`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(u);o=r.tasks,s=r.variables,c=r.prompts,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 u=c!=null&&c.length>0||s!=null&&s.length>0;o.length===0&&!u&&(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:l,globalVariables:s,globalPrompts:c})}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-CdfjwUZm.cjs`),t=require(`./src-DGsq0S45.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);
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-1xh0Jxuk.js";import{i as n}from"./utils-CGdE7wLi.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;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`),u=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)){u=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,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 d=l!=null&&l.length>0||c!=null&&c.length>0;s.length===0&&!d&&(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:u,globalVariables:c,globalPrompts:l})}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{n as e,q as t}from"./src-B3yN6rH2.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{};
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- const e=require(`./utils-DvPgyPUm.cjs`),t=require(`./src-CKioPF46.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-CdfjwUZm.cjs`),t=require(`./src-DGsq0S45.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;
package/dist/index.d.cts CHANGED
@@ -97,6 +97,11 @@ interface WriteConfig {
97
97
  template?: string;
98
98
  templateFile?: string;
99
99
  condition?: ConditionExpression;
100
+ /**
101
+ * Whether to allow creating the file if it does not exist.
102
+ * @default true
103
+ */
104
+ allowCreate?: boolean;
100
105
  }
101
106
  //#endregion
102
107
  //#region src/types.d.ts
@@ -147,12 +152,21 @@ interface ConditionalEnabled {
147
152
  condition: ConditionExpression;
148
153
  }
149
154
  /**
150
- * Type for enabled field that can be boolean, string condition, or conditional object
155
+ * Executable enabled configuration
156
+ * Determines enabled state by executing a shell command
157
+ */
158
+ interface ExecutableEnabled {
159
+ type: 'exec';
160
+ value: string;
161
+ }
162
+ /**
163
+ * Type for enabled field that can be boolean, string condition, conditional object, or executable
151
164
  * - boolean: Simple true/false
152
165
  * - string: JavaScript expression to evaluate (shorthand for { condition: "..." })
153
166
  * - ConditionalEnabled: Object with condition property
167
+ * - ExecutableEnabled: Object with type='exec' and value=command
154
168
  */
155
- type EnabledValue = boolean | string | ConditionalEnabled;
169
+ type EnabledValue = boolean | string | ConditionalEnabled | ExecutableEnabled;
156
170
  interface BasePrompt {
157
171
  id: string;
158
172
  type: PromptType;
@@ -236,6 +250,7 @@ interface TaskDefinition {
236
250
  interface TasksConfiguration {
237
251
  name: string;
238
252
  description?: string;
253
+ enabled?: EnabledValue;
239
254
  dependencies?: string[];
240
255
  extends?: string | string[];
241
256
  variables?: VariableDefinition[];
@@ -508,6 +523,7 @@ declare function loadTasksWithInheritance(tasksFilePath: string): Promise<{
508
523
  tasks: TaskDefinition[];
509
524
  variables?: VariableDefinition[];
510
525
  prompts?: PromptDefinition[];
526
+ enabled?: EnabledValue;
511
527
  }>;
512
528
  //#endregion
513
529
  //#region src/template-utils.d.ts
@@ -671,6 +687,7 @@ declare function main(customTasks?: TaskDefinition[]): Promise<void>;
671
687
  * @param options.tasksFilePath - Path to the tasks file
672
688
  * @param options.globalVariables - Optional top-level global variables
673
689
  * @param options.globalPrompts - Optional top-level global prompts
690
+ * @param options.templateEnabled - Optional template-level enabled condition
674
691
  */
675
692
  declare function runWithTasks(customTasks: TaskDefinition[], options?: {
676
693
  dryRun?: boolean | undefined;
@@ -678,6 +695,7 @@ declare function runWithTasks(customTasks: TaskDefinition[], options?: {
678
695
  tasksFilePath?: string | undefined;
679
696
  globalVariables?: VariableDefinition[] | undefined;
680
697
  globalPrompts?: PromptDefinition[] | undefined;
698
+ templateEnabled?: EnabledValue | undefined;
681
699
  }): Promise<void>;
682
700
  //#endregion
683
- export { type AppendConfig, BasePrompt, ConditionExpression, ConditionalDefaultConfig, ConditionalEnabled, ConfirmPrompt, type CopyConfig, type CreateConfig, DefaultValue, DefaultValueConfig, DefaultValueType, type DeleteConfig, EnabledValue, type ExecConfig, 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 };
701
+ 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 };
package/dist/index.d.ts CHANGED
@@ -97,6 +97,11 @@ interface WriteConfig {
97
97
  template?: string;
98
98
  templateFile?: string;
99
99
  condition?: ConditionExpression;
100
+ /**
101
+ * Whether to allow creating the file if it does not exist.
102
+ * @default true
103
+ */
104
+ allowCreate?: boolean;
100
105
  }
101
106
  //#endregion
102
107
  //#region src/types.d.ts
@@ -147,12 +152,21 @@ interface ConditionalEnabled {
147
152
  condition: ConditionExpression;
148
153
  }
149
154
  /**
150
- * Type for enabled field that can be boolean, string condition, or conditional object
155
+ * Executable enabled configuration
156
+ * Determines enabled state by executing a shell command
157
+ */
158
+ interface ExecutableEnabled {
159
+ type: 'exec';
160
+ value: string;
161
+ }
162
+ /**
163
+ * Type for enabled field that can be boolean, string condition, conditional object, or executable
151
164
  * - boolean: Simple true/false
152
165
  * - string: JavaScript expression to evaluate (shorthand for { condition: "..." })
153
166
  * - ConditionalEnabled: Object with condition property
167
+ * - ExecutableEnabled: Object with type='exec' and value=command
154
168
  */
155
- type EnabledValue = boolean | string | ConditionalEnabled;
169
+ type EnabledValue = boolean | string | ConditionalEnabled | ExecutableEnabled;
156
170
  interface BasePrompt {
157
171
  id: string;
158
172
  type: PromptType;
@@ -236,6 +250,7 @@ interface TaskDefinition {
236
250
  interface TasksConfiguration {
237
251
  name: string;
238
252
  description?: string;
253
+ enabled?: EnabledValue;
239
254
  dependencies?: string[];
240
255
  extends?: string | string[];
241
256
  variables?: VariableDefinition[];
@@ -508,6 +523,7 @@ declare function loadTasksWithInheritance(tasksFilePath: string): Promise<{
508
523
  tasks: TaskDefinition[];
509
524
  variables?: VariableDefinition[];
510
525
  prompts?: PromptDefinition[];
526
+ enabled?: EnabledValue;
511
527
  }>;
512
528
  //#endregion
513
529
  //#region src/template-utils.d.ts
@@ -671,6 +687,7 @@ declare function main(customTasks?: TaskDefinition[]): Promise<void>;
671
687
  * @param options.tasksFilePath - Path to the tasks file
672
688
  * @param options.globalVariables - Optional top-level global variables
673
689
  * @param options.globalPrompts - Optional top-level global prompts
690
+ * @param options.templateEnabled - Optional template-level enabled condition
674
691
  */
675
692
  declare function runWithTasks(customTasks: TaskDefinition[], options?: {
676
693
  dryRun?: boolean | undefined;
@@ -678,6 +695,7 @@ declare function runWithTasks(customTasks: TaskDefinition[], options?: {
678
695
  tasksFilePath?: string | undefined;
679
696
  globalVariables?: VariableDefinition[] | undefined;
680
697
  globalPrompts?: PromptDefinition[] | undefined;
698
+ templateEnabled?: EnabledValue | undefined;
681
699
  }): Promise<void>;
682
700
  //#endregion
683
- export { type AppendConfig, BasePrompt, ConditionExpression, ConditionalDefaultConfig, ConditionalEnabled, ConfirmPrompt, type CopyConfig, type CreateConfig, DefaultValue, DefaultValueConfig, DefaultValueType, type DeleteConfig, EnabledValue, type ExecConfig, 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 };
701
+ 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 };
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-1xh0Jxuk.js";import{a as Y,i as X,n as Z,o as Q,r as $,s as ee,t as te}from"./utils-CGdE7wLi.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{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-B3yN6rH2.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};
@@ -0,0 +1,23 @@
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),T={template:[[`template`,`templateFile`]]};function E(e){if(e==null||e===``)return`current template`;if(D(e))return e;let t=h.cwd();return e.startsWith(t)?p.relative(t,e):e}function D(e){try{let t=new URL(e);return t.protocol===`http:`||t.protocol===`https:`}catch{return!1}}function ae(e,t){if(D(e))return e;if(t==null||t===``)return p.isAbsolute(e)?e:p.resolve(h.cwd(),e);if(D(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 oe(e){if(D(e))return O(e);if(!m.existsSync(e))throw n.forPath(e);return ie(e,`utf-8`)}async function O(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 k=new Map;async function A(e,t=new Set){let r=D(e),a;if(a=r||p.isAbsolute(e)?e:p.resolve(h.cwd(),e),k.has(a))return k.get(a);if(t.has(a))throw i.forTemplateInheritance(t,a);t.add(a);let o;if(r)o=await O(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 k.set(a,s),s}async function j(e,t,n=new Set){let r=D(e),a;if(a=r||p.isAbsolute(e)?e:t==null?p.resolve(h.cwd(),e):D(t)?new URL(e,t).href:p.resolve(t,e),n.has(a))throw i.forTemplateInheritance(n,a);n.add(a);let o=await A(a);if(o.extends==null||o.extends===``)return o;let s=D(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 j(e,s,n);l.push(t)}return le([...l,o])}function M(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 se(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 ce(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 le(e){if(e.length===0)return{name:`Empty Template`,tasks:[]};if(e.length===1){let t=e[0];return M(t.tasks??[],t.variables,t.prompts),t}let t=new Map,n=new Map,r=new Map;for(let i of e){if(i.prompts!=null)for(let e of i.prompts)if(r.has(e.id)){if(e.override==null)throw S.forPrompt(e.id);let t=r.get(e.id);r.set(e.id,ce(t,e))}else r.set(e.id,{...e});if(i.variables!=null)for(let e of i.variables)if(n.has(e.id)){if(e.override==null)throw S.forVariable(e.id);let t=n.get(e.id);n.set(e.id,se(t,e))}else n.set(e.id,{...e});for(let e of i.tasks??[])if(t.has(e.id)){if(e.override==null){let n=t.get(e.id);throw S.forTask(e.id,E(n.$sourceUrl),E(e.$sourceUrl))}let n=t.get(e.id);t.set(e.id,fe(n,e))}else t.set(e.id,{...e})}let i=Array.from(t.values()),a=r.size>0?Array.from(r.values()):void 0,o=n.size>0?Array.from(n.values()):void 0;M(i,o,a);let s=e[e.length-1],c={name:s.name,tasks:i};return s.description!=null&&(c.description=s.description),s.dependencies!=null&&(c.dependencies=s.dependencies),a!=null&&(c.prompts=a),o!=null&&(c.variables=o),c}function ue(e,t){let n=T[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=T[n]??[];for(let[e,n]of Object.entries(t)){for(let t of i)if(t.includes(e)){for(let n of t)n!==e&&delete r[n];break}r[e]=n}return r}function fe(e,t){if((t.override??`merge`)===`replace`){a(` → Task "${t.id}" using 'replace' strategy - completely replacing base task`,`info`),a(` Base: ${E(e.$sourceUrl)}`,`info`),a(` Override: ${E(t.$sourceUrl)}`,`info`);let{override:n,...r}=t;return r}a(` → Merging task "${t.id}"`,`info`),a(` Base: ${E(e.$sourceUrl)}`,`info`),a(` Override: ${E(t.$sourceUrl)}`,`info`);let n;if(typeof e.config==`object`&&e.config!==null&&typeof t.config==`object`&&t.config!==null){n=de(e.config,t.config,t.type);let r=ue(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 pe(){k.clear()}async function me(e){a(`Loading tasks from ${e}...`,`info`);let t=await j(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 N(e){return e.template!=null&&e.template!==``}function P(e){return e.templateFile!=null&&e.templateFile!==``}function F(e){return e.endsWith(`.hbs`)}function I(e){let t=N(e),n=P(e);return!t&&!n?{isValid:!1,hasInlineTemplate:t,hasTemplateFile:n,error:`Template configuration requires either "template" (inline) or "templateFile" (file path) to be specified`}:t&&n?{isValid:!1,hasInlineTemplate:t,hasTemplateFile:n,error:`Template configuration cannot have both "template" and "templateFile" specified. Use one or the other.`}:{isValid:!0,hasInlineTemplate:t,hasTemplateFile:n}}async function L(e,t,n,r={}){let{enableHandlebars:i=!0,sourceUrl:a=n?.$sourceUrl}=r,o=N(e),s=P(e);if(o)return l(e.template,t);if(s){let n=e.templateFile,r=i&&F(n),o=await oe(ae(n,a));return r?(await import(`handlebars`)).default.compile(o)(t):l(o,t)}throw Error(`No template content available`)}function R(e){return N(e)?`inline template`:P(e)?`template file: ${e.templateFile}`:`no template source`}const z=g(m.readFile),B={reset:`\x1B[0m`,red:`\x1B[31m`,green:`\x1B[32m`,yellow:`\x1B[33m`,blue:`\x1B[34m`,cyan:`\x1B[36m`,gray:`\x1B[90m`};function V(e,t){switch(t){case`add`:return`${B.green}+ ${e}${B.reset}`;case`remove`:return`${B.red}- ${e}${B.reset}`;case`context`:return`${B.gray} ${e}${B.reset}`;default:return e}}function H(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(V(t,`context`)):(t!==void 0&&i.push(V(t,`remove`)),a!==void 0&&i.push(V(a,`add`)))}return i}async function U(e,t){if(e.condition!=null&&e.condition!==``&&!d(e.condition,t))return`${B.yellow}⊘ Condition not met - task would be skipped${B.reset}`;let n=p.join(h.cwd(),e.file);if(!m.existsSync(n))return`${B.red}✗ File not found: ${e.file}${B.reset}`;try{let r=await z(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`${B.cyan}→ No changes${B.reset}`;let d=H(s,c);return`${B.blue}File: ${e.file}${B.reset}\n${d.join(`
4
+ `)}`}catch(e){return`${B.red}✗ Error: ${e instanceof Error?e.message:String(e)}${B.reset}`}}async function he(e,t){if(e.condition!=null&&e.condition!==``&&!d(e.condition,t))return`${B.yellow}⊘ Condition not met - task would be skipped${B.reset}`;if(e.template==null||e.template===``)return`${B.red}✗ No template content provided for file: ${e.file}${B.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`${B.blue}File: ${e.file}${B.reset}\n${B.green}+ New file would be created${B.reset}\n${B.gray}Content preview:${B.reset}\n${t}${n?`
8
+ ...`:``}`}try{let t=await z(n,`utf-8`);if(t===r)return`${B.cyan}→ No changes${B.reset}`;let i=H(t,r);return`${B.blue}File: ${e.file}${B.reset}\n${i.join(`
9
+ `)}`}catch(e){return`${B.red}✗ Error: ${e instanceof Error?e.message:String(e)}${B.reset}`}}async function ge(e,t,n){if(e.condition!=null&&e.condition!==``&&!d(e.condition,t))return`${B.yellow}⊘ Condition not met - task would be skipped${B.reset}`;let r=p.join(h.cwd(),e.file);if(m.existsSync(r))return`${B.cyan}→ File already exists, would be skipped: ${e.file}${B.reset}`;try{if(N(e)){let r=await L(e,t,n),i=r.split(`
10
+ `).slice(0,10).join(`
11
+ `),a=r.split(`
12
+ `).length>10;return`${B.blue}File: ${e.file}${B.reset}\n${B.green}+ New file would be created${B.reset}\n${B.gray}Content preview:${B.reset}\n${i}${a?`
13
+ ...`:``}`}let r=R(e);return`${B.blue}File: ${e.file}${B.reset}\n${B.green}+ New file would be created from ${r}${B.reset}`}catch(e){return`${B.red}✗ Error: ${e instanceof Error?e.message:String(e)}${B.reset}`}}async function _e(e,t){if(e.condition!=null&&e.condition!==``&&!d(e.condition,t))return`${B.yellow}⊘ Condition not met - task would be skipped${B.reset}`;let n=p.join(h.cwd(),e.file);if(!m.existsSync(n))return`${B.red}✗ File not found: ${e.file}${B.reset}`;try{let r=await z(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`${B.cyan}→ No matches found${B.reset}`;let s=H(r,o);return`${B.blue}File: ${e.file}${B.reset}\n${s.join(`
14
+ `)}`}catch(e){return`${B.red}✗ Error: ${e instanceof Error?e.message:String(e)}${B.reset}`}}async function ve(e,t){if(e.condition!=null&&e.condition!==``&&!d(e.condition,t))return`${B.yellow}⊘ Condition not met - task would be skipped${B.reset}`;let n=p.join(h.cwd(),e.file);if(!m.existsSync(n))return`${B.red}✗ File not found: ${e.file}${B.reset}`;try{let r=await z(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`${B.cyan}→ No changes${B.reset}`;let a=H(i,r);return`${B.blue}File: ${e.file}${B.reset}\n${a.join(`
15
+ `)}`}catch(e){return`${B.red}✗ Error: ${e instanceof Error?e.message:String(e)}${B.reset}`}}function ye(e,t){if(e.condition!=null&&e.condition!==``&&!d(e.condition,t))return`${B.yellow}⊘ Condition not met - task would be skipped${B.reset}`;let n=e.paths.map(e=>l(e,t)).filter(e=>m.existsSync(p.join(h.cwd(),e)));return n.length===0?`${B.cyan}→ No files/directories to delete${B.reset}`:`${B.red}Would delete:${B.reset}\n${n.map(e=>`${B.red} - ${e}${B.reset}`).join(`
16
+ `)}`}function be(e,t){if(e.condition!=null&&e.condition!==``&&!d(e.condition,t))return`${B.yellow}⊘ Condition not met - task would be skipped${B.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)?`${B.yellow}⚠ Destination already exists: ${r}${B.reset}\n${B.cyan}Would rename: ${n} → ${r}${B.reset}`:`${B.cyan}Would rename: ${n} → ${r}${B.reset}`:`${B.red}✗ Source not found: ${n}${B.reset}`}function xe(e){if(e.condition!=null&&e.condition!==``)return`${B.yellow}⊘ Condition check skipped in dry-run${B.reset}`;let t=p.join(h.cwd(),`.git`),n=m.existsSync(t),r=[];if(e.removeExisting&&n&&r.push(`${B.red}Would remove existing .git directory${B.reset}`),r.push(`${B.green}Would initialize git repository${B.reset}`),e.initialCommit){let t=e.message??`Initial commit`;r.push(`${B.green}Would create initial commit: "${t}"${B.reset}`)}return r.join(`
17
+ `)}function Se(e,t){if(e.condition!=null&&e.condition!==``&&!d(e.condition,t))return`${B.yellow}⊘ Condition not met - task would be skipped${B.reset}`;let n=l(e.command,t),r=e.cwd==null?h.cwd():l(e.cwd,t);return`${B.yellow}Would execute:${B.reset}\n${B.cyan} Command: ${n}${B.reset}\n${B.cyan} Working directory: ${r}${B.reset}`}function Ce(e,t){if(e.condition!=null&&e.condition!==``&&!d(e.condition,t))return`${B.yellow}⊘ Condition not met - task would be skipped${B.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)?`${B.yellow}⚠ Destination already exists: ${r}${B.reset}\n${B.cyan}Would move: ${n} → ${r}${B.reset}`:`${B.cyan}Would move: ${n} → ${r}${B.reset}`:`${B.red}✗ Source not found: ${n}${B.reset}`}function we(e,t){if(e.condition!=null&&e.condition!==``&&!d(e.condition,t))return`${B.yellow}⊘ Condition not met - task would be skipped${B.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`${B.red}✗ Source not found: ${n}${B.reset}`;let o=m.statSync(i).isDirectory()?`directory`:`file`;return m.existsSync(a)?`${B.yellow}⚠ Destination already exists: ${r}${B.reset}\n${B.cyan}Would copy ${o}: ${n} → ${r}${B.reset}`:`${B.cyan}Would copy ${o}: ${n} → ${r}${B.reset}`}async function Te(e,t,n){if(e.condition!=null&&e.condition!==``&&!d(e.condition,t))return`${B.yellow}⊘ Condition not met - task would be skipped${B.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 L(i,t,n),o=a.split(`
18
+ `).slice(0,10).join(`
19
+ `),s=a.split(`
20
+ `).length>10;return m.existsSync(r)?`${B.blue}File: ${e.file}${B.reset}\n${B.green}+ Would append content${B.reset}\n${B.gray}Content preview:${B.reset}\n${o}${s?`
21
+ ...`:``}`:`${B.blue}File: ${e.file}${B.reset}\n${B.green}+ New file would be created with content${B.reset}\n${B.gray}Content preview:${B.reset}\n${o}${s?`
22
+ ...`:``}`}catch(e){return`${B.red}✗ Error: ${e instanceof Error?e.message:String(e)}${B.reset}`}}function Ee(e,t){if(e.condition!=null&&e.condition!==``&&!d(e.condition,t))return`${B.yellow}⊘ Condition not met - task would be skipped${B.reset}`;let n=l(e.path,t),r=p.join(h.cwd(),n);return m.existsSync(r)?`${B.cyan}→ Directory already exists: ${n}${B.reset}`:`${B.green}+ Would create directory: ${n}${B.reset}`}async function De(e,t){try{switch(e.type){case`update-json`:return await U(e.config,t);case`write`:return await he(e.config,t);case`create`:return await ge(e.config,t,e);case`regex-replace`:return await _e(e.config,t);case`replace-in-file`:return await ve(e.config,t);case`delete`:return ye(e.config,t);case`rename`:return be(e.config,t);case`move`:return Ce(e.config,t);case`copy`:return we(e.config,t);case`append`:return await Te(e.config,t,e);case`mkdir`:return Ee(e.config,t);case`git-init`:return xe(e.config);case`exec`:return Se(e.config,t);default:{let t=e.type;return`${B.yellow}⚠ Diff not available for task type: ${t}${B.reset}`}}}catch(e){return`${B.red}✗ Error generating diff: ${e instanceof Error?e.message:String(e)}${B.reset}`}}async function Oe(e,t){console.log(`${B.blue}═══════════════════════════════════════════════════════${B.reset}`),console.log(`${B.blue} DRY RUN - Preview of changes${B.reset}`),console.log(`${B.blue}═══════════════════════════════════════════════════════${B.reset}`);for(let n of e){console.log(`${B.cyan}▶ Task: ${n.name}${B.reset}`),n.description!=null&&n.description!==``&&console.log(`${B.gray} ${n.description}${B.reset}`);let e=await De(n,t);console.log(e),console.log(`${B.gray}${`─`.repeat(55)}${B.reset}`)}console.log(`${B.blue}═══════════════════════════════════════════════════════${B.reset}`),console.log(`${B.yellow} No changes were applied (dry-run mode)${B.reset}`),console.log(`${B.blue}═══════════════════════════════════════════════════════${B.reset}`)}const W=new Map,G={},K=new Map;function q(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(W.has(e.name))throw TypeError(`Plugin ${e.name} is already registered`);for(let t of e.taskTypes)if(K.has(t)){let e=K.get(t);throw TypeError(`Task type "${t}" is already registered by plugin "${e}"`)}W.set(e.name,e);for(let t of e.taskTypes)K.set(t,e.name);a(`✓ Registered plugin: ${e.name}${e.version==null?``:` v${e.version}`}`,`info`)}function ke(e){let t=W.get(e);if(t!=null){for(let e of t.taskTypes)K.delete(e);W.delete(e)}}function Ae(e){return W.get(e)}function J(e){let t=K.get(e);if(t!=null)return W.get(t)}function Y(e){return K.has(e)}function je(){return Array.from(W.keys())}function Me(){W.clear(),K.clear()}function Ne(e){e.beforeAll!=null&&(G.beforeAll=e.beforeAll),e.afterAll!=null&&(G.afterAll=e.afterAll),e.beforeTask!=null&&(G.beforeTask=e.beforeTask),e.afterTask!=null&&(G.afterTask=e.afterTask),e.onError!=null&&(G.onError=e.onError)}async function X(e,...t){let n=G[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 Pe(e,t,n){let r=J(e.type);if(r==null)throw TypeError(`No plugin found for task type: ${e.type}`);await r.execute(e,t,n)}async function Fe(e,t){let n=J(e.type);if(!(n==null||n.getDiff==null))return n.getDiff(e,t)}function Ie(e){let t=J(e.type);return t==null?[`No plugin found for task type: ${e.type}`]:t.validate==null?[]:t.validate(e)}function Le(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 Z(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 Q(e,t=new Map,n={}){let r={};if(e.length===0)return r;for(let i of e){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 Z(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 Re(e){let t=new Map,n=e.map(async e=>{if(e.default!==void 0){let n=await Z(e.default,e.id);n!==void 0&&t.set(e.id,n)}});return await Promise.all(n),t}function ze(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 Be=g(m.appendFile),Ve=g(m.readFile),He=g(m.stat);async function Ue(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=I(i);if(!o.isValid)throw o.error?.includes(`cannot have both`)?w.templateHasBothTemplateAndFile():w.templateMissingTemplateOrFile();let s=await L(i,t,n),c=!1,l=!1;try{await He(r),c=!0;let t=await Ve(r,`utf-8`);t.length>0&&!t.endsWith(`
23
+ `)&&(l=e.newline!==!1)}catch{}c&&l?await Be(r,`\n${s}`):await Be(r,s),a(`Appended content to ${e.file}`,`success`)}const We={name:`append`,version:`1.0.0`,taskTypes:[`append`],execute:async(e,t,n)=>{n.dryRun||await Ue(e.config,t,e)}},Ge=g(m.copyFile),Ke=g(m.stat),qe=g(m.mkdir),Je=g(m.readdir);async function Ye(e,t){await qe(t,{recursive:!0});let n=await Je(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 Ye(r,i):await Ge(r,i)}))}async function Xe(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 Ke(n)}catch{a(`Source path does not exist: ${n}`,`warn`);return}await qe(p.dirname(r),{recursive:!0}),i.isDirectory()?(await Ye(n,r),a(`Copied directory ${e.from} to ${e.to}`,`success`)):(await Ge(n,r),a(`Copied file ${e.from} to ${e.to}`,`success`))}const Ze={name:`copy`,version:`1.0.0`,taskTypes:[`copy`],execute:async(e,t,n)=>{n.dryRun||await Xe(e.config,t)}},Qe=g(m.writeFile);async function $e(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=I(e);if(!i.isValid)throw i.error?.includes(`cannot have both`)?w.createHasBothTemplateAndFile():w.createMissingTemplateOrFile();let o=await L(e,t,n),s=p.dirname(r);m.existsSync(s)||m.mkdirSync(s,{recursive:!0}),await Qe(r,o),a(`Created file: ${e.file}`,`success`)}const et={name:`create`,version:`1.0.0`,taskTypes:[`create`],execute:async(e,t,n)=>{n.dryRun||await $e(e.config,t,e)}};async function tt(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 nt={name:`delete`,version:`1.0.0`,taskTypes:[`delete`],execute:async(e,t,n)=>{n.dryRun||await tt(e.config,t)}};async function rt(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 it={name:`exec`,version:`1.0.0`,taskTypes:[`exec`],execute:async(e,t,n)=>{n.dryRun||await rt(e.config,t)}};async function at(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 ot={name:`git-init`,version:`1.0.0`,taskTypes:[`git-init`],execute:async(e,t,n)=>{n.dryRun||await at(e.config,t)}},st=g(m.mkdir);async function ct(e,t){if(e.condition!=null&&e.condition!==``&&!d(e.condition,t)){a(`Condition not met, skipping mkdir task`,`info`);return}await st(p.join(h.cwd(),e.path),{recursive:!0}),a(`Created directory: ${e.path}`,`success`)}const lt={name:`mkdir`,version:`1.0.0`,taskTypes:[`mkdir`],execute:async(e,t,n)=>{n.dryRun||await ct(e.config,t)}},ut=g(m.rename),dt=g(m.stat),ft=g(m.mkdir);async function pt(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 dt(n)}catch{a(`Source path does not exist: ${n}`,`warn`);return}await ft(p.dirname(r),{recursive:!0}),await ut(n,r),a(`Moved ${e.from} to ${e.to}`,`success`)}const mt={name:`move`,version:`1.0.0`,taskTypes:[`move`],execute:async(e,t,n)=>{n.dryRun||await pt(e.config,t)}},ht=g(m.readFile),gt=g(m.writeFile);async function _t(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 ht(n,`utf-8`),c=new RegExp(r,i);s=s.replace(c,l(o,t)),await gt(n,s)}const vt={name:`regex-replace`,version:`1.0.0`,taskTypes:[`regex-replace`],execute:async(e,t,n)=>{n.dryRun||await _t(e.config,t)}},yt=g(m.rename);async function bt(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 yt(n,r)}const xt={name:`rename`,version:`1.0.0`,taskTypes:[`rename`],execute:async(e,t,n)=>{n.dryRun||await bt(e.config,t)}},St=g(m.readFile),Ct=g(m.writeFile);async function wt(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 St(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 Ct(n,i)}const Tt={name:`replace-in-file`,version:`1.0.0`,taskTypes:[`replace-in-file`],execute:async(e,t,n)=>{n.dryRun||await wt(e.config,t)}},Et=g(m.readFile),Dt=g(m.writeFile);async function Ot(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 Et(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 Dt(n,`${JSON.stringify(o,null,2)}\n`)}const kt={name:`update-json`,version:`1.0.0`,taskTypes:[`update-json`],execute:async(e,t,n)=>{n.dryRun||await Ot(e.config,t)}},At=g(m.writeFile);async function jt(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=I(e);if(!o.isValid)throw o.error?.includes(`cannot have both`)?w.templateHasBothTemplateAndFile():w.templateMissingTemplateOrFile();let s=await L(e,t,n),c=p.dirname(i);m.existsSync(c)||m.mkdirSync(c,{recursive:!0}),await At(i,s)}const Mt={name:`write`,version:`1.0.0`,taskTypes:[`write`],execute:async(e,t,n)=>{n.dryRun||await jt(e.config,t,e)}};function $(){Y(`update-json`)||(q(kt),q(Mt),q(et),q(vt),q(Tt),q(nt),q(xt),q(ot),q(it),q(mt),q(Ze),q(We),q(lt))}async function Nt(e,t,n=!1){if($(),n){a(`[DRY RUN] Would execute: ${e.name}`,`info`);return}if(Y(e.type)){await Pe(e,t,{dryRun:n});return}throw TypeError(`Unknown task type: ${e.type}`)}async function Pt(e,t,n,r,i=!1){try{return a(`[${n}/${r}] Running: ${e.name}...`,`info`),await Nt(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 Ft(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 It(e){let t=[];for(let n of e)if(!Y(n.type))t.push(`Task "${n.id}" (${n.name}): Unknown task type "${n.type}"`);else if(n.type===`write`){let e=Lt(n);t.push(...e)}return t}function Lt(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=I({...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 Rt(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 zt(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 Bt(e,t){if(e==null)return;if(typeof e!=`object`||!e||Array.isArray(e))return e;let n=e;if(n.type===`exec`){let e=n.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(n.type===`static`)return n.value;return e}async function Vt(e){let t=new Map,n=e.map(async e=>{let t=await Bt(e.value,e.id);return{id:e.id,value:t}}),r=await Promise.all(n);for(let e of r)e.value!==void 0&&t.set(e.id,e.value);return t}function Ht(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" or "exec")`):e.type!==`static`&&e.type!==`exec`&&t.push(`Variable "${r.id}": type must be "static" or "exec", got "${e.type}"`),(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`)}return t}async function Ut(t,n){let r=ne();if(!await o(n.templateEnabled,r)){a(`⊘ Template is disabled - skipping all execution`,`info`);return}$(),a(`Validating task configurations...`,`info`);let i=It(t);i.length>0&&(Rt(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=Ft(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=Ht(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=zt(f,await Vt(f));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=ze(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 Re(g),n={};if(p.length>0&&(a(`📋 Top-level prompts (available to all tasks):`,`info`),n=await Q(p,t,l),Object.assign(l,n)),m.length>0){p.length>0&&a(`📋 Task-specific prompts:`,`info`);let e=await Q(m,t,l);Object.assign(l,e)}}let _=[];for(let e of c)await o(e.enabled,l)&&_.push(e);if(a(`${_.length} of ${c.length} task(s) enabled for execution`,`info`),n.dryRun){await Oe(_,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 X(`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 X(`beforeTask`,t,l),await Pt(t,l,e+1,v,n.dryRun))y++,ee.push(t.id),await X(`afterTask`,t,l);else if(t.required??!0){b++,await X(`onError`,Error(`Task ${t.name} failed`),t);break}else a(`⚠️ Non-critical task failed, continuing...`,`warn`),await X(`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 X(`afterAll`,l),a(`✅ All tasks completed successfully!`,`success`),a(`✓ Completed: ${y}/${v} tasks`,`success`)}const Wt=h.argv.includes(`--dry-run`),Gt=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 Ut(t,{dryRun:Wt,force:Gt,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 Ut(e,{dryRun:t?.dryRun??Wt,force:t?.force??Gt,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{ye as A,N as B,je as C,Ie as D,ke as E,ve as F,pe as G,L as H,De as I,A as J,j as K,U as L,xe as M,_e as N,Oe as O,be as P,he as R,Y as S,q as T,F as U,P as V,I as W,le as Y,Le as _,Bt as a,J as b,Nt as c,ze as d,Re as f,Me as g,X as h,Vt as i,Se as j,ge as k,$ as l,Z as m,qt as n,zt as o,Q as p,me as q,Ht as r,Ft as s,Kt as t,Pt as u,Pe as v,Ne as w,Fe as x,Ae as y,R as z};
@@ -1,4 +1,4 @@
1
- const e=require(`./utils-DvPgyPUm.cjs`);let t=require(`node:fs`);t=e.g(t);let n=require(`node:path`);n=e.g(n);let r=require(`node:process`);r=e.g(r);let i=require(`node:util`);i=e.g(i);let a=require(`node:child_process`);a=e.g(a);let o=require(`@inquirer/prompts`);o=e.g(o);function s(){return{}}var c=class t extends e.h{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.h{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.h{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.h{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.h{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.p.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.d.forPath(n);return p(n,`utf-8`)}async function y(t){try{let n=await fetch(t);if(!n.ok)throw e.u.forUrl(t,n.status,n.statusText);return await n.text()}catch(n){throw n instanceof Error&&n.message.includes(`Failed to fetch`)?n:e.u.forUrl(t,n instanceof Error?n:void 0)}}const b=new Map;async function x(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.m.forTemplateInheritance(a,s);a.add(s);let c;if(o)c=await y(s);else{if(!t.default.existsSync(s))throw e.d.forPath(s);c=await p(s,`utf-8`)}let l;try{l=JSON.parse(c)}catch(t){throw e.f.forFile(s,t instanceof Error?t:Error(String(t)))}if(l.name==null||l.name.trim()===``)throw e.l.missingName(s);if(!/^[a-z\d]+(?:-[a-z\d]+)*$/u.test(l.name))throw e.l.invalidNameFormat(s,l.name);if(l.tasks!==void 0&&!Array.isArray(l.tasks))throw e.l.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 S(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.m.forTemplateInheritance(a,s);a.add(s);let c=await x(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 S(e,l,a);d.push(t)}return re([...d,c])}function ee(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 te(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 ne(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 re(e){if(e.length===0)return{name:`Empty Template`,tasks:[]};if(e.length===1){let t=e[0];return ee(t.tasks??[],t.variables,t.prompts),t}let t=new Map,n=new Map,r=new Map;for(let i of e){if(i.prompts!=null)for(let e of i.prompts)if(r.has(e.id)){if(e.override==null)throw l.forPrompt(e.id);let t=r.get(e.id);r.set(e.id,ne(t,e))}else r.set(e.id,{...e});if(i.variables!=null)for(let e of i.variables)if(n.has(e.id)){if(e.override==null)throw l.forVariable(e.id);let t=n.get(e.id);n.set(e.id,te(t,e))}else n.set(e.id,{...e});for(let e of i.tasks??[])if(t.has(e.id)){if(e.override==null){let n=t.get(e.id);throw l.forTask(e.id,h(n.$sourceUrl),h(e.$sourceUrl))}let n=t.get(e.id);t.set(e.id,oe(n,e))}else t.set(e.id,{...e})}let i=Array.from(t.values()),a=r.size>0?Array.from(r.values()):void 0,o=n.size>0?Array.from(n.values()):void 0;ee(i,o,a);let s=e[e.length-1],c={name:s.name,tasks:i};return s.description!=null&&(c.description=s.description),s.dependencies!=null&&(c.dependencies=s.dependencies),a!=null&&(c.prompts=a),o!=null&&(c.variables=o),c}function ie(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 ae(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 oe(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=ae(t.config,n.config,n.type);let i=ie(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 se(){b.clear()}async function ce(t){e.i(`Loading tasks from ${t}...`,`info`);let n=await S(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),r}function C(e){return e.template!=null&&e.template!==``}function w(e){return e.templateFile!=null&&e.templateFile!==``}function le(e){return e.endsWith(`.hbs`)}function T(e){let t=C(e),n=w(e);return!t&&!n?{isValid:!1,hasInlineTemplate:t,hasTemplateFile:n,error:`Template configuration requires either "template" (inline) or "templateFile" (file path) to be specified`}:t&&n?{isValid:!1,hasInlineTemplate:t,hasTemplateFile:n,error:`Template configuration cannot have both "template" and "templateFile" specified. Use one or the other.`}:{isValid:!0,hasInlineTemplate:t,hasTemplateFile:n}}async function E(t,n,r,i={}){let{enableHandlebars:a=!0,sourceUrl:o=r?.$sourceUrl}=i,s=C(t),c=w(t);if(s)return e.r(t.template,n);if(c){let r=t.templateFile,i=a&&le(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 ue(e){return C(e)?`inline template`:w(e)?`template file: ${e.templateFile}`:`no template source`}const D=(0,i.promisify)(t.default.readFile),de=2,fe=10,pe=55,O={reset:`\x1B[0m`,red:`\x1B[31m`,green:`\x1B[32m`,yellow:`\x1B[33m`,blue:`\x1B[34m`,cyan:`\x1B[36m`,gray:`\x1B[90m`};function k(e,t){switch(t){case`add`:return`${O.green}+ ${e}${O.reset}`;case`remove`:return`${O.red}- ${e}${O.reset}`;case`context`:return`${O.gray} ${e}${O.reset}`;default:return e}}function A(e,t){let n=e.split(`
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 x(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 S(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 x(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 S(e,l,a);d.push(t)}return re([...d,c])}function ee(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 te(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 ne(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 re(e){if(e.length===0)return{name:`Empty Template`,tasks:[]};if(e.length===1){let t=e[0];return ee(t.tasks??[],t.variables,t.prompts),t}let t=new Map,n=new Map,r=new Map;for(let i of e){if(i.prompts!=null)for(let e of i.prompts)if(r.has(e.id)){if(e.override==null)throw l.forPrompt(e.id);let t=r.get(e.id);r.set(e.id,ne(t,e))}else r.set(e.id,{...e});if(i.variables!=null)for(let e of i.variables)if(n.has(e.id)){if(e.override==null)throw l.forVariable(e.id);let t=n.get(e.id);n.set(e.id,te(t,e))}else n.set(e.id,{...e});for(let e of i.tasks??[])if(t.has(e.id)){if(e.override==null){let n=t.get(e.id);throw l.forTask(e.id,h(n.$sourceUrl),h(e.$sourceUrl))}let n=t.get(e.id);t.set(e.id,oe(n,e))}else t.set(e.id,{...e})}let i=Array.from(t.values()),a=r.size>0?Array.from(r.values()):void 0,o=n.size>0?Array.from(n.values()):void 0;ee(i,o,a);let s=e[e.length-1],c={name:s.name,tasks:i};return s.description!=null&&(c.description=s.description),s.dependencies!=null&&(c.dependencies=s.dependencies),a!=null&&(c.prompts=a),o!=null&&(c.variables=o),c}function ie(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 ae(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 oe(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=ae(t.config,n.config,n.type);let i=ie(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 se(){b.clear()}async function ce(t){e.i(`Loading tasks from ${t}...`,`info`);let n=await S(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 C(e){return e.template!=null&&e.template!==``}function w(e){return e.templateFile!=null&&e.templateFile!==``}function le(e){return e.endsWith(`.hbs`)}function T(e){let t=C(e),n=w(e);return!t&&!n?{isValid:!1,hasInlineTemplate:t,hasTemplateFile:n,error:`Template configuration requires either "template" (inline) or "templateFile" (file path) to be specified`}:t&&n?{isValid:!1,hasInlineTemplate:t,hasTemplateFile:n,error:`Template configuration cannot have both "template" and "templateFile" specified. Use one or the other.`}:{isValid:!0,hasInlineTemplate:t,hasTemplateFile:n}}async function E(t,n,r,i={}){let{enableHandlebars:a=!0,sourceUrl:o=r?.$sourceUrl}=i,s=C(t),c=w(t);if(s)return e.r(t.template,n);if(c){let r=t.templateFile,i=a&&le(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 ue(e){return C(e)?`inline template`:w(e)?`template file: ${e.templateFile}`:`no template source`}const D=(0,i.promisify)(t.default.readFile),de=2,fe=10,pe=55,O={reset:`\x1B[0m`,red:`\x1B[31m`,green:`\x1B[32m`,yellow:`\x1B[33m`,blue:`\x1B[34m`,cyan:`\x1B[36m`,gray:`\x1B[90m`};function k(e,t){switch(t){case`add`:return`${O.green}+ ${e}${O.reset}`;case`remove`:return`${O.red}- ${e}${O.reset}`;case`context`:return`${O.gray} ${e}${O.reset}`;default:return e}}function A(e,t){let n=e.split(`
2
2
  `),r=t.split(`
3
3
  `),i=[],a=Math.max(n.length,r.length);for(let e=0;e<a;e++){let t=n[e],a=r[e];t===a?t!==void 0&&i.push(k(t,`context`)):(t!==void 0&&i.push(k(t,`remove`)),a!==void 0&&i.push(k(a,`add`)))}return i}async function j(i,a){if(i.condition!=null&&i.condition!==``&&!e.t(i.condition,a))return`${O.yellow}⊘ Condition not met - task would be skipped${O.reset}`;let o=n.default.join(r.default.cwd(),i.file);if(!t.default.existsSync(o))return`${O.red}✗ File not found: ${i.file}${O.reset}`;try{let t=await D(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`${O.cyan}→ No changes${O.reset}`;let u=A(c,l);return`${O.blue}File: ${i.file}${O.reset}\n${u.join(`
4
4
  `)}`}catch(e){return`${O.red}✗ Error: ${e instanceof Error?e.message:String(e)}${O.reset}`}}async function M(i,a){if(i.condition!=null&&i.condition!==``&&!e.t(i.condition,a))return`${O.yellow}⊘ Condition not met - task would be skipped${O.reset}`;if(i.template==null||i.template===``)return`${O.red}✗ No template content provided for file: ${i.file}${O.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(`
@@ -19,5 +19,5 @@ const e=require(`./utils-DvPgyPUm.cjs`);let t=require(`node:fs`);t=e.g(t);let n=
19
19
  `),r=e.split(`
20
20
  `).length>10;return t.default.existsSync(s)?`${O.blue}File: ${i.file}${O.reset}\n${O.green}+ Would append content${O.reset}\n${O.gray}Content preview:${O.reset}\n${n}${r?`
21
21
  ...`:``}`:`${O.blue}File: ${i.file}${O.reset}\n${O.green}+ New file would be created with content${O.reset}\n${O.gray}Content preview:${O.reset}\n${n}${r?`
22
- ...`:``}`}catch(e){return`${O.red}✗ Error: ${e instanceof Error?e.message:String(e)}${O.reset}`}}function _e(i,a){if(i.condition!=null&&i.condition!==``&&!e.t(i.condition,a))return`${O.yellow}⊘ Condition not met - task would be skipped${O.reset}`;let o=e.r(i.path,a),s=n.default.join(r.default.cwd(),o);return t.default.existsSync(s)?`${O.cyan}→ Directory already exists: ${o}${O.reset}`:`${O.green}+ Would create directory: ${o}${O.reset}`}async function B(e,t){try{switch(e.type){case`update-json`:return await j(e.config,t);case`write`:return await M(e.config,t);case`create`:return await N(e.config,t,e);case`regex-replace`:return await P(e.config,t);case`replace-in-file`:return await F(e.config,t);case`delete`:return I(e.config,t);case`rename`:return L(e.config,t);case`move`:return me(e.config,t);case`copy`:return he(e.config,t);case`append`:return await ge(e.config,t,e);case`mkdir`:return _e(e.config,t);case`git-init`:return R(e.config);case`exec`:return z(e.config,t);default:{let t=e.type;return`${O.yellow}⚠ Diff not available for task type: ${t}${O.reset}`}}}catch(e){return`${O.red}✗ Error generating diff: ${e instanceof Error?e.message:String(e)}${O.reset}`}}async function V(e,t){console.log(`${O.blue}═══════════════════════════════════════════════════════${O.reset}`),console.log(`${O.blue} DRY RUN - Preview of changes${O.reset}`),console.log(`${O.blue}═══════════════════════════════════════════════════════${O.reset}`);for(let n of e){console.log(`${O.cyan}▶ Task: ${n.name}${O.reset}`),n.description!=null&&n.description!==``&&console.log(`${O.gray} ${n.description}${O.reset}`);let e=await B(n,t);console.log(e),console.log(`${O.gray}${`─`.repeat(55)}${O.reset}`)}console.log(`${O.blue}═══════════════════════════════════════════════════════${O.reset}`),console.log(`${O.yellow} No changes were applied (dry-run mode)${O.reset}`),console.log(`${O.blue}═══════════════════════════════════════════════════════${O.reset}`)}const H=new Map,U={},W=new Map;function G(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(H.has(t.name))throw TypeError(`Plugin ${t.name} is already registered`);for(let e of t.taskTypes)if(W.has(e)){let t=W.get(e);throw TypeError(`Task type "${e}" is already registered by plugin "${t}"`)}H.set(t.name,t);for(let e of t.taskTypes)W.set(e,t.name);e.i(`✓ Registered plugin: ${t.name}${t.version==null?``:` v${t.version}`}`,`info`)}function ve(e){let t=H.get(e);if(t!=null){for(let e of t.taskTypes)W.delete(e);H.delete(e)}}function ye(e){return H.get(e)}function K(e){let t=W.get(e);if(t!=null)return H.get(t)}function q(e){return W.has(e)}function be(){return Array.from(H.keys())}function xe(){H.clear(),W.clear()}function Se(e){e.beforeAll!=null&&(U.beforeAll=e.beforeAll),e.afterAll!=null&&(U.afterAll=e.afterAll),e.beforeTask!=null&&(U.beforeTask=e.beforeTask),e.afterTask!=null&&(U.afterTask=e.afterTask),e.onError!=null&&(U.onError=e.onError)}async function J(t,...n){let r=U[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 Y(e,t,n){let r=K(e.type);if(r==null)throw TypeError(`No plugin found for task type: ${e.type}`);await r.execute(e,t,n)}async function Ce(e,t){let n=K(e.type);if(!(n==null||n.getDiff==null))return n.getDiff(e,t)}function we(e){let t=K(e.type);return t==null?[`No plugin found for task type: ${e.type}`]:t.validate==null?[]:t.validate(e)}function Te(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 X(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-wf_LrO7W.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 Z(t,n=new Map,r={}){let i={};if(t.length===0)return i;for(let a of t){let t={...r,...i};if(e.c(a.enabled,t))try{let r,s=n.get(a.id);switch(a.default!==void 0&&(s=await X(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 Ee(e){let t=new Map,n=e.map(async e=>{if(e.default!==void 0){let n=await X(e.default,e.id);n!==void 0&&t.set(e.id,n)}});return await Promise.all(n),t}function De(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 Oe=(0,i.promisify)(t.default.appendFile),ke=(0,i.promisify)(t.default.readFile),Ae=(0,i.promisify)(t.default.stat);async function je(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=T(s);if(!c.isValid)throw c.error?.includes(`cannot have both`)?f.templateHasBothTemplateAndFile():f.templateMissingTemplateOrFile();let l=await E(s,i,a),u=!1,d=!1;try{await Ae(o),u=!0;let e=await ke(o,`utf-8`);e.length>0&&!e.endsWith(`
23
- `)&&(d=t.newline!==!1)}catch{}u&&d?await Oe(o,`\n${l}`):await Oe(o,l),e.i(`Appended content to ${t.file}`,`success`)}const Me={name:`append`,version:`1.0.0`,taskTypes:[`append`],execute:async(e,t,n)=>{n.dryRun||await je(e.config,t,e)}},Ne=(0,i.promisify)(t.default.copyFile),Pe=(0,i.promisify)(t.default.stat),Fe=(0,i.promisify)(t.default.mkdir),Ie=(0,i.promisify)(t.default.readdir);async function Le(e,t){await Fe(t,{recursive:!0});let r=await Ie(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 Le(i,a):await Ne(i,a)}))}async function Re(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 Pe(a)}catch{e.i(`Source path does not exist: ${a}`,`warn`);return}await Fe(n.default.dirname(o),{recursive:!0}),s.isDirectory()?(await Le(a,o),e.i(`Copied directory ${t.from} to ${t.to}`,`success`)):(await Ne(a,o),e.i(`Copied file ${t.from} to ${t.to}`,`success`))}const ze={name:`copy`,version:`1.0.0`,taskTypes:[`copy`],execute:async(e,t,n)=>{n.dryRun||await Re(e.config,t)}},Be=(0,i.promisify)(t.default.writeFile);async function Ve(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=T(i);if(!c.isValid)throw c.error?.includes(`cannot have both`)?f.createHasBothTemplateAndFile():f.createMissingTemplateOrFile();let l=await E(i,a,o),u=n.default.dirname(s);t.default.existsSync(u)||t.default.mkdirSync(u,{recursive:!0}),await Be(s,l),e.i(`Created file: ${i.file}`,`success`)}const He={name:`create`,version:`1.0.0`,taskTypes:[`create`],execute:async(e,t,n)=>{n.dryRun||await Ve(e.config,t,e)}};async function Ue(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 We={name:`delete`,version:`1.0.0`,taskTypes:[`delete`],execute:async(e,t,n)=>{n.dryRun||await Ue(e.config,t)}};async function Ge(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 Ke={name:`exec`,version:`1.0.0`,taskTypes:[`exec`],execute:async(e,t,n)=>{n.dryRun||await Ge(e.config,t)}};async function qe(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 Je={name:`git-init`,version:`1.0.0`,taskTypes:[`git-init`],execute:async(e,t,n)=>{n.dryRun||await qe(e.config,t)}},Ye=(0,i.promisify)(t.default.mkdir);async function Xe(t,i){if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,i)){e.i(`Condition not met, skipping mkdir task`,`info`);return}await Ye(n.default.join(r.default.cwd(),t.path),{recursive:!0}),e.i(`Created directory: ${t.path}`,`success`)}const Ze={name:`mkdir`,version:`1.0.0`,taskTypes:[`mkdir`],execute:async(e,t,n)=>{n.dryRun||await Xe(e.config,t)}},Qe=(0,i.promisify)(t.default.rename),$e=(0,i.promisify)(t.default.stat),et=(0,i.promisify)(t.default.mkdir);async function tt(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 $e(a)}catch{e.i(`Source path does not exist: ${a}`,`warn`);return}await et(n.default.dirname(o),{recursive:!0}),await Qe(a,o),e.i(`Moved ${t.from} to ${t.to}`,`success`)}const nt={name:`move`,version:`1.0.0`,taskTypes:[`move`],execute:async(e,t,n)=>{n.dryRun||await tt(e.config,t)}},rt=(0,i.promisify)(t.default.readFile),it=(0,i.promisify)(t.default.writeFile);async function at(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 rt(a,`utf-8`),u=new RegExp(o,s);l=l.replace(u,e.r(c,i)),await it(a,l)}const ot={name:`regex-replace`,version:`1.0.0`,taskTypes:[`regex-replace`],execute:async(e,t,n)=>{n.dryRun||await at(e.config,t)}},st=(0,i.promisify)(t.default.rename);async function ct(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 st(o,s)}const lt={name:`rename`,version:`1.0.0`,taskTypes:[`rename`],execute:async(e,t,n)=>{n.dryRun||await ct(e.config,t)}},ut=(0,i.promisify)(t.default.readFile),dt=(0,i.promisify)(t.default.writeFile);async function ft(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 ut(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 dt(o,c)}const pt={name:`replace-in-file`,version:`1.0.0`,taskTypes:[`replace-in-file`],execute:async(e,t,n)=>{n.dryRun||await ft(e.config,t)}},mt=(0,i.promisify)(t.default.readFile),ht=(0,i.promisify)(t.default.writeFile),gt=2;async function _t(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 mt(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 ht(a,`${JSON.stringify(c,null,2)}\n`)}const vt={name:`update-json`,version:`1.0.0`,taskTypes:[`update-json`],execute:async(e,t,n)=>{n.dryRun||await _t(e.config,t)}},yt=(0,i.promisify)(t.default.writeFile);async function bt(t,i,a){if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,i)){e.i(`Condition not met, skipping write task`,`info`);return}let o=n.default.join(r.default.cwd(),t.file),s=T(t);if(!s.isValid)throw s.error?.includes(`cannot have both`)?f.templateHasBothTemplateAndFile():f.templateMissingTemplateOrFile();await yt(o,await E(t,i,a))}const xt={name:`write`,version:`1.0.0`,taskTypes:[`write`],execute:async(e,t,n)=>{n.dryRun||await bt(e.config,t,e)}};function Q(){q(`update-json`)||(G(vt),G(xt),G(He),G(ot),G(pt),G(We),G(lt),G(Je),G(Ke),G(nt),G(ze),G(Me),G(Ze))}async function St(t,n,r=!1){if(Q(),r){e.i(`[DRY RUN] Would execute: ${t.name}`,`info`);return}if(q(t.type)){await Y(t,n,{dryRun:r});return}throw TypeError(`Unknown task type: ${t.type}`)}async function Ct(t,n,i,a,o=!1){try{return e.i(`[${i}/${a}] Running: ${t.name}...`,`info`),await St(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 wt(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.m.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 Tt(e){let t=[];for(let n of e)if(!q(n.type))t.push(`Task "${n.id}" (${n.name}): Unknown task type "${n.type}"`);else if(n.type===`write`){let e=Et(n);t.push(...e)}return t}function Et(e){let t=[],n=e.config,r=typeof n.template==`string`?n.template:void 0,i=typeof n.templateFile==`string`?n.templateFile:void 0,a=T({...r!==void 0&&{template:r},...i!==void 0&&{templateFile:i}});return!a.isValid&&a.error!=null&&a.error!==``&&t.push(`Task "${e.id}" (${e.name}): ${a.error}`),(n.file==null||n.file===``)&&t.push(`Task "${e.id}" (${e.name}): Write task requires "file" property to specify the output file path`),t}function Dt(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 Ot(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 kt(t,n){if(t==null)return;if(typeof t!=`object`||!t||Array.isArray(t))return t;let r=t;if(r.type===`exec`){let t=r.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(r.type===`static`)return r.value;return t}async function At(e){let t=new Map,n=e.map(async e=>{let t=await kt(e.value,e.id);return{id:e.id,value:t}}),r=await Promise.all(n);for(let e of r)e.value!==void 0&&t.set(e.id,e.value);return t}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" or "exec")`):e.type!==`static`&&e.type!==`exec`&&t.push(`Variable "${r.id}": type must be "static" or "exec", got "${e.type}"`),(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`)}return t}async function Mt(t,n){Q(),e.i(`Validating task configurations...`,`info`);let i=Tt(t);i.length>0&&(Dt(i),r.default.exit(1)),e.i(`✓ All tasks validated successfully`,`success`);let a=t.filter(t=>e.c(t.enabled,s(),{lazy:!0}));e.i(`Resolving task dependencies...`,`info`);let o=wt(a);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 c=s(),l=n.globalVariables??[],u=[],d=[...l];for(let e of o)if(e.variables&&e.variables.length>0)for(let t of e.variables)u.push(t),d.push(t);if(d.length>0){let t=jt(d);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=Ot(d,await At(d));Object.assign(c,n),Object.keys(n).length>0&&e.i(`✓ Resolved ${Object.keys(n).length} variable(s)`,`success`)}let f=n.globalPrompts??[],p=[],m=[...f];for(let e of o)if(e.prompts&&e.prompts.length>0)for(let t of e.prompts)p.push(t),m.push(t);if(m.length>0){let t=De(m);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 Ee(m),i={};if(f.length>0&&(e.i(`📋 Top-level prompts (available to all tasks):`,`info`),i=await Z(f,n,c),Object.assign(c,i)),p.length>0){f.length>0&&e.i(`📋 Task-specific prompts:`,`info`);let t=await Z(p,n,c);Object.assign(c,t)}}let h=o.filter(t=>e.c(t.enabled,c));if(e.i(`${h.length} of ${o.length} task(s) enabled for execution`,`info`),n.dryRun){await V(h,c),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 J(`beforeAll`,c);let g=h.length,_=0,v=0,y=[];for(let t=0;t<h.length;t++){let r=h[t];if(r!=null)if(await J(`beforeTask`,r,c),await Ct(r,c,t+1,g,n.dryRun))_++,y.push(r.id),await J(`afterTask`,r,c);else if(r.required??!0){v++,await J(`onError`,Error(`Task ${r.name} failed`),r);break}else e.i(`⚠️ Non-critical task failed, continuing...`,`warn`),await J(`onError`,Error(`Task ${r.name} failed`),r)}v>0&&(e.i(`❌ Task execution failed with ${v} critical error(s)`,`error`),e.i(`✓ Completed: ${_}/${g} tasks`,`info`),r.default.exit(1)),await J(`afterAll`,c),e.i(`✅ All tasks completed successfully!`,`success`),e.i(`✓ Completed: ${_}/${g} 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}})}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 I}}),Object.defineProperty(exports,`B`,{enumerable:!0,get:function(){return C}}),Object.defineProperty(exports,`C`,{enumerable:!0,get:function(){return be}}),Object.defineProperty(exports,`D`,{enumerable:!0,get:function(){return we}}),Object.defineProperty(exports,`E`,{enumerable:!0,get:function(){return ve}}),Object.defineProperty(exports,`F`,{enumerable:!0,get:function(){return F}}),Object.defineProperty(exports,`G`,{enumerable:!0,get:function(){return se}}),Object.defineProperty(exports,`H`,{enumerable:!0,get:function(){return E}}),Object.defineProperty(exports,`I`,{enumerable:!0,get:function(){return B}}),Object.defineProperty(exports,`J`,{enumerable:!0,get:function(){return x}}),Object.defineProperty(exports,`K`,{enumerable:!0,get:function(){return S}}),Object.defineProperty(exports,`L`,{enumerable:!0,get:function(){return j}}),Object.defineProperty(exports,`M`,{enumerable:!0,get:function(){return R}}),Object.defineProperty(exports,`N`,{enumerable:!0,get:function(){return P}}),Object.defineProperty(exports,`O`,{enumerable:!0,get:function(){return V}}),Object.defineProperty(exports,`P`,{enumerable:!0,get:function(){return L}}),Object.defineProperty(exports,`R`,{enumerable:!0,get:function(){return M}}),Object.defineProperty(exports,`S`,{enumerable:!0,get:function(){return q}}),Object.defineProperty(exports,`T`,{enumerable:!0,get:function(){return G}}),Object.defineProperty(exports,`U`,{enumerable:!0,get:function(){return le}}),Object.defineProperty(exports,`V`,{enumerable:!0,get:function(){return w}}),Object.defineProperty(exports,`W`,{enumerable:!0,get:function(){return T}}),Object.defineProperty(exports,`Y`,{enumerable:!0,get:function(){return re}}),Object.defineProperty(exports,`_`,{enumerable:!0,get:function(){return Te}}),Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return kt}}),Object.defineProperty(exports,`b`,{enumerable:!0,get:function(){return K}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return St}}),Object.defineProperty(exports,`d`,{enumerable:!0,get:function(){return De}}),Object.defineProperty(exports,`f`,{enumerable:!0,get:function(){return Ee}}),Object.defineProperty(exports,`g`,{enumerable:!0,get:function(){return xe}}),Object.defineProperty(exports,`h`,{enumerable:!0,get:function(){return J}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return At}}),Object.defineProperty(exports,`j`,{enumerable:!0,get:function(){return z}}),Object.defineProperty(exports,`k`,{enumerable:!0,get:function(){return N}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return Q}}),Object.defineProperty(exports,`m`,{enumerable:!0,get:function(){return X}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return Ft}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return Ot}}),Object.defineProperty(exports,`p`,{enumerable:!0,get:function(){return Z}}),Object.defineProperty(exports,`q`,{enumerable:!0,get:function(){return ce}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return jt}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return wt}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return Pt}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return Ct}}),Object.defineProperty(exports,`v`,{enumerable:!0,get:function(){return Y}}),Object.defineProperty(exports,`w`,{enumerable:!0,get:function(){return Se}}),Object.defineProperty(exports,`x`,{enumerable:!0,get:function(){return Ce}}),Object.defineProperty(exports,`y`,{enumerable:!0,get:function(){return ye}}),Object.defineProperty(exports,`z`,{enumerable:!0,get:function(){return ue}});
22
+ ...`:``}`}catch(e){return`${O.red}✗ Error: ${e instanceof Error?e.message:String(e)}${O.reset}`}}function _e(i,a){if(i.condition!=null&&i.condition!==``&&!e.t(i.condition,a))return`${O.yellow}⊘ Condition not met - task would be skipped${O.reset}`;let o=e.r(i.path,a),s=n.default.join(r.default.cwd(),o);return t.default.existsSync(s)?`${O.cyan}→ Directory already exists: ${o}${O.reset}`:`${O.green}+ Would create directory: ${o}${O.reset}`}async function B(e,t){try{switch(e.type){case`update-json`:return await j(e.config,t);case`write`:return await M(e.config,t);case`create`:return await N(e.config,t,e);case`regex-replace`:return await P(e.config,t);case`replace-in-file`:return await F(e.config,t);case`delete`:return I(e.config,t);case`rename`:return L(e.config,t);case`move`:return me(e.config,t);case`copy`:return he(e.config,t);case`append`:return await ge(e.config,t,e);case`mkdir`:return _e(e.config,t);case`git-init`:return R(e.config);case`exec`:return z(e.config,t);default:{let t=e.type;return`${O.yellow}⚠ Diff not available for task type: ${t}${O.reset}`}}}catch(e){return`${O.red}✗ Error generating diff: ${e instanceof Error?e.message:String(e)}${O.reset}`}}async function V(e,t){console.log(`${O.blue}═══════════════════════════════════════════════════════${O.reset}`),console.log(`${O.blue} DRY RUN - Preview of changes${O.reset}`),console.log(`${O.blue}═══════════════════════════════════════════════════════${O.reset}`);for(let n of e){console.log(`${O.cyan}▶ Task: ${n.name}${O.reset}`),n.description!=null&&n.description!==``&&console.log(`${O.gray} ${n.description}${O.reset}`);let e=await B(n,t);console.log(e),console.log(`${O.gray}${`─`.repeat(55)}${O.reset}`)}console.log(`${O.blue}═══════════════════════════════════════════════════════${O.reset}`),console.log(`${O.yellow} No changes were applied (dry-run mode)${O.reset}`),console.log(`${O.blue}═══════════════════════════════════════════════════════${O.reset}`)}const H=new Map,U={},W=new Map;function G(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(H.has(t.name))throw TypeError(`Plugin ${t.name} is already registered`);for(let e of t.taskTypes)if(W.has(e)){let t=W.get(e);throw TypeError(`Task type "${e}" is already registered by plugin "${t}"`)}H.set(t.name,t);for(let e of t.taskTypes)W.set(e,t.name);e.i(`✓ Registered plugin: ${t.name}${t.version==null?``:` v${t.version}`}`,`info`)}function ve(e){let t=H.get(e);if(t!=null){for(let e of t.taskTypes)W.delete(e);H.delete(e)}}function ye(e){return H.get(e)}function K(e){let t=W.get(e);if(t!=null)return H.get(t)}function q(e){return W.has(e)}function be(){return Array.from(H.keys())}function xe(){H.clear(),W.clear()}function Se(e){e.beforeAll!=null&&(U.beforeAll=e.beforeAll),e.afterAll!=null&&(U.afterAll=e.afterAll),e.beforeTask!=null&&(U.beforeTask=e.beforeTask),e.afterTask!=null&&(U.afterTask=e.afterTask),e.onError!=null&&(U.onError=e.onError)}async function J(t,...n){let r=U[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 Y(e,t,n){let r=K(e.type);if(r==null)throw TypeError(`No plugin found for task type: ${e.type}`);await r.execute(e,t,n)}async function Ce(e,t){let n=K(e.type);if(!(n==null||n.getDiff==null))return n.getDiff(e,t)}function we(e){let t=K(e.type);return t==null?[`No plugin found for task type: ${e.type}`]:t.validate==null?[]:t.validate(e)}function Te(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 X(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 Z(t,n=new Map,r={}){let i={};if(t.length===0)return i;for(let a of t){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 X(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 Ee(e){let t=new Map,n=e.map(async e=>{if(e.default!==void 0){let n=await X(e.default,e.id);n!==void 0&&t.set(e.id,n)}});return await Promise.all(n),t}function De(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 Oe=(0,i.promisify)(t.default.appendFile),ke=(0,i.promisify)(t.default.readFile),Ae=(0,i.promisify)(t.default.stat);async function je(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=T(s);if(!c.isValid)throw c.error?.includes(`cannot have both`)?f.templateHasBothTemplateAndFile():f.templateMissingTemplateOrFile();let l=await E(s,i,a),u=!1,d=!1;try{await Ae(o),u=!0;let e=await ke(o,`utf-8`);e.length>0&&!e.endsWith(`
23
+ `)&&(d=t.newline!==!1)}catch{}u&&d?await Oe(o,`\n${l}`):await Oe(o,l),e.i(`Appended content to ${t.file}`,`success`)}const Me={name:`append`,version:`1.0.0`,taskTypes:[`append`],execute:async(e,t,n)=>{n.dryRun||await je(e.config,t,e)}},Ne=(0,i.promisify)(t.default.copyFile),Pe=(0,i.promisify)(t.default.stat),Fe=(0,i.promisify)(t.default.mkdir),Ie=(0,i.promisify)(t.default.readdir);async function Le(e,t){await Fe(t,{recursive:!0});let r=await Ie(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 Le(i,a):await Ne(i,a)}))}async function Re(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 Pe(a)}catch{e.i(`Source path does not exist: ${a}`,`warn`);return}await Fe(n.default.dirname(o),{recursive:!0}),s.isDirectory()?(await Le(a,o),e.i(`Copied directory ${t.from} to ${t.to}`,`success`)):(await Ne(a,o),e.i(`Copied file ${t.from} to ${t.to}`,`success`))}const ze={name:`copy`,version:`1.0.0`,taskTypes:[`copy`],execute:async(e,t,n)=>{n.dryRun||await Re(e.config,t)}},Be=(0,i.promisify)(t.default.writeFile);async function Ve(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=T(i);if(!c.isValid)throw c.error?.includes(`cannot have both`)?f.createHasBothTemplateAndFile():f.createMissingTemplateOrFile();let l=await E(i,a,o),u=n.default.dirname(s);t.default.existsSync(u)||t.default.mkdirSync(u,{recursive:!0}),await Be(s,l),e.i(`Created file: ${i.file}`,`success`)}const He={name:`create`,version:`1.0.0`,taskTypes:[`create`],execute:async(e,t,n)=>{n.dryRun||await Ve(e.config,t,e)}};async function Ue(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 We={name:`delete`,version:`1.0.0`,taskTypes:[`delete`],execute:async(e,t,n)=>{n.dryRun||await Ue(e.config,t)}};async function Ge(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 Ke={name:`exec`,version:`1.0.0`,taskTypes:[`exec`],execute:async(e,t,n)=>{n.dryRun||await Ge(e.config,t)}};async function qe(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 Je={name:`git-init`,version:`1.0.0`,taskTypes:[`git-init`],execute:async(e,t,n)=>{n.dryRun||await qe(e.config,t)}},Ye=(0,i.promisify)(t.default.mkdir);async function Xe(t,i){if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,i)){e.i(`Condition not met, skipping mkdir task`,`info`);return}await Ye(n.default.join(r.default.cwd(),t.path),{recursive:!0}),e.i(`Created directory: ${t.path}`,`success`)}const Ze={name:`mkdir`,version:`1.0.0`,taskTypes:[`mkdir`],execute:async(e,t,n)=>{n.dryRun||await Xe(e.config,t)}},Qe=(0,i.promisify)(t.default.rename),$e=(0,i.promisify)(t.default.stat),et=(0,i.promisify)(t.default.mkdir);async function tt(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 $e(a)}catch{e.i(`Source path does not exist: ${a}`,`warn`);return}await et(n.default.dirname(o),{recursive:!0}),await Qe(a,o),e.i(`Moved ${t.from} to ${t.to}`,`success`)}const nt={name:`move`,version:`1.0.0`,taskTypes:[`move`],execute:async(e,t,n)=>{n.dryRun||await tt(e.config,t)}},rt=(0,i.promisify)(t.default.readFile),it=(0,i.promisify)(t.default.writeFile);async function at(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 rt(a,`utf-8`),u=new RegExp(o,s);l=l.replace(u,e.r(c,i)),await it(a,l)}const ot={name:`regex-replace`,version:`1.0.0`,taskTypes:[`regex-replace`],execute:async(e,t,n)=>{n.dryRun||await at(e.config,t)}},st=(0,i.promisify)(t.default.rename);async function ct(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 st(o,s)}const lt={name:`rename`,version:`1.0.0`,taskTypes:[`rename`],execute:async(e,t,n)=>{n.dryRun||await ct(e.config,t)}},ut=(0,i.promisify)(t.default.readFile),dt=(0,i.promisify)(t.default.writeFile);async function ft(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 ut(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 dt(o,c)}const pt={name:`replace-in-file`,version:`1.0.0`,taskTypes:[`replace-in-file`],execute:async(e,t,n)=>{n.dryRun||await ft(e.config,t)}},mt=(0,i.promisify)(t.default.readFile),ht=(0,i.promisify)(t.default.writeFile),gt=2;async function _t(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 mt(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 ht(a,`${JSON.stringify(c,null,2)}\n`)}const vt={name:`update-json`,version:`1.0.0`,taskTypes:[`update-json`],execute:async(e,t,n)=>{n.dryRun||await _t(e.config,t)}},yt=(0,i.promisify)(t.default.writeFile);async function bt(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=T(i);if(!l.isValid)throw l.error?.includes(`cannot have both`)?f.templateHasBothTemplateAndFile():f.templateMissingTemplateOrFile();let u=await E(i,a,o),d=n.default.dirname(c);t.default.existsSync(d)||t.default.mkdirSync(d,{recursive:!0}),await yt(c,u)}const xt={name:`write`,version:`1.0.0`,taskTypes:[`write`],execute:async(e,t,n)=>{n.dryRun||await bt(e.config,t,e)}};function Q(){q(`update-json`)||(G(vt),G(xt),G(He),G(ot),G(pt),G(We),G(lt),G(Je),G(Ke),G(nt),G(ze),G(Me),G(Ze))}async function St(t,n,r=!1){if(Q(),r){e.i(`[DRY RUN] Would execute: ${t.name}`,`info`);return}if(q(t.type)){await Y(t,n,{dryRun:r});return}throw TypeError(`Unknown task type: ${t.type}`)}async function Ct(t,n,i,a,o=!1){try{return e.i(`[${i}/${a}] Running: ${t.name}...`,`info`),await St(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 wt(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 Tt(e){let t=[];for(let n of e)if(!q(n.type))t.push(`Task "${n.id}" (${n.name}): Unknown task type "${n.type}"`);else if(n.type===`write`){let e=Et(n);t.push(...e)}return t}function Et(e){let t=[],n=e.config,r=typeof n.template==`string`?n.template:void 0,i=typeof n.templateFile==`string`?n.templateFile:void 0,a=T({...r!==void 0&&{template:r},...i!==void 0&&{templateFile:i}});return!a.isValid&&a.error!=null&&a.error!==``&&t.push(`Task "${e.id}" (${e.name}): ${a.error}`),(n.file==null||n.file===``)&&t.push(`Task "${e.id}" (${e.name}): Write task requires "file" property to specify the output file path`),t}function Dt(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 Ot(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 kt(t,n){if(t==null)return;if(typeof t!=`object`||!t||Array.isArray(t))return t;let r=t;if(r.type===`exec`){let t=r.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(r.type===`static`)return r.value;return t}async function At(e){let t=new Map,n=e.map(async e=>{let t=await kt(e.value,e.id);return{id:e.id,value:t}}),r=await Promise.all(n);for(let e of r)e.value!==void 0&&t.set(e.id,e.value);return t}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" or "exec")`):e.type!==`static`&&e.type!==`exec`&&t.push(`Variable "${r.id}": type must be "static" or "exec", got "${e.type}"`),(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`)}return t}async function Mt(t,n){let i=s();if(!await e.l(n.templateEnabled,i)){e.i(`⊘ Template is disabled - skipping all execution`,`info`);return}Q(),e.i(`Validating task configurations...`,`info`);let a=Tt(t);a.length>0&&(Dt(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=wt(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=Ot(f,await At(f));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=De(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 Ee(h),i={};if(p.length>0&&(e.i(`📋 Top-level prompts (available to all tasks):`,`info`),i=await Z(p,n,l),Object.assign(l,i)),m.length>0){p.length>0&&e.i(`📋 Task-specific prompts:`,`info`);let t=await Z(m,n,l);Object.assign(l,t)}}let g=[];for(let t of c)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 V(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 J(`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 J(`beforeTask`,r,l),await Ct(r,l,t+1,_,n.dryRun))v++,b.push(r.id),await J(`afterTask`,r,l);else if(r.required??!0){y++,await J(`onError`,Error(`Task ${r.name} failed`),r);break}else e.i(`⚠️ Non-critical task failed, continuing...`,`warn`),await J(`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 J(`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 I}}),Object.defineProperty(exports,`B`,{enumerable:!0,get:function(){return C}}),Object.defineProperty(exports,`C`,{enumerable:!0,get:function(){return be}}),Object.defineProperty(exports,`D`,{enumerable:!0,get:function(){return we}}),Object.defineProperty(exports,`E`,{enumerable:!0,get:function(){return ve}}),Object.defineProperty(exports,`F`,{enumerable:!0,get:function(){return F}}),Object.defineProperty(exports,`G`,{enumerable:!0,get:function(){return se}}),Object.defineProperty(exports,`H`,{enumerable:!0,get:function(){return E}}),Object.defineProperty(exports,`I`,{enumerable:!0,get:function(){return B}}),Object.defineProperty(exports,`J`,{enumerable:!0,get:function(){return x}}),Object.defineProperty(exports,`K`,{enumerable:!0,get:function(){return S}}),Object.defineProperty(exports,`L`,{enumerable:!0,get:function(){return j}}),Object.defineProperty(exports,`M`,{enumerable:!0,get:function(){return R}}),Object.defineProperty(exports,`N`,{enumerable:!0,get:function(){return P}}),Object.defineProperty(exports,`O`,{enumerable:!0,get:function(){return V}}),Object.defineProperty(exports,`P`,{enumerable:!0,get:function(){return L}}),Object.defineProperty(exports,`R`,{enumerable:!0,get:function(){return M}}),Object.defineProperty(exports,`S`,{enumerable:!0,get:function(){return q}}),Object.defineProperty(exports,`T`,{enumerable:!0,get:function(){return G}}),Object.defineProperty(exports,`U`,{enumerable:!0,get:function(){return le}}),Object.defineProperty(exports,`V`,{enumerable:!0,get:function(){return w}}),Object.defineProperty(exports,`W`,{enumerable:!0,get:function(){return T}}),Object.defineProperty(exports,`Y`,{enumerable:!0,get:function(){return re}}),Object.defineProperty(exports,`_`,{enumerable:!0,get:function(){return Te}}),Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return kt}}),Object.defineProperty(exports,`b`,{enumerable:!0,get:function(){return K}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return St}}),Object.defineProperty(exports,`d`,{enumerable:!0,get:function(){return De}}),Object.defineProperty(exports,`f`,{enumerable:!0,get:function(){return Ee}}),Object.defineProperty(exports,`g`,{enumerable:!0,get:function(){return xe}}),Object.defineProperty(exports,`h`,{enumerable:!0,get:function(){return J}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return At}}),Object.defineProperty(exports,`j`,{enumerable:!0,get:function(){return z}}),Object.defineProperty(exports,`k`,{enumerable:!0,get:function(){return N}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return Q}}),Object.defineProperty(exports,`m`,{enumerable:!0,get:function(){return X}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return Ft}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return Ot}}),Object.defineProperty(exports,`p`,{enumerable:!0,get:function(){return Z}}),Object.defineProperty(exports,`q`,{enumerable:!0,get:function(){return ce}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return jt}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return wt}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return Pt}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return Ct}}),Object.defineProperty(exports,`v`,{enumerable:!0,get:function(){return Y}}),Object.defineProperty(exports,`w`,{enumerable:!0,get:function(){return Se}}),Object.defineProperty(exports,`x`,{enumerable:!0,get:function(){return Ce}}),Object.defineProperty(exports,`y`,{enumerable:!0,get:function(){return ye}}),Object.defineProperty(exports,`z`,{enumerable:!0,get:function(){return ue}});
@@ -0,0 +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};
@@ -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])}},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 +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])}},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`?y(e,t,n?.lazy===!0?{lazy:!0}:void 0):typeof e==`object`&&`condition`in e?y(e.condition,t,n?.lazy===!0?{lazy:!0}:void 0):!1}function p(){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 m(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 h(e,t=!1){return m(`${e} (${t?`Y/n`:`y/N`})`,t?`y`:`n`).then(e=>e.toLowerCase()===`y`||e.toLowerCase()===`yes`)}function g(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,t){return e.replace(/\{\{(?<key>\w+)\}\}/gu,(e,n)=>t[n]?.toString()??``)}function v(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 y(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&&(g(`Failed to evaluate condition: ${e}`,`warn`),t instanceof Error&&g(` Error: ${t.message}`,`warn`)),!1)}}export{m as a,f as c,s as d,u as f,a as h,g as i,d as l,o as m,p as n,h as o,c as p,_ as r,v as s,y as t,l as u};
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};
@@ -0,0 +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;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@pixpilot/scaffoldfy",
3
3
  "type": "module",
4
- "version": "0.20.0",
4
+ "version": "0.22.0",
5
5
  "author": "PixPilot <m.doaie@hotmail.com>",
6
6
  "license": "MIT",
7
7
  "repository": {
@@ -48,10 +48,10 @@
48
48
  "tsdown": "^0.15.8",
49
49
  "typescript": "^5.9.3",
50
50
  "@internal/eslint-config": "0.3.0",
51
- "@internal/prettier-config": "0.0.1",
52
- "@internal/tsconfig": "0.1.0",
53
51
  "@internal/tsdown-config": "0.1.0",
54
- "@internal/vitest-config": "0.1.0"
52
+ "@internal/prettier-config": "0.0.1",
53
+ "@internal/vitest-config": "0.1.0",
54
+ "@internal/tsconfig": "0.1.0"
55
55
  },
56
56
  "prettier": "@internal/prettier-config",
57
57
  "scripts": {
@@ -19,6 +19,47 @@
19
19
  "type": "string",
20
20
  "description": "Detailed description of what this Write does"
21
21
  },
22
+ "enabled": {
23
+ "description": "Whether this template should be executed. Can be a boolean, a string expression, or an object with executable or conditional configuration (optional, defaults to true). If false or condition evaluates to false, the entire template (including prompts, variables, and tasks) will be skipped.",
24
+ "default": true,
25
+ "oneOf": [
26
+ {
27
+ "type": "boolean",
28
+ "description": "Static enabled state"
29
+ },
30
+ {
31
+ "type": "string",
32
+ "description": "JavaScript expression to evaluate. Template only executes if expression evaluates to true."
33
+ },
34
+ {
35
+ "type": "object",
36
+ "description": "Conditional enabled configuration",
37
+ "required": ["condition"],
38
+ "properties": {
39
+ "condition": {
40
+ "type": "string",
41
+ "description": "JavaScript expression to evaluate. Template only executes if condition evaluates to true. Has access to all variables and config values."
42
+ }
43
+ }
44
+ },
45
+ {
46
+ "type": "object",
47
+ "description": "Executable enabled configuration - determines enabled state by running a command",
48
+ "required": ["type", "value"],
49
+ "properties": {
50
+ "type": {
51
+ "type": "string",
52
+ "enum": ["exec"],
53
+ "description": "Type of enabled value. 'exec' executes a shell command to determine enabled state."
54
+ },
55
+ "value": {
56
+ "type": "string",
57
+ "description": "Shell command to execute. The command output will be trimmed and parsed as a boolean. Non-empty output or '1', 'true', 'yes' (case-insensitive) evaluates to true."
58
+ }
59
+ }
60
+ }
61
+ ]
62
+ },
22
63
  "dependencies": {
23
64
  "type": "array",
24
65
  "items": {
@@ -77,16 +118,43 @@
77
118
  "default": true
78
119
  },
79
120
  "enabled": {
80
- "description": "Whether this task should be executed. Can be a boolean, a string expression, or a conditional expression based on variables or prompt values (optional, defaults to true).",
121
+ "description": "Whether this task should be executed. Can be a boolean, a string expression, or an object with executable or conditional configuration (optional, defaults to true).",
81
122
  "default": true,
82
123
  "oneOf": [
83
- { "type": "boolean", "description": "Static enabled state" },
84
- { "type": "string", "description": "JavaScript expression to evaluate" },
124
+ {
125
+ "type": "boolean",
126
+ "description": "Static enabled state"
127
+ },
128
+ {
129
+ "type": "string",
130
+ "description": "JavaScript expression to evaluate. Task only executes if expression evaluates to true."
131
+ },
85
132
  {
86
133
  "type": "object",
87
134
  "description": "Conditional enabled configuration",
88
135
  "required": ["condition"],
89
- "properties": { "condition": { "type": "string" } }
136
+ "properties": {
137
+ "condition": {
138
+ "type": "string",
139
+ "description": "JavaScript expression to evaluate. Task only executes if condition evaluates to true. Has access to all variables and prompt values."
140
+ }
141
+ }
142
+ },
143
+ {
144
+ "type": "object",
145
+ "description": "Executable enabled configuration - determines enabled state by running a command",
146
+ "required": ["type", "value"],
147
+ "properties": {
148
+ "type": {
149
+ "type": "string",
150
+ "enum": ["exec"],
151
+ "description": "Type of enabled value. 'exec' executes a shell command to determine enabled state."
152
+ },
153
+ "value": {
154
+ "type": "string",
155
+ "description": "Shell command to execute. The command output will be trimmed and parsed as a boolean. Non-empty output or '1', 'true', 'yes' (case-insensitive) evaluates to true."
156
+ }
157
+ }
90
158
  }
91
159
  ]
92
160
  },
@@ -210,7 +278,8 @@
210
278
  "description": "Whether the prompt value is required (cannot be empty)"
211
279
  },
212
280
  "enabled": {
213
- "description": "Whether this prompt should be displayed. Can be a boolean, a string expression, or a conditional expression based on variables or other prompt values.",
281
+ "description": "Whether this prompt should be displayed. Can be a boolean, a string expression, or an object with executable or conditional configuration (optional, defaults to true). If false or condition evaluates to false, the prompt will be skipped.",
282
+ "default": true,
214
283
  "oneOf": [
215
284
  {
216
285
  "type": "boolean",
@@ -230,6 +299,22 @@
230
299
  "description": "JavaScript expression to evaluate. Prompt only displays if condition evaluates to true. Has access to all variables and previously collected prompts."
231
300
  }
232
301
  }
302
+ },
303
+ {
304
+ "type": "object",
305
+ "description": "Executable enabled configuration - determines enabled state by running a command",
306
+ "required": ["type", "value"],
307
+ "properties": {
308
+ "type": {
309
+ "type": "string",
310
+ "enum": ["exec"],
311
+ "description": "Type of enabled value. 'exec' executes a shell command to determine enabled state."
312
+ },
313
+ "value": {
314
+ "type": "string",
315
+ "description": "Shell command to execute. The command output will be trimmed and parsed as a boolean. Non-empty output or '1', 'true', 'yes' (case-insensitive) evaluates to true."
316
+ }
317
+ }
233
318
  }
234
319
  ]
235
320
  },
@@ -425,6 +510,11 @@
425
510
  "condition": {
426
511
  "type": "string",
427
512
  "description": "Optional JavaScript expression to evaluate. Task only executes if condition evaluates to true."
513
+ },
514
+ "allowCreate": {
515
+ "type": "boolean",
516
+ "description": "Whether to allow creating the file if it does not exist. Defaults to true.",
517
+ "default": true
428
518
  }
429
519
  },
430
520
  "required": ["file"],
@@ -1,23 +0,0 @@
1
- import{c as e,d as t,f as n,h as r,i,l as a,m as o,p as s,r as c,s as l,t as u,u as d}from"./utils-CGdE7wLi.js";import f from"node:path";import p from"node:fs";import m from"node:process";import{promisify as h}from"node:util";import{execSync as g}from"node:child_process";import{confirm as _,input as v,number as y,password as ee,select as te}from"@inquirer/prompts";function ne(){return{}}var b=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)}},x=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)}},S=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`)}},C=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 w=h(p.readFile),T={template:[[`template`,`templateFile`]]};function E(e){if(e==null||e===``)return`current template`;if(D(e))return e;let t=m.cwd();return e.startsWith(t)?f.relative(t,e):e}function D(e){try{let t=new URL(e);return t.protocol===`http:`||t.protocol===`https:`}catch{return!1}}function ie(e,t){if(D(e))return e;if(t==null||t===``)return f.isAbsolute(e)?e:f.resolve(m.cwd(),e);if(D(t))try{let n=new URL(`.`,t);return new URL(e,n).href}catch{throw s.forRemoteTemplate(e,t)}let n=f.dirname(t);return f.isAbsolute(e)?e:f.resolve(n,e)}async function ae(e){if(D(e))return O(e);if(!p.existsSync(e))throw t.forPath(e);return w(e,`utf-8`)}async function O(e){try{let t=await fetch(e);if(!t.ok)throw d.forUrl(e,t.status,t.statusText);return await t.text()}catch(t){throw t instanceof Error&&t.message.includes(`Failed to fetch`)?t:d.forUrl(e,t instanceof Error?t:void 0)}}const k=new Map;async function oe(e,r=new Set){let i=D(e),s;if(s=i||f.isAbsolute(e)?e:f.resolve(m.cwd(),e),k.has(s))return k.get(s);if(r.has(s))throw o.forTemplateInheritance(r,s);r.add(s);let c;if(i)c=await O(s);else{if(!p.existsSync(s))throw t.forPath(s);c=await w(s,`utf-8`)}let l;try{l=JSON.parse(c)}catch(e){throw n.forFile(s,e instanceof Error?e:Error(String(e)))}if(l.name==null||l.name.trim()===``)throw a.missingName(s);if(!/^[a-z\d]+(?:-[a-z\d]+)*$/u.test(l.name))throw a.invalidNameFormat(s,l.name);if(l.tasks!==void 0&&!Array.isArray(l.tasks))throw a.tasksNotArray(s);l.tasks===void 0&&(l.tasks=[]);for(let e of l.tasks)e.$sourceUrl=s;return k.set(s,l),l}async function A(e,t,n=new Set){let r=D(e),i;if(i=r||f.isAbsolute(e)?e:t==null?f.resolve(m.cwd(),e):D(t)?new URL(e,t).href:f.resolve(t,e),n.has(i))throw o.forTemplateInheritance(n,i);n.add(i);let a=await oe(i);if(a.extends==null||a.extends===``)return a;let s=D(i)?new URL(`.`,i).href:f.dirname(i),c=Array.isArray(a.extends)?a.extends:[a.extends],l=[];for(let e of c){let t=await A(e,s,n);l.push(t)}return ue([...l,a])}function se(e,t,n){let r=new Map;for(let t of e){if(r.has(t.id))throw b.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 b.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 b.forId(e.id,`prompt`,r.get(e.id));r.set(e.id,`prompt`)}}function ce(e,t){if((t.override??`merge`)===`replace`){i(` → Variable "${t.id}" using 'replace' strategy`,`info`);let{override:e,...n}=t;return n}i(` → Variable "${t.id}" merged (value replaced)`,`info`);let n={...e,...t};return delete n.override,n}function le(e,t){if((t.override??`merge`)===`replace`){i(` → Prompt "${t.id}" using 'replace' strategy`,`info`);let{override:e,...n}=t;return n}i(` → Prompt "${t.id}" merged`,`info`);let n={...e,...t};return delete n.override,n}function ue(e){if(e.length===0)return{name:`Empty Template`,tasks:[]};if(e.length===1){let t=e[0];return se(t.tasks??[],t.variables,t.prompts),t}let t=new Map,n=new Map,r=new Map;for(let i of e){if(i.prompts!=null)for(let e of i.prompts)if(r.has(e.id)){if(e.override==null)throw x.forPrompt(e.id);let t=r.get(e.id);r.set(e.id,le(t,e))}else r.set(e.id,{...e});if(i.variables!=null)for(let e of i.variables)if(n.has(e.id)){if(e.override==null)throw x.forVariable(e.id);let t=n.get(e.id);n.set(e.id,ce(t,e))}else n.set(e.id,{...e});for(let e of i.tasks??[])if(t.has(e.id)){if(e.override==null){let n=t.get(e.id);throw x.forTask(e.id,E(n.$sourceUrl),E(e.$sourceUrl))}let n=t.get(e.id);t.set(e.id,pe(n,e))}else t.set(e.id,{...e})}let i=Array.from(t.values()),a=r.size>0?Array.from(r.values()):void 0,o=n.size>0?Array.from(n.values()):void 0;se(i,o,a);let s=e[e.length-1],c={name:s.name,tasks:i};return s.description!=null&&(c.description=s.description),s.dependencies!=null&&(c.dependencies=s.dependencies),a!=null&&(c.prompts=a),o!=null&&(c.variables=o),c}function de(e,t){let n=T[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 fe(e,t,n){let r={...e},i=T[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 pe(e,t){if((t.override??`merge`)===`replace`){i(` → Task "${t.id}" using 'replace' strategy - completely replacing base task`,`info`),i(` Base: ${E(e.$sourceUrl)}`,`info`),i(` Override: ${E(t.$sourceUrl)}`,`info`);let{override:n,...r}=t;return r}i(` → Merging task "${t.id}"`,`info`),i(` Base: ${E(e.$sourceUrl)}`,`info`),i(` Override: ${E(t.$sourceUrl)}`,`info`);let n;if(typeof e.config==`object`&&e.config!==null&&typeof t.config==`object`&&t.config!==null){n=fe(e.config,t.config,t.type);let r=de(t.type,n);r!==null&&r.length>0&&(i(` ⚠️ Warning: Conflicting config fields detected: ${r.join(`, `)}`,`warn`),i(` 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 a=e.variables?[...e.variables]:void 0;if(t.variables&&t.variables.length>0)if(!a)a=[...t.variables];else{let e=new Map(a.map(e=>[e.id,e]));for(let n of t.variables)e.set(n.id,n);a=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},...a!=null&&{variables:a},...s!=null&&{dependencies:s},...c!=null&&{$sourceUrl:c}};return delete l.override,l}function me(){k.clear()}async function he(e){i(`Loading tasks from ${e}...`,`info`);let t=await A(e);i(`Loaded ${t.tasks?.length??0} task(s)`,`info`),t.extends!=null&&t.extends!==``&&i(`Extended from: ${(Array.isArray(t.extends)?t.extends:[t.extends]).join(`, `)}`,`info`),t.prompts!=null&&t.prompts.length>0&&i(`Found ${t.prompts.length} top-level prompt(s)`,`info`),t.variables!=null&&t.variables.length>0&&i(`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),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 c(e.template,t);if(s){let n=e.templateFile,r=i&&N(n),o=await ae(ie(n,a));return r?(await import(`handlebars`)).default.compile(o)(t):c(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=h(p.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 V(e,t){if(e.condition!=null&&e.condition!==``&&!u(e.condition,t))return`${R.yellow}⊘ Condition not met - task would be skipped${R.reset}`;let n=f.join(m.cwd(),e.file);if(!p.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 c(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(`.`)?l(i,t,e):i[t]=e}let s=JSON.stringify(a,null,2),u=JSON.stringify(i,null,2);if(s===u)return`${R.cyan}→ No changes${R.reset}`;let d=B(s,u);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 H(e,t){if(e.condition!=null&&e.condition!==``&&!u(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=f.join(m.cwd(),e.file),r=c(e.template,t);if(!p.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 ge(e,t,n){if(e.condition!=null&&e.condition!==``&&!u(e.condition,t))return`${R.yellow}⊘ Condition not met - task would be skipped${R.reset}`;let r=f.join(m.cwd(),e.file);if(p.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 _e(e,t){if(e.condition!=null&&e.condition!==``&&!u(e.condition,t))return`${R.yellow}⊘ Condition not met - task would be skipped${R.reset}`;let n=f.join(m.cwd(),e.file);if(!p.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=c(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 ve(e,t){if(e.condition!=null&&e.condition!==``&&!u(e.condition,t))return`${R.yellow}⊘ Condition not met - task would be skipped${R.reset}`;let n=f.join(m.cwd(),e.file);if(!p.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=c(n,t),a=c(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 ye(e,t){if(e.condition!=null&&e.condition!==``&&!u(e.condition,t))return`${R.yellow}⊘ Condition not met - task would be skipped${R.reset}`;let n=e.paths.map(e=>c(e,t)).filter(e=>p.existsSync(f.join(m.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 be(e,t){if(e.condition!=null&&e.condition!==``&&!u(e.condition,t))return`${R.yellow}⊘ Condition not met - task would be skipped${R.reset}`;let n=c(e.from,t),r=c(e.to,t),i=f.join(m.cwd(),n),a=f.join(m.cwd(),r);return p.existsSync(i)?p.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 xe(e){if(e.condition!=null&&e.condition!==``)return`${R.yellow}⊘ Condition check skipped in dry-run${R.reset}`;let t=f.join(m.cwd(),`.git`),n=p.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 Se(e,t){if(e.condition!=null&&e.condition!==``&&!u(e.condition,t))return`${R.yellow}⊘ Condition not met - task would be skipped${R.reset}`;let n=c(e.command,t),r=e.cwd==null?m.cwd():c(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 Ce(e,t){if(e.condition!=null&&e.condition!==``&&!u(e.condition,t))return`${R.yellow}⊘ Condition not met - task would be skipped${R.reset}`;let n=c(e.from,t),r=c(e.to,t),i=f.join(m.cwd(),n),a=f.join(m.cwd(),r);return p.existsSync(i)?p.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 we(e,t){if(e.condition!=null&&e.condition!==``&&!u(e.condition,t))return`${R.yellow}⊘ Condition not met - task would be skipped${R.reset}`;let n=c(e.from,t),r=c(e.to,t),i=f.join(m.cwd(),n),a=f.join(m.cwd(),r);if(!p.existsSync(i))return`${R.red}✗ Source not found: ${n}${R.reset}`;let o=p.statSync(i).isDirectory()?`directory`:`file`;return p.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 Te(e,t,n){if(e.condition!=null&&e.condition!==``&&!u(e.condition,t))return`${R.yellow}⊘ Condition not met - task would be skipped${R.reset}`;let r=f.join(m.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 p.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 Ee(e,t){if(e.condition!=null&&e.condition!==``&&!u(e.condition,t))return`${R.yellow}⊘ Condition not met - task would be skipped${R.reset}`;let n=c(e.path,t),r=f.join(m.cwd(),n);return p.existsSync(r)?`${R.cyan}→ Directory already exists: ${n}${R.reset}`:`${R.green}+ Would create directory: ${n}${R.reset}`}async function De(e,t){try{switch(e.type){case`update-json`:return await V(e.config,t);case`write`:return await H(e.config,t);case`create`:return await ge(e.config,t,e);case`regex-replace`:return await _e(e.config,t);case`replace-in-file`:return await ve(e.config,t);case`delete`:return ye(e.config,t);case`rename`:return be(e.config,t);case`move`:return Ce(e.config,t);case`copy`:return we(e.config,t);case`append`:return await Te(e.config,t,e);case`mkdir`:return Ee(e.config,t);case`git-init`:return xe(e.config);case`exec`:return Se(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 Oe(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 De(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 U=new Map,W={},G=new Map;function K(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(U.has(e.name))throw TypeError(`Plugin ${e.name} is already registered`);for(let t of e.taskTypes)if(G.has(t)){let e=G.get(t);throw TypeError(`Task type "${t}" is already registered by plugin "${e}"`)}U.set(e.name,e);for(let t of e.taskTypes)G.set(t,e.name);i(`✓ Registered plugin: ${e.name}${e.version==null?``:` v${e.version}`}`,`info`)}function ke(e){let t=U.get(e);if(t!=null){for(let e of t.taskTypes)G.delete(e);U.delete(e)}}function Ae(e){return U.get(e)}function q(e){let t=G.get(e);if(t!=null)return U.get(t)}function J(e){return G.has(e)}function je(){return Array.from(U.keys())}function Me(){U.clear(),G.clear()}function Ne(e){e.beforeAll!=null&&(W.beforeAll=e.beforeAll),e.afterAll!=null&&(W.afterAll=e.afterAll),e.beforeTask!=null&&(W.beforeTask=e.beforeTask),e.afterTask!=null&&(W.afterTask=e.afterTask),e.onError!=null&&(W.onError=e.onError)}async function Y(e,...t){let n=W[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){i(`Error in ${e} hook: ${t instanceof Error?t.message:String(t)}`,`error`)}}async function Pe(e,t,n){let r=q(e.type);if(r==null)throw TypeError(`No plugin found for task type: ${e.type}`);await r.execute(e,t,n)}async function Fe(e,t){let n=q(e.type);if(!(n==null||n.getDiff==null))return n.getDiff(e,t)}function Ie(e){let t=q(e.type);return t==null?[`No plugin found for task type: ${e.type}`]:t.validate==null?[]:t.validate(e)}function Le(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 X(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)?c(e,n):e;let r=e;if(r.type===`conditional`){if(!n)return;if(typeof r.condition!=`string`){i(`Prompt "${t}": conditional default must have a string condition`,`error`);return}try{let{evaluateCondition:e}=await import(`./utils-BzYLo3gR.js`),t=e(r.condition,n)?r.ifTrue:r.ifFalse;return typeof t==`string`&&/\{\{\w+\}\}/u.test(t)&&(t=c(t,n)),t}catch(e){i(`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`){i(`Prompt "${t}": exec default value must have a string command`,`error`);return}try{let t=g(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){i(`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){i(`Prompt "${t}": unknown default value type "${r.type}". Expected "static", "exec", or "conditional".`,`error`);return}return e}async function Z(t,n=new Map,r={}){let a={};if(t.length===0)return a;for(let o of t){let t={...r,...a};if(e(o.enabled,t))try{let e,r=n.get(o.id);switch(o.default!==void 0&&(r=await X(o.default,o.id,t)),o.type){case`input`:{let t={message:o.message};if(r!==void 0&&(t.default=String(r)),o.required!==void 0&&(t.required=o.required),e=await v(t),o.required&&(e==null||typeof e==`string`&&e.trim()===``))throw i(`${o.message} is required`,`error`),S.required(o.id);break}case`password`:if(e=await ee({message:o.message,mask:`*`}),o.required&&(e==null||typeof e==`string`&&e.trim()===``))throw i(`${o.message} is required`,`error`),S.required(o.id);break;case`number`:{let t={message:o.message};if(r!==void 0&&(t.default=Number(r)),o.required!==void 0&&(t.required=o.required),o.min!==void 0&&(t.min=o.min),o.max!==void 0&&(t.max=o.max),e=await y(t),o.required&&e==null)throw i(`${o.message} is required`,`error`),S.required(o.id);break}case`select`:{let t={message:o.message,choices:o.choices.map(e=>({name:e.name,value:e.value}))};r!==void 0&&(t.default=r),e=await te(t);break}case`confirm`:{let t=r===void 0?!1:!!r;e=await _({message:o.message,default:t});break}default:throw i(`Unknown prompt type: ${o.type}`,`error`),S.unknownType(o.type)}a[o.id]=e}catch(e){throw e instanceof Error&&i(`Failed to collect prompt "${o.id}": ${e.message}`,`error`),e}}return a}async function Re(e){let t=new Map,n=e.map(async e=>{if(e.default!==void 0){let n=await X(e.default,e.id);n!==void 0&&t.set(e.id,n)}});return await Promise.all(n),t}function ze(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 Be=h(p.appendFile),Ve=h(p.readFile),He=h(p.stat);async function Ue(e,t,n){if(e.condition!=null&&e.condition!==``&&!u(e.condition,t)){i(`Condition not met, skipping append task`,`info`);return}let r=f.join(m.cwd(),e.file),a={};e.content==null?e.template!=null&&(a.template=e.template):a.template=e.content,e.templateFile!=null&&(a.templateFile=e.templateFile);let o=P(a);if(!o.isValid)throw o.error?.includes(`cannot have both`)?C.templateHasBothTemplateAndFile():C.templateMissingTemplateOrFile();let s=await F(a,t,n),c=!1,l=!1;try{await He(r),c=!0;let t=await Ve(r,`utf-8`);t.length>0&&!t.endsWith(`
23
- `)&&(l=e.newline!==!1)}catch{}c&&l?await Be(r,`\n${s}`):await Be(r,s),i(`Appended content to ${e.file}`,`success`)}const We={name:`append`,version:`1.0.0`,taskTypes:[`append`],execute:async(e,t,n)=>{n.dryRun||await Ue(e.config,t,e)}},Ge=h(p.copyFile),Ke=h(p.stat),qe=h(p.mkdir),Je=h(p.readdir);async function Ye(e,t){await qe(t,{recursive:!0});let n=await Je(e,{withFileTypes:!0});await Promise.all(n.map(async n=>{let r=f.join(e,n.name),i=f.join(t,n.name);n.isDirectory()?await Ye(r,i):await Ge(r,i)}))}async function Xe(e,t){if(e.condition!=null&&e.condition!==``&&!u(e.condition,t)){i(`Condition not met, skipping copy task`,`info`);return}let n=f.join(m.cwd(),e.from),r=f.join(m.cwd(),e.to),a;try{a=await Ke(n)}catch{i(`Source path does not exist: ${n}`,`warn`);return}await qe(f.dirname(r),{recursive:!0}),a.isDirectory()?(await Ye(n,r),i(`Copied directory ${e.from} to ${e.to}`,`success`)):(await Ge(n,r),i(`Copied file ${e.from} to ${e.to}`,`success`))}const Ze={name:`copy`,version:`1.0.0`,taskTypes:[`copy`],execute:async(e,t,n)=>{n.dryRun||await Xe(e.config,t)}},Qe=h(p.writeFile);async function $e(e,t,n){if(e.condition!=null&&e.condition!==``&&!u(e.condition,t)){i(`Condition not met, skipping create task`,`info`);return}let r=f.join(m.cwd(),e.file);if(p.existsSync(r)){i(`File already exists, skipping: ${e.file}`,`info`);return}let a=P(e);if(!a.isValid)throw a.error?.includes(`cannot have both`)?C.createHasBothTemplateAndFile():C.createMissingTemplateOrFile();let o=await F(e,t,n),s=f.dirname(r);p.existsSync(s)||p.mkdirSync(s,{recursive:!0}),await Qe(r,o),i(`Created file: ${e.file}`,`success`)}const et={name:`create`,version:`1.0.0`,taskTypes:[`create`],execute:async(e,t,n)=>{n.dryRun||await $e(e.config,t,e)}};async function tt(e,t){let{paths:n,condition:r}=e;if(r!=null&&r!==``){if(!t){i(`Condition specified but no config provided, skipping deletion`,`warn`);return}if(!u(r,t)){i(`Condition not met, skipping deletion`,`info`);return}}for(let e of n){let t=f.join(m.cwd(),e);p.existsSync(t)&&p.rmSync(t,{recursive:!0,force:!0})}}const nt={name:`delete`,version:`1.0.0`,taskTypes:[`delete`],execute:async(e,t,n)=>{n.dryRun||await tt(e.config,t)}};async function rt(e,t){if(e.condition!=null&&e.condition!==``){if(!t){i(`Condition specified but no config provided, skipping exec`,`warn`);return}if(!u(e.condition,t)){i(`Condition not met, skipping exec task`,`info`);return}}let n=e.cwd==null?m.cwd():f.join(m.cwd(),e.cwd);g(e.command,{cwd:n,stdio:`inherit`})}const it={name:`exec`,version:`1.0.0`,taskTypes:[`exec`],execute:async(e,t,n)=>{n.dryRun||await rt(e.config,t)}};async function at(e,t){if(e.condition!=null&&e.condition!==``){if(!t){i(`Condition specified but no config provided, skipping git-init`,`warn`);return}if(!u(e.condition,t)){i(`Condition not met, skipping git-init task`,`info`);return}}if(e.removeExisting){let e=f.join(m.cwd(),`.git`);p.existsSync(e)&&p.rmSync(e,{recursive:!0,force:!0})}if(g(`git init`,{stdio:`inherit`}),e.initialCommit){let t=e.message??`Initial commit`;g(`git add .`,{stdio:`inherit`}),g(`git commit -m "${t}"`,{stdio:`inherit`})}}const ot={name:`git-init`,version:`1.0.0`,taskTypes:[`git-init`],execute:async(e,t,n)=>{n.dryRun||await at(e.config,t)}},st=h(p.mkdir);async function ct(e,t){if(e.condition!=null&&e.condition!==``&&!u(e.condition,t)){i(`Condition not met, skipping mkdir task`,`info`);return}await st(f.join(m.cwd(),e.path),{recursive:!0}),i(`Created directory: ${e.path}`,`success`)}const lt={name:`mkdir`,version:`1.0.0`,taskTypes:[`mkdir`],execute:async(e,t,n)=>{n.dryRun||await ct(e.config,t)}},ut=h(p.rename),dt=h(p.stat),ft=h(p.mkdir);async function pt(e,t){if(e.condition!=null&&e.condition!==``&&!u(e.condition,t)){i(`Condition not met, skipping move task`,`info`);return}let n=f.join(m.cwd(),e.from),r=f.join(m.cwd(),e.to);try{await dt(n)}catch{i(`Source path does not exist: ${n}`,`warn`);return}await ft(f.dirname(r),{recursive:!0}),await ut(n,r),i(`Moved ${e.from} to ${e.to}`,`success`)}const mt={name:`move`,version:`1.0.0`,taskTypes:[`move`],execute:async(e,t,n)=>{n.dryRun||await pt(e.config,t)}},ht=h(p.readFile),gt=h(p.writeFile);async function _t(e,t){if(e.condition!=null&&e.condition!==``&&!u(e.condition,t)){i(`Condition not met, skipping regex-replace task`,`info`);return}let n=f.join(m.cwd(),e.file),{pattern:r}=e,a=e.flags??``,o=e.replacement||``,s=await ht(n,`utf-8`),l=new RegExp(r,a);s=s.replace(l,c(o,t)),await gt(n,s)}const vt={name:`regex-replace`,version:`1.0.0`,taskTypes:[`regex-replace`],execute:async(e,t,n)=>{n.dryRun||await _t(e.config,t)}},yt=h(p.rename);async function bt(e,t){if(e.condition!=null&&e.condition!==``&&!u(e.condition,t)){i(`Condition not met, skipping rename task`,`info`);return}let n=f.join(m.cwd(),c(e.from,t)),r=f.join(m.cwd(),c(e.to,t));if(!p.existsSync(n)){i(`Source path does not exist: ${n}`,`warn`);return}await yt(n,r)}const xt={name:`rename`,version:`1.0.0`,taskTypes:[`rename`],execute:async(e,t,n)=>{n.dryRun||await bt(e.config,t)}},St=h(p.readFile),Ct=h(p.writeFile);async function wt(e,t){if(e.condition!=null&&e.condition!==``&&!u(e.condition,t)){i(`Condition not met, skipping replace-in-file task`,`info`);return}let n=f.join(m.cwd(),e.file),{replacements:r}=e;if(!p.existsSync(n)){i(`File not found: ${n}, skipping`,`warn`);return}let a=await St(n,`utf-8`);for(let{find:e,replace:n}of r){let r=c(n,t);a=a.replace(new RegExp(e,`gu`),r)}await Ct(n,a)}const Tt={name:`replace-in-file`,version:`1.0.0`,taskTypes:[`replace-in-file`],execute:async(e,t,n)=>{n.dryRun||await wt(e.config,t)}},Et=h(p.readFile),Dt=h(p.writeFile);async function Ot(e,t){if(e.condition!=null&&e.condition!==``&&!u(e.condition,t)){i(`Condition not met, skipping update-json task`,`info`);return}let n=f.join(m.cwd(),e.file),{updates:r}=e,a=await Et(n,`utf-8`),o=JSON.parse(a);function s(e){if(typeof e==`string`)return c(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(`.`)?l(o,e,n):o[e]=n}await Dt(n,`${JSON.stringify(o,null,2)}\n`)}const kt={name:`update-json`,version:`1.0.0`,taskTypes:[`update-json`],execute:async(e,t,n)=>{n.dryRun||await Ot(e.config,t)}},At=h(p.writeFile);async function jt(e,t,n){if(e.condition!=null&&e.condition!==``&&!u(e.condition,t)){i(`Condition not met, skipping write task`,`info`);return}let r=f.join(m.cwd(),e.file),a=P(e);if(!a.isValid)throw a.error?.includes(`cannot have both`)?C.templateHasBothTemplateAndFile():C.templateMissingTemplateOrFile();await At(r,await F(e,t,n))}const Mt={name:`write`,version:`1.0.0`,taskTypes:[`write`],execute:async(e,t,n)=>{n.dryRun||await jt(e.config,t,e)}};function Q(){J(`update-json`)||(K(kt),K(Mt),K(et),K(vt),K(Tt),K(nt),K(xt),K(ot),K(it),K(mt),K(Ze),K(We),K(lt))}async function Nt(e,t,n=!1){if(Q(),n){i(`[DRY RUN] Would execute: ${e.name}`,`info`);return}if(J(e.type)){await Pe(e,t,{dryRun:n});return}throw TypeError(`Unknown task type: ${e.type}`)}async function $(e,t,n,r,a=!1){try{return i(`[${n}/${r}] Running: ${e.name}...`,`info`),await Nt(e,t,a),i(`✓ ${e.name}`,`success`),!0}catch(t){return i(`✗ Failed: ${e.name}`,`error`),t instanceof Error&&(i(` Reason: ${t.message}`,`error`),t.stack!=null&&m.env.DEBUG!=null&&console.error(t.stack)),(e.required??!0)&&i(` This is a required task. Initialization cannot continue.`,`error`),!1}}function Pt(e){let t=[],n=new Set,r=new Set,i=new Map(e.map(e=>[e.id,e]));function a(e){if(n.has(e))return;if(r.has(e))throw o.forTaskDependency(e);r.add(e);let s=i.get(e);if(!s)throw re.forId(e);if(s.dependencies)for(let e of s.dependencies)a(e);r.delete(e),n.add(e),t.push(s)}for(let t of e)n.has(t.id)||a(t.id);return t}function Ft(e){let t=[];for(let n of e)if(!J(n.type))t.push(`Task "${n.id}" (${n.name}): Unknown task type "${n.type}"`);else if(n.type===`write`){let e=It(n);t.push(...e)}return t}function It(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 Lt(e){i(`❌ Template validation failed:`,`error`),i(``,`error`);for(let t of e)i(` • ${t}`,`error`);i(``,`error`),i(`Please fix these errors before continuing.`,`error`)}function Rt(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 zt(e,t){if(e==null)return;if(typeof e!=`object`||!e||Array.isArray(e))return e;let n=e;if(n.type===`exec`){let e=n.value;if(typeof e!=`string`){i(`Variable "${t}": exec value must have a string command`,`error`);return}try{let t=g(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){i(`Variable "${t}": failed to execute command: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}else if(n.type===`static`)return n.value;return e}async function Bt(e){let t=new Map,n=e.map(async e=>{let t=await zt(e.value,e.id);return{id:e.id,value:t}}),r=await Promise.all(n);for(let e of r)e.value!==void 0&&t.set(e.id,e.value);return t}function Vt(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" or "exec")`):e.type!==`static`&&e.type!==`exec`&&t.push(`Variable "${r.id}": type must be "static" or "exec", got "${e.type}"`),(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`)}return t}async function Ht(t,n){Q(),i(`Validating task configurations...`,`info`);let r=Ft(t);r.length>0&&(Lt(r),m.exit(1)),i(`✓ All tasks validated successfully`,`success`);let a=t.filter(t=>e(t.enabled,ne(),{lazy:!0}));i(`Resolving task dependencies...`,`info`);let o=Pt(a);i(`Welcome! Let's execute your tasks.`,`info`),n.dryRun&&i(`🔍 DRY RUN MODE - No changes will be made`,`warn`),i(`This will execute your project tasks based on the defined configuration.`,`info`);let s=ne(),c=n.globalVariables??[],l=[],u=[...c];for(let e of o)if(e.variables&&e.variables.length>0)for(let t of e.variables)l.push(t),u.push(t);if(u.length>0){let e=Vt(u);e.length>0&&(i(`❌ Variable validation errors:`,`error`),e.forEach(e=>i(` - ${e}`,`error`)),m.exit(1)),i(`Resolving variable values...`,`info`);let t=Rt(u,await Bt(u));Object.assign(s,t),Object.keys(t).length>0&&i(`✓ Resolved ${Object.keys(t).length} variable(s)`,`success`)}let d=n.globalPrompts??[],f=[],p=[...d];for(let e of o)if(e.prompts&&e.prompts.length>0)for(let t of e.prompts)f.push(t),p.push(t);if(p.length>0){let e=ze(p);e.length>0&&(i(`❌ Prompt validation errors:`,`error`),e.forEach(e=>i(` - ${e}`,`error`)),m.exit(1)),i(`Resolving prompt default values...`,`info`);let t=await Re(p),n={};if(d.length>0&&(i(`📋 Top-level prompts (available to all tasks):`,`info`),n=await Z(d,t,s),Object.assign(s,n)),f.length>0){d.length>0&&i(`📋 Task-specific prompts:`,`info`);let e=await Z(f,t,s);Object.assign(s,e)}}let h=o.filter(t=>e(t.enabled,s));if(i(`${h.length} of ${o.length} task(s) enabled for execution`,`info`),n.dryRun){await Oe(h,s),i(`🔍 Dry run completed - no changes were made`,`info`),i(`Run without --dry-run to apply changes`,`info`);return}i(`Starting task execution...`,`info`),await Y(`beforeAll`,s);let g=h.length,_=0,v=0,y=[];for(let e=0;e<h.length;e++){let t=h[e];if(t!=null)if(await Y(`beforeTask`,t,s),await $(t,s,e+1,g,n.dryRun))_++,y.push(t.id),await Y(`afterTask`,t,s);else if(t.required??!0){v++,await Y(`onError`,Error(`Task ${t.name} failed`),t);break}else i(`⚠️ Non-critical task failed, continuing...`,`warn`),await Y(`onError`,Error(`Task ${t.name} failed`),t)}v>0&&(i(`❌ Task execution failed with ${v} critical error(s)`,`error`),i(`✓ Completed: ${_}/${g} tasks`,`info`),m.exit(1)),await Y(`afterAll`,s),i(`✅ All tasks completed successfully!`,`success`),i(`✓ Completed: ${_}/${g} tasks`,`success`)}const Ut=m.argv.includes(`--dry-run`),Wt=m.argv.includes(`--force`);async function Gt(e){try{let t=e||[];t.length===0&&(i(`⚠️ No tasks defined. Use --tasks-file to specify tasks or call runWithTasks() programmatically.`,`warn`),i(`Example: scaffoldfy --tasks-file ./tasks.json`,`info`),m.exit(1)),await Ht(t,{dryRun:Ut,force:Wt,tasksFilePath:void 0})}catch(e){i(`❌ Task execution failed`,`error`),e instanceof Error?(i(`Error: ${e.message}`,`error`),m.env.DEBUG!=null&&console.error(e.stack)):console.error(e),m.exit(1)}}async function Kt(e,t){try{await Ht(e,{dryRun:t?.dryRun??Ut,force:t?.force??Wt,tasksFilePath:t?.tasksFilePath??void 0,...t?.globalVariables!=null&&{globalVariables:t.globalVariables},...t?.globalPrompts!=null&&{globalPrompts:t.globalPrompts}})}catch(e){i(`❌ Task execution failed`,`error`),e instanceof Error?(i(`Error: ${e.message}`,`error`),m.env.DEBUG!=null&&console.error(e.stack)):console.error(e),m.exit(1)}}export{ye as A,j as B,je as C,Ie as D,ke as E,ve as F,me as G,F as H,De as I,oe as J,A as K,V as L,xe as M,_e as N,Oe as O,be as P,H as R,J as S,K as T,N as U,M as V,P as W,ue as Y,Le as _,zt as a,q as b,Nt as c,ze as d,Re as f,Me as g,Y as h,Bt as i,Se as j,ge as k,Q as l,X as m,Kt as n,Rt as o,Z as p,he as q,Vt as r,Pt as s,Gt as t,$ as u,Pe as v,Ne as w,Fe as x,Ae as y,I as z};
@@ -1 +0,0 @@
1
- import{a as e,c as t,i as n,n as r,o as i,r as a,s as o,t as s}from"./utils-CGdE7wLi.js";export{s as evaluateCondition,t as evaluateEnabled,r as getGitRepoInfo,a as interpolateTemplate,n as log,e as prompt,i as promptYesNo,o as setNestedProperty};
@@ -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`?D(e,t,n?.lazy===!0?{lazy:!0}:void 0):typeof e==`object`&&`condition`in e?D(e.condition,t,n?.lazy===!0?{lazy:!0}:void 0):!1}function x(){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 S(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 C(e,t=!1){return S(`${e} (${t?`Y/n`:`y/N`})`,t?`y`:`n`).then(e=>e.toLowerCase()===`y`||e.toLowerCase()===`yes`)}function w(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 T(e,t){return e.replace(/\{\{(?<key>\w+)\}\}/gu,(e,n)=>t[n]?.toString()??``)}function E(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 D(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&&(w(`Failed to evaluate condition: ${e}`,`warn`),t instanceof Error&&w(` Error: ${t.message}`,`warn`)),!1)}}Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return S}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return b}}),Object.defineProperty(exports,`d`,{enumerable:!0,get:function(){return h}}),Object.defineProperty(exports,`f`,{enumerable:!0,get:function(){return v}}),Object.defineProperty(exports,`g`,{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,`h`,{enumerable:!0,get:function(){return p}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return w}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return y}}),Object.defineProperty(exports,`m`,{enumerable:!0,get:function(){return m}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return x}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return C}}),Object.defineProperty(exports,`p`,{enumerable:!0,get:function(){return g}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return T}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return E}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return D}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return _}});
@@ -1 +0,0 @@
1
- const e=require(`./utils-DvPgyPUm.cjs`);exports.evaluateCondition=e.t,exports.evaluateEnabled=e.c,exports.getGitRepoInfo=e.n,exports.interpolateTemplate=e.r,exports.log=e.i,exports.prompt=e.a,exports.promptYesNo=e.o,exports.setNestedProperty=e.s;