@pixpilot/scaffoldfy 0.34.0 → 0.36.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.
@@ -0,0 +1,26 @@
1
+ const e=require(`./chunk-DjWAcSYV.cjs`),t=require(`./config-DlJs75hK.cjs`),n=require(`./template-inheritance-CwBAv1Q9.cjs`);let r=require(`node:fs`);r=e.t(r);let i=require(`node:path`);i=e.t(i);let a=require(`node:process`);a=e.t(a);let o=require(`node:util`);o=e.t(o);let s=require(`node:child_process`);s=e.t(s);let c=require(`@inquirer/prompts`);c=e.t(c);let l=require(`case-anything`);l=e.t(l);var u=class e extends n.T{constructor(e,t){super(e,`TASK_NOT_FOUND`),this.taskId=t,this.name=`TaskNotFoundError`}static forId(t){return new e(`Task not found: ${t}`,t)}},d=class e extends n.T{constructor(e,t,n){super(e,`PROMPT_VALIDATION_ERROR`),this.promptId=t,this.reason=n,this.name=`PromptValidationError`}static required(t){return new e(`Prompt "${t}" is required`,t,`required`)}static unknownType(t){return new e(`Unknown prompt type: ${t}`,t,`unknown_type`)}},f=class e extends n.T{constructor(e,t,n){super(e,`PLUGIN_CONFIGURATION_ERROR`),this.pluginType=t,this.configIssue=n,this.name=`PluginConfigurationError`}static templateMissingTemplateOrFile(){return new e(`Template task requires either "template" (inline) or "templateFile" (file path) to be specified`,`template`,`missing_template_or_file`)}static templateHasBothTemplateAndFile(){return new e(`Template task cannot have both "template" and "templateFile" specified. Use one or the other.`,`template`,`both_template_and_file`)}static createMissingTemplateOrFile(){return new e(`Create task requires either "template" (inline) or "templateFile" (file path) to be specified`,`create`,`missing_template_or_file`)}static createHasBothTemplateAndFile(){return new e(`Create task cannot have both "template" and "templateFile" specified. Use one or the other.`,`create`,`both_template_and_file`)}},p=class e extends n.T{constructor(e,t,n){super(e,`TRANSFORMER_ERROR`),this.transformerId=t,this.reason=n,this.name=`TransformerError`}static notFound(t){return new e(`Transformer "${t}" not found`,t,`not_found`)}static executionFailed(t,n){return new e(`Transformer "${t}" execution failed: ${n}`,t,`execution_failed`)}static invalidType(t,n){return new e(`Invalid transformer type "${n}" for transformer "${t}"`,t,`invalid_type`)}};function m(e){return e.template!=null&&e.template!==``}function h(e){return e.templateFile!=null&&e.templateFile!==``}function g(e){return e.endsWith(`.hbs`)}function _(e){let t=m(e),n=h(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 v(e,t,r,i={}){let{enableHandlebars:a=!0,sourceUrl:o=r?.$sourceUrl}=i,s=m(e),c=h(e);if(s)return n.l(e.template,t);if(c){let r=e.templateFile,i=a&&g(r),s=await n.n(n.h(r,o));return i?(await import(`handlebars`)).default.compile(s)(t):n.l(s,t)}throw Error(`No template content available`)}function ee(e){return m(e)?`inline template`:h(e)?`template file: ${e.templateFile}`:`no template source`}const y=(0,o.promisify)(r.default.readFile),te=2,ne=10,re=55,b={reset:`\x1B[0m`,red:`\x1B[31m`,green:`\x1B[32m`,yellow:`\x1B[33m`,blue:`\x1B[34m`,cyan:`\x1B[36m`,gray:`\x1B[90m`};function x(e,t){switch(t){case`add`:return`${b.green}+ ${e}${b.reset}`;case`remove`:return`${b.red}- ${e}${b.reset}`;case`context`:return`${b.gray} ${e}${b.reset}`;default:return e}}function S(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(x(t,`context`)):(t!==void 0&&i.push(x(t,`remove`)),a!==void 0&&i.push(x(a,`add`)))}return i}async function C(e,t){if(e.condition!=null&&e.condition!==``&&!n.c(e.condition,t))return`${b.yellow}⊘ Condition not met - task would be skipped${b.reset}`;let o=i.default.join(a.default.cwd(),e.file);if(!r.default.existsSync(o))return`${b.red}✗ File not found: ${e.file}${b.reset}`;try{let r=await y(o,`utf-8`),i=JSON.parse(r),a={...i};function s(e){if(typeof e==`string`)return n.l(e,t);if(Array.isArray(e))return e.map(e=>s(e));if(typeof e==`object`&&e){let t={};for(let[n,r]of Object.entries(e))t[n]=s(r);return t}return e}for(let[t,r]of Object.entries(e.updates)){let e=s(r);t.includes(`.`)?n.C(i,t,e):i[t]=e}let c=JSON.stringify(a,null,2),l=JSON.stringify(i,null,2);if(c===l)return`${b.cyan}→ No changes${b.reset}`;let u=S(c,l);return`${b.blue}File: ${e.file}${b.reset}\n${u.join(`
4
+ `)}`}catch(e){return`${b.red}✗ Error: ${e instanceof Error?e.message:String(e)}${b.reset}`}}async function ie(e,t){if(e.condition!=null&&e.condition!==``&&!n.c(e.condition,t))return`${b.yellow}⊘ Condition not met - task would be skipped${b.reset}`;if(e.template==null||e.template===``)return`${b.red}✗ No template content provided for file: ${e.file}${b.reset}`;let o=i.default.join(a.default.cwd(),e.file),s=n.l(e.template,t);if(!r.default.existsSync(o)){let t=s.split(`
5
+ `).slice(0,10).join(`
6
+ `),n=s.split(`
7
+ `).length>10;return`${b.blue}File: ${e.file}${b.reset}\n${b.green}+ New file would be created${b.reset}\n${b.gray}Content preview:${b.reset}\n${t}${n?`
8
+ ...`:``}`}try{let t=await y(o,`utf-8`);if(t===s)return`${b.cyan}→ No changes${b.reset}`;let n=S(t,s);return`${b.blue}File: ${e.file}${b.reset}\n${n.join(`
9
+ `)}`}catch(e){return`${b.red}✗ Error: ${e instanceof Error?e.message:String(e)}${b.reset}`}}async function w(e,t,o){if(e.condition!=null&&e.condition!==``&&!n.c(e.condition,t))return`${b.yellow}⊘ Condition not met - task would be skipped${b.reset}`;let s=i.default.join(a.default.cwd(),e.file);if(r.default.existsSync(s))return`${b.cyan}→ File already exists, would be skipped: ${e.file}${b.reset}`;try{if(m(e)){let n=await v(e,t,o),r=n.split(`
10
+ `).slice(0,10).join(`
11
+ `),i=n.split(`
12
+ `).length>10;return`${b.blue}File: ${e.file}${b.reset}\n${b.green}+ New file would be created${b.reset}\n${b.gray}Content preview:${b.reset}\n${r}${i?`
13
+ ...`:``}`}let n=ee(e);return`${b.blue}File: ${e.file}${b.reset}\n${b.green}+ New file would be created from ${n}${b.reset}`}catch(e){return`${b.red}✗ Error: ${e instanceof Error?e.message:String(e)}${b.reset}`}}async function T(e,t){if(e.condition!=null&&e.condition!==``&&!n.c(e.condition,t))return`${b.yellow}⊘ Condition not met - task would be skipped${b.reset}`;let o=i.default.join(a.default.cwd(),e.file);if(!r.default.existsSync(o))return`${b.red}✗ File not found: ${e.file}${b.reset}`;try{let r=await y(o,`utf-8`),i=new RegExp(e.pattern,e.flags??`g`),a=n.l(e.replacement,t),s=r.replace(i,a);if(r===s)return`${b.cyan}→ No matches found${b.reset}`;let c=S(r,s);return`${b.blue}File: ${e.file}${b.reset}\n${c.join(`
14
+ `)}`}catch(e){return`${b.red}✗ Error: ${e instanceof Error?e.message:String(e)}${b.reset}`}}async function E(e,t){if(e.condition!=null&&e.condition!==``&&!n.c(e.condition,t))return`${b.yellow}⊘ Condition not met - task would be skipped${b.reset}`;let o=i.default.join(a.default.cwd(),e.file);if(!r.default.existsSync(o))return`${b.red}✗ File not found: ${e.file}${b.reset}`;try{let r=await y(o,`utf-8`),i=r;for(let{find:i,replace:a}of e.replacements){let e=n.l(i,t),o=n.l(a,t);r=r.replace(e,o)}if(i===r)return`${b.cyan}→ No changes${b.reset}`;let a=S(i,r);return`${b.blue}File: ${e.file}${b.reset}\n${a.join(`
15
+ `)}`}catch(e){return`${b.red}✗ Error: ${e instanceof Error?e.message:String(e)}${b.reset}`}}function D(e,t){if(e.condition!=null&&e.condition!==``&&!n.c(e.condition,t))return`${b.yellow}⊘ Condition not met - task would be skipped${b.reset}`;let o=e.paths.map(e=>n.l(e,t)).filter(e=>r.default.existsSync(i.default.join(a.default.cwd(),e)));return o.length===0?`${b.cyan}→ No files/directories to delete${b.reset}`:`${b.red}Would delete:${b.reset}\n${o.map(e=>`${b.red} - ${e}${b.reset}`).join(`
16
+ `)}`}function O(e,t){if(e.condition!=null&&e.condition!==``&&!n.c(e.condition,t))return`${b.yellow}⊘ Condition not met - task would be skipped${b.reset}`;let o=n.l(e.from,t),s=n.l(e.to,t),c=i.default.join(a.default.cwd(),o),l=i.default.join(a.default.cwd(),s);return r.default.existsSync(c)?r.default.existsSync(l)?`${b.yellow}⚠ Destination already exists: ${s}${b.reset}\n${b.cyan}Would rename: ${o} → ${s}${b.reset}`:`${b.cyan}Would rename: ${o} → ${s}${b.reset}`:`${b.red}✗ Source not found: ${o}${b.reset}`}function k(e){if(e.condition!=null&&e.condition!==``)return`${b.yellow}⊘ Condition check skipped in dry-run${b.reset}`;let t=i.default.join(a.default.cwd(),`.git`),n=r.default.existsSync(t),o=[];if(e.removeExisting&&n&&o.push(`${b.red}Would remove existing .git directory${b.reset}`),o.push(`${b.green}Would initialize git repository${b.reset}`),e.initialCommit){let t=e.message??`Initial commit`;o.push(`${b.green}Would create initial commit: "${t}"${b.reset}`)}return o.join(`
17
+ `)}function A(e,t){if(e.condition!=null&&e.condition!==``&&!n.c(e.condition,t))return`${b.yellow}⊘ Condition not met - task would be skipped${b.reset}`;let r=n.l(e.command,t),i=e.cwd==null?a.default.cwd():n.l(e.cwd,t);return`${b.yellow}Would execute:${b.reset}\n${b.cyan} Command: ${r}${b.reset}\n${b.cyan} Working directory: ${i}${b.reset}`}function ae(e,t){if(e.condition!=null&&e.condition!==``&&!n.c(e.condition,t))return`${b.yellow}⊘ Condition not met - task would be skipped${b.reset}`;let o=n.l(e.from,t),s=n.l(e.to,t),c=i.default.join(a.default.cwd(),o),l=i.default.join(a.default.cwd(),s);return r.default.existsSync(c)?r.default.existsSync(l)?`${b.yellow}⚠ Destination already exists: ${s}${b.reset}\n${b.cyan}Would move: ${o} → ${s}${b.reset}`:`${b.cyan}Would move: ${o} → ${s}${b.reset}`:`${b.red}✗ Source not found: ${o}${b.reset}`}function oe(e,t){if(e.condition!=null&&e.condition!==``&&!n.c(e.condition,t))return`${b.yellow}⊘ Condition not met - task would be skipped${b.reset}`;let o=n.l(e.from,t),s=n.l(e.to,t),c=i.default.join(a.default.cwd(),o),l=i.default.join(a.default.cwd(),s);if(!r.default.existsSync(c))return`${b.red}✗ Source not found: ${o}${b.reset}`;let u=r.default.statSync(c).isDirectory()?`directory`:`file`;return r.default.existsSync(l)?`${b.yellow}⚠ Destination already exists: ${s}${b.reset}\n${b.cyan}Would copy ${u}: ${o} → ${s}${b.reset}`:`${b.cyan}Would copy ${u}: ${o} → ${s}${b.reset}`}async function se(e,t,o){if(e.condition!=null&&e.condition!==``&&!n.c(e.condition,t))return`${b.yellow}⊘ Condition not met - task would be skipped${b.reset}`;let s=i.default.join(a.default.cwd(),e.file),c={};e.content==null?e.template!=null&&(c.template=e.template):c.template=e.content,e.templateFile!=null&&(c.templateFile=e.templateFile);try{let n=await v(c,t,o),i=n.split(`
18
+ `).slice(0,10).join(`
19
+ `),a=n.split(`
20
+ `).length>10;return r.default.existsSync(s)?`${b.blue}File: ${e.file}${b.reset}\n${b.green}+ Would append content${b.reset}\n${b.gray}Content preview:${b.reset}\n${i}${a?`
21
+ ...`:``}`:`${b.blue}File: ${e.file}${b.reset}\n${b.green}+ New file would be created with content${b.reset}\n${b.gray}Content preview:${b.reset}\n${i}${a?`
22
+ ...`:``}`}catch(e){return`${b.red}✗ Error: ${e instanceof Error?e.message:String(e)}${b.reset}`}}function ce(e,t){if(e.condition!=null&&e.condition!==``&&!n.c(e.condition,t))return`${b.yellow}⊘ Condition not met - task would be skipped${b.reset}`;let o=n.l(e.path,t),s=i.default.join(a.default.cwd(),o);return r.default.existsSync(s)?`${b.cyan}→ Directory already exists: ${o}${b.reset}`:`${b.green}+ Would create directory: ${o}${b.reset}`}async function le(e,t){try{switch(e.type){case`update-json`:return await C(e.config,t);case`write`:return await ie(e.config,t);case`create`:return await w(e.config,t,e);case`regex-replace`:return await T(e.config,t);case`replace-in-file`:return await E(e.config,t);case`delete`:return D(e.config,t);case`rename`:return O(e.config,t);case`move`:return ae(e.config,t);case`copy`:return oe(e.config,t);case`append`:return await se(e.config,t,e);case`mkdir`:return ce(e.config,t);case`git-init`:return k(e.config);case`exec`:return A(e.config,t);case`exec-file`:return A(e.config,t);default:{let t=e.type;return`${b.yellow}⚠ Diff not available for task type: ${t}${b.reset}`}}}catch(e){return`${b.red}✗ Error generating diff: ${e instanceof Error?e.message:String(e)}${b.reset}`}}async function j(e,t){console.log(`${b.blue}═══════════════════════════════════════════════════════${b.reset}`),console.log(`${b.blue} DRY RUN - Preview of changes${b.reset}`),console.log(`${b.blue}═══════════════════════════════════════════════════════${b.reset}`);for(let n of e){console.log(`${b.cyan}▶ Task: ${n.name}${b.reset}`),n.description!=null&&n.description!==``&&console.log(`${b.gray} ${n.description}${b.reset}`);let e=await le(n,t);console.log(e),console.log(`${b.gray}${`─`.repeat(55)}${b.reset}`)}console.log(`${b.blue}═══════════════════════════════════════════════════════${b.reset}`),console.log(`${b.yellow} No changes were applied (dry-run mode)${b.reset}`),console.log(`${b.blue}═══════════════════════════════════════════════════════${b.reset}`)}const M=new Map,N={},P=new Map;function F(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(M.has(e.name))throw TypeError(`Plugin ${e.name} is already registered`);for(let t of e.taskTypes)if(P.has(t)){let e=P.get(t);throw TypeError(`Task type "${t}" is already registered by plugin "${e}"`)}M.set(e.name,e);for(let t of e.taskTypes)P.set(t,e.name);n.v(`Registered plugin: ${e.name}${e.version==null?``:` v${e.version}`}`)}function ue(e){let t=M.get(e);if(t!=null){for(let e of t.taskTypes)P.delete(e);M.delete(e)}}function de(e){return M.get(e)}function I(e){let t=P.get(e);if(t!=null)return M.get(t)}function L(e){return P.has(e)}function fe(){return Array.from(M.keys())}function pe(){M.clear(),P.clear()}function me(e){e.beforeAll!=null&&(N.beforeAll=e.beforeAll),e.afterAll!=null&&(N.afterAll=e.afterAll),e.beforeTask!=null&&(N.beforeTask=e.beforeTask),e.afterTask!=null&&(N.afterTask=e.afterTask),e.onError!=null&&(N.onError=e.onError)}async function R(e,...t){let r=N[e];if(r!=null)try{e===`beforeAll`||e===`afterAll`?await r(t[0]):(e===`beforeTask`||e===`afterTask`||e===`onError`)&&await r(t[0],t[1])}catch(t){n.u(`Error in ${e} hook: ${t instanceof Error?t.message:String(t)}`,`error`)}}async function z(e,t,n){let r=I(e.type);if(r==null)throw TypeError(`No plugin found for task type: ${e.type}`);await r.execute(e,t,n)}async function he(e,t){let n=I(e.type);if(!(n==null||n.getDiff==null))return n.getDiff(e,t)}function ge(e){let t=I(e.type);return t==null?[`No plugin found for task type: ${e.type}`]:t.validate==null?[]:t.validate(e)}function _e(e,t,n,r){return{name:e,...r?.version!=null&&{version:r.version},taskTypes:[t],execute:n,...r?.getDiff!=null&&{getDiff:r.getDiff},...r?.validate!=null&&{validate:r.validate}}}var ve=class{transformers=new Map;constructor(){this.registerBuiltInTransformers()}registerBuiltInTransformers(){for(let e of[{id:`lowercase`,type:`lowercase`},{id:`uppercase`,type:`uppercase`},{id:`trim`,type:`trim`},{id:`slugify`,type:`slugify`},{id:`capitalize`,type:`capitalize`},{id:`titlecase`,type:`titlecase`},{id:`camelcase`,type:`camelcase`},{id:`pascalcase`,type:`pascalcase`},{id:`snakecase`,type:`snakecase`},{id:`kebabcase`,type:`kebabcase`},{id:`constantcase`,type:`constantcase`},{id:`alphanumeric`,type:`alphanumeric`},{id:`collapse-spaces`,type:`collapse-spaces`},{id:`remove-spaces`,type:`remove-spaces`},{id:`urlencode`,type:`urlencode`},{id:`dasherize`,type:`dasherize`},{id:`underscore`,type:`underscore`}])this.transformers.set(e.id,e)}register(e){this.transformers.has(e.id)&&n.u(`Transformer with id "${e.id}" is already registered. Overwriting.`,`warn`),this.transformers.set(e.id,e)}registerAll(e){for(let t of e)this.register(t)}get(e){return this.transformers.get(e)}has(e){return this.transformers.has(e)}async execute(e,t,n={}){let r=this.transformers.get(e);if(!r)throw p.notFound(e);try{return await this.executeTransformer(r,t,n)}catch(t){throw t instanceof p?t:p.executionFailed(e,t instanceof Error?t.message:String(t))}}async executeChain(e,t,n={}){let r=t;for(let t of e)r=await this.execute(t,r,n);return r}async apply(e,t,n={}){return e===void 0?t:this.executeChain(e,t,n)}validate(e){if(e===void 0)return[];let t=e,n=[];for(let e of t)this.has(e)||n.push(`Transformer "${e}" not found`);return n}async executeTransformer(e,t,n){switch(e.type){case`regex`:return this.executeRegex(e,t);case`computed`:return this.executeComputed(e,t,n);case`lowercase`:return this.executeLowercase(t);case`uppercase`:return this.executeUppercase(t);case`trim`:return this.executeTrim(t);case`slugify`:return this.executeSlugify(t);case`capitalize`:return this.executeCapitalize(t);case`titlecase`:return this.executeTitlecase(t);case`camelcase`:return this.executeCamelcase(t);case`pascalcase`:return this.executePascalcase(t);case`snakecase`:return this.executeSnakecase(t);case`kebabcase`:return this.executeKebabcase(t);case`constantcase`:return this.executeConstantcase(t);case`alphanumeric`:return this.executeAlphanumeric(t);case`collapse-spaces`:return this.executeCollapseSpaces(t);case`remove-spaces`:return this.executeRemoveSpaces(t);case`urlencode`:return this.executeUrlencode(t);case`dasherize`:return this.executeDasherize(t);case`underscore`:return this.executeUnderscore(t);case`custom`:return this.executeCustom(e,t,n);case`chain`:return this.executeChainTransformer(e,t,n);default:{let t=e;throw p.invalidType(t.id,t.type)}}}executeRegex(e,t){let n=String(t),{pattern:r,flags:i,replacement:a}=e.config;try{let e=new RegExp(r,i);return n.replace(e,a)}catch(t){throw p.executionFailed(e.id,`Invalid regex pattern: ${t instanceof Error?t.message:String(t)}`)}}executeComputed(e,t,n){let{expression:r}=e.config;try{return Function(`value`,`context`,...Object.keys(n),`return ${r}`)(t,n,...Object.values(n))}catch(t){throw p.executionFailed(e.id,`Expression evaluation failed: ${t instanceof Error?t.message:String(t)}`)}}executeLowercase(e){return(0,l.lowerCase)(String(e))}executeUppercase(e){return(0,l.upperCase)(String(e))}executeTrim(e){return String(e).trim()}executeSlugify(e){return String(e).toLowerCase().trim().replace(/[\s_]+/gu,`-`).replace(/[^\w-]+/gu,``).replace(/-{2,}/gu,`-`).replace(/^-+/u,``).replace(/-+$/u,``)}async executeCustom(e,t,n){let{handler:r}=e.config;if(typeof r==`function`)return r(t,n);throw p.executionFailed(e.id,`String-based custom handlers are not yet supported. Please use function handlers.`)}async executeChainTransformer(e,t,n){let{transformers:r}=e.config;if(r.length===0)throw p.executionFailed(e.id,`Chain transformer must have at least one transformer`);return this.executeChain(r,t,n)}executeCapitalize(e){return(0,l.capitalCase)(String(e))}executeTitlecase(e){return(0,l.capitalCase)(String(e))}executeCamelcase(e){return(0,l.camelCase)(String(e))}executePascalcase(e){return(0,l.pascalCase)(String(e))}executeSnakecase(e){return(0,l.snakeCase)(String(e))}executeKebabcase(e){return(0,l.kebabCase)(String(e))}executeConstantcase(e){return(0,l.constantCase)(String(e))}executeAlphanumeric(e){return String(e).replace(/[^a-zA-Z0-9]/gu,``)}executeCollapseSpaces(e){return String(e).replace(/\s+/gu,` `)}executeRemoveSpaces(e){return String(e).replace(/\s/gu,``)}executeUrlencode(e){return encodeURIComponent(String(e))}executeDasherize(e){return(0,l.kebabCase)(String(e))}executeUnderscore(e){return(0,l.snakeCase)(String(e))}clear(){this.transformers.clear()}getIds(){return Array.from(this.transformers.keys())}};const B=new ve;function ye(e,t){try{let n={...t};return Function(...Object.keys(n),`'use strict'; return (${e})`)(...Object.values(n))}catch{return!0}}function be(e){return e===void 0||typeof e==`boolean`?e:typeof e==`string`?{type:`condition`,value:e}:typeof e==`object`&&e&&`condition`in e&&!(`type`in e)?{type:`condition`,value:e.condition}:e}async function V(e,t){let n=be(e);if(n===void 0)return!0;if(typeof n==`boolean`)return n;if(typeof n==`object`&&n&&`type`in n){if(n.type===`exec`)try{let{execSync:e}=await import(`node:child_process`),{interpolateTemplate:r}=await Promise.resolve().then(()=>require(`./utils-CRe7Fw3m.cjs`));return e(r(n.value,t),{encoding:`utf-8`,stdio:`ignore`}),!0}catch(e){let{log:t}=await Promise.resolve().then(()=>require(`./utils-CRe7Fw3m.cjs`));if(typeof e==`object`&&e&&`status`in e&&typeof e.status==`number`){let{status:r}=e;if(r>=1&&r<=255)return t(`Failed to execute required command: ${n.value}`,`warn`),e instanceof Error&&t(` Error: ${e.message}`,`warn`),!1}return t(`Failed to execute required command: ${n.value}`,`warn`),e instanceof Error&&t(` Error: ${e.message}`,`warn`),!1}if(n.type===`condition`)return ye(n.value,t)}return!0}async function H(e,t,r,i){if(e!==void 0)return n.p(e,{id:t,contextType:`Prompt`,...r!=null&&{context:r},...i?.$sourceUrl!=null&&{sourceUrl:i.$sourceUrl}})}async function U(e,t=new Map,r={}){let i={};if(e.length===0)return i;for(let a of e){if(a.$templateEnabled!=null&&!await n._(a.$templateEnabled,{...r,...i}))continue;let e={...r,...i};if(await n._(a.enabled,e))try{let r,o=t.get(a.id);switch(a.default!==void 0&&(o=await H(a.default,a.id,e,a)),a.type){case`input`:{let t={message:a.message};o!==void 0&&(t.default=String(o));let i=await V(a.required,e);if(i!==void 0&&(t.required=i),r=await(0,c.input)(t),i&&(r==null||typeof r==`string`&&r.trim()===``))throw n.u(`${a.message} is required`,`error`),d.required(a.id);break}case`password`:if(r=await(0,c.password)({message:a.message,mask:`*`}),await V(a.required,e)&&(r==null||typeof r==`string`&&r.trim()===``))throw n.u(`${a.message} is required`,`error`),d.required(a.id);break;case`number`:{let t={message:a.message};o!==void 0&&(t.default=Number(o));let i=await V(a.required,e);if(i!==void 0&&(t.required=i),a.min!==void 0&&(t.min=a.min),a.max!==void 0&&(t.max=a.max),r=await(0,c.number)(t),i&&r==null)throw n.u(`${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,c.select)(e);break}case`confirm`:{let e=o===void 0?!1:!!o;r=await(0,c.confirm)({message:a.message,default:e});break}default:throw n.u(`Unknown prompt type: ${a.type}`,`error`),d.unknownType(a.type)}a.transformers!==void 0&&(r=await B.apply(a.transformers,r,{...e,...i})),i[a.id]=r}catch(e){throw e instanceof Error&&n.u(`Failed to collect prompt "${a.id}": ${e.message}`,`error`),e}}return i}async function W(e,t){let n=new Map,r=e.map(async e=>{if(e.default!==void 0){let r=await H(e.default,e.id,t,e);r!==void 0&&n.set(e.id,r)}});return await Promise.all(r),n}function G(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 K=(0,o.promisify)(r.default.appendFile),xe=(0,o.promisify)(r.default.readFile),Se=(0,o.promisify)(r.default.stat);async function Ce(e,t,r){if(e.condition!=null&&e.condition!==``&&!n.c(e.condition,t)){n.u(`Condition not met, skipping append task`,`info`);return}let o=i.default.join(a.default.cwd(),e.file),s={};e.content==null?e.template!=null&&(s.template=e.template):s.template=e.content,e.templateFile!=null&&(s.templateFile=e.templateFile);let c=_(s);if(!c.isValid)throw c.error?.includes(`cannot have both`)?f.templateHasBothTemplateAndFile():f.templateMissingTemplateOrFile();let l=await v(s,t,r),u=!1,d=!1;try{await Se(o),u=!0;let t=await xe(o,`utf-8`);t.length>0&&!t.endsWith(`
23
+ `)&&(d=e.newline!==!1)}catch{}u&&d?await K(o,`\n${l}`):await K(o,l),n.u(`Appended content to ${e.file}`,`success`)}const we={name:`append`,version:`1.0.0`,taskTypes:[`append`],execute:async(e,t,n)=>{n.dryRun||await Ce(e.config,t,e)}},Te=(0,o.promisify)(r.default.copyFile),Ee=(0,o.promisify)(r.default.stat),De=(0,o.promisify)(r.default.mkdir),Oe=(0,o.promisify)(r.default.readdir);async function ke(e,t){await De(t,{recursive:!0});let n=await Oe(e,{withFileTypes:!0});await Promise.all(n.map(async n=>{let r=i.default.join(e,n.name),a=i.default.join(t,n.name);n.isDirectory()?await ke(r,a):await Te(r,a)}))}async function Ae(e,t){if(e.condition!=null&&e.condition!==``&&!n.c(e.condition,t)){n.u(`Condition not met, skipping copy task`,`info`);return}let r=i.default.join(a.default.cwd(),e.from),o=i.default.join(a.default.cwd(),e.to),s;try{s=await Ee(r)}catch{n.u(`Source path does not exist: ${r}`,`warn`);return}await De(i.default.dirname(o),{recursive:!0}),s.isDirectory()?(await ke(r,o),n.u(`Copied directory ${e.from} to ${e.to}`,`success`)):(await Te(r,o),n.u(`Copied file ${e.from} to ${e.to}`,`success`))}const je={name:`copy`,version:`1.0.0`,taskTypes:[`copy`],execute:async(e,t,n)=>{n.dryRun||await Ae(e.config,t)}},Me=(0,o.promisify)(r.default.writeFile);async function Ne(e,t,o){if(e.condition!=null&&e.condition!==``&&!n.c(e.condition,t)){n.u(`Condition not met, skipping create task`,`info`);return}let s=i.default.join(a.default.cwd(),e.file);if(r.default.existsSync(s)){n.u(`File already exists, skipping: ${e.file}`,`info`);return}let c=_(e);if(!c.isValid)throw c.error?.includes(`cannot have both`)?f.createHasBothTemplateAndFile():f.createMissingTemplateOrFile();let l=await v(e,t,o),u=i.default.dirname(s);r.default.existsSync(u)||r.default.mkdirSync(u,{recursive:!0}),await Me(s,l),n.u(`Created file: ${e.file}`,`success`)}const Pe={name:`create`,version:`1.0.0`,taskTypes:[`create`],execute:async(e,t,n)=>{n.dryRun||await Ne(e.config,t,e)}};async function Fe(e,t){let{paths:o,condition:s}=e;if(s!=null&&s!==``){if(!t){n.u(`Condition specified but no config provided, skipping deletion`,`warn`);return}if(!n.c(s,t)){n.u(`Condition not met, skipping deletion`,`info`);return}}for(let e of o){let t=i.default.join(a.default.cwd(),e);r.default.existsSync(t)&&r.default.rmSync(t,{recursive:!0,force:!0})}}const Ie={name:`delete`,version:`1.0.0`,taskTypes:[`delete`],execute:async(e,t,n)=>{n.dryRun||await Fe(e.config,t)}};async function Le(e,t,r){e.condition!=null&&e.condition!==``&&!n.c(e.condition,t)||await n.m({file:e.file,...e.runtime&&{runtime:e.runtime},...e.args&&{args:e.args},...e.parameters&&{parameters:e.parameters},...e.cwd!=null&&e.cwd.trim()!==``&&{cwd:e.cwd},...r?.$sourceUrl!=null&&r.$sourceUrl.trim()!==``&&{sourceUrl:r.$sourceUrl},captureOutput:!1},t)}const Re={name:`exec-file`,version:`1.0.0`,taskTypes:[`exec-file`],execute:async(e,t,n)=>{n.dryRun||await Le(e.config,t,e)}};async function ze(e,t){if(e.condition!=null&&e.condition!==``){if(!t){n.u(`Condition specified but no config provided, skipping exec`,`warn`);return}if(!n.c(e.condition,t)){n.u(`Condition not met, skipping exec task`,`info`);return}}let r=e.cwd==null?a.default.cwd():i.default.join(a.default.cwd(),e.cwd);(0,s.execSync)(e.command,{cwd:r,stdio:`inherit`})}const Be={name:`exec`,version:`1.0.0`,taskTypes:[`exec`],execute:async(e,t,n)=>{n.dryRun||await ze(e.config,t)}};async function Ve(e,t){if(e.condition!=null&&e.condition!==``){if(!t){n.u(`Condition specified but no config provided, skipping git-init`,`warn`);return}if(!n.c(e.condition,t)){n.u(`Condition not met, skipping git-init task`,`info`);return}}if(e.removeExisting){let e=i.default.join(a.default.cwd(),`.git`);r.default.existsSync(e)&&r.default.rmSync(e,{recursive:!0,force:!0})}if((0,s.execSync)(`git init`,{stdio:`inherit`}),e.initialCommit){let t=e.message??`Initial commit`;(0,s.execSync)(`git add .`,{stdio:`inherit`}),(0,s.execSync)(`git commit -m "${t}"`,{stdio:`inherit`})}}const He={name:`git-init`,version:`1.0.0`,taskTypes:[`git-init`],execute:async(e,t,n)=>{n.dryRun||await Ve(e.config,t)}},Ue=(0,o.promisify)(r.default.mkdir);async function We(e,t){if(e.condition!=null&&e.condition!==``&&!n.c(e.condition,t)){n.u(`Condition not met, skipping mkdir task`,`info`);return}await Ue(i.default.join(a.default.cwd(),e.path),{recursive:!0}),n.u(`Created directory: ${e.path}`,`success`)}const Ge={name:`mkdir`,version:`1.0.0`,taskTypes:[`mkdir`],execute:async(e,t,n)=>{n.dryRun||await We(e.config,t)}},Ke=(0,o.promisify)(r.default.rename),qe=(0,o.promisify)(r.default.stat),Je=(0,o.promisify)(r.default.mkdir);async function Ye(e,t){if(e.condition!=null&&e.condition!==``&&!n.c(e.condition,t)){n.u(`Condition not met, skipping move task`,`info`);return}let r=i.default.join(a.default.cwd(),e.from),o=i.default.join(a.default.cwd(),e.to);try{await qe(r)}catch{n.u(`Source path does not exist: ${r}`,`warn`);return}await Je(i.default.dirname(o),{recursive:!0}),await Ke(r,o),n.u(`Moved ${e.from} to ${e.to}`,`success`)}const Xe={name:`move`,version:`1.0.0`,taskTypes:[`move`],execute:async(e,t,n)=>{n.dryRun||await Ye(e.config,t)}},Ze=(0,o.promisify)(r.default.readFile),Qe=(0,o.promisify)(r.default.writeFile);async function $e(e,t){if(e.condition!=null&&e.condition!==``&&!n.c(e.condition,t)){n.u(`Condition not met, skipping regex-replace task`,`info`);return}let r=i.default.join(a.default.cwd(),e.file),{pattern:o}=e,s=e.flags??``,c=e.replacement||``,l=await Ze(r,`utf-8`),u=new RegExp(o,s);l=l.replace(u,n.l(c,t)),await Qe(r,l)}const et={name:`regex-replace`,version:`1.0.0`,taskTypes:[`regex-replace`],execute:async(e,t,n)=>{n.dryRun||await $e(e.config,t)}},tt=(0,o.promisify)(r.default.rename);async function nt(e,t){if(e.condition!=null&&e.condition!==``&&!n.c(e.condition,t)){n.u(`Condition not met, skipping rename task`,`info`);return}let o=i.default.join(a.default.cwd(),n.l(e.from,t)),s=i.default.join(a.default.cwd(),n.l(e.to,t));if(!r.default.existsSync(o)){n.u(`Source path does not exist: ${o}`,`warn`);return}await tt(o,s)}const rt={name:`rename`,version:`1.0.0`,taskTypes:[`rename`],execute:async(e,t,n)=>{n.dryRun||await nt(e.config,t)}},it=(0,o.promisify)(r.default.readFile),at=(0,o.promisify)(r.default.writeFile);async function ot(e,t){if(e.condition!=null&&e.condition!==``&&!n.c(e.condition,t)){n.u(`Condition not met, skipping replace-in-file task`,`info`);return}let o=i.default.join(a.default.cwd(),e.file),{replacements:s}=e;if(!r.default.existsSync(o)){n.u(`File not found: ${o}, skipping`,`warn`);return}let c=await it(o,`utf-8`);for(let{find:e,replace:r}of s){let i=n.l(r,t);c=c.replace(new RegExp(e,`gu`),i)}await at(o,c)}const st={name:`replace-in-file`,version:`1.0.0`,taskTypes:[`replace-in-file`],execute:async(e,t,n)=>{n.dryRun||await ot(e.config,t)}},ct=(0,o.promisify)(r.default.readFile),lt=(0,o.promisify)(r.default.writeFile),ut=2;async function dt(e,t){if(e.condition!=null&&e.condition!==``&&!n.c(e.condition,t)){n.u(`Condition not met, skipping update-json task`,`info`);return}let r=i.default.join(a.default.cwd(),e.file),{updates:o}=e,s=await ct(r,`utf-8`),c=JSON.parse(s);function l(e){if(typeof e==`string`)return n.l(e,t);if(Array.isArray(e))return e.map(e=>l(e));if(typeof e==`object`&&e){let t={};for(let[n,r]of Object.entries(e))t[n]=l(r);return t}return e}for(let[e,t]of Object.entries(o)){let r=l(t);e.includes(`.`)?n.C(c,e,r):c[e]=r}await lt(r,`${JSON.stringify(c,null,2)}\n`)}const ft={name:`update-json`,version:`1.0.0`,taskTypes:[`update-json`],execute:async(e,t,n)=>{n.dryRun||await dt(e.config,t)}},pt=(0,o.promisify)(r.default.writeFile);async function mt(e,t,o){let{allowCreate:s=!0}=e;if(e.condition!=null&&e.condition!==``&&!n.c(e.condition,t)){n.u(`Condition not met, skipping write task`,`info`);return}let c=i.default.join(a.default.cwd(),e.file);if(!r.default.existsSync(c)){if(s===!1)throw Error(`Write task failed: file does not exist (${e.file})`);n.u(`File not found, creating new file: ${e.file}`,`info`)}let l=_(e);if(!l.isValid)throw l.error?.includes(`cannot have both`)?f.templateHasBothTemplateAndFile():f.templateMissingTemplateOrFile();let u=await v(e,t,o),d=i.default.dirname(c);r.default.existsSync(d)||r.default.mkdirSync(d,{recursive:!0}),await pt(c,u)}const ht={name:`write`,version:`1.0.0`,taskTypes:[`write`],execute:async(e,t,n)=>{n.dryRun||await mt(e.config,t,e)}};function q(){L(`update-json`)||(F(ft),F(ht),F(Pe),F(et),F(st),F(Ie),F(rt),F(He),F(Be),F(Re),F(Xe),F(je),F(we),F(Ge))}async function gt(e,t,r=!1){if(q(),r){n.u(`[DRY RUN] Would execute: ${e.name}`,`info`);return}if(L(e.type)){await z(e,t,{dryRun:r});return}throw TypeError(`Unknown task type: ${e.type}`)}async function J(e,t,r,i,o=!1){try{return n.u(`[${r}/${i}] Running: ${e.name}...`,`info`),await gt(e,t,o),n.u(`[${r}/${i}] Completed: ${e.name}...`,`success`),!0}catch(t){return n.u(`Failed: ${e.name}`,`error`),t instanceof Error&&(n.u(` Reason: ${t.message}`,`error`),t.stack!=null&&a.default.env.DEBUG!=null&&console.error(t.stack)),!1}}function Y(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.w.forTaskDependency(e);i.add(e);let s=a.get(e);if(!s)throw u.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 _t(e){let t=[];for(let n of e)if(!L(n.type))t.push(`Task "${n.id}" (${n.name}): Unknown task type "${n.type}"`);else if(n.type===`write`){let e=vt(n);t.push(...e)}return t}function vt(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=_({...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 yt(e){n.u(`❌ Template validation failed:`,`error`),n.u(``,`error`);for(let t of e)n.u(` • ${t}`,`error`);n.u(``,`error`),n.u(`Please fix these errors before continuing.`,`error`)}async function X(e,t=new Map,n={}){let r={};for(let i of e){let e=t.get(i.id);e!==void 0&&(i.transformers!==void 0&&(e=await B.apply(i.transformers,e,{...n,...r})),r[i.id]=e)}return r}async function Z(e,t,r){let i=new Map;for(let a of e){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 e={...t};for(let[t,n]of i.entries())e[t]=n;if(!await n._(a.$templateEnabled,e))continue}let e={...t};for(let[t,n]of i.entries())e[t]=n;let o=await n.p(a.value,{id:a.id,contextType:`Variable`,context:e,...a.$sourceUrl!=null&&{sourceUrl:a.$sourceUrl}});o!==void 0&&i.set(a.id,o)}return i}async function Q(e,t,r,i){if(e==null)return;if(typeof e!=`object`||!e||Array.isArray(e))return e;let a=e;if(a.type===`conditional`){if(!r){n.u(`Variable "${t}": conditional value requires context but none provided`,`warn`);return}if(typeof a.condition!=`string`){n.u(`Variable "${t}": conditional value must have a string condition`,`error`);return}try{let{evaluateCondition:e}=await Promise.resolve().then(()=>require(`./utils-CRe7Fw3m.cjs`)),n=e(a.condition,r)?a.ifTrue:a.ifFalse;return typeof n==`object`&&n?await Q(n,t,r,i):n}catch(e){n.u(`Variable "${t}": failed to evaluate conditional value: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}if(a.type===`exec`){let e=a.value;if(typeof e!=`string`){n.u(`Variable "${t}": exec value must have a string command`,`error`);return}try{let t=(0,s.execSync)(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){n.u(`Variable "${t}": failed to execute command: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}else if(a.type===`static`)return a.value;else if(a.type===`interpolate`){let e=a.value;if(typeof e!=`string`){n.u(`Variable "${t}": interpolate value must be a string with {{variable}} placeholders`,`error`);return}if(!r)return n.u(`Variable "${t}": interpolate value requires context but none provided`,`warn`),e;try{return n.l(e,r)}catch(r){return n.u(`Variable "${t}": failed to interpolate interpolate value: ${r instanceof Error?r.message:`Unknown error`}`,`warn`),e}}else if(a.type===`exec-file`){if(!r){n.u(`Variable "${t}": exec-file value requires context but none provided`,`warn`);return}let e=a;if(typeof e.file!=`string`){n.u(`Variable "${t}": exec-file value must have a file path`,`error`);return}try{let t=await n.m({file:e.file,...e.runtime!=null&&e.runtime.trim()!==``&&{runtime:e.runtime},...e.args&&{args:e.args},...e.parameters&&{parameters:e.parameters},...e.cwd!==void 0&&e.cwd.trim()!==``&&{cwd:e.cwd},...i!=null&&{sourceUrl:i},captureOutput:!0},r);if(t===void 0)return;let a=t.trim();if(a.startsWith(`{`)||a.startsWith(`[`))try{return JSON.parse(a)}catch{return a}if(/^-?\d+(?:\.\d+)?$/u.test(a)){let e=Number.parseFloat(a);if(!Number.isNaN(e))return e}return a===`true`||a===`false`?a===`true`:a}catch(e){n.u(`Variable "${t}": failed to execute script file: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}else if(a.type!==void 0){n.u(`Variable "${t}": unknown value type "${a.type}". Expected "static", "exec", "conditional", "interpolate", or "exec-file".`,`error`);return}return e}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 bt(e,r){let i=t.t();if(!await n._(r.templateEnabled,i,{lazy:!0})){n.y(`⊘ Template is disabled - skipping all execution`);return}r.transformers!==void 0&&r.transformers.length>0&&(n.v(`Registering ${r.transformers.length} transformer(s)...`),B.registerAll(r.transformers)),n.v(`Registering built-in plugins...`),q(),n.v(`Validating task configurations...`);let o=_t(e);o.length>0&&(yt(o),a.default.exit(1)),n.v(`All tasks validated successfully`);let s=e.filter(e=>n.g(e.enabled,t.t(),{lazy:!0}));n.v(`Resolving task dependencies...`);let c=Y(s);n.v(`Sorted ${c.length} task(s) by dependencies`),n.y(`Welcome! Let's execute your tasks.`),r.dryRun&&n.S(`🔍 DRY RUN MODE - No changes will be made`),n.y(`This will execute your project tasks based on the defined configuration.`);let l=i,u=[...r.variables??[]];if(u.length>0){let e=$(u);e.length>0&&(n.u(`❌ Variable validation errors:`,`error`),e.forEach(e=>n.u(` - ${e}`,`error`)),a.default.exit(1)),n.v(`Resolving variable values...`);let t=await X(u,await Z(u,l,{skipConditional:!0}),l);Object.assign(l,t),Object.keys(t).length>0&&(n.v(`Resolved ${Object.keys(t).length} variable(s)`),n.v(`Variable values: ${JSON.stringify(t)}`))}let d=r.prompts??[],f=[...d];if(f.length>0){let e=G(f);e.length>0&&(n.u(`❌ Prompt validation errors:`,`error`),e.forEach(e=>n.u(` - ${e}`,`error`)),a.default.exit(1)),n.v(`Resolving prompt default values...`);let t=await W(f,l);if(d.length>0){n.y(`📋 Collecting prompts (available to all tasks):`);let e=await U(d,t,l);Object.assign(l,e)}}if(u.length>0){let e=u.filter(e=>typeof e.value==`object`&&e.value!==null&&!Array.isArray(e.value)?e.value.type===`conditional`:!1);if(e.length>0){n.v(`Re-resolving conditional variables with prompt values...`);let t=await X(e,await Z(e,l),l);Object.assign(l,t),Object.keys(t).length>0&&n.v(`Resolved ${Object.keys(t).length} conditional variable(s)`)}}if(!await n._(r.templateEnabled,l)){n.y(`⊘ Template is disabled after variable resolution - skipping all execution`);return}let p=[];for(let e of c)e.$templateEnabled!=null&&!await n._(e.$templateEnabled,l)||await n._(e.enabled,l)&&p.push(e);if(n.u(`${p.length} of ${c.length} task(s) enabled for execution`,`info`),r.dryRun){await j(p,l),n.y(`🔍 Dry run completed - no changes were made`),n.y(`Run without --dry-run to apply changes`);return}n.v(`Calling beforeAll hook...`),await R(`beforeAll`,l);let m=p.length,h=0,g=0,_=[],v=[];for(let e=0;e<p.length;e++){let t=p[e];t!=null&&(n.v(`Calling beforeTask hook for task: ${t.name}`),await R(`beforeTask`,t,l),await J(t,l,e+1,m,r.dryRun)?(h++,_.push(t.id),n.v(`Calling afterTask hook for task: ${t.name}`),await R(`afterTask`,t,l)):(await V(t.required,l)&&(g++,v.push(t.name)),n.v(`Calling onError hook for task: ${t.name}`),await R(`onError`,Error(`Task ${t.name} failed`),t),n.S(`⚠️ Task "${t.name}" failed, continuing with remaining tasks...`)))}g>0&&(n.u(`\n❌ Task execution completed with ${g} error(s)`,`error`),n.u(`Completed: ${h}/${m} tasks`,`info`),n.u(`Failed tasks: ${v.join(`, `)}`,`error`),a.default.exit(1)),n.v(`Calling afterAll hook...`),await R(`afterAll`,l),n.x(`✅ All tasks completed successfully!`),n.x(` Completed: ${h}/${m} tasks`)}async function xt(e,t,r={}){n.v(`Running templates with sequential variable/prompt resolution...`),n.v(`Total templates to process: ${e.length}`),n.v(`Registering built-in plugins...`),q();let i=[];console.log(``),n.y(`📋 Collecting input...`),console.log(``);for(let t=0;t<e.length;t++){let o=e[t];if(o==null)continue;let s=`=`.repeat(60);if(n.v(`\n${s}`),n.v(`Processing template ${t+1}/${e.length}: "${o.name}"`),n.v(s),n.v(`Current config keys: ${Object.keys(r).join(`, `)}`),!await n._(o.enabled,r)){n.y(`⊘ Template "${o.name}" is disabled - skipping`),n.v(` Enabled condition: ${JSON.stringify(o.enabled)}`);continue}let c=o.variables??[];if(c.length>0){n.v(`Processing ${c.length} variable(s) for template "${o.name}"...`);let e=$(c);e.length>0&&(n.u(`❌ Variable validation errors:`,`error`),e.forEach(e=>n.u(` - ${e}`,`error`)),a.default.exit(1));let t=await X(c,await Z(c,r,{skipConditional:!0}),r);Object.assign(r,t);let i=c.filter(e=>typeof e.value==`object`&&e.value!==null&&!Array.isArray(e.value)?e.value.type===`conditional`:!1),s=0;if(i.length>0){let e=await X(i,await Z(i,r),r);if(s=Object.keys(e).length,Object.assign(r,e),s>0){n.v(`Resolved ${s} conditional variable(s)`);for(let[t,r]of Object.entries(e))n.v(` ${t} = ${JSON.stringify(r)}`)}}let l=Object.keys(t).length+s;if(l>0){n.v(`Total variables resolved for template: ${l}`);for(let[e,r]of Object.entries(t))n.v(` ${e} = ${JSON.stringify(r)}`)}}let l=o.prompts??[];if(l.length>0){n.v(`Processing ${l.length} prompt(s) for template "${o.name}"...`);let e=G(l);e.length>0&&(n.u(`❌ Prompt validation errors:`,`error`),e.forEach(e=>n.u(` - ${e}`,`error`)),a.default.exit(1));let t=await U(l,await W(l,r),r);Object.assign(r,t),n.v(`Collected ${Object.keys(t).length} prompt answer(s)`)}if(!await n._(o.enabled,r)){n.y(`⊘ Template "${o.name}" became disabled after variable/prompt resolution - skipping tasks`);continue}let u=o.tasks??[];u.length>0&&(n.v(`Found ${u.length} task(s) in template "${o.name}" (will execute later)`),i.push(...u))}if(n.v(`
24
+ 🔧 Validating and filtering all collected tasks...`),i.length===0){n.u(`No tasks found in any template`,`info`);return}let o=_t(i);o.length>0&&(yt(o),a.default.exit(1)),console.log(``),n.u(`🛠️ Preparing tasks...`,`info`);let s=[];for(let e of i)await n._(e.enabled,r)&&s.push(e);if(console.log(``),n.u(`Found ${i.length} tasks (${s.length} enabled)`,`info`),n.u(`All tasks validated successfully`,`success`),s.length===0){n.u(`No enabled tasks to execute`,`info`);return}let c=Y(s);if(t.dryRun){n.u(`
25
+ 🔍 Dry run - showing task changes...`,`info`),await j(c,r),n.u(`
26
+ 🔍 Dry run completed - no changes were made`,`info`),n.u(`Run without --dry-run to apply changes`,`info`);return}console.log(``),n.y(`⚙️ Executing tasks...`),console.log(``),await R(`beforeAll`,r);let l=0,u=0,d=[];for(let e=0;e<c.length;e++){let i=c[e];i!=null&&(await R(`beforeTask`,i,r),await J(i,r,e+1,c.length,t.dryRun)?(l++,await R(`afterTask`,i,r)):(await V(i.required,r)&&(u++,d.push(i.name)),await R(`onError`,Error(`Task ${i.name} failed`),i),n.S(`⚠️ Task "${i.name}" failed, continuing with remaining tasks...`)))}await R(`afterAll`,r),u>0&&(n.u(`\n❌ Task execution completed with ${u} error(s)`,`error`),n.u(`Completed: ${l}/${c.length} tasks`,`info`),n.u(`Failed tasks: ${d.join(`, `)}`,`error`),a.default.exit(1)),n.u(`Completed: ${l}/${c.length} tasks`,`success`)}Object.defineProperty(exports,`A`,{enumerable:!0,get:function(){return D}}),Object.defineProperty(exports,`B`,{enumerable:!0,get:function(){return m}}),Object.defineProperty(exports,`C`,{enumerable:!0,get:function(){return fe}}),Object.defineProperty(exports,`D`,{enumerable:!0,get:function(){return ge}}),Object.defineProperty(exports,`E`,{enumerable:!0,get:function(){return ue}}),Object.defineProperty(exports,`F`,{enumerable:!0,get:function(){return E}}),Object.defineProperty(exports,`H`,{enumerable:!0,get:function(){return v}}),Object.defineProperty(exports,`I`,{enumerable:!0,get:function(){return le}}),Object.defineProperty(exports,`L`,{enumerable:!0,get:function(){return C}}),Object.defineProperty(exports,`M`,{enumerable:!0,get:function(){return k}}),Object.defineProperty(exports,`N`,{enumerable:!0,get:function(){return T}}),Object.defineProperty(exports,`O`,{enumerable:!0,get:function(){return j}}),Object.defineProperty(exports,`P`,{enumerable:!0,get:function(){return O}}),Object.defineProperty(exports,`R`,{enumerable:!0,get:function(){return ie}}),Object.defineProperty(exports,`S`,{enumerable:!0,get:function(){return L}}),Object.defineProperty(exports,`T`,{enumerable:!0,get:function(){return F}}),Object.defineProperty(exports,`U`,{enumerable:!0,get:function(){return g}}),Object.defineProperty(exports,`V`,{enumerable:!0,get:function(){return h}}),Object.defineProperty(exports,`W`,{enumerable:!0,get:function(){return _}}),Object.defineProperty(exports,`_`,{enumerable:!0,get:function(){return _e}}),Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return Z}}),Object.defineProperty(exports,`b`,{enumerable:!0,get:function(){return I}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return gt}}),Object.defineProperty(exports,`d`,{enumerable:!0,get:function(){return G}}),Object.defineProperty(exports,`f`,{enumerable:!0,get:function(){return W}}),Object.defineProperty(exports,`g`,{enumerable:!0,get:function(){return pe}}),Object.defineProperty(exports,`h`,{enumerable:!0,get:function(){return R}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return Q}}),Object.defineProperty(exports,`j`,{enumerable:!0,get:function(){return A}}),Object.defineProperty(exports,`k`,{enumerable:!0,get:function(){return w}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return q}}),Object.defineProperty(exports,`m`,{enumerable:!0,get:function(){return H}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return xt}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return X}}),Object.defineProperty(exports,`p`,{enumerable:!0,get:function(){return U}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return $}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return Y}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return bt}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return J}}),Object.defineProperty(exports,`v`,{enumerable:!0,get:function(){return z}}),Object.defineProperty(exports,`w`,{enumerable:!0,get:function(){return me}}),Object.defineProperty(exports,`x`,{enumerable:!0,get:function(){return he}}),Object.defineProperty(exports,`y`,{enumerable:!0,get:function(){return de}}),Object.defineProperty(exports,`z`,{enumerable:!0,get:function(){return ee}});
@@ -0,0 +1 @@
1
+ import"./config-DfRbCqsT.js";import"./template-inheritance-bPw0ciBi.js";import{n as e,t}from"./run-tasks-Bj88BeF9.js";export{t as runTasks,e as runTemplatesSequentially};
@@ -0,0 +1 @@
1
+ require(`./config-DlJs75hK.cjs`),require(`./template-inheritance-CwBAv1Q9.cjs`);const e=require(`./run-tasks-Cgq9q7tb.cjs`);exports.runTasks=e.t,exports.runTemplatesSequentially=e.n;
@@ -0,0 +1 @@
1
+ const e=require(`./chunk-DjWAcSYV.cjs`),t=require(`./template-inheritance-CwBAv1Q9.cjs`),n=require(`./run-tasks-Cgq9q7tb.cjs`);let r=require(`node:process`);r=e.t(r);const i=r.default.argv.includes(`--dry-run`),a=r.default.argv.includes(`--force`);async function o(e){try{let o=e||[];o.length===0&&(t.u(`⚠️ No tasks defined. Use --config to specify tasks or call runWithTasks() programmatically.`,`warn`),t.u(`Example: scaffoldfy --config ./tasks.json`,`info`),r.default.exit(1)),await n.t(o,{dryRun:i,force:a,tasksFilePath:void 0})}catch(e){t.u(`❌ Task execution failed`,`error`),e instanceof Error?(t.u(`Error: ${e.message}`,`error`),r.default.env.DEBUG!=null&&console.error(e.stack)):console.error(e),r.default.exit(1)}}async function s(e,o){try{await n.t(e,{dryRun:o?.dryRun??i,force:o?.force??a,tasksFilePath:o?.tasksFilePath??void 0,...o?.variables!=null&&{variables:o.variables},...o?.prompts!=null&&{prompts:o.prompts},...o?.templateEnabled!=null&&{templateEnabled:o.templateEnabled},...o?.transformers!=null&&{transformers:o.transformers}})}catch(e){t.u(`❌ Task execution failed`,`error`),e instanceof Error?(t.u(`Error: ${e.message}`,`error`),r.default.env.DEBUG!=null&&console.error(e.stack)):console.error(e),r.default.exit(1)}}Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return o}});
@@ -0,0 +1 @@
1
+ import{u as e}from"./template-inheritance-bPw0ciBi.js";import{t}from"./run-tasks-Bj88BeF9.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?.variables!=null&&{variables:o.variables},...o?.prompts!=null&&{prompts:o.prompts},...o?.templateEnabled!=null&&{templateEnabled:o.templateEnabled},...o?.transformers!=null&&{transformers:o.transformers}})}catch(t){e(`❌ Task execution failed`,`error`),t instanceof Error?(e(`Error: ${t.message}`,`error`),n.env.DEBUG!=null&&console.error(t.stack)):console.error(t),n.exit(1)}}export{o as n,a as t};
@@ -0,0 +1 @@
1
+ const e=require(`./chunk-DjWAcSYV.cjs`);let t=require(`node:fs`);t=e.t(t);let n=require(`node:path`);n=e.t(n);let r=require(`node:process`);r=e.t(r);let i=require(`node:util`);i=e.t(i);let a=require(`node:readline`);a=e.t(a),require(`handlebars`);let o=require(`node:child_process`);o=e.t(o);let s=require(`node:os`);s=e.t(s);var c=class extends Error{constructor(e,t){super(e),this.code=t,this.name=this.constructor.name}},l=class e extends c{constructor(e,t,n){super(e,`CIRCULAR_DEPENDENCY`),this.dependencyChain=t,this.resolvedPath=n,this.name=`CircularDependencyError`}static forTemplateInheritance(t,n){let r=Array.from(t);return new e(`Circular dependency detected: ${r.join(` -> `)} -> ${n}`,r,n)}static forTaskDependency(t){return new e(`Circular dependency detected involving task: ${t}`,[t])}static forTemplateDependencies(t,n){let r=[...t,n];return new e(`Circular dependency detected in template dependencies: ${r.join(` -> `)}`,r)}},u=class e extends c{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)}},d=class e extends c{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`)}},f=class e extends c{constructor(e,t){super(e,`TEMPLATE_FILE_NOT_FOUND`),this.filePath=t,this.name=`TemplateFileNotFoundError`}static forPath(t){return new e(`Template file not found: ${t}`,t)}},p=class e extends c{constructor(e,t,n){super(e,`TEMPLATE_FETCH_ERROR`),this.url=t,this.originalError=n,this.name=`TemplateFetchError`}static forUrl(t,n,r){return typeof n==`number`?new e(`Failed to fetch template from ${t}: ${n} ${r??``}`.trim(),t):new e(`Failed to fetch template from ${t}: ${n?.message??String(n??`Unknown error`)}`,t,n)}},m=class e extends c{constructor(e,t,n){super(e,`TEMPLATE_PARSE_ERROR`),this.filePath=t,this.originalError=n,this.name=`TemplateParseError`}static forFile(t,n){return new e(`Failed to parse template file ${t}: ${n.message}`,t,n)}},h=class e extends c{constructor(e,t){super(e,`INVALID_TEMPLATE`),this.filePath=t,this.name=`InvalidTemplateError`}static forFile(t,n){return new e(`Invalid template file ${t}: ${n}`,t)}static tasksNotArray(t){return new e(`Invalid template file ${t}: 'tasks' must be an array if provided`,t)}static missingName(t){return new e(`Invalid template file ${t}: 'name' field is required`,t)}static invalidNameFormat(t,n){return new e(`Invalid template file ${t}: 'name' field "${n}" must contain only lowercase letters, digits, and hyphens. It cannot start or end with a hyphen, and cannot contain consecutive hyphens.`,t)}};function g(e){let t=new Map;for(let n of e){let e=t.get(n.name)||[];e.push(n),t.set(n.name,e)}if(Array.from(t.values()).some(e=>e.length>1))return e;let n=new Map,r=new Map,i=new Map;for(let t of e)if(n.set(t.name,t),i.set(t.name,new Set),t.dependencies!=null&&t.dependencies.length>0)for(let e of t.dependencies)i.get(t.name).add(e),r.has(e)||r.set(e,new Set),r.get(e).add(t.name);let a=new Set,o=new Map;for(let t=0;t<e.length;t++){let n=e[t],s=i.get(n.name).size>0,c=r.has(n.name)&&r.get(n.name).size>0;!s&&!c&&(a.add(n.name),o.set(n.name,t))}let s=e.filter(e=>!a.has(e.name)),c=[],u=new Set,d=new Set;function f(e){if(u.has(e))return;if(d.has(e))throw l.forTemplateDependencies(Array.from(d),e);d.add(e);let t=n.get(e);if(t!=null){let t=i.get(e);if(t!=null&&t.size>0)for(let e of t)f(e)}d.delete(e),u.add(e),t!=null&&!a.has(e)&&c.push(t)}for(let e of s)f(e.name);let p=[],m=0;for(let t=0;t<e.length;t++){let n=e[t];a.has(n.name)?p.push(n):m<c.length&&(p.push(c[m]),m++)}return p}function ee(e,t,n){let r=t.split(`.`),i=e;for(let e=0;e<r.length-1;e++){let t=r[e];t!=null&&t!==``&&((!(t in i)||typeof i[t]!=`object`||i[t]===null)&&(i[t]={}),i=i[t])}let a=r[r.length-1];a!=null&&a!==``&&(i[a]=n)}function te(e,t){let n=t.split(`.`),r=e;for(let e of n)if(e!==``&&typeof r==`object`&&r)r=r[e];else return;return r}let _=!1;function v(e){_=e}const y={debug:`🐛`,info:`ℹ`,success:`✓`,warn:`⚠`,error:`✗`},b={debug:`\x1B[35m`,info:`\x1B[36m`,success:`\x1B[32m`,warn:`\x1B[33m`,error:`\x1B[31m`},x=`\x1B[0m`;function S(e){_&&console.log(`${b.debug}${y.debug} ${e}${x}`)}function ne(e){console.log(`${b.info}${y.info} ${e}${x}`)}function C(e){console.log(`${b.success}${y.success} ${e}${x}`)}function w(e){console.log(`${b.warn}${y.warn} ${e}${x}`)}function T(e,t,n){if(e===void 0)return!0;if(typeof e==`boolean`)return e;if(typeof e==`object`&&`type`in e){if(e.type===`exec`)return n?.lazy===!0;if(e.type===`condition`)return B(e.value,t,n?.lazy===!0?{lazy:!0}:void 0)}return!1}async function E(e,t,n){if(e===void 0)return!0;if(typeof e==`boolean`)return e;if(typeof e==`object`&&`type`in e){if(e.type===`exec`)try{let{execSync:n}=await import(`node:child_process`),{interpolateTemplate:r}=await Promise.resolve().then(()=>require(`./utils-CRe7Fw3m.cjs`)),i=n(r(e.value,t),{encoding:`utf-8`}).trim();if(i===``||i===`0`)return!1;let a=i.toLowerCase();return!(a===`false`||a===`no`)}catch(t){let{log:n}=await Promise.resolve().then(()=>require(`./utils-CRe7Fw3m.cjs`));return n(`Failed to execute enabled command: ${e.value}`,`warn`),t instanceof Error&&n(` Error: ${t.message}`,`warn`),!1}if(e.type===`condition`)return B(e.value,t,n?.lazy===!0?{lazy:!0}:void 0)}return!1}function D(e){try{let t=new URL(e);return t.protocol===`http:`||t.protocol===`https:`}catch{return!1}}function O(e,t){if(D(e))return e;if(t==null||t===``)return n.default.isAbsolute(e)?e:n.default.resolve(r.default.cwd(),e);if(D(t))try{let n=new URL(`.`,t);return new URL(e,n).href}catch{throw Error(`Failed to resolve file path '${e}' relative to source URL '${t}'`)}let i=n.default.dirname(t);return n.default.isAbsolute(e)?e:n.default.resolve(i,e)}function k(e){switch(n.default.extname(e).toLowerCase()){case`.js`:case`.cjs`:case`.mjs`:return`node`;case`.sh`:return`bash`;case`.bash`:return`bash`;case`.ps1`:return`pwsh`;default:return}}function A(e,t){switch(e){case`node`:return`node "${t}"`;case`bash`:return`bash "${t}"`;case`sh`:return`sh "${t}"`;case`pwsh`:return`pwsh -File "${t}"`;case`powershell`:return`powershell -File "${t}"`;default:return`node "${t}"`}}function j(e){switch(e){case`node`:return`.js`;case`bash`:case`sh`:return`.sh`;case`pwsh`:case`powershell`:return`.ps1`;default:return`.js`}}function M(e){try{let t=new URL(e);return t.protocol===`http:`||t.protocol===`https:`}catch{return!1}}async function N(e,i){let a=z(e.file,i),c=e.args?.map(e=>z(e,i))??[],l={};if(e.parameters)for(let[t,n]of Object.entries(e.parameters))l[t]=z(n,i);let u=e.cwd!=null&&e.cwd!==``?n.default.join(r.default.cwd(),z(e.cwd,i)):r.default.cwd(),d,f,p=!1;if(M(a)){S(`Fetching remote script: ${a}`),f=await W(a),p=!0;let r=e.runtime??k(a)??`node`;!e.runtime&&!k(a)&&R(`Could not detect runtime from file extension, defaulting to 'node'`,`warn`);let i=s.default.tmpdir(),o=`scaffoldfy-exec-${Date.now()}${j(r)}`;d=n.default.join(i,o),t.default.writeFileSync(d,f,`utf-8`)}else{if(d=O(a,e.sourceUrl),!t.default.existsSync(d))throw Error(`Script file not found: ${d}`);S(`Using local script: ${d}`)}let m=e.runtime??k(d)??`node`;!e.runtime&&!k(d)&&R(`Could not detect runtime from file extension, defaulting to 'node'`,`warn`);try{let t=A(m,d),n=c.join(` `),i=n?`${t} ${n}`:t;S(`Executing: ${i}`);let a=(0,o.execSync)(i,{cwd:u,stdio:e.captureOutput?[`pipe`,`pipe`,`pipe`]:`inherit`,env:{...r.default.env,...l},encoding:e.captureOutput?`utf-8`:void 0});if(e.captureOutput)return S(`Script executed successfully with output`),typeof a==`string`?a:void 0;S(`Script executed successfully`);return}finally{if(p&&t.default.existsSync(d))try{t.default.unlinkSync(d)}catch(e){R(`Warning: Failed to clean up temporary file: ${e instanceof Error?e.message:String(e)}`,`warn`)}}}async function P(e,t){let{id:n,contextType:r,context:i,sourceUrl:a}=t;if(e==null)return;if(typeof e!=`object`||!e||Array.isArray(e))return e;let s=e;if(s.type===`conditional`){if(!i){R(`${r} "${n}": conditional value requires context but none provided`,`warn`);return}if(typeof s.condition!=`string`){R(`${r} "${n}": conditional value must have a string condition`,`error`);return}try{let e=B(s.condition,i)?s.ifTrue:s.ifFalse;return typeof e==`object`&&e?await P(e,t):e}catch(e){R(`${r} "${n}": failed to evaluate conditional value: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}if(s.type===`exec`){let e=s.value;if(typeof e!=`string`){R(`${r} "${n}": exec value must have a string command`,`error`);return}try{return F((0,o.execSync)(e,{encoding:`utf-8`,stdio:[`pipe`,`pipe`,`pipe`],timeout:1e4}).trim())}catch(e){R(`${r} "${n}": failed to execute command: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}if(s.type===`exec-file`){let e=s;if(typeof e.file!=`string`){R(`${r} "${n}": exec-file value must have a file path`,`error`);return}try{let t=await N({file:e.file,...e.runtime!=null&&e.runtime.trim()!==``&&{runtime:e.runtime},...e.args&&{args:e.args},...e.parameters&&{parameters:e.parameters},...e.cwd!==void 0&&e.cwd.trim()!==``&&{cwd:e.cwd},...a!=null&&{sourceUrl:a},captureOutput:!0},i??{});return t===void 0?void 0:F(t.trim())}catch(e){R(`${r} "${n}": failed to execute script file: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}if(s.type===`static`)return s.value;if(s.type===`interpolate`){let e=s.value;if(typeof e!=`string`){R(`${r} "${n}": interpolate value must be a string with {{variable}} placeholders`,`error`);return}if(!i)return R(`${r} "${n}": interpolate value requires context but none provided`,`warn`),e;try{return z(e,i)}catch(t){return R(`${r} "${n}": failed to interpolate value: ${t instanceof Error?t.message:`Unknown error`}`,`warn`),e}}if(s.type!==void 0){R(`${r} "${n}": unknown value type "${s.type}". Expected "static", "exec", "exec-file", "conditional", or "interpolate".`,`error`);return}return e}function F(e){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}async function I(e,t){let n=a.default.createInterface({input:r.default.stdin,output:r.default.stdout});return new Promise(r=>{let i;i=t==null?`${e}: `:`${e} (${t}): `,n.question(i,e=>{n.close(),r(e.trim()||(t??``))})})}async function L(e,t=!1){return I(`${e} (${t?`Y/n`:`y/N`})`,t?`y`:`n`).then(e=>e.toLowerCase()===`y`||e.toLowerCase()===`yes`)}function R(e,t=`info`){console.log(`${{info:`\x1B[36m`,success:`\x1B[32m`,error:`\x1B[31m`,warn:`\x1B[33m`}[t]}${{info:`ℹ`,success:`✓`,error:`✗`,warn:`⚠`}[t]} ${e}`)}function z(e,t){return e.replace(/\{\{(?<key>[\w.]+)\}\}/gu,(e,n)=>te(t,n)?.toString()??``)}function B(e,t,n){try{let n={...t};return Function(...Object.keys(n),`'use strict'; return (${e})`)(...Object.values(n))}catch(t){return n?.lazy===!0&&t instanceof ReferenceError?!0:(n?.silent!==!0&&(R(`Failed to evaluate condition: ${e}`,`warn`),t instanceof Error&&R(` Error: ${t.message}`,`warn`)),!1)}}const V=(0,i.promisify)(t.default.readFile),H={template:[[`template`,`templateFile`]]};function U(e){if(e==null||e===``)return`current template`;if(D(e))return e;let t=r.default.cwd();return e.startsWith(t)?n.default.relative(t,e):e}async function W(e){if(D(e))return G(e);if(!t.default.existsSync(e))throw f.forPath(e);return V(e,`utf-8`)}async function G(e){try{let t=await fetch(e);if(!t.ok)throw p.forUrl(e,t.status,t.statusText);return await t.text()}catch(t){throw t instanceof Error&&t.message.includes(`Failed to fetch`)?t:p.forUrl(e,t instanceof Error?t:void 0)}}const K=new Map;async function q(e,i=new Set){let a=D(e),o;if(o=a||n.default.isAbsolute(e)?e:n.default.resolve(r.default.cwd(),e),K.has(o))return K.get(o);if(i.has(o))throw l.forTemplateInheritance(i,o);i.add(o);let s;if(a)s=await G(o);else{if(!t.default.existsSync(o))throw f.forPath(o);s=await V(o,`utf-8`)}let c;try{c=JSON.parse(s)}catch(e){throw m.forFile(o,e instanceof Error?e:Error(String(e)))}if(c.name==null||c.name.trim()===``)throw h.missingName(o);if(!/^[a-z\d]+(?:-[a-z\d]+)*$/u.test(c.name))throw h.invalidNameFormat(o,c.name);if(c.tasks!==void 0&&!Array.isArray(c.tasks))throw h.tasksNotArray(o);c.tasks===void 0&&(c.tasks=[]);for(let e of c.tasks)e.$sourceUrl=o;if(c.variables!==void 0)for(let e of c.variables)e.$sourceUrl=o;if(c.prompts!==void 0)for(let e of c.prompts)e.$sourceUrl=o;return K.set(o,c),c}async function J(e,t,i,a,o){let s=D(e),c;if(c=s||n.default.isAbsolute(e)?e:t==null?n.default.resolve(r.default.cwd(),e):D(t)?new URL(e,t).href:n.default.resolve(t,e),i.has(c))return;if(a.has(c))throw l.forTemplateInheritance(a,c);a.add(c);let u=await q(c),d=D(c)?new URL(`.`,c).href:n.default.dirname(c);if(u.extends!=null&&u.extends!==``){let e=Array.isArray(u.extends)?u.extends:[u.extends];for(let t of e)await J(t,d,i,a,o)}a.delete(c),i.add(c),o.push(u)}async function Y(e,t,n=new Set){let r=[];return await J(e,t,n,new Set,r),g(r)}async function X(e,t,n=new Set){return $(await Y(e,t,n))}function Z(e,t,n){let r=new Map;for(let t of e){if(r.has(t.id))throw u.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 u.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 u.forId(e.id,`prompt`,r.get(e.id));r.set(e.id,`prompt`)}}function re(e,t){if((t.override??`merge`)===`replace`){R(` → Variable "${t.id}" using 'replace' strategy`,`info`);let{override:e,...n}=t;return n}R(` → Variable "${t.id}" merged (value replaced)`,`info`);let n=t.$sourceUrl??e.$sourceUrl,r={...e,...t,...n!=null&&{$sourceUrl:n}};return delete r.override,r}function Q(e,t){if((t.override??`merge`)===`replace`){R(` → Prompt "${t.id}" using 'replace' strategy`,`info`);let{override:e,...n}=t;return n}R(` → Prompt "${t.id}" merged`,`info`);let n=t.$sourceUrl??e.$sourceUrl,r={...e,...t,...n!=null&&{$sourceUrl:n}};return delete r.override,r}function $(e){if(e.length===0)return{name:`Empty Template`,tasks:[]};if(e.length===1){let t=e[0];return Z(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){R(`⊘ 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 d.forPrompt(e.id);let t=Q(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 d.forVariable(e.id);let t=re(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 d.forTask(e.id,U(n.$sourceUrl),U(e.$sourceUrl))}let n=oe(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,s=n.size>0?Array.from(n.values()):void 0;Z(a,s,o);let c=e[e.length-1],l={name:c.name,tasks:a};return c.description!=null&&(l.description=c.description),c.dependencies!=null&&(l.dependencies=c.dependencies),c.enabled!=null&&(l.enabled=c.enabled),o!=null&&(l.prompts=o),s!=null&&(l.variables=s),l}function ie(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 ae(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 oe(e,t){if((t.override??`merge`)===`replace`){R(` → Task "${t.id}" using 'replace' strategy - completely replacing base task`,`info`),R(` Base: ${U(e.$sourceUrl)}`,`info`),R(` Override: ${U(t.$sourceUrl)}`,`info`);let{override:n,...r}=t;return r}R(` → Merging task "${t.id}"`,`info`),R(` Base: ${U(e.$sourceUrl)}`,`info`),R(` Override: ${U(t.$sourceUrl)}`,`info`);let n;if(typeof e.config==`object`&&e.config!==null&&typeof t.config==`object`&&t.config!==null){n=ae(e.config,t.config,t.type);let r=ie(t.type,n);r!==null&&r.length>0&&(R(` ⚠️ Warning: Conflicting config fields detected: ${r.join(`, `)}`,`warn`),R(` 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(S(`Loading tasks from ${e}...`),t?.sequential===!0){let t=await Y(e);return S(`Loaded ${t.length} template(s) for processing`),{tasks:[],templates:t}}let n=await X(e);R(`Loaded ${n.tasks?.length??0} task(s)`,`info`),n.extends!=null&&n.extends!==``&&R(`Extended from: ${(Array.isArray(n.extends)?n.extends:[n.extends]).join(`, `)}`,`info`),n.prompts!=null&&n.prompts.length>0&&R(`Found ${n.prompts.length} top-level prompt(s)`,`info`),n.variables!=null&&n.variables.length>0&&R(`Found ${n.variables.length} top-level variable(s)`,`info`);let 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),n.transformers!=null&&(r.transformers=n.transformers),r}Object.defineProperty(exports,`C`,{enumerable:!0,get:function(){return ee}}),Object.defineProperty(exports,`S`,{enumerable:!0,get:function(){return w}}),Object.defineProperty(exports,`T`,{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,`_`,{enumerable:!0,get:function(){return E}}),Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return q}}),Object.defineProperty(exports,`b`,{enumerable:!0,get:function(){return v}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return B}}),Object.defineProperty(exports,`d`,{enumerable:!0,get:function(){return I}}),Object.defineProperty(exports,`f`,{enumerable:!0,get:function(){return L}}),Object.defineProperty(exports,`g`,{enumerable:!0,get:function(){return T}}),Object.defineProperty(exports,`h`,{enumerable:!0,get:function(){return O}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return ce}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return z}}),Object.defineProperty(exports,`m`,{enumerable:!0,get:function(){return N}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return W}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return Y}}),Object.defineProperty(exports,`p`,{enumerable:!0,get:function(){return P}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return X}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return $}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return se}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return R}}),Object.defineProperty(exports,`v`,{enumerable:!0,get:function(){return S}}),Object.defineProperty(exports,`w`,{enumerable:!0,get:function(){return l}}),Object.defineProperty(exports,`x`,{enumerable:!0,get:function(){return C}}),Object.defineProperty(exports,`y`,{enumerable:!0,get:function(){return ne}});
@@ -0,0 +1 @@
1
+ import e from"node:path";import t from"node:fs";import n from"node:process";import{promisify as r}from"node:util";import i from"node:readline";import"handlebars";import{execSync as a}from"node:child_process";import o from"node:os";var s=class extends Error{constructor(e,t){super(e),this.code=t,this.name=this.constructor.name}},c=class e extends s{constructor(e,t,n){super(e,`CIRCULAR_DEPENDENCY`),this.dependencyChain=t,this.resolvedPath=n,this.name=`CircularDependencyError`}static forTemplateInheritance(t,n){let r=Array.from(t);return new e(`Circular dependency detected: ${r.join(` -> `)} -> ${n}`,r,n)}static forTaskDependency(t){return new e(`Circular dependency detected involving task: ${t}`,[t])}static forTemplateDependencies(t,n){let r=[...t,n];return new e(`Circular dependency detected in template dependencies: ${r.join(` -> `)}`,r)}},l=class e extends s{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)}},u=class e extends s{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`)}},d=class e extends s{constructor(e,t){super(e,`TEMPLATE_FILE_NOT_FOUND`),this.filePath=t,this.name=`TemplateFileNotFoundError`}static forPath(t){return new e(`Template file not found: ${t}`,t)}},f=class e extends s{constructor(e,t,n){super(e,`TEMPLATE_FETCH_ERROR`),this.url=t,this.originalError=n,this.name=`TemplateFetchError`}static forUrl(t,n,r){return typeof n==`number`?new e(`Failed to fetch template from ${t}: ${n} ${r??``}`.trim(),t):new e(`Failed to fetch template from ${t}: ${n?.message??String(n??`Unknown error`)}`,t,n)}},p=class e extends s{constructor(e,t,n){super(e,`TEMPLATE_PARSE_ERROR`),this.filePath=t,this.originalError=n,this.name=`TemplateParseError`}static forFile(t,n){return new e(`Failed to parse template file ${t}: ${n.message}`,t,n)}},m=class e extends s{constructor(e,t){super(e,`INVALID_TEMPLATE`),this.filePath=t,this.name=`InvalidTemplateError`}static forFile(t,n){return new e(`Invalid template file ${t}: ${n}`,t)}static tasksNotArray(t){return new e(`Invalid template file ${t}: 'tasks' must be an array if provided`,t)}static missingName(t){return new e(`Invalid template file ${t}: 'name' field is required`,t)}static invalidNameFormat(t,n){return new e(`Invalid template file ${t}: 'name' field "${n}" must contain only lowercase letters, digits, and hyphens. It cannot start or end with a hyphen, and cannot contain consecutive hyphens.`,t)}};function ee(e){let t=new Map;for(let n of e){let e=t.get(n.name)||[];e.push(n),t.set(n.name,e)}if(Array.from(t.values()).some(e=>e.length>1))return e;let n=new Map,r=new Map,i=new Map;for(let t of e)if(n.set(t.name,t),i.set(t.name,new Set),t.dependencies!=null&&t.dependencies.length>0)for(let e of t.dependencies)i.get(t.name).add(e),r.has(e)||r.set(e,new Set),r.get(e).add(t.name);let a=new Set,o=new Map;for(let t=0;t<e.length;t++){let n=e[t],s=i.get(n.name).size>0,c=r.has(n.name)&&r.get(n.name).size>0;!s&&!c&&(a.add(n.name),o.set(n.name,t))}let s=e.filter(e=>!a.has(e.name)),l=[],u=new Set,d=new Set;function f(e){if(u.has(e))return;if(d.has(e))throw c.forTemplateDependencies(Array.from(d),e);d.add(e);let t=n.get(e);if(t!=null){let t=i.get(e);if(t!=null&&t.size>0)for(let e of t)f(e)}d.delete(e),u.add(e),t!=null&&!a.has(e)&&l.push(t)}for(let e of s)f(e.name);let p=[],m=0;for(let t=0;t<e.length;t++){let n=e[t];a.has(n.name)?p.push(n):m<l.length&&(p.push(l[m]),m++)}return p}function h(e,t,n){let r=t.split(`.`),i=e;for(let e=0;e<r.length-1;e++){let t=r[e];t!=null&&t!==``&&((!(t in i)||typeof i[t]!=`object`||i[t]===null)&&(i[t]={}),i=i[t])}let a=r[r.length-1];a!=null&&a!==``&&(i[a]=n)}function g(e,t){let n=t.split(`.`),r=e;for(let e of n)if(e!==``&&typeof r==`object`&&r)r=r[e];else return;return r}let _=!1;function v(e){_=e}const y={debug:`🐛`,info:`ℹ`,success:`✓`,warn:`⚠`,error:`✗`},b={debug:`\x1B[35m`,info:`\x1B[36m`,success:`\x1B[32m`,warn:`\x1B[33m`,error:`\x1B[31m`},x=`\x1B[0m`;function S(e){_&&console.log(`${b.debug}${y.debug} ${e}${x}`)}function C(e){console.log(`${b.info}${y.info} ${e}${x}`)}function w(e){console.log(`${b.success}${y.success} ${e}${x}`)}function T(e){console.log(`${b.warn}${y.warn} ${e}${x}`)}function E(e,t,n){if(e===void 0)return!0;if(typeof e==`boolean`)return e;if(typeof e==`object`&&`type`in e){if(e.type===`exec`)return n?.lazy===!0;if(e.type===`condition`)return V(e.value,t,n?.lazy===!0?{lazy:!0}:void 0)}return!1}async function D(e,t,n){if(e===void 0)return!0;if(typeof e==`boolean`)return e;if(typeof e==`object`&&`type`in e){if(e.type===`exec`)try{let{execSync:n}=await import(`node:child_process`),{interpolateTemplate:r}=await import(`./utils-Bj8gkhe3.js`),i=n(r(e.value,t),{encoding:`utf-8`}).trim();if(i===``||i===`0`)return!1;let a=i.toLowerCase();return!(a===`false`||a===`no`)}catch(t){let{log:n}=await import(`./utils-Bj8gkhe3.js`);return n(`Failed to execute enabled command: ${e.value}`,`warn`),t instanceof Error&&n(` Error: ${t.message}`,`warn`),!1}if(e.type===`condition`)return V(e.value,t,n?.lazy===!0?{lazy:!0}:void 0)}return!1}function O(e){try{let t=new URL(e);return t.protocol===`http:`||t.protocol===`https:`}catch{return!1}}function k(t,r){if(O(t))return t;if(r==null||r===``)return e.isAbsolute(t)?t:e.resolve(n.cwd(),t);if(O(r))try{let e=new URL(`.`,r);return new URL(t,e).href}catch{throw Error(`Failed to resolve file path '${t}' relative to source URL '${r}'`)}let i=e.dirname(r);return e.isAbsolute(t)?t:e.resolve(i,t)}function A(t){switch(e.extname(t).toLowerCase()){case`.js`:case`.cjs`:case`.mjs`:return`node`;case`.sh`:return`bash`;case`.bash`:return`bash`;case`.ps1`:return`pwsh`;default:return}}function j(e,t){switch(e){case`node`:return`node "${t}"`;case`bash`:return`bash "${t}"`;case`sh`:return`sh "${t}"`;case`pwsh`:return`pwsh -File "${t}"`;case`powershell`:return`powershell -File "${t}"`;default:return`node "${t}"`}}function M(e){switch(e){case`node`:return`.js`;case`bash`:case`sh`:return`.sh`;case`pwsh`:case`powershell`:return`.ps1`;default:return`.js`}}function N(e){try{let t=new URL(e);return t.protocol===`http:`||t.protocol===`https:`}catch{return!1}}async function P(r,i){let s=B(r.file,i),c=r.args?.map(e=>B(e,i))??[],l={};if(r.parameters)for(let[e,t]of Object.entries(r.parameters))l[e]=B(t,i);let u=r.cwd!=null&&r.cwd!==``?e.join(n.cwd(),B(r.cwd,i)):n.cwd(),d,f,p=!1;if(N(s)){S(`Fetching remote script: ${s}`),f=await G(s),p=!0;let n=r.runtime??A(s)??`node`;!r.runtime&&!A(s)&&z(`Could not detect runtime from file extension, defaulting to 'node'`,`warn`);let i=o.tmpdir(),a=`scaffoldfy-exec-${Date.now()}${M(n)}`;d=e.join(i,a),t.writeFileSync(d,f,`utf-8`)}else{if(d=k(s,r.sourceUrl),!t.existsSync(d))throw Error(`Script file not found: ${d}`);S(`Using local script: ${d}`)}let m=r.runtime??A(d)??`node`;!r.runtime&&!A(d)&&z(`Could not detect runtime from file extension, defaulting to 'node'`,`warn`);try{let e=j(m,d),t=c.join(` `),i=t?`${e} ${t}`:e;S(`Executing: ${i}`);let o=a(i,{cwd:u,stdio:r.captureOutput?[`pipe`,`pipe`,`pipe`]:`inherit`,env:{...n.env,...l},encoding:r.captureOutput?`utf-8`:void 0});if(r.captureOutput)return S(`Script executed successfully with output`),typeof o==`string`?o:void 0;S(`Script executed successfully`);return}finally{if(p&&t.existsSync(d))try{t.unlinkSync(d)}catch(e){z(`Warning: Failed to clean up temporary file: ${e instanceof Error?e.message:String(e)}`,`warn`)}}}async function F(e,t){let{id:n,contextType:r,context:i,sourceUrl:o}=t;if(e==null)return;if(typeof e!=`object`||!e||Array.isArray(e))return e;let s=e;if(s.type===`conditional`){if(!i){z(`${r} "${n}": conditional value requires context but none provided`,`warn`);return}if(typeof s.condition!=`string`){z(`${r} "${n}": conditional value must have a string condition`,`error`);return}try{let e=V(s.condition,i)?s.ifTrue:s.ifFalse;return typeof e==`object`&&e?await F(e,t):e}catch(e){z(`${r} "${n}": failed to evaluate conditional value: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}if(s.type===`exec`){let e=s.value;if(typeof e!=`string`){z(`${r} "${n}": exec value must have a string command`,`error`);return}try{return I(a(e,{encoding:`utf-8`,stdio:[`pipe`,`pipe`,`pipe`],timeout:1e4}).trim())}catch(e){z(`${r} "${n}": failed to execute command: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}if(s.type===`exec-file`){let e=s;if(typeof e.file!=`string`){z(`${r} "${n}": exec-file value must have a file path`,`error`);return}try{let t=await P({file:e.file,...e.runtime!=null&&e.runtime.trim()!==``&&{runtime:e.runtime},...e.args&&{args:e.args},...e.parameters&&{parameters:e.parameters},...e.cwd!==void 0&&e.cwd.trim()!==``&&{cwd:e.cwd},...o!=null&&{sourceUrl:o},captureOutput:!0},i??{});return t===void 0?void 0:I(t.trim())}catch(e){z(`${r} "${n}": failed to execute script file: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}if(s.type===`static`)return s.value;if(s.type===`interpolate`){let e=s.value;if(typeof e!=`string`){z(`${r} "${n}": interpolate value must be a string with {{variable}} placeholders`,`error`);return}if(!i)return z(`${r} "${n}": interpolate value requires context but none provided`,`warn`),e;try{return B(e,i)}catch(t){return z(`${r} "${n}": failed to interpolate value: ${t instanceof Error?t.message:`Unknown error`}`,`warn`),e}}if(s.type!==void 0){z(`${r} "${n}": unknown value type "${s.type}". Expected "static", "exec", "exec-file", "conditional", or "interpolate".`,`error`);return}return e}function I(e){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}async function L(e,t){let r=i.createInterface({input:n.stdin,output:n.stdout});return new Promise(n=>{let i;i=t==null?`${e}: `:`${e} (${t}): `,r.question(i,e=>{r.close(),n(e.trim()||(t??``))})})}async function R(e,t=!1){return L(`${e} (${t?`Y/n`:`y/N`})`,t?`y`:`n`).then(e=>e.toLowerCase()===`y`||e.toLowerCase()===`yes`)}function z(e,t=`info`){console.log(`${{info:`\x1B[36m`,success:`\x1B[32m`,error:`\x1B[31m`,warn:`\x1B[33m`}[t]}${{info:`ℹ`,success:`✓`,error:`✗`,warn:`⚠`}[t]} ${e}`)}function B(e,t){return e.replace(/\{\{(?<key>[\w.]+)\}\}/gu,(e,n)=>g(t,n)?.toString()??``)}function V(e,t,n){try{let n={...t};return Function(...Object.keys(n),`'use strict'; return (${e})`)(...Object.values(n))}catch(t){return n?.lazy===!0&&t instanceof ReferenceError?!0:(n?.silent!==!0&&(z(`Failed to evaluate condition: ${e}`,`warn`),t instanceof Error&&z(` Error: ${t.message}`,`warn`)),!1)}}const H=r(t.readFile),U={template:[[`template`,`templateFile`]]};function W(t){if(t==null||t===``)return`current template`;if(O(t))return t;let r=n.cwd();return t.startsWith(r)?e.relative(r,t):t}async function G(e){if(O(e))return K(e);if(!t.existsSync(e))throw d.forPath(e);return H(e,`utf-8`)}async function K(e){try{let t=await fetch(e);if(!t.ok)throw f.forUrl(e,t.status,t.statusText);return await t.text()}catch(t){throw t instanceof Error&&t.message.includes(`Failed to fetch`)?t:f.forUrl(e,t instanceof Error?t:void 0)}}const q=new Map;async function J(r,i=new Set){let a=O(r),o;if(o=a||e.isAbsolute(r)?r:e.resolve(n.cwd(),r),q.has(o))return q.get(o);if(i.has(o))throw c.forTemplateInheritance(i,o);i.add(o);let s;if(a)s=await K(o);else{if(!t.existsSync(o))throw d.forPath(o);s=await H(o,`utf-8`)}let l;try{l=JSON.parse(s)}catch(e){throw p.forFile(o,e instanceof Error?e:Error(String(e)))}if(l.name==null||l.name.trim()===``)throw m.missingName(o);if(!/^[a-z\d]+(?:-[a-z\d]+)*$/u.test(l.name))throw m.invalidNameFormat(o,l.name);if(l.tasks!==void 0&&!Array.isArray(l.tasks))throw m.tasksNotArray(o);l.tasks===void 0&&(l.tasks=[]);for(let e of l.tasks)e.$sourceUrl=o;if(l.variables!==void 0)for(let e of l.variables)e.$sourceUrl=o;if(l.prompts!==void 0)for(let e of l.prompts)e.$sourceUrl=o;return q.set(o,l),l}async function Y(t,r,i,a,o){let s=O(t),l;if(l=s||e.isAbsolute(t)?t:r==null?e.resolve(n.cwd(),t):O(r)?new URL(t,r).href:e.resolve(r,t),i.has(l))return;if(a.has(l))throw c.forTemplateInheritance(a,l);a.add(l);let u=await J(l),d=O(l)?new URL(`.`,l).href:e.dirname(l);if(u.extends!=null&&u.extends!==``){let e=Array.isArray(u.extends)?u.extends:[u.extends];for(let t of e)await Y(t,d,i,a,o)}a.delete(l),i.add(l),o.push(u)}async function X(e,t,n=new Set){let r=[];return await Y(e,t,n,new Set,r),ee(r)}async function Z(e,t,n=new Set){return $(await X(e,t,n))}function Q(e,t,n){let r=new Map;for(let t of e){if(r.has(t.id))throw l.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 l.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 l.forId(e.id,`prompt`,r.get(e.id));r.set(e.id,`prompt`)}}function te(e,t){if((t.override??`merge`)===`replace`){z(` → Variable "${t.id}" using 'replace' strategy`,`info`);let{override:e,...n}=t;return n}z(` → Variable "${t.id}" merged (value replaced)`,`info`);let n=t.$sourceUrl??e.$sourceUrl,r={...e,...t,...n!=null&&{$sourceUrl:n}};return delete r.override,r}function ne(e,t){if((t.override??`merge`)===`replace`){z(` → Prompt "${t.id}" using 'replace' strategy`,`info`);let{override:e,...n}=t;return n}z(` → Prompt "${t.id}" merged`,`info`);let n=t.$sourceUrl??e.$sourceUrl,r={...e,...t,...n!=null&&{$sourceUrl:n}};return delete r.override,r}function $(e){if(e.length===0)return{name:`Empty Template`,tasks:[]};if(e.length===1){let t=e[0];return Q(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){z(`⊘ 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 u.forPrompt(e.id);let t=ne(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 u.forVariable(e.id);let t=te(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 u.forTask(e.id,W(n.$sourceUrl),W(e.$sourceUrl))}let n=ae(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,s=n.size>0?Array.from(n.values()):void 0;Q(a,s,o);let c=e[e.length-1],l={name:c.name,tasks:a};return c.description!=null&&(l.description=c.description),c.dependencies!=null&&(l.dependencies=c.dependencies),c.enabled!=null&&(l.enabled=c.enabled),o!=null&&(l.prompts=o),s!=null&&(l.variables=s),l}function re(e,t){let n=U[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 ie(e,t,n){let r={...e},i=U[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 ae(e,t){if((t.override??`merge`)===`replace`){z(` → Task "${t.id}" using 'replace' strategy - completely replacing base task`,`info`),z(` Base: ${W(e.$sourceUrl)}`,`info`),z(` Override: ${W(t.$sourceUrl)}`,`info`);let{override:n,...r}=t;return r}z(` → Merging task "${t.id}"`,`info`),z(` Base: ${W(e.$sourceUrl)}`,`info`),z(` Override: ${W(t.$sourceUrl)}`,`info`);let n;if(typeof e.config==`object`&&e.config!==null&&typeof t.config==`object`&&t.config!==null){n=ie(e.config,t.config,t.type);let r=re(t.type,n);r!==null&&r.length>0&&(z(` ⚠️ Warning: Conflicting config fields detected: ${r.join(`, `)}`,`warn`),z(` 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 oe(){q.clear()}async function se(e,t){if(S(`Loading tasks from ${e}...`),t?.sequential===!0){let t=await X(e);return S(`Loaded ${t.length} template(s) for processing`),{tasks:[],templates:t}}let n=await Z(e);z(`Loaded ${n.tasks?.length??0} task(s)`,`info`),n.extends!=null&&n.extends!==``&&z(`Extended from: ${(Array.isArray(n.extends)?n.extends:[n.extends]).join(`, `)}`,`info`),n.prompts!=null&&n.prompts.length>0&&z(`Found ${n.prompts.length} top-level prompt(s)`,`info`),n.variables!=null&&n.variables.length>0&&z(`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),n.transformers!=null&&(r.transformers=n.transformers),r}export{h as C,T as S,s as T,D as _,J as a,v as b,V as c,L as d,R as f,E as g,k as h,se as i,B as l,P as m,G as n,X as o,F as p,Z as r,$ as s,oe as t,z as u,S as v,c as w,w as x,C as y};
@@ -0,0 +1 @@
1
+ import{S as e,_ as t,c as n,d as r,f as i,g as a,l as o,p as s,u as c,v as l,x as u,y as d}from"./template-inheritance-bPw0ciBi.js";export{l as debug,n as evaluateCondition,a as evaluateEnabled,t as evaluateEnabledAsync,o as interpolateTemplate,c as log,d as logInfo,u as logSuccess,e as logWarn,r as prompt,i as promptYesNo,s as resolveValue};
@@ -0,0 +1 @@
1
+ const e=require(`./template-inheritance-CwBAv1Q9.cjs`);exports.debug=e.v,exports.evaluateCondition=e.c,exports.evaluateEnabled=e.g,exports.evaluateEnabledAsync=e._,exports.interpolateTemplate=e.l,exports.log=e.u,exports.logInfo=e.y,exports.logSuccess=e.x,exports.logWarn=e.S,exports.prompt=e.d,exports.promptYesNo=e.f,exports.resolveValue=e.p;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@pixpilot/scaffoldfy",
3
3
  "type": "module",
4
- "version": "0.34.0",
4
+ "version": "0.36.0",
5
5
  "author": "PixPilot <m.doaie@hotmail.com>",
6
6
  "license": "MIT",
7
7
  "repository": {
@@ -51,8 +51,8 @@
51
51
  "@internal/eslint-config": "0.3.0",
52
52
  "@internal/tsconfig": "0.1.0",
53
53
  "@internal/prettier-config": "0.0.1",
54
- "@internal/vitest-config": "0.1.0",
55
- "@internal/tsdown-config": "0.1.0"
54
+ "@internal/tsdown-config": "0.1.0",
55
+ "@internal/vitest-config": "0.1.0"
56
56
  },
57
57
  "prettier": "@internal/prettier-config",
58
58
  "scripts": {
@@ -98,6 +98,7 @@
98
98
  "rename",
99
99
  "git-init",
100
100
  "exec",
101
+ "exec-file",
101
102
  "move",
102
103
  "copy",
103
104
  "append",
@@ -165,6 +166,12 @@
165
166
  "config": { "$ref": "#/$defs/config-exec" }
166
167
  }
167
168
  },
169
+ {
170
+ "properties": {
171
+ "type": { "const": "exec-file" },
172
+ "config": { "$ref": "#/$defs/config-exec-file" }
173
+ }
174
+ },
168
175
  {
169
176
  "properties": {
170
177
  "type": { "const": "move" },
@@ -218,7 +225,7 @@
218
225
  "description": "Built-in transformer ID"
219
226
  },
220
227
  "valueConfig": {
221
- "description": "Configuration for a value that can be static, dynamic, or conditional. Supports static primitives, command execution, interpolation with {{variable}} placeholders, or conditional evaluation.",
228
+ "description": "Configuration for a value that can be static, dynamic, or conditional. Supports static primitives, command execution, script file execution, interpolation with {{variable}} placeholders, or conditional evaluation.",
222
229
  "oneOf": [
223
230
  {
224
231
  "type": ["string", "number", "boolean"],
@@ -267,6 +274,42 @@
267
274
  }
268
275
  ]
269
276
  },
277
+ {
278
+ "type": "object",
279
+ "description": "Exec-file value configuration - execute a script file and return its output",
280
+ "required": ["type", "file"],
281
+ "additionalProperties": false,
282
+ "properties": {
283
+ "type": {
284
+ "type": "string",
285
+ "enum": ["exec-file"],
286
+ "description": "Type of value configuration. 'exec-file' for script file execution."
287
+ },
288
+ "file": {
289
+ "type": "string",
290
+ "description": "Path to script file (local or remote URL). Supports {{variable}} interpolation. Runtime will be auto-detected from file extension (.js/.cjs/.mjs -> node, .sh/.bash -> bash, .ps1 -> pwsh)."
291
+ },
292
+ "runtime": {
293
+ "type": "string",
294
+ "enum": ["node", "bash", "sh", "pwsh", "powershell"],
295
+ "description": "Runtime to execute the file with. If not specified, will be auto-detected from file extension."
296
+ },
297
+ "args": {
298
+ "type": "array",
299
+ "items": { "type": "string" },
300
+ "description": "Arguments to pass to the script. Each supports {{variable}} interpolation."
301
+ },
302
+ "parameters": {
303
+ "type": "object",
304
+ "additionalProperties": { "type": "string" },
305
+ "description": "Environment variables to pass to the script. Values support {{variable}} interpolation."
306
+ },
307
+ "cwd": {
308
+ "type": "string",
309
+ "description": "Working directory for script execution. Supports {{variable}} interpolation."
310
+ }
311
+ }
312
+ },
270
313
  {
271
314
  "type": "object",
272
315
  "description": "Conditional value configuration",
@@ -821,6 +864,38 @@
821
864
  },
822
865
  "required": ["command"]
823
866
  },
867
+ "config-exec-file": {
868
+ "title": "Exec File Config",
869
+ "additionalProperties": false,
870
+ "type": "object",
871
+ "properties": {
872
+ "file": {
873
+ "type": "string",
874
+ "description": "Path to the file to execute (local or remote URL). Supports {{variable}} interpolation. Runtime will be auto-detected from file extension if not specified."
875
+ },
876
+ "runtime": {
877
+ "type": "string",
878
+ "enum": ["node", "bash", "sh", "pwsh", "powershell"],
879
+ "description": "Runtime environment to execute the file with. If not specified, will be auto-detected from file extension (.js/.cjs/.mjs -> node, .sh/.bash -> bash, .ps1 -> pwsh)."
880
+ },
881
+ "args": {
882
+ "type": "array",
883
+ "items": { "type": "string" },
884
+ "description": "Arguments to pass to the script. Each argument supports {{variable}} interpolation."
885
+ },
886
+ "parameters": {
887
+ "type": "object",
888
+ "additionalProperties": { "type": "string" },
889
+ "description": "Environment variables to pass to the script. Values support {{variable}} interpolation."
890
+ },
891
+ "cwd": {
892
+ "type": "string",
893
+ "description": "Working directory for script execution. Supports {{variable}} interpolation."
894
+ },
895
+ "condition": { "$ref": "#/$defs/condition" }
896
+ },
897
+ "required": ["file"]
898
+ },
824
899
  "config-move": {
825
900
  "title": "Move Config",
826
901
  "type": "object",
@@ -1 +0,0 @@
1
- import"./config-DfRbCqsT.js";import"./utils-CrJkuEEG.js";import{n as e,t}from"./run-tasks-BsR0t7C5.js";export{t as runTasks,e as runTemplatesSequentially};
@@ -1,26 +0,0 @@
1
- import{t as e}from"./config-DfRbCqsT.js";import{S as t,_ as n,a as r,b as i,c as a,d as o,f as s,g as c,h as l,i as u,l as d,m as f,t as p,u as m,v as h,x as g,y as _}from"./utils-CrJkuEEG.js";import v from"node:path";import y from"node:fs";import b from"node:process";import{promisify as x}from"node:util";import{execSync as S}from"node:child_process";import{confirm as ee,input as C,number as te,password as ne,select as re}from"@inquirer/prompts";import{camelCase as ie,capitalCase as ae,constantCase as oe,kebabCase as se,lowerCase as ce,pascalCase as le,snakeCase as ue,upperCase as de}from"case-anything";var w=class e extends t{constructor(e,t,n,r){super(e,`DUPLICATE_ID`),this.id=t,this.type=n,this.existingType=r,this.name=`DuplicateIdError`}static forId(t,n,r){return new e(`Duplicate ID "${t}" found in ${n}. This ID is already used in ${r??`unknown`}`,t,n,r)}},T=class e extends t{constructor(e,t,n,r,i){super(e,`ID_CONFLICT`),this.id=t,this.type=n,this.baseSource=r,this.overrideSource=i,this.name=`IdConflictError`}static forTask(t,n,r){return new e(`Task ID conflict: "${t}" is defined in multiple templates.\n Base task from: ${n??`unknown`}\n Override task from: ${r??`unknown`}\n You must specify an override strategy: add "override": "merge" or "override": "replace" to the task.\n Task is being extended/overridden but no override strategy was specified.`,t,`task`,n,r)}static forVariable(t){return new e(`Variable ID conflict: "${t}" is defined in multiple templates.\n You must specify an override strategy: add "override": "merge" or "override": "replace" to the variable.\n Variable is being extended/overridden but no override strategy was specified.`,t,`variable`)}static forPrompt(t){return new e(`Prompt ID conflict: "${t}" is defined in multiple templates.\n You must specify an override strategy: add "override": "merge" or "override": "replace" to the prompt.\n Prompt is being extended/overridden but no override strategy was specified.`,t,`prompt`)}},fe=class e extends t{constructor(e,t){super(e,`TASK_NOT_FOUND`),this.taskId=t,this.name=`TaskNotFoundError`}static forId(t){return new e(`Task not found: ${t}`,t)}},E=class e extends t{constructor(e,t,n){super(e,`PROMPT_VALIDATION_ERROR`),this.promptId=t,this.reason=n,this.name=`PromptValidationError`}static required(t){return new e(`Prompt "${t}" is required`,t,`required`)}static unknownType(t){return new e(`Unknown prompt type: ${t}`,t,`unknown_type`)}},D=class e extends t{constructor(e,t,n){super(e,`PLUGIN_CONFIGURATION_ERROR`),this.pluginType=t,this.configIssue=n,this.name=`PluginConfigurationError`}static templateMissingTemplateOrFile(){return new e(`Template task requires either "template" (inline) or "templateFile" (file path) to be specified`,`template`,`missing_template_or_file`)}static templateHasBothTemplateAndFile(){return new e(`Template task cannot have both "template" and "templateFile" specified. Use one or the other.`,`template`,`both_template_and_file`)}static createMissingTemplateOrFile(){return new e(`Create task requires either "template" (inline) or "templateFile" (file path) to be specified`,`create`,`missing_template_or_file`)}static createHasBothTemplateAndFile(){return new e(`Create task cannot have both "template" and "templateFile" specified. Use one or the other.`,`create`,`both_template_and_file`)}},O=class e extends t{constructor(e,t,n){super(e,`TRANSFORMER_ERROR`),this.transformerId=t,this.reason=n,this.name=`TransformerError`}static notFound(t){return new e(`Transformer "${t}" not found`,t,`not_found`)}static executionFailed(t,n){return new e(`Transformer "${t}" execution failed: ${n}`,t,`execution_failed`)}static invalidType(t,n){return new e(`Invalid transformer type "${n}" for transformer "${t}"`,t,`invalid_type`)}};function pe(e){let t=new Map;for(let n of e){let e=t.get(n.name)||[];e.push(n),t.set(n.name,e)}if(Array.from(t.values()).some(e=>e.length>1))return e;let n=new Map,r=new Map,i=new Map;for(let t of e)if(n.set(t.name,t),i.set(t.name,new Set),t.dependencies!=null&&t.dependencies.length>0)for(let e of t.dependencies)i.get(t.name).add(e),r.has(e)||r.set(e,new Set),r.get(e).add(t.name);let a=new Set,o=new Map;for(let t=0;t<e.length;t++){let n=e[t],s=i.get(n.name).size>0,c=r.has(n.name)&&r.get(n.name).size>0;!s&&!c&&(a.add(n.name),o.set(n.name,t))}let s=e.filter(e=>!a.has(e.name)),c=[],l=new Set,u=new Set;function d(e){if(l.has(e))return;if(u.has(e))throw g.forTemplateDependencies(Array.from(u),e);u.add(e);let t=n.get(e);if(t!=null){let t=i.get(e);if(t!=null&&t.size>0)for(let e of t)d(e)}u.delete(e),l.add(e),t!=null&&!a.has(e)&&c.push(t)}for(let e of s)d(e.name);let f=[],p=0;for(let t=0;t<e.length;t++){let n=e[t];a.has(n.name)?f.push(n):p<c.length&&(f.push(c[p]),p++)}return f}const me=x(y.readFile),he={template:[[`template`,`templateFile`]]};function k(e){if(e==null||e===``)return`current template`;if(A(e))return e;let t=b.cwd();return e.startsWith(t)?v.relative(t,e):e}function A(e){try{let t=new URL(e);return t.protocol===`http:`||t.protocol===`https:`}catch{return!1}}function ge(e,t){if(A(e))return e;if(t==null||t===``)return v.isAbsolute(e)?e:v.resolve(b.cwd(),e);if(A(t))try{let n=new URL(`.`,t);return new URL(e,n).href}catch{throw i.forRemoteTemplate(e,t)}let n=v.dirname(t);return v.isAbsolute(e)?e:v.resolve(n,e)}async function _e(e){if(A(e))return ve(e);if(!y.existsSync(e))throw h.forPath(e);return me(e,`utf-8`)}async function ve(e){try{let t=await fetch(e);if(!t.ok)throw n.forUrl(e,t.status,t.statusText);return await t.text()}catch(t){throw t instanceof Error&&t.message.includes(`Failed to fetch`)?t:n.forUrl(e,t instanceof Error?t:void 0)}}const j=new Map;async function ye(e,t=new Set){let n=A(e),r;if(r=n||v.isAbsolute(e)?e:v.resolve(b.cwd(),e),j.has(r))return j.get(r);if(t.has(r))throw g.forTemplateInheritance(t,r);t.add(r);let i;if(n)i=await ve(r);else{if(!y.existsSync(r))throw h.forPath(r);i=await me(r,`utf-8`)}let a;try{a=JSON.parse(i)}catch(e){throw _.forFile(r,e instanceof Error?e:Error(String(e)))}if(a.name==null||a.name.trim()===``)throw c.missingName(r);if(!/^[a-z\d]+(?:-[a-z\d]+)*$/u.test(a.name))throw c.invalidNameFormat(r,a.name);if(a.tasks!==void 0&&!Array.isArray(a.tasks))throw c.tasksNotArray(r);a.tasks===void 0&&(a.tasks=[]);for(let e of a.tasks)e.$sourceUrl=r;return j.set(r,a),a}async function be(e,t,n,r,i){let a=A(e),o;if(o=a||v.isAbsolute(e)?e:t==null?v.resolve(b.cwd(),e):A(t)?new URL(e,t).href:v.resolve(t,e),n.has(o))return;if(r.has(o))throw g.forTemplateInheritance(r,o);r.add(o);let s=await ye(o),c=A(o)?new URL(`.`,o).href:v.dirname(o);if(s.extends!=null&&s.extends!==``){let e=Array.isArray(s.extends)?s.extends:[s.extends];for(let t of e)await be(t,c,n,r,i)}r.delete(o),n.add(o),i.push(s)}async function M(e,t,n=new Set){let r=[];return await be(e,t,n,new Set,r),pe(r)}async function xe(e,t,n=new Set){return Te(await M(e,t,n))}function Se(e,t,n){let r=new Map;for(let t of e){if(r.has(t.id))throw w.forId(t.id,`task`,r.get(t.id));r.set(t.id,`task`)}if(t!=null)for(let e of t){if(r.has(e.id))throw w.forId(e.id,`variable`,r.get(e.id));r.set(e.id,`variable`)}if(n!=null)for(let e of n){if(r.has(e.id))throw w.forId(e.id,`prompt`,r.get(e.id));r.set(e.id,`prompt`)}}function Ce(e,t){if((t.override??`merge`)===`replace`){r(` → Variable "${t.id}" using 'replace' strategy`,`info`);let{override:e,...n}=t;return n}r(` → Variable "${t.id}" merged (value replaced)`,`info`);let n={...e,...t};return delete n.override,n}function we(e,t){if((t.override??`merge`)===`replace`){r(` → Prompt "${t.id}" using 'replace' strategy`,`info`);let{override:e,...n}=t;return n}r(` → Prompt "${t.id}" merged`,`info`);let n={...e,...t};return delete n.override,n}function Te(e){if(e.length===0)return{name:`Empty Template`,tasks:[]};if(e.length===1){let t=e[0];return Se(t.tasks??[],t.variables,t.prompts),t}let t=new Map,n=new Map,i=new Map,a={};for(let o of e){if(o.enabled!=null&&(a[o.name]=o.enabled),o.enabled===!1){r(`⊘ Skipping disabled template "${o.name}" - its tasks, prompts, and variables will not be included`,`info`);continue}if(o.prompts!=null)for(let e of o.prompts)if(i.has(e.id)){if(e.override==null)throw T.forPrompt(e.id);let t=we(i.get(e.id),e);o.enabled!=null&&(t.$templateEnabled=o.enabled),i.set(e.id,t)}else{let t={...e};o.enabled!=null&&(t.$templateEnabled=o.enabled),i.set(e.id,t)}if(o.variables!=null)for(let e of o.variables)if(n.has(e.id)){if(e.override==null)throw T.forVariable(e.id);let t=Ce(n.get(e.id),e);o.enabled!=null&&(t.$templateEnabled=o.enabled),n.set(e.id,t)}else{let t={...e};o.enabled!=null&&(t.$templateEnabled=o.enabled),n.set(e.id,t)}for(let e of o.tasks??[])if(t.has(e.id)){if(e.override==null){let n=t.get(e.id);throw T.forTask(e.id,k(n.$sourceUrl),k(e.$sourceUrl))}let n=Oe(t.get(e.id),e);o.enabled!=null&&(n.$templateEnabled=o.enabled),t.set(e.id,n)}else{let n={...e};o.enabled!=null&&(n.$templateEnabled=o.enabled),t.set(e.id,n)}}let o=Array.from(t.values()),s=i.size>0?Array.from(i.values()):void 0,c=n.size>0?Array.from(n.values()):void 0;Se(o,c,s);let l=e[e.length-1],u={name:l.name,tasks:o};return l.description!=null&&(u.description=l.description),l.dependencies!=null&&(u.dependencies=l.dependencies),l.enabled!=null&&(u.enabled=l.enabled),s!=null&&(u.prompts=s),c!=null&&(u.variables=c),u}function Ee(e,t){let n=he[e];if(!n)return null;for(let e of n){let n=e.filter(e=>e in t&&t[e]!=null);if(n.length>1)return n}return null}function De(e,t,n){let r={...e},i=he[n]??[];for(let[e,n]of Object.entries(t)){for(let t of i)if(t.includes(e)){for(let n of t)n!==e&&delete r[n];break}r[e]=n}return r}function Oe(e,t){if((t.override??`merge`)===`replace`){r(` → Task "${t.id}" using 'replace' strategy - completely replacing base task`,`info`),r(` Base: ${k(e.$sourceUrl)}`,`info`),r(` Override: ${k(t.$sourceUrl)}`,`info`);let{override:n,...i}=t;return i}r(` → Merging task "${t.id}"`,`info`),r(` Base: ${k(e.$sourceUrl)}`,`info`),r(` Override: ${k(t.$sourceUrl)}`,`info`);let n;if(typeof e.config==`object`&&e.config!==null&&typeof t.config==`object`&&t.config!==null){n=De(e.config,t.config,t.type);let i=Ee(t.type,n);i!==null&&i.length>0&&(r(` ⚠️ Warning: Conflicting config fields detected: ${i.join(`, `)}`,`warn`),r(` Please use override: "replace" or specify only one of these fields`,`warn`))}else n=t.config??e.config;let i=[...e.dependencies??[],...t.dependencies??[]],a=i.length>0?[...new Set(i)]:void 0,o=t.$sourceUrl??e.$sourceUrl,s={...e,...t,config:n,...a!=null&&{dependencies:a},...o!=null&&{$sourceUrl:o}};return delete s.override,s}function ke(){j.clear()}async function Ae(e,t){if(o(`Loading tasks from ${e}...`),t?.sequential===!0){let t=await M(e);return o(`Loaded ${t.length} template(s) for processing`),{tasks:[],templates:t}}let n=await xe(e);r(`Loaded ${n.tasks?.length??0} task(s)`,`info`),n.extends!=null&&n.extends!==``&&r(`Extended from: ${(Array.isArray(n.extends)?n.extends:[n.extends]).join(`, `)}`,`info`),n.prompts!=null&&n.prompts.length>0&&r(`Found ${n.prompts.length} top-level prompt(s)`,`info`),n.variables!=null&&n.variables.length>0&&r(`Found ${n.variables.length} top-level variable(s)`,`info`);let i={tasks:n.tasks??[]};return n.prompts!=null&&(i.prompts=n.prompts),n.variables!=null&&(i.variables=n.variables),n.enabled!=null&&(i.enabled=n.enabled),n.transformers!=null&&(i.transformers=n.transformers),i}function N(e){return e.template!=null&&e.template!==``}function P(e){return e.templateFile!=null&&e.templateFile!==``}function je(e){return e.endsWith(`.hbs`)}function F(e){let t=N(e),n=P(e);return!t&&!n?{isValid:!1,hasInlineTemplate:t,hasTemplateFile:n,error:`Template configuration requires either "template" (inline) or "templateFile" (file path) to be specified`}:t&&n?{isValid:!1,hasInlineTemplate:t,hasTemplateFile:n,error:`Template configuration cannot have both "template" and "templateFile" specified. Use one or the other.`}:{isValid:!0,hasInlineTemplate:t,hasTemplateFile:n}}async function I(e,t,n,r={}){let{enableHandlebars:i=!0,sourceUrl:a=n?.$sourceUrl}=r,o=N(e),s=P(e);if(o)return u(e.template,t);if(s){let n=e.templateFile,r=i&&je(n),o=await _e(ge(n,a));return r?(await import(`handlebars`)).default.compile(o)(t):u(o,t)}throw Error(`No template content available`)}function Me(e){return N(e)?`inline template`:P(e)?`template file: ${e.templateFile}`:`no template source`}const L=x(y.readFile),R={reset:`\x1B[0m`,red:`\x1B[31m`,green:`\x1B[32m`,yellow:`\x1B[33m`,blue:`\x1B[34m`,cyan:`\x1B[36m`,gray:`\x1B[90m`};function z(e,t){switch(t){case`add`:return`${R.green}+ ${e}${R.reset}`;case`remove`:return`${R.red}- ${e}${R.reset}`;case`context`:return`${R.gray} ${e}${R.reset}`;default:return e}}function B(e,t){let n=e.split(`
2
- `),r=t.split(`
3
- `),i=[],a=Math.max(n.length,r.length);for(let e=0;e<a;e++){let t=n[e],a=r[e];t===a?t!==void 0&&i.push(z(t,`context`)):(t!==void 0&&i.push(z(t,`remove`)),a!==void 0&&i.push(z(a,`add`)))}return i}async function Ne(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${R.yellow}⊘ Condition not met - task would be skipped${R.reset}`;let n=v.join(b.cwd(),e.file);if(!y.existsSync(n))return`${R.red}✗ File not found: ${e.file}${R.reset}`;try{let r=await L(n,`utf-8`),i=JSON.parse(r),o={...i};function s(e){if(typeof e==`string`)return u(e,t);if(Array.isArray(e))return e.map(e=>s(e));if(typeof e==`object`&&e){let t={};for(let[n,r]of Object.entries(e))t[n]=s(r);return t}return e}for(let[t,n]of Object.entries(e.updates)){let e=s(n);t.includes(`.`)?a(i,t,e):i[t]=e}let c=JSON.stringify(o,null,2),l=JSON.stringify(i,null,2);if(c===l)return`${R.cyan}→ No changes${R.reset}`;let d=B(c,l);return`${R.blue}File: ${e.file}${R.reset}\n${d.join(`
4
- `)}`}catch(e){return`${R.red}✗ Error: ${e instanceof Error?e.message:String(e)}${R.reset}`}}async function Pe(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${R.yellow}⊘ Condition not met - task would be skipped${R.reset}`;if(e.template==null||e.template===``)return`${R.red}✗ No template content provided for file: ${e.file}${R.reset}`;let n=v.join(b.cwd(),e.file),r=u(e.template,t);if(!y.existsSync(n)){let t=r.split(`
5
- `).slice(0,10).join(`
6
- `),n=r.split(`
7
- `).length>10;return`${R.blue}File: ${e.file}${R.reset}\n${R.green}+ New file would be created${R.reset}\n${R.gray}Content preview:${R.reset}\n${t}${n?`
8
- ...`:``}`}try{let t=await L(n,`utf-8`);if(t===r)return`${R.cyan}→ No changes${R.reset}`;let i=B(t,r);return`${R.blue}File: ${e.file}${R.reset}\n${i.join(`
9
- `)}`}catch(e){return`${R.red}✗ Error: ${e instanceof Error?e.message:String(e)}${R.reset}`}}async function Fe(e,t,n){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${R.yellow}⊘ Condition not met - task would be skipped${R.reset}`;let r=v.join(b.cwd(),e.file);if(y.existsSync(r))return`${R.cyan}→ File already exists, would be skipped: ${e.file}${R.reset}`;try{if(N(e)){let r=await I(e,t,n),i=r.split(`
10
- `).slice(0,10).join(`
11
- `),a=r.split(`
12
- `).length>10;return`${R.blue}File: ${e.file}${R.reset}\n${R.green}+ New file would be created${R.reset}\n${R.gray}Content preview:${R.reset}\n${i}${a?`
13
- ...`:``}`}let r=Me(e);return`${R.blue}File: ${e.file}${R.reset}\n${R.green}+ New file would be created from ${r}${R.reset}`}catch(e){return`${R.red}✗ Error: ${e instanceof Error?e.message:String(e)}${R.reset}`}}async function Ie(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${R.yellow}⊘ Condition not met - task would be skipped${R.reset}`;let n=v.join(b.cwd(),e.file);if(!y.existsSync(n))return`${R.red}✗ File not found: ${e.file}${R.reset}`;try{let r=await L(n,`utf-8`),i=new RegExp(e.pattern,e.flags??`g`),a=u(e.replacement,t),o=r.replace(i,a);if(r===o)return`${R.cyan}→ No matches found${R.reset}`;let s=B(r,o);return`${R.blue}File: ${e.file}${R.reset}\n${s.join(`
14
- `)}`}catch(e){return`${R.red}✗ Error: ${e instanceof Error?e.message:String(e)}${R.reset}`}}async function Le(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${R.yellow}⊘ Condition not met - task would be skipped${R.reset}`;let n=v.join(b.cwd(),e.file);if(!y.existsSync(n))return`${R.red}✗ File not found: ${e.file}${R.reset}`;try{let r=await L(n,`utf-8`),i=r;for(let{find:n,replace:i}of e.replacements){let e=u(n,t),a=u(i,t);r=r.replace(e,a)}if(i===r)return`${R.cyan}→ No changes${R.reset}`;let a=B(i,r);return`${R.blue}File: ${e.file}${R.reset}\n${a.join(`
15
- `)}`}catch(e){return`${R.red}✗ Error: ${e instanceof Error?e.message:String(e)}${R.reset}`}}function Re(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${R.yellow}⊘ Condition not met - task would be skipped${R.reset}`;let n=e.paths.map(e=>u(e,t)).filter(e=>y.existsSync(v.join(b.cwd(),e)));return n.length===0?`${R.cyan}→ No files/directories to delete${R.reset}`:`${R.red}Would delete:${R.reset}\n${n.map(e=>`${R.red} - ${e}${R.reset}`).join(`
16
- `)}`}function ze(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${R.yellow}⊘ Condition not met - task would be skipped${R.reset}`;let n=u(e.from,t),r=u(e.to,t),i=v.join(b.cwd(),n),a=v.join(b.cwd(),r);return y.existsSync(i)?y.existsSync(a)?`${R.yellow}⚠ Destination already exists: ${r}${R.reset}\n${R.cyan}Would rename: ${n} → ${r}${R.reset}`:`${R.cyan}Would rename: ${n} → ${r}${R.reset}`:`${R.red}✗ Source not found: ${n}${R.reset}`}function Be(e){if(e.condition!=null&&e.condition!==``)return`${R.yellow}⊘ Condition check skipped in dry-run${R.reset}`;let t=v.join(b.cwd(),`.git`),n=y.existsSync(t),r=[];if(e.removeExisting&&n&&r.push(`${R.red}Would remove existing .git directory${R.reset}`),r.push(`${R.green}Would initialize git repository${R.reset}`),e.initialCommit){let t=e.message??`Initial commit`;r.push(`${R.green}Would create initial commit: "${t}"${R.reset}`)}return r.join(`
17
- `)}function Ve(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${R.yellow}⊘ Condition not met - task would be skipped${R.reset}`;let n=u(e.command,t),r=e.cwd==null?b.cwd():u(e.cwd,t);return`${R.yellow}Would execute:${R.reset}\n${R.cyan} Command: ${n}${R.reset}\n${R.cyan} Working directory: ${r}${R.reset}`}function He(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${R.yellow}⊘ Condition not met - task would be skipped${R.reset}`;let n=u(e.from,t),r=u(e.to,t),i=v.join(b.cwd(),n),a=v.join(b.cwd(),r);return y.existsSync(i)?y.existsSync(a)?`${R.yellow}⚠ Destination already exists: ${r}${R.reset}\n${R.cyan}Would move: ${n} → ${r}${R.reset}`:`${R.cyan}Would move: ${n} → ${r}${R.reset}`:`${R.red}✗ Source not found: ${n}${R.reset}`}function Ue(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${R.yellow}⊘ Condition not met - task would be skipped${R.reset}`;let n=u(e.from,t),r=u(e.to,t),i=v.join(b.cwd(),n),a=v.join(b.cwd(),r);if(!y.existsSync(i))return`${R.red}✗ Source not found: ${n}${R.reset}`;let o=y.statSync(i).isDirectory()?`directory`:`file`;return y.existsSync(a)?`${R.yellow}⚠ Destination already exists: ${r}${R.reset}\n${R.cyan}Would copy ${o}: ${n} → ${r}${R.reset}`:`${R.cyan}Would copy ${o}: ${n} → ${r}${R.reset}`}async function We(e,t,n){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${R.yellow}⊘ Condition not met - task would be skipped${R.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 I(i,t,n),o=a.split(`
18
- `).slice(0,10).join(`
19
- `),s=a.split(`
20
- `).length>10;return y.existsSync(r)?`${R.blue}File: ${e.file}${R.reset}\n${R.green}+ Would append content${R.reset}\n${R.gray}Content preview:${R.reset}\n${o}${s?`
21
- ...`:``}`:`${R.blue}File: ${e.file}${R.reset}\n${R.green}+ New file would be created with content${R.reset}\n${R.gray}Content preview:${R.reset}\n${o}${s?`
22
- ...`:``}`}catch(e){return`${R.red}✗ Error: ${e instanceof Error?e.message:String(e)}${R.reset}`}}function Ge(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${R.yellow}⊘ Condition not met - task would be skipped${R.reset}`;let n=u(e.path,t),r=v.join(b.cwd(),n);return y.existsSync(r)?`${R.cyan}→ Directory already exists: ${n}${R.reset}`:`${R.green}+ Would create directory: ${n}${R.reset}`}async function Ke(e,t){try{switch(e.type){case`update-json`:return await Ne(e.config,t);case`write`:return await Pe(e.config,t);case`create`:return await Fe(e.config,t,e);case`regex-replace`:return await Ie(e.config,t);case`replace-in-file`:return await Le(e.config,t);case`delete`:return Re(e.config,t);case`rename`:return ze(e.config,t);case`move`:return He(e.config,t);case`copy`:return Ue(e.config,t);case`append`:return await We(e.config,t,e);case`mkdir`:return Ge(e.config,t);case`git-init`:return Be(e.config);case`exec`:return Ve(e.config,t);default:{let t=e.type;return`${R.yellow}⚠ Diff not available for task type: ${t}${R.reset}`}}}catch(e){return`${R.red}✗ Error generating diff: ${e instanceof Error?e.message:String(e)}${R.reset}`}}async function V(e,t){console.log(`${R.blue}═══════════════════════════════════════════════════════${R.reset}`),console.log(`${R.blue} DRY RUN - Preview of changes${R.reset}`),console.log(`${R.blue}═══════════════════════════════════════════════════════${R.reset}`);for(let n of e){console.log(`${R.cyan}▶ Task: ${n.name}${R.reset}`),n.description!=null&&n.description!==``&&console.log(`${R.gray} ${n.description}${R.reset}`);let e=await Ke(n,t);console.log(e),console.log(`${R.gray}${`─`.repeat(55)}${R.reset}`)}console.log(`${R.blue}═══════════════════════════════════════════════════════${R.reset}`),console.log(`${R.yellow} No changes were applied (dry-run mode)${R.reset}`),console.log(`${R.blue}═══════════════════════════════════════════════════════${R.reset}`)}const H=new Map,U={},W=new Map;function G(e){if(e.name==null||e.name===``)throw TypeError(`Plugin name is required`);if(!Array.isArray(e.taskTypes)||e.taskTypes.length===0)throw TypeError(`Plugin ${e.name} must define at least one task type`);if(typeof e.execute!=`function`)throw TypeError(`Plugin ${e.name} must provide an execute function`);if(H.has(e.name))throw TypeError(`Plugin ${e.name} is already registered`);for(let t of e.taskTypes)if(W.has(t)){let e=W.get(t);throw TypeError(`Task type "${t}" is already registered by plugin "${e}"`)}H.set(e.name,e);for(let t of e.taskTypes)W.set(t,e.name);o(`Registered plugin: ${e.name}${e.version==null?``:` v${e.version}`}`)}function qe(e){let t=H.get(e);if(t!=null){for(let e of t.taskTypes)W.delete(e);H.delete(e)}}function Je(e){return H.get(e)}function K(e){let t=W.get(e);if(t!=null)return H.get(t)}function q(e){return W.has(e)}function Ye(){return Array.from(H.keys())}function Xe(){H.clear(),W.clear()}function Ze(e){e.beforeAll!=null&&(U.beforeAll=e.beforeAll),e.afterAll!=null&&(U.afterAll=e.afterAll),e.beforeTask!=null&&(U.beforeTask=e.beforeTask),e.afterTask!=null&&(U.afterTask=e.afterTask),e.onError!=null&&(U.onError=e.onError)}async function J(e,...t){let n=U[e];if(n!=null)try{e===`beforeAll`||e===`afterAll`?await n(t[0]):(e===`beforeTask`||e===`afterTask`||e===`onError`)&&await n(t[0],t[1])}catch(t){r(`Error in ${e} hook: ${t instanceof Error?t.message:String(t)}`,`error`)}}async function Qe(e,t,n){let r=K(e.type);if(r==null)throw TypeError(`No plugin found for task type: ${e.type}`);await r.execute(e,t,n)}async function $e(e,t){let n=K(e.type);if(!(n==null||n.getDiff==null))return n.getDiff(e,t)}function et(e){let t=K(e.type);return t==null?[`No plugin found for task type: ${e.type}`]:t.validate==null?[]:t.validate(e)}function tt(e,t,n,r){return{name:e,...r?.version!=null&&{version:r.version},taskTypes:[t],execute:n,...r?.getDiff!=null&&{getDiff:r.getDiff},...r?.validate!=null&&{validate:r.validate}}}const nt=new class{transformers=new Map;constructor(){this.registerBuiltInTransformers()}registerBuiltInTransformers(){for(let e of[{id:`lowercase`,type:`lowercase`},{id:`uppercase`,type:`uppercase`},{id:`trim`,type:`trim`},{id:`slugify`,type:`slugify`},{id:`capitalize`,type:`capitalize`},{id:`titlecase`,type:`titlecase`},{id:`camelcase`,type:`camelcase`},{id:`pascalcase`,type:`pascalcase`},{id:`snakecase`,type:`snakecase`},{id:`kebabcase`,type:`kebabcase`},{id:`constantcase`,type:`constantcase`},{id:`alphanumeric`,type:`alphanumeric`},{id:`collapse-spaces`,type:`collapse-spaces`},{id:`remove-spaces`,type:`remove-spaces`},{id:`urlencode`,type:`urlencode`},{id:`dasherize`,type:`dasherize`},{id:`underscore`,type:`underscore`}])this.transformers.set(e.id,e)}register(e){this.transformers.has(e.id)&&r(`Transformer with id "${e.id}" is already registered. Overwriting.`,`warn`),this.transformers.set(e.id,e)}registerAll(e){for(let t of e)this.register(t)}get(e){return this.transformers.get(e)}has(e){return this.transformers.has(e)}async execute(e,t,n={}){let r=this.transformers.get(e);if(!r)throw O.notFound(e);try{return await this.executeTransformer(r,t,n)}catch(t){throw t instanceof O?t:O.executionFailed(e,t instanceof Error?t.message:String(t))}}async executeChain(e,t,n={}){let r=t;for(let t of e)r=await this.execute(t,r,n);return r}async apply(e,t,n={}){return e===void 0?t:this.executeChain(e,t,n)}validate(e){if(e===void 0)return[];let t=e,n=[];for(let e of t)this.has(e)||n.push(`Transformer "${e}" not found`);return n}async executeTransformer(e,t,n){switch(e.type){case`regex`:return this.executeRegex(e,t);case`computed`:return this.executeComputed(e,t,n);case`lowercase`:return this.executeLowercase(t);case`uppercase`:return this.executeUppercase(t);case`trim`:return this.executeTrim(t);case`slugify`:return this.executeSlugify(t);case`capitalize`:return this.executeCapitalize(t);case`titlecase`:return this.executeTitlecase(t);case`camelcase`:return this.executeCamelcase(t);case`pascalcase`:return this.executePascalcase(t);case`snakecase`:return this.executeSnakecase(t);case`kebabcase`:return this.executeKebabcase(t);case`constantcase`:return this.executeConstantcase(t);case`alphanumeric`:return this.executeAlphanumeric(t);case`collapse-spaces`:return this.executeCollapseSpaces(t);case`remove-spaces`:return this.executeRemoveSpaces(t);case`urlencode`:return this.executeUrlencode(t);case`dasherize`:return this.executeDasherize(t);case`underscore`:return this.executeUnderscore(t);case`custom`:return this.executeCustom(e,t,n);case`chain`:return this.executeChainTransformer(e,t,n);default:{let t=e;throw O.invalidType(t.id,t.type)}}}executeRegex(e,t){let n=String(t),{pattern:r,flags:i,replacement:a}=e.config;try{let e=new RegExp(r,i);return n.replace(e,a)}catch(t){throw O.executionFailed(e.id,`Invalid regex pattern: ${t instanceof Error?t.message:String(t)}`)}}executeComputed(e,t,n){let{expression:r}=e.config;try{return Function(`value`,`context`,...Object.keys(n),`return ${r}`)(t,n,...Object.values(n))}catch(t){throw O.executionFailed(e.id,`Expression evaluation failed: ${t instanceof Error?t.message:String(t)}`)}}executeLowercase(e){return ce(String(e))}executeUppercase(e){return de(String(e))}executeTrim(e){return String(e).trim()}executeSlugify(e){return String(e).toLowerCase().trim().replace(/[\s_]+/gu,`-`).replace(/[^\w-]+/gu,``).replace(/-{2,}/gu,`-`).replace(/^-+/u,``).replace(/-+$/u,``)}async executeCustom(e,t,n){let{handler:r}=e.config;if(typeof r==`function`)return r(t,n);throw O.executionFailed(e.id,`String-based custom handlers are not yet supported. Please use function handlers.`)}async executeChainTransformer(e,t,n){let{transformers:r}=e.config;if(r.length===0)throw O.executionFailed(e.id,`Chain transformer must have at least one transformer`);return this.executeChain(r,t,n)}executeCapitalize(e){return ae(String(e))}executeTitlecase(e){return ae(String(e))}executeCamelcase(e){return ie(String(e))}executePascalcase(e){return le(String(e))}executeSnakecase(e){return ue(String(e))}executeKebabcase(e){return se(String(e))}executeConstantcase(e){return oe(String(e))}executeAlphanumeric(e){return String(e).replace(/[^a-zA-Z0-9]/gu,``)}executeCollapseSpaces(e){return String(e).replace(/\s+/gu,` `)}executeRemoveSpaces(e){return String(e).replace(/\s/gu,``)}executeUrlencode(e){return encodeURIComponent(String(e))}executeDasherize(e){return se(String(e))}executeUnderscore(e){return ue(String(e))}clear(){this.transformers.clear()}getIds(){return Array.from(this.transformers.keys())}};function rt(e,t){try{let n={...t};return Function(...Object.keys(n),`'use strict'; return (${e})`)(...Object.values(n))}catch{return!0}}function it(e){return e===void 0||typeof e==`boolean`?e:typeof e==`string`?{type:`condition`,value:e}:typeof e==`object`&&e&&`condition`in e&&!(`type`in e)?{type:`condition`,value:e.condition}:e}async function Y(e,t){let n=it(e);if(n===void 0)return!0;if(typeof n==`boolean`)return n;if(typeof n==`object`&&n&&`type`in n){if(n.type===`exec`)try{let{execSync:e}=await import(`node:child_process`),{interpolateTemplate:r}=await import(`./utils-B6WSsvMT.js`);return e(r(n.value,t),{encoding:`utf-8`,stdio:`ignore`}),!0}catch(e){let{log:t}=await import(`./utils-B6WSsvMT.js`);if(typeof e==`object`&&e&&`status`in e&&typeof e.status==`number`){let{status:r}=e;if(r>=1&&r<=255)return t(`Failed to execute required command: ${n.value}`,`warn`),e instanceof Error&&t(` Error: ${e.message}`,`warn`),!1}return t(`Failed to execute required command: ${n.value}`,`warn`),e instanceof Error&&t(` Error: ${e.message}`,`warn`),!1}if(n.type===`condition`)return rt(n.value,t)}return!0}async function X(e,t,n){if(e===void 0)return;if(typeof e!=`object`||!e||Array.isArray(e))return e;let i=e;if(i.type===`conditional`){if(!n)return;if(typeof i.condition!=`string`){r(`Prompt "${t}": conditional default must have a string condition`,`error`);return}try{let{evaluateCondition:e}=await import(`./utils-B6WSsvMT.js`),r=e(i.condition,n)?i.ifTrue:i.ifFalse;return typeof r==`object`&&r?await X(r,t,n):r}catch(e){r(`Prompt "${t}": failed to evaluate conditional default: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}if(i.type===`exec`){let e=i.value;if(typeof e!=`string`){r(`Prompt "${t}": exec default value must have a string command`,`error`);return}try{let t=S(e,{encoding:`utf-8`,stdio:[`pipe`,`pipe`,`pipe`],timeout:1e4}).trim();if(t.startsWith(`{`)||t.startsWith(`[`))try{return JSON.parse(t)}catch{return t}if(/^-?\d+(?:\.\d+)?$/u.test(t)){let e=Number.parseFloat(t);if(!Number.isNaN(e))return e}return t===`true`||t===`false`?t===`true`:t}catch(e){o(`Prompt "${t}": failed to execute default value command: ${e instanceof Error?e.message:`Unknown error`}`);return}}else if(i.type===`static`)return i.value;else if(i.type===`interpolate`){let e=i.value;if(typeof e!=`string`){r(`Prompt "${t}": interpolate default value must be a string with {{variable}} placeholders`,`error`);return}if(!n)return r(`Prompt "${t}": interpolate default value requires context but none provided`,`warn`),e;try{return u(e,n)}catch(n){return r(`Prompt "${t}": failed to interpolate interpolate default value: ${n instanceof Error?n.message:`Unknown error`}`,`warn`),e}}else if(i.type!==void 0){r(`Prompt "${t}": unknown default value type "${i.type}". Expected "static", "exec", "conditional", or "interpolate".`,`error`);return}return e}async function at(e,t=new Map,n={}){let i={};if(e.length===0)return i;for(let a of e){if(a.$templateEnabled!=null&&!await m(a.$templateEnabled,{...n,...i}))continue;let e={...n,...i};if(await m(a.enabled,e))try{let n,o=t.get(a.id);switch(a.default!==void 0&&(o=await X(a.default,a.id,e)),a.type){case`input`:{let t={message:a.message};o!==void 0&&(t.default=String(o));let i=await Y(a.required,e);if(i!==void 0&&(t.required=i),n=await C(t),i&&(n==null||typeof n==`string`&&n.trim()===``))throw r(`${a.message} is required`,`error`),E.required(a.id);break}case`password`:if(n=await ne({message:a.message,mask:`*`}),await Y(a.required,e)&&(n==null||typeof n==`string`&&n.trim()===``))throw r(`${a.message} is required`,`error`),E.required(a.id);break;case`number`:{let t={message:a.message};o!==void 0&&(t.default=Number(o));let i=await Y(a.required,e);if(i!==void 0&&(t.required=i),a.min!==void 0&&(t.min=a.min),a.max!==void 0&&(t.max=a.max),n=await te(t),i&&n==null)throw r(`${a.message} is required`,`error`),E.required(a.id);break}case`select`:{let e={message:a.message,choices:a.choices.map(e=>({name:e.name,value:e.value}))};o!==void 0&&(e.default=o),n=await re(e);break}case`confirm`:{let e=o===void 0?!1:!!o;n=await ee({message:a.message,default:e});break}default:throw r(`Unknown prompt type: ${a.type}`,`error`),E.unknownType(a.type)}a.transformers!==void 0&&(n=await nt.apply(a.transformers,n,{...e,...i})),i[a.id]=n}catch(e){throw e instanceof Error&&r(`Failed to collect prompt "${a.id}": ${e.message}`,`error`),e}}return i}async function ot(e,t){let n=new Map,r=e.map(async e=>{if(e.default!==void 0){let r=await X(e.default,e.id,t);r!==void 0&&n.set(e.id,r)}});return await Promise.all(r),n}function st(e){let t=[],n=new Set;for(let r of e){if(n.has(r.id)&&t.push(`Duplicate prompt ID: ${r.id}`),n.add(r.id),/^[a-zA-Z_$][a-zA-Z0-9_$]*$/u.test(r.id)||t.push(`Invalid prompt ID "${r.id}": must be a valid JavaScript identifier (start with letter, underscore, or $, followed by letters, digits, underscores, or $)`),(!r.message||r.message.trim()===``)&&t.push(`Prompt "${r.id}" must have a non-empty message`),r.type===`select`){r.choices.length===0&&t.push(`Select prompt "${r.id}" must have at least one choice`);for(let e of r.choices)(!e.name||e.name.trim()===``)&&t.push(`Select prompt "${r.id}" has a choice with empty name`),e.value===void 0&&t.push(`Select prompt "${r.id}" has a choice with undefined value`)}r.type===`number`&&r.min!==void 0&&r.max!==void 0&&r.min>r.max&&t.push(`Number prompt "${r.id}" has min greater than max`)}return t}const ct=x(y.appendFile),lt=x(y.readFile),ut=x(y.stat);async function dt(e,t,n){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t)){r(`Condition not met, skipping append task`,`info`);return}let i=v.join(b.cwd(),e.file),a={};e.content==null?e.template!=null&&(a.template=e.template):a.template=e.content,e.templateFile!=null&&(a.templateFile=e.templateFile);let o=F(a);if(!o.isValid)throw o.error?.includes(`cannot have both`)?D.templateHasBothTemplateAndFile():D.templateMissingTemplateOrFile();let s=await I(a,t,n),c=!1,l=!1;try{await ut(i),c=!0;let t=await lt(i,`utf-8`);t.length>0&&!t.endsWith(`
23
- `)&&(l=e.newline!==!1)}catch{}c&&l?await ct(i,`\n${s}`):await ct(i,s),r(`Appended content to ${e.file}`,`success`)}const ft={name:`append`,version:`1.0.0`,taskTypes:[`append`],execute:async(e,t,n)=>{n.dryRun||await dt(e.config,t,e)}},pt=x(y.copyFile),mt=x(y.stat),ht=x(y.mkdir),gt=x(y.readdir);async function _t(e,t){await ht(t,{recursive:!0});let n=await gt(e,{withFileTypes:!0});await Promise.all(n.map(async n=>{let r=v.join(e,n.name),i=v.join(t,n.name);n.isDirectory()?await _t(r,i):await pt(r,i)}))}async function vt(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t)){r(`Condition not met, skipping copy task`,`info`);return}let n=v.join(b.cwd(),e.from),i=v.join(b.cwd(),e.to),a;try{a=await mt(n)}catch{r(`Source path does not exist: ${n}`,`warn`);return}await ht(v.dirname(i),{recursive:!0}),a.isDirectory()?(await _t(n,i),r(`Copied directory ${e.from} to ${e.to}`,`success`)):(await pt(n,i),r(`Copied file ${e.from} to ${e.to}`,`success`))}const yt={name:`copy`,version:`1.0.0`,taskTypes:[`copy`],execute:async(e,t,n)=>{n.dryRun||await vt(e.config,t)}},bt=x(y.writeFile);async function xt(e,t,n){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t)){r(`Condition not met, skipping create task`,`info`);return}let i=v.join(b.cwd(),e.file);if(y.existsSync(i)){r(`File already exists, skipping: ${e.file}`,`info`);return}let a=F(e);if(!a.isValid)throw a.error?.includes(`cannot have both`)?D.createHasBothTemplateAndFile():D.createMissingTemplateOrFile();let o=await I(e,t,n),s=v.dirname(i);y.existsSync(s)||y.mkdirSync(s,{recursive:!0}),await bt(i,o),r(`Created file: ${e.file}`,`success`)}const St={name:`create`,version:`1.0.0`,taskTypes:[`create`],execute:async(e,t,n)=>{n.dryRun||await xt(e.config,t,e)}};async function Ct(e,t){let{paths:n,condition:i}=e;if(i!=null&&i!==``){if(!t){r(`Condition specified but no config provided, skipping deletion`,`warn`);return}if(!p(i,t)){r(`Condition not met, skipping deletion`,`info`);return}}for(let e of n){let t=v.join(b.cwd(),e);y.existsSync(t)&&y.rmSync(t,{recursive:!0,force:!0})}}const wt={name:`delete`,version:`1.0.0`,taskTypes:[`delete`],execute:async(e,t,n)=>{n.dryRun||await Ct(e.config,t)}};async function Tt(e,t){if(e.condition!=null&&e.condition!==``){if(!t){r(`Condition specified but no config provided, skipping exec`,`warn`);return}if(!p(e.condition,t)){r(`Condition not met, skipping exec task`,`info`);return}}let n=e.cwd==null?b.cwd():v.join(b.cwd(),e.cwd);S(e.command,{cwd:n,stdio:`inherit`})}const Et={name:`exec`,version:`1.0.0`,taskTypes:[`exec`],execute:async(e,t,n)=>{n.dryRun||await Tt(e.config,t)}};async function Dt(e,t){if(e.condition!=null&&e.condition!==``){if(!t){r(`Condition specified but no config provided, skipping git-init`,`warn`);return}if(!p(e.condition,t)){r(`Condition not met, skipping git-init task`,`info`);return}}if(e.removeExisting){let e=v.join(b.cwd(),`.git`);y.existsSync(e)&&y.rmSync(e,{recursive:!0,force:!0})}if(S(`git init`,{stdio:`inherit`}),e.initialCommit){let t=e.message??`Initial commit`;S(`git add .`,{stdio:`inherit`}),S(`git commit -m "${t}"`,{stdio:`inherit`})}}const Ot={name:`git-init`,version:`1.0.0`,taskTypes:[`git-init`],execute:async(e,t,n)=>{n.dryRun||await Dt(e.config,t)}},kt=x(y.mkdir);async function At(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t)){r(`Condition not met, skipping mkdir task`,`info`);return}await kt(v.join(b.cwd(),e.path),{recursive:!0}),r(`Created directory: ${e.path}`,`success`)}const jt={name:`mkdir`,version:`1.0.0`,taskTypes:[`mkdir`],execute:async(e,t,n)=>{n.dryRun||await At(e.config,t)}},Mt=x(y.rename),Nt=x(y.stat),Pt=x(y.mkdir);async function Ft(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t)){r(`Condition not met, skipping move task`,`info`);return}let n=v.join(b.cwd(),e.from),i=v.join(b.cwd(),e.to);try{await Nt(n)}catch{r(`Source path does not exist: ${n}`,`warn`);return}await Pt(v.dirname(i),{recursive:!0}),await Mt(n,i),r(`Moved ${e.from} to ${e.to}`,`success`)}const It={name:`move`,version:`1.0.0`,taskTypes:[`move`],execute:async(e,t,n)=>{n.dryRun||await Ft(e.config,t)}},Lt=x(y.readFile),Rt=x(y.writeFile);async function zt(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t)){r(`Condition not met, skipping regex-replace task`,`info`);return}let n=v.join(b.cwd(),e.file),{pattern:i}=e,a=e.flags??``,o=e.replacement||``,s=await Lt(n,`utf-8`),c=new RegExp(i,a);s=s.replace(c,u(o,t)),await Rt(n,s)}const Bt={name:`regex-replace`,version:`1.0.0`,taskTypes:[`regex-replace`],execute:async(e,t,n)=>{n.dryRun||await zt(e.config,t)}},Vt=x(y.rename);async function Ht(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t)){r(`Condition not met, skipping rename task`,`info`);return}let n=v.join(b.cwd(),u(e.from,t)),i=v.join(b.cwd(),u(e.to,t));if(!y.existsSync(n)){r(`Source path does not exist: ${n}`,`warn`);return}await Vt(n,i)}const Ut={name:`rename`,version:`1.0.0`,taskTypes:[`rename`],execute:async(e,t,n)=>{n.dryRun||await Ht(e.config,t)}},Wt=x(y.readFile),Gt=x(y.writeFile);async function Kt(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t)){r(`Condition not met, skipping replace-in-file task`,`info`);return}let n=v.join(b.cwd(),e.file),{replacements:i}=e;if(!y.existsSync(n)){r(`File not found: ${n}, skipping`,`warn`);return}let a=await Wt(n,`utf-8`);for(let{find:e,replace:n}of i){let r=u(n,t);a=a.replace(new RegExp(e,`gu`),r)}await Gt(n,a)}const qt={name:`replace-in-file`,version:`1.0.0`,taskTypes:[`replace-in-file`],execute:async(e,t,n)=>{n.dryRun||await Kt(e.config,t)}},Jt=x(y.readFile),Yt=x(y.writeFile);async function Xt(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t)){r(`Condition not met, skipping update-json task`,`info`);return}let n=v.join(b.cwd(),e.file),{updates:i}=e,o=await Jt(n,`utf-8`),s=JSON.parse(o);function c(e){if(typeof e==`string`)return u(e,t);if(Array.isArray(e))return e.map(e=>c(e));if(typeof e==`object`&&e){let t={};for(let[n,r]of Object.entries(e))t[n]=c(r);return t}return e}for(let[e,t]of Object.entries(i)){let n=c(t);e.includes(`.`)?a(s,e,n):s[e]=n}await Yt(n,`${JSON.stringify(s,null,2)}\n`)}const Zt={name:`update-json`,version:`1.0.0`,taskTypes:[`update-json`],execute:async(e,t,n)=>{n.dryRun||await Xt(e.config,t)}},Qt=x(y.writeFile);async function $t(e,t,n){let{allowCreate:i=!0}=e;if(e.condition!=null&&e.condition!==``&&!p(e.condition,t)){r(`Condition not met, skipping write task`,`info`);return}let a=v.join(b.cwd(),e.file);if(!y.existsSync(a)){if(i===!1)throw Error(`Write task failed: file does not exist (${e.file})`);r(`File not found, creating new file: ${e.file}`,`info`)}let o=F(e);if(!o.isValid)throw o.error?.includes(`cannot have both`)?D.templateHasBothTemplateAndFile():D.templateMissingTemplateOrFile();let s=await I(e,t,n),c=v.dirname(a);y.existsSync(c)||y.mkdirSync(c,{recursive:!0}),await Qt(a,s)}const en={name:`write`,version:`1.0.0`,taskTypes:[`write`],execute:async(e,t,n)=>{n.dryRun||await $t(e.config,t,e)}};function Z(){q(`update-json`)||(G(Zt),G(en),G(St),G(Bt),G(qt),G(wt),G(Ut),G(Ot),G(Et),G(It),G(yt),G(ft),G(jt))}async function tn(e,t,n=!1){if(Z(),n){r(`[DRY RUN] Would execute: ${e.name}`,`info`);return}if(q(e.type)){await Qe(e,t,{dryRun:n});return}throw TypeError(`Unknown task type: ${e.type}`)}async function nn(e,t,n,i,a=!1){try{return r(`[${n}/${i}] Running: ${e.name}...`,`info`),await tn(e,t,a),r(`[${n}/${i}] Completed: ${e.name}...`,`success`),!0}catch(t){return r(`Failed: ${e.name}`,`error`),t instanceof Error&&(r(` Reason: ${t.message}`,`error`),t.stack!=null&&b.env.DEBUG!=null&&console.error(t.stack)),!1}}function rn(e){let t=[],n=new Set,r=new Set,i=new Map(e.map(e=>[e.id,e]));function a(e){if(n.has(e))return;if(r.has(e))throw g.forTaskDependency(e);r.add(e);let o=i.get(e);if(!o)throw fe.forId(e);if(o.dependencies)for(let e of o.dependencies)a(e);r.delete(e),n.add(e),t.push(o)}for(let t of e)n.has(t.id)||a(t.id);return t}function an(e){let t=[];for(let n of e)if(!q(n.type))t.push(`Task "${n.id}" (${n.name}): Unknown task type "${n.type}"`);else if(n.type===`write`){let e=on(n);t.push(...e)}return t}function on(e){let t=[],n=e.config,r=typeof n.template==`string`?n.template:void 0,i=typeof n.templateFile==`string`?n.templateFile:void 0,a=F({...r!==void 0&&{template:r},...i!==void 0&&{templateFile:i}});return!a.isValid&&a.error!=null&&a.error!==``&&t.push(`Task "${e.id}" (${e.name}): ${a.error}`),(n.file==null||n.file===``)&&t.push(`Task "${e.id}" (${e.name}): Write task requires "file" property to specify the output file path`),t}function sn(e){r(`❌ Template validation failed:`,`error`),r(``,`error`);for(let t of e)r(` • ${t}`,`error`);r(``,`error`),r(`Please fix these errors before continuing.`,`error`)}async function Q(e,t=new Map,n={}){let r={};for(let i of e){let e=t.get(i.id);e!==void 0&&(i.transformers!==void 0&&(e=await nt.apply(i.transformers,e,{...n,...r})),r[i.id]=e)}return r}async function cn(e,t,n){if(e==null)return;if(typeof e!=`object`||!e||Array.isArray(e))return e;let i=e;if(i.type===`conditional`){if(!n){r(`Variable "${t}": conditional value requires context but none provided`,`warn`);return}if(typeof i.condition!=`string`){r(`Variable "${t}": conditional value must have a string condition`,`error`);return}try{let{evaluateCondition:e}=await import(`./utils-B6WSsvMT.js`),r=e(i.condition,n)?i.ifTrue:i.ifFalse;return typeof r==`object`&&r?await cn(r,t,n):r}catch(e){r(`Variable "${t}": failed to evaluate conditional value: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}if(i.type===`exec`){let e=i.value;if(typeof e!=`string`){r(`Variable "${t}": exec value must have a string command`,`error`);return}try{let t=S(e,{encoding:`utf-8`,stdio:[`pipe`,`pipe`,`pipe`],timeout:1e4}).trim();if(t.startsWith(`{`)||t.startsWith(`[`))try{return JSON.parse(t)}catch{return t}if(/^-?\d+(?:\.\d+)?$/u.test(t)){let e=Number.parseFloat(t);if(!Number.isNaN(e))return e}return t===`true`||t===`false`?t===`true`:t}catch(e){r(`Variable "${t}": failed to execute command: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}else if(i.type===`static`)return i.value;else if(i.type===`interpolate`){let e=i.value;if(typeof e!=`string`){r(`Variable "${t}": interpolate value must be a string with {{variable}} placeholders`,`error`);return}if(!n)return r(`Variable "${t}": interpolate value requires context but none provided`,`warn`),e;try{return u(e,n)}catch(n){return r(`Variable "${t}": failed to interpolate interpolate value: ${n instanceof Error?n.message:`Unknown error`}`,`warn`),e}}else if(i.type!==void 0){r(`Variable "${t}": unknown value type "${i.type}". Expected "static", "exec", "conditional", or "interpolate".`,`error`);return}return e}async function $(e,t,n){let r=new Map;for(let i of e){if(n?.skipConditional===!0&&typeof i.value==`object`&&i.value!==null&&!Array.isArray(i.value)&&i.value.type===`conditional`)continue;if(i.$templateEnabled!=null){let e={...t};for(let[t,n]of r.entries())e[t]=n;if(!await m(i.$templateEnabled,e))continue}let e={...t};for(let[t,n]of r.entries())e[t]=n;let a=await cn(i.value,i.id,e);a!==void 0&&r.set(i.id,a)}return r}function ln(e){let t=[],n=new Set;for(let r of e)n.has(r.id)&&t.push(`Duplicate variable ID: "${r.id}"`),n.add(r.id);return t}async function un(t,n){let i=e();if(!await m(n.templateEnabled,i,{lazy:!0})){s(`⊘ Template is disabled - skipping all execution`);return}n.transformers!==void 0&&n.transformers.length>0&&(o(`Registering ${n.transformers.length} transformer(s)...`),nt.registerAll(n.transformers)),o(`Registering built-in plugins...`),Z(),o(`Validating task configurations...`);let a=an(t);a.length>0&&(sn(a),b.exit(1)),o(`All tasks validated successfully`);let c=t.filter(t=>d(t.enabled,e(),{lazy:!0}));o(`Resolving task dependencies...`);let u=rn(c);o(`Sorted ${u.length} task(s) by dependencies`),s(`Welcome! Let's execute your tasks.`),n.dryRun&&l(`🔍 DRY RUN MODE - No changes will be made`),s(`This will execute your project tasks based on the defined configuration.`);let p=i,h=[...n.variables??[]];if(h.length>0){let e=ln(h);e.length>0&&(r(`❌ Variable validation errors:`,`error`),e.forEach(e=>r(` - ${e}`,`error`)),b.exit(1)),o(`Resolving variable values...`);let t=await Q(h,await $(h,p,{skipConditional:!0}),p);Object.assign(p,t),Object.keys(t).length>0&&(o(`Resolved ${Object.keys(t).length} variable(s)`),o(`Variable values: ${JSON.stringify(t)}`))}let g=n.prompts??[],_=[...g];if(_.length>0){let e=st(_);e.length>0&&(r(`❌ Prompt validation errors:`,`error`),e.forEach(e=>r(` - ${e}`,`error`)),b.exit(1)),o(`Resolving prompt default values...`);let t=await ot(_,p);if(g.length>0){s(`📋 Collecting prompts (available to all tasks):`);let e=await at(g,t,p);Object.assign(p,e)}}if(h.length>0){let e=h.filter(e=>typeof e.value==`object`&&e.value!==null&&!Array.isArray(e.value)?e.value.type===`conditional`:!1);if(e.length>0){o(`Re-resolving conditional variables with prompt values...`);let t=await Q(e,await $(e,p),p);Object.assign(p,t),Object.keys(t).length>0&&o(`Resolved ${Object.keys(t).length} conditional variable(s)`)}}if(!await m(n.templateEnabled,p)){s(`⊘ Template is disabled after variable resolution - skipping all execution`);return}let v=[];for(let e of u)e.$templateEnabled!=null&&!await m(e.$templateEnabled,p)||await m(e.enabled,p)&&v.push(e);if(r(`${v.length} of ${u.length} task(s) enabled for execution`,`info`),n.dryRun){await V(v,p),s(`🔍 Dry run completed - no changes were made`),s(`Run without --dry-run to apply changes`);return}o(`Calling beforeAll hook...`),await J(`beforeAll`,p);let y=v.length,x=0,S=0,ee=[],C=[];for(let e=0;e<v.length;e++){let t=v[e];t!=null&&(o(`Calling beforeTask hook for task: ${t.name}`),await J(`beforeTask`,t,p),await nn(t,p,e+1,y,n.dryRun)?(x++,ee.push(t.id),o(`Calling afterTask hook for task: ${t.name}`),await J(`afterTask`,t,p)):(await Y(t.required,p)&&(S++,C.push(t.name)),o(`Calling onError hook for task: ${t.name}`),await J(`onError`,Error(`Task ${t.name} failed`),t),l(`⚠️ Task "${t.name}" failed, continuing with remaining tasks...`)))}S>0&&(r(`\n❌ Task execution completed with ${S} error(s)`,`error`),r(`Completed: ${x}/${y} tasks`,`info`),r(`Failed tasks: ${C.join(`, `)}`,`error`),b.exit(1)),o(`Calling afterAll hook...`),await J(`afterAll`,p),f(`✅ All tasks completed successfully!`),f(` Completed: ${x}/${y} tasks`)}async function dn(e,t,n={}){o(`Running templates with sequential variable/prompt resolution...`),o(`Total templates to process: ${e.length}`),o(`Registering built-in plugins...`),Z();let i=[];console.log(``),s(`📋 Collecting input...`),console.log(``);for(let t=0;t<e.length;t++){let a=e[t];if(a==null)continue;let c=`=`.repeat(60);if(o(`\n${c}`),o(`Processing template ${t+1}/${e.length}: "${a.name}"`),o(c),o(`Current config keys: ${Object.keys(n).join(`, `)}`),!await m(a.enabled,n)){s(`⊘ Template "${a.name}" is disabled - skipping`),o(` Enabled condition: ${JSON.stringify(a.enabled)}`);continue}let l=a.variables??[];if(l.length>0){o(`Processing ${l.length} variable(s) for template "${a.name}"...`);let e=ln(l);e.length>0&&(r(`❌ Variable validation errors:`,`error`),e.forEach(e=>r(` - ${e}`,`error`)),b.exit(1));let t=await Q(l,await $(l,n,{skipConditional:!0}),n);Object.assign(n,t);let i=l.filter(e=>typeof e.value==`object`&&e.value!==null&&!Array.isArray(e.value)?e.value.type===`conditional`:!1),s=0;if(i.length>0){let e=await Q(i,await $(i,n),n);if(s=Object.keys(e).length,Object.assign(n,e),s>0){o(`Resolved ${s} conditional variable(s)`);for(let[t,n]of Object.entries(e))o(` ${t} = ${JSON.stringify(n)}`)}}let c=Object.keys(t).length+s;if(c>0){o(`Total variables resolved for template: ${c}`);for(let[e,n]of Object.entries(t))o(` ${e} = ${JSON.stringify(n)}`)}}let u=a.prompts??[];if(u.length>0){o(`Processing ${u.length} prompt(s) for template "${a.name}"...`);let e=st(u);e.length>0&&(r(`❌ Prompt validation errors:`,`error`),e.forEach(e=>r(` - ${e}`,`error`)),b.exit(1));let t=await at(u,await ot(u,n),n);Object.assign(n,t),o(`Collected ${Object.keys(t).length} prompt answer(s)`)}if(!await m(a.enabled,n)){s(`⊘ Template "${a.name}" became disabled after variable/prompt resolution - skipping tasks`);continue}let d=a.tasks??[];d.length>0&&(o(`Found ${d.length} task(s) in template "${a.name}" (will execute later)`),i.push(...d))}if(o(`
24
- 🔧 Validating and filtering all collected tasks...`),i.length===0){r(`No tasks found in any template`,`info`);return}let a=an(i);a.length>0&&(sn(a),b.exit(1)),console.log(``),r(`🛠️ Preparing tasks...`,`info`);let c=[];for(let e of i)await m(e.enabled,n)&&c.push(e);if(console.log(``),r(`Found ${i.length} tasks (${c.length} enabled)`,`info`),r(`All tasks validated successfully`,`success`),c.length===0){r(`No enabled tasks to execute`,`info`);return}let u=rn(c);if(t.dryRun){r(`
25
- 🔍 Dry run - showing task changes...`,`info`),await V(u,n),r(`
26
- 🔍 Dry run completed - no changes were made`,`info`),r(`Run without --dry-run to apply changes`,`info`);return}console.log(``),s(`⚙️ Executing tasks...`),console.log(``),await J(`beforeAll`,n);let d=0,f=0,p=[];for(let e=0;e<u.length;e++){let r=u[e];r!=null&&(await J(`beforeTask`,r,n),await nn(r,n,e+1,u.length,t.dryRun)?(d++,await J(`afterTask`,r,n)):(await Y(r.required,n)&&(f++,p.push(r.name)),await J(`onError`,Error(`Task ${r.name} failed`),r),l(`⚠️ Task "${r.name}" failed, continuing with remaining tasks...`)))}await J(`afterAll`,n),f>0&&(r(`\n❌ Task execution completed with ${f} error(s)`,`error`),r(`Completed: ${d}/${u.length} tasks`,`info`),r(`Failed tasks: ${p.join(`, `)}`,`error`),b.exit(1)),r(`Completed: ${d}/${u.length} tasks`,`success`)}export{Re as A,N as B,Ye as C,et as D,qe as E,Le as F,ke as G,I as H,Ke as I,ye as J,xe as K,Ne as L,Be as M,Ie as N,V as O,ze as P,Pe as R,q as S,G as T,je as U,P as V,F as W,Te as X,M as Y,tt as _,cn as a,K as b,tn as c,st as d,ot as f,Xe as g,J as h,$ as i,Ve as j,Fe as k,Z as l,X as m,dn as n,Q as o,at as p,Ae as q,ln as r,rn as s,un as t,nn as u,Qe as v,Ze as w,$e as x,Je as y,Me as z};