task-pipeliner 0.2.12 → 0.2.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.ko.md +1 -1
- package/README.md +1 -1
- package/dist/index.cjs +44 -44
- package/package.json +1 -1
package/README.ko.md
CHANGED
package/README.md
CHANGED
package/dist/index.cjs
CHANGED
|
@@ -1,24 +1,24 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
"use strict";var
|
|
3
|
-
`){i.length>0&&(
|
|
4
|
-
`)),
|
|
5
|
-
`)),P
|
|
6
|
-
`),
|
|
7
|
-
`);let R
|
|
8
|
-
`);){let i=
|
|
9
|
-
`),a=
|
|
10
|
-
`).forEach(r=>{r.trim()&&console.log(`| ${r}`)}):console.log(e)}displayBufferedOutput(e,t,r=!1,o
|
|
11
|
-
`)}),e.stderr.forEach(p=>{let l=
|
|
12
|
-
`)});let a=
|
|
13
|
-
Total execution time: ${
|
|
14
|
-
`)):(0,
|
|
15
|
-
`))}displayParallelResults(e,t,r){let
|
|
2
|
+
"use strict";var Te=Object.create;var ce=Object.defineProperty;var Be=Object.getOwnPropertyDescriptor;var Ie=Object.getOwnPropertyNames;var De=Object.getPrototypeOf,Ae=Object.prototype.hasOwnProperty;var je=(s,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of Ie(e))!Ae.call(s,n)&&n!==t&&ce(s,n,{get:()=>e[n],enumerable:!(r=Be(e,n))||r.enumerable});return s};var S=(s,e,t)=>(t=s!=null?Te(De(s)):{},je(e||!s||!s.__esModule?ce(t,"default",{value:s,enumerable:!0}):t,s));var Ce=require("child_process"),ae=require("fs"),Ee=require("fs/promises"),L=require("path"),Pe=require("util"),le=S(require("boxen"),1),u=S(require("chalk"),1),Me=require("commander"),Ne=S(require("dayjs"),1);var T=require("path"),be=S(require("chalk"),1),z=S(require("log-update"),1);var pe=S(require("readline"),1),x=S(require("chalk"),1),q=S(require("inquirer"),1),ue=15,M=class{searchable;constructor(e=!1){this.searchable=e}async prompt(e,t){if(this.searchable)return this.promptWithSearch(e,t);let{choice:r}=await q.default.prompt([{type:"list",name:"choice",message:x.default.cyan(e),choices:t.map(o=>({name:o.label,value:o.id})),pageSize:ue}]),n=t.find(o=>o.id===r);if(!n)throw new Error(`Invalid choice: ${r}`);return n}async promptWithSearch(e,t){return new Promise(r=>{let n="",o=0,i=[...t],a=pe.createInterface({input:process.stdin,output:process.stdout,terminal:!1});process.stdin.isTTY&&process.stdin.setRawMode(!0),process.stdout.write("\x1B[?1049h"),process.stdout.write("\x1B[?25l");let p=()=>{process.stdout.write("\x1B[H\x1B[2J"),console.log(x.default.cyan(`? ${e}`));let h=n?x.default.gray(` Filter: ${n}`)+x.default.gray(` (${i.length}/${t.length})`):x.default.gray(" Type to filter, \u2191\u2193 to navigate, Enter to select");console.log(h),console.log();let m=ue,d=0,g=i.length;if(i.length>m){let w=Math.floor(m/2);d=Math.max(0,o-w),g=Math.min(i.length,d+m),g===i.length&&(d=Math.max(0,g-m))}if(i.length===0)console.log(x.default.yellow(" No matches found"));else{d>0&&console.log(x.default.gray(` \u2191 ${d} more above`));for(let w=d;w<g;w++){let y=i[w];console.log(w===o?x.default.cyan(`\u276F ${y.label}`):x.default.white(` ${y.label}`))}g<i.length&&console.log(x.default.gray(` \u2193 ${i.length-g} more below`))}},l=()=>{let h=n.toLowerCase();i=h?t.filter(m=>m.label.toLowerCase().includes(h)):[...t],o>=i.length&&(o=Math.max(0,i.length-1))},f=()=>{process.stdin.isTTY&&process.stdin.setRawMode(!1),a.close(),process.stdout.write("\x1B[?25h"),process.stdout.write("\x1B[?1049l")};p(),process.stdin.on("data",h=>{let m=h.toString();if(m===""&&(f(),process.exit(0)),m==="\r"||m===`
|
|
3
|
+
`){i.length>0&&(f(),r(i[o]));return}if(m==="\x1B"&&h.length===1){n&&(n="",l(),p());return}if(m==="\x1B[A"){i.length>0&&(o=o>0?o-1:i.length-1,p());return}if(m==="\x1B[B"){i.length>0&&(o=o<i.length-1?o+1:0,p());return}if(m==="\x7F"||m==="\b"){n.length>0&&(n=n.slice(0,-1),l(),p());return}m.length===1&&m>=" "&&m<="~"&&(n+=m,l(),p())})})}},O=class{async prompt(e,t){let{value:r}=await q.default.prompt([{type:"input",name:"value",message:x.default.cyan(e),default:t}]);return r}};var H=S(require("boxen"),1),B=S(require("chalk"),1);function K(s,e,t,r={}){let{borderColor:n="cyan",isNested:o=!1}=r,i;e!==void 0&&(t?i=`line ${e} in ${t}`:i=`line ${e}`);let a=o?`\u2502 ${s}`:`> ${s}`;return(0,H.default)(a,{title:i,borderStyle:"round",padding:{top:0,bottom:0,left:1,right:1},margin:{top:0,bottom:0,left:0,right:0},borderColor:n})}function I(s,e=!1,t){let r=s?"\u2713 Completed":"\u2717 Failed",n=s?B.default.green(r):B.default.red(r);if(t!==void 0){let o=D(t);return`${n} ${B.default.gray(`(${o})`)}`}return n}function W(s){return(0,H.default)(`\u2717 ${s}`,{borderStyle:"round",padding:{top:0,bottom:0,left:1,right:1},margin:{top:0,bottom:0,left:0,right:0},borderColor:"red"})}function me(s){return(0,H.default)(`> Starting parallel execution (${s} branches)`,{borderStyle:"round",padding:{top:0,bottom:0,left:1,right:1},margin:{top:0,bottom:0,left:0,right:0},borderColor:"yellow"})}function fe(s){let e=s?"\u2713 All parallel branches completed":"\u2717 Some parallel branches failed";return s?B.default.green(e):B.default.red(e)}function Q(s,e=!1){return`${e?"| \u2502 ":"\u2502 "}${s}`}function D(s){return`${(s/1e3).toFixed(3)}s`}var de=require("fs"),he=require("path"),A=class{constructor(e){this.workspace=e}evaluate(e){return"var"in e||"has"in e?this.evaluateVarExists(e):"file"in e?this.evaluateFileExists(e):"choice"in e?this.evaluateChoice(e):"all"in e?this.evaluateAll(e):"any"in e?this.evaluateAny(e):"not"in e?this.evaluateNot(e):!1}evaluateVarExists(e){if(e.has)return this.workspace.hasVariable(e.has)||this.workspace.hasFact(e.has);if(!e.var)return!1;if(typeof e.var=="object"){for(let[r,n]of Object.entries(e.var)){let o=this.workspace.getVariable(r),i=this.workspace.getFact(r),a=o??(i!==void 0?i.toString():void 0);if(a===void 0||a!==n)return!1}return!0}let t=e.var;return this.workspace.hasVariable(t)||this.workspace.hasFact(t)}evaluateFileExists(e){try{let t=e.file.trim(),r=(0,he.resolve)(process.cwd(),t);return(0,de.existsSync)(r)}catch{return!1}}evaluateChoice(e){return this.workspace.hasChoice(e.choice)}evaluateAll(e){return e.all.every(t=>this.evaluate(t))}evaluateAny(e){return e.any.some(t=>this.evaluate(t))}evaluateNot(e){return!this.evaluate(e.not)}};var k=require("fs/promises"),ge=require("os"),N=require("path"),we=S(require("dayjs"),1),j=(0,N.join)((0,ge.homedir)(),".pipeliner","workflow-history"),F=class{constructor(){}async saveHistory(e){await(0,k.mkdir)(j,{recursive:!0});let t=(0,we.default)().format("YYYY-MM-DD_HH-mm-ss"),r=Math.random().toString(36).slice(2,6),n=(0,N.join)(j,`workflow-${t}-${r}.json`);return await(0,k.writeFile)(n,JSON.stringify(e,null,2),{encoding:"utf8"}),n}async clearAllHistories(){await(0,k.rm)(j,{recursive:!0,force:!0})}async removeHistory(e){await(0,k.rm)((0,N.join)(j,e),{force:!0})}async getHistoryNames(){try{let t=(await(0,k.readdir)(j)).map(r=>(0,N.basename)(r));return t.sort((r,n)=>{let o=p=>{let l=p.match(/workflow-(\d{4}-\d{2}-\d{2}_\d{2}-\d{2}-\d{2})-/);return l?l[1]:""},i=o(r),a=o(n);return i===a?n.localeCompare(r):a.localeCompare(i)}),t}catch(e){if(e instanceof Error&&"code"in e&&e.code==="ENOENT")return[];throw e}}async getHistory(e){let t=await(0,k.readFile)((0,N.join)(j,e),{encoding:"utf8"});return JSON.parse(t)}};var V=class{records=[];initialTimestamp=Date.now();recordStartTimestamp=Date.now();constructor(){this.records=[]}recordStart(){this.recordStartTimestamp=Date.now()}recordEnd(e,t,r,n){let o=this.getDuration();return this.records.push({step:e,context:t,output:r,duration:o,status:n}),o}reset(){this.records=[],this.initialTimestamp=Date.now()}async save(){let e=new F,t={initialTimestamp:this.initialTimestamp,records:this.records};return await e.saveHistory(t)}getDuration(){return Date.now()-this.recordStartTimestamp}};var ee=require("child_process");var J=class{async run(e,t,r,n,o=!1,i=!1,a,p,l,f){return o?this.runBuffered(e,l,f):this.runRealtime(e,r||e,i,a,p,l,f)}async runBuffered(e,t,r){let n=this.createSpawnOptions(t);return new Promise((o,i)=>{let a=(0,ee.spawn)(e,[],n),p=[],l=[],f="",h="",m=null;r&&r>0&&(m=setTimeout(()=>{a.kill("SIGTERM");let d=`Command timed out after ${r} seconds`;l.push(d),o({success:!1,stdout:p,stderr:l})},r*1e3)),a.stdout?.on("data",d=>{let g=d.toString(),{lines:w,remaining:y}=this.processStreamBuffer(g,f);p.push(...w),f=y}),a.stderr?.on("data",d=>{let g=d.toString(),{lines:w,remaining:y}=this.processStreamBuffer(g,h);l.push(...w),h=y}),a.on("close",d=>{m&&clearTimeout(m),f.trim()&&p.push(f),h.trim()&&l.push(h),o({success:d===0,stdout:p,stderr:l})}),a.on("error",d=>{m&&clearTimeout(m);let g=`Error: ${d.message}`;o({success:!1,stdout:p,stderr:[...l,g]})})})}async runRealtime(e,t,r,n,o,i,a){let p=this.createSpawnOptions(i),f=K(t,n,o,{borderColor:r?"green":"cyan"});console.log(f);let h=Date.now();return new Promise(m=>{let d=(0,ee.spawn)(e,[],p),g="",w="",y=null;a&&a>0&&(y=setTimeout(()=>{d.kill("SIGTERM");let R=`Command timed out after ${a} seconds`,v=W(R);console.error(v);let E=Date.now()-h,P=I(!1,!1,E);console.log(P),m(!1)},a*1e3)),d.stdout?.on("data",R=>{let v=R.toString(),{lines:E,remaining:P}=this.processStreamBuffer(v,g);E.forEach(X=>process.stdout.write(`\u2502 ${X}
|
|
4
|
+
`)),g=P}),d.stderr?.on("data",R=>{let v=R.toString(),{lines:E,remaining:P}=this.processStreamBuffer(v,w);E.forEach(X=>process.stderr.write(`\u2502 ${X}
|
|
5
|
+
`)),w=P}),d.on("close",R=>{y&&clearTimeout(y),g.trim()&&process.stdout.write(`\u2502 ${g}
|
|
6
|
+
`),w.trim()&&process.stderr.write(`\u2502 ${w}
|
|
7
|
+
`);let v=R===0,E=Date.now()-h,P=I(v,!1,E);console.log(P),m(v)}),d.on("error",R=>{y&&clearTimeout(y);let v=W(`Error: ${R.message}`);console.error(v),m(!1)})})}createSpawnOptions(e){let t={stdio:["inherit","pipe","pipe"],shell:!0};return e&&(t.cwd=e),t}processStreamBuffer(e,t){let r=t+e,n=[],o=r;for(;o.includes(`
|
|
8
|
+
`);){let i=o.indexOf(`
|
|
9
|
+
`),a=o.substring(0,i);o=o.substring(i+1),n.push(a)}return{lines:n,remaining:o}}formatNestedOutput(e,t){t?e.split(`
|
|
10
|
+
`).forEach(r=>{r.trim()&&console.log(`| ${r}`)}):console.log(e)}displayBufferedOutput(e,t,r=!1,n,o){let i=K(t,n,o,{borderColor:"cyan",isNested:r});this.formatNestedOutput(i,r),e.stdout.forEach(p=>{let l=Q(p,r);process.stdout.write(`${l}
|
|
11
|
+
`)}),e.stderr.forEach(p=>{let l=Q(p,r);process.stderr.write(`${l}
|
|
12
|
+
`)});let a=I(e.success,r);console.log(a)}};function Fe(s,e,t){if(e.hasVariable(s))return e.getVariable(s)||t;if(e.hasFact(s)){let r=e.getFact(s);return typeof r=="string"?r:String(r)}return e.hasChoice(s)&&e.getChoice(s)||t}function Y(s,e){let t=/\{\{(\w+)\}\}/g;return s.replace(t,(r,n)=>Fe(n,e,r))}var U=class s{state;constructor(){this.state={facts:new Map,choices:new Map,variables:new Map,stepResults:new Map,lastStepIndex:-1}}hasFact(e){return this.state.facts.has(e)}getFact(e){return this.state.facts.get(e)}setFact(e,t){this.state.facts.set(e,t)}getFactStatus(e){if(!this.hasFact(e))return"pending";let t=this.getFact(e);return t===!1||t==="failed"?"failed":"ready"}getAllFacts(){return new Map(this.state.facts)}hasChoice(e){return this.state.choices.has(e)}getChoice(e){return this.state.choices.get(e)}setChoice(e,t){this.state.choices.set(e,t)}hasVariable(e){return this.state.variables.has(e)}getVariable(e){return this.state.variables.get(e)}setVariable(e,t){this.state.variables.set(e,t)}getAllVariables(){return new Map(this.state.variables)}setStepResult(e,t,r){this.state.stepResults.set(e,{success:t,exitCode:r}),this.state.lastStepIndex=e}getStepResult(e){return this.state.stepResults.get(e)}getLastStepResult(){if(this.state.lastStepIndex!==-1)return this.state.stepResults.get(this.state.lastStepIndex)}clone(){let e=new s;return e.state.facts=new Map(this.state.facts),e.state.choices=new Map(this.state.choices),e.state.variables=new Map(this.state.variables),e.state.stepResults=new Map(this.state.stepResults),e.state.lastStepIndex=this.state.lastStepIndex,e}};var Z=class s{static PARALLEL_STEP_INDEX_MULTIPLIER=1e3;workspace;taskRunner;choicePrompt;textPrompt;baseDir;constructor(){this.workspace=new U,this.taskRunner=new J,this.choicePrompt=new M,this.textPrompt=new O}resolveBaseDir(e){if(e.baseDir)if((0,T.isAbsolute)(e.baseDir))this.baseDir=e.baseDir;else if(e._filePath){let t=(0,T.dirname)(e._filePath);this.baseDir=(0,T.resolve)(t,e.baseDir)}else this.baseDir=(0,T.resolve)(process.cwd(),e.baseDir)}createStepContext(e,t){let r={workspace:this.workspace,stepIndex:e};return t._lineNumbers&&(r.lineNumber=t._lineNumbers.get(e)),t._fileName&&(r.fileName=t._fileName),r}evaluateStepCondition(e){return e.when?new A(this.workspace).evaluate(e.when):!0}calculateBaseStepIndex(e){return e.branchIndex===void 0?e.stepIndex:Math.floor(e.stepIndex/s.PARALLEL_STEP_INDEX_MULTIPLIER)}isRunStep(e){return"run"in e}async execute(e){this.resolveBaseDir(e);let t=new V,r=Date.now();for(let i=0;i<e.steps.length;i++){let a=e.steps[i],p=this.createStepContext(i,e),l=!!a.when;if(this.evaluateStepCondition(a)){t.recordStart();try{let f=await this.executeStep(a,p,!1,l);this.handleStepResult(a,p,i,f,t)}catch(f){throw this.handleStepError(a,p,i,f,t),f}}}let n=Date.now()-r,o=D(n);console.log(be.default.cyan(`
|
|
13
|
+
Total execution time: ${o}`)),await t.save(),t.reset()}isStepSuccessful(e,t){return"run"in t?typeof e=="boolean"?e:e&&typeof e=="object"&&"success"in e?e.success:!1:!0}handleStepResult(e,t,r,n,o){let i=this.isRunStep(e)?(()=>{let l=this.workspace.getStepResult(r);return l?l.success:!0})():this.isStepSuccessful(n,e),a=i?"success":"failure",p=o.recordEnd(e,t,n,a);if(!this.isRunStep(e)){let l=I(i,!1,p);console.log(l)}if(this.isRunStep(e)){if(e.continue===!1){let l=t.lineNumber?` (line ${t.lineNumber})`:"",f=i?`Step ${r}${l} completed, but workflow stopped due to continue: false`:`Step ${r}${l} failed`;throw new Error(f)}if(!i&&e.continue!==!0){let l=t.lineNumber?` (line ${t.lineNumber})`:"";throw new Error(`Step ${r}${l} failed`)}}}handleStepError(e,t,r,n,o){this.workspace.setStepResult(r,!1);let i=n instanceof Error?n.message:String(n),a={success:!1,stdout:[],stderr:[i]};o.recordEnd(e,t,a,"failure")}fixMalformedStep(e){let r=e;return"choose"in e&&r.choose===null&&"message"in e&&"options"in e?{choose:{message:r.message,options:r.options,as:r.as},when:r.when}:"prompt"in e&&r.prompt===null&&"message"in e&&"as"in e?{prompt:{message:r.message,as:r.as,default:r.default},when:r.when}:e}async executeStep(e,t,r=!1,n=!1){if(e=this.fixMalformedStep(e),"run"in e){let o=await this.executeRunStep(e,t,r,n);return r&&typeof o=="object"&&"stdout"in o,o}if("choose"in e){await this.executeChooseStep(e,t);return}if("prompt"in e){await this.executePromptStep(e,t);return}if("parallel"in e){await this.executeParallelStep(e,t);return}if("fail"in e){await this.executeFailStep(e,t);return}}async executeSingleRun(e,t,r=!1,n=!1){let o=this.calculateBaseStepIndex(t),i=Y(e.run,this.workspace),a=e.retry??0,p=e.timeout,l=!1,f=0;for(;f<=a;){let h=await this.taskRunner.run(i,o,i,t.branchIndex,r,n,t.lineNumber,t.fileName,this.baseDir,p),m=typeof h=="boolean"?h:h.success;if(l=h,m||f>=a)break;if(f++,f<=a){let d=Math.min(1e3*Math.pow(2,f-1),1e4);await new Promise(g=>setTimeout(g,d))}}return l}async executeRunStep(e,t,r=!1,n=!1){let o=await this.executeSingleRun({run:e.run,timeout:e.timeout,retry:e.retry},t,r,n),i=typeof o=="boolean"?o:o.success;if(this.workspace.setStepResult(t.stepIndex,i),i||!e.onError)return o;let a={run:e.onError.run,timeout:e.onError.timeout,retry:e.onError.retry,onError:e.onError.onError??void 0};return await this.executeRunChain(a,t,r,n)}async executeRunChain(e,t,r,n){let o=await this.executeSingleRun({run:e.run,timeout:e.timeout,retry:e.retry},t,r,n);return(typeof o=="boolean"?o:o.success)||!e.onError?o:this.executeRunChain(e.onError,t,r,n)}async executeChooseStep(e,t){let r=await this.choicePrompt.prompt(e.choose.message,e.choose.options);if(!r?.id)throw new Error(`Invalid choice result: ${JSON.stringify(r)}`);let n=e.choose.as??r.id;this.workspace.setChoice(r.id,r.id),this.workspace.setVariable(n,r.id),this.workspace.setStepResult(t.stepIndex,!0)}async executePromptStep(e,t){let r=Y(e.prompt.message,this.workspace),n=e.prompt.default?Y(e.prompt.default,this.workspace):void 0,o=await this.textPrompt.prompt(r,n);this.workspace.setVariable(e.prompt.as,o),this.workspace.setFact(e.prompt.as,o),this.workspace.setStepResult(t.stepIndex,!0)}createParallelContexts(e,t){return e.parallel.map((r,n)=>({workspace:this.workspace.clone(),stepIndex:t.stepIndex*s.PARALLEL_STEP_INDEX_MULTIPLIER+n,branchIndex:n,lineNumber:t.lineNumber,fileName:t.fileName}))}getBranchDisplayName(e,t){return"run"in e?e.run:"choose"in e?`Choose: ${e.choose.message}`:"prompt"in e?`Prompt: ${e.prompt.message}`:"fail"in e?`Fail: ${e.fail.message}`:`Branch ${t+1}`}async executeParallelBranches(e,t){let r=[],n=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],o=0;for(let l=0;l<e.length;l++){let f=e[l],h=t[l];if(f.when&&!new A(h.workspace).evaluate(f.when))continue;let m=this.getBranchDisplayName(f,l);r.push({index:l,name:m,status:"pending"})}let i=setInterval(()=>{o=(o+1)%n.length,this.updateParallelBranchesDisplay(r,n[o])},100),a=r.map(async l=>{let{index:f}=l,h=e[f],m=t[f];l.status="running";try{let d=await this.executeStep(h,m,!0);return l.status="success",this.updateParallelBranchesDisplay(r,n[o]),{index:f,result:d,context:m}}catch(d){m.workspace.setStepResult(m.stepIndex,!1);let g=d instanceof Error?d.message:String(d);return l.status="failed",l.error=g,this.updateParallelBranchesDisplay(r,n[o]),{index:f,error:d,context:m}}}),p=await Promise.all(a);return clearInterval(i),this.updateParallelBranchesDisplay(r,"",!0),z.default.done(),p}updateParallelBranchesDisplay(e,t,r=!1){let n=e.map(o=>{let i=o.index+1,a="",p="";switch(o.status){case"pending":a="\u25CB",p=`Branch ${i}: ${o.name} - Pending`;break;case"running":a=t,p=`Branch ${i}: ${o.name} - Running...`;break;case"success":a="\u2713",p=`Branch ${i}: ${o.name} - Completed`;break;case"failed":a="\u2717",p=`Branch ${i}: ${o.name} - Failed${o.error?`: ${o.error}`:""}`;break}return`${a} ${p}`});r?(0,z.default)(n.join(`
|
|
14
|
+
`)):(0,z.default)(n.join(`
|
|
15
|
+
`))}displayParallelResults(e,t,r){let n=!0,o=!1;console.log("");for(let a of e){if(!a)continue;o=!0;let{index:p,result:l,error:f,context:h}=a;if(f){n=!1;let m=`Branch ${p+1} failed: ${f instanceof Error?f.message:String(f)}`,d=W(m);console.error(d)}else if(l&&typeof l=="object"&&"stdout"in l){let m=l;if(n=n&&m.success,m.stdout.length>0||m.stderr.length>0||!m.success){let d=t[p],g=this.getBranchDisplayName(d,p);this.taskRunner.displayBufferedOutput(m,g,!1,h.lineNumber,h.fileName)}}}o||console.log("\u26A0\uFE0F All parallel branches were skipped (conditions not met)");let i=fe(n);return console.log(i),n}mergeParallelResults(e){for(let t of e){let r=t.workspace.getAllFacts(),n=t.workspace.getAllVariables();for(let[o,i]of r)this.workspace.setFact(o,i);for(let[o,i]of n)this.workspace.setVariable(o,i)}}countExecutableBranches(e,t){let r=0;for(let n=0;n<e.length;n++){let o=e[n],i=t[n];o.when&&!new A(i.workspace).evaluate(o.when)||r++}return r}async executeParallelStep(e,t){let r=this.createParallelContexts(e,t),n=this.countExecutableBranches(e.parallel,r),o=me(n);console.log(o);let i=await this.executeParallelBranches(e.parallel,r),a=this.displayParallelResults(i,e.parallel,t);if(this.workspace.setStepResult(t.stepIndex,a),!a){let p=t.lineNumber?` (line ${t.lineNumber})`:"";throw new Error(`Parallel step ${t.stepIndex}${p} failed: one or more branches failed`)}this.mergeParallelResults(r)}async executeFailStep(e,t){let r=new Error(e.fail.message);throw r.stack=void 0,r}};var Se=require("yaml"),oe=require("zod");var c=require("zod"),Le=c.z.object({file:c.z.string()}),We=c.z.object({var:c.z.union([c.z.string(),c.z.record(c.z.string(),c.z.string())]).optional(),has:c.z.string().optional()}),_e=c.z.object({status:c.z.object({fact:c.z.string(),is:c.z.enum(["ready","failed","pending"])})}),Oe=c.z.object({step:c.z.object({success:c.z.boolean()}).optional(),last_step:c.z.enum(["success","failure"]).optional()}),He=c.z.object({choice:c.z.string()}),Ve=c.z.union([Le,He,We,_e,Oe]),C=c.z.lazy(()=>c.z.union([Ve,c.z.object({all:c.z.array(C)}),c.z.object({any:c.z.array(C)}),c.z.object({not:C})])),ye=c.z.lazy(()=>c.z.object({run:c.z.string(),timeout:c.z.number().optional(),retry:c.z.number().optional(),onError:ye.optional()})),Je=c.z.object({run:c.z.string(),when:C.optional(),timeout:c.z.number().optional(),retry:c.z.number().optional(),continue:c.z.boolean().optional(),onError:ye.optional()}),Ye=c.z.object({choose:c.z.object({message:c.z.string(),options:c.z.array(c.z.object({id:c.z.string(),label:c.z.string()})),as:c.z.string().optional()}),when:C.optional()}),Ue=c.z.object({prompt:c.z.object({message:c.z.string(),as:c.z.string(),default:c.z.string().optional(),validate:c.z.string().optional()}),when:C.optional()}),xe=c.z.lazy(()=>c.z.union([Je,Ye,Ue,c.z.object({parallel:c.z.array(xe),when:C.optional()}),c.z.object({fail:c.z.object({message:c.z.string()}),when:C.optional()})])),ze=c.z.object({name:c.z.string().optional(),baseDir:c.z.string().optional(),steps:c.z.array(xe).min(1,"Workflow must have at least one step")});function te(s){return ze.parse(s)}function ne(s){let e=s;return"choose"in e&&(e.choose===null||e.choose===void 0)&&"message"in e&&"options"in e?{choose:{message:e.message,options:e.options,as:e.as},when:e.when}:"prompt"in e&&(e.prompt===null||e.prompt===void 0)&&"message"in e&&"as"in e?{prompt:{message:e.message,as:e.as,default:e.default,validate:e.validate},when:e.when}:"parallel"in e&&Array.isArray(e.parallel)?{...e,parallel:e.parallel.map(t=>ne(t))}:s}var G=class{parse(e){let t;try{t=(0,Se.parse)(e)}catch(r){throw new Error(`Invalid YAML format: ${r instanceof Error?r.message:String(r)}`)}if(t&&typeof t=="object"&&"steps"in t){let r=t;Array.isArray(r.steps)&&(r.steps=r.steps.map(n=>ne(n)))}try{return te(t)}catch(r){if(r instanceof oe.ZodError){let n=r.issues.map(o=>{let i=o.path.length>0?` at ${o.path.join(".")}`:"";return` - ${o.message}${i}`}).join(`
|
|
16
16
|
`);throw new Error(`Invalid workflow structure:
|
|
17
|
-
${
|
|
18
|
-
`),
|
|
17
|
+
${n}`)}throw r}}extractStepLineNumbers(e){let t=new Map,r=e.split(`
|
|
18
|
+
`),n=0,o=!1;for(let i=0;i<r.length;i++){let a=r[i].trim();if(a==="steps:"||a.startsWith("steps:")){o=!0;continue}o&&a.startsWith("-")&&t.set(n++,i+1)}return t}},re=class{parse(e){let t;try{t=JSON.parse(e)}catch(r){throw new Error(`Invalid JSON format: ${r instanceof Error?r.message:String(r)}`)}if(t&&typeof t=="object"&&"steps"in t){let r=t;Array.isArray(r.steps)&&(r.steps=r.steps.map(n=>ne(n)))}try{return te(t)}catch(r){if(r instanceof oe.ZodError){let n=r.issues.map(o=>{let i=o.path.length>0?` at ${o.path.join(".")}`:"";return` - ${o.message}${i}`}).join(`
|
|
19
19
|
`);throw new Error(`Invalid workflow structure:
|
|
20
|
-
${
|
|
21
|
-
`),
|
|
20
|
+
${n}`)}throw r}}extractStepLineNumbers(e){let t=new Map,r=e.split(`
|
|
21
|
+
`),n=0,o=!1,i=!1;for(let a=0;a<r.length;a++){let l=r[a].trim();if(l.startsWith('"steps"')||l.startsWith("'steps'")){o=!0,l.includes("[")&&(i=!0);continue}if(o&&l==="["){i=!0;continue}if(i&&l==="]"){i=!1,o=!1;continue}i&&l.startsWith("{")&&t.set(n++,a+1)}return t}};function se(s){switch(s.toLowerCase().split(".").pop()){case"yaml":case"yml":return new G;case"json":return new re;default:return new G}}var $=require("fs"),b=require("path"),ie=require("url"),ke={};function ve(){console.log=()=>{},console.error=()=>{},console.warn=()=>{},console.info=()=>{},process.stdout.write=()=>!0,process.stderr.write=()=>!0}function Re(){return"0.2.13"}function $e(s){let e=s?(0,b.resolve)(s):process.cwd(),t=50,r=0;for(;r<t;){let n=(0,b.resolve)(e,"tp");try{if((0,$.existsSync)(n)&&(0,$.statSync)(n).isDirectory())return n}catch{}let o=(0,b.dirname)(e);if(o===e)break;e=o,r++}return null}var Ze=(0,Pe.promisify)(Ce.exec),_=new Me.Command;_.name("task-pipeliner").description(`A powerful task pipeline runner with condition-based workflow execution.
|
|
22
22
|
|
|
23
23
|
Define workflows in YAML or JSON files with conditional execution, parallel tasks,
|
|
24
24
|
interactive prompts, and variable substitution.
|
|
@@ -56,7 +56,7 @@ Quick Start:
|
|
|
56
56
|
tp history remove # Remove a specific history
|
|
57
57
|
tp history remove-all # Remove all histories
|
|
58
58
|
|
|
59
|
-
`).version(
|
|
59
|
+
`).version(Re()).addHelpText("after",`
|
|
60
60
|
Examples:
|
|
61
61
|
$ tp run workflow.yaml
|
|
62
62
|
$ tp run examples/simple-project/workflow.yaml
|
|
@@ -69,7 +69,7 @@ Resources:
|
|
|
69
69
|
\u{1F4DA} Documentation: https://task-pipeliner.racgoo.com/
|
|
70
70
|
\u{1F3A8} Visual Generator: https://task-pipeliner-generator.racgoo.com/
|
|
71
71
|
|
|
72
|
-
See README.md for complete DSL reference.`);
|
|
72
|
+
See README.md for complete DSL reference.`);_.command("run").description("Run a workflow from a YAML or JSON file").argument("[file]","Path to the workflow file (YAML or JSON, relative or absolute). If omitted, will search for workflows in the nearest tp directory.").option("-s, --silent","Run in silent mode (suppress console output)").addHelpText("after",`
|
|
73
73
|
Examples:
|
|
74
74
|
$ tp run workflow.yaml
|
|
75
75
|
$ tp run workflow.json
|
|
@@ -94,11 +94,11 @@ Workflow File Structure:
|
|
|
94
94
|
\u2022 all/any/not: Combine conditions
|
|
95
95
|
|
|
96
96
|
Supported formats: YAML (.yaml, .yml) and JSON (.json)
|
|
97
|
-
See README.md for complete DSL documentation.`).action(async(s,e)=>{try{let t=s??await
|
|
98
|
-
\u2717 No workflow file found`)),process.exit(1)),e.silent
|
|
99
|
-
`)),await new
|
|
97
|
+
See README.md for complete DSL documentation.`).action(async(s,e)=>{try{let t=s??await Xe()??null;t||(console.error(u.default.red(`
|
|
98
|
+
\u2717 No workflow file found`)),process.exit(1)),e.silent&&ve();let r=se(t);console.log(u.default.blue(`Loading workflow from ${t}...`));let n=(0,ae.readFileSync)(t,"utf-8"),o=r.parse(n);if(!o.steps||!Array.isArray(o.steps))throw new Error("Invalid workflow: steps array is required");o._lineNumbers=r.extractStepLineNumbers(n),o._fileName=qe(t),o._filePath=(0,L.resolve)(t),console.log(u.default.green(`Starting workflow execution...
|
|
99
|
+
`)),await new Z().execute(o),console.log(u.default.green(`
|
|
100
100
|
\u2713 Workflow completed successfully`))}catch(t){let r=t instanceof Error?t.message:String(t);console.error(u.default.red(`
|
|
101
|
-
\u2717 Workflow failed: ${r}`)),process.exit(1)}});
|
|
101
|
+
\u2717 Workflow failed: ${r}`)),process.exit(1)}});_.command("open").description("Open generator or docs website in browser").argument("<target>",'Target to open: "generator" or "docs"').addHelpText("after",`
|
|
102
102
|
Examples:
|
|
103
103
|
$ tp open generator
|
|
104
104
|
$ tp open docs
|
|
@@ -107,27 +107,27 @@ Targets:
|
|
|
107
107
|
generator Open the visual workflow generator (https://task-pipeliner-generator.racgoo.com/)
|
|
108
108
|
docs Open the documentation site (https://task-pipeliner.racgoo.com/)`).action(async s=>{let t={generator:"https://task-pipeliner-generator.racgoo.com/",docs:"https://task-pipeliner.racgoo.com/"}[s.toLowerCase()];t||(console.error(u.default.red(`
|
|
109
109
|
\u2717 Invalid target: ${s}`)),console.log(u.default.yellow(`
|
|
110
|
-
Valid targets:`)),console.log(u.default.yellow(" \u2022 generator - Open the visual workflow generator")),console.log(u.default.yellow(" \u2022 docs - Open the documentation site")),process.exit(1));try{let r=process.platform,
|
|
111
|
-
\u2713 Opening ${s==="generator"?"generator":"documentation"} in browser...`)),console.log(u.default.blue(` ${t}`))}catch(r){let
|
|
112
|
-
\u2717 Failed to open browser: ${
|
|
113
|
-
Please visit manually: ${t}`)),process.exit(1)}});var
|
|
114
|
-
\u2717 Invalid choice`)),process.exit(1));let t=new
|
|
115
|
-
\u26A0 No history found`));return}let
|
|
116
|
-
\u2717 Invalid choice`)),process.exit(1));try{let
|
|
110
|
+
Valid targets:`)),console.log(u.default.yellow(" \u2022 generator - Open the visual workflow generator")),console.log(u.default.yellow(" \u2022 docs - Open the documentation site")),process.exit(1));try{let r=process.platform,n;r==="darwin"?n=`open "${t}"`:r==="win32"?n=`start "${t}"`:n=`xdg-open "${t}"`,await Ze(n),console.log(u.default.green(`
|
|
111
|
+
\u2713 Opening ${s==="generator"?"generator":"documentation"} in browser...`)),console.log(u.default.blue(` ${t}`))}catch(r){let n=r instanceof Error?r.message:String(r);console.error(u.default.red(`
|
|
112
|
+
\u2717 Failed to open browser: ${n}`)),console.log(u.default.yellow(`
|
|
113
|
+
Please visit manually: ${t}`)),process.exit(1)}});var Ge=_.command("history").description("Manage workflow execution history");Ge.action(async()=>{let s=new M,e=await s.prompt("Select an action",[{id:"show",label:"Show - View and select a history to view"},{id:"remove",label:"Remove - Delete a specific history file"},{id:"remove-all",label:"Remove All - Delete all history files"}]);e?.id||(console.error(u.default.red(`
|
|
114
|
+
\u2717 Invalid choice`)),process.exit(1));let t=new F;switch(e.id){case"show":{let r=await t.getHistoryNames();if(r.length===0){console.log(u.default.yellow(`
|
|
115
|
+
\u26A0 No history found`));return}let n=await s.prompt("Select a history to view",r.map(o=>({id:o,label:o})));n?.id||(console.error(u.default.red(`
|
|
116
|
+
\u2717 Invalid choice`)),process.exit(1));try{let o=await t.getHistory(n.id);Ke(o,n.id)}catch(o){let i=o instanceof Error?o.message:String(o);console.error(u.default.red(`
|
|
117
117
|
\u2717 Failed to load history: ${i}`)),process.exit(1)}break}case"remove":{let r=await t.getHistoryNames();if(r.length===0){console.log(u.default.yellow(`
|
|
118
|
-
\u26A0 No history found`));return}let
|
|
119
|
-
\u2717 Invalid choice`)),process.exit(1));try{await t.removeHistory(
|
|
120
|
-
\u2713 Removed history: ${
|
|
118
|
+
\u26A0 No history found`));return}let n=await s.prompt("Select a history to remove",r.map(o=>({id:o,label:o})));n?.id||(console.error(u.default.red(`
|
|
119
|
+
\u2717 Invalid choice`)),process.exit(1));try{await t.removeHistory(n.id),console.log(u.default.green(`
|
|
120
|
+
\u2713 Removed history: ${n.id}`))}catch(o){let i=o instanceof Error?o.message:String(o);console.error(u.default.red(`
|
|
121
121
|
\u2717 Failed to remove history: ${i}`)),process.exit(1)}break}case"remove-all":{if((await s.prompt("Are you sure you want to remove all histories?",[{id:"yes",label:"Yes, remove all"},{id:"no",label:"No, cancel"}]))?.id!=="yes"){console.log(u.default.yellow(`
|
|
122
122
|
\u2717 Cancelled`));return}try{await t.clearAllHistories(),console.log(u.default.green(`
|
|
123
|
-
\u2713 All histories removed`))}catch(
|
|
124
|
-
\u2717 Failed to remove histories: ${
|
|
125
|
-
\u2717 Unknown action: ${e.id}`)),process.exit(1)}});async function
|
|
126
|
-
\u2717 No tp directory found`)),null;try{let t=(await(0,
|
|
127
|
-
\u2717 No workflow files found in ${s}`)),null;let r=await Promise.all(t.map(async i=>{let a=(0,
|
|
128
|
-
\u2717 Failed to read tp directory: ${t}`)),null}}function
|
|
129
|
-
`);let t=s.records.reduce((l,
|
|
130
|
-
`);console.log((0,
|
|
131
|
-
`);console.log((0,
|
|
123
|
+
\u2713 All histories removed`))}catch(n){let o=n instanceof Error?n.message:String(n);console.error(u.default.red(`
|
|
124
|
+
\u2717 Failed to remove histories: ${o}`)),process.exit(1)}break}default:console.error(u.default.red(`
|
|
125
|
+
\u2717 Unknown action: ${e.id}`)),process.exit(1)}});async function Xe(){let s=$e();if(!s)return console.error(u.default.red(`
|
|
126
|
+
\u2717 No tp directory found`)),null;try{let t=(await(0,Ee.readdir)(s)).filter(i=>{let a=(0,L.extname)(i).toLowerCase();return[".yaml",".yml",".json"].includes(a)});if(t.length===0)return console.error(u.default.red(`
|
|
127
|
+
\u2717 No workflow files found in ${s}`)),null;let r=await Promise.all(t.map(async i=>{let a=(0,L.join)(s,i);try{let p=se(a),l=(0,ae.readFileSync)(a,"utf-8"),h=p.parse(l).name??"Untitled";return{id:a,label:`${i} - ${h}`}}catch{return{id:a,label:i}}}));return(await new M(!0).prompt("Select a workflow to run",r)).id}catch(e){let t=e instanceof Error?e.message:String(e);return console.error(u.default.red(`
|
|
128
|
+
\u2717 Failed to read tp directory: ${t}`)),null}}function qe(s){return s.split("/").pop()??s}function Ke(s,e){console.log(`
|
|
129
|
+
`);let t=s.records.reduce((l,f)=>l+f.duration,0),r=s.records.filter(l=>l.status==="success").length,n=s.records.filter(l=>l.status==="failure").length,o=(0,Ne.default)(s.initialTimestamp).format("YYYY-MM-DD HH:mm:ss"),a=D(t),p=[u.default.bold("Workflow Execution History"),"",`${u.default.cyan("File:")} ${e}`,`${u.default.cyan("Started:")} ${o}`,`${u.default.cyan("Total Duration:")} ${a}`,`${u.default.cyan("Total Steps:")} ${s.records.length}`,`${u.default.green("\u2713 Successful:")} ${r}`,n>0?`${u.default.red("\u2717 Failed:")} ${n}`:""].filter(Boolean).join(`
|
|
130
|
+
`);console.log((0,le.default)(p,{borderStyle:"round",padding:{top:1,bottom:1,left:2,right:2},margin:{top:0,bottom:1,left:0,right:0},borderColor:"cyan"})),s.records.forEach((l,f)=>{Qe(l,f+1,s.records.length)}),console.log("")}function Qe(s,e,t){let r=et(s.step),n=tt(s.step),o=s.status==="success"?u.default.green("\u2713"):u.default.red("\u2717"),i=s.status==="success"?u.default.green("Success"):u.default.red("Failed"),a=D(s.duration),p=[`${o} ${u.default.bold(`Step ${e}/${t}`)} - ${u.default.cyan(r)}`,`${u.default.gray("Duration:")} ${a} | ${u.default.gray("Status:")} ${i}`,"",u.default.white(n)].join(`
|
|
131
|
+
`);console.log((0,le.default)(p,{borderStyle:"round",padding:{top:1,bottom:1,left:2,right:2},margin:{top:0,bottom:1,left:0,right:0},borderColor:s.status==="success"?"green":"red"})),rt(s.output)&&ot(s.output)}function et(s){return"run"in s?"Run":"choose"in s?"Choose":"prompt"in s?"Prompt":"parallel"in s?"Parallel":"fail"in s?"Fail":"Unknown"}function tt(s){return"run"in s?`Command: ${u.default.yellow(s.run)}`:"choose"in s?`Message: ${u.default.yellow(s.choose.message)}`:"prompt"in s?`Message: ${u.default.yellow(s.prompt.message)} | Variable: ${u.default.cyan(s.prompt.as)}`:"parallel"in s?`Parallel execution with ${s.parallel.length} branches`:"fail"in s?`Error: ${u.default.red(s.fail.message)}`:"Unknown step type"}function rt(s){return typeof s=="object"&&s!==null&&"success"in s&&"stdout"in s&&"stderr"in s}function ot(s){if(s.stdout.length>0){let e=s.stdout.map(t=>u.default.gray(` ${t}`)).join(`
|
|
132
132
|
`);console.log(u.default.green(" Output:")),console.log(e)}if(s.stderr.length>0){let e=s.stderr.map(t=>u.default.gray(` ${t}`)).join(`
|
|
133
|
-
`);console.log(u.default.red(" Errors:")),console.log(e)}}
|
|
133
|
+
`);console.log(u.default.red(" Errors:")),console.log(e)}}_.parse();
|