@pixpilot/scaffoldfy 0.28.0 → 0.29.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.cjs +1 -1
- package/dist/cli.js +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.js +1 -1
- package/dist/run-tasks-BTXTqsGL.cjs +1 -0
- package/dist/run-tasks-BUV9tuAd.js +1 -0
- package/dist/run-tasks-BVC7NdSh.js +26 -0
- package/dist/run-tasks-CwtoncLO.cjs +26 -0
- package/dist/{src-BBGq6wHy.js → src-BGG4mudG.js} +1 -1
- package/dist/{src-BV5btOUl.cjs → src-CDWtays_.cjs} +1 -1
- package/package.json +3 -3
- package/dist/run-tasks-Bd4i-Mm3.js +0 -26
- package/dist/run-tasks-CGCIkKi5.js +0 -1
- package/dist/run-tasks-SJ5JPKTw.cjs +0 -1
- package/dist/run-tasks-UXAiO1rZ.cjs +0 -26
package/dist/cli.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
const e=require(`./utils-BeqQVvh1.cjs`);require(`./config-DlJs75hK.cjs`);const t=require(`./run-tasks-
|
|
2
|
+
const e=require(`./utils-BeqQVvh1.cjs`);require(`./config-DlJs75hK.cjs`);const t=require(`./run-tasks-CwtoncLO.cjs`),n=require(`./src-CDWtays_.cjs`);let r=require(`node:fs`);r=e.S(r);let i=require(`node:path`);i=e.S(i);let a=require(`node:process`);a=e.S(a);let o=require(`commander`);o=e.S(o);let s=require(`node:url`);s=e.S(s);let c=require(`ajv`);c=e.S(c);const l=1,u=(0,s.fileURLToPath)(require(`url`).pathToFileURL(__filename).href),d=i.default.dirname(u);function f(){return new c.default({allErrors:!0,verbose:!0,strict:!1,discriminator:!0})}function p(){let e=i.default.join(d,`..`,`schema`,`tasks.schema.json`);try{let t=r.default.readFileSync(e,`utf-8`);return JSON.parse(t)}catch(t){throw Error(`Failed to load tasks schema from ${e}: ${t instanceof Error?t.message:String(t)}`)}}function m(e){return e.filter(t=>{if(t.keyword===`oneOf`){let e=t.params;if(e.passingSchemas&&e.passingSchemas.length>0)return!1}if(t.keyword===`required`){let n=e.find(e=>e.keyword===`oneOf`&&e.instancePath===t.instancePath);if(n){let e=n.params;if(e.passingSchemas&&e.passingSchemas.length>0)return!1}}return!0}).map(e=>{let t=e.instancePath||`root`,n=e.message??`Unknown error`;switch(e.keyword){case`required`:return`${t}: Missing required property "${String(e.params.missingProperty??`unknown`)}"`;case`type`:return`${t}: Expected type "${String(e.params.type??`unknown`)}", received "${typeof e.data}"`;case`enum`:{let r=e.params.allowedValues;return`${t}: ${n}. Allowed values: ${Array.isArray(r)?r.join(`, `):String(r)}`}case`pattern`:{let{pattern:r}=e.params;return`${t}: ${n}. Value must match pattern: ${String(r)}`}case`oneOf`:return`${t}: ${n}. Configuration must match exactly one of the allowed schemas`;case`additionalProperties`:return`${t}: ${n}. Unknown property: "${String(e.params.additionalProperty??`unknown`)}"`;default:return`${t}: ${n}`}})}function h(t,n={}){try{let e=f(),r=p(),i=e.compile(r);if(!i(t)&&i.errors){let e=m(i.errors);return e.length===0?{valid:!0,errors:[]}:(n.silent||g(e),{valid:!1,errors:e})}return{valid:!0,errors:[]}}catch(t){let r=t instanceof Error?t.message:`Unknown error occurred during schema validation`;return n.silent||(e.i(`❌ Schema validation error:`,`error`),e.i(` ${r}`,`error`)),{valid:!1,errors:[r]}}}function g(t){e.i(`❌ Schema validation failed:`,`error`),e.i(``,`error`),e.i(`The following validation errors were found:`,`error`),e.i(``,`error`);for(let n of t)e.i(` • ${n}`,`error`);e.i(``,`error`),e.i(`Please fix these errors in your template configuration file.`,`error`),e.i(``,`error`),e.i(`For schema documentation, see: https://github.com/pixpilot/scaffoldfy/tree/main/packages/scaffoldfy/schema`,`info`)}const _=new o.Command,v=i.default.join(__dirname,`..`,`package.json`);let y=`0.0.0`;try{y=JSON.parse(r.default.readFileSync(v,`utf-8`)).version??`0.0.0`}catch{}_.name(`scaffoldfy`).description(`Automate project setup and configuration with customizable tasks`).version(y),_.option(`--dry-run`,`Run in dry mode without making any changes`).option(`--force`,`Force execution even if checks fail`).option(`--config <path>`,`Path to task configuration file (JSON or TypeScript)`,`./template-tasks.json`).option(`--no-validate`,`Skip schema validation of task configuration (validation is enabled by default)`).option(`--debug`,`Enable debug logging for verbose output`).action(async o=>{o.debug===!0&&e.f(!0);try{let s=[],c,l,u,d;if(o.config!=null&&o.config!==``){let n=i.default.resolve(a.default.cwd(),o.config);if(r.default.existsSync(n))if(d=n,n.endsWith(`.ts`)||n.endsWith(`.mts`)){e.i(`Loading tasks from TypeScript file: ${o.config}`,`info`);try{let t=await import(n);s=t.default??t.tasks??[],(!Array.isArray(s)||s.length===0)&&(e.i(`⚠️ No tasks found in TypeScript file or invalid format`,`warn`),e.i(`Expected default export or named export "tasks" with TaskDefinition[]`,`info`))}catch(t){e.i(`Failed to load TypeScript config file: ${o.config}`,`error`),t instanceof Error&&e.i(` Error: ${t.message}`,`error`),a.default.exit(1)}}else try{if(o.validate!==!1){e.u(`Validating task configuration against schema...`);let t=r.default.readFileSync(n,`utf-8`);h(JSON.parse(t),{silent:!1}).valid||(e.i(``,`error`),e.i(`💡 You can skip validation with --no-validate flag, but this is not recommended.`,`info`),a.default.exit(1)),e.i(`Configuration validated`,`success`)}let i=await t.q(n,{sequential:!0});if(i.templates!=null&&i.templates.length>0){let{runTemplatesSequentially:e}=await Promise.resolve().then(()=>require(`./run-tasks-BTXTqsGL.cjs`)),{createInitialConfig:t}=await Promise.resolve().then(()=>require(`./config-DmK0Erv2.cjs`));await e(i.templates,{dryRun:o.dryRun??!1,force:o.force??!1,tasksFilePath:n},t()),a.default.exit(0)}s=i.tasks,c=i.variables,l=i.prompts,u=i.enabled,Array.isArray(s)||(e.i(`❌ Invalid config file format`,`error`),e.i(`Expected JSON with { "tasks": [...] } structure`,`info`),a.default.exit(1))}catch(t){e.i(`Failed to load JSON config file: ${o.config}`,`error`),t instanceof Error&&e.i(` Error: ${t.message}`,`error`),a.default.exit(1)}else e.i(`Config file not found: ${o.config}`,`warn`)}let f=l!=null&&l.length>0||c!=null&&c.length>0;s.length===0&&!f&&(e.i(`❌ No tasks defined`,`error`),e.i(`Please provide tasks using one of these methods:`,`info`),e.i(` 1. Create a template-tasks.json file in the current directory`,`info`),e.i(` 2. Create a template-tasks.ts file in the current directory`,`info`),e.i(` 3. Use --config option to specify a different config file`,`info`),e.i(`Example JSON structure:`,`info`),console.log(JSON.stringify({tasks:[{id:`update-package`,name:`Update package.json`,description:`Update package.json with repository information`,required:!0,enabled:!0,type:`update-json`,prompts:[{id:`projectName`,type:`input`,message:`What is your project name?`,default:`my-project`,required:!0},{id:`includeTests`,type:`confirm`,message:`Include test files?`,default:!0}],config:{file:`package.json`,updates:{name:`{{projectName}}`,author:`{{author}}`}}}]},null,2)),a.default.exit(1)),s.length===0?e.i(`Loaded template with 0 tasks (template may only provide prompts/variables for extending)`,`info`):e.i(`Loaded ${s.length} task(s)`,`success`),await n.n(s,{dryRun:o.dryRun,force:o.force,tasksFilePath:d,globalVariables:c,globalPrompts:l,templateEnabled:u})}catch(t){if(e.i(`❌ CLI execution failed`,`error`),t instanceof Error){e.i(`Error: ${t.message}`,`error`);let n=a.default.env.DEBUG;n!=null&&n!==``&&console.error(t.stack)}else console.error(t);a.default.exit(1)}}),_.parse(a.default.argv);
|
package/dist/cli.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import"./config-DfRbCqsT.js";import{f as e,i as t,u as n}from"./utils-C3bHtTZl.js";import{q as r}from"./run-tasks-
|
|
2
|
+
import"./config-DfRbCqsT.js";import{f as e,i as t,u as n}from"./utils-C3bHtTZl.js";import{q as r}from"./run-tasks-BVC7NdSh.js";import{n as i}from"./src-BGG4mudG.js";import a from"node:path";import{fileURLToPath as o}from"node:url";import s from"node:fs";import c from"node:process";import{Command as l}from"commander";import u from"ajv";const d=()=>o(import.meta.url),f=(()=>a.dirname(d()))(),p=o(import.meta.url),m=a.dirname(p);function h(){return new u({allErrors:!0,verbose:!0,strict:!1,discriminator:!0})}function g(){let e=a.join(m,`..`,`schema`,`tasks.schema.json`);try{let t=s.readFileSync(e,`utf-8`);return JSON.parse(t)}catch(t){throw Error(`Failed to load tasks schema from ${e}: ${t instanceof Error?t.message:String(t)}`)}}function _(e){return e.filter(t=>{if(t.keyword===`oneOf`){let e=t.params;if(e.passingSchemas&&e.passingSchemas.length>0)return!1}if(t.keyword===`required`){let n=e.find(e=>e.keyword===`oneOf`&&e.instancePath===t.instancePath);if(n){let e=n.params;if(e.passingSchemas&&e.passingSchemas.length>0)return!1}}return!0}).map(e=>{let t=e.instancePath||`root`,n=e.message??`Unknown error`;switch(e.keyword){case`required`:return`${t}: Missing required property "${String(e.params.missingProperty??`unknown`)}"`;case`type`:return`${t}: Expected type "${String(e.params.type??`unknown`)}", received "${typeof e.data}"`;case`enum`:{let r=e.params.allowedValues;return`${t}: ${n}. Allowed values: ${Array.isArray(r)?r.join(`, `):String(r)}`}case`pattern`:{let{pattern:r}=e.params;return`${t}: ${n}. Value must match pattern: ${String(r)}`}case`oneOf`:return`${t}: ${n}. Configuration must match exactly one of the allowed schemas`;case`additionalProperties`:return`${t}: ${n}. Unknown property: "${String(e.params.additionalProperty??`unknown`)}"`;default:return`${t}: ${n}`}})}function v(e,n={}){try{let t=h(),r=g(),i=t.compile(r);if(!i(e)&&i.errors){let e=_(i.errors);return e.length===0?{valid:!0,errors:[]}:(n.silent||y(e),{valid:!1,errors:e})}return{valid:!0,errors:[]}}catch(e){let r=e instanceof Error?e.message:`Unknown error occurred during schema validation`;return n.silent||(t(`❌ Schema validation error:`,`error`),t(` ${r}`,`error`)),{valid:!1,errors:[r]}}}function y(e){t(`❌ Schema validation failed:`,`error`),t(``,`error`),t(`The following validation errors were found:`,`error`),t(``,`error`);for(let n of e)t(` • ${n}`,`error`);t(``,`error`),t(`Please fix these errors in your template configuration file.`,`error`),t(``,`error`),t(`For schema documentation, see: https://github.com/pixpilot/scaffoldfy/tree/main/packages/scaffoldfy/schema`,`info`)}const b=new l,x=a.join(f,`..`,`package.json`);let S=`0.0.0`;try{S=JSON.parse(s.readFileSync(x,`utf-8`)).version??`0.0.0`}catch{}b.name(`scaffoldfy`).description(`Automate project setup and configuration with customizable tasks`).version(S),b.option(`--dry-run`,`Run in dry mode without making any changes`).option(`--force`,`Force execution even if checks fail`).option(`--config <path>`,`Path to task configuration file (JSON or TypeScript)`,`./template-tasks.json`).option(`--no-validate`,`Skip schema validation of task configuration (validation is enabled by default)`).option(`--debug`,`Enable debug logging for verbose output`).action(async o=>{o.debug===!0&&e(!0);try{let e=[],l,u,d,f;if(o.config!=null&&o.config!==``){let i=a.resolve(c.cwd(),o.config);if(s.existsSync(i))if(f=i,i.endsWith(`.ts`)||i.endsWith(`.mts`)){t(`Loading tasks from TypeScript file: ${o.config}`,`info`);try{let n=await import(i);e=n.default??n.tasks??[],(!Array.isArray(e)||e.length===0)&&(t(`⚠️ No tasks found in TypeScript file or invalid format`,`warn`),t(`Expected default export or named export "tasks" with TaskDefinition[]`,`info`))}catch(e){t(`Failed to load TypeScript config file: ${o.config}`,`error`),e instanceof Error&&t(` Error: ${e.message}`,`error`),c.exit(1)}}else try{if(o.validate!==!1){n(`Validating task configuration against schema...`);let e=s.readFileSync(i,`utf-8`);v(JSON.parse(e),{silent:!1}).valid||(t(``,`error`),t(`💡 You can skip validation with --no-validate flag, but this is not recommended.`,`info`),c.exit(1)),t(`Configuration validated`,`success`)}let a=await r(i,{sequential:!0});if(a.templates!=null&&a.templates.length>0){let{runTemplatesSequentially:e}=await import(`./run-tasks-BUV9tuAd.js`),{createInitialConfig:t}=await import(`./config-C8hh88Lc.js`);await e(a.templates,{dryRun:o.dryRun??!1,force:o.force??!1,tasksFilePath:i},t()),c.exit(0)}e=a.tasks,l=a.variables,u=a.prompts,d=a.enabled,Array.isArray(e)||(t(`❌ Invalid config file format`,`error`),t(`Expected JSON with { "tasks": [...] } structure`,`info`),c.exit(1))}catch(e){t(`Failed to load JSON config file: ${o.config}`,`error`),e instanceof Error&&t(` Error: ${e.message}`,`error`),c.exit(1)}else t(`Config file not found: ${o.config}`,`warn`)}let p=u!=null&&u.length>0||l!=null&&l.length>0;e.length===0&&!p&&(t(`❌ No tasks defined`,`error`),t(`Please provide tasks using one of these methods:`,`info`),t(` 1. Create a template-tasks.json file in the current directory`,`info`),t(` 2. Create a template-tasks.ts file in the current directory`,`info`),t(` 3. Use --config option to specify a different config file`,`info`),t(`Example JSON structure:`,`info`),console.log(JSON.stringify({tasks:[{id:`update-package`,name:`Update package.json`,description:`Update package.json with repository information`,required:!0,enabled:!0,type:`update-json`,prompts:[{id:`projectName`,type:`input`,message:`What is your project name?`,default:`my-project`,required:!0},{id:`includeTests`,type:`confirm`,message:`Include test files?`,default:!0}],config:{file:`package.json`,updates:{name:`{{projectName}}`,author:`{{author}}`}}}]},null,2)),c.exit(1)),e.length===0?t(`Loaded template with 0 tasks (template may only provide prompts/variables for extending)`,`info`):t(`Loaded ${e.length} task(s)`,`success`),await i(e,{dryRun:o.dryRun,force:o.force,tasksFilePath:f,globalVariables:l,globalPrompts:u,templateEnabled:d})}catch(e){if(t(`❌ CLI execution failed`,`error`),e instanceof Error){t(`Error: ${e.message}`,`error`);let n=c.env.DEBUG;n!=null&&n!==``&&console.error(e.stack)}else console.error(e);c.exit(1)}}),b.parse(c.argv);export{};
|
package/dist/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
const e=require(`./utils-BeqQVvh1.cjs`);require(`./config-DlJs75hK.cjs`);const t=require(`./run-tasks-
|
|
1
|
+
const e=require(`./utils-BeqQVvh1.cjs`);require(`./config-DlJs75hK.cjs`);const t=require(`./run-tasks-CwtoncLO.cjs`),n=require(`./src-CDWtays_.cjs`);exports.callHook=t.h,exports.clearPlugins=t.g,exports.clearTemplateCache=t.G,exports.collectPrompts=t.p,exports.collectVariables=t.o,exports.createPlugin=t._,exports.displayTasksDiff=t.O,exports.evaluateCondition=e.t,exports.executePluginTask=t.v,exports.executeTask=t.c,exports.getCreateDiff=t.k,exports.getDeleteDiff=t.A,exports.getExecDiff=t.j,exports.getGitInitDiff=t.M,exports.getGitRepoInfo=e.n,exports.getPlugin=t.y,exports.getPluginForTaskType=t.b,exports.getPluginTaskDiff=t.x,exports.getRegexReplaceDiff=t.N,exports.getRenameDiff=t.P,exports.getReplaceInFileDiff=t.F,exports.getTaskDiff=t.I,exports.getTemplateSourceDescription=t.z,exports.getUpdateJsonDiff=t.L,exports.getWriteDiff=t.R,exports.hasInlineTemplate=t.B,exports.hasTemplateFile=t.V,exports.interpolateTemplate=e.r,exports.isPluginTaskType=t.S,exports.listPlugins=t.C,exports.loadAndMergeTemplate=t.K,exports.loadTasksWithInheritance=t.q,exports.loadTemplate=t.J,exports.loadTemplatesInOrder=t.Y,exports.log=e.i,exports.main=n.t,exports.mergeTemplates=t.X,exports.processTemplate=t.H,exports.prompt=e.a,exports.promptYesNo=e.o,exports.registerBuiltInPlugins=t.l,exports.registerHooks=t.w,exports.registerPlugin=t.T,exports.resolveAllDefaultValues=t.f,exports.resolveAllVariableValues=t.i,exports.resolveDefaultValue=t.m,exports.resolveVariableValue=t.a,exports.runTask=t.u,exports.runTasks=t.t,exports.runTemplatesSequentially=t.n,exports.runWithTasks=n.n,exports.setNestedProperty=e.s,exports.shouldUseHandlebars=t.U,exports.topologicalSort=t.s,exports.unregisterPlugin=t.E,exports.validatePluginTask=t.D,exports.validatePrompts=t.d,exports.validateTemplateConfig=t.W,exports.validateVariables=t.r;
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import"./config-DfRbCqsT.js";import{a as e,i as t,n,o as r,r as i,s as a,t as o}from"./utils-C3bHtTZl.js";import{A as s,B as c,C as l,D as u,E as d,F as f,G as p,H as m,I as h,J as g,K as _,L as v,M as y,N as b,O as x,P as S,R as C,S as w,T,U as E,V as D,W as O,X as k,Y as A,_ as j,a as M,b as N,c as P,d as F,f as I,g as L,h as R,i as z,j as B,k as V,l as H,m as U,n as W,o as G,p as K,q,r as J,s as Y,t as X,u as Z,v as Q,w as $,x as ee,y as te,z as ne}from"./run-tasks-
|
|
1
|
+
import"./config-DfRbCqsT.js";import{a as e,i as t,n,o as r,r as i,s as a,t as o}from"./utils-C3bHtTZl.js";import{A as s,B as c,C as l,D as u,E as d,F as f,G as p,H as m,I as h,J as g,K as _,L as v,M as y,N as b,O as x,P as S,R as C,S as w,T,U as E,V as D,W as O,X as k,Y as A,_ as j,a as M,b as N,c as P,d as F,f as I,g as L,h as R,i as z,j as B,k as V,l as H,m as U,n as W,o as G,p as K,q,r as J,s as Y,t as X,u as Z,v as Q,w as $,x as ee,y as te,z as ne}from"./run-tasks-BVC7NdSh.js";import{n as re,t as ie}from"./src-BGG4mudG.js";export{R as callHook,L as clearPlugins,p as clearTemplateCache,K as collectPrompts,G as collectVariables,j as createPlugin,x as displayTasksDiff,o as evaluateCondition,Q as executePluginTask,P as executeTask,V as getCreateDiff,s as getDeleteDiff,B as getExecDiff,y as getGitInitDiff,n as getGitRepoInfo,te as getPlugin,N as getPluginForTaskType,ee as getPluginTaskDiff,b as getRegexReplaceDiff,S as getRenameDiff,f as getReplaceInFileDiff,h as getTaskDiff,ne as getTemplateSourceDescription,v as getUpdateJsonDiff,C as getWriteDiff,c as hasInlineTemplate,D as hasTemplateFile,i as interpolateTemplate,w as isPluginTaskType,l as listPlugins,_ as loadAndMergeTemplate,q as loadTasksWithInheritance,g as loadTemplate,A as loadTemplatesInOrder,t as log,ie as main,k as mergeTemplates,m as processTemplate,e as prompt,r as promptYesNo,H as registerBuiltInPlugins,$ as registerHooks,T as registerPlugin,I as resolveAllDefaultValues,z as resolveAllVariableValues,U as resolveDefaultValue,M as resolveVariableValue,Z as runTask,X as runTasks,W as runTemplatesSequentially,re as runWithTasks,a as setNestedProperty,E as shouldUseHandlebars,Y as topologicalSort,d as unregisterPlugin,u as validatePluginTask,F as validatePrompts,O as validateTemplateConfig,J as validateVariables};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
require(`./utils-BeqQVvh1.cjs`),require(`./config-DlJs75hK.cjs`);const e=require(`./run-tasks-CwtoncLO.cjs`);exports.runTasks=e.t,exports.runTemplatesSequentially=e.n;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import"./config-DfRbCqsT.js";import"./utils-C3bHtTZl.js";import{n as e,t}from"./run-tasks-BVC7NdSh.js";export{t as runTasks,e as runTemplatesSequentially};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import{t as e}from"./config-DfRbCqsT.js";import{_ as t,b as n,c as r,d as i,g as a,h as o,i as s,l as c,m as l,p as u,r as d,s as f,t as p,u as m,v as h,x as g,y as _}from"./utils-C3bHtTZl.js";import v from"node:path";import y from"node:fs";import b from"node:process";import{promisify as x}from"node:util";import{execSync as S}from"node:child_process";import{confirm as ee,input as C,number as te,password as ne,select as re}from"@inquirer/prompts";var w=class e extends g{constructor(e,t,n,r){super(e,`DUPLICATE_ID`),this.id=t,this.type=n,this.existingType=r,this.name=`DuplicateIdError`}static forId(t,n,r){return new e(`Duplicate ID "${t}" found in ${n}. This ID is already used in ${r??`unknown`}`,t,n,r)}},T=class e extends g{constructor(e,t,n,r,i){super(e,`ID_CONFLICT`),this.id=t,this.type=n,this.baseSource=r,this.overrideSource=i,this.name=`IdConflictError`}static forTask(t,n,r){return new e(`Task ID conflict: "${t}" is defined in multiple templates.\n Base task from: ${n??`unknown`}\n Override task from: ${r??`unknown`}\n You must specify an override strategy: add "override": "merge" or "override": "replace" to the task.\n Task is being extended/overridden but no override strategy was specified.`,t,`task`,n,r)}static forVariable(t){return new e(`Variable ID conflict: "${t}" is defined in multiple templates.\n You must specify an override strategy: add "override": "merge" or "override": "replace" to the variable.\n Variable is being extended/overridden but no override strategy was specified.`,t,`variable`)}static forPrompt(t){return new e(`Prompt ID conflict: "${t}" is defined in multiple templates.\n You must specify an override strategy: add "override": "merge" or "override": "replace" to the prompt.\n Prompt is being extended/overridden but no override strategy was specified.`,t,`prompt`)}},ie=class e extends g{constructor(e,t){super(e,`TASK_NOT_FOUND`),this.taskId=t,this.name=`TaskNotFoundError`}static forId(t){return new e(`Task not found: ${t}`,t)}},E=class e extends g{constructor(e,t,n){super(e,`PROMPT_VALIDATION_ERROR`),this.promptId=t,this.reason=n,this.name=`PromptValidationError`}static required(t){return new e(`Prompt "${t}" is required`,t,`required`)}static unknownType(t){return new e(`Unknown prompt type: ${t}`,t,`unknown_type`)}},D=class e extends g{constructor(e,t,n){super(e,`PLUGIN_CONFIGURATION_ERROR`),this.pluginType=t,this.configIssue=n,this.name=`PluginConfigurationError`}static templateMissingTemplateOrFile(){return new e(`Template task requires either "template" (inline) or "templateFile" (file path) to be specified`,`template`,`missing_template_or_file`)}static templateHasBothTemplateAndFile(){return new e(`Template task cannot have both "template" and "templateFile" specified. Use one or the other.`,`template`,`both_template_and_file`)}static createMissingTemplateOrFile(){return new e(`Create task requires either "template" (inline) or "templateFile" (file path) to be specified`,`create`,`missing_template_or_file`)}static createHasBothTemplateAndFile(){return new e(`Create task cannot have both "template" and "templateFile" specified. Use one or the other.`,`create`,`both_template_and_file`)}};function ae(e){let t=new Map;for(let n of e){let e=t.get(n.name)||[];e.push(n),t.set(n.name,e)}if(Array.from(t.values()).some(e=>e.length>1))return e;let r=new Map,i=new Map,a=new Map;for(let t of e)if(r.set(t.name,t),a.set(t.name,new Set),t.dependencies!=null&&t.dependencies.length>0)for(let e of t.dependencies)a.get(t.name).add(e),i.has(e)||i.set(e,new Set),i.get(e).add(t.name);let o=new Set,s=new Map;for(let t=0;t<e.length;t++){let n=e[t],r=a.get(n.name).size>0,c=i.has(n.name)&&i.get(n.name).size>0;!r&&!c&&(o.add(n.name),s.set(n.name,t))}let c=e.filter(e=>!o.has(e.name)),l=[],u=new Set,d=new Set;function f(e){if(u.has(e))return;if(d.has(e))throw n.forTemplateDependencies(Array.from(d),e);d.add(e);let t=r.get(e);if(t!=null){let t=a.get(e);if(t!=null&&t.size>0)for(let e of t)f(e)}d.delete(e),u.add(e),t!=null&&!o.has(e)&&l.push(t)}for(let e of c)f(e.name);let p=[],m=0;for(let t=0;t<e.length;t++){let n=e[t];o.has(n.name)?p.push(n):m<l.length&&(p.push(l[m]),m++)}return p}const oe=x(y.readFile),se={template:[[`template`,`templateFile`]]};function O(e){if(e==null||e===``)return`current template`;if(k(e))return e;let t=b.cwd();return e.startsWith(t)?v.relative(t,e):e}function k(e){try{let t=new URL(e);return t.protocol===`http:`||t.protocol===`https:`}catch{return!1}}function ce(e,t){if(k(e))return e;if(t==null||t===``)return v.isAbsolute(e)?e:v.resolve(b.cwd(),e);if(k(t))try{let n=new URL(`.`,t);return new URL(e,n).href}catch{throw _.forRemoteTemplate(e,t)}let n=v.dirname(t);return v.isAbsolute(e)?e:v.resolve(n,e)}async function le(e){if(k(e))return ue(e);if(!y.existsSync(e))throw t.forPath(e);return oe(e,`utf-8`)}async function ue(e){try{let t=await fetch(e);if(!t.ok)throw a.forUrl(e,t.status,t.statusText);return await t.text()}catch(t){throw t instanceof Error&&t.message.includes(`Failed to fetch`)?t:a.forUrl(e,t instanceof Error?t:void 0)}}const A=new Map;async function de(e,r=new Set){let i=k(e),a;if(a=i||v.isAbsolute(e)?e:v.resolve(b.cwd(),e),A.has(a))return A.get(a);if(r.has(a))throw n.forTemplateInheritance(r,a);r.add(a);let s;if(i)s=await ue(a);else{if(!y.existsSync(a))throw t.forPath(a);s=await oe(a,`utf-8`)}let c;try{c=JSON.parse(s)}catch(e){throw h.forFile(a,e instanceof Error?e:Error(String(e)))}if(c.name==null||c.name.trim()===``)throw o.missingName(a);if(!/^[a-z\d]+(?:-[a-z\d]+)*$/u.test(c.name))throw o.invalidNameFormat(a,c.name);if(c.tasks!==void 0&&!Array.isArray(c.tasks))throw o.tasksNotArray(a);c.tasks===void 0&&(c.tasks=[]);for(let e of c.tasks)e.$sourceUrl=a;return A.set(a,c),c}async function fe(e,t,r,i,a){let o=k(e),s;if(s=o||v.isAbsolute(e)?e:t==null?v.resolve(b.cwd(),e):k(t)?new URL(e,t).href:v.resolve(t,e),r.has(s))return;if(i.has(s))throw n.forTemplateInheritance(i,s);i.add(s);let c=await de(s),l=k(s)?new URL(`.`,s).href:v.dirname(s);if(c.extends!=null&&c.extends!==``){let e=Array.isArray(c.extends)?c.extends:[c.extends];for(let t of e)await fe(t,l,r,i,a)}i.delete(s),r.add(s),a.push(c)}async function pe(e,t,n=new Set){let r=[];return await fe(e,t,n,new Set,r),ae(r)}async function me(e,t,n=new Set){return ve(await pe(e,t,n))}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 ge(e,t){if((t.override??`merge`)===`replace`){s(` → Variable "${t.id}" using 'replace' strategy`,`info`);let{override:e,...n}=t;return n}s(` → Variable "${t.id}" merged (value replaced)`,`info`);let n={...e,...t};return delete n.override,n}function _e(e,t){if((t.override??`merge`)===`replace`){s(` → Prompt "${t.id}" using 'replace' strategy`,`info`);let{override:e,...n}=t;return n}s(` → Prompt "${t.id}" merged`,`info`);let n={...e,...t};return delete n.override,n}function ve(e){if(e.length===0)return{name:`Empty Template`,tasks:[]};if(e.length===1){let t=e[0];return he(t.tasks??[],t.variables,t.prompts),t}let t=new Map,n=new Map,r=new Map,i={};for(let a of e){if(a.enabled!=null&&(i[a.name]=a.enabled),a.enabled===!1){s(`⊘ Skipping disabled template "${a.name}" - its tasks, prompts, and variables will not be included`,`info`);continue}if(a.prompts!=null)for(let e of a.prompts)if(r.has(e.id)){if(e.override==null)throw T.forPrompt(e.id);let t=_e(r.get(e.id),e);a.enabled!=null&&(t.$templateEnabled=a.enabled),r.set(e.id,t)}else{let t={...e};a.enabled!=null&&(t.$templateEnabled=a.enabled),r.set(e.id,t)}if(a.variables!=null)for(let e of a.variables)if(n.has(e.id)){if(e.override==null)throw T.forVariable(e.id);let t=ge(n.get(e.id),e);a.enabled!=null&&(t.$templateEnabled=a.enabled),n.set(e.id,t)}else{let t={...e};a.enabled!=null&&(t.$templateEnabled=a.enabled),n.set(e.id,t)}for(let e of a.tasks??[])if(t.has(e.id)){if(e.override==null){let n=t.get(e.id);throw T.forTask(e.id,O(n.$sourceUrl),O(e.$sourceUrl))}let n=xe(t.get(e.id),e);a.enabled!=null&&(n.$templateEnabled=a.enabled),t.set(e.id,n)}else{let n={...e};a.enabled!=null&&(n.$templateEnabled=a.enabled),t.set(e.id,n)}}let a=Array.from(t.values()),o=r.size>0?Array.from(r.values()):void 0,c=n.size>0?Array.from(n.values()):void 0;he(a,c,o);let l=e[e.length-1],u={name:l.name,tasks:a};return l.description!=null&&(u.description=l.description),l.dependencies!=null&&(u.dependencies=l.dependencies),l.enabled!=null&&(u.enabled=l.enabled),o!=null&&(u.prompts=o),c!=null&&(u.variables=c),u}function ye(e,t){let n=se[e];if(!n)return null;for(let e of n){let n=e.filter(e=>e in t&&t[e]!=null);if(n.length>1)return n}return null}function be(e,t,n){let r={...e},i=se[n]??[];for(let[e,n]of Object.entries(t)){for(let t of i)if(t.includes(e)){for(let n of t)n!==e&&delete r[n];break}r[e]=n}return r}function xe(e,t){if((t.override??`merge`)===`replace`){s(` → Task "${t.id}" using 'replace' strategy - completely replacing base task`,`info`),s(` Base: ${O(e.$sourceUrl)}`,`info`),s(` Override: ${O(t.$sourceUrl)}`,`info`);let{override:n,...r}=t;return r}s(` → Merging task "${t.id}"`,`info`),s(` Base: ${O(e.$sourceUrl)}`,`info`),s(` Override: ${O(t.$sourceUrl)}`,`info`);let n;if(typeof e.config==`object`&&e.config!==null&&typeof t.config==`object`&&t.config!==null){n=be(e.config,t.config,t.type);let r=ye(t.type,n);r!==null&&r.length>0&&(s(` ⚠️ Warning: Conflicting config fields detected: ${r.join(`, `)}`,`warn`),s(` Please use override: "replace" or specify only one of these fields`,`warn`))}else n=t.config??e.config;let r=[...e.dependencies??[],...t.dependencies??[]],i=r.length>0?[...new Set(r)]:void 0,a=t.$sourceUrl??e.$sourceUrl,o={...e,...t,config:n,...i!=null&&{dependencies:i},...a!=null&&{$sourceUrl:a}};return delete o.override,o}function Se(){A.clear()}async function Ce(e,t){if(m(`Loading tasks from ${e}...`),t?.sequential===!0){let t=await pe(e);return m(`Loaded ${t.length} template(s) for processing`),{tasks:[],templates:t}}let n=await me(e);s(`Loaded ${n.tasks?.length??0} task(s)`,`info`),n.extends!=null&&n.extends!==``&&s(`Extended from: ${(Array.isArray(n.extends)?n.extends:[n.extends]).join(`, `)}`,`info`),n.prompts!=null&&n.prompts.length>0&&s(`Found ${n.prompts.length} top-level prompt(s)`,`info`),n.variables!=null&&n.variables.length>0&&s(`Found ${n.variables.length} top-level variable(s)`,`info`);let r={tasks:n.tasks??[]};return n.prompts!=null&&(r.prompts=n.prompts),n.variables!=null&&(r.variables=n.variables),n.enabled!=null&&(r.enabled=n.enabled),r}function j(e){return e.template!=null&&e.template!==``}function M(e){return e.templateFile!=null&&e.templateFile!==``}function we(e){return e.endsWith(`.hbs`)}function N(e){let t=j(e),n=M(e);return!t&&!n?{isValid:!1,hasInlineTemplate:t,hasTemplateFile:n,error:`Template configuration requires either "template" (inline) or "templateFile" (file path) to be specified`}:t&&n?{isValid:!1,hasInlineTemplate:t,hasTemplateFile:n,error:`Template configuration cannot have both "template" and "templateFile" specified. Use one or the other.`}:{isValid:!0,hasInlineTemplate:t,hasTemplateFile:n}}async function P(e,t,n,r={}){let{enableHandlebars:i=!0,sourceUrl:a=n?.$sourceUrl}=r,o=j(e),s=M(e);if(o)return d(e.template,t);if(s){let n=e.templateFile,r=i&&we(n),o=await le(ce(n,a));return r?(await import(`handlebars`)).default.compile(o)(t):d(o,t)}throw Error(`No template content available`)}function Te(e){return j(e)?`inline template`:M(e)?`template file: ${e.templateFile}`:`no template source`}const F=x(y.readFile),I={reset:`\x1B[0m`,red:`\x1B[31m`,green:`\x1B[32m`,yellow:`\x1B[33m`,blue:`\x1B[34m`,cyan:`\x1B[36m`,gray:`\x1B[90m`};function L(e,t){switch(t){case`add`:return`${I.green}+ ${e}${I.reset}`;case`remove`:return`${I.red}- ${e}${I.reset}`;case`context`:return`${I.gray} ${e}${I.reset}`;default:return e}}function R(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(L(t,`context`)):(t!==void 0&&i.push(L(t,`remove`)),a!==void 0&&i.push(L(a,`add`)))}return i}async function Ee(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${I.yellow}⊘ Condition not met - task would be skipped${I.reset}`;let n=v.join(b.cwd(),e.file);if(!y.existsSync(n))return`${I.red}✗ File not found: ${e.file}${I.reset}`;try{let r=await F(n,`utf-8`),i=JSON.parse(r),a={...i};function o(e){if(typeof e==`string`)return d(e,t);if(Array.isArray(e))return e.map(e=>o(e));if(typeof e==`object`&&e){let t={};for(let[n,r]of Object.entries(e))t[n]=o(r);return t}return e}for(let[t,n]of Object.entries(e.updates)){let e=o(n);t.includes(`.`)?f(i,t,e):i[t]=e}let s=JSON.stringify(a,null,2),c=JSON.stringify(i,null,2);if(s===c)return`${I.cyan}→ No changes${I.reset}`;let l=R(s,c);return`${I.blue}File: ${e.file}${I.reset}\n${l.join(`
|
|
4
|
+
`)}`}catch(e){return`${I.red}✗ Error: ${e instanceof Error?e.message:String(e)}${I.reset}`}}async function De(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${I.yellow}⊘ Condition not met - task would be skipped${I.reset}`;if(e.template==null||e.template===``)return`${I.red}✗ No template content provided for file: ${e.file}${I.reset}`;let n=v.join(b.cwd(),e.file),r=d(e.template,t);if(!y.existsSync(n)){let t=r.split(`
|
|
5
|
+
`).slice(0,10).join(`
|
|
6
|
+
`),n=r.split(`
|
|
7
|
+
`).length>10;return`${I.blue}File: ${e.file}${I.reset}\n${I.green}+ New file would be created${I.reset}\n${I.gray}Content preview:${I.reset}\n${t}${n?`
|
|
8
|
+
...`:``}`}try{let t=await F(n,`utf-8`);if(t===r)return`${I.cyan}→ No changes${I.reset}`;let i=R(t,r);return`${I.blue}File: ${e.file}${I.reset}\n${i.join(`
|
|
9
|
+
`)}`}catch(e){return`${I.red}✗ Error: ${e instanceof Error?e.message:String(e)}${I.reset}`}}async function Oe(e,t,n){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${I.yellow}⊘ Condition not met - task would be skipped${I.reset}`;let r=v.join(b.cwd(),e.file);if(y.existsSync(r))return`${I.cyan}→ File already exists, would be skipped: ${e.file}${I.reset}`;try{if(j(e)){let r=await P(e,t,n),i=r.split(`
|
|
10
|
+
`).slice(0,10).join(`
|
|
11
|
+
`),a=r.split(`
|
|
12
|
+
`).length>10;return`${I.blue}File: ${e.file}${I.reset}\n${I.green}+ New file would be created${I.reset}\n${I.gray}Content preview:${I.reset}\n${i}${a?`
|
|
13
|
+
...`:``}`}let r=Te(e);return`${I.blue}File: ${e.file}${I.reset}\n${I.green}+ New file would be created from ${r}${I.reset}`}catch(e){return`${I.red}✗ Error: ${e instanceof Error?e.message:String(e)}${I.reset}`}}async function ke(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${I.yellow}⊘ Condition not met - task would be skipped${I.reset}`;let n=v.join(b.cwd(),e.file);if(!y.existsSync(n))return`${I.red}✗ File not found: ${e.file}${I.reset}`;try{let r=await F(n,`utf-8`),i=new RegExp(e.pattern,e.flags??`g`),a=d(e.replacement,t),o=r.replace(i,a);if(r===o)return`${I.cyan}→ No matches found${I.reset}`;let s=R(r,o);return`${I.blue}File: ${e.file}${I.reset}\n${s.join(`
|
|
14
|
+
`)}`}catch(e){return`${I.red}✗ Error: ${e instanceof Error?e.message:String(e)}${I.reset}`}}async function Ae(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${I.yellow}⊘ Condition not met - task would be skipped${I.reset}`;let n=v.join(b.cwd(),e.file);if(!y.existsSync(n))return`${I.red}✗ File not found: ${e.file}${I.reset}`;try{let r=await F(n,`utf-8`),i=r;for(let{find:n,replace:i}of e.replacements){let e=d(n,t),a=d(i,t);r=r.replace(e,a)}if(i===r)return`${I.cyan}→ No changes${I.reset}`;let a=R(i,r);return`${I.blue}File: ${e.file}${I.reset}\n${a.join(`
|
|
15
|
+
`)}`}catch(e){return`${I.red}✗ Error: ${e instanceof Error?e.message:String(e)}${I.reset}`}}function je(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${I.yellow}⊘ Condition not met - task would be skipped${I.reset}`;let n=e.paths.map(e=>d(e,t)).filter(e=>y.existsSync(v.join(b.cwd(),e)));return n.length===0?`${I.cyan}→ No files/directories to delete${I.reset}`:`${I.red}Would delete:${I.reset}\n${n.map(e=>`${I.red} - ${e}${I.reset}`).join(`
|
|
16
|
+
`)}`}function Me(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${I.yellow}⊘ Condition not met - task would be skipped${I.reset}`;let n=d(e.from,t),r=d(e.to,t),i=v.join(b.cwd(),n),a=v.join(b.cwd(),r);return y.existsSync(i)?y.existsSync(a)?`${I.yellow}⚠ Destination already exists: ${r}${I.reset}\n${I.cyan}Would rename: ${n} → ${r}${I.reset}`:`${I.cyan}Would rename: ${n} → ${r}${I.reset}`:`${I.red}✗ Source not found: ${n}${I.reset}`}function Ne(e){if(e.condition!=null&&e.condition!==``)return`${I.yellow}⊘ Condition check skipped in dry-run${I.reset}`;let t=v.join(b.cwd(),`.git`),n=y.existsSync(t),r=[];if(e.removeExisting&&n&&r.push(`${I.red}Would remove existing .git directory${I.reset}`),r.push(`${I.green}Would initialize git repository${I.reset}`),e.initialCommit){let t=e.message??`Initial commit`;r.push(`${I.green}Would create initial commit: "${t}"${I.reset}`)}return r.join(`
|
|
17
|
+
`)}function Pe(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${I.yellow}⊘ Condition not met - task would be skipped${I.reset}`;let n=d(e.command,t),r=e.cwd==null?b.cwd():d(e.cwd,t);return`${I.yellow}Would execute:${I.reset}\n${I.cyan} Command: ${n}${I.reset}\n${I.cyan} Working directory: ${r}${I.reset}`}function Fe(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${I.yellow}⊘ Condition not met - task would be skipped${I.reset}`;let n=d(e.from,t),r=d(e.to,t),i=v.join(b.cwd(),n),a=v.join(b.cwd(),r);return y.existsSync(i)?y.existsSync(a)?`${I.yellow}⚠ Destination already exists: ${r}${I.reset}\n${I.cyan}Would move: ${n} → ${r}${I.reset}`:`${I.cyan}Would move: ${n} → ${r}${I.reset}`:`${I.red}✗ Source not found: ${n}${I.reset}`}function Ie(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${I.yellow}⊘ Condition not met - task would be skipped${I.reset}`;let n=d(e.from,t),r=d(e.to,t),i=v.join(b.cwd(),n),a=v.join(b.cwd(),r);if(!y.existsSync(i))return`${I.red}✗ Source not found: ${n}${I.reset}`;let o=y.statSync(i).isDirectory()?`directory`:`file`;return y.existsSync(a)?`${I.yellow}⚠ Destination already exists: ${r}${I.reset}\n${I.cyan}Would copy ${o}: ${n} → ${r}${I.reset}`:`${I.cyan}Would copy ${o}: ${n} → ${r}${I.reset}`}async function Le(e,t,n){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${I.yellow}⊘ Condition not met - task would be skipped${I.reset}`;let r=v.join(b.cwd(),e.file),i={};e.content==null?e.template!=null&&(i.template=e.template):i.template=e.content,e.templateFile!=null&&(i.templateFile=e.templateFile);try{let a=await P(i,t,n),o=a.split(`
|
|
18
|
+
`).slice(0,10).join(`
|
|
19
|
+
`),s=a.split(`
|
|
20
|
+
`).length>10;return y.existsSync(r)?`${I.blue}File: ${e.file}${I.reset}\n${I.green}+ Would append content${I.reset}\n${I.gray}Content preview:${I.reset}\n${o}${s?`
|
|
21
|
+
...`:``}`:`${I.blue}File: ${e.file}${I.reset}\n${I.green}+ New file would be created with content${I.reset}\n${I.gray}Content preview:${I.reset}\n${o}${s?`
|
|
22
|
+
...`:``}`}catch(e){return`${I.red}✗ Error: ${e instanceof Error?e.message:String(e)}${I.reset}`}}function Re(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${I.yellow}⊘ Condition not met - task would be skipped${I.reset}`;let n=d(e.path,t),r=v.join(b.cwd(),n);return y.existsSync(r)?`${I.cyan}→ Directory already exists: ${n}${I.reset}`:`${I.green}+ Would create directory: ${n}${I.reset}`}async function ze(e,t){try{switch(e.type){case`update-json`:return await Ee(e.config,t);case`write`:return await De(e.config,t);case`create`:return await Oe(e.config,t,e);case`regex-replace`:return await ke(e.config,t);case`replace-in-file`:return await Ae(e.config,t);case`delete`:return je(e.config,t);case`rename`:return Me(e.config,t);case`move`:return Fe(e.config,t);case`copy`:return Ie(e.config,t);case`append`:return await Le(e.config,t,e);case`mkdir`:return Re(e.config,t);case`git-init`:return Ne(e.config);case`exec`:return Pe(e.config,t);default:{let t=e.type;return`${I.yellow}⚠ Diff not available for task type: ${t}${I.reset}`}}}catch(e){return`${I.red}✗ Error generating diff: ${e instanceof Error?e.message:String(e)}${I.reset}`}}async function Be(e,t){console.log(`${I.blue}═══════════════════════════════════════════════════════${I.reset}`),console.log(`${I.blue} DRY RUN - Preview of changes${I.reset}`),console.log(`${I.blue}═══════════════════════════════════════════════════════${I.reset}`);for(let n of e){console.log(`${I.cyan}▶ Task: ${n.name}${I.reset}`),n.description!=null&&n.description!==``&&console.log(`${I.gray} ${n.description}${I.reset}`);let e=await ze(n,t);console.log(e),console.log(`${I.gray}${`─`.repeat(55)}${I.reset}`)}console.log(`${I.blue}═══════════════════════════════════════════════════════${I.reset}`),console.log(`${I.yellow} No changes were applied (dry-run mode)${I.reset}`),console.log(`${I.blue}═══════════════════════════════════════════════════════${I.reset}`)}const z=new Map,B={},V=new Map;function H(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(z.has(e.name))throw TypeError(`Plugin ${e.name} is already registered`);for(let t of e.taskTypes)if(V.has(t)){let e=V.get(t);throw TypeError(`Task type "${t}" is already registered by plugin "${e}"`)}z.set(e.name,e);for(let t of e.taskTypes)V.set(t,e.name);m(`Registered plugin: ${e.name}${e.version==null?``:` v${e.version}`}`)}function Ve(e){let t=z.get(e);if(t!=null){for(let e of t.taskTypes)V.delete(e);z.delete(e)}}function He(e){return z.get(e)}function U(e){let t=V.get(e);if(t!=null)return z.get(t)}function W(e){return V.has(e)}function Ue(){return Array.from(z.keys())}function We(){z.clear(),V.clear()}function Ge(e){e.beforeAll!=null&&(B.beforeAll=e.beforeAll),e.afterAll!=null&&(B.afterAll=e.afterAll),e.beforeTask!=null&&(B.beforeTask=e.beforeTask),e.afterTask!=null&&(B.afterTask=e.afterTask),e.onError!=null&&(B.onError=e.onError)}async function G(e,...t){let n=B[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){s(`Error in ${e} hook: ${t instanceof Error?t.message:String(t)}`,`error`)}}async function Ke(e,t,n){let r=U(e.type);if(r==null)throw TypeError(`No plugin found for task type: ${e.type}`);await r.execute(e,t,n)}async function qe(e,t){let n=U(e.type);if(!(n==null||n.getDiff==null))return n.getDiff(e,t)}function Je(e){let t=U(e.type);return t==null?[`No plugin found for task type: ${e.type}`]:t.validate==null?[]:t.validate(e)}function Ye(e,t,n,r){return{name:e,...r?.version!=null&&{version:r.version},taskTypes:[t],execute:n,...r?.getDiff!=null&&{getDiff:r.getDiff},...r?.validate!=null&&{validate:r.validate}}}async function K(e,t,n){if(e===void 0)return;if(typeof e!=`object`||!e||Array.isArray(e))return typeof e==`string`&&n&&/\{\{\w+\}\}/u.test(e)?d(e,n):e;let r=e;if(r.type===`conditional`){if(!n)return;if(typeof r.condition!=`string`){s(`Prompt "${t}": conditional default must have a string condition`,`error`);return}try{let{evaluateCondition:e}=await import(`./utils-ChEwzXBK.js`),t=e(r.condition,n)?r.ifTrue:r.ifFalse;return typeof t==`string`&&/\{\{\w+\}\}/u.test(t)&&(t=d(t,n)),t}catch(e){s(`Prompt "${t}": failed to evaluate conditional default: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}if(r.type===`exec`){let e=r.value;if(typeof e!=`string`){s(`Prompt "${t}": exec default value must have a string command`,`error`);return}try{let t=S(e,{encoding:`utf-8`,stdio:[`pipe`,`pipe`,`pipe`],timeout:1e4}).trim();if(t.startsWith(`{`)||t.startsWith(`[`))try{return JSON.parse(t)}catch{return t}if(/^-?\d+(?:\.\d+)?$/u.test(t)){let e=Number.parseFloat(t);if(!Number.isNaN(e))return e}return t===`true`||t===`false`?t===`true`:t}catch(e){s(`Prompt "${t}": failed to execute default value command: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}else if(r.type===`static`)return r.value;else if(r.type!==void 0){s(`Prompt "${t}": unknown default value type "${r.type}". Expected "static", "exec", or "conditional".`,`error`);return}return e}async function q(e,t=new Map,n={}){let r={};if(e.length===0)return r;for(let i of e){if(i.$templateEnabled!=null&&!await c(i.$templateEnabled,{...n,...r}))continue;let e={...n,...r};if(await c(i.enabled,e))try{let n,a=t.get(i.id);switch(i.default!==void 0&&(a=await K(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 C(e),i.required&&(n==null||typeof n==`string`&&n.trim()===``))throw s(`${i.message} is required`,`error`),E.required(i.id);break}case`password`:if(n=await ne({message:i.message,mask:`*`}),i.required&&(n==null||typeof n==`string`&&n.trim()===``))throw s(`${i.message} is required`,`error`),E.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 te(e),i.required&&n==null)throw s(`${i.message} is required`,`error`),E.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 re(e);break}case`confirm`:{let e=a===void 0?!1:!!a;n=await ee({message:i.message,default:e});break}default:throw s(`Unknown prompt type: ${i.type}`,`error`),E.unknownType(i.type)}r[i.id]=n}catch(e){throw e instanceof Error&&s(`Failed to collect prompt "${i.id}": ${e.message}`,`error`),e}}return r}async function J(e){let t=new Map,n=e.map(async e=>{if(e.default!==void 0){let n=await K(e.default,e.id);n!==void 0&&t.set(e.id,n)}});return await Promise.all(n),t}function Y(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 Xe=x(y.appendFile),Ze=x(y.readFile),Qe=x(y.stat);async function $e(e,t,n){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t)){s(`Condition not met, skipping append task`,`info`);return}let r=v.join(b.cwd(),e.file),i={};e.content==null?e.template!=null&&(i.template=e.template):i.template=e.content,e.templateFile!=null&&(i.templateFile=e.templateFile);let a=N(i);if(!a.isValid)throw a.error?.includes(`cannot have both`)?D.templateHasBothTemplateAndFile():D.templateMissingTemplateOrFile();let o=await P(i,t,n),c=!1,l=!1;try{await Qe(r),c=!0;let t=await Ze(r,`utf-8`);t.length>0&&!t.endsWith(`
|
|
23
|
+
`)&&(l=e.newline!==!1)}catch{}c&&l?await Xe(r,`\n${o}`):await Xe(r,o),s(`Appended content to ${e.file}`,`success`)}const et={name:`append`,version:`1.0.0`,taskTypes:[`append`],execute:async(e,t,n)=>{n.dryRun||await $e(e.config,t,e)}},tt=x(y.copyFile),nt=x(y.stat),rt=x(y.mkdir),it=x(y.readdir);async function at(e,t){await rt(t,{recursive:!0});let n=await it(e,{withFileTypes:!0});await Promise.all(n.map(async n=>{let r=v.join(e,n.name),i=v.join(t,n.name);n.isDirectory()?await at(r,i):await tt(r,i)}))}async function ot(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t)){s(`Condition not met, skipping copy task`,`info`);return}let n=v.join(b.cwd(),e.from),r=v.join(b.cwd(),e.to),i;try{i=await nt(n)}catch{s(`Source path does not exist: ${n}`,`warn`);return}await rt(v.dirname(r),{recursive:!0}),i.isDirectory()?(await at(n,r),s(`Copied directory ${e.from} to ${e.to}`,`success`)):(await tt(n,r),s(`Copied file ${e.from} to ${e.to}`,`success`))}const st={name:`copy`,version:`1.0.0`,taskTypes:[`copy`],execute:async(e,t,n)=>{n.dryRun||await ot(e.config,t)}},ct=x(y.writeFile);async function lt(e,t,n){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t)){s(`Condition not met, skipping create task`,`info`);return}let r=v.join(b.cwd(),e.file);if(y.existsSync(r)){s(`File already exists, skipping: ${e.file}`,`info`);return}let i=N(e);if(!i.isValid)throw i.error?.includes(`cannot have both`)?D.createHasBothTemplateAndFile():D.createMissingTemplateOrFile();let a=await P(e,t,n),o=v.dirname(r);y.existsSync(o)||y.mkdirSync(o,{recursive:!0}),await ct(r,a),s(`Created file: ${e.file}`,`success`)}const ut={name:`create`,version:`1.0.0`,taskTypes:[`create`],execute:async(e,t,n)=>{n.dryRun||await lt(e.config,t,e)}};async function dt(e,t){let{paths:n,condition:r}=e;if(r!=null&&r!==``){if(!t){s(`Condition specified but no config provided, skipping deletion`,`warn`);return}if(!p(r,t)){s(`Condition not met, skipping deletion`,`info`);return}}for(let e of n){let t=v.join(b.cwd(),e);y.existsSync(t)&&y.rmSync(t,{recursive:!0,force:!0})}}const ft={name:`delete`,version:`1.0.0`,taskTypes:[`delete`],execute:async(e,t,n)=>{n.dryRun||await dt(e.config,t)}};async function pt(e,t){if(e.condition!=null&&e.condition!==``){if(!t){s(`Condition specified but no config provided, skipping exec`,`warn`);return}if(!p(e.condition,t)){s(`Condition not met, skipping exec task`,`info`);return}}let n=e.cwd==null?b.cwd():v.join(b.cwd(),e.cwd);S(e.command,{cwd:n,stdio:`inherit`})}const mt={name:`exec`,version:`1.0.0`,taskTypes:[`exec`],execute:async(e,t,n)=>{n.dryRun||await pt(e.config,t)}};async function ht(e,t){if(e.condition!=null&&e.condition!==``){if(!t){s(`Condition specified but no config provided, skipping git-init`,`warn`);return}if(!p(e.condition,t)){s(`Condition not met, skipping git-init task`,`info`);return}}if(e.removeExisting){let e=v.join(b.cwd(),`.git`);y.existsSync(e)&&y.rmSync(e,{recursive:!0,force:!0})}if(S(`git init`,{stdio:`inherit`}),e.initialCommit){let t=e.message??`Initial commit`;S(`git add .`,{stdio:`inherit`}),S(`git commit -m "${t}"`,{stdio:`inherit`})}}const gt={name:`git-init`,version:`1.0.0`,taskTypes:[`git-init`],execute:async(e,t,n)=>{n.dryRun||await ht(e.config,t)}},_t=x(y.mkdir);async function vt(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t)){s(`Condition not met, skipping mkdir task`,`info`);return}await _t(v.join(b.cwd(),e.path),{recursive:!0}),s(`Created directory: ${e.path}`,`success`)}const yt={name:`mkdir`,version:`1.0.0`,taskTypes:[`mkdir`],execute:async(e,t,n)=>{n.dryRun||await vt(e.config,t)}},bt=x(y.rename),xt=x(y.stat),St=x(y.mkdir);async function Ct(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t)){s(`Condition not met, skipping move task`,`info`);return}let n=v.join(b.cwd(),e.from),r=v.join(b.cwd(),e.to);try{await xt(n)}catch{s(`Source path does not exist: ${n}`,`warn`);return}await St(v.dirname(r),{recursive:!0}),await bt(n,r),s(`Moved ${e.from} to ${e.to}`,`success`)}const wt={name:`move`,version:`1.0.0`,taskTypes:[`move`],execute:async(e,t,n)=>{n.dryRun||await Ct(e.config,t)}},Tt=x(y.readFile),Et=x(y.writeFile);async function Dt(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t)){s(`Condition not met, skipping regex-replace task`,`info`);return}let n=v.join(b.cwd(),e.file),{pattern:r}=e,i=e.flags??``,a=e.replacement||``,o=await Tt(n,`utf-8`),c=new RegExp(r,i);o=o.replace(c,d(a,t)),await Et(n,o)}const Ot={name:`regex-replace`,version:`1.0.0`,taskTypes:[`regex-replace`],execute:async(e,t,n)=>{n.dryRun||await Dt(e.config,t)}},kt=x(y.rename);async function At(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t)){s(`Condition not met, skipping rename task`,`info`);return}let n=v.join(b.cwd(),d(e.from,t)),r=v.join(b.cwd(),d(e.to,t));if(!y.existsSync(n)){s(`Source path does not exist: ${n}`,`warn`);return}await kt(n,r)}const jt={name:`rename`,version:`1.0.0`,taskTypes:[`rename`],execute:async(e,t,n)=>{n.dryRun||await At(e.config,t)}},Mt=x(y.readFile),Nt=x(y.writeFile);async function Pt(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t)){s(`Condition not met, skipping replace-in-file task`,`info`);return}let n=v.join(b.cwd(),e.file),{replacements:r}=e;if(!y.existsSync(n)){s(`File not found: ${n}, skipping`,`warn`);return}let i=await Mt(n,`utf-8`);for(let{find:e,replace:n}of r){let r=d(n,t);i=i.replace(new RegExp(e,`gu`),r)}await Nt(n,i)}const Ft={name:`replace-in-file`,version:`1.0.0`,taskTypes:[`replace-in-file`],execute:async(e,t,n)=>{n.dryRun||await Pt(e.config,t)}},It=x(y.readFile),Lt=x(y.writeFile);async function Rt(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t)){s(`Condition not met, skipping update-json task`,`info`);return}let n=v.join(b.cwd(),e.file),{updates:r}=e,i=await It(n,`utf-8`),a=JSON.parse(i);function o(e){if(typeof e==`string`)return d(e,t);if(Array.isArray(e))return e.map(e=>o(e));if(typeof e==`object`&&e){let t={};for(let[n,r]of Object.entries(e))t[n]=o(r);return t}return e}for(let[e,t]of Object.entries(r)){let n=o(t);e.includes(`.`)?f(a,e,n):a[e]=n}await Lt(n,`${JSON.stringify(a,null,2)}\n`)}const zt={name:`update-json`,version:`1.0.0`,taskTypes:[`update-json`],execute:async(e,t,n)=>{n.dryRun||await Rt(e.config,t)}},Bt=x(y.writeFile);async function Vt(e,t,n){let{allowCreate:r=!0}=e;if(e.condition!=null&&e.condition!==``&&!p(e.condition,t)){s(`Condition not met, skipping write task`,`info`);return}let i=v.join(b.cwd(),e.file);if(!y.existsSync(i)){if(r===!1)throw Error(`Write task failed: file does not exist (${e.file})`);s(`File not found, creating new file: ${e.file}`,`info`)}let a=N(e);if(!a.isValid)throw a.error?.includes(`cannot have both`)?D.templateHasBothTemplateAndFile():D.templateMissingTemplateOrFile();let o=await P(e,t,n),c=v.dirname(i);y.existsSync(c)||y.mkdirSync(c,{recursive:!0}),await Bt(i,o)}const Ht={name:`write`,version:`1.0.0`,taskTypes:[`write`],execute:async(e,t,n)=>{n.dryRun||await Vt(e.config,t,e)}};function X(){W(`update-json`)||(H(zt),H(Ht),H(ut),H(Ot),H(Ft),H(ft),H(jt),H(gt),H(mt),H(wt),H(st),H(et),H(yt))}async function Ut(e,t,n=!1){if(X(),n){s(`[DRY RUN] Would execute: ${e.name}`,`info`);return}if(W(e.type)){await Ke(e,t,{dryRun:n});return}throw TypeError(`Unknown task type: ${e.type}`)}async function Z(e,t,n,r,i=!1){try{return s(`[${n}/${r}] Running: ${e.name}...`,`info`),await Ut(e,t,i),s(`[${n}/${r}] Completed: ${e.name}...`,`success`),!0}catch(t){return s(`Failed: ${e.name}`,`error`),t instanceof Error&&(s(` Reason: ${t.message}`,`error`),t.stack!=null&&b.env.DEBUG!=null&&console.error(t.stack)),!1}}function Wt(e){let t=[],r=new Set,i=new Set,a=new Map(e.map(e=>[e.id,e]));function o(e){if(r.has(e))return;if(i.has(e))throw n.forTaskDependency(e);i.add(e);let s=a.get(e);if(!s)throw ie.forId(e);if(s.dependencies)for(let e of s.dependencies)o(e);i.delete(e),r.add(e),t.push(s)}for(let t of e)r.has(t.id)||o(t.id);return t}function Gt(e){let t=[];for(let n of e)if(!W(n.type))t.push(`Task "${n.id}" (${n.name}): Unknown task type "${n.type}"`);else if(n.type===`write`){let e=Kt(n);t.push(...e)}return t}function Kt(e){let t=[],n=e.config,r=typeof n.template==`string`?n.template:void 0,i=typeof n.templateFile==`string`?n.templateFile:void 0,a=N({...r!==void 0&&{template:r},...i!==void 0&&{templateFile:i}});return!a.isValid&&a.error!=null&&a.error!==``&&t.push(`Task "${e.id}" (${e.name}): ${a.error}`),(n.file==null||n.file===``)&&t.push(`Task "${e.id}" (${e.name}): Write task requires "file" property to specify the output file path`),t}function qt(e){s(`❌ Template validation failed:`,`error`),s(``,`error`);for(let t of e)s(` • ${t}`,`error`);s(``,`error`),s(`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 Jt(e,t,n){if(e==null)return;if(typeof e!=`object`||!e||Array.isArray(e))return e;let r=e;if(r.type===`conditional`){if(!n){s(`Variable "${t}": conditional value requires context but none provided`,`warn`);return}if(typeof r.condition!=`string`){s(`Variable "${t}": conditional value must have a string condition`,`error`);return}try{let{evaluateCondition:e,interpolateTemplate:t}=await import(`./utils-ChEwzXBK.js`),i=e(r.condition,n)?r.ifTrue:r.ifFalse;return typeof i==`string`&&/\{\{\w+\}\}/u.test(i)&&(i=t(i,n)),i}catch(e){s(`Variable "${t}": failed to evaluate conditional value: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}if(r.type===`exec`){let e=r.value;if(typeof e!=`string`){s(`Variable "${t}": exec value must have a string command`,`error`);return}try{let t=S(e,{encoding:`utf-8`,stdio:[`pipe`,`pipe`,`pipe`],timeout:1e4}).trim();if(t.startsWith(`{`)||t.startsWith(`[`))try{return JSON.parse(t)}catch{return t}if(/^-?\d+(?:\.\d+)?$/u.test(t)){let e=Number.parseFloat(t);if(!Number.isNaN(e))return e}return t===`true`||t===`false`?t===`true`:t}catch(e){s(`Variable "${t}": failed to execute command: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}else if(r.type===`static`)return r.value;return e}async function $(e,t,n){let r=new Map;for(let i of e){if(n?.skipConditional===!0&&typeof i.value==`object`&&i.value!==null&&!Array.isArray(i.value)&&i.value.type===`conditional`)continue;if(i.$templateEnabled!=null){let e={...t};for(let[t,n]of r.entries())e[t]=n;if(!await c(i.$templateEnabled,e))continue}let e={...t};for(let[t,n]of r.entries())e[t]=n;let a=await Jt(i.value,i.id,e);a!==void 0&&r.set(i.id,a)}return r}function Yt(e){let t=[],n=new Set;for(let r of e)n.has(r.id)&&t.push(`Duplicate variable ID: "${r.id}"`),n.add(r.id);return t}async function Xt(t,n){let a=e();if(!await c(n.templateEnabled,a,{lazy:!0})){i(`⊘ Template is disabled - skipping all execution`);return}m(`Registering built-in plugins...`),X(),m(`Validating task configurations...`);let o=Gt(t);o.length>0&&(qt(o),b.exit(1)),m(`All tasks validated successfully`);let d=t.filter(t=>r(t.enabled,e(),{lazy:!0}));m(`Resolving task dependencies...`);let f=Wt(d);m(`Sorted ${f.length} task(s) by dependencies`),i(`Welcome! Let's execute your tasks.`),n.dryRun&&l(`🔍 DRY RUN MODE - No changes will be made`),i(`This will execute your project tasks based on the defined configuration.`);let p=a,h=[...n.globalVariables??[]];if(h.length>0){let e=Yt(h);e.length>0&&(s(`❌ Variable validation errors:`,`error`),e.forEach(e=>s(` - ${e}`,`error`)),b.exit(1)),m(`Resolving variable values...`);let t=Q(h,await $(h,p,{skipConditional:!0}));Object.assign(p,t),Object.keys(t).length>0&&m(`Resolved ${Object.keys(t).length} variable(s)`)}let g=n.globalPrompts??[],_=[...g];if(_.length>0){let e=Y(_);e.length>0&&(s(`❌ Prompt validation errors:`,`error`),e.forEach(e=>s(` - ${e}`,`error`)),b.exit(1)),m(`Resolving prompt default values...`);let t=await J(_);if(g.length>0){i(`📋 Collecting prompts (available to all tasks):`);let e=await q(g,t,p);Object.assign(p,e)}}if(h.length>0){let e=h.filter(e=>typeof e.value==`object`&&e.value!==null&&!Array.isArray(e.value)?e.value.type===`conditional`:!1);if(e.length>0){m(`Re-resolving conditional variables with prompt values...`);let t=Q(e,await $(e,p));Object.assign(p,t),Object.keys(t).length>0&&m(`Resolved ${Object.keys(t).length} conditional variable(s)`)}}if(!await c(n.templateEnabled,p)){i(`⊘ Template is disabled after variable resolution - skipping all execution`);return}let v=[];for(let e of f)e.$templateEnabled!=null&&!await c(e.$templateEnabled,p)||await c(e.enabled,p)&&v.push(e);if(s(`${v.length} of ${f.length} task(s) enabled for execution`,`info`),n.dryRun){await Be(v,p),i(`🔍 Dry run completed - no changes were made`),i(`Run without --dry-run to apply changes`);return}m(`Calling beforeAll hook...`),await G(`beforeAll`,p);let y=v.length,x=0,S=0,ee=[],C=[];for(let e=0;e<v.length;e++){let t=v[e];t!=null&&(m(`Calling beforeTask hook for task: ${t.name}`),await G(`beforeTask`,t,p),await Z(t,p,e+1,y,n.dryRun)?(x++,ee.push(t.id),m(`Calling afterTask hook for task: ${t.name}`),await G(`afterTask`,t,p)):(t.required!==!1&&(S++,C.push(t.name)),m(`Calling onError hook for task: ${t.name}`),await G(`onError`,Error(`Task ${t.name} failed`),t),l(`⚠️ Task "${t.name}" failed, continuing with remaining tasks...`)))}S>0&&(s(`\n❌ Task execution completed with ${S} error(s)`,`error`),s(`Completed: ${x}/${y} tasks`,`info`),s(`Failed tasks: ${C.join(`, `)}`,`error`),b.exit(1)),m(`Calling afterAll hook...`),await G(`afterAll`,p),u(`✅ All tasks completed successfully!`),u(` Completed: ${x}/${y} tasks`)}async function Zt(e,t,n={}){m(`Running templates with sequential variable/prompt resolution...`),m(`Total templates to process: ${e.length}`),m(`Registering built-in plugins...`),X();let r=[];console.log(``),i(`📋 Collecting input...`),console.log(``);for(let t=0;t<e.length;t++){let a=e[t];if(a==null)continue;let o=`=`.repeat(60);if(m(`\n${o}`),m(`Processing template ${t+1}/${e.length}: "${a.name}"`),m(o),m(`Current config keys: ${Object.keys(n).join(`, `)}`),!await c(a.enabled,n)){i(`⊘ Template "${a.name}" is disabled - skipping`),m(` Enabled condition: ${JSON.stringify(a.enabled)}`);continue}let l=a.variables??[];if(l.length>0){m(`Processing ${l.length} variable(s) for template "${a.name}"...`);let e=Yt(l);e.length>0&&(s(`❌ Variable validation errors:`,`error`),e.forEach(e=>s(` - ${e}`,`error`)),b.exit(1));let t=Q(l,await $(l,n,{skipConditional:!0}));Object.assign(n,t);let r=l.filter(e=>typeof e.value==`object`&&e.value!==null&&!Array.isArray(e.value)?e.value.type===`conditional`:!1),i=0;if(r.length>0){let e=Q(r,await $(r,n));if(i=Object.keys(e).length,Object.assign(n,e),i>0){m(`Resolved ${i} conditional variable(s)`);for(let[t,n]of Object.entries(e))m(` ${t} = ${JSON.stringify(n)}`)}}let o=Object.keys(t).length+i;o>0&&m(`Total variables resolved for template: ${o}`)}let u=a.prompts??[];if(u.length>0){m(`Processing ${u.length} prompt(s) for template "${a.name}"...`);let e=Y(u);e.length>0&&(s(`❌ Prompt validation errors:`,`error`),e.forEach(e=>s(` - ${e}`,`error`)),b.exit(1));let t=await q(u,await J(u),n);Object.assign(n,t),m(`Collected ${Object.keys(t).length} prompt answer(s)`)}if(!await c(a.enabled,n)){i(`⊘ Template "${a.name}" became disabled after variable/prompt resolution - skipping tasks`);continue}let d=a.tasks??[];d.length>0&&(m(`Found ${d.length} task(s) in template "${a.name}" (will execute later)`),r.push(...d))}if(m(`
|
|
24
|
+
🔧 Validating and filtering all collected tasks...`),r.length===0){s(`No tasks found in any template`,`info`);return}let a=Gt(r);a.length>0&&(qt(a),b.exit(1)),console.log(``),s(`🛠️ Preparing tasks...`,`info`);let o=[];for(let e of r)await c(e.enabled,n)&&o.push(e);if(console.log(``),s(`Found ${r.length} tasks (${o.length} enabled)`,`info`),s(`All tasks validated successfully`,`success`),o.length===0){s(`No enabled tasks to execute`,`info`);return}let u=Wt(o);if(t.dryRun){s(`
|
|
25
|
+
🔍 Dry run - showing task changes...`,`info`),await Be(u,n),s(`
|
|
26
|
+
🔍 Dry run completed - no changes were made`,`info`),s(`Run without --dry-run to apply changes`,`info`);return}console.log(``),i(`⚙️ Executing tasks...`),console.log(``),await G(`beforeAll`,n);let d=0,f=0,p=[];for(let e=0;e<u.length;e++){let r=u[e];r!=null&&(await G(`beforeTask`,r,n),await Z(r,n,e+1,u.length,t.dryRun)?(d++,await G(`afterTask`,r,n)):(r.required!==!1&&(f++,p.push(r.name)),await G(`onError`,Error(`Task ${r.name} failed`),r),l(`⚠️ Task "${r.name}" failed, continuing with remaining tasks...`)))}await G(`afterAll`,n),f>0&&(s(`\n❌ Task execution completed with ${f} error(s)`,`error`),s(`Completed: ${d}/${u.length} tasks`,`info`),s(`Failed tasks: ${p.join(`, `)}`,`error`),b.exit(1)),s(`Completed: ${d}/${u.length} tasks`,`success`)}export{je as A,j as B,Ue as C,Je as D,Ve as E,Ae as F,Se as G,P as H,ze as I,de as J,me as K,Ee as L,Ne as M,ke as N,Be as O,Me as P,De as R,W as S,H as T,we as U,M as V,N as W,ve as X,pe as Y,Ye as _,Jt as a,U as b,Ut as c,Y as d,J as f,We as g,G as h,$ as i,Pe as j,Oe as k,X as l,K as m,Zt as n,Q as o,q as p,Ce as q,Yt as r,Wt as s,Xt as t,Z as u,Ke as v,Ge as w,qe as x,He as y,Te as z};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
const e=require(`./utils-BeqQVvh1.cjs`),t=require(`./config-DlJs75hK.cjs`);let n=require(`node:fs`);n=e.S(n);let r=require(`node:path`);r=e.S(r);let i=require(`node:process`);i=e.S(i);let a=require(`node:util`);a=e.S(a);let o=require(`node:child_process`);o=e.S(o);let s=require(`@inquirer/prompts`);s=e.S(s);var c=class t extends e.x{constructor(e,t,n,r){super(e,`DUPLICATE_ID`),this.id=t,this.type=n,this.existingType=r,this.name=`DuplicateIdError`}static forId(e,n,r){return new t(`Duplicate ID "${e}" found in ${n}. This ID is already used in ${r??`unknown`}`,e,n,r)}},l=class t extends e.x{constructor(e,t,n,r,i){super(e,`ID_CONFLICT`),this.id=t,this.type=n,this.baseSource=r,this.overrideSource=i,this.name=`IdConflictError`}static forTask(e,n,r){return new t(`Task ID conflict: "${e}" is defined in multiple templates.\n Base task from: ${n??`unknown`}\n Override task from: ${r??`unknown`}\n You must specify an override strategy: add "override": "merge" or "override": "replace" to the task.\n Task is being extended/overridden but no override strategy was specified.`,e,`task`,n,r)}static forVariable(e){return new t(`Variable ID conflict: "${e}" is defined in multiple templates.\n You must specify an override strategy: add "override": "merge" or "override": "replace" to the variable.\n Variable is being extended/overridden but no override strategy was specified.`,e,`variable`)}static forPrompt(e){return new t(`Prompt ID conflict: "${e}" is defined in multiple templates.\n You must specify an override strategy: add "override": "merge" or "override": "replace" to the prompt.\n Prompt is being extended/overridden but no override strategy was specified.`,e,`prompt`)}},u=class t extends e.x{constructor(e,t){super(e,`TASK_NOT_FOUND`),this.taskId=t,this.name=`TaskNotFoundError`}static forId(e){return new t(`Task not found: ${e}`,e)}},d=class t extends e.x{constructor(e,t,n){super(e,`PROMPT_VALIDATION_ERROR`),this.promptId=t,this.reason=n,this.name=`PromptValidationError`}static required(e){return new t(`Prompt "${e}" is required`,e,`required`)}static unknownType(e){return new t(`Unknown prompt type: ${e}`,e,`unknown_type`)}},f=class t extends e.x{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`)}};function p(t){let n=new Map;for(let e of t){let t=n.get(e.name)||[];t.push(e),n.set(e.name,t)}if(Array.from(n.values()).some(e=>e.length>1))return t;let r=new Map,i=new Map,a=new Map;for(let e of t)if(r.set(e.name,e),a.set(e.name,new Set),e.dependencies!=null&&e.dependencies.length>0)for(let t of e.dependencies)a.get(e.name).add(t),i.has(t)||i.set(t,new Set),i.get(t).add(e.name);let o=new Set,s=new Map;for(let e=0;e<t.length;e++){let n=t[e],r=a.get(n.name).size>0,c=i.has(n.name)&&i.get(n.name).size>0;!r&&!c&&(o.add(n.name),s.set(n.name,e))}let c=t.filter(e=>!o.has(e.name)),l=[],u=new Set,d=new Set;function f(t){if(u.has(t))return;if(d.has(t))throw e.b.forTemplateDependencies(Array.from(d),t);d.add(t);let n=r.get(t);if(n!=null){let e=a.get(t);if(e!=null&&e.size>0)for(let t of e)f(t)}d.delete(t),u.add(t),n!=null&&!o.has(t)&&l.push(n)}for(let e of c)f(e.name);let p=[],m=0;for(let e=0;e<t.length;e++){let n=t[e];o.has(n.name)?p.push(n):m<l.length&&(p.push(l[m]),m++)}return p}const m=(0,a.promisify)(n.default.readFile),h={template:[[`template`,`templateFile`]]};function g(e){if(e==null||e===``)return`current template`;if(_(e))return e;let t=i.default.cwd();return e.startsWith(t)?r.default.relative(t,e):e}function _(e){try{let t=new URL(e);return t.protocol===`http:`||t.protocol===`https:`}catch{return!1}}function v(t,n){if(_(t))return t;if(n==null||n===``)return r.default.isAbsolute(t)?t:r.default.resolve(i.default.cwd(),t);if(_(n))try{let e=new URL(`.`,n);return new URL(t,e).href}catch{throw e.y.forRemoteTemplate(t,n)}let a=r.default.dirname(n);return r.default.isAbsolute(t)?t:r.default.resolve(a,t)}async function ee(t){if(_(t))return te(t);if(!n.default.existsSync(t))throw e._.forPath(t);return m(t,`utf-8`)}async function te(t){try{let n=await fetch(t);if(!n.ok)throw e.g.forUrl(t,n.status,n.statusText);return await n.text()}catch(n){throw n instanceof Error&&n.message.includes(`Failed to fetch`)?n:e.g.forUrl(t,n instanceof Error?n:void 0)}}const y=new Map;async function ne(t,a=new Set){let o=_(t),s;if(s=o||r.default.isAbsolute(t)?t:r.default.resolve(i.default.cwd(),t),y.has(s))return y.get(s);if(a.has(s))throw e.b.forTemplateInheritance(a,s);a.add(s);let c;if(o)c=await te(s);else{if(!n.default.existsSync(s))throw e._.forPath(s);c=await m(s,`utf-8`)}let l;try{l=JSON.parse(c)}catch(t){throw e.v.forFile(s,t instanceof Error?t:Error(String(t)))}if(l.name==null||l.name.trim()===``)throw e.h.missingName(s);if(!/^[a-z\d]+(?:-[a-z\d]+)*$/u.test(l.name))throw e.h.invalidNameFormat(s,l.name);if(l.tasks!==void 0&&!Array.isArray(l.tasks))throw e.h.tasksNotArray(s);l.tasks===void 0&&(l.tasks=[]);for(let e of l.tasks)e.$sourceUrl=s;return y.set(s,l),l}async function re(t,n,a,o,s){let c=_(t),l;if(l=c||r.default.isAbsolute(t)?t:n==null?r.default.resolve(i.default.cwd(),t):_(n)?new URL(t,n).href:r.default.resolve(n,t),a.has(l))return;if(o.has(l))throw e.b.forTemplateInheritance(o,l);o.add(l);let u=await ne(l),d=_(l)?new URL(`.`,l).href:r.default.dirname(l);if(u.extends!=null&&u.extends!==``){let e=Array.isArray(u.extends)?u.extends:[u.extends];for(let t of e)await re(t,d,a,o,s)}o.delete(l),a.add(l),s.push(u)}async function b(e,t,n=new Set){let r=[];return await re(e,t,n,new Set,r),p(r)}async function ie(e,t,n=new Set){return ce(await b(e,t,n))}function ae(e,t,n){let r=new Map;for(let t of e){if(r.has(t.id))throw c.forId(t.id,`task`,r.get(t.id));r.set(t.id,`task`)}if(t!=null)for(let e of t){if(r.has(e.id))throw c.forId(e.id,`variable`,r.get(e.id));r.set(e.id,`variable`)}if(n!=null)for(let e of n){if(r.has(e.id))throw c.forId(e.id,`prompt`,r.get(e.id));r.set(e.id,`prompt`)}}function oe(t,n){if((n.override??`merge`)===`replace`){e.i(` → Variable "${n.id}" using 'replace' strategy`,`info`);let{override:t,...r}=n;return r}e.i(` → Variable "${n.id}" merged (value replaced)`,`info`);let r={...t,...n};return delete r.override,r}function se(t,n){if((n.override??`merge`)===`replace`){e.i(` → Prompt "${n.id}" using 'replace' strategy`,`info`);let{override:t,...r}=n;return r}e.i(` → Prompt "${n.id}" merged`,`info`);let r={...t,...n};return delete r.override,r}function ce(t){if(t.length===0)return{name:`Empty Template`,tasks:[]};if(t.length===1){let e=t[0];return ae(e.tasks??[],e.variables,e.prompts),e}let n=new Map,r=new Map,i=new Map,a={};for(let o of t){if(o.enabled!=null&&(a[o.name]=o.enabled),o.enabled===!1){e.i(`⊘ Skipping disabled template "${o.name}" - its tasks, prompts, and variables will not be included`,`info`);continue}if(o.prompts!=null)for(let e of o.prompts)if(i.has(e.id)){if(e.override==null)throw l.forPrompt(e.id);let t=se(i.get(e.id),e);o.enabled!=null&&(t.$templateEnabled=o.enabled),i.set(e.id,t)}else{let t={...e};o.enabled!=null&&(t.$templateEnabled=o.enabled),i.set(e.id,t)}if(o.variables!=null)for(let e of o.variables)if(r.has(e.id)){if(e.override==null)throw l.forVariable(e.id);let t=oe(r.get(e.id),e);o.enabled!=null&&(t.$templateEnabled=o.enabled),r.set(e.id,t)}else{let t={...e};o.enabled!=null&&(t.$templateEnabled=o.enabled),r.set(e.id,t)}for(let e of o.tasks??[])if(n.has(e.id)){if(e.override==null){let t=n.get(e.id);throw l.forTask(e.id,g(t.$sourceUrl),g(e.$sourceUrl))}let t=de(n.get(e.id),e);o.enabled!=null&&(t.$templateEnabled=o.enabled),n.set(e.id,t)}else{let t={...e};o.enabled!=null&&(t.$templateEnabled=o.enabled),n.set(e.id,t)}}let o=Array.from(n.values()),s=i.size>0?Array.from(i.values()):void 0,c=r.size>0?Array.from(r.values()):void 0;ae(o,c,s);let u=t[t.length-1],d={name:u.name,tasks:o};return u.description!=null&&(d.description=u.description),u.dependencies!=null&&(d.dependencies=u.dependencies),u.enabled!=null&&(d.enabled=u.enabled),s!=null&&(d.prompts=s),c!=null&&(d.variables=c),d}function le(e,t){let n=h[e];if(!n)return null;for(let e of n){let n=e.filter(e=>e in t&&t[e]!=null);if(n.length>1)return n}return null}function ue(e,t,n){let r={...e},i=h[n]??[];for(let[e,n]of Object.entries(t)){for(let t of i)if(t.includes(e)){for(let n of t)n!==e&&delete r[n];break}r[e]=n}return r}function de(t,n){if((n.override??`merge`)===`replace`){e.i(` → Task "${n.id}" using 'replace' strategy - completely replacing base task`,`info`),e.i(` Base: ${g(t.$sourceUrl)}`,`info`),e.i(` Override: ${g(n.$sourceUrl)}`,`info`);let{override:r,...i}=n;return i}e.i(` → Merging task "${n.id}"`,`info`),e.i(` Base: ${g(t.$sourceUrl)}`,`info`),e.i(` Override: ${g(n.$sourceUrl)}`,`info`);let r;if(typeof t.config==`object`&&t.config!==null&&typeof n.config==`object`&&n.config!==null){r=ue(t.config,n.config,n.type);let i=le(n.type,r);i!==null&&i.length>0&&(e.i(` ⚠️ Warning: Conflicting config fields detected: ${i.join(`, `)}`,`warn`),e.i(` Please use override: "replace" or specify only one of these fields`,`warn`))}else r=n.config??t.config;let i=[...t.dependencies??[],...n.dependencies??[]],a=i.length>0?[...new Set(i)]:void 0,o=n.$sourceUrl??t.$sourceUrl,s={...t,...n,config:r,...a!=null&&{dependencies:a},...o!=null&&{$sourceUrl:o}};return delete s.override,s}function fe(){y.clear()}async function pe(t,n){if(e.u(`Loading tasks from ${t}...`),n?.sequential===!0){let n=await b(t);return e.u(`Loaded ${n.length} template(s) for processing`),{tasks:[],templates:n}}let r=await ie(t);e.i(`Loaded ${r.tasks?.length??0} task(s)`,`info`),r.extends!=null&&r.extends!==``&&e.i(`Extended from: ${(Array.isArray(r.extends)?r.extends:[r.extends]).join(`, `)}`,`info`),r.prompts!=null&&r.prompts.length>0&&e.i(`Found ${r.prompts.length} top-level prompt(s)`,`info`),r.variables!=null&&r.variables.length>0&&e.i(`Found ${r.variables.length} top-level variable(s)`,`info`);let i={tasks:r.tasks??[]};return r.prompts!=null&&(i.prompts=r.prompts),r.variables!=null&&(i.variables=r.variables),r.enabled!=null&&(i.enabled=r.enabled),i}function x(e){return e.template!=null&&e.template!==``}function S(e){return e.templateFile!=null&&e.templateFile!==``}function C(e){return e.endsWith(`.hbs`)}function w(e){let t=x(e),n=S(e);return!t&&!n?{isValid:!1,hasInlineTemplate:t,hasTemplateFile:n,error:`Template configuration requires either "template" (inline) or "templateFile" (file path) to be specified`}:t&&n?{isValid:!1,hasInlineTemplate:t,hasTemplateFile:n,error:`Template configuration cannot have both "template" and "templateFile" specified. Use one or the other.`}:{isValid:!0,hasInlineTemplate:t,hasTemplateFile:n}}async function T(t,n,r,i={}){let{enableHandlebars:a=!0,sourceUrl:o=r?.$sourceUrl}=i,s=x(t),c=S(t);if(s)return e.r(t.template,n);if(c){let r=t.templateFile,i=a&&C(r),s=await ee(v(r,o));return i?(await import(`handlebars`)).default.compile(s)(n):e.r(s,n)}throw Error(`No template content available`)}function me(e){return x(e)?`inline template`:S(e)?`template file: ${e.templateFile}`:`no template source`}const E=(0,a.promisify)(n.default.readFile),he=2,ge=10,_e=55,D={reset:`\x1B[0m`,red:`\x1B[31m`,green:`\x1B[32m`,yellow:`\x1B[33m`,blue:`\x1B[34m`,cyan:`\x1B[36m`,gray:`\x1B[90m`};function O(e,t){switch(t){case`add`:return`${D.green}+ ${e}${D.reset}`;case`remove`:return`${D.red}- ${e}${D.reset}`;case`context`:return`${D.gray} ${e}${D.reset}`;default:return e}}function k(e,t){let n=e.split(`
|
|
2
|
+
`),r=t.split(`
|
|
3
|
+
`),i=[],a=Math.max(n.length,r.length);for(let e=0;e<a;e++){let t=n[e],a=r[e];t===a?t!==void 0&&i.push(O(t,`context`)):(t!==void 0&&i.push(O(t,`remove`)),a!==void 0&&i.push(O(a,`add`)))}return i}async function A(t,a){if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,a))return`${D.yellow}⊘ Condition not met - task would be skipped${D.reset}`;let o=r.default.join(i.default.cwd(),t.file);if(!n.default.existsSync(o))return`${D.red}✗ File not found: ${t.file}${D.reset}`;try{let n=await E(o,`utf-8`),r=JSON.parse(n),i={...r};function s(t){if(typeof t==`string`)return e.r(t,a);if(Array.isArray(t))return t.map(e=>s(e));if(typeof t==`object`&&t){let e={};for(let[n,r]of Object.entries(t))e[n]=s(r);return e}return t}for(let[n,i]of Object.entries(t.updates)){let t=s(i);n.includes(`.`)?e.s(r,n,t):r[n]=t}let c=JSON.stringify(i,null,2),l=JSON.stringify(r,null,2);if(c===l)return`${D.cyan}→ No changes${D.reset}`;let u=k(c,l);return`${D.blue}File: ${t.file}${D.reset}\n${u.join(`
|
|
4
|
+
`)}`}catch(e){return`${D.red}✗ Error: ${e instanceof Error?e.message:String(e)}${D.reset}`}}async function j(t,a){if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,a))return`${D.yellow}⊘ Condition not met - task would be skipped${D.reset}`;if(t.template==null||t.template===``)return`${D.red}✗ No template content provided for file: ${t.file}${D.reset}`;let o=r.default.join(i.default.cwd(),t.file),s=e.r(t.template,a);if(!n.default.existsSync(o)){let e=s.split(`
|
|
5
|
+
`).slice(0,10).join(`
|
|
6
|
+
`),n=s.split(`
|
|
7
|
+
`).length>10;return`${D.blue}File: ${t.file}${D.reset}\n${D.green}+ New file would be created${D.reset}\n${D.gray}Content preview:${D.reset}\n${e}${n?`
|
|
8
|
+
...`:``}`}try{let e=await E(o,`utf-8`);if(e===s)return`${D.cyan}→ No changes${D.reset}`;let n=k(e,s);return`${D.blue}File: ${t.file}${D.reset}\n${n.join(`
|
|
9
|
+
`)}`}catch(e){return`${D.red}✗ Error: ${e instanceof Error?e.message:String(e)}${D.reset}`}}async function M(t,a,o){if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,a))return`${D.yellow}⊘ Condition not met - task would be skipped${D.reset}`;let s=r.default.join(i.default.cwd(),t.file);if(n.default.existsSync(s))return`${D.cyan}→ File already exists, would be skipped: ${t.file}${D.reset}`;try{if(x(t)){let e=await T(t,a,o),n=e.split(`
|
|
10
|
+
`).slice(0,10).join(`
|
|
11
|
+
`),r=e.split(`
|
|
12
|
+
`).length>10;return`${D.blue}File: ${t.file}${D.reset}\n${D.green}+ New file would be created${D.reset}\n${D.gray}Content preview:${D.reset}\n${n}${r?`
|
|
13
|
+
...`:``}`}let e=me(t);return`${D.blue}File: ${t.file}${D.reset}\n${D.green}+ New file would be created from ${e}${D.reset}`}catch(e){return`${D.red}✗ Error: ${e instanceof Error?e.message:String(e)}${D.reset}`}}async function N(t,a){if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,a))return`${D.yellow}⊘ Condition not met - task would be skipped${D.reset}`;let o=r.default.join(i.default.cwd(),t.file);if(!n.default.existsSync(o))return`${D.red}✗ File not found: ${t.file}${D.reset}`;try{let n=await E(o,`utf-8`),r=new RegExp(t.pattern,t.flags??`g`),i=e.r(t.replacement,a),s=n.replace(r,i);if(n===s)return`${D.cyan}→ No matches found${D.reset}`;let c=k(n,s);return`${D.blue}File: ${t.file}${D.reset}\n${c.join(`
|
|
14
|
+
`)}`}catch(e){return`${D.red}✗ Error: ${e instanceof Error?e.message:String(e)}${D.reset}`}}async function ve(t,a){if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,a))return`${D.yellow}⊘ Condition not met - task would be skipped${D.reset}`;let o=r.default.join(i.default.cwd(),t.file);if(!n.default.existsSync(o))return`${D.red}✗ File not found: ${t.file}${D.reset}`;try{let n=await E(o,`utf-8`),r=n;for(let{find:r,replace:i}of t.replacements){let t=e.r(r,a),o=e.r(i,a);n=n.replace(t,o)}if(r===n)return`${D.cyan}→ No changes${D.reset}`;let i=k(r,n);return`${D.blue}File: ${t.file}${D.reset}\n${i.join(`
|
|
15
|
+
`)}`}catch(e){return`${D.red}✗ Error: ${e instanceof Error?e.message:String(e)}${D.reset}`}}function P(t,a){if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,a))return`${D.yellow}⊘ Condition not met - task would be skipped${D.reset}`;let o=t.paths.map(t=>e.r(t,a)).filter(e=>n.default.existsSync(r.default.join(i.default.cwd(),e)));return o.length===0?`${D.cyan}→ No files/directories to delete${D.reset}`:`${D.red}Would delete:${D.reset}\n${o.map(e=>`${D.red} - ${e}${D.reset}`).join(`
|
|
16
|
+
`)}`}function F(t,a){if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,a))return`${D.yellow}⊘ Condition not met - task would be skipped${D.reset}`;let o=e.r(t.from,a),s=e.r(t.to,a),c=r.default.join(i.default.cwd(),o),l=r.default.join(i.default.cwd(),s);return n.default.existsSync(c)?n.default.existsSync(l)?`${D.yellow}⚠ Destination already exists: ${s}${D.reset}\n${D.cyan}Would rename: ${o} → ${s}${D.reset}`:`${D.cyan}Would rename: ${o} → ${s}${D.reset}`:`${D.red}✗ Source not found: ${o}${D.reset}`}function ye(e){if(e.condition!=null&&e.condition!==``)return`${D.yellow}⊘ Condition check skipped in dry-run${D.reset}`;let t=r.default.join(i.default.cwd(),`.git`),a=n.default.existsSync(t),o=[];if(e.removeExisting&&a&&o.push(`${D.red}Would remove existing .git directory${D.reset}`),o.push(`${D.green}Would initialize git repository${D.reset}`),e.initialCommit){let t=e.message??`Initial commit`;o.push(`${D.green}Would create initial commit: "${t}"${D.reset}`)}return o.join(`
|
|
17
|
+
`)}function be(t,n){if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,n))return`${D.yellow}⊘ Condition not met - task would be skipped${D.reset}`;let r=e.r(t.command,n),a=t.cwd==null?i.default.cwd():e.r(t.cwd,n);return`${D.yellow}Would execute:${D.reset}\n${D.cyan} Command: ${r}${D.reset}\n${D.cyan} Working directory: ${a}${D.reset}`}function xe(t,a){if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,a))return`${D.yellow}⊘ Condition not met - task would be skipped${D.reset}`;let o=e.r(t.from,a),s=e.r(t.to,a),c=r.default.join(i.default.cwd(),o),l=r.default.join(i.default.cwd(),s);return n.default.existsSync(c)?n.default.existsSync(l)?`${D.yellow}⚠ Destination already exists: ${s}${D.reset}\n${D.cyan}Would move: ${o} → ${s}${D.reset}`:`${D.cyan}Would move: ${o} → ${s}${D.reset}`:`${D.red}✗ Source not found: ${o}${D.reset}`}function Se(t,a){if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,a))return`${D.yellow}⊘ Condition not met - task would be skipped${D.reset}`;let o=e.r(t.from,a),s=e.r(t.to,a),c=r.default.join(i.default.cwd(),o),l=r.default.join(i.default.cwd(),s);if(!n.default.existsSync(c))return`${D.red}✗ Source not found: ${o}${D.reset}`;let u=n.default.statSync(c).isDirectory()?`directory`:`file`;return n.default.existsSync(l)?`${D.yellow}⚠ Destination already exists: ${s}${D.reset}\n${D.cyan}Would copy ${u}: ${o} → ${s}${D.reset}`:`${D.cyan}Would copy ${u}: ${o} → ${s}${D.reset}`}async function Ce(t,a,o){if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,a))return`${D.yellow}⊘ Condition not met - task would be skipped${D.reset}`;let s=r.default.join(i.default.cwd(),t.file),c={};t.content==null?t.template!=null&&(c.template=t.template):c.template=t.content,t.templateFile!=null&&(c.templateFile=t.templateFile);try{let e=await T(c,a,o),r=e.split(`
|
|
18
|
+
`).slice(0,10).join(`
|
|
19
|
+
`),i=e.split(`
|
|
20
|
+
`).length>10;return n.default.existsSync(s)?`${D.blue}File: ${t.file}${D.reset}\n${D.green}+ Would append content${D.reset}\n${D.gray}Content preview:${D.reset}\n${r}${i?`
|
|
21
|
+
...`:``}`:`${D.blue}File: ${t.file}${D.reset}\n${D.green}+ New file would be created with content${D.reset}\n${D.gray}Content preview:${D.reset}\n${r}${i?`
|
|
22
|
+
...`:``}`}catch(e){return`${D.red}✗ Error: ${e instanceof Error?e.message:String(e)}${D.reset}`}}function we(t,a){if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,a))return`${D.yellow}⊘ Condition not met - task would be skipped${D.reset}`;let o=e.r(t.path,a),s=r.default.join(i.default.cwd(),o);return n.default.existsSync(s)?`${D.cyan}→ Directory already exists: ${o}${D.reset}`:`${D.green}+ Would create directory: ${o}${D.reset}`}async function Te(e,t){try{switch(e.type){case`update-json`:return await A(e.config,t);case`write`:return await j(e.config,t);case`create`:return await M(e.config,t,e);case`regex-replace`:return await N(e.config,t);case`replace-in-file`:return await ve(e.config,t);case`delete`:return P(e.config,t);case`rename`:return F(e.config,t);case`move`:return xe(e.config,t);case`copy`:return Se(e.config,t);case`append`:return await Ce(e.config,t,e);case`mkdir`:return we(e.config,t);case`git-init`:return ye(e.config);case`exec`:return be(e.config,t);default:{let t=e.type;return`${D.yellow}⚠ Diff not available for task type: ${t}${D.reset}`}}}catch(e){return`${D.red}✗ Error generating diff: ${e instanceof Error?e.message:String(e)}${D.reset}`}}async function I(e,t){console.log(`${D.blue}═══════════════════════════════════════════════════════${D.reset}`),console.log(`${D.blue} DRY RUN - Preview of changes${D.reset}`),console.log(`${D.blue}═══════════════════════════════════════════════════════${D.reset}`);for(let n of e){console.log(`${D.cyan}▶ Task: ${n.name}${D.reset}`),n.description!=null&&n.description!==``&&console.log(`${D.gray} ${n.description}${D.reset}`);let e=await Te(n,t);console.log(e),console.log(`${D.gray}${`─`.repeat(55)}${D.reset}`)}console.log(`${D.blue}═══════════════════════════════════════════════════════${D.reset}`),console.log(`${D.yellow} No changes were applied (dry-run mode)${D.reset}`),console.log(`${D.blue}═══════════════════════════════════════════════════════${D.reset}`)}const L=new Map,R={},z=new Map;function B(t){if(t.name==null||t.name===``)throw TypeError(`Plugin name is required`);if(!Array.isArray(t.taskTypes)||t.taskTypes.length===0)throw TypeError(`Plugin ${t.name} must define at least one task type`);if(typeof t.execute!=`function`)throw TypeError(`Plugin ${t.name} must provide an execute function`);if(L.has(t.name))throw TypeError(`Plugin ${t.name} is already registered`);for(let e of t.taskTypes)if(z.has(e)){let t=z.get(e);throw TypeError(`Task type "${e}" is already registered by plugin "${t}"`)}L.set(t.name,t);for(let e of t.taskTypes)z.set(e,t.name);e.u(`Registered plugin: ${t.name}${t.version==null?``:` v${t.version}`}`)}function Ee(e){let t=L.get(e);if(t!=null){for(let e of t.taskTypes)z.delete(e);L.delete(e)}}function De(e){return L.get(e)}function V(e){let t=z.get(e);if(t!=null)return L.get(t)}function H(e){return z.has(e)}function Oe(){return Array.from(L.keys())}function ke(){L.clear(),z.clear()}function Ae(e){e.beforeAll!=null&&(R.beforeAll=e.beforeAll),e.afterAll!=null&&(R.afterAll=e.afterAll),e.beforeTask!=null&&(R.beforeTask=e.beforeTask),e.afterTask!=null&&(R.afterTask=e.afterTask),e.onError!=null&&(R.onError=e.onError)}async function U(t,...n){let r=R[t];if(r!=null)try{t===`beforeAll`||t===`afterAll`?await r(n[0]):(t===`beforeTask`||t===`afterTask`||t===`onError`)&&await r(n[0],n[1])}catch(n){e.i(`Error in ${t} hook: ${n instanceof Error?n.message:String(n)}`,`error`)}}async function je(e,t,n){let r=V(e.type);if(r==null)throw TypeError(`No plugin found for task type: ${e.type}`);await r.execute(e,t,n)}async function Me(e,t){let n=V(e.type);if(!(n==null||n.getDiff==null))return n.getDiff(e,t)}function Ne(e){let t=V(e.type);return t==null?[`No plugin found for task type: ${e.type}`]:t.validate==null?[]:t.validate(e)}function Pe(e,t,n,r){return{name:e,...r?.version!=null&&{version:r.version},taskTypes:[t],execute:n,...r?.getDiff!=null&&{getDiff:r.getDiff},...r?.validate!=null&&{validate:r.validate}}}async function W(t,n,r){if(t===void 0)return;if(typeof t!=`object`||!t||Array.isArray(t))return typeof t==`string`&&r&&/\{\{\w+\}\}/u.test(t)?e.r(t,r):t;let i=t;if(i.type===`conditional`){if(!r)return;if(typeof i.condition!=`string`){e.i(`Prompt "${n}": conditional default must have a string condition`,`error`);return}try{let{evaluateCondition:t}=await Promise.resolve().then(()=>require(`./utils-BGOPmydq.cjs`)),n=t(i.condition,r)?i.ifTrue:i.ifFalse;return typeof n==`string`&&/\{\{\w+\}\}/u.test(n)&&(n=e.r(n,r)),n}catch(t){e.i(`Prompt "${n}": failed to evaluate conditional default: ${t instanceof Error?t.message:`Unknown error`}`,`warn`);return}}if(i.type===`exec`){let t=i.value;if(typeof t!=`string`){e.i(`Prompt "${n}": exec default value must have a string command`,`error`);return}try{let e=(0,o.execSync)(t,{encoding:`utf-8`,stdio:[`pipe`,`pipe`,`pipe`],timeout:1e4}).trim();if(e.startsWith(`{`)||e.startsWith(`[`))try{return JSON.parse(e)}catch{return e}if(/^-?\d+(?:\.\d+)?$/u.test(e)){let t=Number.parseFloat(e);if(!Number.isNaN(t))return t}return e===`true`||e===`false`?e===`true`:e}catch(t){e.i(`Prompt "${n}": failed to execute default value command: ${t instanceof Error?t.message:`Unknown error`}`,`warn`);return}}else if(i.type===`static`)return i.value;else if(i.type!==void 0){e.i(`Prompt "${n}": unknown default value type "${i.type}". Expected "static", "exec", or "conditional".`,`error`);return}return t}async function G(t,n=new Map,r={}){let i={};if(t.length===0)return i;for(let a of t){if(a.$templateEnabled!=null&&!await e.l(a.$templateEnabled,{...r,...i}))continue;let t={...r,...i};if(await e.l(a.enabled,t))try{let r,o=n.get(a.id);switch(a.default!==void 0&&(o=await W(a.default,a.id,t)),a.type){case`input`:{let t={message:a.message};if(o!==void 0&&(t.default=String(o)),a.required!==void 0&&(t.required=a.required),r=await(0,s.input)(t),a.required&&(r==null||typeof r==`string`&&r.trim()===``))throw e.i(`${a.message} is required`,`error`),d.required(a.id);break}case`password`:if(r=await(0,s.password)({message:a.message,mask:`*`}),a.required&&(r==null||typeof r==`string`&&r.trim()===``))throw e.i(`${a.message} is required`,`error`),d.required(a.id);break;case`number`:{let t={message:a.message};if(o!==void 0&&(t.default=Number(o)),a.required!==void 0&&(t.required=a.required),a.min!==void 0&&(t.min=a.min),a.max!==void 0&&(t.max=a.max),r=await(0,s.number)(t),a.required&&r==null)throw e.i(`${a.message} is required`,`error`),d.required(a.id);break}case`select`:{let e={message:a.message,choices:a.choices.map(e=>({name:e.name,value:e.value}))};o!==void 0&&(e.default=o),r=await(0,s.select)(e);break}case`confirm`:{let e=o===void 0?!1:!!o;r=await(0,s.confirm)({message:a.message,default:e});break}default:throw e.i(`Unknown prompt type: ${a.type}`,`error`),d.unknownType(a.type)}i[a.id]=r}catch(t){throw t instanceof Error&&e.i(`Failed to collect prompt "${a.id}": ${t.message}`,`error`),t}}return i}async function K(e){let t=new Map,n=e.map(async e=>{if(e.default!==void 0){let n=await W(e.default,e.id);n!==void 0&&t.set(e.id,n)}});return await Promise.all(n),t}function q(e){let t=[],n=new Set;for(let r of e){if(n.has(r.id)&&t.push(`Duplicate prompt ID: ${r.id}`),n.add(r.id),/^[a-zA-Z_$][a-zA-Z0-9_$]*$/u.test(r.id)||t.push(`Invalid prompt ID "${r.id}": must be a valid JavaScript identifier (start with letter, underscore, or $, followed by letters, digits, underscores, or $)`),(!r.message||r.message.trim()===``)&&t.push(`Prompt "${r.id}" must have a non-empty message`),r.type===`select`){r.choices.length===0&&t.push(`Select prompt "${r.id}" must have at least one choice`);for(let e of r.choices)(!e.name||e.name.trim()===``)&&t.push(`Select prompt "${r.id}" has a choice with empty name`),e.value===void 0&&t.push(`Select prompt "${r.id}" has a choice with undefined value`)}r.type===`number`&&r.min!==void 0&&r.max!==void 0&&r.min>r.max&&t.push(`Number prompt "${r.id}" has min greater than max`)}return t}const Fe=(0,a.promisify)(n.default.appendFile),Ie=(0,a.promisify)(n.default.readFile),Le=(0,a.promisify)(n.default.stat);async function Re(t,n,a){if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,n)){e.i(`Condition not met, skipping append task`,`info`);return}let o=r.default.join(i.default.cwd(),t.file),s={};t.content==null?t.template!=null&&(s.template=t.template):s.template=t.content,t.templateFile!=null&&(s.templateFile=t.templateFile);let c=w(s);if(!c.isValid)throw c.error?.includes(`cannot have both`)?f.templateHasBothTemplateAndFile():f.templateMissingTemplateOrFile();let l=await T(s,n,a),u=!1,d=!1;try{await Le(o),u=!0;let e=await Ie(o,`utf-8`);e.length>0&&!e.endsWith(`
|
|
23
|
+
`)&&(d=t.newline!==!1)}catch{}u&&d?await Fe(o,`\n${l}`):await Fe(o,l),e.i(`Appended content to ${t.file}`,`success`)}const ze={name:`append`,version:`1.0.0`,taskTypes:[`append`],execute:async(e,t,n)=>{n.dryRun||await Re(e.config,t,e)}},Be=(0,a.promisify)(n.default.copyFile),Ve=(0,a.promisify)(n.default.stat),He=(0,a.promisify)(n.default.mkdir),Ue=(0,a.promisify)(n.default.readdir);async function We(e,t){await He(t,{recursive:!0});let n=await Ue(e,{withFileTypes:!0});await Promise.all(n.map(async n=>{let i=r.default.join(e,n.name),a=r.default.join(t,n.name);n.isDirectory()?await We(i,a):await Be(i,a)}))}async function Ge(t,n){if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,n)){e.i(`Condition not met, skipping copy task`,`info`);return}let a=r.default.join(i.default.cwd(),t.from),o=r.default.join(i.default.cwd(),t.to),s;try{s=await Ve(a)}catch{e.i(`Source path does not exist: ${a}`,`warn`);return}await He(r.default.dirname(o),{recursive:!0}),s.isDirectory()?(await We(a,o),e.i(`Copied directory ${t.from} to ${t.to}`,`success`)):(await Be(a,o),e.i(`Copied file ${t.from} to ${t.to}`,`success`))}const Ke={name:`copy`,version:`1.0.0`,taskTypes:[`copy`],execute:async(e,t,n)=>{n.dryRun||await Ge(e.config,t)}},qe=(0,a.promisify)(n.default.writeFile);async function Je(t,a,o){if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,a)){e.i(`Condition not met, skipping create task`,`info`);return}let s=r.default.join(i.default.cwd(),t.file);if(n.default.existsSync(s)){e.i(`File already exists, skipping: ${t.file}`,`info`);return}let c=w(t);if(!c.isValid)throw c.error?.includes(`cannot have both`)?f.createHasBothTemplateAndFile():f.createMissingTemplateOrFile();let l=await T(t,a,o),u=r.default.dirname(s);n.default.existsSync(u)||n.default.mkdirSync(u,{recursive:!0}),await qe(s,l),e.i(`Created file: ${t.file}`,`success`)}const Ye={name:`create`,version:`1.0.0`,taskTypes:[`create`],execute:async(e,t,n)=>{n.dryRun||await Je(e.config,t,e)}};async function Xe(t,a){let{paths:o,condition:s}=t;if(s!=null&&s!==``){if(!a){e.i(`Condition specified but no config provided, skipping deletion`,`warn`);return}if(!e.t(s,a)){e.i(`Condition not met, skipping deletion`,`info`);return}}for(let e of o){let t=r.default.join(i.default.cwd(),e);n.default.existsSync(t)&&n.default.rmSync(t,{recursive:!0,force:!0})}}const Ze={name:`delete`,version:`1.0.0`,taskTypes:[`delete`],execute:async(e,t,n)=>{n.dryRun||await Xe(e.config,t)}};async function Qe(t,n){if(t.condition!=null&&t.condition!==``){if(!n){e.i(`Condition specified but no config provided, skipping exec`,`warn`);return}if(!e.t(t.condition,n)){e.i(`Condition not met, skipping exec task`,`info`);return}}let a=t.cwd==null?i.default.cwd():r.default.join(i.default.cwd(),t.cwd);(0,o.execSync)(t.command,{cwd:a,stdio:`inherit`})}const $e={name:`exec`,version:`1.0.0`,taskTypes:[`exec`],execute:async(e,t,n)=>{n.dryRun||await Qe(e.config,t)}};async function et(t,a){if(t.condition!=null&&t.condition!==``){if(!a){e.i(`Condition specified but no config provided, skipping git-init`,`warn`);return}if(!e.t(t.condition,a)){e.i(`Condition not met, skipping git-init task`,`info`);return}}if(t.removeExisting){let e=r.default.join(i.default.cwd(),`.git`);n.default.existsSync(e)&&n.default.rmSync(e,{recursive:!0,force:!0})}if((0,o.execSync)(`git init`,{stdio:`inherit`}),t.initialCommit){let e=t.message??`Initial commit`;(0,o.execSync)(`git add .`,{stdio:`inherit`}),(0,o.execSync)(`git commit -m "${e}"`,{stdio:`inherit`})}}const tt={name:`git-init`,version:`1.0.0`,taskTypes:[`git-init`],execute:async(e,t,n)=>{n.dryRun||await et(e.config,t)}},nt=(0,a.promisify)(n.default.mkdir);async function rt(t,n){if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,n)){e.i(`Condition not met, skipping mkdir task`,`info`);return}await nt(r.default.join(i.default.cwd(),t.path),{recursive:!0}),e.i(`Created directory: ${t.path}`,`success`)}const it={name:`mkdir`,version:`1.0.0`,taskTypes:[`mkdir`],execute:async(e,t,n)=>{n.dryRun||await rt(e.config,t)}},at=(0,a.promisify)(n.default.rename),ot=(0,a.promisify)(n.default.stat),st=(0,a.promisify)(n.default.mkdir);async function ct(t,n){if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,n)){e.i(`Condition not met, skipping move task`,`info`);return}let a=r.default.join(i.default.cwd(),t.from),o=r.default.join(i.default.cwd(),t.to);try{await ot(a)}catch{e.i(`Source path does not exist: ${a}`,`warn`);return}await st(r.default.dirname(o),{recursive:!0}),await at(a,o),e.i(`Moved ${t.from} to ${t.to}`,`success`)}const lt={name:`move`,version:`1.0.0`,taskTypes:[`move`],execute:async(e,t,n)=>{n.dryRun||await ct(e.config,t)}},ut=(0,a.promisify)(n.default.readFile),dt=(0,a.promisify)(n.default.writeFile);async function ft(t,n){if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,n)){e.i(`Condition not met, skipping regex-replace task`,`info`);return}let a=r.default.join(i.default.cwd(),t.file),{pattern:o}=t,s=t.flags??``,c=t.replacement||``,l=await ut(a,`utf-8`),u=new RegExp(o,s);l=l.replace(u,e.r(c,n)),await dt(a,l)}const pt={name:`regex-replace`,version:`1.0.0`,taskTypes:[`regex-replace`],execute:async(e,t,n)=>{n.dryRun||await ft(e.config,t)}},mt=(0,a.promisify)(n.default.rename);async function ht(t,a){if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,a)){e.i(`Condition not met, skipping rename task`,`info`);return}let o=r.default.join(i.default.cwd(),e.r(t.from,a)),s=r.default.join(i.default.cwd(),e.r(t.to,a));if(!n.default.existsSync(o)){e.i(`Source path does not exist: ${o}`,`warn`);return}await mt(o,s)}const gt={name:`rename`,version:`1.0.0`,taskTypes:[`rename`],execute:async(e,t,n)=>{n.dryRun||await ht(e.config,t)}},_t=(0,a.promisify)(n.default.readFile),vt=(0,a.promisify)(n.default.writeFile);async function yt(t,a){if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,a)){e.i(`Condition not met, skipping replace-in-file task`,`info`);return}let o=r.default.join(i.default.cwd(),t.file),{replacements:s}=t;if(!n.default.existsSync(o)){e.i(`File not found: ${o}, skipping`,`warn`);return}let c=await _t(o,`utf-8`);for(let{find:t,replace:n}of s){let r=e.r(n,a);c=c.replace(new RegExp(t,`gu`),r)}await vt(o,c)}const bt={name:`replace-in-file`,version:`1.0.0`,taskTypes:[`replace-in-file`],execute:async(e,t,n)=>{n.dryRun||await yt(e.config,t)}},xt=(0,a.promisify)(n.default.readFile),St=(0,a.promisify)(n.default.writeFile),Ct=2;async function wt(t,n){if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,n)){e.i(`Condition not met, skipping update-json task`,`info`);return}let a=r.default.join(i.default.cwd(),t.file),{updates:o}=t,s=await xt(a,`utf-8`),c=JSON.parse(s);function l(t){if(typeof t==`string`)return e.r(t,n);if(Array.isArray(t))return t.map(e=>l(e));if(typeof t==`object`&&t){let e={};for(let[n,r]of Object.entries(t))e[n]=l(r);return e}return t}for(let[t,n]of Object.entries(o)){let r=l(n);t.includes(`.`)?e.s(c,t,r):c[t]=r}await St(a,`${JSON.stringify(c,null,2)}\n`)}const Tt={name:`update-json`,version:`1.0.0`,taskTypes:[`update-json`],execute:async(e,t,n)=>{n.dryRun||await wt(e.config,t)}},Et=(0,a.promisify)(n.default.writeFile);async function Dt(t,a,o){let{allowCreate:s=!0}=t;if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,a)){e.i(`Condition not met, skipping write task`,`info`);return}let c=r.default.join(i.default.cwd(),t.file);if(!n.default.existsSync(c)){if(s===!1)throw Error(`Write task failed: file does not exist (${t.file})`);e.i(`File not found, creating new file: ${t.file}`,`info`)}let l=w(t);if(!l.isValid)throw l.error?.includes(`cannot have both`)?f.templateHasBothTemplateAndFile():f.templateMissingTemplateOrFile();let u=await T(t,a,o),d=r.default.dirname(c);n.default.existsSync(d)||n.default.mkdirSync(d,{recursive:!0}),await Et(c,u)}const Ot={name:`write`,version:`1.0.0`,taskTypes:[`write`],execute:async(e,t,n)=>{n.dryRun||await Dt(e.config,t,e)}};function J(){H(`update-json`)||(B(Tt),B(Ot),B(Ye),B(pt),B(bt),B(Ze),B(gt),B(tt),B($e),B(lt),B(Ke),B(ze),B(it))}async function kt(t,n,r=!1){if(J(),r){e.i(`[DRY RUN] Would execute: ${t.name}`,`info`);return}if(H(t.type)){await je(t,n,{dryRun:r});return}throw TypeError(`Unknown task type: ${t.type}`)}async function Y(t,n,r,a,o=!1){try{return e.i(`[${r}/${a}] Running: ${t.name}...`,`info`),await kt(t,n,o),e.i(`[${r}/${a}] Completed: ${t.name}...`,`success`),!0}catch(n){return e.i(`Failed: ${t.name}`,`error`),n instanceof Error&&(e.i(` Reason: ${n.message}`,`error`),n.stack!=null&&i.default.env.DEBUG!=null&&console.error(n.stack)),!1}}function X(t){let n=[],r=new Set,i=new Set,a=new Map(t.map(e=>[e.id,e]));function o(t){if(r.has(t))return;if(i.has(t))throw e.b.forTaskDependency(t);i.add(t);let s=a.get(t);if(!s)throw u.forId(t);if(s.dependencies)for(let e of s.dependencies)o(e);i.delete(t),r.add(t),n.push(s)}for(let e of t)r.has(e.id)||o(e.id);return n}function At(e){let t=[];for(let n of e)if(!H(n.type))t.push(`Task "${n.id}" (${n.name}): Unknown task type "${n.type}"`);else if(n.type===`write`){let e=jt(n);t.push(...e)}return t}function jt(e){let t=[],n=e.config,r=typeof n.template==`string`?n.template:void 0,i=typeof n.templateFile==`string`?n.templateFile:void 0,a=w({...r!==void 0&&{template:r},...i!==void 0&&{templateFile:i}});return!a.isValid&&a.error!=null&&a.error!==``&&t.push(`Task "${e.id}" (${e.name}): ${a.error}`),(n.file==null||n.file===``)&&t.push(`Task "${e.id}" (${e.name}): Write task requires "file" property to specify the output file path`),t}function Mt(t){e.i(`❌ Template validation failed:`,`error`),e.i(``,`error`);for(let n of t)e.i(` • ${n}`,`error`);e.i(``,`error`),e.i(`Please fix these errors before continuing.`,`error`)}function Z(e,t=new Map){let n={};for(let r of e){let e=t.get(r.id);e!==void 0&&(n[r.id]=e)}return n}async function Nt(t,n,r){if(t==null)return;if(typeof t!=`object`||!t||Array.isArray(t))return t;let i=t;if(i.type===`conditional`){if(!r){e.i(`Variable "${n}": conditional value requires context but none provided`,`warn`);return}if(typeof i.condition!=`string`){e.i(`Variable "${n}": conditional value must have a string condition`,`error`);return}try{let{evaluateCondition:e,interpolateTemplate:t}=await Promise.resolve().then(()=>require(`./utils-BGOPmydq.cjs`)),n=e(i.condition,r)?i.ifTrue:i.ifFalse;return typeof n==`string`&&/\{\{\w+\}\}/u.test(n)&&(n=t(n,r)),n}catch(t){e.i(`Variable "${n}": failed to evaluate conditional value: ${t instanceof Error?t.message:`Unknown error`}`,`warn`);return}}if(i.type===`exec`){let t=i.value;if(typeof t!=`string`){e.i(`Variable "${n}": exec value must have a string command`,`error`);return}try{let e=(0,o.execSync)(t,{encoding:`utf-8`,stdio:[`pipe`,`pipe`,`pipe`],timeout:1e4}).trim();if(e.startsWith(`{`)||e.startsWith(`[`))try{return JSON.parse(e)}catch{return e}if(/^-?\d+(?:\.\d+)?$/u.test(e)){let t=Number.parseFloat(e);if(!Number.isNaN(t))return t}return e===`true`||e===`false`?e===`true`:e}catch(t){e.i(`Variable "${n}": failed to execute command: ${t instanceof Error?t.message:`Unknown error`}`,`warn`);return}}else if(i.type===`static`)return i.value;return t}async function Q(t,n,r){let i=new Map;for(let a of t){if(r?.skipConditional===!0&&typeof a.value==`object`&&a.value!==null&&!Array.isArray(a.value)&&a.value.type===`conditional`)continue;if(a.$templateEnabled!=null){let t={...n};for(let[e,n]of i.entries())t[e]=n;if(!await e.l(a.$templateEnabled,t))continue}let t={...n};for(let[e,n]of i.entries())t[e]=n;let o=await Nt(a.value,a.id,t);o!==void 0&&i.set(a.id,o)}return i}function $(e){let t=[],n=new Set;for(let r of e)n.has(r.id)&&t.push(`Duplicate variable ID: "${r.id}"`),n.add(r.id);return t}async function Pt(n,r){let a=t.t();if(!await e.l(r.templateEnabled,a,{lazy:!0})){e.d(`⊘ Template is disabled - skipping all execution`);return}e.u(`Registering built-in plugins...`),J(),e.u(`Validating task configurations...`);let o=At(n);o.length>0&&(Mt(o),i.default.exit(1)),e.u(`All tasks validated successfully`);let s=n.filter(n=>e.c(n.enabled,t.t(),{lazy:!0}));e.u(`Resolving task dependencies...`);let c=X(s);e.u(`Sorted ${c.length} task(s) by dependencies`),e.d(`Welcome! Let's execute your tasks.`),r.dryRun&&e.m(`🔍 DRY RUN MODE - No changes will be made`),e.d(`This will execute your project tasks based on the defined configuration.`);let l=a,u=[...r.globalVariables??[]];if(u.length>0){let t=$(u);t.length>0&&(e.i(`❌ Variable validation errors:`,`error`),t.forEach(t=>e.i(` - ${t}`,`error`)),i.default.exit(1)),e.u(`Resolving variable values...`);let n=Z(u,await Q(u,l,{skipConditional:!0}));Object.assign(l,n),Object.keys(n).length>0&&e.u(`Resolved ${Object.keys(n).length} variable(s)`)}let d=r.globalPrompts??[],f=[...d];if(f.length>0){let t=q(f);t.length>0&&(e.i(`❌ Prompt validation errors:`,`error`),t.forEach(t=>e.i(` - ${t}`,`error`)),i.default.exit(1)),e.u(`Resolving prompt default values...`);let n=await K(f);if(d.length>0){e.d(`📋 Collecting prompts (available to all tasks):`);let t=await G(d,n,l);Object.assign(l,t)}}if(u.length>0){let t=u.filter(e=>typeof e.value==`object`&&e.value!==null&&!Array.isArray(e.value)?e.value.type===`conditional`:!1);if(t.length>0){e.u(`Re-resolving conditional variables with prompt values...`);let n=Z(t,await Q(t,l));Object.assign(l,n),Object.keys(n).length>0&&e.u(`Resolved ${Object.keys(n).length} conditional variable(s)`)}}if(!await e.l(r.templateEnabled,l)){e.d(`⊘ Template is disabled after variable resolution - skipping all execution`);return}let p=[];for(let t of c)t.$templateEnabled!=null&&!await e.l(t.$templateEnabled,l)||await e.l(t.enabled,l)&&p.push(t);if(e.i(`${p.length} of ${c.length} task(s) enabled for execution`,`info`),r.dryRun){await I(p,l),e.d(`🔍 Dry run completed - no changes were made`),e.d(`Run without --dry-run to apply changes`);return}e.u(`Calling beforeAll hook...`),await U(`beforeAll`,l);let m=p.length,h=0,g=0,_=[],v=[];for(let t=0;t<p.length;t++){let n=p[t];n!=null&&(e.u(`Calling beforeTask hook for task: ${n.name}`),await U(`beforeTask`,n,l),await Y(n,l,t+1,m,r.dryRun)?(h++,_.push(n.id),e.u(`Calling afterTask hook for task: ${n.name}`),await U(`afterTask`,n,l)):(n.required!==!1&&(g++,v.push(n.name)),e.u(`Calling onError hook for task: ${n.name}`),await U(`onError`,Error(`Task ${n.name} failed`),n),e.m(`⚠️ Task "${n.name}" failed, continuing with remaining tasks...`)))}g>0&&(e.i(`\n❌ Task execution completed with ${g} error(s)`,`error`),e.i(`Completed: ${h}/${m} tasks`,`info`),e.i(`Failed tasks: ${v.join(`, `)}`,`error`),i.default.exit(1)),e.u(`Calling afterAll hook...`),await U(`afterAll`,l),e.p(`✅ All tasks completed successfully!`),e.p(` Completed: ${h}/${m} tasks`)}async function Ft(t,n,r={}){e.u(`Running templates with sequential variable/prompt resolution...`),e.u(`Total templates to process: ${t.length}`),e.u(`Registering built-in plugins...`),J();let a=[];console.log(``),e.d(`📋 Collecting input...`),console.log(``);for(let n=0;n<t.length;n++){let o=t[n];if(o==null)continue;let s=`=`.repeat(60);if(e.u(`\n${s}`),e.u(`Processing template ${n+1}/${t.length}: "${o.name}"`),e.u(s),e.u(`Current config keys: ${Object.keys(r).join(`, `)}`),!await e.l(o.enabled,r)){e.d(`⊘ Template "${o.name}" is disabled - skipping`),e.u(` Enabled condition: ${JSON.stringify(o.enabled)}`);continue}let c=o.variables??[];if(c.length>0){e.u(`Processing ${c.length} variable(s) for template "${o.name}"...`);let t=$(c);t.length>0&&(e.i(`❌ Variable validation errors:`,`error`),t.forEach(t=>e.i(` - ${t}`,`error`)),i.default.exit(1));let n=Z(c,await Q(c,r,{skipConditional:!0}));Object.assign(r,n);let a=c.filter(e=>typeof e.value==`object`&&e.value!==null&&!Array.isArray(e.value)?e.value.type===`conditional`:!1),s=0;if(a.length>0){let t=Z(a,await Q(a,r));if(s=Object.keys(t).length,Object.assign(r,t),s>0){e.u(`Resolved ${s} conditional variable(s)`);for(let[n,r]of Object.entries(t))e.u(` ${n} = ${JSON.stringify(r)}`)}}let l=Object.keys(n).length+s;l>0&&e.u(`Total variables resolved for template: ${l}`)}let l=o.prompts??[];if(l.length>0){e.u(`Processing ${l.length} prompt(s) for template "${o.name}"...`);let t=q(l);t.length>0&&(e.i(`❌ Prompt validation errors:`,`error`),t.forEach(t=>e.i(` - ${t}`,`error`)),i.default.exit(1));let n=await G(l,await K(l),r);Object.assign(r,n),e.u(`Collected ${Object.keys(n).length} prompt answer(s)`)}if(!await e.l(o.enabled,r)){e.d(`⊘ Template "${o.name}" became disabled after variable/prompt resolution - skipping tasks`);continue}let u=o.tasks??[];u.length>0&&(e.u(`Found ${u.length} task(s) in template "${o.name}" (will execute later)`),a.push(...u))}if(e.u(`
|
|
24
|
+
🔧 Validating and filtering all collected tasks...`),a.length===0){e.i(`No tasks found in any template`,`info`);return}let o=At(a);o.length>0&&(Mt(o),i.default.exit(1)),console.log(``),e.i(`🛠️ Preparing tasks...`,`info`);let s=[];for(let t of a)await e.l(t.enabled,r)&&s.push(t);if(console.log(``),e.i(`Found ${a.length} tasks (${s.length} enabled)`,`info`),e.i(`All tasks validated successfully`,`success`),s.length===0){e.i(`No enabled tasks to execute`,`info`);return}let c=X(s);if(n.dryRun){e.i(`
|
|
25
|
+
🔍 Dry run - showing task changes...`,`info`),await I(c,r),e.i(`
|
|
26
|
+
🔍 Dry run completed - no changes were made`,`info`),e.i(`Run without --dry-run to apply changes`,`info`);return}console.log(``),e.d(`⚙️ Executing tasks...`),console.log(``),await U(`beforeAll`,r);let l=0,u=0,d=[];for(let t=0;t<c.length;t++){let i=c[t];i!=null&&(await U(`beforeTask`,i,r),await Y(i,r,t+1,c.length,n.dryRun)?(l++,await U(`afterTask`,i,r)):(i.required!==!1&&(u++,d.push(i.name)),await U(`onError`,Error(`Task ${i.name} failed`),i),e.m(`⚠️ Task "${i.name}" failed, continuing with remaining tasks...`)))}await U(`afterAll`,r),u>0&&(e.i(`\n❌ Task execution completed with ${u} error(s)`,`error`),e.i(`Completed: ${l}/${c.length} tasks`,`info`),e.i(`Failed tasks: ${d.join(`, `)}`,`error`),i.default.exit(1)),e.i(`Completed: ${l}/${c.length} tasks`,`success`)}Object.defineProperty(exports,`A`,{enumerable:!0,get:function(){return P}}),Object.defineProperty(exports,`B`,{enumerable:!0,get:function(){return x}}),Object.defineProperty(exports,`C`,{enumerable:!0,get:function(){return Oe}}),Object.defineProperty(exports,`D`,{enumerable:!0,get:function(){return Ne}}),Object.defineProperty(exports,`E`,{enumerable:!0,get:function(){return Ee}}),Object.defineProperty(exports,`F`,{enumerable:!0,get:function(){return ve}}),Object.defineProperty(exports,`G`,{enumerable:!0,get:function(){return fe}}),Object.defineProperty(exports,`H`,{enumerable:!0,get:function(){return T}}),Object.defineProperty(exports,`I`,{enumerable:!0,get:function(){return Te}}),Object.defineProperty(exports,`J`,{enumerable:!0,get:function(){return ne}}),Object.defineProperty(exports,`K`,{enumerable:!0,get:function(){return ie}}),Object.defineProperty(exports,`L`,{enumerable:!0,get:function(){return A}}),Object.defineProperty(exports,`M`,{enumerable:!0,get:function(){return ye}}),Object.defineProperty(exports,`N`,{enumerable:!0,get:function(){return N}}),Object.defineProperty(exports,`O`,{enumerable:!0,get:function(){return I}}),Object.defineProperty(exports,`P`,{enumerable:!0,get:function(){return F}}),Object.defineProperty(exports,`R`,{enumerable:!0,get:function(){return j}}),Object.defineProperty(exports,`S`,{enumerable:!0,get:function(){return H}}),Object.defineProperty(exports,`T`,{enumerable:!0,get:function(){return B}}),Object.defineProperty(exports,`U`,{enumerable:!0,get:function(){return C}}),Object.defineProperty(exports,`V`,{enumerable:!0,get:function(){return S}}),Object.defineProperty(exports,`W`,{enumerable:!0,get:function(){return w}}),Object.defineProperty(exports,`X`,{enumerable:!0,get:function(){return ce}}),Object.defineProperty(exports,`Y`,{enumerable:!0,get:function(){return b}}),Object.defineProperty(exports,`_`,{enumerable:!0,get:function(){return Pe}}),Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return Nt}}),Object.defineProperty(exports,`b`,{enumerable:!0,get:function(){return V}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return kt}}),Object.defineProperty(exports,`d`,{enumerable:!0,get:function(){return q}}),Object.defineProperty(exports,`f`,{enumerable:!0,get:function(){return K}}),Object.defineProperty(exports,`g`,{enumerable:!0,get:function(){return ke}}),Object.defineProperty(exports,`h`,{enumerable:!0,get:function(){return U}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return Q}}),Object.defineProperty(exports,`j`,{enumerable:!0,get:function(){return be}}),Object.defineProperty(exports,`k`,{enumerable:!0,get:function(){return M}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return J}}),Object.defineProperty(exports,`m`,{enumerable:!0,get:function(){return W}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return Ft}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return Z}}),Object.defineProperty(exports,`p`,{enumerable:!0,get:function(){return G}}),Object.defineProperty(exports,`q`,{enumerable:!0,get:function(){return pe}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return $}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return X}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return Pt}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return Y}}),Object.defineProperty(exports,`v`,{enumerable:!0,get:function(){return je}}),Object.defineProperty(exports,`w`,{enumerable:!0,get:function(){return Ae}}),Object.defineProperty(exports,`x`,{enumerable:!0,get:function(){return Me}}),Object.defineProperty(exports,`y`,{enumerable:!0,get:function(){return De}}),Object.defineProperty(exports,`z`,{enumerable:!0,get:function(){return me}});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{i as e}from"./utils-C3bHtTZl.js";import{t}from"./run-tasks-
|
|
1
|
+
import{i as e}from"./utils-C3bHtTZl.js";import{t}from"./run-tasks-BVC7NdSh.js";import n from"node:process";const r=n.argv.includes(`--dry-run`),i=n.argv.includes(`--force`);async function a(a){try{let o=a||[];o.length===0&&(e(`⚠️ No tasks defined. Use --config to specify tasks or call runWithTasks() programmatically.`,`warn`),e(`Example: scaffoldfy --config ./tasks.json`,`info`),n.exit(1)),await t(o,{dryRun:r,force:i,tasksFilePath:void 0})}catch(t){e(`❌ Task execution failed`,`error`),t instanceof Error?(e(`Error: ${t.message}`,`error`),n.env.DEBUG!=null&&console.error(t.stack)):console.error(t),n.exit(1)}}async function o(a,o){try{await t(a,{dryRun:o?.dryRun??r,force:o?.force??i,tasksFilePath:o?.tasksFilePath??void 0,...o?.globalVariables!=null&&{globalVariables:o.globalVariables},...o?.globalPrompts!=null&&{globalPrompts:o.globalPrompts},...o?.templateEnabled!=null&&{templateEnabled:o.templateEnabled}})}catch(t){e(`❌ Task execution failed`,`error`),t instanceof Error?(e(`Error: ${t.message}`,`error`),n.env.DEBUG!=null&&console.error(t.stack)):console.error(t),n.exit(1)}}export{o as n,a as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
const e=require(`./utils-BeqQVvh1.cjs`),t=require(`./run-tasks-
|
|
1
|
+
const e=require(`./utils-BeqQVvh1.cjs`),t=require(`./run-tasks-CwtoncLO.cjs`);let n=require(`node:process`);n=e.S(n);const r=n.default.argv.includes(`--dry-run`),i=n.default.argv.includes(`--force`);async function a(a){try{let o=a||[];o.length===0&&(e.i(`⚠️ No tasks defined. Use --config to specify tasks or call runWithTasks() programmatically.`,`warn`),e.i(`Example: scaffoldfy --config ./tasks.json`,`info`),n.default.exit(1)),await t.t(o,{dryRun:r,force:i,tasksFilePath:void 0})}catch(t){e.i(`❌ Task execution failed`,`error`),t instanceof Error?(e.i(`Error: ${t.message}`,`error`),n.default.env.DEBUG!=null&&console.error(t.stack)):console.error(t),n.default.exit(1)}}async function o(a,o){try{await t.t(a,{dryRun:o?.dryRun??r,force:o?.force??i,tasksFilePath:o?.tasksFilePath??void 0,...o?.globalVariables!=null&&{globalVariables:o.globalVariables},...o?.globalPrompts!=null&&{globalPrompts:o.globalPrompts},...o?.templateEnabled!=null&&{templateEnabled:o.templateEnabled}})}catch(t){e.i(`❌ Task execution failed`,`error`),t instanceof Error?(e.i(`Error: ${t.message}`,`error`),n.default.env.DEBUG!=null&&console.error(t.stack)):console.error(t),n.default.exit(1)}}Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return o}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return a}});
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pixpilot/scaffoldfy",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.29.0",
|
|
5
5
|
"author": "PixPilot <m.doaie@hotmail.com>",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"repository": {
|
|
@@ -49,9 +49,9 @@
|
|
|
49
49
|
"typescript": "^5.9.3",
|
|
50
50
|
"@internal/eslint-config": "0.3.0",
|
|
51
51
|
"@internal/prettier-config": "0.0.1",
|
|
52
|
+
"@internal/tsconfig": "0.1.0",
|
|
52
53
|
"@internal/tsdown-config": "0.1.0",
|
|
53
|
-
"@internal/vitest-config": "0.1.0"
|
|
54
|
-
"@internal/tsconfig": "0.1.0"
|
|
54
|
+
"@internal/vitest-config": "0.1.0"
|
|
55
55
|
},
|
|
56
56
|
"prettier": "@internal/prettier-config",
|
|
57
57
|
"scripts": {
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./config-DfRbCqsT.js";import{_ as t,b as n,c as r,d as i,g as a,h as o,i as s,l as c,m as l,p as u,r as d,s as f,t as p,u as m,v as h,x as g,y as _}from"./utils-C3bHtTZl.js";import v from"node:path";import y from"node:fs";import b from"node:process";import{promisify as x}from"node:util";import{execSync as S}from"node:child_process";import{confirm as ee,input as te,number as ne,password as re,select as ie}from"@inquirer/prompts";var C=class e extends g{constructor(e,t,n,r){super(e,`DUPLICATE_ID`),this.id=t,this.type=n,this.existingType=r,this.name=`DuplicateIdError`}static forId(t,n,r){return new e(`Duplicate ID "${t}" found in ${n}. This ID is already used in ${r??`unknown`}`,t,n,r)}},w=class e extends g{constructor(e,t,n,r,i){super(e,`ID_CONFLICT`),this.id=t,this.type=n,this.baseSource=r,this.overrideSource=i,this.name=`IdConflictError`}static forTask(t,n,r){return new e(`Task ID conflict: "${t}" is defined in multiple templates.\n Base task from: ${n??`unknown`}\n Override task from: ${r??`unknown`}\n You must specify an override strategy: add "override": "merge" or "override": "replace" to the task.\n Task is being extended/overridden but no override strategy was specified.`,t,`task`,n,r)}static forVariable(t){return new e(`Variable ID conflict: "${t}" is defined in multiple templates.\n You must specify an override strategy: add "override": "merge" or "override": "replace" to the variable.\n Variable is being extended/overridden but no override strategy was specified.`,t,`variable`)}static forPrompt(t){return new e(`Prompt ID conflict: "${t}" is defined in multiple templates.\n You must specify an override strategy: add "override": "merge" or "override": "replace" to the prompt.\n Prompt is being extended/overridden but no override strategy was specified.`,t,`prompt`)}},ae=class e extends g{constructor(e,t){super(e,`TASK_NOT_FOUND`),this.taskId=t,this.name=`TaskNotFoundError`}static forId(t){return new e(`Task not found: ${t}`,t)}},T=class e extends g{constructor(e,t,n){super(e,`PROMPT_VALIDATION_ERROR`),this.promptId=t,this.reason=n,this.name=`PromptValidationError`}static required(t){return new e(`Prompt "${t}" is required`,t,`required`)}static unknownType(t){return new e(`Unknown prompt type: ${t}`,t,`unknown_type`)}},E=class e extends g{constructor(e,t,n){super(e,`PLUGIN_CONFIGURATION_ERROR`),this.pluginType=t,this.configIssue=n,this.name=`PluginConfigurationError`}static templateMissingTemplateOrFile(){return new e(`Template task requires either "template" (inline) or "templateFile" (file path) to be specified`,`template`,`missing_template_or_file`)}static templateHasBothTemplateAndFile(){return new e(`Template task cannot have both "template" and "templateFile" specified. Use one or the other.`,`template`,`both_template_and_file`)}static createMissingTemplateOrFile(){return new e(`Create task requires either "template" (inline) or "templateFile" (file path) to be specified`,`create`,`missing_template_or_file`)}static createHasBothTemplateAndFile(){return new e(`Create task cannot have both "template" and "templateFile" specified. Use one or the other.`,`create`,`both_template_and_file`)}};const oe=x(y.readFile);function se(e){let t=new Map;for(let n of e){let e=t.get(n.name)||[];e.push(n),t.set(n.name,e)}if(Array.from(t.values()).some(e=>e.length>1))return e;let r=[],i=new Set,a=new Set,o=new Map;for(let t of e)o.set(t.name,t);function s(e){if(i.has(e))return;if(a.has(e))throw n.forTemplateDependencies(Array.from(a),e);a.add(e);let t=o.get(e);if(t!=null&&t.dependencies!=null&&t.dependencies.length>0)for(let e of t.dependencies)s(e);a.delete(e),i.add(e),t!=null&&r.push(t)}for(let t of e)s(t.name);return r}const ce={template:[[`template`,`templateFile`]]};function D(e){if(e==null||e===``)return`current template`;if(O(e))return e;let t=b.cwd();return e.startsWith(t)?v.relative(t,e):e}function O(e){try{let t=new URL(e);return t.protocol===`http:`||t.protocol===`https:`}catch{return!1}}function le(e,t){if(O(e))return e;if(t==null||t===``)return v.isAbsolute(e)?e:v.resolve(b.cwd(),e);if(O(t))try{let n=new URL(`.`,t);return new URL(e,n).href}catch{throw _.forRemoteTemplate(e,t)}let n=v.dirname(t);return v.isAbsolute(e)?e:v.resolve(n,e)}async function ue(e){if(O(e))return de(e);if(!y.existsSync(e))throw t.forPath(e);return oe(e,`utf-8`)}async function de(e){try{let t=await fetch(e);if(!t.ok)throw a.forUrl(e,t.status,t.statusText);return await t.text()}catch(t){throw t instanceof Error&&t.message.includes(`Failed to fetch`)?t:a.forUrl(e,t instanceof Error?t:void 0)}}const k=new Map;async function fe(e,r=new Set){let i=O(e),a;if(a=i||v.isAbsolute(e)?e:v.resolve(b.cwd(),e),k.has(a))return k.get(a);if(r.has(a))throw n.forTemplateInheritance(r,a);r.add(a);let s;if(i)s=await de(a);else{if(!y.existsSync(a))throw t.forPath(a);s=await oe(a,`utf-8`)}let c;try{c=JSON.parse(s)}catch(e){throw h.forFile(a,e instanceof Error?e:Error(String(e)))}if(c.name==null||c.name.trim()===``)throw o.missingName(a);if(!/^[a-z\d]+(?:-[a-z\d]+)*$/u.test(c.name))throw o.invalidNameFormat(a,c.name);if(c.tasks!==void 0&&!Array.isArray(c.tasks))throw o.tasksNotArray(a);c.tasks===void 0&&(c.tasks=[]);for(let e of c.tasks)e.$sourceUrl=a;return k.set(a,c),c}async function pe(e,t,r,i,a){let o=O(e),s;if(s=o||v.isAbsolute(e)?e:t==null?v.resolve(b.cwd(),e):O(t)?new URL(e,t).href:v.resolve(t,e),r.has(s))return;if(i.has(s))throw n.forTemplateInheritance(i,s);i.add(s);let c=await fe(s),l=O(s)?new URL(`.`,s).href:v.dirname(s);if(c.extends!=null&&c.extends!==``){let e=Array.isArray(c.extends)?c.extends:[c.extends];for(let t of e)await pe(t,l,r,i,a)}i.delete(s),r.add(s),a.push(c)}async function A(e,t,n=new Set){let r=[];return await pe(e,t,n,new Set,r),se(r)}async function me(e,t,n=new Set){return ve(await A(e,t,n))}function he(e,t,n){let r=new Map;for(let t of e){if(r.has(t.id))throw C.forId(t.id,`task`,r.get(t.id));r.set(t.id,`task`)}if(t!=null)for(let e of t){if(r.has(e.id))throw C.forId(e.id,`variable`,r.get(e.id));r.set(e.id,`variable`)}if(n!=null)for(let e of n){if(r.has(e.id))throw C.forId(e.id,`prompt`,r.get(e.id));r.set(e.id,`prompt`)}}function ge(e,t){if((t.override??`merge`)===`replace`){s(` → Variable "${t.id}" using 'replace' strategy`,`info`);let{override:e,...n}=t;return n}s(` → Variable "${t.id}" merged (value replaced)`,`info`);let n={...e,...t};return delete n.override,n}function _e(e,t){if((t.override??`merge`)===`replace`){s(` → Prompt "${t.id}" using 'replace' strategy`,`info`);let{override:e,...n}=t;return n}s(` → Prompt "${t.id}" merged`,`info`);let n={...e,...t};return delete n.override,n}function ve(e){if(e.length===0)return{name:`Empty Template`,tasks:[]};if(e.length===1){let t=e[0];return he(t.tasks??[],t.variables,t.prompts),t}let t=new Map,n=new Map,r=new Map,i={};for(let a of e){if(a.enabled!=null&&(i[a.name]=a.enabled),a.enabled===!1){s(`⊘ Skipping disabled template "${a.name}" - its tasks, prompts, and variables will not be included`,`info`);continue}if(a.prompts!=null)for(let e of a.prompts)if(r.has(e.id)){if(e.override==null)throw w.forPrompt(e.id);let t=_e(r.get(e.id),e);a.enabled!=null&&(t.$templateEnabled=a.enabled),r.set(e.id,t)}else{let t={...e};a.enabled!=null&&(t.$templateEnabled=a.enabled),r.set(e.id,t)}if(a.variables!=null)for(let e of a.variables)if(n.has(e.id)){if(e.override==null)throw w.forVariable(e.id);let t=ge(n.get(e.id),e);a.enabled!=null&&(t.$templateEnabled=a.enabled),n.set(e.id,t)}else{let t={...e};a.enabled!=null&&(t.$templateEnabled=a.enabled),n.set(e.id,t)}for(let e of a.tasks??[])if(t.has(e.id)){if(e.override==null){let n=t.get(e.id);throw w.forTask(e.id,D(n.$sourceUrl),D(e.$sourceUrl))}let n=xe(t.get(e.id),e);a.enabled!=null&&(n.$templateEnabled=a.enabled),t.set(e.id,n)}else{let n={...e};a.enabled!=null&&(n.$templateEnabled=a.enabled),t.set(e.id,n)}}let a=Array.from(t.values()),o=r.size>0?Array.from(r.values()):void 0,c=n.size>0?Array.from(n.values()):void 0;he(a,c,o);let l=e[e.length-1],u={name:l.name,tasks:a};return l.description!=null&&(u.description=l.description),l.dependencies!=null&&(u.dependencies=l.dependencies),l.enabled!=null&&(u.enabled=l.enabled),o!=null&&(u.prompts=o),c!=null&&(u.variables=c),u}function ye(e,t){let n=ce[e];if(!n)return null;for(let e of n){let n=e.filter(e=>e in t&&t[e]!=null);if(n.length>1)return n}return null}function be(e,t,n){let r={...e},i=ce[n]??[];for(let[e,n]of Object.entries(t)){for(let t of i)if(t.includes(e)){for(let n of t)n!==e&&delete r[n];break}r[e]=n}return r}function xe(e,t){if((t.override??`merge`)===`replace`){s(` → Task "${t.id}" using 'replace' strategy - completely replacing base task`,`info`),s(` Base: ${D(e.$sourceUrl)}`,`info`),s(` Override: ${D(t.$sourceUrl)}`,`info`);let{override:n,...r}=t;return r}s(` → Merging task "${t.id}"`,`info`),s(` Base: ${D(e.$sourceUrl)}`,`info`),s(` Override: ${D(t.$sourceUrl)}`,`info`);let n;if(typeof e.config==`object`&&e.config!==null&&typeof t.config==`object`&&t.config!==null){n=be(e.config,t.config,t.type);let r=ye(t.type,n);r!==null&&r.length>0&&(s(` ⚠️ Warning: Conflicting config fields detected: ${r.join(`, `)}`,`warn`),s(` Please use override: "replace" or specify only one of these fields`,`warn`))}else n=t.config??e.config;let r=[...e.dependencies??[],...t.dependencies??[]],i=r.length>0?[...new Set(r)]:void 0,a=t.$sourceUrl??e.$sourceUrl,o={...e,...t,config:n,...i!=null&&{dependencies:i},...a!=null&&{$sourceUrl:a}};return delete o.override,o}function Se(){k.clear()}async function Ce(e,t){if(m(`Loading tasks from ${e}...`),t?.sequential===!0){let t=await A(e);return m(`Loaded ${t.length} template(s) for processing`),{tasks:[],templates:t}}let n=await me(e);s(`Loaded ${n.tasks?.length??0} task(s)`,`info`),n.extends!=null&&n.extends!==``&&s(`Extended from: ${(Array.isArray(n.extends)?n.extends:[n.extends]).join(`, `)}`,`info`),n.prompts!=null&&n.prompts.length>0&&s(`Found ${n.prompts.length} top-level prompt(s)`,`info`),n.variables!=null&&n.variables.length>0&&s(`Found ${n.variables.length} top-level variable(s)`,`info`);let r={tasks:n.tasks??[]};return n.prompts!=null&&(r.prompts=n.prompts),n.variables!=null&&(r.variables=n.variables),n.enabled!=null&&(r.enabled=n.enabled),r}function j(e){return e.template!=null&&e.template!==``}function M(e){return e.templateFile!=null&&e.templateFile!==``}function we(e){return e.endsWith(`.hbs`)}function N(e){let t=j(e),n=M(e);return!t&&!n?{isValid:!1,hasInlineTemplate:t,hasTemplateFile:n,error:`Template configuration requires either "template" (inline) or "templateFile" (file path) to be specified`}:t&&n?{isValid:!1,hasInlineTemplate:t,hasTemplateFile:n,error:`Template configuration cannot have both "template" and "templateFile" specified. Use one or the other.`}:{isValid:!0,hasInlineTemplate:t,hasTemplateFile:n}}async function P(e,t,n,r={}){let{enableHandlebars:i=!0,sourceUrl:a=n?.$sourceUrl}=r,o=j(e),s=M(e);if(o)return d(e.template,t);if(s){let n=e.templateFile,r=i&&we(n),o=await ue(le(n,a));return r?(await import(`handlebars`)).default.compile(o)(t):d(o,t)}throw Error(`No template content available`)}function Te(e){return j(e)?`inline template`:M(e)?`template file: ${e.templateFile}`:`no template source`}const F=x(y.readFile),I={reset:`\x1B[0m`,red:`\x1B[31m`,green:`\x1B[32m`,yellow:`\x1B[33m`,blue:`\x1B[34m`,cyan:`\x1B[36m`,gray:`\x1B[90m`};function Ee(e,t){switch(t){case`add`:return`${I.green}+ ${e}${I.reset}`;case`remove`:return`${I.red}- ${e}${I.reset}`;case`context`:return`${I.gray} ${e}${I.reset}`;default:return e}}function L(e,t){let n=e.split(`
|
|
2
|
-
`),r=t.split(`
|
|
3
|
-
`),i=[],a=Math.max(n.length,r.length);for(let e=0;e<a;e++){let t=n[e],a=r[e];t===a?t!==void 0&&i.push(Ee(t,`context`)):(t!==void 0&&i.push(Ee(t,`remove`)),a!==void 0&&i.push(Ee(a,`add`)))}return i}async function De(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${I.yellow}⊘ Condition not met - task would be skipped${I.reset}`;let n=v.join(b.cwd(),e.file);if(!y.existsSync(n))return`${I.red}✗ File not found: ${e.file}${I.reset}`;try{let r=await F(n,`utf-8`),i=JSON.parse(r),a={...i};function o(e){if(typeof e==`string`)return d(e,t);if(Array.isArray(e))return e.map(e=>o(e));if(typeof e==`object`&&e){let t={};for(let[n,r]of Object.entries(e))t[n]=o(r);return t}return e}for(let[t,n]of Object.entries(e.updates)){let e=o(n);t.includes(`.`)?f(i,t,e):i[t]=e}let s=JSON.stringify(a,null,2),c=JSON.stringify(i,null,2);if(s===c)return`${I.cyan}→ No changes${I.reset}`;let l=L(s,c);return`${I.blue}File: ${e.file}${I.reset}\n${l.join(`
|
|
4
|
-
`)}`}catch(e){return`${I.red}✗ Error: ${e instanceof Error?e.message:String(e)}${I.reset}`}}async function Oe(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${I.yellow}⊘ Condition not met - task would be skipped${I.reset}`;if(e.template==null||e.template===``)return`${I.red}✗ No template content provided for file: ${e.file}${I.reset}`;let n=v.join(b.cwd(),e.file),r=d(e.template,t);if(!y.existsSync(n)){let t=r.split(`
|
|
5
|
-
`).slice(0,10).join(`
|
|
6
|
-
`),n=r.split(`
|
|
7
|
-
`).length>10;return`${I.blue}File: ${e.file}${I.reset}\n${I.green}+ New file would be created${I.reset}\n${I.gray}Content preview:${I.reset}\n${t}${n?`
|
|
8
|
-
...`:``}`}try{let t=await F(n,`utf-8`);if(t===r)return`${I.cyan}→ No changes${I.reset}`;let i=L(t,r);return`${I.blue}File: ${e.file}${I.reset}\n${i.join(`
|
|
9
|
-
`)}`}catch(e){return`${I.red}✗ Error: ${e instanceof Error?e.message:String(e)}${I.reset}`}}async function ke(e,t,n){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${I.yellow}⊘ Condition not met - task would be skipped${I.reset}`;let r=v.join(b.cwd(),e.file);if(y.existsSync(r))return`${I.cyan}→ File already exists, would be skipped: ${e.file}${I.reset}`;try{if(j(e)){let r=await P(e,t,n),i=r.split(`
|
|
10
|
-
`).slice(0,10).join(`
|
|
11
|
-
`),a=r.split(`
|
|
12
|
-
`).length>10;return`${I.blue}File: ${e.file}${I.reset}\n${I.green}+ New file would be created${I.reset}\n${I.gray}Content preview:${I.reset}\n${i}${a?`
|
|
13
|
-
...`:``}`}let r=Te(e);return`${I.blue}File: ${e.file}${I.reset}\n${I.green}+ New file would be created from ${r}${I.reset}`}catch(e){return`${I.red}✗ Error: ${e instanceof Error?e.message:String(e)}${I.reset}`}}async function Ae(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${I.yellow}⊘ Condition not met - task would be skipped${I.reset}`;let n=v.join(b.cwd(),e.file);if(!y.existsSync(n))return`${I.red}✗ File not found: ${e.file}${I.reset}`;try{let r=await F(n,`utf-8`),i=new RegExp(e.pattern,e.flags??`g`),a=d(e.replacement,t),o=r.replace(i,a);if(r===o)return`${I.cyan}→ No matches found${I.reset}`;let s=L(r,o);return`${I.blue}File: ${e.file}${I.reset}\n${s.join(`
|
|
14
|
-
`)}`}catch(e){return`${I.red}✗ Error: ${e instanceof Error?e.message:String(e)}${I.reset}`}}async function je(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${I.yellow}⊘ Condition not met - task would be skipped${I.reset}`;let n=v.join(b.cwd(),e.file);if(!y.existsSync(n))return`${I.red}✗ File not found: ${e.file}${I.reset}`;try{let r=await F(n,`utf-8`),i=r;for(let{find:n,replace:i}of e.replacements){let e=d(n,t),a=d(i,t);r=r.replace(e,a)}if(i===r)return`${I.cyan}→ No changes${I.reset}`;let a=L(i,r);return`${I.blue}File: ${e.file}${I.reset}\n${a.join(`
|
|
15
|
-
`)}`}catch(e){return`${I.red}✗ Error: ${e instanceof Error?e.message:String(e)}${I.reset}`}}function Me(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${I.yellow}⊘ Condition not met - task would be skipped${I.reset}`;let n=e.paths.map(e=>d(e,t)).filter(e=>y.existsSync(v.join(b.cwd(),e)));return n.length===0?`${I.cyan}→ No files/directories to delete${I.reset}`:`${I.red}Would delete:${I.reset}\n${n.map(e=>`${I.red} - ${e}${I.reset}`).join(`
|
|
16
|
-
`)}`}function Ne(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${I.yellow}⊘ Condition not met - task would be skipped${I.reset}`;let n=d(e.from,t),r=d(e.to,t),i=v.join(b.cwd(),n),a=v.join(b.cwd(),r);return y.existsSync(i)?y.existsSync(a)?`${I.yellow}⚠ Destination already exists: ${r}${I.reset}\n${I.cyan}Would rename: ${n} → ${r}${I.reset}`:`${I.cyan}Would rename: ${n} → ${r}${I.reset}`:`${I.red}✗ Source not found: ${n}${I.reset}`}function Pe(e){if(e.condition!=null&&e.condition!==``)return`${I.yellow}⊘ Condition check skipped in dry-run${I.reset}`;let t=v.join(b.cwd(),`.git`),n=y.existsSync(t),r=[];if(e.removeExisting&&n&&r.push(`${I.red}Would remove existing .git directory${I.reset}`),r.push(`${I.green}Would initialize git repository${I.reset}`),e.initialCommit){let t=e.message??`Initial commit`;r.push(`${I.green}Would create initial commit: "${t}"${I.reset}`)}return r.join(`
|
|
17
|
-
`)}function Fe(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${I.yellow}⊘ Condition not met - task would be skipped${I.reset}`;let n=d(e.command,t),r=e.cwd==null?b.cwd():d(e.cwd,t);return`${I.yellow}Would execute:${I.reset}\n${I.cyan} Command: ${n}${I.reset}\n${I.cyan} Working directory: ${r}${I.reset}`}function Ie(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${I.yellow}⊘ Condition not met - task would be skipped${I.reset}`;let n=d(e.from,t),r=d(e.to,t),i=v.join(b.cwd(),n),a=v.join(b.cwd(),r);return y.existsSync(i)?y.existsSync(a)?`${I.yellow}⚠ Destination already exists: ${r}${I.reset}\n${I.cyan}Would move: ${n} → ${r}${I.reset}`:`${I.cyan}Would move: ${n} → ${r}${I.reset}`:`${I.red}✗ Source not found: ${n}${I.reset}`}function Le(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${I.yellow}⊘ Condition not met - task would be skipped${I.reset}`;let n=d(e.from,t),r=d(e.to,t),i=v.join(b.cwd(),n),a=v.join(b.cwd(),r);if(!y.existsSync(i))return`${I.red}✗ Source not found: ${n}${I.reset}`;let o=y.statSync(i).isDirectory()?`directory`:`file`;return y.existsSync(a)?`${I.yellow}⚠ Destination already exists: ${r}${I.reset}\n${I.cyan}Would copy ${o}: ${n} → ${r}${I.reset}`:`${I.cyan}Would copy ${o}: ${n} → ${r}${I.reset}`}async function Re(e,t,n){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${I.yellow}⊘ Condition not met - task would be skipped${I.reset}`;let r=v.join(b.cwd(),e.file),i={};e.content==null?e.template!=null&&(i.template=e.template):i.template=e.content,e.templateFile!=null&&(i.templateFile=e.templateFile);try{let a=await P(i,t,n),o=a.split(`
|
|
18
|
-
`).slice(0,10).join(`
|
|
19
|
-
`),s=a.split(`
|
|
20
|
-
`).length>10;return y.existsSync(r)?`${I.blue}File: ${e.file}${I.reset}\n${I.green}+ Would append content${I.reset}\n${I.gray}Content preview:${I.reset}\n${o}${s?`
|
|
21
|
-
...`:``}`:`${I.blue}File: ${e.file}${I.reset}\n${I.green}+ New file would be created with content${I.reset}\n${I.gray}Content preview:${I.reset}\n${o}${s?`
|
|
22
|
-
...`:``}`}catch(e){return`${I.red}✗ Error: ${e instanceof Error?e.message:String(e)}${I.reset}`}}function ze(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${I.yellow}⊘ Condition not met - task would be skipped${I.reset}`;let n=d(e.path,t),r=v.join(b.cwd(),n);return y.existsSync(r)?`${I.cyan}→ Directory already exists: ${n}${I.reset}`:`${I.green}+ Would create directory: ${n}${I.reset}`}async function Be(e,t){try{switch(e.type){case`update-json`:return await De(e.config,t);case`write`:return await Oe(e.config,t);case`create`:return await ke(e.config,t,e);case`regex-replace`:return await Ae(e.config,t);case`replace-in-file`:return await je(e.config,t);case`delete`:return Me(e.config,t);case`rename`:return Ne(e.config,t);case`move`:return Ie(e.config,t);case`copy`:return Le(e.config,t);case`append`:return await Re(e.config,t,e);case`mkdir`:return ze(e.config,t);case`git-init`:return Pe(e.config);case`exec`:return Fe(e.config,t);default:{let t=e.type;return`${I.yellow}⚠ Diff not available for task type: ${t}${I.reset}`}}}catch(e){return`${I.red}✗ Error generating diff: ${e instanceof Error?e.message:String(e)}${I.reset}`}}async function R(e,t){console.log(`${I.blue}═══════════════════════════════════════════════════════${I.reset}`),console.log(`${I.blue} DRY RUN - Preview of changes${I.reset}`),console.log(`${I.blue}═══════════════════════════════════════════════════════${I.reset}`);for(let n of e){console.log(`${I.cyan}▶ Task: ${n.name}${I.reset}`),n.description!=null&&n.description!==``&&console.log(`${I.gray} ${n.description}${I.reset}`);let e=await Be(n,t);console.log(e),console.log(`${I.gray}${`─`.repeat(55)}${I.reset}`)}console.log(`${I.blue}═══════════════════════════════════════════════════════${I.reset}`),console.log(`${I.yellow} No changes were applied (dry-run mode)${I.reset}`),console.log(`${I.blue}═══════════════════════════════════════════════════════${I.reset}`)}const z=new Map,B={},V=new Map;function H(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(z.has(e.name))throw TypeError(`Plugin ${e.name} is already registered`);for(let t of e.taskTypes)if(V.has(t)){let e=V.get(t);throw TypeError(`Task type "${t}" is already registered by plugin "${e}"`)}z.set(e.name,e);for(let t of e.taskTypes)V.set(t,e.name);m(`Registered plugin: ${e.name}${e.version==null?``:` v${e.version}`}`)}function Ve(e){let t=z.get(e);if(t!=null){for(let e of t.taskTypes)V.delete(e);z.delete(e)}}function He(e){return z.get(e)}function U(e){let t=V.get(e);if(t!=null)return z.get(t)}function W(e){return V.has(e)}function Ue(){return Array.from(z.keys())}function We(){z.clear(),V.clear()}function Ge(e){e.beforeAll!=null&&(B.beforeAll=e.beforeAll),e.afterAll!=null&&(B.afterAll=e.afterAll),e.beforeTask!=null&&(B.beforeTask=e.beforeTask),e.afterTask!=null&&(B.afterTask=e.afterTask),e.onError!=null&&(B.onError=e.onError)}async function G(e,...t){let n=B[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){s(`Error in ${e} hook: ${t instanceof Error?t.message:String(t)}`,`error`)}}async function Ke(e,t,n){let r=U(e.type);if(r==null)throw TypeError(`No plugin found for task type: ${e.type}`);await r.execute(e,t,n)}async function qe(e,t){let n=U(e.type);if(!(n==null||n.getDiff==null))return n.getDiff(e,t)}function Je(e){let t=U(e.type);return t==null?[`No plugin found for task type: ${e.type}`]:t.validate==null?[]:t.validate(e)}function Ye(e,t,n,r){return{name:e,...r?.version!=null&&{version:r.version},taskTypes:[t],execute:n,...r?.getDiff!=null&&{getDiff:r.getDiff},...r?.validate!=null&&{validate:r.validate}}}async function K(e,t,n){if(e===void 0)return;if(typeof e!=`object`||!e||Array.isArray(e))return typeof e==`string`&&n&&/\{\{\w+\}\}/u.test(e)?d(e,n):e;let r=e;if(r.type===`conditional`){if(!n)return;if(typeof r.condition!=`string`){s(`Prompt "${t}": conditional default must have a string condition`,`error`);return}try{let{evaluateCondition:e}=await import(`./utils-ChEwzXBK.js`),t=e(r.condition,n)?r.ifTrue:r.ifFalse;return typeof t==`string`&&/\{\{\w+\}\}/u.test(t)&&(t=d(t,n)),t}catch(e){s(`Prompt "${t}": failed to evaluate conditional default: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}if(r.type===`exec`){let e=r.value;if(typeof e!=`string`){s(`Prompt "${t}": exec default value must have a string command`,`error`);return}try{let t=S(e,{encoding:`utf-8`,stdio:[`pipe`,`pipe`,`pipe`],timeout:1e4}).trim();if(t.startsWith(`{`)||t.startsWith(`[`))try{return JSON.parse(t)}catch{return t}if(/^-?\d+(?:\.\d+)?$/u.test(t)){let e=Number.parseFloat(t);if(!Number.isNaN(e))return e}return t===`true`||t===`false`?t===`true`:t}catch(e){s(`Prompt "${t}": failed to execute default value command: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}else if(r.type===`static`)return r.value;else if(r.type!==void 0){s(`Prompt "${t}": unknown default value type "${r.type}". Expected "static", "exec", or "conditional".`,`error`);return}return e}async function q(e,t=new Map,n={}){let r={};if(e.length===0)return r;for(let i of e){if(i.$templateEnabled!=null&&!await c(i.$templateEnabled,{...n,...r}))continue;let e={...n,...r};if(await c(i.enabled,e))try{let n,a=t.get(i.id);switch(i.default!==void 0&&(a=await K(i.default,i.id,e)),i.type){case`input`:{let e={message:i.message};if(a!==void 0&&(e.default=String(a)),i.required!==void 0&&(e.required=i.required),n=await te(e),i.required&&(n==null||typeof n==`string`&&n.trim()===``))throw s(`${i.message} is required`,`error`),T.required(i.id);break}case`password`:if(n=await re({message:i.message,mask:`*`}),i.required&&(n==null||typeof n==`string`&&n.trim()===``))throw s(`${i.message} is required`,`error`),T.required(i.id);break;case`number`:{let e={message:i.message};if(a!==void 0&&(e.default=Number(a)),i.required!==void 0&&(e.required=i.required),i.min!==void 0&&(e.min=i.min),i.max!==void 0&&(e.max=i.max),n=await ne(e),i.required&&n==null)throw s(`${i.message} is required`,`error`),T.required(i.id);break}case`select`:{let e={message:i.message,choices:i.choices.map(e=>({name:e.name,value:e.value}))};a!==void 0&&(e.default=a),n=await ie(e);break}case`confirm`:{let e=a===void 0?!1:!!a;n=await ee({message:i.message,default:e});break}default:throw s(`Unknown prompt type: ${i.type}`,`error`),T.unknownType(i.type)}r[i.id]=n}catch(e){throw e instanceof Error&&s(`Failed to collect prompt "${i.id}": ${e.message}`,`error`),e}}return r}async function J(e){let t=new Map,n=e.map(async e=>{if(e.default!==void 0){let n=await K(e.default,e.id);n!==void 0&&t.set(e.id,n)}});return await Promise.all(n),t}function Y(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 Xe=x(y.appendFile),Ze=x(y.readFile),Qe=x(y.stat);async function $e(e,t,n){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t)){s(`Condition not met, skipping append task`,`info`);return}let r=v.join(b.cwd(),e.file),i={};e.content==null?e.template!=null&&(i.template=e.template):i.template=e.content,e.templateFile!=null&&(i.templateFile=e.templateFile);let a=N(i);if(!a.isValid)throw a.error?.includes(`cannot have both`)?E.templateHasBothTemplateAndFile():E.templateMissingTemplateOrFile();let o=await P(i,t,n),c=!1,l=!1;try{await Qe(r),c=!0;let t=await Ze(r,`utf-8`);t.length>0&&!t.endsWith(`
|
|
23
|
-
`)&&(l=e.newline!==!1)}catch{}c&&l?await Xe(r,`\n${o}`):await Xe(r,o),s(`Appended content to ${e.file}`,`success`)}const et={name:`append`,version:`1.0.0`,taskTypes:[`append`],execute:async(e,t,n)=>{n.dryRun||await $e(e.config,t,e)}},tt=x(y.copyFile),nt=x(y.stat),rt=x(y.mkdir),it=x(y.readdir);async function at(e,t){await rt(t,{recursive:!0});let n=await it(e,{withFileTypes:!0});await Promise.all(n.map(async n=>{let r=v.join(e,n.name),i=v.join(t,n.name);n.isDirectory()?await at(r,i):await tt(r,i)}))}async function ot(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t)){s(`Condition not met, skipping copy task`,`info`);return}let n=v.join(b.cwd(),e.from),r=v.join(b.cwd(),e.to),i;try{i=await nt(n)}catch{s(`Source path does not exist: ${n}`,`warn`);return}await rt(v.dirname(r),{recursive:!0}),i.isDirectory()?(await at(n,r),s(`Copied directory ${e.from} to ${e.to}`,`success`)):(await tt(n,r),s(`Copied file ${e.from} to ${e.to}`,`success`))}const st={name:`copy`,version:`1.0.0`,taskTypes:[`copy`],execute:async(e,t,n)=>{n.dryRun||await ot(e.config,t)}},ct=x(y.writeFile);async function lt(e,t,n){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t)){s(`Condition not met, skipping create task`,`info`);return}let r=v.join(b.cwd(),e.file);if(y.existsSync(r)){s(`File already exists, skipping: ${e.file}`,`info`);return}let i=N(e);if(!i.isValid)throw i.error?.includes(`cannot have both`)?E.createHasBothTemplateAndFile():E.createMissingTemplateOrFile();let a=await P(e,t,n),o=v.dirname(r);y.existsSync(o)||y.mkdirSync(o,{recursive:!0}),await ct(r,a),s(`Created file: ${e.file}`,`success`)}const ut={name:`create`,version:`1.0.0`,taskTypes:[`create`],execute:async(e,t,n)=>{n.dryRun||await lt(e.config,t,e)}};async function dt(e,t){let{paths:n,condition:r}=e;if(r!=null&&r!==``){if(!t){s(`Condition specified but no config provided, skipping deletion`,`warn`);return}if(!p(r,t)){s(`Condition not met, skipping deletion`,`info`);return}}for(let e of n){let t=v.join(b.cwd(),e);y.existsSync(t)&&y.rmSync(t,{recursive:!0,force:!0})}}const ft={name:`delete`,version:`1.0.0`,taskTypes:[`delete`],execute:async(e,t,n)=>{n.dryRun||await dt(e.config,t)}};async function pt(e,t){if(e.condition!=null&&e.condition!==``){if(!t){s(`Condition specified but no config provided, skipping exec`,`warn`);return}if(!p(e.condition,t)){s(`Condition not met, skipping exec task`,`info`);return}}let n=e.cwd==null?b.cwd():v.join(b.cwd(),e.cwd);S(e.command,{cwd:n,stdio:`inherit`})}const mt={name:`exec`,version:`1.0.0`,taskTypes:[`exec`],execute:async(e,t,n)=>{n.dryRun||await pt(e.config,t)}};async function ht(e,t){if(e.condition!=null&&e.condition!==``){if(!t){s(`Condition specified but no config provided, skipping git-init`,`warn`);return}if(!p(e.condition,t)){s(`Condition not met, skipping git-init task`,`info`);return}}if(e.removeExisting){let e=v.join(b.cwd(),`.git`);y.existsSync(e)&&y.rmSync(e,{recursive:!0,force:!0})}if(S(`git init`,{stdio:`inherit`}),e.initialCommit){let t=e.message??`Initial commit`;S(`git add .`,{stdio:`inherit`}),S(`git commit -m "${t}"`,{stdio:`inherit`})}}const gt={name:`git-init`,version:`1.0.0`,taskTypes:[`git-init`],execute:async(e,t,n)=>{n.dryRun||await ht(e.config,t)}},_t=x(y.mkdir);async function vt(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t)){s(`Condition not met, skipping mkdir task`,`info`);return}await _t(v.join(b.cwd(),e.path),{recursive:!0}),s(`Created directory: ${e.path}`,`success`)}const yt={name:`mkdir`,version:`1.0.0`,taskTypes:[`mkdir`],execute:async(e,t,n)=>{n.dryRun||await vt(e.config,t)}},bt=x(y.rename),xt=x(y.stat),St=x(y.mkdir);async function Ct(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t)){s(`Condition not met, skipping move task`,`info`);return}let n=v.join(b.cwd(),e.from),r=v.join(b.cwd(),e.to);try{await xt(n)}catch{s(`Source path does not exist: ${n}`,`warn`);return}await St(v.dirname(r),{recursive:!0}),await bt(n,r),s(`Moved ${e.from} to ${e.to}`,`success`)}const wt={name:`move`,version:`1.0.0`,taskTypes:[`move`],execute:async(e,t,n)=>{n.dryRun||await Ct(e.config,t)}},Tt=x(y.readFile),Et=x(y.writeFile);async function Dt(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t)){s(`Condition not met, skipping regex-replace task`,`info`);return}let n=v.join(b.cwd(),e.file),{pattern:r}=e,i=e.flags??``,a=e.replacement||``,o=await Tt(n,`utf-8`),c=new RegExp(r,i);o=o.replace(c,d(a,t)),await Et(n,o)}const Ot={name:`regex-replace`,version:`1.0.0`,taskTypes:[`regex-replace`],execute:async(e,t,n)=>{n.dryRun||await Dt(e.config,t)}},kt=x(y.rename);async function At(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t)){s(`Condition not met, skipping rename task`,`info`);return}let n=v.join(b.cwd(),d(e.from,t)),r=v.join(b.cwd(),d(e.to,t));if(!y.existsSync(n)){s(`Source path does not exist: ${n}`,`warn`);return}await kt(n,r)}const jt={name:`rename`,version:`1.0.0`,taskTypes:[`rename`],execute:async(e,t,n)=>{n.dryRun||await At(e.config,t)}},Mt=x(y.readFile),Nt=x(y.writeFile);async function Pt(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t)){s(`Condition not met, skipping replace-in-file task`,`info`);return}let n=v.join(b.cwd(),e.file),{replacements:r}=e;if(!y.existsSync(n)){s(`File not found: ${n}, skipping`,`warn`);return}let i=await Mt(n,`utf-8`);for(let{find:e,replace:n}of r){let r=d(n,t);i=i.replace(new RegExp(e,`gu`),r)}await Nt(n,i)}const Ft={name:`replace-in-file`,version:`1.0.0`,taskTypes:[`replace-in-file`],execute:async(e,t,n)=>{n.dryRun||await Pt(e.config,t)}},It=x(y.readFile),Lt=x(y.writeFile);async function Rt(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t)){s(`Condition not met, skipping update-json task`,`info`);return}let n=v.join(b.cwd(),e.file),{updates:r}=e,i=await It(n,`utf-8`),a=JSON.parse(i);function o(e){if(typeof e==`string`)return d(e,t);if(Array.isArray(e))return e.map(e=>o(e));if(typeof e==`object`&&e){let t={};for(let[n,r]of Object.entries(e))t[n]=o(r);return t}return e}for(let[e,t]of Object.entries(r)){let n=o(t);e.includes(`.`)?f(a,e,n):a[e]=n}await Lt(n,`${JSON.stringify(a,null,2)}\n`)}const zt={name:`update-json`,version:`1.0.0`,taskTypes:[`update-json`],execute:async(e,t,n)=>{n.dryRun||await Rt(e.config,t)}},Bt=x(y.writeFile);async function Vt(e,t,n){let{allowCreate:r=!0}=e;if(e.condition!=null&&e.condition!==``&&!p(e.condition,t)){s(`Condition not met, skipping write task`,`info`);return}let i=v.join(b.cwd(),e.file);if(!y.existsSync(i)){if(r===!1)throw Error(`Write task failed: file does not exist (${e.file})`);s(`File not found, creating new file: ${e.file}`,`info`)}let a=N(e);if(!a.isValid)throw a.error?.includes(`cannot have both`)?E.templateHasBothTemplateAndFile():E.templateMissingTemplateOrFile();let o=await P(e,t,n),c=v.dirname(i);y.existsSync(c)||y.mkdirSync(c,{recursive:!0}),await Bt(i,o)}const Ht={name:`write`,version:`1.0.0`,taskTypes:[`write`],execute:async(e,t,n)=>{n.dryRun||await Vt(e.config,t,e)}};function X(){W(`update-json`)||(H(zt),H(Ht),H(ut),H(Ot),H(Ft),H(ft),H(jt),H(gt),H(mt),H(wt),H(st),H(et),H(yt))}async function Ut(e,t,n=!1){if(X(),n){s(`[DRY RUN] Would execute: ${e.name}`,`info`);return}if(W(e.type)){await Ke(e,t,{dryRun:n});return}throw TypeError(`Unknown task type: ${e.type}`)}async function Z(e,t,n,r,i=!1){try{return s(`[${n}/${r}] Running: ${e.name}...`,`info`),await Ut(e,t,i),s(`[${n}/${r}] Completed: ${e.name}...`,`success`),!0}catch(t){return s(`Failed: ${e.name}`,`error`),t instanceof Error&&(s(` Reason: ${t.message}`,`error`),t.stack!=null&&b.env.DEBUG!=null&&console.error(t.stack)),(e.required??!0)&&s(` This is a required task. Initialization cannot continue.`,`error`),!1}}function Wt(e){let t=[],r=new Set,i=new Set,a=new Map(e.map(e=>[e.id,e]));function o(e){if(r.has(e))return;if(i.has(e))throw n.forTaskDependency(e);i.add(e);let s=a.get(e);if(!s)throw ae.forId(e);if(s.dependencies)for(let e of s.dependencies)o(e);i.delete(e),r.add(e),t.push(s)}for(let t of e)r.has(t.id)||o(t.id);return t}function Gt(e){let t=[];for(let n of e)if(!W(n.type))t.push(`Task "${n.id}" (${n.name}): Unknown task type "${n.type}"`);else if(n.type===`write`){let e=Kt(n);t.push(...e)}return t}function Kt(e){let t=[],n=e.config,r=typeof n.template==`string`?n.template:void 0,i=typeof n.templateFile==`string`?n.templateFile:void 0,a=N({...r!==void 0&&{template:r},...i!==void 0&&{templateFile:i}});return!a.isValid&&a.error!=null&&a.error!==``&&t.push(`Task "${e.id}" (${e.name}): ${a.error}`),(n.file==null||n.file===``)&&t.push(`Task "${e.id}" (${e.name}): Write task requires "file" property to specify the output file path`),t}function qt(e){s(`❌ Template validation failed:`,`error`),s(``,`error`);for(let t of e)s(` • ${t}`,`error`);s(``,`error`),s(`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 Jt(e,t,n){if(e==null)return;if(typeof e!=`object`||!e||Array.isArray(e))return e;let r=e;if(r.type===`conditional`){if(!n){s(`Variable "${t}": conditional value requires context but none provided`,`warn`);return}if(typeof r.condition!=`string`){s(`Variable "${t}": conditional value must have a string condition`,`error`);return}try{let{evaluateCondition:e,interpolateTemplate:t}=await import(`./utils-ChEwzXBK.js`),i=e(r.condition,n)?r.ifTrue:r.ifFalse;return typeof i==`string`&&/\{\{\w+\}\}/u.test(i)&&(i=t(i,n)),i}catch(e){s(`Variable "${t}": failed to evaluate conditional value: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}if(r.type===`exec`){let e=r.value;if(typeof e!=`string`){s(`Variable "${t}": exec value must have a string command`,`error`);return}try{let t=S(e,{encoding:`utf-8`,stdio:[`pipe`,`pipe`,`pipe`],timeout:1e4}).trim();if(t.startsWith(`{`)||t.startsWith(`[`))try{return JSON.parse(t)}catch{return t}if(/^-?\d+(?:\.\d+)?$/u.test(t)){let e=Number.parseFloat(t);if(!Number.isNaN(e))return e}return t===`true`||t===`false`?t===`true`:t}catch(e){s(`Variable "${t}": failed to execute command: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}else if(r.type===`static`)return r.value;return e}async function $(e,t,n){let r=new Map;for(let i of e){if(n?.skipConditional===!0&&typeof i.value==`object`&&i.value!==null&&!Array.isArray(i.value)&&i.value.type===`conditional`)continue;if(i.$templateEnabled!=null){let e={...t};for(let[t,n]of r.entries())e[t]=n;if(!await c(i.$templateEnabled,e))continue}let e={...t};for(let[t,n]of r.entries())e[t]=n;let a=await Jt(i.value,i.id,e);a!==void 0&&r.set(i.id,a)}return r}function Yt(e){let t=[],n=new Set;for(let r of e)n.has(r.id)&&t.push(`Duplicate variable ID: "${r.id}"`),n.add(r.id);return t}async function Xt(t,n){let a=e();if(!await c(n.templateEnabled,a,{lazy:!0})){i(`⊘ Template is disabled - skipping all execution`);return}m(`Registering built-in plugins...`),X(),m(`Validating task configurations...`);let o=Gt(t);o.length>0&&(qt(o),b.exit(1)),m(`All tasks validated successfully`);let d=t.filter(t=>r(t.enabled,e(),{lazy:!0}));m(`Resolving task dependencies...`);let f=Wt(d);m(`Sorted ${f.length} task(s) by dependencies`),i(`Welcome! Let's execute your tasks.`),n.dryRun&&l(`🔍 DRY RUN MODE - No changes will be made`),i(`This will execute your project tasks based on the defined configuration.`);let p=a,h=[...n.globalVariables??[]];if(h.length>0){let e=Yt(h);e.length>0&&(s(`❌ Variable validation errors:`,`error`),e.forEach(e=>s(` - ${e}`,`error`)),b.exit(1)),m(`Resolving variable values...`);let t=Q(h,await $(h,p,{skipConditional:!0}));Object.assign(p,t),Object.keys(t).length>0&&m(`Resolved ${Object.keys(t).length} variable(s)`)}let g=n.globalPrompts??[],_=[...g];if(_.length>0){let e=Y(_);e.length>0&&(s(`❌ Prompt validation errors:`,`error`),e.forEach(e=>s(` - ${e}`,`error`)),b.exit(1)),m(`Resolving prompt default values...`);let t=await J(_);if(g.length>0){i(`📋 Collecting prompts (available to all tasks):`);let e=await q(g,t,p);Object.assign(p,e)}}if(h.length>0){let e=h.filter(e=>typeof e.value==`object`&&e.value!==null&&!Array.isArray(e.value)?e.value.type===`conditional`:!1);if(e.length>0){m(`Re-resolving conditional variables with prompt values...`);let t=Q(e,await $(e,p));Object.assign(p,t),Object.keys(t).length>0&&m(`Resolved ${Object.keys(t).length} conditional variable(s)`)}}if(!await c(n.templateEnabled,p)){i(`⊘ Template is disabled after variable resolution - skipping all execution`);return}let v=[];for(let e of f)e.$templateEnabled!=null&&!await c(e.$templateEnabled,p)||await c(e.enabled,p)&&v.push(e);if(s(`${v.length} of ${f.length} task(s) enabled for execution`,`info`),n.dryRun){await R(v,p),i(`🔍 Dry run completed - no changes were made`),i(`Run without --dry-run to apply changes`);return}m(`Calling beforeAll hook...`),await G(`beforeAll`,p);let y=v.length,x=0,S=0,ee=[];for(let e=0;e<v.length;e++){let t=v[e];if(t!=null)if(m(`Calling beforeTask hook for task: ${t.name}`),await G(`beforeTask`,t,p),await Z(t,p,e+1,y,n.dryRun))x++,ee.push(t.id),m(`Calling afterTask hook for task: ${t.name}`),await G(`afterTask`,t,p);else if(t.required??!0){S++,m(`Calling onError hook for task: ${t.name}`),await G(`onError`,Error(`Task ${t.name} failed`),t);break}else l(`⚠️ Non-critical task failed, continuing...`),m(`Calling onError hook for task: ${t.name}`),await G(`onError`,Error(`Task ${t.name} failed`),t)}S>0&&(s(`Task execution failed with ${S} critical error(s)`,`error`),s(`Completed: ${x}/${y} tasks`,`info`),b.exit(1)),m(`Calling afterAll hook...`),await G(`afterAll`,p),u(`✅ All tasks completed successfully!`),u(` Completed: ${x}/${y} tasks`)}async function Zt(e,t,n={}){m(`Running templates with sequential variable/prompt resolution...`),m(`Total templates to process: ${e.length}`),m(`Registering built-in plugins...`),X();let r=[];console.log(``),i(`📋 Collecting input...`),console.log(``);for(let t=0;t<e.length;t++){let a=e[t];if(a==null)continue;let o=`=`.repeat(60);if(m(`\n${o}`),m(`Processing template ${t+1}/${e.length}: "${a.name}"`),m(o),m(`Current config keys: ${Object.keys(n).join(`, `)}`),!await c(a.enabled,n)){i(`⊘ Template "${a.name}" is disabled - skipping`),m(` Enabled condition: ${JSON.stringify(a.enabled)}`);continue}let l=a.variables??[];if(l.length>0){m(`Processing ${l.length} variable(s) for template "${a.name}"...`);let e=Yt(l);e.length>0&&(s(`❌ Variable validation errors:`,`error`),e.forEach(e=>s(` - ${e}`,`error`)),b.exit(1));let t=Q(l,await $(l,n,{skipConditional:!0}));Object.assign(n,t);let r=l.filter(e=>typeof e.value==`object`&&e.value!==null&&!Array.isArray(e.value)?e.value.type===`conditional`:!1),i=0;if(r.length>0){let e=Q(r,await $(r,n));if(i=Object.keys(e).length,Object.assign(n,e),i>0){m(`Resolved ${i} conditional variable(s)`);for(let[t,n]of Object.entries(e))m(` ${t} = ${JSON.stringify(n)}`)}}let o=Object.keys(t).length+i;o>0&&m(`Total variables resolved for template: ${o}`)}let u=a.prompts??[];if(u.length>0){m(`Processing ${u.length} prompt(s) for template "${a.name}"...`);let e=Y(u);e.length>0&&(s(`❌ Prompt validation errors:`,`error`),e.forEach(e=>s(` - ${e}`,`error`)),b.exit(1));let t=await q(u,await J(u),n);Object.assign(n,t),m(`Collected ${Object.keys(t).length} prompt answer(s)`)}if(!await c(a.enabled,n)){i(`⊘ Template "${a.name}" became disabled after variable/prompt resolution - skipping tasks`);continue}let d=a.tasks??[];d.length>0&&(m(`Found ${d.length} task(s) in template "${a.name}" (will execute later)`),r.push(...d))}if(m(`
|
|
24
|
-
🔧 Validating and filtering all collected tasks...`),r.length===0){s(`No tasks found in any template`,`info`);return}let a=Gt(r);a.length>0&&(qt(a),b.exit(1)),console.log(``),s(`🛠️ Preparing tasks...`,`info`);let o=[];for(let e of r)await c(e.enabled,n)&&o.push(e);if(console.log(``),s(`Found ${r.length} tasks (${o.length} enabled)`,`info`),s(`All tasks validated successfully`,`success`),o.length===0){s(`No enabled tasks to execute`,`info`);return}let l=Wt(o);if(t.dryRun){s(`
|
|
25
|
-
🔍 Dry run - showing task changes...`,`info`),await R(l,n),s(`
|
|
26
|
-
🔍 Dry run completed - no changes were made`,`info`),s(`Run without --dry-run to apply changes`,`info`);return}console.log(``),i(`⚙️ Executing tasks...`),console.log(``),await G(`beforeAll`,n);let u=0,d=0;for(let e=0;e<l.length;e++){let r=l[e];if(r!=null)if(await G(`beforeTask`,r,n),await Z(r,n,e+1,l.length,t.dryRun))u++,await G(`afterTask`,r,n);else if(r.required??!0){d++,await G(`onError`,Error(`Task ${r.name} failed`),r),s(`❌ Critical task failed: ${r.name}`,`error`);break}else s(`⚠️ Non-critical task failed: ${r.name}, continuing...`,`warn`),await G(`onError`,Error(`Task ${r.name} failed`),r)}await G(`afterAll`,n),d>0&&(s(`\nTask execution failed with ${d} critical error(s)`,`error`),s(`Completed: ${u}/${l.length} tasks`,`info`),b.exit(1)),s(`Completed: ${u}/${l.length} tasks`,`success`)}export{Me as A,j as B,Ue as C,Je as D,Ve as E,je as F,Se as G,P as H,Be as I,fe as J,me as K,De as L,Pe as M,Ae as N,R as O,Ne as P,Oe as R,W as S,H as T,we as U,M as V,N as W,ve as X,A as Y,Ye as _,Jt as a,U as b,Ut as c,Y as d,J as f,We as g,G as h,$ as i,Fe as j,ke as k,X as l,K as m,Zt as n,Q as o,q as p,Ce as q,Yt as r,Wt as s,Xt as t,Z as u,Ke as v,Ge as w,qe as x,He as y,Te as z};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import"./config-DfRbCqsT.js";import"./utils-C3bHtTZl.js";import{n as e,t}from"./run-tasks-Bd4i-Mm3.js";export{t as runTasks,e as runTemplatesSequentially};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
require(`./utils-BeqQVvh1.cjs`),require(`./config-DlJs75hK.cjs`);const e=require(`./run-tasks-UXAiO1rZ.cjs`);exports.runTasks=e.t,exports.runTemplatesSequentially=e.n;
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
const e=require(`./utils-BeqQVvh1.cjs`),t=require(`./config-DlJs75hK.cjs`);let n=require(`node:fs`);n=e.S(n);let r=require(`node:path`);r=e.S(r);let i=require(`node:process`);i=e.S(i);let a=require(`node:util`);a=e.S(a);let o=require(`node:child_process`);o=e.S(o);let s=require(`@inquirer/prompts`);s=e.S(s);var c=class t extends e.x{constructor(e,t,n,r){super(e,`DUPLICATE_ID`),this.id=t,this.type=n,this.existingType=r,this.name=`DuplicateIdError`}static forId(e,n,r){return new t(`Duplicate ID "${e}" found in ${n}. This ID is already used in ${r??`unknown`}`,e,n,r)}},l=class t extends e.x{constructor(e,t,n,r,i){super(e,`ID_CONFLICT`),this.id=t,this.type=n,this.baseSource=r,this.overrideSource=i,this.name=`IdConflictError`}static forTask(e,n,r){return new t(`Task ID conflict: "${e}" is defined in multiple templates.\n Base task from: ${n??`unknown`}\n Override task from: ${r??`unknown`}\n You must specify an override strategy: add "override": "merge" or "override": "replace" to the task.\n Task is being extended/overridden but no override strategy was specified.`,e,`task`,n,r)}static forVariable(e){return new t(`Variable ID conflict: "${e}" is defined in multiple templates.\n You must specify an override strategy: add "override": "merge" or "override": "replace" to the variable.\n Variable is being extended/overridden but no override strategy was specified.`,e,`variable`)}static forPrompt(e){return new t(`Prompt ID conflict: "${e}" is defined in multiple templates.\n You must specify an override strategy: add "override": "merge" or "override": "replace" to the prompt.\n Prompt is being extended/overridden but no override strategy was specified.`,e,`prompt`)}},u=class t extends e.x{constructor(e,t){super(e,`TASK_NOT_FOUND`),this.taskId=t,this.name=`TaskNotFoundError`}static forId(e){return new t(`Task not found: ${e}`,e)}},d=class t extends e.x{constructor(e,t,n){super(e,`PROMPT_VALIDATION_ERROR`),this.promptId=t,this.reason=n,this.name=`PromptValidationError`}static required(e){return new t(`Prompt "${e}" is required`,e,`required`)}static unknownType(e){return new t(`Unknown prompt type: ${e}`,e,`unknown_type`)}},f=class t extends e.x{constructor(e,t,n){super(e,`PLUGIN_CONFIGURATION_ERROR`),this.pluginType=t,this.configIssue=n,this.name=`PluginConfigurationError`}static templateMissingTemplateOrFile(){return new t(`Template task requires either "template" (inline) or "templateFile" (file path) to be specified`,`template`,`missing_template_or_file`)}static templateHasBothTemplateAndFile(){return new t(`Template task cannot have both "template" and "templateFile" specified. Use one or the other.`,`template`,`both_template_and_file`)}static createMissingTemplateOrFile(){return new t(`Create task requires either "template" (inline) or "templateFile" (file path) to be specified`,`create`,`missing_template_or_file`)}static createHasBothTemplateAndFile(){return new t(`Create task cannot have both "template" and "templateFile" specified. Use one or the other.`,`create`,`both_template_and_file`)}};const p=(0,a.promisify)(n.default.readFile);function m(t){let n=new Map;for(let e of t){let t=n.get(e.name)||[];t.push(e),n.set(e.name,t)}if(Array.from(n.values()).some(e=>e.length>1))return t;let r=[],i=new Set,a=new Set,o=new Map;for(let e of t)o.set(e.name,e);function s(t){if(i.has(t))return;if(a.has(t))throw e.b.forTemplateDependencies(Array.from(a),t);a.add(t);let n=o.get(t);if(n!=null&&n.dependencies!=null&&n.dependencies.length>0)for(let e of n.dependencies)s(e);a.delete(t),i.add(t),n!=null&&r.push(n)}for(let e of t)s(e.name);return r}const h={template:[[`template`,`templateFile`]]};function g(e){if(e==null||e===``)return`current template`;if(_(e))return e;let t=i.default.cwd();return e.startsWith(t)?r.default.relative(t,e):e}function _(e){try{let t=new URL(e);return t.protocol===`http:`||t.protocol===`https:`}catch{return!1}}function ee(t,n){if(_(t))return t;if(n==null||n===``)return r.default.isAbsolute(t)?t:r.default.resolve(i.default.cwd(),t);if(_(n))try{let e=new URL(`.`,n);return new URL(t,e).href}catch{throw e.y.forRemoteTemplate(t,n)}let a=r.default.dirname(n);return r.default.isAbsolute(t)?t:r.default.resolve(a,t)}async function te(t){if(_(t))return ne(t);if(!n.default.existsSync(t))throw e._.forPath(t);return p(t,`utf-8`)}async function ne(t){try{let n=await fetch(t);if(!n.ok)throw e.g.forUrl(t,n.status,n.statusText);return await n.text()}catch(n){throw n instanceof Error&&n.message.includes(`Failed to fetch`)?n:e.g.forUrl(t,n instanceof Error?n:void 0)}}const v=new Map;async function re(t,a=new Set){let o=_(t),s;if(s=o||r.default.isAbsolute(t)?t:r.default.resolve(i.default.cwd(),t),v.has(s))return v.get(s);if(a.has(s))throw e.b.forTemplateInheritance(a,s);a.add(s);let c;if(o)c=await ne(s);else{if(!n.default.existsSync(s))throw e._.forPath(s);c=await p(s,`utf-8`)}let l;try{l=JSON.parse(c)}catch(t){throw e.v.forFile(s,t instanceof Error?t:Error(String(t)))}if(l.name==null||l.name.trim()===``)throw e.h.missingName(s);if(!/^[a-z\d]+(?:-[a-z\d]+)*$/u.test(l.name))throw e.h.invalidNameFormat(s,l.name);if(l.tasks!==void 0&&!Array.isArray(l.tasks))throw e.h.tasksNotArray(s);l.tasks===void 0&&(l.tasks=[]);for(let e of l.tasks)e.$sourceUrl=s;return v.set(s,l),l}async function ie(t,n,a,o,s){let c=_(t),l;if(l=c||r.default.isAbsolute(t)?t:n==null?r.default.resolve(i.default.cwd(),t):_(n)?new URL(t,n).href:r.default.resolve(n,t),a.has(l))return;if(o.has(l))throw e.b.forTemplateInheritance(o,l);o.add(l);let u=await re(l),d=_(l)?new URL(`.`,l).href:r.default.dirname(l);if(u.extends!=null&&u.extends!==``){let e=Array.isArray(u.extends)?u.extends:[u.extends];for(let t of e)await ie(t,d,a,o,s)}o.delete(l),a.add(l),s.push(u)}async function y(e,t,n=new Set){let r=[];return await ie(e,t,n,new Set,r),m(r)}async function ae(e,t,n=new Set){return le(await y(e,t,n))}function oe(e,t,n){let r=new Map;for(let t of e){if(r.has(t.id))throw c.forId(t.id,`task`,r.get(t.id));r.set(t.id,`task`)}if(t!=null)for(let e of t){if(r.has(e.id))throw c.forId(e.id,`variable`,r.get(e.id));r.set(e.id,`variable`)}if(n!=null)for(let e of n){if(r.has(e.id))throw c.forId(e.id,`prompt`,r.get(e.id));r.set(e.id,`prompt`)}}function se(t,n){if((n.override??`merge`)===`replace`){e.i(` → Variable "${n.id}" using 'replace' strategy`,`info`);let{override:t,...r}=n;return r}e.i(` → Variable "${n.id}" merged (value replaced)`,`info`);let r={...t,...n};return delete r.override,r}function ce(t,n){if((n.override??`merge`)===`replace`){e.i(` → Prompt "${n.id}" using 'replace' strategy`,`info`);let{override:t,...r}=n;return r}e.i(` → Prompt "${n.id}" merged`,`info`);let r={...t,...n};return delete r.override,r}function le(t){if(t.length===0)return{name:`Empty Template`,tasks:[]};if(t.length===1){let e=t[0];return oe(e.tasks??[],e.variables,e.prompts),e}let n=new Map,r=new Map,i=new Map,a={};for(let o of t){if(o.enabled!=null&&(a[o.name]=o.enabled),o.enabled===!1){e.i(`⊘ Skipping disabled template "${o.name}" - its tasks, prompts, and variables will not be included`,`info`);continue}if(o.prompts!=null)for(let e of o.prompts)if(i.has(e.id)){if(e.override==null)throw l.forPrompt(e.id);let t=ce(i.get(e.id),e);o.enabled!=null&&(t.$templateEnabled=o.enabled),i.set(e.id,t)}else{let t={...e};o.enabled!=null&&(t.$templateEnabled=o.enabled),i.set(e.id,t)}if(o.variables!=null)for(let e of o.variables)if(r.has(e.id)){if(e.override==null)throw l.forVariable(e.id);let t=se(r.get(e.id),e);o.enabled!=null&&(t.$templateEnabled=o.enabled),r.set(e.id,t)}else{let t={...e};o.enabled!=null&&(t.$templateEnabled=o.enabled),r.set(e.id,t)}for(let e of o.tasks??[])if(n.has(e.id)){if(e.override==null){let t=n.get(e.id);throw l.forTask(e.id,g(t.$sourceUrl),g(e.$sourceUrl))}let t=fe(n.get(e.id),e);o.enabled!=null&&(t.$templateEnabled=o.enabled),n.set(e.id,t)}else{let t={...e};o.enabled!=null&&(t.$templateEnabled=o.enabled),n.set(e.id,t)}}let o=Array.from(n.values()),s=i.size>0?Array.from(i.values()):void 0,c=r.size>0?Array.from(r.values()):void 0;oe(o,c,s);let u=t[t.length-1],d={name:u.name,tasks:o};return u.description!=null&&(d.description=u.description),u.dependencies!=null&&(d.dependencies=u.dependencies),u.enabled!=null&&(d.enabled=u.enabled),s!=null&&(d.prompts=s),c!=null&&(d.variables=c),d}function ue(e,t){let n=h[e];if(!n)return null;for(let e of n){let n=e.filter(e=>e in t&&t[e]!=null);if(n.length>1)return n}return null}function de(e,t,n){let r={...e},i=h[n]??[];for(let[e,n]of Object.entries(t)){for(let t of i)if(t.includes(e)){for(let n of t)n!==e&&delete r[n];break}r[e]=n}return r}function fe(t,n){if((n.override??`merge`)===`replace`){e.i(` → Task "${n.id}" using 'replace' strategy - completely replacing base task`,`info`),e.i(` Base: ${g(t.$sourceUrl)}`,`info`),e.i(` Override: ${g(n.$sourceUrl)}`,`info`);let{override:r,...i}=n;return i}e.i(` → Merging task "${n.id}"`,`info`),e.i(` Base: ${g(t.$sourceUrl)}`,`info`),e.i(` Override: ${g(n.$sourceUrl)}`,`info`);let r;if(typeof t.config==`object`&&t.config!==null&&typeof n.config==`object`&&n.config!==null){r=de(t.config,n.config,n.type);let i=ue(n.type,r);i!==null&&i.length>0&&(e.i(` ⚠️ Warning: Conflicting config fields detected: ${i.join(`, `)}`,`warn`),e.i(` Please use override: "replace" or specify only one of these fields`,`warn`))}else r=n.config??t.config;let i=[...t.dependencies??[],...n.dependencies??[]],a=i.length>0?[...new Set(i)]:void 0,o=n.$sourceUrl??t.$sourceUrl,s={...t,...n,config:r,...a!=null&&{dependencies:a},...o!=null&&{$sourceUrl:o}};return delete s.override,s}function pe(){v.clear()}async function me(t,n){if(e.u(`Loading tasks from ${t}...`),n?.sequential===!0){let n=await y(t);return e.u(`Loaded ${n.length} template(s) for processing`),{tasks:[],templates:n}}let r=await ae(t);e.i(`Loaded ${r.tasks?.length??0} task(s)`,`info`),r.extends!=null&&r.extends!==``&&e.i(`Extended from: ${(Array.isArray(r.extends)?r.extends:[r.extends]).join(`, `)}`,`info`),r.prompts!=null&&r.prompts.length>0&&e.i(`Found ${r.prompts.length} top-level prompt(s)`,`info`),r.variables!=null&&r.variables.length>0&&e.i(`Found ${r.variables.length} top-level variable(s)`,`info`);let i={tasks:r.tasks??[]};return r.prompts!=null&&(i.prompts=r.prompts),r.variables!=null&&(i.variables=r.variables),r.enabled!=null&&(i.enabled=r.enabled),i}function b(e){return e.template!=null&&e.template!==``}function x(e){return e.templateFile!=null&&e.templateFile!==``}function S(e){return e.endsWith(`.hbs`)}function C(e){let t=b(e),n=x(e);return!t&&!n?{isValid:!1,hasInlineTemplate:t,hasTemplateFile:n,error:`Template configuration requires either "template" (inline) or "templateFile" (file path) to be specified`}:t&&n?{isValid:!1,hasInlineTemplate:t,hasTemplateFile:n,error:`Template configuration cannot have both "template" and "templateFile" specified. Use one or the other.`}:{isValid:!0,hasInlineTemplate:t,hasTemplateFile:n}}async function w(t,n,r,i={}){let{enableHandlebars:a=!0,sourceUrl:o=r?.$sourceUrl}=i,s=b(t),c=x(t);if(s)return e.r(t.template,n);if(c){let r=t.templateFile,i=a&&S(r),s=await te(ee(r,o));return i?(await import(`handlebars`)).default.compile(s)(n):e.r(s,n)}throw Error(`No template content available`)}function he(e){return b(e)?`inline template`:x(e)?`template file: ${e.templateFile}`:`no template source`}const T=(0,a.promisify)(n.default.readFile),ge=2,_e=10,ve=55,E={reset:`\x1B[0m`,red:`\x1B[31m`,green:`\x1B[32m`,yellow:`\x1B[33m`,blue:`\x1B[34m`,cyan:`\x1B[36m`,gray:`\x1B[90m`};function D(e,t){switch(t){case`add`:return`${E.green}+ ${e}${E.reset}`;case`remove`:return`${E.red}- ${e}${E.reset}`;case`context`:return`${E.gray} ${e}${E.reset}`;default:return e}}function O(e,t){let n=e.split(`
|
|
2
|
-
`),r=t.split(`
|
|
3
|
-
`),i=[],a=Math.max(n.length,r.length);for(let e=0;e<a;e++){let t=n[e],a=r[e];t===a?t!==void 0&&i.push(D(t,`context`)):(t!==void 0&&i.push(D(t,`remove`)),a!==void 0&&i.push(D(a,`add`)))}return i}async function k(t,a){if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,a))return`${E.yellow}⊘ Condition not met - task would be skipped${E.reset}`;let o=r.default.join(i.default.cwd(),t.file);if(!n.default.existsSync(o))return`${E.red}✗ File not found: ${t.file}${E.reset}`;try{let n=await T(o,`utf-8`),r=JSON.parse(n),i={...r};function s(t){if(typeof t==`string`)return e.r(t,a);if(Array.isArray(t))return t.map(e=>s(e));if(typeof t==`object`&&t){let e={};for(let[n,r]of Object.entries(t))e[n]=s(r);return e}return t}for(let[n,i]of Object.entries(t.updates)){let t=s(i);n.includes(`.`)?e.s(r,n,t):r[n]=t}let c=JSON.stringify(i,null,2),l=JSON.stringify(r,null,2);if(c===l)return`${E.cyan}→ No changes${E.reset}`;let u=O(c,l);return`${E.blue}File: ${t.file}${E.reset}\n${u.join(`
|
|
4
|
-
`)}`}catch(e){return`${E.red}✗ Error: ${e instanceof Error?e.message:String(e)}${E.reset}`}}async function A(t,a){if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,a))return`${E.yellow}⊘ Condition not met - task would be skipped${E.reset}`;if(t.template==null||t.template===``)return`${E.red}✗ No template content provided for file: ${t.file}${E.reset}`;let o=r.default.join(i.default.cwd(),t.file),s=e.r(t.template,a);if(!n.default.existsSync(o)){let e=s.split(`
|
|
5
|
-
`).slice(0,10).join(`
|
|
6
|
-
`),n=s.split(`
|
|
7
|
-
`).length>10;return`${E.blue}File: ${t.file}${E.reset}\n${E.green}+ New file would be created${E.reset}\n${E.gray}Content preview:${E.reset}\n${e}${n?`
|
|
8
|
-
...`:``}`}try{let e=await T(o,`utf-8`);if(e===s)return`${E.cyan}→ No changes${E.reset}`;let n=O(e,s);return`${E.blue}File: ${t.file}${E.reset}\n${n.join(`
|
|
9
|
-
`)}`}catch(e){return`${E.red}✗ Error: ${e instanceof Error?e.message:String(e)}${E.reset}`}}async function j(t,a,o){if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,a))return`${E.yellow}⊘ Condition not met - task would be skipped${E.reset}`;let s=r.default.join(i.default.cwd(),t.file);if(n.default.existsSync(s))return`${E.cyan}→ File already exists, would be skipped: ${t.file}${E.reset}`;try{if(b(t)){let e=await w(t,a,o),n=e.split(`
|
|
10
|
-
`).slice(0,10).join(`
|
|
11
|
-
`),r=e.split(`
|
|
12
|
-
`).length>10;return`${E.blue}File: ${t.file}${E.reset}\n${E.green}+ New file would be created${E.reset}\n${E.gray}Content preview:${E.reset}\n${n}${r?`
|
|
13
|
-
...`:``}`}let e=he(t);return`${E.blue}File: ${t.file}${E.reset}\n${E.green}+ New file would be created from ${e}${E.reset}`}catch(e){return`${E.red}✗ Error: ${e instanceof Error?e.message:String(e)}${E.reset}`}}async function M(t,a){if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,a))return`${E.yellow}⊘ Condition not met - task would be skipped${E.reset}`;let o=r.default.join(i.default.cwd(),t.file);if(!n.default.existsSync(o))return`${E.red}✗ File not found: ${t.file}${E.reset}`;try{let n=await T(o,`utf-8`),r=new RegExp(t.pattern,t.flags??`g`),i=e.r(t.replacement,a),s=n.replace(r,i);if(n===s)return`${E.cyan}→ No matches found${E.reset}`;let c=O(n,s);return`${E.blue}File: ${t.file}${E.reset}\n${c.join(`
|
|
14
|
-
`)}`}catch(e){return`${E.red}✗ Error: ${e instanceof Error?e.message:String(e)}${E.reset}`}}async function N(t,a){if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,a))return`${E.yellow}⊘ Condition not met - task would be skipped${E.reset}`;let o=r.default.join(i.default.cwd(),t.file);if(!n.default.existsSync(o))return`${E.red}✗ File not found: ${t.file}${E.reset}`;try{let n=await T(o,`utf-8`),r=n;for(let{find:r,replace:i}of t.replacements){let t=e.r(r,a),o=e.r(i,a);n=n.replace(t,o)}if(r===n)return`${E.cyan}→ No changes${E.reset}`;let i=O(r,n);return`${E.blue}File: ${t.file}${E.reset}\n${i.join(`
|
|
15
|
-
`)}`}catch(e){return`${E.red}✗ Error: ${e instanceof Error?e.message:String(e)}${E.reset}`}}function P(t,a){if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,a))return`${E.yellow}⊘ Condition not met - task would be skipped${E.reset}`;let o=t.paths.map(t=>e.r(t,a)).filter(e=>n.default.existsSync(r.default.join(i.default.cwd(),e)));return o.length===0?`${E.cyan}→ No files/directories to delete${E.reset}`:`${E.red}Would delete:${E.reset}\n${o.map(e=>`${E.red} - ${e}${E.reset}`).join(`
|
|
16
|
-
`)}`}function F(t,a){if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,a))return`${E.yellow}⊘ Condition not met - task would be skipped${E.reset}`;let o=e.r(t.from,a),s=e.r(t.to,a),c=r.default.join(i.default.cwd(),o),l=r.default.join(i.default.cwd(),s);return n.default.existsSync(c)?n.default.existsSync(l)?`${E.yellow}⚠ Destination already exists: ${s}${E.reset}\n${E.cyan}Would rename: ${o} → ${s}${E.reset}`:`${E.cyan}Would rename: ${o} → ${s}${E.reset}`:`${E.red}✗ Source not found: ${o}${E.reset}`}function ye(e){if(e.condition!=null&&e.condition!==``)return`${E.yellow}⊘ Condition check skipped in dry-run${E.reset}`;let t=r.default.join(i.default.cwd(),`.git`),a=n.default.existsSync(t),o=[];if(e.removeExisting&&a&&o.push(`${E.red}Would remove existing .git directory${E.reset}`),o.push(`${E.green}Would initialize git repository${E.reset}`),e.initialCommit){let t=e.message??`Initial commit`;o.push(`${E.green}Would create initial commit: "${t}"${E.reset}`)}return o.join(`
|
|
17
|
-
`)}function be(t,n){if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,n))return`${E.yellow}⊘ Condition not met - task would be skipped${E.reset}`;let r=e.r(t.command,n),a=t.cwd==null?i.default.cwd():e.r(t.cwd,n);return`${E.yellow}Would execute:${E.reset}\n${E.cyan} Command: ${r}${E.reset}\n${E.cyan} Working directory: ${a}${E.reset}`}function xe(t,a){if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,a))return`${E.yellow}⊘ Condition not met - task would be skipped${E.reset}`;let o=e.r(t.from,a),s=e.r(t.to,a),c=r.default.join(i.default.cwd(),o),l=r.default.join(i.default.cwd(),s);return n.default.existsSync(c)?n.default.existsSync(l)?`${E.yellow}⚠ Destination already exists: ${s}${E.reset}\n${E.cyan}Would move: ${o} → ${s}${E.reset}`:`${E.cyan}Would move: ${o} → ${s}${E.reset}`:`${E.red}✗ Source not found: ${o}${E.reset}`}function Se(t,a){if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,a))return`${E.yellow}⊘ Condition not met - task would be skipped${E.reset}`;let o=e.r(t.from,a),s=e.r(t.to,a),c=r.default.join(i.default.cwd(),o),l=r.default.join(i.default.cwd(),s);if(!n.default.existsSync(c))return`${E.red}✗ Source not found: ${o}${E.reset}`;let u=n.default.statSync(c).isDirectory()?`directory`:`file`;return n.default.existsSync(l)?`${E.yellow}⚠ Destination already exists: ${s}${E.reset}\n${E.cyan}Would copy ${u}: ${o} → ${s}${E.reset}`:`${E.cyan}Would copy ${u}: ${o} → ${s}${E.reset}`}async function Ce(t,a,o){if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,a))return`${E.yellow}⊘ Condition not met - task would be skipped${E.reset}`;let s=r.default.join(i.default.cwd(),t.file),c={};t.content==null?t.template!=null&&(c.template=t.template):c.template=t.content,t.templateFile!=null&&(c.templateFile=t.templateFile);try{let e=await w(c,a,o),r=e.split(`
|
|
18
|
-
`).slice(0,10).join(`
|
|
19
|
-
`),i=e.split(`
|
|
20
|
-
`).length>10;return n.default.existsSync(s)?`${E.blue}File: ${t.file}${E.reset}\n${E.green}+ Would append content${E.reset}\n${E.gray}Content preview:${E.reset}\n${r}${i?`
|
|
21
|
-
...`:``}`:`${E.blue}File: ${t.file}${E.reset}\n${E.green}+ New file would be created with content${E.reset}\n${E.gray}Content preview:${E.reset}\n${r}${i?`
|
|
22
|
-
...`:``}`}catch(e){return`${E.red}✗ Error: ${e instanceof Error?e.message:String(e)}${E.reset}`}}function we(t,a){if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,a))return`${E.yellow}⊘ Condition not met - task would be skipped${E.reset}`;let o=e.r(t.path,a),s=r.default.join(i.default.cwd(),o);return n.default.existsSync(s)?`${E.cyan}→ Directory already exists: ${o}${E.reset}`:`${E.green}+ Would create directory: ${o}${E.reset}`}async function Te(e,t){try{switch(e.type){case`update-json`:return await k(e.config,t);case`write`:return await A(e.config,t);case`create`:return await j(e.config,t,e);case`regex-replace`:return await M(e.config,t);case`replace-in-file`:return await N(e.config,t);case`delete`:return P(e.config,t);case`rename`:return F(e.config,t);case`move`:return xe(e.config,t);case`copy`:return Se(e.config,t);case`append`:return await Ce(e.config,t,e);case`mkdir`:return we(e.config,t);case`git-init`:return ye(e.config);case`exec`:return be(e.config,t);default:{let t=e.type;return`${E.yellow}⚠ Diff not available for task type: ${t}${E.reset}`}}}catch(e){return`${E.red}✗ Error generating diff: ${e instanceof Error?e.message:String(e)}${E.reset}`}}async function I(e,t){console.log(`${E.blue}═══════════════════════════════════════════════════════${E.reset}`),console.log(`${E.blue} DRY RUN - Preview of changes${E.reset}`),console.log(`${E.blue}═══════════════════════════════════════════════════════${E.reset}`);for(let n of e){console.log(`${E.cyan}▶ Task: ${n.name}${E.reset}`),n.description!=null&&n.description!==``&&console.log(`${E.gray} ${n.description}${E.reset}`);let e=await Te(n,t);console.log(e),console.log(`${E.gray}${`─`.repeat(55)}${E.reset}`)}console.log(`${E.blue}═══════════════════════════════════════════════════════${E.reset}`),console.log(`${E.yellow} No changes were applied (dry-run mode)${E.reset}`),console.log(`${E.blue}═══════════════════════════════════════════════════════${E.reset}`)}const L=new Map,R={},z=new Map;function B(t){if(t.name==null||t.name===``)throw TypeError(`Plugin name is required`);if(!Array.isArray(t.taskTypes)||t.taskTypes.length===0)throw TypeError(`Plugin ${t.name} must define at least one task type`);if(typeof t.execute!=`function`)throw TypeError(`Plugin ${t.name} must provide an execute function`);if(L.has(t.name))throw TypeError(`Plugin ${t.name} is already registered`);for(let e of t.taskTypes)if(z.has(e)){let t=z.get(e);throw TypeError(`Task type "${e}" is already registered by plugin "${t}"`)}L.set(t.name,t);for(let e of t.taskTypes)z.set(e,t.name);e.u(`Registered plugin: ${t.name}${t.version==null?``:` v${t.version}`}`)}function Ee(e){let t=L.get(e);if(t!=null){for(let e of t.taskTypes)z.delete(e);L.delete(e)}}function De(e){return L.get(e)}function V(e){let t=z.get(e);if(t!=null)return L.get(t)}function H(e){return z.has(e)}function Oe(){return Array.from(L.keys())}function ke(){L.clear(),z.clear()}function Ae(e){e.beforeAll!=null&&(R.beforeAll=e.beforeAll),e.afterAll!=null&&(R.afterAll=e.afterAll),e.beforeTask!=null&&(R.beforeTask=e.beforeTask),e.afterTask!=null&&(R.afterTask=e.afterTask),e.onError!=null&&(R.onError=e.onError)}async function U(t,...n){let r=R[t];if(r!=null)try{t===`beforeAll`||t===`afterAll`?await r(n[0]):(t===`beforeTask`||t===`afterTask`||t===`onError`)&&await r(n[0],n[1])}catch(n){e.i(`Error in ${t} hook: ${n instanceof Error?n.message:String(n)}`,`error`)}}async function je(e,t,n){let r=V(e.type);if(r==null)throw TypeError(`No plugin found for task type: ${e.type}`);await r.execute(e,t,n)}async function Me(e,t){let n=V(e.type);if(!(n==null||n.getDiff==null))return n.getDiff(e,t)}function Ne(e){let t=V(e.type);return t==null?[`No plugin found for task type: ${e.type}`]:t.validate==null?[]:t.validate(e)}function Pe(e,t,n,r){return{name:e,...r?.version!=null&&{version:r.version},taskTypes:[t],execute:n,...r?.getDiff!=null&&{getDiff:r.getDiff},...r?.validate!=null&&{validate:r.validate}}}async function W(t,n,r){if(t===void 0)return;if(typeof t!=`object`||!t||Array.isArray(t))return typeof t==`string`&&r&&/\{\{\w+\}\}/u.test(t)?e.r(t,r):t;let i=t;if(i.type===`conditional`){if(!r)return;if(typeof i.condition!=`string`){e.i(`Prompt "${n}": conditional default must have a string condition`,`error`);return}try{let{evaluateCondition:t}=await Promise.resolve().then(()=>require(`./utils-BGOPmydq.cjs`)),n=t(i.condition,r)?i.ifTrue:i.ifFalse;return typeof n==`string`&&/\{\{\w+\}\}/u.test(n)&&(n=e.r(n,r)),n}catch(t){e.i(`Prompt "${n}": failed to evaluate conditional default: ${t instanceof Error?t.message:`Unknown error`}`,`warn`);return}}if(i.type===`exec`){let t=i.value;if(typeof t!=`string`){e.i(`Prompt "${n}": exec default value must have a string command`,`error`);return}try{let e=(0,o.execSync)(t,{encoding:`utf-8`,stdio:[`pipe`,`pipe`,`pipe`],timeout:1e4}).trim();if(e.startsWith(`{`)||e.startsWith(`[`))try{return JSON.parse(e)}catch{return e}if(/^-?\d+(?:\.\d+)?$/u.test(e)){let t=Number.parseFloat(e);if(!Number.isNaN(t))return t}return e===`true`||e===`false`?e===`true`:e}catch(t){e.i(`Prompt "${n}": failed to execute default value command: ${t instanceof Error?t.message:`Unknown error`}`,`warn`);return}}else if(i.type===`static`)return i.value;else if(i.type!==void 0){e.i(`Prompt "${n}": unknown default value type "${i.type}". Expected "static", "exec", or "conditional".`,`error`);return}return t}async function G(t,n=new Map,r={}){let i={};if(t.length===0)return i;for(let a of t){if(a.$templateEnabled!=null&&!await e.l(a.$templateEnabled,{...r,...i}))continue;let t={...r,...i};if(await e.l(a.enabled,t))try{let r,o=n.get(a.id);switch(a.default!==void 0&&(o=await W(a.default,a.id,t)),a.type){case`input`:{let t={message:a.message};if(o!==void 0&&(t.default=String(o)),a.required!==void 0&&(t.required=a.required),r=await(0,s.input)(t),a.required&&(r==null||typeof r==`string`&&r.trim()===``))throw e.i(`${a.message} is required`,`error`),d.required(a.id);break}case`password`:if(r=await(0,s.password)({message:a.message,mask:`*`}),a.required&&(r==null||typeof r==`string`&&r.trim()===``))throw e.i(`${a.message} is required`,`error`),d.required(a.id);break;case`number`:{let t={message:a.message};if(o!==void 0&&(t.default=Number(o)),a.required!==void 0&&(t.required=a.required),a.min!==void 0&&(t.min=a.min),a.max!==void 0&&(t.max=a.max),r=await(0,s.number)(t),a.required&&r==null)throw e.i(`${a.message} is required`,`error`),d.required(a.id);break}case`select`:{let e={message:a.message,choices:a.choices.map(e=>({name:e.name,value:e.value}))};o!==void 0&&(e.default=o),r=await(0,s.select)(e);break}case`confirm`:{let e=o===void 0?!1:!!o;r=await(0,s.confirm)({message:a.message,default:e});break}default:throw e.i(`Unknown prompt type: ${a.type}`,`error`),d.unknownType(a.type)}i[a.id]=r}catch(t){throw t instanceof Error&&e.i(`Failed to collect prompt "${a.id}": ${t.message}`,`error`),t}}return i}async function K(e){let t=new Map,n=e.map(async e=>{if(e.default!==void 0){let n=await W(e.default,e.id);n!==void 0&&t.set(e.id,n)}});return await Promise.all(n),t}function q(e){let t=[],n=new Set;for(let r of e){if(n.has(r.id)&&t.push(`Duplicate prompt ID: ${r.id}`),n.add(r.id),/^[a-zA-Z_$][a-zA-Z0-9_$]*$/u.test(r.id)||t.push(`Invalid prompt ID "${r.id}": must be a valid JavaScript identifier (start with letter, underscore, or $, followed by letters, digits, underscores, or $)`),(!r.message||r.message.trim()===``)&&t.push(`Prompt "${r.id}" must have a non-empty message`),r.type===`select`){r.choices.length===0&&t.push(`Select prompt "${r.id}" must have at least one choice`);for(let e of r.choices)(!e.name||e.name.trim()===``)&&t.push(`Select prompt "${r.id}" has a choice with empty name`),e.value===void 0&&t.push(`Select prompt "${r.id}" has a choice with undefined value`)}r.type===`number`&&r.min!==void 0&&r.max!==void 0&&r.min>r.max&&t.push(`Number prompt "${r.id}" has min greater than max`)}return t}const Fe=(0,a.promisify)(n.default.appendFile),Ie=(0,a.promisify)(n.default.readFile),Le=(0,a.promisify)(n.default.stat);async function Re(t,n,a){if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,n)){e.i(`Condition not met, skipping append task`,`info`);return}let o=r.default.join(i.default.cwd(),t.file),s={};t.content==null?t.template!=null&&(s.template=t.template):s.template=t.content,t.templateFile!=null&&(s.templateFile=t.templateFile);let c=C(s);if(!c.isValid)throw c.error?.includes(`cannot have both`)?f.templateHasBothTemplateAndFile():f.templateMissingTemplateOrFile();let l=await w(s,n,a),u=!1,d=!1;try{await Le(o),u=!0;let e=await Ie(o,`utf-8`);e.length>0&&!e.endsWith(`
|
|
23
|
-
`)&&(d=t.newline!==!1)}catch{}u&&d?await Fe(o,`\n${l}`):await Fe(o,l),e.i(`Appended content to ${t.file}`,`success`)}const ze={name:`append`,version:`1.0.0`,taskTypes:[`append`],execute:async(e,t,n)=>{n.dryRun||await Re(e.config,t,e)}},Be=(0,a.promisify)(n.default.copyFile),Ve=(0,a.promisify)(n.default.stat),He=(0,a.promisify)(n.default.mkdir),Ue=(0,a.promisify)(n.default.readdir);async function We(e,t){await He(t,{recursive:!0});let n=await Ue(e,{withFileTypes:!0});await Promise.all(n.map(async n=>{let i=r.default.join(e,n.name),a=r.default.join(t,n.name);n.isDirectory()?await We(i,a):await Be(i,a)}))}async function Ge(t,n){if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,n)){e.i(`Condition not met, skipping copy task`,`info`);return}let a=r.default.join(i.default.cwd(),t.from),o=r.default.join(i.default.cwd(),t.to),s;try{s=await Ve(a)}catch{e.i(`Source path does not exist: ${a}`,`warn`);return}await He(r.default.dirname(o),{recursive:!0}),s.isDirectory()?(await We(a,o),e.i(`Copied directory ${t.from} to ${t.to}`,`success`)):(await Be(a,o),e.i(`Copied file ${t.from} to ${t.to}`,`success`))}const Ke={name:`copy`,version:`1.0.0`,taskTypes:[`copy`],execute:async(e,t,n)=>{n.dryRun||await Ge(e.config,t)}},qe=(0,a.promisify)(n.default.writeFile);async function Je(t,a,o){if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,a)){e.i(`Condition not met, skipping create task`,`info`);return}let s=r.default.join(i.default.cwd(),t.file);if(n.default.existsSync(s)){e.i(`File already exists, skipping: ${t.file}`,`info`);return}let c=C(t);if(!c.isValid)throw c.error?.includes(`cannot have both`)?f.createHasBothTemplateAndFile():f.createMissingTemplateOrFile();let l=await w(t,a,o),u=r.default.dirname(s);n.default.existsSync(u)||n.default.mkdirSync(u,{recursive:!0}),await qe(s,l),e.i(`Created file: ${t.file}`,`success`)}const Ye={name:`create`,version:`1.0.0`,taskTypes:[`create`],execute:async(e,t,n)=>{n.dryRun||await Je(e.config,t,e)}};async function Xe(t,a){let{paths:o,condition:s}=t;if(s!=null&&s!==``){if(!a){e.i(`Condition specified but no config provided, skipping deletion`,`warn`);return}if(!e.t(s,a)){e.i(`Condition not met, skipping deletion`,`info`);return}}for(let e of o){let t=r.default.join(i.default.cwd(),e);n.default.existsSync(t)&&n.default.rmSync(t,{recursive:!0,force:!0})}}const Ze={name:`delete`,version:`1.0.0`,taskTypes:[`delete`],execute:async(e,t,n)=>{n.dryRun||await Xe(e.config,t)}};async function Qe(t,n){if(t.condition!=null&&t.condition!==``){if(!n){e.i(`Condition specified but no config provided, skipping exec`,`warn`);return}if(!e.t(t.condition,n)){e.i(`Condition not met, skipping exec task`,`info`);return}}let a=t.cwd==null?i.default.cwd():r.default.join(i.default.cwd(),t.cwd);(0,o.execSync)(t.command,{cwd:a,stdio:`inherit`})}const $e={name:`exec`,version:`1.0.0`,taskTypes:[`exec`],execute:async(e,t,n)=>{n.dryRun||await Qe(e.config,t)}};async function et(t,a){if(t.condition!=null&&t.condition!==``){if(!a){e.i(`Condition specified but no config provided, skipping git-init`,`warn`);return}if(!e.t(t.condition,a)){e.i(`Condition not met, skipping git-init task`,`info`);return}}if(t.removeExisting){let e=r.default.join(i.default.cwd(),`.git`);n.default.existsSync(e)&&n.default.rmSync(e,{recursive:!0,force:!0})}if((0,o.execSync)(`git init`,{stdio:`inherit`}),t.initialCommit){let e=t.message??`Initial commit`;(0,o.execSync)(`git add .`,{stdio:`inherit`}),(0,o.execSync)(`git commit -m "${e}"`,{stdio:`inherit`})}}const tt={name:`git-init`,version:`1.0.0`,taskTypes:[`git-init`],execute:async(e,t,n)=>{n.dryRun||await et(e.config,t)}},nt=(0,a.promisify)(n.default.mkdir);async function rt(t,n){if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,n)){e.i(`Condition not met, skipping mkdir task`,`info`);return}await nt(r.default.join(i.default.cwd(),t.path),{recursive:!0}),e.i(`Created directory: ${t.path}`,`success`)}const it={name:`mkdir`,version:`1.0.0`,taskTypes:[`mkdir`],execute:async(e,t,n)=>{n.dryRun||await rt(e.config,t)}},at=(0,a.promisify)(n.default.rename),ot=(0,a.promisify)(n.default.stat),st=(0,a.promisify)(n.default.mkdir);async function ct(t,n){if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,n)){e.i(`Condition not met, skipping move task`,`info`);return}let a=r.default.join(i.default.cwd(),t.from),o=r.default.join(i.default.cwd(),t.to);try{await ot(a)}catch{e.i(`Source path does not exist: ${a}`,`warn`);return}await st(r.default.dirname(o),{recursive:!0}),await at(a,o),e.i(`Moved ${t.from} to ${t.to}`,`success`)}const lt={name:`move`,version:`1.0.0`,taskTypes:[`move`],execute:async(e,t,n)=>{n.dryRun||await ct(e.config,t)}},ut=(0,a.promisify)(n.default.readFile),dt=(0,a.promisify)(n.default.writeFile);async function ft(t,n){if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,n)){e.i(`Condition not met, skipping regex-replace task`,`info`);return}let a=r.default.join(i.default.cwd(),t.file),{pattern:o}=t,s=t.flags??``,c=t.replacement||``,l=await ut(a,`utf-8`),u=new RegExp(o,s);l=l.replace(u,e.r(c,n)),await dt(a,l)}const pt={name:`regex-replace`,version:`1.0.0`,taskTypes:[`regex-replace`],execute:async(e,t,n)=>{n.dryRun||await ft(e.config,t)}},mt=(0,a.promisify)(n.default.rename);async function ht(t,a){if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,a)){e.i(`Condition not met, skipping rename task`,`info`);return}let o=r.default.join(i.default.cwd(),e.r(t.from,a)),s=r.default.join(i.default.cwd(),e.r(t.to,a));if(!n.default.existsSync(o)){e.i(`Source path does not exist: ${o}`,`warn`);return}await mt(o,s)}const gt={name:`rename`,version:`1.0.0`,taskTypes:[`rename`],execute:async(e,t,n)=>{n.dryRun||await ht(e.config,t)}},_t=(0,a.promisify)(n.default.readFile),vt=(0,a.promisify)(n.default.writeFile);async function yt(t,a){if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,a)){e.i(`Condition not met, skipping replace-in-file task`,`info`);return}let o=r.default.join(i.default.cwd(),t.file),{replacements:s}=t;if(!n.default.existsSync(o)){e.i(`File not found: ${o}, skipping`,`warn`);return}let c=await _t(o,`utf-8`);for(let{find:t,replace:n}of s){let r=e.r(n,a);c=c.replace(new RegExp(t,`gu`),r)}await vt(o,c)}const bt={name:`replace-in-file`,version:`1.0.0`,taskTypes:[`replace-in-file`],execute:async(e,t,n)=>{n.dryRun||await yt(e.config,t)}},xt=(0,a.promisify)(n.default.readFile),St=(0,a.promisify)(n.default.writeFile),Ct=2;async function wt(t,n){if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,n)){e.i(`Condition not met, skipping update-json task`,`info`);return}let a=r.default.join(i.default.cwd(),t.file),{updates:o}=t,s=await xt(a,`utf-8`),c=JSON.parse(s);function l(t){if(typeof t==`string`)return e.r(t,n);if(Array.isArray(t))return t.map(e=>l(e));if(typeof t==`object`&&t){let e={};for(let[n,r]of Object.entries(t))e[n]=l(r);return e}return t}for(let[t,n]of Object.entries(o)){let r=l(n);t.includes(`.`)?e.s(c,t,r):c[t]=r}await St(a,`${JSON.stringify(c,null,2)}\n`)}const Tt={name:`update-json`,version:`1.0.0`,taskTypes:[`update-json`],execute:async(e,t,n)=>{n.dryRun||await wt(e.config,t)}},Et=(0,a.promisify)(n.default.writeFile);async function Dt(t,a,o){let{allowCreate:s=!0}=t;if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,a)){e.i(`Condition not met, skipping write task`,`info`);return}let c=r.default.join(i.default.cwd(),t.file);if(!n.default.existsSync(c)){if(s===!1)throw Error(`Write task failed: file does not exist (${t.file})`);e.i(`File not found, creating new file: ${t.file}`,`info`)}let l=C(t);if(!l.isValid)throw l.error?.includes(`cannot have both`)?f.templateHasBothTemplateAndFile():f.templateMissingTemplateOrFile();let u=await w(t,a,o),d=r.default.dirname(c);n.default.existsSync(d)||n.default.mkdirSync(d,{recursive:!0}),await Et(c,u)}const Ot={name:`write`,version:`1.0.0`,taskTypes:[`write`],execute:async(e,t,n)=>{n.dryRun||await Dt(e.config,t,e)}};function J(){H(`update-json`)||(B(Tt),B(Ot),B(Ye),B(pt),B(bt),B(Ze),B(gt),B(tt),B($e),B(lt),B(Ke),B(ze),B(it))}async function kt(t,n,r=!1){if(J(),r){e.i(`[DRY RUN] Would execute: ${t.name}`,`info`);return}if(H(t.type)){await je(t,n,{dryRun:r});return}throw TypeError(`Unknown task type: ${t.type}`)}async function Y(t,n,r,a,o=!1){try{return e.i(`[${r}/${a}] Running: ${t.name}...`,`info`),await kt(t,n,o),e.i(`[${r}/${a}] Completed: ${t.name}...`,`success`),!0}catch(n){return e.i(`Failed: ${t.name}`,`error`),n instanceof Error&&(e.i(` Reason: ${n.message}`,`error`),n.stack!=null&&i.default.env.DEBUG!=null&&console.error(n.stack)),(t.required??!0)&&e.i(` This is a required task. Initialization cannot continue.`,`error`),!1}}function X(t){let n=[],r=new Set,i=new Set,a=new Map(t.map(e=>[e.id,e]));function o(t){if(r.has(t))return;if(i.has(t))throw e.b.forTaskDependency(t);i.add(t);let s=a.get(t);if(!s)throw u.forId(t);if(s.dependencies)for(let e of s.dependencies)o(e);i.delete(t),r.add(t),n.push(s)}for(let e of t)r.has(e.id)||o(e.id);return n}function At(e){let t=[];for(let n of e)if(!H(n.type))t.push(`Task "${n.id}" (${n.name}): Unknown task type "${n.type}"`);else if(n.type===`write`){let e=jt(n);t.push(...e)}return t}function jt(e){let t=[],n=e.config,r=typeof n.template==`string`?n.template:void 0,i=typeof n.templateFile==`string`?n.templateFile:void 0,a=C({...r!==void 0&&{template:r},...i!==void 0&&{templateFile:i}});return!a.isValid&&a.error!=null&&a.error!==``&&t.push(`Task "${e.id}" (${e.name}): ${a.error}`),(n.file==null||n.file===``)&&t.push(`Task "${e.id}" (${e.name}): Write task requires "file" property to specify the output file path`),t}function Mt(t){e.i(`❌ Template validation failed:`,`error`),e.i(``,`error`);for(let n of t)e.i(` • ${n}`,`error`);e.i(``,`error`),e.i(`Please fix these errors before continuing.`,`error`)}function Z(e,t=new Map){let n={};for(let r of e){let e=t.get(r.id);e!==void 0&&(n[r.id]=e)}return n}async function Nt(t,n,r){if(t==null)return;if(typeof t!=`object`||!t||Array.isArray(t))return t;let i=t;if(i.type===`conditional`){if(!r){e.i(`Variable "${n}": conditional value requires context but none provided`,`warn`);return}if(typeof i.condition!=`string`){e.i(`Variable "${n}": conditional value must have a string condition`,`error`);return}try{let{evaluateCondition:e,interpolateTemplate:t}=await Promise.resolve().then(()=>require(`./utils-BGOPmydq.cjs`)),n=e(i.condition,r)?i.ifTrue:i.ifFalse;return typeof n==`string`&&/\{\{\w+\}\}/u.test(n)&&(n=t(n,r)),n}catch(t){e.i(`Variable "${n}": failed to evaluate conditional value: ${t instanceof Error?t.message:`Unknown error`}`,`warn`);return}}if(i.type===`exec`){let t=i.value;if(typeof t!=`string`){e.i(`Variable "${n}": exec value must have a string command`,`error`);return}try{let e=(0,o.execSync)(t,{encoding:`utf-8`,stdio:[`pipe`,`pipe`,`pipe`],timeout:1e4}).trim();if(e.startsWith(`{`)||e.startsWith(`[`))try{return JSON.parse(e)}catch{return e}if(/^-?\d+(?:\.\d+)?$/u.test(e)){let t=Number.parseFloat(e);if(!Number.isNaN(t))return t}return e===`true`||e===`false`?e===`true`:e}catch(t){e.i(`Variable "${n}": failed to execute command: ${t instanceof Error?t.message:`Unknown error`}`,`warn`);return}}else if(i.type===`static`)return i.value;return t}async function Q(t,n,r){let i=new Map;for(let a of t){if(r?.skipConditional===!0&&typeof a.value==`object`&&a.value!==null&&!Array.isArray(a.value)&&a.value.type===`conditional`)continue;if(a.$templateEnabled!=null){let t={...n};for(let[e,n]of i.entries())t[e]=n;if(!await e.l(a.$templateEnabled,t))continue}let t={...n};for(let[e,n]of i.entries())t[e]=n;let o=await Nt(a.value,a.id,t);o!==void 0&&i.set(a.id,o)}return i}function $(e){let t=[],n=new Set;for(let r of e)n.has(r.id)&&t.push(`Duplicate variable ID: "${r.id}"`),n.add(r.id);return t}async function Pt(n,r){let a=t.t();if(!await e.l(r.templateEnabled,a,{lazy:!0})){e.d(`⊘ Template is disabled - skipping all execution`);return}e.u(`Registering built-in plugins...`),J(),e.u(`Validating task configurations...`);let o=At(n);o.length>0&&(Mt(o),i.default.exit(1)),e.u(`All tasks validated successfully`);let s=n.filter(n=>e.c(n.enabled,t.t(),{lazy:!0}));e.u(`Resolving task dependencies...`);let c=X(s);e.u(`Sorted ${c.length} task(s) by dependencies`),e.d(`Welcome! Let's execute your tasks.`),r.dryRun&&e.m(`🔍 DRY RUN MODE - No changes will be made`),e.d(`This will execute your project tasks based on the defined configuration.`);let l=a,u=[...r.globalVariables??[]];if(u.length>0){let t=$(u);t.length>0&&(e.i(`❌ Variable validation errors:`,`error`),t.forEach(t=>e.i(` - ${t}`,`error`)),i.default.exit(1)),e.u(`Resolving variable values...`);let n=Z(u,await Q(u,l,{skipConditional:!0}));Object.assign(l,n),Object.keys(n).length>0&&e.u(`Resolved ${Object.keys(n).length} variable(s)`)}let d=r.globalPrompts??[],f=[...d];if(f.length>0){let t=q(f);t.length>0&&(e.i(`❌ Prompt validation errors:`,`error`),t.forEach(t=>e.i(` - ${t}`,`error`)),i.default.exit(1)),e.u(`Resolving prompt default values...`);let n=await K(f);if(d.length>0){e.d(`📋 Collecting prompts (available to all tasks):`);let t=await G(d,n,l);Object.assign(l,t)}}if(u.length>0){let t=u.filter(e=>typeof e.value==`object`&&e.value!==null&&!Array.isArray(e.value)?e.value.type===`conditional`:!1);if(t.length>0){e.u(`Re-resolving conditional variables with prompt values...`);let n=Z(t,await Q(t,l));Object.assign(l,n),Object.keys(n).length>0&&e.u(`Resolved ${Object.keys(n).length} conditional variable(s)`)}}if(!await e.l(r.templateEnabled,l)){e.d(`⊘ Template is disabled after variable resolution - skipping all execution`);return}let p=[];for(let t of c)t.$templateEnabled!=null&&!await e.l(t.$templateEnabled,l)||await e.l(t.enabled,l)&&p.push(t);if(e.i(`${p.length} of ${c.length} task(s) enabled for execution`,`info`),r.dryRun){await I(p,l),e.d(`🔍 Dry run completed - no changes were made`),e.d(`Run without --dry-run to apply changes`);return}e.u(`Calling beforeAll hook...`),await U(`beforeAll`,l);let m=p.length,h=0,g=0,_=[];for(let t=0;t<p.length;t++){let n=p[t];if(n!=null)if(e.u(`Calling beforeTask hook for task: ${n.name}`),await U(`beforeTask`,n,l),await Y(n,l,t+1,m,r.dryRun))h++,_.push(n.id),e.u(`Calling afterTask hook for task: ${n.name}`),await U(`afterTask`,n,l);else if(n.required??!0){g++,e.u(`Calling onError hook for task: ${n.name}`),await U(`onError`,Error(`Task ${n.name} failed`),n);break}else e.m(`⚠️ Non-critical task failed, continuing...`),e.u(`Calling onError hook for task: ${n.name}`),await U(`onError`,Error(`Task ${n.name} failed`),n)}g>0&&(e.i(`Task execution failed with ${g} critical error(s)`,`error`),e.i(`Completed: ${h}/${m} tasks`,`info`),i.default.exit(1)),e.u(`Calling afterAll hook...`),await U(`afterAll`,l),e.p(`✅ All tasks completed successfully!`),e.p(` Completed: ${h}/${m} tasks`)}async function Ft(t,n,r={}){e.u(`Running templates with sequential variable/prompt resolution...`),e.u(`Total templates to process: ${t.length}`),e.u(`Registering built-in plugins...`),J();let a=[];console.log(``),e.d(`📋 Collecting input...`),console.log(``);for(let n=0;n<t.length;n++){let o=t[n];if(o==null)continue;let s=`=`.repeat(60);if(e.u(`\n${s}`),e.u(`Processing template ${n+1}/${t.length}: "${o.name}"`),e.u(s),e.u(`Current config keys: ${Object.keys(r).join(`, `)}`),!await e.l(o.enabled,r)){e.d(`⊘ Template "${o.name}" is disabled - skipping`),e.u(` Enabled condition: ${JSON.stringify(o.enabled)}`);continue}let c=o.variables??[];if(c.length>0){e.u(`Processing ${c.length} variable(s) for template "${o.name}"...`);let t=$(c);t.length>0&&(e.i(`❌ Variable validation errors:`,`error`),t.forEach(t=>e.i(` - ${t}`,`error`)),i.default.exit(1));let n=Z(c,await Q(c,r,{skipConditional:!0}));Object.assign(r,n);let a=c.filter(e=>typeof e.value==`object`&&e.value!==null&&!Array.isArray(e.value)?e.value.type===`conditional`:!1),s=0;if(a.length>0){let t=Z(a,await Q(a,r));if(s=Object.keys(t).length,Object.assign(r,t),s>0){e.u(`Resolved ${s} conditional variable(s)`);for(let[n,r]of Object.entries(t))e.u(` ${n} = ${JSON.stringify(r)}`)}}let l=Object.keys(n).length+s;l>0&&e.u(`Total variables resolved for template: ${l}`)}let l=o.prompts??[];if(l.length>0){e.u(`Processing ${l.length} prompt(s) for template "${o.name}"...`);let t=q(l);t.length>0&&(e.i(`❌ Prompt validation errors:`,`error`),t.forEach(t=>e.i(` - ${t}`,`error`)),i.default.exit(1));let n=await G(l,await K(l),r);Object.assign(r,n),e.u(`Collected ${Object.keys(n).length} prompt answer(s)`)}if(!await e.l(o.enabled,r)){e.d(`⊘ Template "${o.name}" became disabled after variable/prompt resolution - skipping tasks`);continue}let u=o.tasks??[];u.length>0&&(e.u(`Found ${u.length} task(s) in template "${o.name}" (will execute later)`),a.push(...u))}if(e.u(`
|
|
24
|
-
🔧 Validating and filtering all collected tasks...`),a.length===0){e.i(`No tasks found in any template`,`info`);return}let o=At(a);o.length>0&&(Mt(o),i.default.exit(1)),console.log(``),e.i(`🛠️ Preparing tasks...`,`info`);let s=[];for(let t of a)await e.l(t.enabled,r)&&s.push(t);if(console.log(``),e.i(`Found ${a.length} tasks (${s.length} enabled)`,`info`),e.i(`All tasks validated successfully`,`success`),s.length===0){e.i(`No enabled tasks to execute`,`info`);return}let c=X(s);if(n.dryRun){e.i(`
|
|
25
|
-
🔍 Dry run - showing task changes...`,`info`),await I(c,r),e.i(`
|
|
26
|
-
🔍 Dry run completed - no changes were made`,`info`),e.i(`Run without --dry-run to apply changes`,`info`);return}console.log(``),e.d(`⚙️ Executing tasks...`),console.log(``),await U(`beforeAll`,r);let l=0,u=0;for(let t=0;t<c.length;t++){let i=c[t];if(i!=null)if(await U(`beforeTask`,i,r),await Y(i,r,t+1,c.length,n.dryRun))l++,await U(`afterTask`,i,r);else if(i.required??!0){u++,await U(`onError`,Error(`Task ${i.name} failed`),i),e.i(`❌ Critical task failed: ${i.name}`,`error`);break}else e.i(`⚠️ Non-critical task failed: ${i.name}, continuing...`,`warn`),await U(`onError`,Error(`Task ${i.name} failed`),i)}await U(`afterAll`,r),u>0&&(e.i(`\nTask execution failed with ${u} critical error(s)`,`error`),e.i(`Completed: ${l}/${c.length} tasks`,`info`),i.default.exit(1)),e.i(`Completed: ${l}/${c.length} tasks`,`success`)}Object.defineProperty(exports,`A`,{enumerable:!0,get:function(){return P}}),Object.defineProperty(exports,`B`,{enumerable:!0,get:function(){return b}}),Object.defineProperty(exports,`C`,{enumerable:!0,get:function(){return Oe}}),Object.defineProperty(exports,`D`,{enumerable:!0,get:function(){return Ne}}),Object.defineProperty(exports,`E`,{enumerable:!0,get:function(){return Ee}}),Object.defineProperty(exports,`F`,{enumerable:!0,get:function(){return N}}),Object.defineProperty(exports,`G`,{enumerable:!0,get:function(){return pe}}),Object.defineProperty(exports,`H`,{enumerable:!0,get:function(){return w}}),Object.defineProperty(exports,`I`,{enumerable:!0,get:function(){return Te}}),Object.defineProperty(exports,`J`,{enumerable:!0,get:function(){return re}}),Object.defineProperty(exports,`K`,{enumerable:!0,get:function(){return ae}}),Object.defineProperty(exports,`L`,{enumerable:!0,get:function(){return k}}),Object.defineProperty(exports,`M`,{enumerable:!0,get:function(){return ye}}),Object.defineProperty(exports,`N`,{enumerable:!0,get:function(){return M}}),Object.defineProperty(exports,`O`,{enumerable:!0,get:function(){return I}}),Object.defineProperty(exports,`P`,{enumerable:!0,get:function(){return F}}),Object.defineProperty(exports,`R`,{enumerable:!0,get:function(){return A}}),Object.defineProperty(exports,`S`,{enumerable:!0,get:function(){return H}}),Object.defineProperty(exports,`T`,{enumerable:!0,get:function(){return B}}),Object.defineProperty(exports,`U`,{enumerable:!0,get:function(){return S}}),Object.defineProperty(exports,`V`,{enumerable:!0,get:function(){return x}}),Object.defineProperty(exports,`W`,{enumerable:!0,get:function(){return C}}),Object.defineProperty(exports,`X`,{enumerable:!0,get:function(){return le}}),Object.defineProperty(exports,`Y`,{enumerable:!0,get:function(){return y}}),Object.defineProperty(exports,`_`,{enumerable:!0,get:function(){return Pe}}),Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return Nt}}),Object.defineProperty(exports,`b`,{enumerable:!0,get:function(){return V}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return kt}}),Object.defineProperty(exports,`d`,{enumerable:!0,get:function(){return q}}),Object.defineProperty(exports,`f`,{enumerable:!0,get:function(){return K}}),Object.defineProperty(exports,`g`,{enumerable:!0,get:function(){return ke}}),Object.defineProperty(exports,`h`,{enumerable:!0,get:function(){return U}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return Q}}),Object.defineProperty(exports,`j`,{enumerable:!0,get:function(){return be}}),Object.defineProperty(exports,`k`,{enumerable:!0,get:function(){return j}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return J}}),Object.defineProperty(exports,`m`,{enumerable:!0,get:function(){return W}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return Ft}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return Z}}),Object.defineProperty(exports,`p`,{enumerable:!0,get:function(){return G}}),Object.defineProperty(exports,`q`,{enumerable:!0,get:function(){return me}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return $}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return X}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return Pt}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return Y}}),Object.defineProperty(exports,`v`,{enumerable:!0,get:function(){return je}}),Object.defineProperty(exports,`w`,{enumerable:!0,get:function(){return Ae}}),Object.defineProperty(exports,`x`,{enumerable:!0,get:function(){return Me}}),Object.defineProperty(exports,`y`,{enumerable:!0,get:function(){return De}}),Object.defineProperty(exports,`z`,{enumerable:!0,get:function(){return he}});
|