@pixpilot/scaffoldfy 0.18.0 → 0.18.1

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-BOEvDxDB.cjs`),t=require(`./src-Cjwkvk6V.cjs`);let n=require(`node:fs`);n=e.v(n);let r=require(`node:path`);r=e.v(r);let i=require(`node:process`);i=e.v(i);let a=require(`commander`);a=e.v(a);const o=1,s=new a.Command,c=r.default.join(__dirname,`..`,`package.json`);let l=`0.0.0`;try{l=JSON.parse(n.default.readFileSync(c,`utf-8`)).version??`0.0.0`}catch{}s.name(`scaffoldfy`).description(`Automate project setup and configuration with customizable tasks`).version(l),s.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`).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.o(`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.o(`⚠️ No tasks found in TypeScript file or invalid format`,`warn`),e.o(`Expected default export or named export "tasks" with TaskDefinition[]`,`info`))}catch(t){e.o(`Failed to load TypeScript tasks file: ${a.tasksTs}`,`error`),t instanceof Error&&e.o(` 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{let n=await t.p(u);o=n.tasks,s=n.variables,c=n.prompts,Array.isArray(o)||(e.o(`❌ Invalid tasks file format`,`error`),e.o(`Expected JSON with { "tasks": [...] } structure`,`info`),i.default.exit(1))}catch(t){e.o(`Failed to load JSON tasks file: ${a.tasksFile}`,`error`),t instanceof Error&&e.o(` Error: ${t.message}`,`error`),i.default.exit(1)}}else e.o(`Tasks file not found: ${a.tasksFile}`,`warn`)}let u=c!=null&&c.length>0||s!=null&&s.length>0;o.length===0&&!u&&(e.o(`❌ No tasks defined`,`error`),e.o(`Please provide tasks using one of these methods:`,`info`),e.o(` 1. Create a template-tasks.json file in the current directory`,`info`),e.o(` 2. Create a template-tasks.ts file in the current directory`,`info`),e.o(` 3. Use --tasks-file option to specify a different JSON file`,`info`),e.o(` 4. Use --tasks-ts option to specify a different TypeScript file`,`info`),e.o(`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.o(`Loaded template with 0 tasks (template may only provide prompts/variables for extending)`,`info`):e.o(`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.o(`❌ CLI execution failed`,`error`),t instanceof Error){e.o(`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)}}),s.parse(i.default.argv);
2
+ const e=require(`./utils-BOEvDxDB.cjs`),t=require(`./src-iPjrb9c_.cjs`);let n=require(`node:fs`);n=e.v(n);let r=require(`node:path`);r=e.v(r);let i=require(`node:process`);i=e.v(i);let a=require(`commander`);a=e.v(a);const o=1,s=new a.Command,c=r.default.join(__dirname,`..`,`package.json`);let l=`0.0.0`;try{l=JSON.parse(n.default.readFileSync(c,`utf-8`)).version??`0.0.0`}catch{}s.name(`scaffoldfy`).description(`Automate project setup and configuration with customizable tasks`).version(l),s.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`).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.o(`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.o(`⚠️ No tasks found in TypeScript file or invalid format`,`warn`),e.o(`Expected default export or named export "tasks" with TaskDefinition[]`,`info`))}catch(t){e.o(`Failed to load TypeScript tasks file: ${a.tasksTs}`,`error`),t instanceof Error&&e.o(` 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{let n=await t.p(u);o=n.tasks,s=n.variables,c=n.prompts,Array.isArray(o)||(e.o(`❌ Invalid tasks file format`,`error`),e.o(`Expected JSON with { "tasks": [...] } structure`,`info`),i.default.exit(1))}catch(t){e.o(`Failed to load JSON tasks file: ${a.tasksFile}`,`error`),t instanceof Error&&e.o(` Error: ${t.message}`,`error`),i.default.exit(1)}}else e.o(`Tasks file not found: ${a.tasksFile}`,`warn`)}let u=c!=null&&c.length>0||s!=null&&s.length>0;o.length===0&&!u&&(e.o(`❌ No tasks defined`,`error`),e.o(`Please provide tasks using one of these methods:`,`info`),e.o(` 1. Create a template-tasks.json file in the current directory`,`info`),e.o(` 2. Create a template-tasks.ts file in the current directory`,`info`),e.o(` 3. Use --tasks-file option to specify a different JSON file`,`info`),e.o(` 4. Use --tasks-ts option to specify a different TypeScript file`,`info`),e.o(`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.o(`Loaded template with 0 tasks (template may only provide prompts/variables for extending)`,`info`):e.o(`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.o(`❌ CLI execution failed`,`error`),t instanceof Error){e.o(`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)}}),s.parse(i.default.argv);
package/dist/cli.js CHANGED
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- import{n as e,p as t}from"./src-Bz_skljF.js";import{o as n}from"./utils-DLJmCo92.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";const c=()=>i(import.meta.url),l=(()=>r.dirname(c()))(),u=new s,d=r.join(l,`..`,`package.json`);let f=`0.0.0`;try{f=JSON.parse(a.readFileSync(d,`utf-8`)).version??`0.0.0`}catch{}u.name(`scaffoldfy`).description(`Automate project setup and configuration with customizable tasks`).version(f),u.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`).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{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)}}),u.parse(o.argv);export{};
2
+ import{n as e,p as t}from"./src-CZesWANQ.js";import{o as n}from"./utils-DLJmCo92.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";const c=()=>i(import.meta.url),l=(()=>r.dirname(c()))(),u=new s,d=r.join(l,`..`,`package.json`);let f=`0.0.0`;try{f=JSON.parse(a.readFileSync(d,`utf-8`)).version??`0.0.0`}catch{}u.name(`scaffoldfy`).description(`Automate project setup and configuration with customizable tasks`).version(f),u.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`).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{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)}}),u.parse(o.argv);export{};
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- const e=require(`./utils-BOEvDxDB.cjs`),t=require(`./src-Cjwkvk6V.cjs`);exports.callHook=t.b,exports.clearPlugins=t.x,exports.clearTemplateCache=t.d,exports.collectPrompts=t.v,exports.collectVariables=t.o,exports.createPlugin=t.S,exports.displayTasksDiff=t.N,exports.evaluateCondition=e.r,exports.executePluginTask=t.C,exports.executeTask=t.c,exports.getDeleteDiff=t.P,exports.getExecDiff=t.F,exports.getGitInitDiff=t.I,exports.getGitRepoInfo=e.i,exports.getPlugin=t.w,exports.getPluginForTaskType=t.T,exports.getPluginTaskDiff=t.E,exports.getRegexReplaceDiff=t.L,exports.getRenameDiff=t.R,exports.getReplaceInFileDiff=t.z,exports.getTaskDiff=t.B,exports.getTemplateDiff=t.V,exports.getUpdateJsonDiff=t.H,exports.interpolateTemplate=e.a,exports.isPluginTaskType=t.D,exports.listPlugins=t.O,exports.loadAndMergeTemplate=t.f,exports.loadTasksWithInheritance=t.p,exports.loadTemplate=t.m,exports.log=e.o,exports.main=t.t,exports.mergeTemplates=t.h,exports.prompt=e.s,exports.promptYesNo=e.c,exports.registerBuiltInPlugins=t.l,exports.registerHooks=t.k,exports.registerPlugin=t.A,exports.resolveAllDefaultValues=t._,exports.resolveAllVariableValues=t.i,exports.resolveDefaultValue=t.y,exports.resolveVariableValue=t.a,exports.runTask=t.u,exports.runWithTasks=t.n,exports.setNestedProperty=e.l,exports.topologicalSort=t.s,exports.unregisterPlugin=t.j,exports.validatePluginTask=t.M,exports.validatePrompts=t.g,exports.validateVariables=t.r;
1
+ const e=require(`./utils-BOEvDxDB.cjs`),t=require(`./src-iPjrb9c_.cjs`);exports.callHook=t.b,exports.clearPlugins=t.x,exports.clearTemplateCache=t.d,exports.collectPrompts=t.v,exports.collectVariables=t.o,exports.createPlugin=t.S,exports.displayTasksDiff=t.N,exports.evaluateCondition=e.r,exports.executePluginTask=t.C,exports.executeTask=t.c,exports.getDeleteDiff=t.P,exports.getExecDiff=t.F,exports.getGitInitDiff=t.I,exports.getGitRepoInfo=e.i,exports.getPlugin=t.w,exports.getPluginForTaskType=t.T,exports.getPluginTaskDiff=t.E,exports.getRegexReplaceDiff=t.L,exports.getRenameDiff=t.R,exports.getReplaceInFileDiff=t.z,exports.getTaskDiff=t.B,exports.getTemplateDiff=t.V,exports.getUpdateJsonDiff=t.H,exports.interpolateTemplate=e.a,exports.isPluginTaskType=t.D,exports.listPlugins=t.O,exports.loadAndMergeTemplate=t.f,exports.loadTasksWithInheritance=t.p,exports.loadTemplate=t.m,exports.log=e.o,exports.main=t.t,exports.mergeTemplates=t.h,exports.prompt=e.s,exports.promptYesNo=e.c,exports.registerBuiltInPlugins=t.l,exports.registerHooks=t.k,exports.registerPlugin=t.A,exports.resolveAllDefaultValues=t._,exports.resolveAllVariableValues=t.i,exports.resolveDefaultValue=t.y,exports.resolveVariableValue=t.a,exports.runTask=t.u,exports.runWithTasks=t.n,exports.setNestedProperty=e.l,exports.topologicalSort=t.s,exports.unregisterPlugin=t.j,exports.validatePluginTask=t.M,exports.validatePrompts=t.g,exports.validateVariables=t.r;
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,H as o,I as s,L as c,M as l,N as u,O as d,P as f,R as p,S as m,T as h,V as g,_,a as v,b as y,c as b,d as x,f as S,g as C,h as w,i as T,j as E,k as D,l as O,m as k,n as A,o as j,p as M,r as N,s as P,t as F,u as I,v as L,w as R,x as z,y as B,z as V}from"./src-Bz_skljF.js";import{a as H,c as U,i as W,l as G,o as K,r as q,s as J}from"./utils-DLJmCo92.js";export{y as callHook,z as clearPlugins,x as clearTemplateCache,L as collectPrompts,j as collectVariables,m as createPlugin,u as displayTasksDiff,q as evaluateCondition,n as executePluginTask,b as executeTask,f as getDeleteDiff,a as getExecDiff,s as getGitInitDiff,W as getGitRepoInfo,R as getPlugin,h as getPluginForTaskType,i as getPluginTaskDiff,c as getRegexReplaceDiff,p as getRenameDiff,V as getReplaceInFileDiff,t as getTaskDiff,g as getTemplateDiff,o as getUpdateJsonDiff,H as interpolateTemplate,r as isPluginTaskType,d as listPlugins,S as loadAndMergeTemplate,M as loadTasksWithInheritance,k as loadTemplate,K as log,F as main,w as mergeTemplates,J as prompt,U as promptYesNo,O as registerBuiltInPlugins,D as registerHooks,e as registerPlugin,_ as resolveAllDefaultValues,T as resolveAllVariableValues,B as resolveDefaultValue,v as resolveVariableValue,I as runTask,A as runWithTasks,G as setNestedProperty,P as topologicalSort,E as unregisterPlugin,l as validatePluginTask,C as validatePrompts,N as validateVariables};
1
+ import{A as e,B as t,C as n,D as r,E as i,F as a,H as o,I as s,L as c,M as l,N as u,O as d,P as f,R as p,S as m,T as h,V as g,_,a as v,b as y,c as b,d as x,f as S,g as C,h as w,i as T,j as E,k as D,l as O,m as k,n as A,o as j,p as M,r as N,s as P,t as F,u as I,v as L,w as R,x as z,y as B,z as V}from"./src-CZesWANQ.js";import{a as H,c as U,i as W,l as G,o as K,r as q,s as J}from"./utils-DLJmCo92.js";export{y as callHook,z as clearPlugins,x as clearTemplateCache,L as collectPrompts,j as collectVariables,m as createPlugin,u as displayTasksDiff,q as evaluateCondition,n as executePluginTask,b as executeTask,f as getDeleteDiff,a as getExecDiff,s as getGitInitDiff,W as getGitRepoInfo,R as getPlugin,h as getPluginForTaskType,i as getPluginTaskDiff,c as getRegexReplaceDiff,p as getRenameDiff,V as getReplaceInFileDiff,t as getTaskDiff,g as getTemplateDiff,o as getUpdateJsonDiff,H as interpolateTemplate,r as isPluginTaskType,d as listPlugins,S as loadAndMergeTemplate,M as loadTasksWithInheritance,k as loadTemplate,K as log,F as main,w as mergeTemplates,J as prompt,U as promptYesNo,O as registerBuiltInPlugins,D as registerHooks,e as registerPlugin,_ as resolveAllDefaultValues,T as resolveAllVariableValues,B as resolveDefaultValue,v as resolveVariableValue,I as runTask,A as runWithTasks,G as setNestedProperty,P as topologicalSort,E as unregisterPlugin,l as validatePluginTask,C as validatePrompts,N as validateVariables};
@@ -0,0 +1,17 @@
1
+ import{_ as e,a as t,d as n,f as r,g as i,h as a,l as o,m as s,n as c,o as l,p as u,r as d,u as f}from"./utils-DLJmCo92.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 ee,password as te,select as ne}from"@inquirer/prompts";function re(){return{}}const b=g(m.readFile),x={reset:`\x1B[0m`,red:`\x1B[31m`,green:`\x1B[32m`,yellow:`\x1B[33m`,blue:`\x1B[34m`,cyan:`\x1B[36m`,gray:`\x1B[90m`};function S(e,t){switch(t){case`add`:return`${x.green}+ ${e}${x.reset}`;case`remove`:return`${x.red}- ${e}${x.reset}`;case`context`:return`${x.gray} ${e}${x.reset}`;default:return e}}function C(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(S(t,`context`)):(t!==void 0&&i.push(S(t,`remove`)),a!==void 0&&i.push(S(a,`add`)))}return i}async function w(e,n){if(e.condition!=null&&e.condition!==``&&!d(e.condition,n))return`${x.yellow}⊘ Condition not met - task would be skipped${x.reset}`;let r=p.join(h.cwd(),e.file);if(!m.existsSync(r))return`${x.red}✗ File not found: ${e.file}${x.reset}`;try{let i=await b(r,`utf-8`),a=JSON.parse(i),s={...a};function c(e){if(typeof e==`string`)return t(e,n);if(Array.isArray(e))return e.map(e=>c(e));if(typeof e==`object`&&e){let t={};for(let[n,r]of Object.entries(e))t[n]=c(r);return t}return e}for(let[t,n]of Object.entries(e.updates)){let e=c(n);t.includes(`.`)?o(a,t,e):a[t]=e}let l=JSON.stringify(s,null,2),u=JSON.stringify(a,null,2);if(l===u)return`${x.cyan}→ No changes${x.reset}`;let d=C(l,u);return`${x.blue}File: ${e.file}${x.reset}\n${d.join(`
4
+ `)}`}catch(e){return`${x.red}✗ Error: ${e instanceof Error?e.message:String(e)}${x.reset}`}}async function T(e,n){if(e.condition!=null&&e.condition!==``&&!d(e.condition,n))return`${x.yellow}⊘ Condition not met - task would be skipped${x.reset}`;if(e.template==null||e.template===``)return`${x.red}✗ No template content provided for file: ${e.file}${x.reset}`;let r=p.join(h.cwd(),e.file),i=t(e.template,n);if(!m.existsSync(r)){let t=i.split(`
5
+ `).slice(0,10).join(`
6
+ `),n=i.split(`
7
+ `).length>10;return`${x.blue}File: ${e.file}${x.reset}\n${x.green}+ New file would be created${x.reset}\n${x.gray}Content preview:${x.reset}\n${t}${n?`
8
+ ...`:``}`}try{let t=await b(r,`utf-8`);if(t===i)return`${x.cyan}→ No changes${x.reset}`;let n=C(t,i);return`${x.blue}File: ${e.file}${x.reset}\n${n.join(`
9
+ `)}`}catch(e){return`${x.red}✗ Error: ${e instanceof Error?e.message:String(e)}${x.reset}`}}async function ie(e,n){if(e.condition!=null&&e.condition!==``&&!d(e.condition,n))return`${x.yellow}⊘ Condition not met - task would be skipped${x.reset}`;let r=p.join(h.cwd(),e.file);if(m.existsSync(r))return`${x.cyan}→ File already exists, would be skipped: ${e.file}${x.reset}`;let i=e.template!=null&&e.template!==``,a=e.templateFile!=null&&e.templateFile!==``;if(!i&&!a)return`${x.red}✗ No template content provided for file: ${e.file}${x.reset}`;try{let r;if(i)r=t(e.template,n);else return`${x.blue}File: ${e.file}${x.reset}\n${x.green}+ New file would be created from template: ${e.templateFile}${x.reset}`;let a=r.split(`
10
+ `).slice(0,10).join(`
11
+ `),o=r.split(`
12
+ `).length>10;return`${x.blue}File: ${e.file}${x.reset}\n${x.green}+ New file would be created${x.reset}\n${x.gray}Content preview:${x.reset}\n${a}${o?`
13
+ ...`:``}`}catch(e){return`${x.red}✗ Error: ${e instanceof Error?e.message:String(e)}${x.reset}`}}async function ae(e,n){if(e.condition!=null&&e.condition!==``&&!d(e.condition,n))return`${x.yellow}⊘ Condition not met - task would be skipped${x.reset}`;let r=p.join(h.cwd(),e.file);if(!m.existsSync(r))return`${x.red}✗ File not found: ${e.file}${x.reset}`;try{let i=await b(r,`utf-8`),a=new RegExp(e.pattern,e.flags??`g`),o=t(e.replacement,n),s=i.replace(a,o);if(i===s)return`${x.cyan}→ No matches found${x.reset}`;let c=C(i,s);return`${x.blue}File: ${e.file}${x.reset}\n${c.join(`
14
+ `)}`}catch(e){return`${x.red}✗ Error: ${e instanceof Error?e.message:String(e)}${x.reset}`}}async function oe(e,n){if(e.condition!=null&&e.condition!==``&&!d(e.condition,n))return`${x.yellow}⊘ Condition not met - task would be skipped${x.reset}`;let r=p.join(h.cwd(),e.file);if(!m.existsSync(r))return`${x.red}✗ File not found: ${e.file}${x.reset}`;try{let i=await b(r,`utf-8`),a=i;for(let{find:r,replace:a}of e.replacements){let e=t(r,n),o=t(a,n);i=i.replace(e,o)}if(a===i)return`${x.cyan}→ No changes${x.reset}`;let o=C(a,i);return`${x.blue}File: ${e.file}${x.reset}\n${o.join(`
15
+ `)}`}catch(e){return`${x.red}✗ Error: ${e instanceof Error?e.message:String(e)}${x.reset}`}}function se(e,n){if(e.condition!=null&&e.condition!==``&&!d(e.condition,n))return`${x.yellow}⊘ Condition not met - task would be skipped${x.reset}`;let r=e.paths.map(e=>t(e,n)).filter(e=>m.existsSync(p.join(h.cwd(),e)));return r.length===0?`${x.cyan}→ No files/directories to delete${x.reset}`:`${x.red}Would delete:${x.reset}\n${r.map(e=>`${x.red} - ${e}${x.reset}`).join(`
16
+ `)}`}function E(e,n){if(e.condition!=null&&e.condition!==``&&!d(e.condition,n))return`${x.yellow}⊘ Condition not met - task would be skipped${x.reset}`;let r=t(e.from,n),i=t(e.to,n),a=p.join(h.cwd(),r),o=p.join(h.cwd(),i);return m.existsSync(a)?m.existsSync(o)?`${x.yellow}⚠ Destination already exists: ${i}${x.reset}\n${x.cyan}Would rename: ${r} → ${i}${x.reset}`:`${x.cyan}Would rename: ${r} → ${i}${x.reset}`:`${x.red}✗ Source not found: ${r}${x.reset}`}function D(e){if(e.condition!=null&&e.condition!==``)return`${x.yellow}⊘ Condition check skipped in dry-run${x.reset}`;let t=p.join(h.cwd(),`.git`),n=m.existsSync(t),r=[];if(e.removeExisting&&n&&r.push(`${x.red}Would remove existing .git directory${x.reset}`),r.push(`${x.green}Would initialize git repository${x.reset}`),e.initialCommit){let t=e.message??`Initial commit`;r.push(`${x.green}Would create initial commit: "${t}"${x.reset}`)}return r.join(`
17
+ `)}function O(e,n){if(e.condition!=null&&e.condition!==``&&!d(e.condition,n))return`${x.yellow}⊘ Condition not met - task would be skipped${x.reset}`;let r=t(e.command,n),i=e.cwd==null?h.cwd():t(e.cwd,n);return`${x.yellow}Would execute:${x.reset}\n${x.cyan} Command: ${r}${x.reset}\n${x.cyan} Working directory: ${i}${x.reset}`}async function k(e,t){try{switch(e.type){case`update-json`:return await w(e.config,t);case`template`:return await T(e.config,t);case`create`:return await ie(e.config,t);case`regex-replace`:return await ae(e.config,t);case`replace-in-file`:return await oe(e.config,t);case`delete`:return se(e.config,t);case`rename`:return E(e.config,t);case`git-init`:return D(e.config);case`exec`:return O(e.config,t);default:{let t=e.type;return`${x.yellow}⚠ Diff not available for task type: ${t}${x.reset}`}}}catch(e){return`${x.red}✗ Error generating diff: ${e instanceof Error?e.message:String(e)}${x.reset}`}}async function A(e,t){console.log(`${x.blue}═══════════════════════════════════════════════════════${x.reset}`),console.log(`${x.blue} DRY RUN - Preview of changes${x.reset}`),console.log(`${x.blue}═══════════════════════════════════════════════════════${x.reset}`);for(let n of e){console.log(`${x.cyan}▶ Task: ${n.name}${x.reset}`),n.description!=null&&n.description!==``&&console.log(`${x.gray} ${n.description}${x.reset}`);let e=await k(n,t);console.log(e),console.log(`${x.gray}${`─`.repeat(55)}${x.reset}`)}console.log(`${x.blue}═══════════════════════════════════════════════════════${x.reset}`),console.log(`${x.yellow} No changes were applied (dry-run mode)${x.reset}`),console.log(`${x.blue}═══════════════════════════════════════════════════════${x.reset}`)}const j=new Map,M={},N=new Map;function P(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(j.has(e.name))throw TypeError(`Plugin ${e.name} is already registered`);for(let t of e.taskTypes)if(N.has(t)){let e=N.get(t);throw TypeError(`Task type "${t}" is already registered by plugin "${e}"`)}j.set(e.name,e);for(let t of e.taskTypes)N.set(t,e.name);l(`✓ Registered plugin: ${e.name}${e.version==null?``:` v${e.version}`}`,`info`)}function ce(e){let t=j.get(e);if(t!=null){for(let e of t.taskTypes)N.delete(e);j.delete(e)}}function le(e){return j.get(e)}function F(e){let t=N.get(e);if(t!=null)return j.get(t)}function I(e){return N.has(e)}function ue(){return Array.from(j.keys())}function de(){j.clear(),N.clear()}function fe(e){e.beforeAll!=null&&(M.beforeAll=e.beforeAll),e.afterAll!=null&&(M.afterAll=e.afterAll),e.beforeTask!=null&&(M.beforeTask=e.beforeTask),e.afterTask!=null&&(M.afterTask=e.afterTask),e.onError!=null&&(M.onError=e.onError)}async function L(e,...t){let n=M[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){l(`Error in ${e} hook: ${t instanceof Error?t.message:String(t)}`,`error`)}}async function pe(e,t,n){let r=F(e.type);if(r==null)throw TypeError(`No plugin found for task type: ${e.type}`);await r.execute(e,t,n)}async function me(e,t){let n=F(e.type);if(!(n==null||n.getDiff==null))return n.getDiff(e,t)}function he(e){let t=F(e.type);return t==null?[`No plugin found for task type: ${e.type}`]:t.validate==null?[]:t.validate(e)}function ge(e,t,n,r){return{name:e,...r?.version!=null&&{version:r.version},taskTypes:[t],execute:n,...r?.getDiff!=null&&{getDiff:r.getDiff},...r?.validate!=null&&{validate:r.validate}}}var _e=class t extends e{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)}},R=class t extends e{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`)}},z=class t extends e{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`)}};async function B(e,n,r){if(e===void 0)return;if(typeof e!=`object`||!e||Array.isArray(e))return typeof e==`string`&&r&&/\{\{\w+\}\}/u.test(e)?t(e,r):e;let i=e;if(i.type===`conditional`){if(!r){l(`Prompt "${n}": conditional default requires context but none was provided`,`warn`);return}if(typeof i.condition!=`string`){l(`Prompt "${n}": conditional default must have a string condition`,`error`);return}try{let{evaluateCondition:e}=await import(`./utils-B8XKlHJ4.js`),n=e(i.condition,r)?i.ifTrue:i.ifFalse;return typeof n==`string`&&/\{\{\w+\}\}/u.test(n)&&(n=t(n,r)),n}catch(e){l(`Prompt "${n}": failed to evaluate conditional default: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}if(i.type===`exec`){let e=i.value;if(typeof e!=`string`){l(`Prompt "${n}": 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){l(`Prompt "${n}": failed to execute default value command: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}else if(i.type===`static`)return i.value;else if(i.type!==void 0){l(`Prompt "${n}": unknown default value type "${i.type}". Expected "static", "exec", or "conditional".`,`error`);return}return e}async function V(e,t=new Map,n={}){let r={};if(e.length===0)return r;for(let i of e){let e={...n,...r};if(f(i.enabled,e))try{let n,a=t.get(i.id);switch(i.default!==void 0&&(a=await B(i.default,i.id,e)),i.type){case`input`:{let e={message:i.message};if(a!==void 0&&(e.default=String(a)),i.required!==void 0&&(e.required=i.required),n=await y(e),i.required&&(n==null||typeof n==`string`&&n.trim()===``))throw l(`${i.message} is required`,`error`),R.required(i.id);break}case`password`:if(n=await te({message:i.message,mask:`*`}),i.required&&(n==null||typeof n==`string`&&n.trim()===``))throw l(`${i.message} is required`,`error`),R.required(i.id);break;case`number`:{let e={message:i.message};if(a!==void 0&&(e.default=Number(a)),i.required!==void 0&&(e.required=i.required),i.min!==void 0&&(e.min=i.min),i.max!==void 0&&(e.max=i.max),n=await ee(e),i.required&&n==null)throw l(`${i.message} is required`,`error`),R.required(i.id);break}case`select`:{let e={message:i.message,choices:i.choices.map(e=>({name:e.name,value:e.value}))};a!==void 0&&(e.default=a),n=await ne(e);break}case`confirm`:{let e=a===void 0?!1:!!a;n=await v({message:i.message,default:e});break}default:throw l(`Unknown prompt type: ${i.type}`,`error`),R.unknownType(i.type)}r[i.id]=n}catch(e){throw e instanceof Error&&l(`Failed to collect prompt "${i.id}": ${e.message}`,`error`),e}}return r}async function H(e){let t=new Map,n=e.map(async e=>{if(e.default!==void 0){let n=await B(e.default,e.id);n!==void 0&&t.set(e.id,n)}});return await Promise.all(n),t}function U(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 ve=g(m.writeFile);async function ye(e,n){if(e.condition!=null&&e.condition!==``&&!d(e.condition,n)){l(`Condition not met, skipping create task`,`info`);return}let r=p.join(h.cwd(),e.file);if(m.existsSync(r)){l(`File already exists, skipping: ${e.file}`,`info`);return}let i=e.template!=null&&e.template!==``,a=e.templateFile!=null&&e.templateFile!==``;if(!i&&!a)throw z.createMissingTemplateOrFile();if(i&&a)throw z.createHasBothTemplateAndFile();let o;if(a&&e.templateFile.endsWith(`.hbs`))o=c(e.templateFile,n);else if(a){let r=e.templateFile,i=p.isAbsolute(r)?r:p.join(h.cwd(),r);if(!m.existsSync(i))throw u.forPath(r);o=t(m.readFileSync(i,`utf-8`),n)}else o=t(e.template,n);let s=p.dirname(r);m.existsSync(s)||m.mkdirSync(s,{recursive:!0}),await ve(r,o),l(`Created file: ${e.file}`,`success`)}const be={name:`create`,version:`1.0.0`,taskTypes:[`create`],execute:async(e,t,n)=>{n.dryRun||await ye(e.config,t)}};async function xe(e,t){let{paths:n,condition:r}=e;if(r!=null&&r!==``){if(!t){l(`Condition specified but no config provided, skipping deletion`,`warn`);return}if(!d(r,t)){l(`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 Se={name:`delete`,version:`1.0.0`,taskTypes:[`delete`],execute:async(e,t,n)=>{n.dryRun||await xe(e.config,t)}};async function Ce(e,t){if(e.condition!=null&&e.condition!==``){if(!t){l(`Condition specified but no config provided, skipping exec`,`warn`);return}if(!d(e.condition,t)){l(`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 we={name:`exec`,version:`1.0.0`,taskTypes:[`exec`],execute:async(e,t,n)=>{n.dryRun||await Ce(e.config,t)}};async function Te(e,t){if(e.condition!=null&&e.condition!==``){if(!t){l(`Condition specified but no config provided, skipping git-init`,`warn`);return}if(!d(e.condition,t)){l(`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 Ee={name:`git-init`,version:`1.0.0`,taskTypes:[`git-init`],execute:async(e,t,n)=>{n.dryRun||await Te(e.config,t)}},De=g(m.readFile),Oe=g(m.writeFile);async function ke(e,n){if(e.condition!=null&&e.condition!==``&&!d(e.condition,n)){l(`Condition not met, skipping regex-replace task`,`info`);return}let r=p.join(h.cwd(),e.file),{pattern:i}=e,a=e.flags??``,o=e.replacement||``,s=await De(r,`utf-8`),c=new RegExp(i,a);s=s.replace(c,t(o,n)),await Oe(r,s)}const Ae={name:`regex-replace`,version:`1.0.0`,taskTypes:[`regex-replace`],execute:async(e,t,n)=>{n.dryRun||await ke(e.config,t)}},je=g(m.rename);async function Me(e,n){if(e.condition!=null&&e.condition!==``&&!d(e.condition,n)){l(`Condition not met, skipping rename task`,`info`);return}let r=p.join(h.cwd(),t(e.from,n)),i=p.join(h.cwd(),t(e.to,n));if(!m.existsSync(r)){l(`Source path does not exist: ${r}`,`warn`);return}await je(r,i)}const Ne={name:`rename`,version:`1.0.0`,taskTypes:[`rename`],execute:async(e,t,n)=>{n.dryRun||await Me(e.config,t)}},Pe=g(m.readFile),Fe=g(m.writeFile);async function Ie(e,n){if(e.condition!=null&&e.condition!==``&&!d(e.condition,n)){l(`Condition not met, skipping replace-in-file task`,`info`);return}let r=p.join(h.cwd(),e.file),{replacements:i}=e;if(!m.existsSync(r)){l(`File not found: ${r}, skipping`,`warn`);return}let a=await Pe(r,`utf-8`);for(let{find:e,replace:r}of i){let i=t(r,n);a=a.replace(new RegExp(e,`gu`),i)}await Fe(r,a)}const Le={name:`replace-in-file`,version:`1.0.0`,taskTypes:[`replace-in-file`],execute:async(e,t,n)=>{n.dryRun||await Ie(e.config,t)}};var W=class t extends e{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)}},G=class t extends e{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`)}};const K=g(m.readFile),q={template:[[`template`,`templateFile`]]};function J(e){if(e==null||e===``)return`current template`;if(Y(e))return e;let t=h.cwd();return e.startsWith(t)?p.relative(t,e):e}function Y(e){try{let t=new URL(e);return t.protocol===`http:`||t.protocol===`https:`}catch{return!1}}function Re(e,t){if(Y(e))return e;if(t==null||t===``)return p.isAbsolute(e)?e:p.resolve(h.cwd(),e);if(Y(t))try{let n=new URL(`.`,t);return new URL(e,n).href}catch{throw a.forRemoteTemplate(e,t)}let n=p.dirname(t);return p.isAbsolute(e)?e:p.resolve(n,e)}async function ze(e){if(Y(e))return Be(e);if(!m.existsSync(e))throw u.forPath(e);return K(e,`utf-8`)}async function Be(e){try{let t=await fetch(e);if(!t.ok)throw r.forUrl(e,t.status,t.statusText);return await t.text()}catch(t){throw t instanceof Error&&t.message.includes(`Failed to fetch`)?t:r.forUrl(e,t instanceof Error?t:void 0)}}const X=new Map;async function Ve(e,t=new Set){let r=Y(e),a;if(a=r||p.isAbsolute(e)?e:p.resolve(h.cwd(),e),X.has(a))return X.get(a);if(t.has(a))throw i.forTemplateInheritance(t,a);t.add(a);let o;if(r)o=await Be(a);else{if(!m.existsSync(a))throw u.forPath(a);o=await K(a,`utf-8`)}let c;try{c=JSON.parse(o)}catch(e){throw s.forFile(a,e instanceof Error?e:Error(String(e)))}if(c.name==null||c.name.trim()===``)throw n.missingName(a);if(!/^[a-z\d]+(?:-[a-z\d]+)*$/u.test(c.name))throw n.invalidNameFormat(a,c.name);if(c.tasks!==void 0&&!Array.isArray(c.tasks))throw n.tasksNotArray(a);c.tasks===void 0&&(c.tasks=[]);for(let e of c.tasks)e.$sourceUrl=a;return X.set(a,c),c}async function Z(e,t,n=new Set){let r=Y(e),a;if(a=r||p.isAbsolute(e)?e:t==null?p.resolve(h.cwd(),e):Y(t)?new URL(e,t).href:p.resolve(t,e),n.has(a))throw i.forTemplateInheritance(n,a);n.add(a);let o=await Ve(a);if(o.extends==null||o.extends===``)return o;let s=Y(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 Z(e,s,n);l.push(t)}return Ge([...l,o])}function He(e,t,n){let r=new Map;for(let t of e){if(r.has(t.id))throw W.forId(t.id,`task`,r.get(t.id));r.set(t.id,`task`)}if(t!=null)for(let e of t){if(r.has(e.id))throw W.forId(e.id,`variable`,r.get(e.id));r.set(e.id,`variable`)}if(n!=null)for(let e of n){if(r.has(e.id))throw W.forId(e.id,`prompt`,r.get(e.id));r.set(e.id,`prompt`)}}function Ue(e,t){if((t.override??`merge`)===`replace`){l(` → Variable "${t.id}" using 'replace' strategy`,`info`);let{override:e,...n}=t;return n}l(` → Variable "${t.id}" merged (value replaced)`,`info`);let n={...e,...t};return delete n.override,n}function We(e,t){if((t.override??`merge`)===`replace`){l(` → Prompt "${t.id}" using 'replace' strategy`,`info`);let{override:e,...n}=t;return n}l(` → Prompt "${t.id}" merged`,`info`);let n={...e,...t};return delete n.override,n}function Ge(e){if(e.length===0)return{name:`Empty Template`,tasks:[]};if(e.length===1){let t=e[0];return He(t.tasks??[],t.variables,t.prompts),t}let t=new Map,n=new Map,r=new Map;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 G.forPrompt(e.id);let t=r.get(e.id);r.set(e.id,We(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 G.forVariable(e.id);let t=n.get(e.id);n.set(e.id,Ue(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 G.forTask(e.id,J(n.$sourceUrl),J(e.$sourceUrl))}let n=t.get(e.id);t.set(e.id,Je(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;He(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 Ke(e,t){let n=q[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 qe(e,t,n){let r={...e},i=q[n]??[];for(let[e,n]of Object.entries(t)){for(let t of i)if(t.includes(e)){for(let n of t)n!==e&&delete r[n];break}r[e]=n}return r}function Je(e,t){if((t.override??`merge`)===`replace`){l(` → Task "${t.id}" using 'replace' strategy - completely replacing base task`,`info`),l(` Base: ${J(e.$sourceUrl)}`,`info`),l(` Override: ${J(t.$sourceUrl)}`,`info`);let{override:n,...r}=t;return r}l(` → Merging task "${t.id}"`,`info`),l(` Base: ${J(e.$sourceUrl)}`,`info`),l(` Override: ${J(t.$sourceUrl)}`,`info`);let n;if(typeof e.config==`object`&&e.config!==null&&typeof t.config==`object`&&t.config!==null){n=qe(e.config,t.config,t.type);let r=Ke(t.type,n);r!==null&&r.length>0&&(l(` ⚠️ Warning: Conflicting config fields detected: ${r.join(`, `)}`,`warn`),l(` 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 a=[...e.dependencies??[],...t.dependencies??[]],o=a.length>0?[...new Set(a)]:void 0,s=t.$sourceUrl??e.$sourceUrl,c={...e,...t,config:n,...r!=null&&{prompts:r},...i!=null&&{variables:i},...o!=null&&{dependencies:o},...s!=null&&{$sourceUrl:s}};return delete c.override,c}function Ye(){X.clear()}async function Xe(e){l(`Loading tasks from ${e}...`,`info`);let t=await Z(e);l(`Loaded ${t.tasks?.length??0} task(s)`,`info`),t.extends!=null&&t.extends!==``&&l(`Extended from: ${(Array.isArray(t.extends)?t.extends:[t.extends]).join(`, `)}`,`info`),t.prompts!=null&&t.prompts.length>0&&l(`Found ${t.prompts.length} top-level prompt(s)`,`info`),t.variables!=null&&t.variables.length>0&&l(`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}const Ze=g(m.writeFile);async function Qe(e,n,r){if(e.condition!=null&&e.condition!==``&&!d(e.condition,n)){l(`Condition not met, skipping template task`,`info`);return}let i=p.join(h.cwd(),e.file),a=e.template!=null&&e.template!==``,o=e.templateFile!=null&&e.templateFile!==``;if(!a&&!o)throw z.templateMissingTemplateOrFile();if(a&&o)throw z.templateHasBothTemplateAndFile();let s;if(o&&e.templateFile.endsWith(`.hbs`)){let t=await ze(Re(e.templateFile,r?.$sourceUrl));s=(await import(`handlebars`)).default.compile(t)(n)}else s=t(o?await ze(Re(e.templateFile,r?.$sourceUrl)):e.template,n);await Ze(i,s)}const $e={name:`template`,version:`1.0.0`,taskTypes:[`template`],execute:async(e,t,n)=>{n.dryRun||await Qe(e.config,t,e)}},et=g(m.readFile),tt=g(m.writeFile);async function nt(e,n){if(e.condition!=null&&e.condition!==``&&!d(e.condition,n)){l(`Condition not met, skipping update-json task`,`info`);return}let r=p.join(h.cwd(),e.file),{updates:i}=e,a=await et(r,`utf-8`),s=JSON.parse(a);function c(e){if(typeof e==`string`)return t(e,n);if(Array.isArray(e))return e.map(e=>c(e));if(typeof e==`object`&&e){let t={};for(let[n,r]of Object.entries(e))t[n]=c(r);return t}return e}for(let[e,t]of Object.entries(i)){let n=c(t);e.includes(`.`)?o(s,e,n):s[e]=n}await tt(r,`${JSON.stringify(s,null,2)}\n`)}const rt={name:`update-json`,version:`1.0.0`,taskTypes:[`update-json`],execute:async(e,t,n)=>{n.dryRun||await nt(e.config,t)}};function Q(){I(`update-json`)||(P(rt),P($e),P(be),P(Ae),P(Le),P(Se),P(Ne),P(Ee),P(we))}async function $(e,t,n=!1){if(Q(),n){l(`[DRY RUN] Would execute: ${e.name}`,`info`);return}if(I(e.type)){await pe(e,t,{dryRun:n});return}throw TypeError(`Unknown task type: ${e.type}`)}async function it(e,t,n,r,i=!1){try{return l(`[${n}/${r}] Running: ${e.name}...`,`info`),await $(e,t,i),l(`✓ ${e.name}`,`success`),!0}catch(t){return l(`✗ Failed: ${e.name}`,`error`),t instanceof Error&&(l(` Reason: ${t.message}`,`error`),t.stack!=null&&h.env.DEBUG!=null&&console.error(t.stack)),(e.required??!0)&&l(` This is a required task. Initialization cannot continue.`,`error`),!1}}function at(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 _e.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 ot(e){let t=[];for(let n of e)if(!I(n.type))t.push(`Task "${n.id}" (${n.name}): Unknown task type "${n.type}"`);else if(n.type===`template`){let e=st(n);t.push(...e)}return t}function st(e){let t=[],n=e.config,r=n.template!=null&&n.template!==``,i=n.templateFile!=null&&n.templateFile!==``;return!r&&!i&&t.push(`Task "${e.id}" (${e.name}): Template task requires either "template" (inline) or "templateFile" (file path) to be specified`),r&&i&&t.push(`Task "${e.id}" (${e.name}): Template task cannot have both "template" and "templateFile" specified. Use one or the other.`),(n.file==null||n.file===``)&&t.push(`Task "${e.id}" (${e.name}): Template task requires "file" property to specify the output file path`),t}function ct(e){l(`❌ Template validation failed:`,`error`),l(``,`error`);for(let t of e)l(` • ${t}`,`error`);l(``,`error`),l(`Please fix these errors before continuing.`,`error`)}function lt(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 ut(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`){l(`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){l(`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 dt(e){let t=new Map,n=e.map(async e=>{let t=await ut(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 ft(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 pt(e,t){Q(),l(`Validating task configurations...`,`info`);let n=ot(e);n.length>0&&(ct(n),h.exit(1)),l(`✓ All tasks validated successfully`,`success`);let r=e.filter(e=>f(e.enabled,re()));l(`Resolving task dependencies...`,`info`);let i=at(r);l(`Welcome! Let's execute your tasks.`,`info`),t.dryRun&&l(`🔍 DRY RUN MODE - No changes will be made`,`warn`),l(`This will execute your project tasks based on the defined configuration.`,`info`);let a=re(),o=t.globalVariables??[],s=[],c=[...o];for(let e of i)if(e.variables&&e.variables.length>0)for(let t of e.variables)s.push(t),c.push(t);if(c.length>0){let e=ft(c);e.length>0&&(l(`❌ Variable validation errors:`,`error`),e.forEach(e=>l(` - ${e}`,`error`)),h.exit(1)),l(`Resolving variable values...`,`info`);let t=lt(c,await dt(c));Object.assign(a,t),Object.keys(t).length>0&&l(`✓ Resolved ${Object.keys(t).length} variable(s)`,`success`)}let u=t.globalPrompts??[],d=[],p=[...u];for(let e of i)if(e.prompts&&e.prompts.length>0)for(let t of e.prompts)d.push(t),p.push(t);if(p.length>0){let e=U(p);e.length>0&&(l(`❌ Prompt validation errors:`,`error`),e.forEach(e=>l(` - ${e}`,`error`)),h.exit(1)),l(`Resolving prompt default values...`,`info`);let t=await H(p),n={};if(u.length>0&&(l(`📋 Top-level prompts (available to all tasks):`,`info`),n=await V(u,t,a),Object.assign(a,n)),d.length>0){u.length>0&&l(`📋 Task-specific prompts:`,`info`);let e=await V(d,t,a);Object.assign(a,e)}}let m=i.filter(e=>f(e.enabled,a));if(l(`${m.length} of ${i.length} task(s) enabled for execution`,`info`),t.dryRun){await A(m,a),l(`🔍 Dry run completed - no changes were made`,`info`),l(`Run without --dry-run to apply changes`,`info`);return}l(`Starting task execution...`,`info`),await L(`beforeAll`,a);let g=m.length,_=0,v=0,y=[];for(let e=0;e<m.length;e++){let n=m[e];if(n!=null)if(await L(`beforeTask`,n,a),await it(n,a,e+1,g,t.dryRun))_++,y.push(n.id),await L(`afterTask`,n,a);else if(n.required??!0){v++,await L(`onError`,Error(`Task ${n.name} failed`),n);break}else l(`⚠️ Non-critical task failed, continuing...`,`warn`),await L(`onError`,Error(`Task ${n.name} failed`),n)}v>0&&(l(`❌ Task execution failed with ${v} critical error(s)`,`error`),l(`✓ Completed: ${_}/${g} tasks`,`info`),h.exit(1)),await L(`afterAll`,a),l(`✅ All tasks completed successfully!`,`success`),l(`✓ Completed: ${_}/${g} tasks`,`success`)}const mt=h.argv.includes(`--dry-run`),ht=h.argv.includes(`--force`);async function gt(e){try{let t=e||[];t.length===0&&(l(`⚠️ No tasks defined. Use --tasks-file to specify tasks or call runWithTasks() programmatically.`,`warn`),l(`Example: scaffoldfy --tasks-file ./tasks.json`,`info`),h.exit(1)),await pt(t,{dryRun:mt,force:ht,tasksFilePath:void 0})}catch(e){l(`❌ Task execution failed`,`error`),e instanceof Error?(l(`Error: ${e.message}`,`error`),h.env.DEBUG!=null&&console.error(e.stack)):console.error(e),h.exit(1)}}async function _t(e,t){try{await pt(e,{dryRun:t?.dryRun??mt,force:t?.force??ht,tasksFilePath:t?.tasksFilePath??void 0,...t?.globalVariables!=null&&{globalVariables:t.globalVariables},...t?.globalPrompts!=null&&{globalPrompts:t.globalPrompts}})}catch(e){l(`❌ Task execution failed`,`error`),e instanceof Error?(l(`Error: ${e.message}`,`error`),h.env.DEBUG!=null&&console.error(e.stack)):console.error(e),h.exit(1)}}export{P as A,k as B,pe as C,I as D,me as E,O as F,w as H,D as I,ae as L,he as M,A as N,ue as O,se as P,E as R,ge as S,F as T,T as V,H as _,ut as a,L as b,$ as c,Ye as d,Z as f,U as g,Ge as h,dt as i,ce as j,fe as k,Q as l,Ve as m,_t as n,lt as o,Xe as p,ft as r,at as s,gt as t,it as u,V as v,le as w,de as x,B as y,oe as z};
@@ -0,0 +1,17 @@
1
+ const e=require(`./utils-BOEvDxDB.cjs`);let t=require(`node:fs`);t=e.v(t);let n=require(`node:path`);n=e.v(n);let r=require(`node:process`);r=e.v(r);let i=require(`node:util`);i=e.v(i);let a=require(`node:child_process`);a=e.v(a);let o=require(`@inquirer/prompts`);o=e.v(o);function s(){return{}}const c=(0,i.promisify)(t.default.readFile),l=2,u=10,d=55,f={reset:`\x1B[0m`,red:`\x1B[31m`,green:`\x1B[32m`,yellow:`\x1B[33m`,blue:`\x1B[34m`,cyan:`\x1B[36m`,gray:`\x1B[90m`};function p(e,t){switch(t){case`add`:return`${f.green}+ ${e}${f.reset}`;case`remove`:return`${f.red}- ${e}${f.reset}`;case`context`:return`${f.gray} ${e}${f.reset}`;default:return e}}function m(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(p(t,`context`)):(t!==void 0&&i.push(p(t,`remove`)),a!==void 0&&i.push(p(a,`add`)))}return i}async function h(i,a){if(i.condition!=null&&i.condition!==``&&!e.r(i.condition,a))return`${f.yellow}⊘ Condition not met - task would be skipped${f.reset}`;let o=n.default.join(r.default.cwd(),i.file);if(!t.default.existsSync(o))return`${f.red}✗ File not found: ${i.file}${f.reset}`;try{let t=await c(o,`utf-8`),n=JSON.parse(t),r={...n};function s(t){if(typeof t==`string`)return e.a(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.l(n,t,i):n[t]=i}let l=JSON.stringify(r,null,2),u=JSON.stringify(n,null,2);if(l===u)return`${f.cyan}→ No changes${f.reset}`;let d=m(l,u);return`${f.blue}File: ${i.file}${f.reset}\n${d.join(`
4
+ `)}`}catch(e){return`${f.red}✗ Error: ${e instanceof Error?e.message:String(e)}${f.reset}`}}async function g(i,a){if(i.condition!=null&&i.condition!==``&&!e.r(i.condition,a))return`${f.yellow}⊘ Condition not met - task would be skipped${f.reset}`;if(i.template==null||i.template===``)return`${f.red}✗ No template content provided for file: ${i.file}${f.reset}`;let o=n.default.join(r.default.cwd(),i.file),s=e.a(i.template,a);if(!t.default.existsSync(o)){let e=s.split(`
5
+ `).slice(0,10).join(`
6
+ `),t=s.split(`
7
+ `).length>10;return`${f.blue}File: ${i.file}${f.reset}\n${f.green}+ New file would be created${f.reset}\n${f.gray}Content preview:${f.reset}\n${e}${t?`
8
+ ...`:``}`}try{let e=await c(o,`utf-8`);if(e===s)return`${f.cyan}→ No changes${f.reset}`;let t=m(e,s);return`${f.blue}File: ${i.file}${f.reset}\n${t.join(`
9
+ `)}`}catch(e){return`${f.red}✗ Error: ${e instanceof Error?e.message:String(e)}${f.reset}`}}async function _(i,a){if(i.condition!=null&&i.condition!==``&&!e.r(i.condition,a))return`${f.yellow}⊘ Condition not met - task would be skipped${f.reset}`;let o=n.default.join(r.default.cwd(),i.file);if(t.default.existsSync(o))return`${f.cyan}→ File already exists, would be skipped: ${i.file}${f.reset}`;let s=i.template!=null&&i.template!==``,c=i.templateFile!=null&&i.templateFile!==``;if(!s&&!c)return`${f.red}✗ No template content provided for file: ${i.file}${f.reset}`;try{let t;if(s)t=e.a(i.template,a);else return`${f.blue}File: ${i.file}${f.reset}\n${f.green}+ New file would be created from template: ${i.templateFile}${f.reset}`;let n=t.split(`
10
+ `).slice(0,10).join(`
11
+ `),r=t.split(`
12
+ `).length>10;return`${f.blue}File: ${i.file}${f.reset}\n${f.green}+ New file would be created${f.reset}\n${f.gray}Content preview:${f.reset}\n${n}${r?`
13
+ ...`:``}`}catch(e){return`${f.red}✗ Error: ${e instanceof Error?e.message:String(e)}${f.reset}`}}async function v(i,a){if(i.condition!=null&&i.condition!==``&&!e.r(i.condition,a))return`${f.yellow}⊘ Condition not met - task would be skipped${f.reset}`;let o=n.default.join(r.default.cwd(),i.file);if(!t.default.existsSync(o))return`${f.red}✗ File not found: ${i.file}${f.reset}`;try{let t=await c(o,`utf-8`),n=new RegExp(i.pattern,i.flags??`g`),r=e.a(i.replacement,a),s=t.replace(n,r);if(t===s)return`${f.cyan}→ No matches found${f.reset}`;let l=m(t,s);return`${f.blue}File: ${i.file}${f.reset}\n${l.join(`
14
+ `)}`}catch(e){return`${f.red}✗ Error: ${e instanceof Error?e.message:String(e)}${f.reset}`}}async function y(i,a){if(i.condition!=null&&i.condition!==``&&!e.r(i.condition,a))return`${f.yellow}⊘ Condition not met - task would be skipped${f.reset}`;let o=n.default.join(r.default.cwd(),i.file);if(!t.default.existsSync(o))return`${f.red}✗ File not found: ${i.file}${f.reset}`;try{let t=await c(o,`utf-8`),n=t;for(let{find:n,replace:r}of i.replacements){let i=e.a(n,a),o=e.a(r,a);t=t.replace(i,o)}if(n===t)return`${f.cyan}→ No changes${f.reset}`;let r=m(n,t);return`${f.blue}File: ${i.file}${f.reset}\n${r.join(`
15
+ `)}`}catch(e){return`${f.red}✗ Error: ${e instanceof Error?e.message:String(e)}${f.reset}`}}function ee(i,a){if(i.condition!=null&&i.condition!==``&&!e.r(i.condition,a))return`${f.yellow}⊘ Condition not met - task would be skipped${f.reset}`;let o=i.paths.map(t=>e.a(t,a)).filter(e=>t.default.existsSync(n.default.join(r.default.cwd(),e)));return o.length===0?`${f.cyan}→ No files/directories to delete${f.reset}`:`${f.red}Would delete:${f.reset}\n${o.map(e=>`${f.red} - ${e}${f.reset}`).join(`
16
+ `)}`}function b(i,a){if(i.condition!=null&&i.condition!==``&&!e.r(i.condition,a))return`${f.yellow}⊘ Condition not met - task would be skipped${f.reset}`;let o=e.a(i.from,a),s=e.a(i.to,a),c=n.default.join(r.default.cwd(),o),l=n.default.join(r.default.cwd(),s);return t.default.existsSync(c)?t.default.existsSync(l)?`${f.yellow}⚠ Destination already exists: ${s}${f.reset}\n${f.cyan}Would rename: ${o} → ${s}${f.reset}`:`${f.cyan}Would rename: ${o} → ${s}${f.reset}`:`${f.red}✗ Source not found: ${o}${f.reset}`}function x(e){if(e.condition!=null&&e.condition!==``)return`${f.yellow}⊘ Condition check skipped in dry-run${f.reset}`;let i=n.default.join(r.default.cwd(),`.git`),a=t.default.existsSync(i),o=[];if(e.removeExisting&&a&&o.push(`${f.red}Would remove existing .git directory${f.reset}`),o.push(`${f.green}Would initialize git repository${f.reset}`),e.initialCommit){let t=e.message??`Initial commit`;o.push(`${f.green}Would create initial commit: "${t}"${f.reset}`)}return o.join(`
17
+ `)}function S(t,n){if(t.condition!=null&&t.condition!==``&&!e.r(t.condition,n))return`${f.yellow}⊘ Condition not met - task would be skipped${f.reset}`;let i=e.a(t.command,n),a=t.cwd==null?r.default.cwd():e.a(t.cwd,n);return`${f.yellow}Would execute:${f.reset}\n${f.cyan} Command: ${i}${f.reset}\n${f.cyan} Working directory: ${a}${f.reset}`}async function C(e,t){try{switch(e.type){case`update-json`:return await h(e.config,t);case`template`:return await g(e.config,t);case`create`:return await _(e.config,t);case`regex-replace`:return await v(e.config,t);case`replace-in-file`:return await y(e.config,t);case`delete`:return ee(e.config,t);case`rename`:return b(e.config,t);case`git-init`:return x(e.config);case`exec`:return S(e.config,t);default:{let t=e.type;return`${f.yellow}⚠ Diff not available for task type: ${t}${f.reset}`}}}catch(e){return`${f.red}✗ Error generating diff: ${e instanceof Error?e.message:String(e)}${f.reset}`}}async function w(e,t){console.log(`${f.blue}═══════════════════════════════════════════════════════${f.reset}`),console.log(`${f.blue} DRY RUN - Preview of changes${f.reset}`),console.log(`${f.blue}═══════════════════════════════════════════════════════${f.reset}`);for(let n of e){console.log(`${f.cyan}▶ Task: ${n.name}${f.reset}`),n.description!=null&&n.description!==``&&console.log(`${f.gray} ${n.description}${f.reset}`);let e=await C(n,t);console.log(e),console.log(`${f.gray}${`─`.repeat(55)}${f.reset}`)}console.log(`${f.blue}═══════════════════════════════════════════════════════${f.reset}`),console.log(`${f.yellow} No changes were applied (dry-run mode)${f.reset}`),console.log(`${f.blue}═══════════════════════════════════════════════════════${f.reset}`)}const T=new Map,E={},D=new Map;function O(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(T.has(t.name))throw TypeError(`Plugin ${t.name} is already registered`);for(let e of t.taskTypes)if(D.has(e)){let t=D.get(e);throw TypeError(`Task type "${e}" is already registered by plugin "${t}"`)}T.set(t.name,t);for(let e of t.taskTypes)D.set(e,t.name);e.o(`✓ Registered plugin: ${t.name}${t.version==null?``:` v${t.version}`}`,`info`)}function te(e){let t=T.get(e);if(t!=null){for(let e of t.taskTypes)D.delete(e);T.delete(e)}}function ne(e){return T.get(e)}function k(e){let t=D.get(e);if(t!=null)return T.get(t)}function A(e){return D.has(e)}function re(){return Array.from(T.keys())}function ie(){T.clear(),D.clear()}function ae(e){e.beforeAll!=null&&(E.beforeAll=e.beforeAll),e.afterAll!=null&&(E.afterAll=e.afterAll),e.beforeTask!=null&&(E.beforeTask=e.beforeTask),e.afterTask!=null&&(E.afterTask=e.afterTask),e.onError!=null&&(E.onError=e.onError)}async function j(t,...n){let r=E[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.o(`Error in ${t} hook: ${n instanceof Error?n.message:String(n)}`,`error`)}}async function oe(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 se(e,t){let n=k(e.type);if(!(n==null||n.getDiff==null))return n.getDiff(e,t)}function ce(e){let t=k(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}}}var ue=class t extends e._{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)}},M=class t extends e._{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`)}},N=class t extends e._{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`)}};async function P(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.a(t,r):t;let i=t;if(i.type===`conditional`){if(!r){e.o(`Prompt "${n}": conditional default requires context but none was provided`,`warn`);return}if(typeof i.condition!=`string`){e.o(`Prompt "${n}": conditional default must have a string condition`,`error`);return}try{let{evaluateCondition:t}=await Promise.resolve().then(()=>require(`./utils-C9ZSOWzP.cjs`)),n=t(i.condition,r)?i.ifTrue:i.ifFalse;return typeof n==`string`&&/\{\{\w+\}\}/u.test(n)&&(n=e.a(n,r)),n}catch(t){e.o(`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.o(`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.o(`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.o(`Prompt "${n}": unknown default value type "${i.type}". Expected "static", "exec", or "conditional".`,`error`);return}return t}async function F(t,n=new Map,r={}){let i={};if(t.length===0)return i;for(let a of t){let t={...r,...i};if(e.u(a.enabled,t))try{let r,s=n.get(a.id);switch(a.default!==void 0&&(s=await P(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.o(`${a.message} is required`,`error`),M.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.o(`${a.message} is required`,`error`),M.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.o(`${a.message} is required`,`error`),M.required(a.id);break}case`select`:{let e={message:a.message,choices:a.choices.map(e=>({name:e.name,value:e.value}))};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.o(`Unknown prompt type: ${a.type}`,`error`),M.unknownType(a.type)}i[a.id]=r}catch(t){throw t instanceof Error&&e.o(`Failed to collect prompt "${a.id}": ${t.message}`,`error`),t}}return i}async function I(e){let t=new Map,n=e.map(async e=>{if(e.default!==void 0){let n=await P(e.default,e.id);n!==void 0&&t.set(e.id,n)}});return await Promise.all(n),t}function L(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 de=(0,i.promisify)(t.default.writeFile);async function fe(i,a){if(i.condition!=null&&i.condition!==``&&!e.r(i.condition,a)){e.o(`Condition not met, skipping create task`,`info`);return}let o=n.default.join(r.default.cwd(),i.file);if(t.default.existsSync(o)){e.o(`File already exists, skipping: ${i.file}`,`info`);return}let s=i.template!=null&&i.template!==``,c=i.templateFile!=null&&i.templateFile!==``;if(!s&&!c)throw N.createMissingTemplateOrFile();if(s&&c)throw N.createHasBothTemplateAndFile();let l;if(c&&i.templateFile.endsWith(`.hbs`))l=e.n(i.templateFile,a);else if(c){let o=i.templateFile,s=n.default.isAbsolute(o)?o:n.default.join(r.default.cwd(),o);if(!t.default.existsSync(s))throw e.p.forPath(o);l=e.a(t.default.readFileSync(s,`utf-8`),a)}else l=e.a(i.template,a);let u=n.default.dirname(o);t.default.existsSync(u)||t.default.mkdirSync(u,{recursive:!0}),await de(o,l),e.o(`Created file: ${i.file}`,`success`)}const pe={name:`create`,version:`1.0.0`,taskTypes:[`create`],execute:async(e,t,n)=>{n.dryRun||await fe(e.config,t)}};async function me(i,a){let{paths:o,condition:s}=i;if(s!=null&&s!==``){if(!a){e.o(`Condition specified but no config provided, skipping deletion`,`warn`);return}if(!e.r(s,a)){e.o(`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 he={name:`delete`,version:`1.0.0`,taskTypes:[`delete`],execute:async(e,t,n)=>{n.dryRun||await me(e.config,t)}};async function ge(t,i){if(t.condition!=null&&t.condition!==``){if(!i){e.o(`Condition specified but no config provided, skipping exec`,`warn`);return}if(!e.r(t.condition,i)){e.o(`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 _e={name:`exec`,version:`1.0.0`,taskTypes:[`exec`],execute:async(e,t,n)=>{n.dryRun||await ge(e.config,t)}};async function ve(i,o){if(i.condition!=null&&i.condition!==``){if(!o){e.o(`Condition specified but no config provided, skipping git-init`,`warn`);return}if(!e.r(i.condition,o)){e.o(`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 ye={name:`git-init`,version:`1.0.0`,taskTypes:[`git-init`],execute:async(e,t,n)=>{n.dryRun||await ve(e.config,t)}},be=(0,i.promisify)(t.default.readFile),xe=(0,i.promisify)(t.default.writeFile);async function Se(t,i){if(t.condition!=null&&t.condition!==``&&!e.r(t.condition,i)){e.o(`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 be(a,`utf-8`),u=new RegExp(o,s);l=l.replace(u,e.a(c,i)),await xe(a,l)}const Ce={name:`regex-replace`,version:`1.0.0`,taskTypes:[`regex-replace`],execute:async(e,t,n)=>{n.dryRun||await Se(e.config,t)}},we=(0,i.promisify)(t.default.rename);async function Te(i,a){if(i.condition!=null&&i.condition!==``&&!e.r(i.condition,a)){e.o(`Condition not met, skipping rename task`,`info`);return}let o=n.default.join(r.default.cwd(),e.a(i.from,a)),s=n.default.join(r.default.cwd(),e.a(i.to,a));if(!t.default.existsSync(o)){e.o(`Source path does not exist: ${o}`,`warn`);return}await we(o,s)}const Ee={name:`rename`,version:`1.0.0`,taskTypes:[`rename`],execute:async(e,t,n)=>{n.dryRun||await Te(e.config,t)}},De=(0,i.promisify)(t.default.readFile),Oe=(0,i.promisify)(t.default.writeFile);async function ke(i,a){if(i.condition!=null&&i.condition!==``&&!e.r(i.condition,a)){e.o(`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.o(`File not found: ${o}, skipping`,`warn`);return}let c=await De(o,`utf-8`);for(let{find:t,replace:n}of s){let r=e.a(n,a);c=c.replace(new RegExp(t,`gu`),r)}await Oe(o,c)}const Ae={name:`replace-in-file`,version:`1.0.0`,taskTypes:[`replace-in-file`],execute:async(e,t,n)=>{n.dryRun||await ke(e.config,t)}};var R=class t extends e._{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)}},z=class t extends e._{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`)}};const B=(0,i.promisify)(t.default.readFile),V={template:[[`template`,`templateFile`]]};function H(e){if(e==null||e===``)return`current template`;if(U(e))return e;let t=r.default.cwd();return e.startsWith(t)?n.default.relative(t,e):e}function U(e){try{let t=new URL(e);return t.protocol===`http:`||t.protocol===`https:`}catch{return!1}}function je(t,i){if(U(t))return t;if(i==null||i===``)return n.default.isAbsolute(t)?t:n.default.resolve(r.default.cwd(),t);if(U(i))try{let e=new URL(`.`,i);return new URL(t,e).href}catch{throw e.h.forRemoteTemplate(t,i)}let a=n.default.dirname(i);return n.default.isAbsolute(t)?t:n.default.resolve(a,t)}async function W(n){if(U(n))return G(n);if(!t.default.existsSync(n))throw e.p.forPath(n);return B(n,`utf-8`)}async function G(t){try{let n=await fetch(t);if(!n.ok)throw e.f.forUrl(t,n.status,n.statusText);return await n.text()}catch(n){throw n instanceof Error&&n.message.includes(`Failed to fetch`)?n:e.f.forUrl(t,n instanceof Error?n:void 0)}}const K=new Map;async function q(i,a=new Set){let o=U(i),s;if(s=o||n.default.isAbsolute(i)?i:n.default.resolve(r.default.cwd(),i),K.has(s))return K.get(s);if(a.has(s))throw e.g.forTemplateInheritance(a,s);a.add(s);let c;if(o)c=await G(s);else{if(!t.default.existsSync(s))throw e.p.forPath(s);c=await B(s,`utf-8`)}let l;try{l=JSON.parse(c)}catch(t){throw e.m.forFile(s,t instanceof Error?t:Error(String(t)))}if(l.name==null||l.name.trim()===``)throw e.d.missingName(s);if(!/^[a-z\d]+(?:-[a-z\d]+)*$/u.test(l.name))throw e.d.invalidNameFormat(s,l.name);if(l.tasks!==void 0&&!Array.isArray(l.tasks))throw e.d.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 J(t,i,a=new Set){let o=U(t),s;if(s=o||n.default.isAbsolute(t)?t:i==null?n.default.resolve(r.default.cwd(),t):U(i)?new URL(t,i).href:n.default.resolve(i,t),a.has(s))throw e.g.forTemplateInheritance(a,s);a.add(s);let c=await q(s);if(c.extends==null||c.extends===``)return c;let l=U(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 J(e,l,a);d.push(t)}return X([...d,c])}function Y(e,t,n){let r=new Map;for(let t of e){if(r.has(t.id))throw R.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 R.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 R.forId(e.id,`prompt`,r.get(e.id));r.set(e.id,`prompt`)}}function Me(t,n){if((n.override??`merge`)===`replace`){e.o(` → Variable "${n.id}" using 'replace' strategy`,`info`);let{override:t,...r}=n;return r}e.o(` → 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.o(` → Prompt "${n.id}" using 'replace' strategy`,`info`);let{override:t,...r}=n;return r}e.o(` → Prompt "${n.id}" merged`,`info`);let r={...t,...n};return delete r.override,r}function X(e){if(e.length===0)return{name:`Empty Template`,tasks:[]};if(e.length===1){let t=e[0];return Y(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 z.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 z.forVariable(e.id);let t=n.get(e.id);n.set(e.id,Me(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 z.forTask(e.id,H(n.$sourceUrl),H(e.$sourceUrl))}let n=t.get(e.id);t.set(e.id,Ie(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;Y(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 Pe(e,t){let n=V[e];if(!n)return null;for(let e of n){let n=e.filter(e=>e in t&&t[e]!=null);if(n.length>1)return n}return null}function Fe(e,t,n){let r={...e},i=V[n]??[];for(let[e,n]of Object.entries(t)){for(let t of i)if(t.includes(e)){for(let n of t)n!==e&&delete r[n];break}r[e]=n}return r}function Ie(t,n){if((n.override??`merge`)===`replace`){e.o(` → Task "${n.id}" using 'replace' strategy - completely replacing base task`,`info`),e.o(` Base: ${H(t.$sourceUrl)}`,`info`),e.o(` Override: ${H(n.$sourceUrl)}`,`info`);let{override:r,...i}=n;return i}e.o(` → Merging task "${n.id}"`,`info`),e.o(` Base: ${H(t.$sourceUrl)}`,`info`),e.o(` Override: ${H(n.$sourceUrl)}`,`info`);let r;if(typeof t.config==`object`&&t.config!==null&&typeof n.config==`object`&&n.config!==null){r=Fe(t.config,n.config,n.type);let i=Pe(n.type,r);i!==null&&i.length>0&&(e.o(` ⚠️ Warning: Conflicting config fields detected: ${i.join(`, `)}`,`warn`),e.o(` 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 Le(){K.clear()}async function Re(t){e.o(`Loading tasks from ${t}...`,`info`);let n=await J(t);e.o(`Loaded ${n.tasks?.length??0} task(s)`,`info`),n.extends!=null&&n.extends!==``&&e.o(`Extended from: ${(Array.isArray(n.extends)?n.extends:[n.extends]).join(`, `)}`,`info`),n.prompts!=null&&n.prompts.length>0&&e.o(`Found ${n.prompts.length} top-level prompt(s)`,`info`),n.variables!=null&&n.variables.length>0&&e.o(`Found ${n.variables.length} top-level variable(s)`,`info`);let r={tasks:n.tasks??[]};return n.prompts!=null&&(r.prompts=n.prompts),n.variables!=null&&(r.variables=n.variables),r}const ze=(0,i.promisify)(t.default.writeFile);async function Be(t,i,a){if(t.condition!=null&&t.condition!==``&&!e.r(t.condition,i)){e.o(`Condition not met, skipping template task`,`info`);return}let o=n.default.join(r.default.cwd(),t.file),s=t.template!=null&&t.template!==``,c=t.templateFile!=null&&t.templateFile!==``;if(!s&&!c)throw N.templateMissingTemplateOrFile();if(s&&c)throw N.templateHasBothTemplateAndFile();let l;if(c&&t.templateFile.endsWith(`.hbs`)){let e=await W(je(t.templateFile,a?.$sourceUrl));l=(await import(`handlebars`)).default.compile(e)(i)}else l=c?e.a(await W(je(t.templateFile,a?.$sourceUrl)),i):e.a(t.template,i);await ze(o,l)}const Ve={name:`template`,version:`1.0.0`,taskTypes:[`template`],execute:async(e,t,n)=>{n.dryRun||await Be(e.config,t,e)}},He=(0,i.promisify)(t.default.readFile),Ue=(0,i.promisify)(t.default.writeFile),We=2;async function Ge(t,i){if(t.condition!=null&&t.condition!==``&&!e.r(t.condition,i)){e.o(`Condition not met, skipping update-json task`,`info`);return}let a=n.default.join(r.default.cwd(),t.file),{updates:o}=t,s=await He(a,`utf-8`),c=JSON.parse(s);function l(t){if(typeof t==`string`)return e.a(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.l(c,t,r):c[t]=r}await Ue(a,`${JSON.stringify(c,null,2)}\n`)}const Ke={name:`update-json`,version:`1.0.0`,taskTypes:[`update-json`],execute:async(e,t,n)=>{n.dryRun||await Ge(e.config,t)}};function Z(){A(`update-json`)||(O(Ke),O(Ve),O(pe),O(Ce),O(Ae),O(he),O(Ee),O(ye),O(_e))}async function qe(t,n,r=!1){if(Z(),r){e.o(`[DRY RUN] Would execute: ${t.name}`,`info`);return}if(A(t.type)){await oe(t,n,{dryRun:r});return}throw TypeError(`Unknown task type: ${t.type}`)}async function Je(t,n,i,a,o=!1){try{return e.o(`[${i}/${a}] Running: ${t.name}...`,`info`),await qe(t,n,o),e.o(`✓ ${t.name}`,`success`),!0}catch(n){return e.o(`✗ Failed: ${t.name}`,`error`),n instanceof Error&&(e.o(` Reason: ${n.message}`,`error`),n.stack!=null&&r.default.env.DEBUG!=null&&console.error(n.stack)),(t.required??!0)&&e.o(` This is a required task. Initialization cannot continue.`,`error`),!1}}function Ye(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.g.forTaskDependency(t);i.add(t);let s=a.get(t);if(!s)throw ue.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 Xe(e){let t=[];for(let n of e)if(!A(n.type))t.push(`Task "${n.id}" (${n.name}): Unknown task type "${n.type}"`);else if(n.type===`template`){let e=Ze(n);t.push(...e)}return t}function Ze(e){let t=[],n=e.config,r=n.template!=null&&n.template!==``,i=n.templateFile!=null&&n.templateFile!==``;return!r&&!i&&t.push(`Task "${e.id}" (${e.name}): Template task requires either "template" (inline) or "templateFile" (file path) to be specified`),r&&i&&t.push(`Task "${e.id}" (${e.name}): Template task cannot have both "template" and "templateFile" specified. Use one or the other.`),(n.file==null||n.file===``)&&t.push(`Task "${e.id}" (${e.name}): Template task requires "file" property to specify the output file path`),t}function Qe(t){e.o(`❌ Template validation failed:`,`error`),e.o(``,`error`);for(let n of t)e.o(` • ${n}`,`error`);e.o(``,`error`),e.o(`Please fix these errors before continuing.`,`error`)}function Q(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 $e(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.o(`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.o(`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 et(e){let t=new Map,n=e.map(async e=>{let t=await $e(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 tt(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 nt(t,n){Z(),e.o(`Validating task configurations...`,`info`);let i=Xe(t);i.length>0&&(Qe(i),r.default.exit(1)),e.o(`✓ All tasks validated successfully`,`success`);let a=t.filter(t=>e.u(t.enabled,s()));e.o(`Resolving task dependencies...`,`info`);let o=Ye(a);e.o(`Welcome! Let's execute your tasks.`,`info`),n.dryRun&&e.o(`🔍 DRY RUN MODE - No changes will be made`,`warn`),e.o(`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=tt(d);t.length>0&&(e.o(`❌ Variable validation errors:`,`error`),t.forEach(t=>e.o(` - ${t}`,`error`)),r.default.exit(1)),e.o(`Resolving variable values...`,`info`);let n=Q(d,await et(d));Object.assign(c,n),Object.keys(n).length>0&&e.o(`✓ 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=L(m);t.length>0&&(e.o(`❌ Prompt validation errors:`,`error`),t.forEach(t=>e.o(` - ${t}`,`error`)),r.default.exit(1)),e.o(`Resolving prompt default values...`,`info`);let n=await I(m),i={};if(f.length>0&&(e.o(`📋 Top-level prompts (available to all tasks):`,`info`),i=await F(f,n,c),Object.assign(c,i)),p.length>0){f.length>0&&e.o(`📋 Task-specific prompts:`,`info`);let t=await F(p,n,c);Object.assign(c,t)}}let h=o.filter(t=>e.u(t.enabled,c));if(e.o(`${h.length} of ${o.length} task(s) enabled for execution`,`info`),n.dryRun){await w(h,c),e.o(`🔍 Dry run completed - no changes were made`,`info`),e.o(`Run without --dry-run to apply changes`,`info`);return}e.o(`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 Je(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.o(`⚠️ Non-critical task failed, continuing...`,`warn`),await j(`onError`,Error(`Task ${r.name} failed`),r)}v>0&&(e.o(`❌ Task execution failed with ${v} critical error(s)`,`error`),e.o(`✓ Completed: ${_}/${g} tasks`,`info`),r.default.exit(1)),await j(`afterAll`,c),e.o(`✅ All tasks completed successfully!`,`success`),e.o(`✓ Completed: ${_}/${g} tasks`,`success`)}const rt=r.default.argv.includes(`--dry-run`),$=r.default.argv.includes(`--force`);async function it(t){try{let n=t||[];n.length===0&&(e.o(`⚠️ No tasks defined. Use --tasks-file to specify tasks or call runWithTasks() programmatically.`,`warn`),e.o(`Example: scaffoldfy --tasks-file ./tasks.json`,`info`),r.default.exit(1)),await nt(n,{dryRun:rt,force:$,tasksFilePath:void 0})}catch(t){e.o(`❌ Task execution failed`,`error`),t instanceof Error?(e.o(`Error: ${t.message}`,`error`),r.default.env.DEBUG!=null&&console.error(t.stack)):console.error(t),r.default.exit(1)}}async function at(t,n){try{await nt(t,{dryRun:n?.dryRun??rt,force:n?.force??$,tasksFilePath:n?.tasksFilePath??void 0,...n?.globalVariables!=null&&{globalVariables:n.globalVariables},...n?.globalPrompts!=null&&{globalPrompts:n.globalPrompts}})}catch(t){e.o(`❌ Task execution failed`,`error`),t instanceof Error?(e.o(`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 O}}),Object.defineProperty(exports,`B`,{enumerable:!0,get:function(){return C}}),Object.defineProperty(exports,`C`,{enumerable:!0,get:function(){return oe}}),Object.defineProperty(exports,`D`,{enumerable:!0,get:function(){return A}}),Object.defineProperty(exports,`E`,{enumerable:!0,get:function(){return se}}),Object.defineProperty(exports,`F`,{enumerable:!0,get:function(){return S}}),Object.defineProperty(exports,`H`,{enumerable:!0,get:function(){return h}}),Object.defineProperty(exports,`I`,{enumerable:!0,get:function(){return x}}),Object.defineProperty(exports,`L`,{enumerable:!0,get:function(){return v}}),Object.defineProperty(exports,`M`,{enumerable:!0,get:function(){return ce}}),Object.defineProperty(exports,`N`,{enumerable:!0,get:function(){return w}}),Object.defineProperty(exports,`O`,{enumerable:!0,get:function(){return re}}),Object.defineProperty(exports,`P`,{enumerable:!0,get:function(){return ee}}),Object.defineProperty(exports,`R`,{enumerable:!0,get:function(){return b}}),Object.defineProperty(exports,`S`,{enumerable:!0,get:function(){return le}}),Object.defineProperty(exports,`T`,{enumerable:!0,get:function(){return k}}),Object.defineProperty(exports,`V`,{enumerable:!0,get:function(){return g}}),Object.defineProperty(exports,`_`,{enumerable:!0,get:function(){return I}}),Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return $e}}),Object.defineProperty(exports,`b`,{enumerable:!0,get:function(){return j}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return qe}}),Object.defineProperty(exports,`d`,{enumerable:!0,get:function(){return Le}}),Object.defineProperty(exports,`f`,{enumerable:!0,get:function(){return J}}),Object.defineProperty(exports,`g`,{enumerable:!0,get:function(){return L}}),Object.defineProperty(exports,`h`,{enumerable:!0,get:function(){return X}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return et}}),Object.defineProperty(exports,`j`,{enumerable:!0,get:function(){return te}}),Object.defineProperty(exports,`k`,{enumerable:!0,get:function(){return ae}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return Z}}),Object.defineProperty(exports,`m`,{enumerable:!0,get:function(){return q}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return at}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return Q}}),Object.defineProperty(exports,`p`,{enumerable:!0,get:function(){return Re}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return tt}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return Ye}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return it}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return Je}}),Object.defineProperty(exports,`v`,{enumerable:!0,get:function(){return F}}),Object.defineProperty(exports,`w`,{enumerable:!0,get:function(){return ne}}),Object.defineProperty(exports,`x`,{enumerable:!0,get:function(){return ie}}),Object.defineProperty(exports,`y`,{enumerable:!0,get:function(){return P}}),Object.defineProperty(exports,`z`,{enumerable:!0,get:function(){return y}});
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@pixpilot/scaffoldfy",
3
3
  "type": "module",
4
- "version": "0.18.0",
4
+ "version": "0.18.1",
5
5
  "author": "PixPilot <m.doaie@hotmail.com>",
6
6
  "license": "MIT",
7
7
  "repository": {
@@ -47,10 +47,10 @@
47
47
  "tsdown": "^0.15.8",
48
48
  "typescript": "^5.9.3",
49
49
  "@internal/eslint-config": "0.3.0",
50
- "@internal/prettier-config": "0.0.1",
51
- "@internal/tsdown-config": "0.1.0",
52
50
  "@internal/vitest-config": "0.1.0",
53
- "@internal/tsconfig": "0.1.0"
51
+ "@internal/prettier-config": "0.0.1",
52
+ "@internal/tsconfig": "0.1.0",
53
+ "@internal/tsdown-config": "0.1.0"
54
54
  },
55
55
  "prettier": "@internal/prettier-config",
56
56
  "scripts": {
@@ -1,17 +0,0 @@
1
- import{_ as e,a as t,d as n,f as r,g as i,h as a,l as o,m as s,n as c,o as l,p as u,r as d,u as f}from"./utils-DLJmCo92.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 ee,password as te,select as ne}from"@inquirer/prompts";function re(){return{}}const b=g(m.readFile),x={reset:`\x1B[0m`,red:`\x1B[31m`,green:`\x1B[32m`,yellow:`\x1B[33m`,blue:`\x1B[34m`,cyan:`\x1B[36m`,gray:`\x1B[90m`};function S(e,t){switch(t){case`add`:return`${x.green}+ ${e}${x.reset}`;case`remove`:return`${x.red}- ${e}${x.reset}`;case`context`:return`${x.gray} ${e}${x.reset}`;default:return e}}function C(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(S(t,`context`)):(t!==void 0&&i.push(S(t,`remove`)),a!==void 0&&i.push(S(a,`add`)))}return i}async function w(e,n){if(e.condition!=null&&e.condition!==``&&!d(e.condition,n))return`${x.yellow}⊘ Condition not met - task would be skipped${x.reset}`;let r=p.join(h.cwd(),e.file);if(!m.existsSync(r))return`${x.red}✗ File not found: ${e.file}${x.reset}`;try{let i=await b(r,`utf-8`),a=JSON.parse(i),s={...a};function c(e){if(typeof e==`string`)return t(e,n);if(Array.isArray(e))return e.map(e=>c(e));if(typeof e==`object`&&e){let t={};for(let[n,r]of Object.entries(e))t[n]=c(r);return t}return e}for(let[t,n]of Object.entries(e.updates)){let e=c(n);t.includes(`.`)?o(a,t,e):a[t]=e}let l=JSON.stringify(s,null,2),u=JSON.stringify(a,null,2);if(l===u)return`${x.cyan}→ No changes${x.reset}`;let d=C(l,u);return`${x.blue}File: ${e.file}${x.reset}\n${d.join(`
4
- `)}`}catch(e){return`${x.red}✗ Error: ${e instanceof Error?e.message:String(e)}${x.reset}`}}async function T(e,n){if(e.condition!=null&&e.condition!==``&&!d(e.condition,n))return`${x.yellow}⊘ Condition not met - task would be skipped${x.reset}`;if(e.template==null||e.template===``)return`${x.red}✗ No template content provided for file: ${e.file}${x.reset}`;let r=p.join(h.cwd(),e.file),i=t(e.template,n);if(!m.existsSync(r)){let t=i.split(`
5
- `).slice(0,10).join(`
6
- `),n=i.split(`
7
- `).length>10;return`${x.blue}File: ${e.file}${x.reset}\n${x.green}+ New file would be created${x.reset}\n${x.gray}Content preview:${x.reset}\n${t}${n?`
8
- ...`:``}`}try{let t=await b(r,`utf-8`);if(t===i)return`${x.cyan}→ No changes${x.reset}`;let n=C(t,i);return`${x.blue}File: ${e.file}${x.reset}\n${n.join(`
9
- `)}`}catch(e){return`${x.red}✗ Error: ${e instanceof Error?e.message:String(e)}${x.reset}`}}async function ie(e,n){if(e.condition!=null&&e.condition!==``&&!d(e.condition,n))return`${x.yellow}⊘ Condition not met - task would be skipped${x.reset}`;let r=p.join(h.cwd(),e.file);if(m.existsSync(r))return`${x.cyan}→ File already exists, would be skipped: ${e.file}${x.reset}`;let i=e.template!=null&&e.template!==``,a=e.templateFile!=null&&e.templateFile!==``;if(!i&&!a)return`${x.red}✗ No template content provided for file: ${e.file}${x.reset}`;try{let r;if(i)r=t(e.template,n);else return`${x.blue}File: ${e.file}${x.reset}\n${x.green}+ New file would be created from template: ${e.templateFile}${x.reset}`;let a=r.split(`
10
- `).slice(0,10).join(`
11
- `),o=r.split(`
12
- `).length>10;return`${x.blue}File: ${e.file}${x.reset}\n${x.green}+ New file would be created${x.reset}\n${x.gray}Content preview:${x.reset}\n${a}${o?`
13
- ...`:``}`}catch(e){return`${x.red}✗ Error: ${e instanceof Error?e.message:String(e)}${x.reset}`}}async function ae(e,n){if(e.condition!=null&&e.condition!==``&&!d(e.condition,n))return`${x.yellow}⊘ Condition not met - task would be skipped${x.reset}`;let r=p.join(h.cwd(),e.file);if(!m.existsSync(r))return`${x.red}✗ File not found: ${e.file}${x.reset}`;try{let i=await b(r,`utf-8`),a=new RegExp(e.pattern,e.flags??`g`),o=t(e.replacement,n),s=i.replace(a,o);if(i===s)return`${x.cyan}→ No matches found${x.reset}`;let c=C(i,s);return`${x.blue}File: ${e.file}${x.reset}\n${c.join(`
14
- `)}`}catch(e){return`${x.red}✗ Error: ${e instanceof Error?e.message:String(e)}${x.reset}`}}async function oe(e,n){if(e.condition!=null&&e.condition!==``&&!d(e.condition,n))return`${x.yellow}⊘ Condition not met - task would be skipped${x.reset}`;let r=p.join(h.cwd(),e.file);if(!m.existsSync(r))return`${x.red}✗ File not found: ${e.file}${x.reset}`;try{let i=await b(r,`utf-8`),a=i;for(let{find:r,replace:a}of e.replacements){let e=t(r,n),o=t(a,n);i=i.replace(e,o)}if(a===i)return`${x.cyan}→ No changes${x.reset}`;let o=C(a,i);return`${x.blue}File: ${e.file}${x.reset}\n${o.join(`
15
- `)}`}catch(e){return`${x.red}✗ Error: ${e instanceof Error?e.message:String(e)}${x.reset}`}}function se(e,n){if(e.condition!=null&&e.condition!==``&&!d(e.condition,n))return`${x.yellow}⊘ Condition not met - task would be skipped${x.reset}`;let r=e.paths.map(e=>t(e,n)).filter(e=>m.existsSync(p.join(h.cwd(),e)));return r.length===0?`${x.cyan}→ No files/directories to delete${x.reset}`:`${x.red}Would delete:${x.reset}\n${r.map(e=>`${x.red} - ${e}${x.reset}`).join(`
16
- `)}`}function E(e,n){if(e.condition!=null&&e.condition!==``&&!d(e.condition,n))return`${x.yellow}⊘ Condition not met - task would be skipped${x.reset}`;let r=t(e.from,n),i=t(e.to,n),a=p.join(h.cwd(),r),o=p.join(h.cwd(),i);return m.existsSync(a)?m.existsSync(o)?`${x.yellow}⚠ Destination already exists: ${i}${x.reset}\n${x.cyan}Would rename: ${r} → ${i}${x.reset}`:`${x.cyan}Would rename: ${r} → ${i}${x.reset}`:`${x.red}✗ Source not found: ${r}${x.reset}`}function D(e){if(e.condition!=null&&e.condition!==``)return`${x.yellow}⊘ Condition check skipped in dry-run${x.reset}`;let t=p.join(h.cwd(),`.git`),n=m.existsSync(t),r=[];if(e.removeExisting&&n&&r.push(`${x.red}Would remove existing .git directory${x.reset}`),r.push(`${x.green}Would initialize git repository${x.reset}`),e.initialCommit){let t=e.message??`Initial commit`;r.push(`${x.green}Would create initial commit: "${t}"${x.reset}`)}return r.join(`
17
- `)}function O(e,n){if(e.condition!=null&&e.condition!==``&&!d(e.condition,n))return`${x.yellow}⊘ Condition not met - task would be skipped${x.reset}`;let r=t(e.command,n),i=e.cwd==null?h.cwd():t(e.cwd,n);return`${x.yellow}Would execute:${x.reset}\n${x.cyan} Command: ${r}${x.reset}\n${x.cyan} Working directory: ${i}${x.reset}`}async function k(e,t){try{switch(e.type){case`update-json`:return await w(e.config,t);case`template`:return await T(e.config,t);case`create`:return await ie(e.config,t);case`regex-replace`:return await ae(e.config,t);case`replace-in-file`:return await oe(e.config,t);case`delete`:return se(e.config,t);case`rename`:return E(e.config,t);case`git-init`:return D(e.config);case`exec`:return O(e.config,t);default:{let t=e.type;return`${x.yellow}⚠ Diff not available for task type: ${t}${x.reset}`}}}catch(e){return`${x.red}✗ Error generating diff: ${e instanceof Error?e.message:String(e)}${x.reset}`}}async function A(e,t){console.log(`${x.blue}═══════════════════════════════════════════════════════${x.reset}`),console.log(`${x.blue} DRY RUN - Preview of changes${x.reset}`),console.log(`${x.blue}═══════════════════════════════════════════════════════${x.reset}`);for(let n of e){console.log(`${x.cyan}▶ Task: ${n.name}${x.reset}`),n.description!=null&&n.description!==``&&console.log(`${x.gray} ${n.description}${x.reset}`);let e=await k(n,t);console.log(e),console.log(`${x.gray}${`─`.repeat(55)}${x.reset}`)}console.log(`${x.blue}═══════════════════════════════════════════════════════${x.reset}`),console.log(`${x.yellow} No changes were applied (dry-run mode)${x.reset}`),console.log(`${x.blue}═══════════════════════════════════════════════════════${x.reset}`)}const j=new Map,M={},N=new Map;function P(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(j.has(e.name))throw TypeError(`Plugin ${e.name} is already registered`);for(let t of e.taskTypes)if(N.has(t)){let e=N.get(t);throw TypeError(`Task type "${t}" is already registered by plugin "${e}"`)}j.set(e.name,e);for(let t of e.taskTypes)N.set(t,e.name);l(`✓ Registered plugin: ${e.name}${e.version==null?``:` v${e.version}`}`,`info`)}function ce(e){let t=j.get(e);if(t!=null){for(let e of t.taskTypes)N.delete(e);j.delete(e)}}function le(e){return j.get(e)}function F(e){let t=N.get(e);if(t!=null)return j.get(t)}function I(e){return N.has(e)}function ue(){return Array.from(j.keys())}function de(){j.clear(),N.clear()}function fe(e){e.beforeAll!=null&&(M.beforeAll=e.beforeAll),e.afterAll!=null&&(M.afterAll=e.afterAll),e.beforeTask!=null&&(M.beforeTask=e.beforeTask),e.afterTask!=null&&(M.afterTask=e.afterTask),e.onError!=null&&(M.onError=e.onError)}async function L(e,...t){let n=M[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){l(`Error in ${e} hook: ${t instanceof Error?t.message:String(t)}`,`error`)}}async function pe(e,t,n){let r=F(e.type);if(r==null)throw TypeError(`No plugin found for task type: ${e.type}`);await r.execute(e,t,n)}async function me(e,t){let n=F(e.type);if(!(n==null||n.getDiff==null))return n.getDiff(e,t)}function he(e){let t=F(e.type);return t==null?[`No plugin found for task type: ${e.type}`]:t.validate==null?[]:t.validate(e)}function ge(e,t,n,r){return{name:e,...r?.version!=null&&{version:r.version},taskTypes:[t],execute:n,...r?.getDiff!=null&&{getDiff:r.getDiff},...r?.validate!=null&&{validate:r.validate}}}var _e=class t extends e{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)}},R=class t extends e{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`)}},z=class t extends e{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`)}};async function B(e,n,r){if(e===void 0)return;if(typeof e!=`object`||!e||Array.isArray(e))return typeof e==`string`&&r&&/\{\{\w+\}\}/u.test(e)?t(e,r):e;let i=e;if(i.type===`conditional`){if(!r){l(`Prompt "${n}": conditional default requires context but none was provided`,`warn`);return}if(typeof i.condition!=`string`){l(`Prompt "${n}": conditional default must have a string condition`,`error`);return}try{let{evaluateCondition:e}=await import(`./utils-B8XKlHJ4.js`),n=e(i.condition,r)?i.ifTrue:i.ifFalse;return typeof n==`string`&&/\{\{\w+\}\}/u.test(n)&&(n=t(n,r)),n}catch(e){l(`Prompt "${n}": failed to evaluate conditional default: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}if(i.type===`exec`){let e=i.value;if(typeof e!=`string`){l(`Prompt "${n}": 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){l(`Prompt "${n}": failed to execute default value command: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}else if(i.type===`static`)return i.value;return e}async function V(e,t=new Map,n={}){let r={};if(e.length===0)return r;for(let i of e){let e={...n,...r};if(f(i.enabled,e))try{let n,a=t.get(i.id);switch(i.default!==void 0&&(a=await B(i.default,i.id,e)),i.type){case`input`:{let e={message:i.message};if(a!==void 0&&(e.default=String(a)),i.required!==void 0&&(e.required=i.required),n=await y(e),i.required&&(n==null||typeof n==`string`&&n.trim()===``))throw l(`${i.message} is required`,`error`),R.required(i.id);break}case`password`:if(n=await te({message:i.message,mask:`*`}),i.required&&(n==null||typeof n==`string`&&n.trim()===``))throw l(`${i.message} is required`,`error`),R.required(i.id);break;case`number`:{let e={message:i.message};if(a!==void 0&&(e.default=Number(a)),i.required!==void 0&&(e.required=i.required),i.min!==void 0&&(e.min=i.min),i.max!==void 0&&(e.max=i.max),n=await ee(e),i.required&&n==null)throw l(`${i.message} is required`,`error`),R.required(i.id);break}case`select`:{let e={message:i.message,choices:i.choices.map(e=>({name:e.name,value:e.value}))};a!==void 0&&(e.default=a),n=await ne(e);break}case`confirm`:{let e=a===void 0?!1:!!a;n=await v({message:i.message,default:e});break}default:throw l(`Unknown prompt type: ${i.type}`,`error`),R.unknownType(i.type)}r[i.id]=n}catch(e){throw e instanceof Error&&l(`Failed to collect prompt "${i.id}": ${e.message}`,`error`),e}}return r}async function H(e){let t=new Map,n=e.map(async e=>{if(e.default!==void 0){let n=await B(e.default,e.id);n!==void 0&&t.set(e.id,n)}});return await Promise.all(n),t}function U(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 ve=g(m.writeFile);async function ye(e,n){if(e.condition!=null&&e.condition!==``&&!d(e.condition,n)){l(`Condition not met, skipping create task`,`info`);return}let r=p.join(h.cwd(),e.file);if(m.existsSync(r)){l(`File already exists, skipping: ${e.file}`,`info`);return}let i=e.template!=null&&e.template!==``,a=e.templateFile!=null&&e.templateFile!==``;if(!i&&!a)throw z.createMissingTemplateOrFile();if(i&&a)throw z.createHasBothTemplateAndFile();let o;if(a&&e.templateFile.endsWith(`.hbs`))o=c(e.templateFile,n);else if(a){let r=e.templateFile,i=p.isAbsolute(r)?r:p.join(h.cwd(),r);if(!m.existsSync(i))throw u.forPath(r);o=t(m.readFileSync(i,`utf-8`),n)}else o=t(e.template,n);let s=p.dirname(r);m.existsSync(s)||m.mkdirSync(s,{recursive:!0}),await ve(r,o),l(`Created file: ${e.file}`,`success`)}const be={name:`create`,version:`1.0.0`,taskTypes:[`create`],execute:async(e,t,n)=>{n.dryRun||await ye(e.config,t)}};async function xe(e,t){let{paths:n,condition:r}=e;if(r!=null&&r!==``){if(!t){l(`Condition specified but no config provided, skipping deletion`,`warn`);return}if(!d(r,t)){l(`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 Se={name:`delete`,version:`1.0.0`,taskTypes:[`delete`],execute:async(e,t,n)=>{n.dryRun||await xe(e.config,t)}};async function Ce(e,t){if(e.condition!=null&&e.condition!==``){if(!t){l(`Condition specified but no config provided, skipping exec`,`warn`);return}if(!d(e.condition,t)){l(`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 we={name:`exec`,version:`1.0.0`,taskTypes:[`exec`],execute:async(e,t,n)=>{n.dryRun||await Ce(e.config,t)}};async function Te(e,t){if(e.condition!=null&&e.condition!==``){if(!t){l(`Condition specified but no config provided, skipping git-init`,`warn`);return}if(!d(e.condition,t)){l(`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 Ee={name:`git-init`,version:`1.0.0`,taskTypes:[`git-init`],execute:async(e,t,n)=>{n.dryRun||await Te(e.config,t)}},De=g(m.readFile),Oe=g(m.writeFile);async function ke(e,n){if(e.condition!=null&&e.condition!==``&&!d(e.condition,n)){l(`Condition not met, skipping regex-replace task`,`info`);return}let r=p.join(h.cwd(),e.file),{pattern:i}=e,a=e.flags??``,o=e.replacement||``,s=await De(r,`utf-8`),c=new RegExp(i,a);s=s.replace(c,t(o,n)),await Oe(r,s)}const Ae={name:`regex-replace`,version:`1.0.0`,taskTypes:[`regex-replace`],execute:async(e,t,n)=>{n.dryRun||await ke(e.config,t)}},je=g(m.rename);async function Me(e,n){if(e.condition!=null&&e.condition!==``&&!d(e.condition,n)){l(`Condition not met, skipping rename task`,`info`);return}let r=p.join(h.cwd(),t(e.from,n)),i=p.join(h.cwd(),t(e.to,n));if(!m.existsSync(r)){l(`Source path does not exist: ${r}`,`warn`);return}await je(r,i)}const Ne={name:`rename`,version:`1.0.0`,taskTypes:[`rename`],execute:async(e,t,n)=>{n.dryRun||await Me(e.config,t)}},Pe=g(m.readFile),Fe=g(m.writeFile);async function Ie(e,n){if(e.condition!=null&&e.condition!==``&&!d(e.condition,n)){l(`Condition not met, skipping replace-in-file task`,`info`);return}let r=p.join(h.cwd(),e.file),{replacements:i}=e;if(!m.existsSync(r)){l(`File not found: ${r}, skipping`,`warn`);return}let a=await Pe(r,`utf-8`);for(let{find:e,replace:r}of i){let i=t(r,n);a=a.replace(new RegExp(e,`gu`),i)}await Fe(r,a)}const Le={name:`replace-in-file`,version:`1.0.0`,taskTypes:[`replace-in-file`],execute:async(e,t,n)=>{n.dryRun||await Ie(e.config,t)}};var W=class t extends e{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)}},G=class t extends e{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`)}};const K=g(m.readFile),q={template:[[`template`,`templateFile`]]};function J(e){if(e==null||e===``)return`current template`;if(Y(e))return e;let t=h.cwd();return e.startsWith(t)?p.relative(t,e):e}function Y(e){try{let t=new URL(e);return t.protocol===`http:`||t.protocol===`https:`}catch{return!1}}function Re(e,t){if(Y(e))return e;if(t==null||t===``)return p.isAbsolute(e)?e:p.resolve(h.cwd(),e);if(Y(t))try{let n=new URL(`.`,t);return new URL(e,n).href}catch{throw a.forRemoteTemplate(e,t)}let n=p.dirname(t);return p.isAbsolute(e)?e:p.resolve(n,e)}async function ze(e){if(Y(e))return Be(e);if(!m.existsSync(e))throw u.forPath(e);return K(e,`utf-8`)}async function Be(e){try{let t=await fetch(e);if(!t.ok)throw r.forUrl(e,t.status,t.statusText);return await t.text()}catch(t){throw t instanceof Error&&t.message.includes(`Failed to fetch`)?t:r.forUrl(e,t instanceof Error?t:void 0)}}const X=new Map;async function Ve(e,t=new Set){let r=Y(e),a;if(a=r||p.isAbsolute(e)?e:p.resolve(h.cwd(),e),X.has(a))return X.get(a);if(t.has(a))throw i.forTemplateInheritance(t,a);t.add(a);let o;if(r)o=await Be(a);else{if(!m.existsSync(a))throw u.forPath(a);o=await K(a,`utf-8`)}let c;try{c=JSON.parse(o)}catch(e){throw s.forFile(a,e instanceof Error?e:Error(String(e)))}if(c.name==null||c.name.trim()===``)throw n.missingName(a);if(!/^[a-z\d]+(?:-[a-z\d]+)*$/u.test(c.name))throw n.invalidNameFormat(a,c.name);if(c.tasks!==void 0&&!Array.isArray(c.tasks))throw n.tasksNotArray(a);c.tasks===void 0&&(c.tasks=[]);for(let e of c.tasks)e.$sourceUrl=a;return X.set(a,c),c}async function Z(e,t,n=new Set){let r=Y(e),a;if(a=r||p.isAbsolute(e)?e:t==null?p.resolve(h.cwd(),e):Y(t)?new URL(e,t).href:p.resolve(t,e),n.has(a))throw i.forTemplateInheritance(n,a);n.add(a);let o=await Ve(a);if(o.extends==null||o.extends===``)return o;let s=Y(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 Z(e,s,n);l.push(t)}return Ge([...l,o])}function He(e,t,n){let r=new Map;for(let t of e){if(r.has(t.id))throw W.forId(t.id,`task`,r.get(t.id));r.set(t.id,`task`)}if(t!=null)for(let e of t){if(r.has(e.id))throw W.forId(e.id,`variable`,r.get(e.id));r.set(e.id,`variable`)}if(n!=null)for(let e of n){if(r.has(e.id))throw W.forId(e.id,`prompt`,r.get(e.id));r.set(e.id,`prompt`)}}function Ue(e,t){if((t.override??`merge`)===`replace`){l(` → Variable "${t.id}" using 'replace' strategy`,`info`);let{override:e,...n}=t;return n}l(` → Variable "${t.id}" merged (value replaced)`,`info`);let n={...e,...t};return delete n.override,n}function We(e,t){if((t.override??`merge`)===`replace`){l(` → Prompt "${t.id}" using 'replace' strategy`,`info`);let{override:e,...n}=t;return n}l(` → Prompt "${t.id}" merged`,`info`);let n={...e,...t};return delete n.override,n}function Ge(e){if(e.length===0)return{name:`Empty Template`,tasks:[]};if(e.length===1){let t=e[0];return He(t.tasks??[],t.variables,t.prompts),t}let t=new Map,n=new Map,r=new Map;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 G.forPrompt(e.id);let t=r.get(e.id);r.set(e.id,We(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 G.forVariable(e.id);let t=n.get(e.id);n.set(e.id,Ue(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 G.forTask(e.id,J(n.$sourceUrl),J(e.$sourceUrl))}let n=t.get(e.id);t.set(e.id,Je(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;He(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 Ke(e,t){let n=q[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 qe(e,t,n){let r={...e},i=q[n]??[];for(let[e,n]of Object.entries(t)){for(let t of i)if(t.includes(e)){for(let n of t)n!==e&&delete r[n];break}r[e]=n}return r}function Je(e,t){if((t.override??`merge`)===`replace`){l(` → Task "${t.id}" using 'replace' strategy - completely replacing base task`,`info`),l(` Base: ${J(e.$sourceUrl)}`,`info`),l(` Override: ${J(t.$sourceUrl)}`,`info`);let{override:n,...r}=t;return r}l(` → Merging task "${t.id}"`,`info`),l(` Base: ${J(e.$sourceUrl)}`,`info`),l(` Override: ${J(t.$sourceUrl)}`,`info`);let n;if(typeof e.config==`object`&&e.config!==null&&typeof t.config==`object`&&t.config!==null){n=qe(e.config,t.config,t.type);let r=Ke(t.type,n);r!==null&&r.length>0&&(l(` ⚠️ Warning: Conflicting config fields detected: ${r.join(`, `)}`,`warn`),l(` 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 a=[...e.dependencies??[],...t.dependencies??[]],o=a.length>0?[...new Set(a)]:void 0,s=t.$sourceUrl??e.$sourceUrl,c={...e,...t,config:n,...r!=null&&{prompts:r},...i!=null&&{variables:i},...o!=null&&{dependencies:o},...s!=null&&{$sourceUrl:s}};return delete c.override,c}function Ye(){X.clear()}async function Xe(e){l(`Loading tasks from ${e}...`,`info`);let t=await Z(e);l(`Loaded ${t.tasks?.length??0} task(s)`,`info`),t.extends!=null&&t.extends!==``&&l(`Extended from: ${(Array.isArray(t.extends)?t.extends:[t.extends]).join(`, `)}`,`info`),t.prompts!=null&&t.prompts.length>0&&l(`Found ${t.prompts.length} top-level prompt(s)`,`info`),t.variables!=null&&t.variables.length>0&&l(`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}const Ze=g(m.writeFile);async function Qe(e,n,r){if(e.condition!=null&&e.condition!==``&&!d(e.condition,n)){l(`Condition not met, skipping template task`,`info`);return}let i=p.join(h.cwd(),e.file),a=e.template!=null&&e.template!==``,o=e.templateFile!=null&&e.templateFile!==``;if(!a&&!o)throw z.templateMissingTemplateOrFile();if(a&&o)throw z.templateHasBothTemplateAndFile();let s;if(o&&e.templateFile.endsWith(`.hbs`)){let t=await ze(Re(e.templateFile,r?.$sourceUrl));s=(await import(`handlebars`)).default.compile(t)(n)}else s=t(o?await ze(Re(e.templateFile,r?.$sourceUrl)):e.template,n);await Ze(i,s)}const $e={name:`template`,version:`1.0.0`,taskTypes:[`template`],execute:async(e,t,n)=>{n.dryRun||await Qe(e.config,t,e)}},et=g(m.readFile),tt=g(m.writeFile);async function nt(e,n){if(e.condition!=null&&e.condition!==``&&!d(e.condition,n)){l(`Condition not met, skipping update-json task`,`info`);return}let r=p.join(h.cwd(),e.file),{updates:i}=e,a=await et(r,`utf-8`),s=JSON.parse(a);function c(e){if(typeof e==`string`)return t(e,n);if(Array.isArray(e))return e.map(e=>c(e));if(typeof e==`object`&&e){let t={};for(let[n,r]of Object.entries(e))t[n]=c(r);return t}return e}for(let[e,t]of Object.entries(i)){let n=c(t);e.includes(`.`)?o(s,e,n):s[e]=n}await tt(r,`${JSON.stringify(s,null,2)}\n`)}const rt={name:`update-json`,version:`1.0.0`,taskTypes:[`update-json`],execute:async(e,t,n)=>{n.dryRun||await nt(e.config,t)}};function Q(){I(`update-json`)||(P(rt),P($e),P(be),P(Ae),P(Le),P(Se),P(Ne),P(Ee),P(we))}async function $(e,t,n=!1){if(Q(),n){l(`[DRY RUN] Would execute: ${e.name}`,`info`);return}if(I(e.type)){await pe(e,t,{dryRun:n});return}throw TypeError(`Unknown task type: ${e.type}`)}async function it(e,t,n,r,i=!1){try{return l(`[${n}/${r}] Running: ${e.name}...`,`info`),await $(e,t,i),l(`✓ ${e.name}`,`success`),!0}catch(t){return l(`✗ Failed: ${e.name}`,`error`),t instanceof Error&&(l(` Reason: ${t.message}`,`error`),t.stack!=null&&h.env.DEBUG!=null&&console.error(t.stack)),(e.required??!0)&&l(` This is a required task. Initialization cannot continue.`,`error`),!1}}function at(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 _e.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 ot(e){let t=[];for(let n of e)if(!I(n.type))t.push(`Task "${n.id}" (${n.name}): Unknown task type "${n.type}"`);else if(n.type===`template`){let e=st(n);t.push(...e)}return t}function st(e){let t=[],n=e.config,r=n.template!=null&&n.template!==``,i=n.templateFile!=null&&n.templateFile!==``;return!r&&!i&&t.push(`Task "${e.id}" (${e.name}): Template task requires either "template" (inline) or "templateFile" (file path) to be specified`),r&&i&&t.push(`Task "${e.id}" (${e.name}): Template task cannot have both "template" and "templateFile" specified. Use one or the other.`),(n.file==null||n.file===``)&&t.push(`Task "${e.id}" (${e.name}): Template task requires "file" property to specify the output file path`),t}function ct(e){l(`❌ Template validation failed:`,`error`),l(``,`error`);for(let t of e)l(` • ${t}`,`error`);l(``,`error`),l(`Please fix these errors before continuing.`,`error`)}function lt(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 ut(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`){l(`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){l(`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 dt(e){let t=new Map,n=e.map(async e=>{let t=await ut(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 ft(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 pt(e,t){Q(),l(`Validating task configurations...`,`info`);let n=ot(e);n.length>0&&(ct(n),h.exit(1)),l(`✓ All tasks validated successfully`,`success`);let r=e.filter(e=>f(e.enabled,re()));l(`Resolving task dependencies...`,`info`);let i=at(r);l(`Welcome! Let's execute your tasks.`,`info`),t.dryRun&&l(`🔍 DRY RUN MODE - No changes will be made`,`warn`),l(`This will execute your project tasks based on the defined configuration.`,`info`);let a=re(),o=t.globalVariables??[],s=[],c=[...o];for(let e of i)if(e.variables&&e.variables.length>0)for(let t of e.variables)s.push(t),c.push(t);if(c.length>0){let e=ft(c);e.length>0&&(l(`❌ Variable validation errors:`,`error`),e.forEach(e=>l(` - ${e}`,`error`)),h.exit(1)),l(`Resolving variable values...`,`info`);let t=lt(c,await dt(c));Object.assign(a,t),Object.keys(t).length>0&&l(`✓ Resolved ${Object.keys(t).length} variable(s)`,`success`)}let u=t.globalPrompts??[],d=[],p=[...u];for(let e of i)if(e.prompts&&e.prompts.length>0)for(let t of e.prompts)d.push(t),p.push(t);if(p.length>0){let e=U(p);e.length>0&&(l(`❌ Prompt validation errors:`,`error`),e.forEach(e=>l(` - ${e}`,`error`)),h.exit(1)),l(`Resolving prompt default values...`,`info`);let t=await H(p),n={};if(u.length>0&&(l(`📋 Top-level prompts (available to all tasks):`,`info`),n=await V(u,t,a),Object.assign(a,n)),d.length>0){u.length>0&&l(`📋 Task-specific prompts:`,`info`);let e=await V(d,t,a);Object.assign(a,e)}}let m=i.filter(e=>f(e.enabled,a));if(l(`${m.length} of ${i.length} task(s) enabled for execution`,`info`),t.dryRun){await A(m,a),l(`🔍 Dry run completed - no changes were made`,`info`),l(`Run without --dry-run to apply changes`,`info`);return}l(`Starting task execution...`,`info`),await L(`beforeAll`,a);let g=m.length,_=0,v=0,y=[];for(let e=0;e<m.length;e++){let n=m[e];if(n!=null)if(await L(`beforeTask`,n,a),await it(n,a,e+1,g,t.dryRun))_++,y.push(n.id),await L(`afterTask`,n,a);else if(n.required??!0){v++,await L(`onError`,Error(`Task ${n.name} failed`),n);break}else l(`⚠️ Non-critical task failed, continuing...`,`warn`),await L(`onError`,Error(`Task ${n.name} failed`),n)}v>0&&(l(`❌ Task execution failed with ${v} critical error(s)`,`error`),l(`✓ Completed: ${_}/${g} tasks`,`info`),h.exit(1)),await L(`afterAll`,a),l(`✅ All tasks completed successfully!`,`success`),l(`✓ Completed: ${_}/${g} tasks`,`success`)}const mt=h.argv.includes(`--dry-run`),ht=h.argv.includes(`--force`);async function gt(e){try{let t=e||[];t.length===0&&(l(`⚠️ No tasks defined. Use --tasks-file to specify tasks or call runWithTasks() programmatically.`,`warn`),l(`Example: scaffoldfy --tasks-file ./tasks.json`,`info`),h.exit(1)),await pt(t,{dryRun:mt,force:ht,tasksFilePath:void 0})}catch(e){l(`❌ Task execution failed`,`error`),e instanceof Error?(l(`Error: ${e.message}`,`error`),h.env.DEBUG!=null&&console.error(e.stack)):console.error(e),h.exit(1)}}async function _t(e,t){try{await pt(e,{dryRun:t?.dryRun??mt,force:t?.force??ht,tasksFilePath:t?.tasksFilePath??void 0,...t?.globalVariables!=null&&{globalVariables:t.globalVariables},...t?.globalPrompts!=null&&{globalPrompts:t.globalPrompts}})}catch(e){l(`❌ Task execution failed`,`error`),e instanceof Error?(l(`Error: ${e.message}`,`error`),h.env.DEBUG!=null&&console.error(e.stack)):console.error(e),h.exit(1)}}export{P as A,k as B,pe as C,I as D,me as E,O as F,w as H,D as I,ae as L,he as M,A as N,ue as O,se as P,E as R,ge as S,F as T,T as V,H as _,ut as a,L as b,$ as c,Ye as d,Z as f,U as g,Ge as h,dt as i,ce as j,fe as k,Q as l,Ve as m,_t as n,lt as o,Xe as p,ft as r,at as s,gt as t,it as u,V as v,le as w,de as x,B as y,oe as z};
@@ -1,17 +0,0 @@
1
- const e=require(`./utils-BOEvDxDB.cjs`);let t=require(`node:fs`);t=e.v(t);let n=require(`node:path`);n=e.v(n);let r=require(`node:process`);r=e.v(r);let i=require(`node:util`);i=e.v(i);let a=require(`node:child_process`);a=e.v(a);let o=require(`@inquirer/prompts`);o=e.v(o);function s(){return{}}const c=(0,i.promisify)(t.default.readFile),l=2,u=10,d=55,f={reset:`\x1B[0m`,red:`\x1B[31m`,green:`\x1B[32m`,yellow:`\x1B[33m`,blue:`\x1B[34m`,cyan:`\x1B[36m`,gray:`\x1B[90m`};function p(e,t){switch(t){case`add`:return`${f.green}+ ${e}${f.reset}`;case`remove`:return`${f.red}- ${e}${f.reset}`;case`context`:return`${f.gray} ${e}${f.reset}`;default:return e}}function m(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(p(t,`context`)):(t!==void 0&&i.push(p(t,`remove`)),a!==void 0&&i.push(p(a,`add`)))}return i}async function h(i,a){if(i.condition!=null&&i.condition!==``&&!e.r(i.condition,a))return`${f.yellow}⊘ Condition not met - task would be skipped${f.reset}`;let o=n.default.join(r.default.cwd(),i.file);if(!t.default.existsSync(o))return`${f.red}✗ File not found: ${i.file}${f.reset}`;try{let t=await c(o,`utf-8`),n=JSON.parse(t),r={...n};function s(t){if(typeof t==`string`)return e.a(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.l(n,t,i):n[t]=i}let l=JSON.stringify(r,null,2),u=JSON.stringify(n,null,2);if(l===u)return`${f.cyan}→ No changes${f.reset}`;let d=m(l,u);return`${f.blue}File: ${i.file}${f.reset}\n${d.join(`
4
- `)}`}catch(e){return`${f.red}✗ Error: ${e instanceof Error?e.message:String(e)}${f.reset}`}}async function g(i,a){if(i.condition!=null&&i.condition!==``&&!e.r(i.condition,a))return`${f.yellow}⊘ Condition not met - task would be skipped${f.reset}`;if(i.template==null||i.template===``)return`${f.red}✗ No template content provided for file: ${i.file}${f.reset}`;let o=n.default.join(r.default.cwd(),i.file),s=e.a(i.template,a);if(!t.default.existsSync(o)){let e=s.split(`
5
- `).slice(0,10).join(`
6
- `),t=s.split(`
7
- `).length>10;return`${f.blue}File: ${i.file}${f.reset}\n${f.green}+ New file would be created${f.reset}\n${f.gray}Content preview:${f.reset}\n${e}${t?`
8
- ...`:``}`}try{let e=await c(o,`utf-8`);if(e===s)return`${f.cyan}→ No changes${f.reset}`;let t=m(e,s);return`${f.blue}File: ${i.file}${f.reset}\n${t.join(`
9
- `)}`}catch(e){return`${f.red}✗ Error: ${e instanceof Error?e.message:String(e)}${f.reset}`}}async function _(i,a){if(i.condition!=null&&i.condition!==``&&!e.r(i.condition,a))return`${f.yellow}⊘ Condition not met - task would be skipped${f.reset}`;let o=n.default.join(r.default.cwd(),i.file);if(t.default.existsSync(o))return`${f.cyan}→ File already exists, would be skipped: ${i.file}${f.reset}`;let s=i.template!=null&&i.template!==``,c=i.templateFile!=null&&i.templateFile!==``;if(!s&&!c)return`${f.red}✗ No template content provided for file: ${i.file}${f.reset}`;try{let t;if(s)t=e.a(i.template,a);else return`${f.blue}File: ${i.file}${f.reset}\n${f.green}+ New file would be created from template: ${i.templateFile}${f.reset}`;let n=t.split(`
10
- `).slice(0,10).join(`
11
- `),r=t.split(`
12
- `).length>10;return`${f.blue}File: ${i.file}${f.reset}\n${f.green}+ New file would be created${f.reset}\n${f.gray}Content preview:${f.reset}\n${n}${r?`
13
- ...`:``}`}catch(e){return`${f.red}✗ Error: ${e instanceof Error?e.message:String(e)}${f.reset}`}}async function v(i,a){if(i.condition!=null&&i.condition!==``&&!e.r(i.condition,a))return`${f.yellow}⊘ Condition not met - task would be skipped${f.reset}`;let o=n.default.join(r.default.cwd(),i.file);if(!t.default.existsSync(o))return`${f.red}✗ File not found: ${i.file}${f.reset}`;try{let t=await c(o,`utf-8`),n=new RegExp(i.pattern,i.flags??`g`),r=e.a(i.replacement,a),s=t.replace(n,r);if(t===s)return`${f.cyan}→ No matches found${f.reset}`;let l=m(t,s);return`${f.blue}File: ${i.file}${f.reset}\n${l.join(`
14
- `)}`}catch(e){return`${f.red}✗ Error: ${e instanceof Error?e.message:String(e)}${f.reset}`}}async function y(i,a){if(i.condition!=null&&i.condition!==``&&!e.r(i.condition,a))return`${f.yellow}⊘ Condition not met - task would be skipped${f.reset}`;let o=n.default.join(r.default.cwd(),i.file);if(!t.default.existsSync(o))return`${f.red}✗ File not found: ${i.file}${f.reset}`;try{let t=await c(o,`utf-8`),n=t;for(let{find:n,replace:r}of i.replacements){let i=e.a(n,a),o=e.a(r,a);t=t.replace(i,o)}if(n===t)return`${f.cyan}→ No changes${f.reset}`;let r=m(n,t);return`${f.blue}File: ${i.file}${f.reset}\n${r.join(`
15
- `)}`}catch(e){return`${f.red}✗ Error: ${e instanceof Error?e.message:String(e)}${f.reset}`}}function ee(i,a){if(i.condition!=null&&i.condition!==``&&!e.r(i.condition,a))return`${f.yellow}⊘ Condition not met - task would be skipped${f.reset}`;let o=i.paths.map(t=>e.a(t,a)).filter(e=>t.default.existsSync(n.default.join(r.default.cwd(),e)));return o.length===0?`${f.cyan}→ No files/directories to delete${f.reset}`:`${f.red}Would delete:${f.reset}\n${o.map(e=>`${f.red} - ${e}${f.reset}`).join(`
16
- `)}`}function b(i,a){if(i.condition!=null&&i.condition!==``&&!e.r(i.condition,a))return`${f.yellow}⊘ Condition not met - task would be skipped${f.reset}`;let o=e.a(i.from,a),s=e.a(i.to,a),c=n.default.join(r.default.cwd(),o),l=n.default.join(r.default.cwd(),s);return t.default.existsSync(c)?t.default.existsSync(l)?`${f.yellow}⚠ Destination already exists: ${s}${f.reset}\n${f.cyan}Would rename: ${o} → ${s}${f.reset}`:`${f.cyan}Would rename: ${o} → ${s}${f.reset}`:`${f.red}✗ Source not found: ${o}${f.reset}`}function x(e){if(e.condition!=null&&e.condition!==``)return`${f.yellow}⊘ Condition check skipped in dry-run${f.reset}`;let i=n.default.join(r.default.cwd(),`.git`),a=t.default.existsSync(i),o=[];if(e.removeExisting&&a&&o.push(`${f.red}Would remove existing .git directory${f.reset}`),o.push(`${f.green}Would initialize git repository${f.reset}`),e.initialCommit){let t=e.message??`Initial commit`;o.push(`${f.green}Would create initial commit: "${t}"${f.reset}`)}return o.join(`
17
- `)}function S(t,n){if(t.condition!=null&&t.condition!==``&&!e.r(t.condition,n))return`${f.yellow}⊘ Condition not met - task would be skipped${f.reset}`;let i=e.a(t.command,n),a=t.cwd==null?r.default.cwd():e.a(t.cwd,n);return`${f.yellow}Would execute:${f.reset}\n${f.cyan} Command: ${i}${f.reset}\n${f.cyan} Working directory: ${a}${f.reset}`}async function C(e,t){try{switch(e.type){case`update-json`:return await h(e.config,t);case`template`:return await g(e.config,t);case`create`:return await _(e.config,t);case`regex-replace`:return await v(e.config,t);case`replace-in-file`:return await y(e.config,t);case`delete`:return ee(e.config,t);case`rename`:return b(e.config,t);case`git-init`:return x(e.config);case`exec`:return S(e.config,t);default:{let t=e.type;return`${f.yellow}⚠ Diff not available for task type: ${t}${f.reset}`}}}catch(e){return`${f.red}✗ Error generating diff: ${e instanceof Error?e.message:String(e)}${f.reset}`}}async function w(e,t){console.log(`${f.blue}═══════════════════════════════════════════════════════${f.reset}`),console.log(`${f.blue} DRY RUN - Preview of changes${f.reset}`),console.log(`${f.blue}═══════════════════════════════════════════════════════${f.reset}`);for(let n of e){console.log(`${f.cyan}▶ Task: ${n.name}${f.reset}`),n.description!=null&&n.description!==``&&console.log(`${f.gray} ${n.description}${f.reset}`);let e=await C(n,t);console.log(e),console.log(`${f.gray}${`─`.repeat(55)}${f.reset}`)}console.log(`${f.blue}═══════════════════════════════════════════════════════${f.reset}`),console.log(`${f.yellow} No changes were applied (dry-run mode)${f.reset}`),console.log(`${f.blue}═══════════════════════════════════════════════════════${f.reset}`)}const T=new Map,E={},D=new Map;function O(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(T.has(t.name))throw TypeError(`Plugin ${t.name} is already registered`);for(let e of t.taskTypes)if(D.has(e)){let t=D.get(e);throw TypeError(`Task type "${e}" is already registered by plugin "${t}"`)}T.set(t.name,t);for(let e of t.taskTypes)D.set(e,t.name);e.o(`✓ Registered plugin: ${t.name}${t.version==null?``:` v${t.version}`}`,`info`)}function te(e){let t=T.get(e);if(t!=null){for(let e of t.taskTypes)D.delete(e);T.delete(e)}}function ne(e){return T.get(e)}function k(e){let t=D.get(e);if(t!=null)return T.get(t)}function A(e){return D.has(e)}function re(){return Array.from(T.keys())}function ie(){T.clear(),D.clear()}function ae(e){e.beforeAll!=null&&(E.beforeAll=e.beforeAll),e.afterAll!=null&&(E.afterAll=e.afterAll),e.beforeTask!=null&&(E.beforeTask=e.beforeTask),e.afterTask!=null&&(E.afterTask=e.afterTask),e.onError!=null&&(E.onError=e.onError)}async function j(t,...n){let r=E[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.o(`Error in ${t} hook: ${n instanceof Error?n.message:String(n)}`,`error`)}}async function oe(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 se(e,t){let n=k(e.type);if(!(n==null||n.getDiff==null))return n.getDiff(e,t)}function ce(e){let t=k(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}}}var ue=class t extends e._{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)}},M=class t extends e._{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`)}},N=class t extends e._{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`)}};async function P(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.a(t,r):t;let i=t;if(i.type===`conditional`){if(!r){e.o(`Prompt "${n}": conditional default requires context but none was provided`,`warn`);return}if(typeof i.condition!=`string`){e.o(`Prompt "${n}": conditional default must have a string condition`,`error`);return}try{let{evaluateCondition:t}=await Promise.resolve().then(()=>require(`./utils-C9ZSOWzP.cjs`)),n=t(i.condition,r)?i.ifTrue:i.ifFalse;return typeof n==`string`&&/\{\{\w+\}\}/u.test(n)&&(n=e.a(n,r)),n}catch(t){e.o(`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.o(`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.o(`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;return t}async function F(t,n=new Map,r={}){let i={};if(t.length===0)return i;for(let a of t){let t={...r,...i};if(e.u(a.enabled,t))try{let r,s=n.get(a.id);switch(a.default!==void 0&&(s=await P(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.o(`${a.message} is required`,`error`),M.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.o(`${a.message} is required`,`error`),M.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.o(`${a.message} is required`,`error`),M.required(a.id);break}case`select`:{let e={message:a.message,choices:a.choices.map(e=>({name:e.name,value:e.value}))};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.o(`Unknown prompt type: ${a.type}`,`error`),M.unknownType(a.type)}i[a.id]=r}catch(t){throw t instanceof Error&&e.o(`Failed to collect prompt "${a.id}": ${t.message}`,`error`),t}}return i}async function I(e){let t=new Map,n=e.map(async e=>{if(e.default!==void 0){let n=await P(e.default,e.id);n!==void 0&&t.set(e.id,n)}});return await Promise.all(n),t}function L(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 de=(0,i.promisify)(t.default.writeFile);async function fe(i,a){if(i.condition!=null&&i.condition!==``&&!e.r(i.condition,a)){e.o(`Condition not met, skipping create task`,`info`);return}let o=n.default.join(r.default.cwd(),i.file);if(t.default.existsSync(o)){e.o(`File already exists, skipping: ${i.file}`,`info`);return}let s=i.template!=null&&i.template!==``,c=i.templateFile!=null&&i.templateFile!==``;if(!s&&!c)throw N.createMissingTemplateOrFile();if(s&&c)throw N.createHasBothTemplateAndFile();let l;if(c&&i.templateFile.endsWith(`.hbs`))l=e.n(i.templateFile,a);else if(c){let o=i.templateFile,s=n.default.isAbsolute(o)?o:n.default.join(r.default.cwd(),o);if(!t.default.existsSync(s))throw e.p.forPath(o);l=e.a(t.default.readFileSync(s,`utf-8`),a)}else l=e.a(i.template,a);let u=n.default.dirname(o);t.default.existsSync(u)||t.default.mkdirSync(u,{recursive:!0}),await de(o,l),e.o(`Created file: ${i.file}`,`success`)}const pe={name:`create`,version:`1.0.0`,taskTypes:[`create`],execute:async(e,t,n)=>{n.dryRun||await fe(e.config,t)}};async function me(i,a){let{paths:o,condition:s}=i;if(s!=null&&s!==``){if(!a){e.o(`Condition specified but no config provided, skipping deletion`,`warn`);return}if(!e.r(s,a)){e.o(`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 he={name:`delete`,version:`1.0.0`,taskTypes:[`delete`],execute:async(e,t,n)=>{n.dryRun||await me(e.config,t)}};async function ge(t,i){if(t.condition!=null&&t.condition!==``){if(!i){e.o(`Condition specified but no config provided, skipping exec`,`warn`);return}if(!e.r(t.condition,i)){e.o(`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 _e={name:`exec`,version:`1.0.0`,taskTypes:[`exec`],execute:async(e,t,n)=>{n.dryRun||await ge(e.config,t)}};async function ve(i,o){if(i.condition!=null&&i.condition!==``){if(!o){e.o(`Condition specified but no config provided, skipping git-init`,`warn`);return}if(!e.r(i.condition,o)){e.o(`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 ye={name:`git-init`,version:`1.0.0`,taskTypes:[`git-init`],execute:async(e,t,n)=>{n.dryRun||await ve(e.config,t)}},be=(0,i.promisify)(t.default.readFile),xe=(0,i.promisify)(t.default.writeFile);async function Se(t,i){if(t.condition!=null&&t.condition!==``&&!e.r(t.condition,i)){e.o(`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 be(a,`utf-8`),u=new RegExp(o,s);l=l.replace(u,e.a(c,i)),await xe(a,l)}const Ce={name:`regex-replace`,version:`1.0.0`,taskTypes:[`regex-replace`],execute:async(e,t,n)=>{n.dryRun||await Se(e.config,t)}},we=(0,i.promisify)(t.default.rename);async function Te(i,a){if(i.condition!=null&&i.condition!==``&&!e.r(i.condition,a)){e.o(`Condition not met, skipping rename task`,`info`);return}let o=n.default.join(r.default.cwd(),e.a(i.from,a)),s=n.default.join(r.default.cwd(),e.a(i.to,a));if(!t.default.existsSync(o)){e.o(`Source path does not exist: ${o}`,`warn`);return}await we(o,s)}const Ee={name:`rename`,version:`1.0.0`,taskTypes:[`rename`],execute:async(e,t,n)=>{n.dryRun||await Te(e.config,t)}},De=(0,i.promisify)(t.default.readFile),Oe=(0,i.promisify)(t.default.writeFile);async function ke(i,a){if(i.condition!=null&&i.condition!==``&&!e.r(i.condition,a)){e.o(`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.o(`File not found: ${o}, skipping`,`warn`);return}let c=await De(o,`utf-8`);for(let{find:t,replace:n}of s){let r=e.a(n,a);c=c.replace(new RegExp(t,`gu`),r)}await Oe(o,c)}const Ae={name:`replace-in-file`,version:`1.0.0`,taskTypes:[`replace-in-file`],execute:async(e,t,n)=>{n.dryRun||await ke(e.config,t)}};var R=class t extends e._{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)}},z=class t extends e._{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`)}};const B=(0,i.promisify)(t.default.readFile),V={template:[[`template`,`templateFile`]]};function H(e){if(e==null||e===``)return`current template`;if(U(e))return e;let t=r.default.cwd();return e.startsWith(t)?n.default.relative(t,e):e}function U(e){try{let t=new URL(e);return t.protocol===`http:`||t.protocol===`https:`}catch{return!1}}function je(t,i){if(U(t))return t;if(i==null||i===``)return n.default.isAbsolute(t)?t:n.default.resolve(r.default.cwd(),t);if(U(i))try{let e=new URL(`.`,i);return new URL(t,e).href}catch{throw e.h.forRemoteTemplate(t,i)}let a=n.default.dirname(i);return n.default.isAbsolute(t)?t:n.default.resolve(a,t)}async function W(n){if(U(n))return G(n);if(!t.default.existsSync(n))throw e.p.forPath(n);return B(n,`utf-8`)}async function G(t){try{let n=await fetch(t);if(!n.ok)throw e.f.forUrl(t,n.status,n.statusText);return await n.text()}catch(n){throw n instanceof Error&&n.message.includes(`Failed to fetch`)?n:e.f.forUrl(t,n instanceof Error?n:void 0)}}const K=new Map;async function q(i,a=new Set){let o=U(i),s;if(s=o||n.default.isAbsolute(i)?i:n.default.resolve(r.default.cwd(),i),K.has(s))return K.get(s);if(a.has(s))throw e.g.forTemplateInheritance(a,s);a.add(s);let c;if(o)c=await G(s);else{if(!t.default.existsSync(s))throw e.p.forPath(s);c=await B(s,`utf-8`)}let l;try{l=JSON.parse(c)}catch(t){throw e.m.forFile(s,t instanceof Error?t:Error(String(t)))}if(l.name==null||l.name.trim()===``)throw e.d.missingName(s);if(!/^[a-z\d]+(?:-[a-z\d]+)*$/u.test(l.name))throw e.d.invalidNameFormat(s,l.name);if(l.tasks!==void 0&&!Array.isArray(l.tasks))throw e.d.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 J(t,i,a=new Set){let o=U(t),s;if(s=o||n.default.isAbsolute(t)?t:i==null?n.default.resolve(r.default.cwd(),t):U(i)?new URL(t,i).href:n.default.resolve(i,t),a.has(s))throw e.g.forTemplateInheritance(a,s);a.add(s);let c=await q(s);if(c.extends==null||c.extends===``)return c;let l=U(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 J(e,l,a);d.push(t)}return X([...d,c])}function Y(e,t,n){let r=new Map;for(let t of e){if(r.has(t.id))throw R.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 R.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 R.forId(e.id,`prompt`,r.get(e.id));r.set(e.id,`prompt`)}}function Me(t,n){if((n.override??`merge`)===`replace`){e.o(` → Variable "${n.id}" using 'replace' strategy`,`info`);let{override:t,...r}=n;return r}e.o(` → 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.o(` → Prompt "${n.id}" using 'replace' strategy`,`info`);let{override:t,...r}=n;return r}e.o(` → Prompt "${n.id}" merged`,`info`);let r={...t,...n};return delete r.override,r}function X(e){if(e.length===0)return{name:`Empty Template`,tasks:[]};if(e.length===1){let t=e[0];return Y(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 z.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 z.forVariable(e.id);let t=n.get(e.id);n.set(e.id,Me(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 z.forTask(e.id,H(n.$sourceUrl),H(e.$sourceUrl))}let n=t.get(e.id);t.set(e.id,Ie(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;Y(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 Pe(e,t){let n=V[e];if(!n)return null;for(let e of n){let n=e.filter(e=>e in t&&t[e]!=null);if(n.length>1)return n}return null}function Fe(e,t,n){let r={...e},i=V[n]??[];for(let[e,n]of Object.entries(t)){for(let t of i)if(t.includes(e)){for(let n of t)n!==e&&delete r[n];break}r[e]=n}return r}function Ie(t,n){if((n.override??`merge`)===`replace`){e.o(` → Task "${n.id}" using 'replace' strategy - completely replacing base task`,`info`),e.o(` Base: ${H(t.$sourceUrl)}`,`info`),e.o(` Override: ${H(n.$sourceUrl)}`,`info`);let{override:r,...i}=n;return i}e.o(` → Merging task "${n.id}"`,`info`),e.o(` Base: ${H(t.$sourceUrl)}`,`info`),e.o(` Override: ${H(n.$sourceUrl)}`,`info`);let r;if(typeof t.config==`object`&&t.config!==null&&typeof n.config==`object`&&n.config!==null){r=Fe(t.config,n.config,n.type);let i=Pe(n.type,r);i!==null&&i.length>0&&(e.o(` ⚠️ Warning: Conflicting config fields detected: ${i.join(`, `)}`,`warn`),e.o(` 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 Le(){K.clear()}async function Re(t){e.o(`Loading tasks from ${t}...`,`info`);let n=await J(t);e.o(`Loaded ${n.tasks?.length??0} task(s)`,`info`),n.extends!=null&&n.extends!==``&&e.o(`Extended from: ${(Array.isArray(n.extends)?n.extends:[n.extends]).join(`, `)}`,`info`),n.prompts!=null&&n.prompts.length>0&&e.o(`Found ${n.prompts.length} top-level prompt(s)`,`info`),n.variables!=null&&n.variables.length>0&&e.o(`Found ${n.variables.length} top-level variable(s)`,`info`);let r={tasks:n.tasks??[]};return n.prompts!=null&&(r.prompts=n.prompts),n.variables!=null&&(r.variables=n.variables),r}const ze=(0,i.promisify)(t.default.writeFile);async function Be(t,i,a){if(t.condition!=null&&t.condition!==``&&!e.r(t.condition,i)){e.o(`Condition not met, skipping template task`,`info`);return}let o=n.default.join(r.default.cwd(),t.file),s=t.template!=null&&t.template!==``,c=t.templateFile!=null&&t.templateFile!==``;if(!s&&!c)throw N.templateMissingTemplateOrFile();if(s&&c)throw N.templateHasBothTemplateAndFile();let l;if(c&&t.templateFile.endsWith(`.hbs`)){let e=await W(je(t.templateFile,a?.$sourceUrl));l=(await import(`handlebars`)).default.compile(e)(i)}else l=c?e.a(await W(je(t.templateFile,a?.$sourceUrl)),i):e.a(t.template,i);await ze(o,l)}const Ve={name:`template`,version:`1.0.0`,taskTypes:[`template`],execute:async(e,t,n)=>{n.dryRun||await Be(e.config,t,e)}},He=(0,i.promisify)(t.default.readFile),Ue=(0,i.promisify)(t.default.writeFile),We=2;async function Ge(t,i){if(t.condition!=null&&t.condition!==``&&!e.r(t.condition,i)){e.o(`Condition not met, skipping update-json task`,`info`);return}let a=n.default.join(r.default.cwd(),t.file),{updates:o}=t,s=await He(a,`utf-8`),c=JSON.parse(s);function l(t){if(typeof t==`string`)return e.a(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.l(c,t,r):c[t]=r}await Ue(a,`${JSON.stringify(c,null,2)}\n`)}const Ke={name:`update-json`,version:`1.0.0`,taskTypes:[`update-json`],execute:async(e,t,n)=>{n.dryRun||await Ge(e.config,t)}};function Z(){A(`update-json`)||(O(Ke),O(Ve),O(pe),O(Ce),O(Ae),O(he),O(Ee),O(ye),O(_e))}async function qe(t,n,r=!1){if(Z(),r){e.o(`[DRY RUN] Would execute: ${t.name}`,`info`);return}if(A(t.type)){await oe(t,n,{dryRun:r});return}throw TypeError(`Unknown task type: ${t.type}`)}async function Je(t,n,i,a,o=!1){try{return e.o(`[${i}/${a}] Running: ${t.name}...`,`info`),await qe(t,n,o),e.o(`✓ ${t.name}`,`success`),!0}catch(n){return e.o(`✗ Failed: ${t.name}`,`error`),n instanceof Error&&(e.o(` Reason: ${n.message}`,`error`),n.stack!=null&&r.default.env.DEBUG!=null&&console.error(n.stack)),(t.required??!0)&&e.o(` This is a required task. Initialization cannot continue.`,`error`),!1}}function Ye(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.g.forTaskDependency(t);i.add(t);let s=a.get(t);if(!s)throw ue.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 Xe(e){let t=[];for(let n of e)if(!A(n.type))t.push(`Task "${n.id}" (${n.name}): Unknown task type "${n.type}"`);else if(n.type===`template`){let e=Ze(n);t.push(...e)}return t}function Ze(e){let t=[],n=e.config,r=n.template!=null&&n.template!==``,i=n.templateFile!=null&&n.templateFile!==``;return!r&&!i&&t.push(`Task "${e.id}" (${e.name}): Template task requires either "template" (inline) or "templateFile" (file path) to be specified`),r&&i&&t.push(`Task "${e.id}" (${e.name}): Template task cannot have both "template" and "templateFile" specified. Use one or the other.`),(n.file==null||n.file===``)&&t.push(`Task "${e.id}" (${e.name}): Template task requires "file" property to specify the output file path`),t}function Qe(t){e.o(`❌ Template validation failed:`,`error`),e.o(``,`error`);for(let n of t)e.o(` • ${n}`,`error`);e.o(``,`error`),e.o(`Please fix these errors before continuing.`,`error`)}function Q(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 $e(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.o(`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.o(`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 et(e){let t=new Map,n=e.map(async e=>{let t=await $e(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 tt(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 nt(t,n){Z(),e.o(`Validating task configurations...`,`info`);let i=Xe(t);i.length>0&&(Qe(i),r.default.exit(1)),e.o(`✓ All tasks validated successfully`,`success`);let a=t.filter(t=>e.u(t.enabled,s()));e.o(`Resolving task dependencies...`,`info`);let o=Ye(a);e.o(`Welcome! Let's execute your tasks.`,`info`),n.dryRun&&e.o(`🔍 DRY RUN MODE - No changes will be made`,`warn`),e.o(`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=tt(d);t.length>0&&(e.o(`❌ Variable validation errors:`,`error`),t.forEach(t=>e.o(` - ${t}`,`error`)),r.default.exit(1)),e.o(`Resolving variable values...`,`info`);let n=Q(d,await et(d));Object.assign(c,n),Object.keys(n).length>0&&e.o(`✓ 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=L(m);t.length>0&&(e.o(`❌ Prompt validation errors:`,`error`),t.forEach(t=>e.o(` - ${t}`,`error`)),r.default.exit(1)),e.o(`Resolving prompt default values...`,`info`);let n=await I(m),i={};if(f.length>0&&(e.o(`📋 Top-level prompts (available to all tasks):`,`info`),i=await F(f,n,c),Object.assign(c,i)),p.length>0){f.length>0&&e.o(`📋 Task-specific prompts:`,`info`);let t=await F(p,n,c);Object.assign(c,t)}}let h=o.filter(t=>e.u(t.enabled,c));if(e.o(`${h.length} of ${o.length} task(s) enabled for execution`,`info`),n.dryRun){await w(h,c),e.o(`🔍 Dry run completed - no changes were made`,`info`),e.o(`Run without --dry-run to apply changes`,`info`);return}e.o(`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 Je(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.o(`⚠️ Non-critical task failed, continuing...`,`warn`),await j(`onError`,Error(`Task ${r.name} failed`),r)}v>0&&(e.o(`❌ Task execution failed with ${v} critical error(s)`,`error`),e.o(`✓ Completed: ${_}/${g} tasks`,`info`),r.default.exit(1)),await j(`afterAll`,c),e.o(`✅ All tasks completed successfully!`,`success`),e.o(`✓ Completed: ${_}/${g} tasks`,`success`)}const rt=r.default.argv.includes(`--dry-run`),$=r.default.argv.includes(`--force`);async function it(t){try{let n=t||[];n.length===0&&(e.o(`⚠️ No tasks defined. Use --tasks-file to specify tasks or call runWithTasks() programmatically.`,`warn`),e.o(`Example: scaffoldfy --tasks-file ./tasks.json`,`info`),r.default.exit(1)),await nt(n,{dryRun:rt,force:$,tasksFilePath:void 0})}catch(t){e.o(`❌ Task execution failed`,`error`),t instanceof Error?(e.o(`Error: ${t.message}`,`error`),r.default.env.DEBUG!=null&&console.error(t.stack)):console.error(t),r.default.exit(1)}}async function at(t,n){try{await nt(t,{dryRun:n?.dryRun??rt,force:n?.force??$,tasksFilePath:n?.tasksFilePath??void 0,...n?.globalVariables!=null&&{globalVariables:n.globalVariables},...n?.globalPrompts!=null&&{globalPrompts:n.globalPrompts}})}catch(t){e.o(`❌ Task execution failed`,`error`),t instanceof Error?(e.o(`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 O}}),Object.defineProperty(exports,`B`,{enumerable:!0,get:function(){return C}}),Object.defineProperty(exports,`C`,{enumerable:!0,get:function(){return oe}}),Object.defineProperty(exports,`D`,{enumerable:!0,get:function(){return A}}),Object.defineProperty(exports,`E`,{enumerable:!0,get:function(){return se}}),Object.defineProperty(exports,`F`,{enumerable:!0,get:function(){return S}}),Object.defineProperty(exports,`H`,{enumerable:!0,get:function(){return h}}),Object.defineProperty(exports,`I`,{enumerable:!0,get:function(){return x}}),Object.defineProperty(exports,`L`,{enumerable:!0,get:function(){return v}}),Object.defineProperty(exports,`M`,{enumerable:!0,get:function(){return ce}}),Object.defineProperty(exports,`N`,{enumerable:!0,get:function(){return w}}),Object.defineProperty(exports,`O`,{enumerable:!0,get:function(){return re}}),Object.defineProperty(exports,`P`,{enumerable:!0,get:function(){return ee}}),Object.defineProperty(exports,`R`,{enumerable:!0,get:function(){return b}}),Object.defineProperty(exports,`S`,{enumerable:!0,get:function(){return le}}),Object.defineProperty(exports,`T`,{enumerable:!0,get:function(){return k}}),Object.defineProperty(exports,`V`,{enumerable:!0,get:function(){return g}}),Object.defineProperty(exports,`_`,{enumerable:!0,get:function(){return I}}),Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return $e}}),Object.defineProperty(exports,`b`,{enumerable:!0,get:function(){return j}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return qe}}),Object.defineProperty(exports,`d`,{enumerable:!0,get:function(){return Le}}),Object.defineProperty(exports,`f`,{enumerable:!0,get:function(){return J}}),Object.defineProperty(exports,`g`,{enumerable:!0,get:function(){return L}}),Object.defineProperty(exports,`h`,{enumerable:!0,get:function(){return X}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return et}}),Object.defineProperty(exports,`j`,{enumerable:!0,get:function(){return te}}),Object.defineProperty(exports,`k`,{enumerable:!0,get:function(){return ae}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return Z}}),Object.defineProperty(exports,`m`,{enumerable:!0,get:function(){return q}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return at}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return Q}}),Object.defineProperty(exports,`p`,{enumerable:!0,get:function(){return Re}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return tt}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return Ye}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return it}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return Je}}),Object.defineProperty(exports,`v`,{enumerable:!0,get:function(){return F}}),Object.defineProperty(exports,`w`,{enumerable:!0,get:function(){return ne}}),Object.defineProperty(exports,`x`,{enumerable:!0,get:function(){return ie}}),Object.defineProperty(exports,`y`,{enumerable:!0,get:function(){return P}}),Object.defineProperty(exports,`z`,{enumerable:!0,get:function(){return y}});