task-pipeliner 0.2.2 → 0.2.4

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.
Files changed (168) hide show
  1. package/README.ko.md +17 -1
  2. package/README.md +17 -1
  3. package/dist/index.cjs +18 -16
  4. package/dist/index.js +18 -16
  5. package/dist/task-pipeliner-rs.node +0 -0
  6. package/package.json +17 -1
  7. package/dist/cli/index.d.ts +0 -19
  8. package/dist/cli/index.d.ts.map +0 -1
  9. package/dist/cli/index.js +0 -305
  10. package/dist/cli/index.js.map +0 -1
  11. package/dist/cli/prompts.d.ts +0 -48
  12. package/dist/cli/prompts.d.ts.map +0 -1
  13. package/dist/cli/prompts.js +0 -75
  14. package/dist/cli/prompts.js.map +0 -1
  15. package/dist/cli/ui.d.ts +0 -39
  16. package/dist/cli/ui.d.ts.map +0 -1
  17. package/dist/cli/ui.js +0 -84
  18. package/dist/cli/ui.js.map +0 -1
  19. package/dist/core/__tests__/actual-execution.test.d.ts +0 -2
  20. package/dist/core/__tests__/actual-execution.test.d.ts.map +0 -1
  21. package/dist/core/__tests__/actual-execution.test.js +0 -147
  22. package/dist/core/__tests__/actual-execution.test.js.map +0 -1
  23. package/dist/core/__tests__/base-dir.test.d.ts +0 -2
  24. package/dist/core/__tests__/base-dir.test.d.ts.map +0 -1
  25. package/dist/core/__tests__/base-dir.test.js +0 -146
  26. package/dist/core/__tests__/base-dir.test.js.map +0 -1
  27. package/dist/core/__tests__/built-code-execution.test.d.ts +0 -2
  28. package/dist/core/__tests__/built-code-execution.test.d.ts.map +0 -1
  29. package/dist/core/__tests__/built-code-execution.test.js +0 -48
  30. package/dist/core/__tests__/built-code-execution.test.js.map +0 -1
  31. package/dist/core/__tests__/choose-as-var-condition.test.d.ts +0 -2
  32. package/dist/core/__tests__/choose-as-var-condition.test.d.ts.map +0 -1
  33. package/dist/core/__tests__/choose-as-var-condition.test.js +0 -308
  34. package/dist/core/__tests__/choose-as-var-condition.test.js.map +0 -1
  35. package/dist/core/__tests__/cli-integration.test.d.ts +0 -2
  36. package/dist/core/__tests__/cli-integration.test.d.ts.map +0 -1
  37. package/dist/core/__tests__/cli-integration.test.js +0 -83
  38. package/dist/core/__tests__/cli-integration.test.js.map +0 -1
  39. package/dist/core/__tests__/comprehensive-basic-yaml.test.d.ts +0 -2
  40. package/dist/core/__tests__/comprehensive-basic-yaml.test.d.ts.map +0 -1
  41. package/dist/core/__tests__/comprehensive-basic-yaml.test.js +0 -114
  42. package/dist/core/__tests__/comprehensive-basic-yaml.test.js.map +0 -1
  43. package/dist/core/__tests__/condition-evaluator.test.d.ts +0 -2
  44. package/dist/core/__tests__/condition-evaluator.test.d.ts.map +0 -1
  45. package/dist/core/__tests__/condition-evaluator.test.js +0 -164
  46. package/dist/core/__tests__/condition-evaluator.test.js.map +0 -1
  47. package/dist/core/__tests__/debug-basic-yaml.test.d.ts +0 -2
  48. package/dist/core/__tests__/debug-basic-yaml.test.d.ts.map +0 -1
  49. package/dist/core/__tests__/debug-basic-yaml.test.js +0 -126
  50. package/dist/core/__tests__/debug-basic-yaml.test.js.map +0 -1
  51. package/dist/core/__tests__/example-files.test.d.ts +0 -2
  52. package/dist/core/__tests__/example-files.test.d.ts.map +0 -1
  53. package/dist/core/__tests__/example-files.test.js +0 -199
  54. package/dist/core/__tests__/example-files.test.js.map +0 -1
  55. package/dist/core/__tests__/executor-choice-integration.test.d.ts +0 -2
  56. package/dist/core/__tests__/executor-choice-integration.test.d.ts.map +0 -1
  57. package/dist/core/__tests__/executor-choice-integration.test.js +0 -169
  58. package/dist/core/__tests__/executor-choice-integration.test.js.map +0 -1
  59. package/dist/core/__tests__/executor-choice.test.d.ts +0 -2
  60. package/dist/core/__tests__/executor-choice.test.d.ts.map +0 -1
  61. package/dist/core/__tests__/executor-choice.test.js +0 -170
  62. package/dist/core/__tests__/executor-choice.test.js.map +0 -1
  63. package/dist/core/__tests__/executor-parallel.test.d.ts +0 -2
  64. package/dist/core/__tests__/executor-parallel.test.d.ts.map +0 -1
  65. package/dist/core/__tests__/executor-parallel.test.js +0 -129
  66. package/dist/core/__tests__/executor-parallel.test.js.map +0 -1
  67. package/dist/core/__tests__/executor-prompt.test.d.ts +0 -2
  68. package/dist/core/__tests__/executor-prompt.test.d.ts.map +0 -1
  69. package/dist/core/__tests__/executor-prompt.test.js +0 -147
  70. package/dist/core/__tests__/executor-prompt.test.js.map +0 -1
  71. package/dist/core/__tests__/executor-real-scenario.test.d.ts +0 -2
  72. package/dist/core/__tests__/executor-real-scenario.test.d.ts.map +0 -1
  73. package/dist/core/__tests__/executor-real-scenario.test.js +0 -169
  74. package/dist/core/__tests__/executor-real-scenario.test.js.map +0 -1
  75. package/dist/core/__tests__/file-condition.test.d.ts +0 -2
  76. package/dist/core/__tests__/file-condition.test.d.ts.map +0 -1
  77. package/dist/core/__tests__/file-condition.test.js +0 -172
  78. package/dist/core/__tests__/file-condition.test.js.map +0 -1
  79. package/dist/core/__tests__/final-verification.test.d.ts +0 -2
  80. package/dist/core/__tests__/final-verification.test.d.ts.map +0 -1
  81. package/dist/core/__tests__/final-verification.test.js +0 -56
  82. package/dist/core/__tests__/final-verification.test.js.map +0 -1
  83. package/dist/core/__tests__/parallel-when-condition.test.d.ts +0 -2
  84. package/dist/core/__tests__/parallel-when-condition.test.d.ts.map +0 -1
  85. package/dist/core/__tests__/parallel-when-condition.test.js +0 -155
  86. package/dist/core/__tests__/parallel-when-condition.test.js.map +0 -1
  87. package/dist/core/__tests__/parser.test.d.ts +0 -2
  88. package/dist/core/__tests__/parser.test.d.ts.map +0 -1
  89. package/dist/core/__tests__/parser.test.js +0 -91
  90. package/dist/core/__tests__/parser.test.js.map +0 -1
  91. package/dist/core/__tests__/real-inquirer-test.test.d.ts +0 -2
  92. package/dist/core/__tests__/real-inquirer-test.test.d.ts.map +0 -1
  93. package/dist/core/__tests__/real-inquirer-test.test.js +0 -20
  94. package/dist/core/__tests__/real-inquirer-test.test.js.map +0 -1
  95. package/dist/core/__tests__/reproduce-bug.test.d.ts +0 -2
  96. package/dist/core/__tests__/reproduce-bug.test.d.ts.map +0 -1
  97. package/dist/core/__tests__/reproduce-bug.test.js +0 -85
  98. package/dist/core/__tests__/reproduce-bug.test.js.map +0 -1
  99. package/dist/core/__tests__/timeout-retry.test.d.ts +0 -2
  100. package/dist/core/__tests__/timeout-retry.test.d.ts.map +0 -1
  101. package/dist/core/__tests__/timeout-retry.test.js +0 -184
  102. package/dist/core/__tests__/timeout-retry.test.js.map +0 -1
  103. package/dist/core/__tests__/workflow-validation.test.d.ts +0 -2
  104. package/dist/core/__tests__/workflow-validation.test.d.ts.map +0 -1
  105. package/dist/core/__tests__/workflow-validation.test.js +0 -116
  106. package/dist/core/__tests__/workflow-validation.test.js.map +0 -1
  107. package/dist/core/__tests__/workspace.test.d.ts +0 -2
  108. package/dist/core/__tests__/workspace.test.d.ts.map +0 -1
  109. package/dist/core/__tests__/workspace.test.js +0 -29
  110. package/dist/core/__tests__/workspace.test.js.map +0 -1
  111. package/dist/core/__tests__/yaml-integration.test.d.ts +0 -2
  112. package/dist/core/__tests__/yaml-integration.test.d.ts.map +0 -1
  113. package/dist/core/__tests__/yaml-integration.test.js +0 -114
  114. package/dist/core/__tests__/yaml-integration.test.js.map +0 -1
  115. package/dist/core/__tests__/yaml-scenarios.test.d.ts +0 -2
  116. package/dist/core/__tests__/yaml-scenarios.test.d.ts.map +0 -1
  117. package/dist/core/__tests__/yaml-scenarios.test.js +0 -197
  118. package/dist/core/__tests__/yaml-scenarios.test.js.map +0 -1
  119. package/dist/core/condition-evaluator.d.ts +0 -44
  120. package/dist/core/condition-evaluator.d.ts.map +0 -1
  121. package/dist/core/condition-evaluator.js +0 -121
  122. package/dist/core/condition-evaluator.js.map +0 -1
  123. package/dist/core/executor.d.ts +0 -172
  124. package/dist/core/executor.d.ts.map +0 -1
  125. package/dist/core/executor.js +0 -590
  126. package/dist/core/executor.js.map +0 -1
  127. package/dist/core/history.d.ts +0 -51
  128. package/dist/core/history.d.ts.map +0 -1
  129. package/dist/core/history.js +0 -57
  130. package/dist/core/history.js.map +0 -1
  131. package/dist/core/parser.d.ts +0 -41
  132. package/dist/core/parser.d.ts.map +0 -1
  133. package/dist/core/parser.js +0 -206
  134. package/dist/core/parser.js.map +0 -1
  135. package/dist/core/recorder.d.ts +0 -48
  136. package/dist/core/recorder.d.ts.map +0 -1
  137. package/dist/core/recorder.js +0 -56
  138. package/dist/core/recorder.js.map +0 -1
  139. package/dist/core/rust-task-runner.d.ts +0 -14
  140. package/dist/core/rust-task-runner.d.ts.map +0 -1
  141. package/dist/core/rust-task-runner.js +0 -34
  142. package/dist/core/rust-task-runner.js.map +0 -1
  143. package/dist/core/task-runner.d.ts +0 -63
  144. package/dist/core/task-runner.d.ts.map +0 -1
  145. package/dist/core/task-runner.js +0 -259
  146. package/dist/core/task-runner.js.map +0 -1
  147. package/dist/core/template.d.ts +0 -11
  148. package/dist/core/template.d.ts.map +0 -1
  149. package/dist/core/template.js +0 -36
  150. package/dist/core/template.js.map +0 -1
  151. package/dist/core/workflow-schema.d.ts +0 -31
  152. package/dist/core/workflow-schema.d.ts.map +0 -1
  153. package/dist/core/workflow-schema.js +0 -127
  154. package/dist/core/workflow-schema.js.map +0 -1
  155. package/dist/core/workspace.d.ts +0 -90
  156. package/dist/core/workspace.d.ts.map +0 -1
  157. package/dist/core/workspace.js +0 -143
  158. package/dist/core/workspace.js.map +0 -1
  159. package/dist/index.d.ts.map +0 -1
  160. package/dist/index.js.map +0 -1
  161. package/dist/types/condition.d.ts +0 -62
  162. package/dist/types/condition.d.ts.map +0 -1
  163. package/dist/types/condition.js +0 -6
  164. package/dist/types/condition.js.map +0 -1
  165. package/dist/types/workflow.d.ts +0 -90
  166. package/dist/types/workflow.d.ts.map +0 -1
  167. package/dist/types/workflow.js +0 -2
  168. package/dist/types/workflow.js.map +0 -1
package/README.ko.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  > 조건 기반 작업 파이프라인 실행기로 아름다운 CLI 출력을 제공합니다
4
4
 
5
- **버전:** 0.2.2
5
+ **버전:** 0.2.4
6
6
 
7
7
  ![fox2](https://github.com/user-attachments/assets/fdf8d786-6a91-4d2d-9dc1-72be6f3ccd98)
8
8
 
@@ -35,6 +35,9 @@
35
35
  - 📦 **[npm](https://www.npmjs.com/package/task-pipeliner)** - npm 레지스트리 패키지
36
36
  > **CLI 명령어**:
37
37
  ```bash
38
+ tp run workflow.yaml # 워크플로우 실행
39
+ tp run workflow.yaml --silent # 사일런트 모드로 실행 (모든 콘솔 출력 억제)
40
+ tp run workflow.yaml -s # 사일런트 모드 짧은 형식
38
41
  tp open generator # 시각적 생성기 열기
39
42
  tp open docs # 문서 열기
40
43
  tp history # 워크플로우 실행 히스토리 보기
@@ -167,8 +170,21 @@ task-pipeliner run workflow.json
167
170
  # 또는 짧은 별칭 사용
168
171
  tp run workflow.yaml
169
172
  tp run workflow.json
173
+
174
+ # 사일런트 모드로 실행 (모든 콘솔 출력 억제)
175
+ tp run workflow.yaml --silent
176
+ # 또는 짧은 형식 사용
177
+ tp run workflow.yaml -s
170
178
  ```
171
179
 
180
+ **사일런트 모드:**
181
+ `--silent` (또는 `-s`) 플래그는 워크플로우 실행 중 모든 콘솔 출력을 억제합니다. 다음 경우에 유용합니다:
182
+ - 종료 코드만 필요한 CI/CD 파이프라인
183
+ - 상세한 출력이 필요 없는 자동화 스크립트
184
+ - 로그의 노이즈 감소
185
+
186
+ 참고: 사일런트 모드는 명령 출력, 단계 헤더, 에러 메시지를 포함한 모든 출력을 억제합니다. 워크플로우는 정상적으로 실행되며 적절한 종료 코드를 반환합니다.
187
+
172
188
  ## DSL 문법
173
189
 
174
190
  ### 워크플로우 구조
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  > A powerful, condition-based task pipeline runner with beautiful CLI output
4
4
 
5
- **Version:** 0.2.2
5
+ **Version:** 0.2.4
6
6
 
7
7
  ![fox2](https://github.com/user-attachments/assets/fdf8d786-6a91-4d2d-9dc1-72be6f3ccd98)
8
8
 
@@ -35,6 +35,9 @@
35
35
  - 📦 **[npm](https://www.npmjs.com/package/task-pipeliner)** - Package on npm registry
36
36
  - 💻 **CLI Commands**:
37
37
  ```bash
38
+ tp run workflow.yaml # Run a workflow
39
+ tp run workflow.yaml --silent # Run in silent mode (suppress all console output)
40
+ tp run workflow.yaml -s # Short form for silent mode
38
41
  tp open generator # Open visual generator
39
42
  tp open docs # Open documentation
40
43
  tp history # View workflow execution history
@@ -167,8 +170,21 @@ task-pipeliner run workflow.json
167
170
  # or use the short alias
168
171
  tp run workflow.yaml
169
172
  tp run workflow.json
173
+
174
+ # Run in silent mode (suppress all console output)
175
+ tp run workflow.yaml --silent
176
+ # or use the short form
177
+ tp run workflow.yaml -s
170
178
  ```
171
179
 
180
+ **Silent Mode:**
181
+ The `--silent` (or `-s`) flag suppresses all console output during workflow execution. This is useful for:
182
+ - CI/CD pipelines where you only need exit codes
183
+ - Automated scripts that don't need verbose output
184
+ - Reducing noise in logs
185
+
186
+ Note: Silent mode suppresses all output including command output, step headers, and error messages. The workflow still executes normally and returns appropriate exit codes.
187
+
172
188
  ## 📖 DSL Syntax
173
189
 
174
190
  ### Workflow Structure
package/dist/index.cjs CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- "use strict";var ke=Object.create;var se=Object.defineProperty;var Re=Object.getOwnPropertyDescriptor;var Ce=Object.getOwnPropertyNames;var $e=Object.getPrototypeOf,Ee=Object.prototype.hasOwnProperty;var Pe=(s,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of Ce(e))!Ee.call(s,o)&&o!==t&&se(s,o,{get:()=>e[o],enumerable:!(r=Re(e,o))||r.enumerable});return s};var b=(s,e,t)=>(t=s!=null?ke($e(s)):{},Pe(e||!s||!s.__esModule?se(t,"default",{value:s,enumerable:!0}):t,s));var we=require("child_process"),be=require("fs"),ye=require("path"),Se=require("util"),ne=b(require("boxen"),1),u=b(require("chalk"),1),xe=require("commander"),ve=b(require("dayjs"),1);var N=require("path"),me=b(require("chalk"),1),z=b(require("log-update"),1);var X=b(require("chalk"),1),q=b(require("inquirer"),1),T=class{async prompt(e,t){let{choice:r}=await q.default.prompt([{type:"list",name:"choice",message:X.default.cyan(e),choices:t.map(n=>({name:n.label,value:n.id}))}]),o=t.find(n=>n.id===r);if(!o)throw new Error(`Invalid choice: ${r}`);return o}},H=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 O=b(require("boxen"),1),A=b(require("chalk"),1);function K(s,e,t,r={}){let{borderColor:o="cyan",isNested:n=!1}=r,a;e!==void 0&&(t?a=`line ${e} in ${t}`:a=`line ${e}`);let i=n?`\u2502 ${s}`:`> ${s}`;return(0,O.default)(i,{title:a,borderStyle:"round",padding:{top:0,bottom:0,left:1,right:1},margin:{top:0,bottom:0},borderColor:o})}function I(s,e=!1,t){let r=s?"\u2713 Completed":"\u2717 Failed",o=s?A.default.green(r):A.default.red(r);if(t!==void 0){let n=B(t);return`${o} ${A.default.gray(`(${n})`)}`}return o}function F(s){return(0,O.default)(`\u2717 ${s}`,{borderStyle:"round",padding:{top:0,bottom:0,left:1,right:1},margin:{top:0,bottom:0},borderColor:"red"})}function ae(s){return(0,O.default)(`> Starting parallel execution (${s} branches)`,{borderStyle:"round",padding:{top:0,bottom:0,left:1,right:1},margin:{top:0,bottom:0},borderColor:"yellow"})}function ie(s){let e=s?"\u2713 All parallel branches completed":"\u2717 Some parallel branches failed";return s?A.default.green(e):A.default.red(e)}function Q(s,e=!1){return`${e?"| \u2502 ":"\u2502 "}${s}`}function B(s){return`${(s/1e3).toFixed(3)}s`}var le=require("fs"),ce=require("path"),D=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,o]of Object.entries(e.var)){let n=this.workspace.getVariable(r),a=this.workspace.getFact(r),i=n??(a!==void 0?a.toString():void 0);if(i===void 0||i!==o)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,ce.resolve)(process.cwd(),t);return(0,le.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 S=require("fs/promises"),ue=require("os"),M=require("path"),pe=b(require("dayjs"),1),j=(0,M.join)((0,ue.homedir)(),".pipeliner","workflow-history"),L=class{constructor(){}async saveHistory(e){await(0,S.mkdir)(j,{recursive:!0});let t=(0,pe.default)().format("YYYY-MM-DD_HH-mm-ss"),r=Math.random().toString(36).slice(2,6),o=(0,M.join)(j,`workflow-${t}-${r}.json`);return await(0,S.writeFile)(o,JSON.stringify(e,null,2),{encoding:"utf8"}),o}async clearAllHistories(){await(0,S.rm)(j,{recursive:!0,force:!0})}async removeHistory(e){await(0,S.rm)((0,M.join)(j,e),{force:!0})}async getHistoryNames(){try{let t=(await(0,S.readdir)(j)).map(r=>(0,M.basename)(r));return t.sort((r,o)=>{let n=p=>{let c=p.match(/workflow-(\d{4}-\d{2}-\d{2}_\d{2}-\d{2}-\d{2})-/);return c?c[1]:""},a=n(r),i=n(o);return a===i?o.localeCompare(r):i.localeCompare(a)}),t}catch(e){if(e instanceof Error&&"code"in e&&e.code==="ENOENT")return[];throw e}}async getHistory(e){let t=await(0,S.readFile)((0,M.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,o){let n=this.getDuration();return this.records.push({step:e,context:t,output:r,duration:n,status:o}),n}reset(){this.records=[],this.initialTimestamp=Date.now()}async save(){let e=new L,t={initialTimestamp:this.initialTimestamp,records:this.records};return await e.saveHistory(t)}getDuration(){return Date.now()-this.recordStartTimestamp}};var _=class{async run(e,t,r,o,n=!1,a=!1,i,p,c,m){return n?this.runBuffered(e,c,m):this.runRealtime(e,r||e,a,i,p,c,m)}async runBuffered(e,t,r){let{spawn:o}=await import("child_process"),[n,...a]=this.parseCommand(e),i=this.createSpawnOptions(t);return new Promise((p,c)=>{let m=o(n,a,i),h=[],f=[],d="",w="",v=null;r&&r>0&&(v=setTimeout(()=>{m.kill("SIGTERM");let g=`Command timed out after ${r} seconds`;f.push(g),p({success:!1,stdout:h,stderr:f})},r*1e3)),m.stdout?.on("data",g=>{let y=g.toString(),{lines:C,remaining:k}=this.processStreamBuffer(y,d);h.push(...C),d=k}),m.stderr?.on("data",g=>{let y=g.toString(),{lines:C,remaining:k}=this.processStreamBuffer(y,w);f.push(...C),w=k}),m.on("close",g=>{v&&clearTimeout(v),d.trim()&&h.push(d),w.trim()&&f.push(w),p({success:g===0,stdout:h,stderr:f})}),m.on("error",g=>{v&&clearTimeout(v);let y=`Error: ${g.message}`;p({success:!1,stdout:h,stderr:[...f,y]})})})}async runRealtime(e,t,r,o,n,a,i){let{spawn:p}=await import("child_process"),[c,...m]=this.parseCommand(e),h=this.createSpawnOptions(a),d=K(t,o,n,{borderColor:r?"green":"cyan"});console.log(d);let w=Date.now();return new Promise(v=>{let g=p(c,m,h),y="",C="",k=null;i&&i>0&&(k=setTimeout(()=>{g.kill("SIGTERM");let R=`Command timed out after ${i} seconds`,x=F(R);console.error(x);let E=Date.now()-w,P=I(!1,!1,E);console.log(P),v(!1)},i*1e3)),g.stdout?.on("data",R=>{let x=R.toString(),{lines:E,remaining:P}=this.processStreamBuffer(x,y);E.forEach(G=>process.stdout.write(`\u2502 ${G}
2
+ "use strict";var Re=Object.create;var se=Object.defineProperty;var Ce=Object.getOwnPropertyDescriptor;var $e=Object.getOwnPropertyNames;var Ee=Object.getPrototypeOf,Pe=Object.prototype.hasOwnProperty;var Me=(s,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of $e(e))!Pe.call(s,o)&&o!==t&&se(s,o,{get:()=>e[o],enumerable:!(r=Ce(e,o))||r.enumerable});return s};var b=(s,e,t)=>(t=s!=null?Re(Ee(s)):{},Me(e||!s||!s.__esModule?se(t,"default",{value:s,enumerable:!0}):t,s));var be=require("child_process"),ye=require("fs"),Se=require("path"),xe=require("util"),ne=b(require("boxen"),1),u=b(require("chalk"),1),ve=require("commander"),ke=b(require("dayjs"),1);var N=require("path"),me=b(require("chalk"),1),z=b(require("log-update"),1);var X=b(require("chalk"),1),q=b(require("inquirer"),1),T=class{async prompt(e,t){let{choice:r}=await q.default.prompt([{type:"list",name:"choice",message:X.default.cyan(e),choices:t.map(n=>({name:n.label,value:n.id}))}]),o=t.find(n=>n.id===r);if(!o)throw new Error(`Invalid choice: ${r}`);return o}},H=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 O=b(require("boxen"),1),A=b(require("chalk"),1);function K(s,e,t,r={}){let{borderColor:o="cyan",isNested:n=!1}=r,a;e!==void 0&&(t?a=`line ${e} in ${t}`:a=`line ${e}`);let i=n?`\u2502 ${s}`:`> ${s}`;return(0,O.default)(i,{title:a,borderStyle:"round",padding:{top:0,bottom:0,left:1,right:1},margin:{top:0,bottom:0},borderColor:o})}function I(s,e=!1,t){let r=s?"\u2713 Completed":"\u2717 Failed",o=s?A.default.green(r):A.default.red(r);if(t!==void 0){let n=B(t);return`${o} ${A.default.gray(`(${n})`)}`}return o}function F(s){return(0,O.default)(`\u2717 ${s}`,{borderStyle:"round",padding:{top:0,bottom:0,left:1,right:1},margin:{top:0,bottom:0},borderColor:"red"})}function ae(s){return(0,O.default)(`> Starting parallel execution (${s} branches)`,{borderStyle:"round",padding:{top:0,bottom:0,left:1,right:1},margin:{top:0,bottom:0},borderColor:"yellow"})}function ie(s){let e=s?"\u2713 All parallel branches completed":"\u2717 Some parallel branches failed";return s?A.default.green(e):A.default.red(e)}function Q(s,e=!1){return`${e?"| \u2502 ":"\u2502 "}${s}`}function B(s){return`${(s/1e3).toFixed(3)}s`}var le=require("fs"),ce=require("path"),D=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,o]of Object.entries(e.var)){let n=this.workspace.getVariable(r),a=this.workspace.getFact(r),i=n??(a!==void 0?a.toString():void 0);if(i===void 0||i!==o)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,ce.resolve)(process.cwd(),t);return(0,le.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 S=require("fs/promises"),ue=require("os"),M=require("path"),pe=b(require("dayjs"),1),j=(0,M.join)((0,ue.homedir)(),".pipeliner","workflow-history"),L=class{constructor(){}async saveHistory(e){await(0,S.mkdir)(j,{recursive:!0});let t=(0,pe.default)().format("YYYY-MM-DD_HH-mm-ss"),r=Math.random().toString(36).slice(2,6),o=(0,M.join)(j,`workflow-${t}-${r}.json`);return await(0,S.writeFile)(o,JSON.stringify(e,null,2),{encoding:"utf8"}),o}async clearAllHistories(){await(0,S.rm)(j,{recursive:!0,force:!0})}async removeHistory(e){await(0,S.rm)((0,M.join)(j,e),{force:!0})}async getHistoryNames(){try{let t=(await(0,S.readdir)(j)).map(r=>(0,M.basename)(r));return t.sort((r,o)=>{let n=p=>{let c=p.match(/workflow-(\d{4}-\d{2}-\d{2}_\d{2}-\d{2}-\d{2})-/);return c?c[1]:""},a=n(r),i=n(o);return a===i?o.localeCompare(r):i.localeCompare(a)}),t}catch(e){if(e instanceof Error&&"code"in e&&e.code==="ENOENT")return[];throw e}}async getHistory(e){let t=await(0,S.readFile)((0,M.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,o){let n=this.getDuration();return this.records.push({step:e,context:t,output:r,duration:n,status:o}),n}reset(){this.records=[],this.initialTimestamp=Date.now()}async save(){let e=new L,t={initialTimestamp:this.initialTimestamp,records:this.records};return await e.saveHistory(t)}getDuration(){return Date.now()-this.recordStartTimestamp}};var _=class{async run(e,t,r,o,n=!1,a=!1,i,p,c,m){return n?this.runBuffered(e,c,m):this.runRealtime(e,r||e,a,i,p,c,m)}async runBuffered(e,t,r){let{spawn:o}=await import("child_process"),[n,...a]=this.parseCommand(e),i=this.createSpawnOptions(t);return new Promise((p,c)=>{let m=o(n,a,i),h=[],f=[],d="",w="",v=null;r&&r>0&&(v=setTimeout(()=>{m.kill("SIGTERM");let g=`Command timed out after ${r} seconds`;f.push(g),p({success:!1,stdout:h,stderr:f})},r*1e3)),m.stdout?.on("data",g=>{let y=g.toString(),{lines:C,remaining:k}=this.processStreamBuffer(y,d);h.push(...C),d=k}),m.stderr?.on("data",g=>{let y=g.toString(),{lines:C,remaining:k}=this.processStreamBuffer(y,w);f.push(...C),w=k}),m.on("close",g=>{v&&clearTimeout(v),d.trim()&&h.push(d),w.trim()&&f.push(w),p({success:g===0,stdout:h,stderr:f})}),m.on("error",g=>{v&&clearTimeout(v);let y=`Error: ${g.message}`;p({success:!1,stdout:h,stderr:[...f,y]})})})}async runRealtime(e,t,r,o,n,a,i){let{spawn:p}=await import("child_process"),[c,...m]=this.parseCommand(e),h=this.createSpawnOptions(a),d=K(t,o,n,{borderColor:r?"green":"cyan"});console.log(d);let w=Date.now();return new Promise(v=>{let g=p(c,m,h),y="",C="",k=null;i&&i>0&&(k=setTimeout(()=>{g.kill("SIGTERM");let R=`Command timed out after ${i} seconds`,x=F(R);console.error(x);let E=Date.now()-w,P=I(!1,!1,E);console.log(P),v(!1)},i*1e3)),g.stdout?.on("data",R=>{let x=R.toString(),{lines:E,remaining:P}=this.processStreamBuffer(x,y);E.forEach(G=>process.stdout.write(`\u2502 ${G}
3
3
  `)),y=P}),g.stderr?.on("data",R=>{let x=R.toString(),{lines:E,remaining:P}=this.processStreamBuffer(x,C);E.forEach(G=>process.stderr.write(`\u2502 ${G}
4
4
  `)),C=P}),g.on("close",R=>{k&&clearTimeout(k),y.trim()&&process.stdout.write(`\u2502 ${y}
5
5
  `),C.trim()&&process.stderr.write(`\u2502 ${C}
@@ -8,16 +8,16 @@
8
8
  `),i=n.substring(0,a);n=n.substring(a+1),o.push(i)}return{lines:o,remaining:n}}formatNestedOutput(e,t){t?e.split(`
9
9
  `).forEach(r=>{r.trim()&&console.log(`| ${r}`)}):console.log(e)}displayBufferedOutput(e,t,r=!1,o,n){let a=K(t,o,n,{borderColor:"cyan",isNested:r});this.formatNestedOutput(a,r),e.stdout.forEach(p=>{let c=Q(p,r);process.stdout.write(`${c}
10
10
  `)}),e.stderr.forEach(p=>{let c=Q(p,r);process.stderr.write(`${c}
11
- `)});let i=I(e.success,r);console.log(i)}};function Me(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,o)=>Me(o,e,r))}var J=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 U=class s{static PARALLEL_STEP_INDEX_MULTIPLIER=1e3;workspace;taskRunner;choicePrompt;textPrompt;baseDir;constructor(){this.workspace=new J,this.taskRunner=new _,this.choicePrompt=new T,this.textPrompt=new H}resolveBaseDir(e){if(e.baseDir)if((0,N.isAbsolute)(e.baseDir))this.baseDir=e.baseDir;else if(e._filePath){let t=(0,N.dirname)(e._filePath);this.baseDir=(0,N.resolve)(t,e.baseDir)}else this.baseDir=(0,N.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 D(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 a=0;a<e.steps.length;a++){let i=e.steps[a],p=this.createStepContext(a,e),c=!!i.when;if(this.evaluateStepCondition(i)){t.recordStart();try{let m=await this.executeStep(i,p,!1,c);this.handleStepResult(i,p,a,m,t)}catch(m){throw this.handleStepError(i,p,a,m,t),m}}}let o=Date.now()-r,n=B(o);console.log(me.default.cyan(`
11
+ `)});let i=I(e.success,r);console.log(i)}};function Ne(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,o)=>Ne(o,e,r))}var J=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 U=class s{static PARALLEL_STEP_INDEX_MULTIPLIER=1e3;workspace;taskRunner;choicePrompt;textPrompt;baseDir;constructor(){this.workspace=new J,this.taskRunner=new _,this.choicePrompt=new T,this.textPrompt=new H}resolveBaseDir(e){if(e.baseDir)if((0,N.isAbsolute)(e.baseDir))this.baseDir=e.baseDir;else if(e._filePath){let t=(0,N.dirname)(e._filePath);this.baseDir=(0,N.resolve)(t,e.baseDir)}else this.baseDir=(0,N.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 D(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 a=0;a<e.steps.length;a++){let i=e.steps[a],p=this.createStepContext(a,e),c=!!i.when;if(this.evaluateStepCondition(i)){t.recordStart();try{let m=await this.executeStep(i,p,!1,c);this.handleStepResult(i,p,a,m,t)}catch(m){throw this.handleStepError(i,p,a,m,t),m}}}let o=Date.now()-r,n=B(o);console.log(me.default.cyan(`
12
12
  Total execution time: ${n}`)),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,o,n){let a=this.isRunStep(e)?(()=>{let c=this.workspace.getStepResult(r);return c?c.success:!0})():this.isStepSuccessful(o,e),i=a?"success":"failure",p=n.recordEnd(e,t,o,i);if(!this.isRunStep(e)){let c=I(a,!1,p);console.log(c)}if(this.isRunStep(e)){if(e.continue===!1){let c=t.lineNumber?` (line ${t.lineNumber})`:"",m=a?`Step ${r}${c} completed, but workflow stopped due to continue: false`:`Step ${r}${c} failed`;throw new Error(m)}if(!a&&e.continue!==!0){let c=t.lineNumber?` (line ${t.lineNumber})`:"";throw new Error(`Step ${r}${c} failed`)}}}handleStepError(e,t,r,o,n){this.workspace.setStepResult(r,!1);let a=o instanceof Error?o.message:String(o),i={success:!1,stdout:[],stderr:[a]};n.recordEnd(e,t,i,"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,o=!1){if(e=this.fixMalformedStep(e),"run"in e){let n=await this.executeRunStep(e,t,r,o);return r&&typeof n=="object"&&"stdout"in n,n}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,o=!1){let n=this.calculateBaseStepIndex(t),a=Y(e.run,this.workspace),i=e.retry??0,p=e.timeout,c=!1,m=0;for(;m<=i;){let h=await this.taskRunner.run(a,n,a,t.branchIndex,r,o,t.lineNumber,t.fileName,this.baseDir,p),f=typeof h=="boolean"?h:h.success;if(c=h,f||m>=i)break;if(m++,m<=i){let d=Math.min(1e3*Math.pow(2,m-1),1e4);await new Promise(w=>setTimeout(w,d))}}return c}async executeRunStep(e,t,r=!1,o=!1){let n=await this.executeSingleRun({run:e.run,timeout:e.timeout,retry:e.retry},t,r,o),a=typeof n=="boolean"?n:n.success;if(this.workspace.setStepResult(t.stepIndex,a),a||!e.onError)return n;let i={run:e.onError.run,timeout:e.onError.timeout,retry:e.onError.retry,onError:e.onError.onError??void 0};return await this.executeRunChain(i,t,r,o)}async executeRunChain(e,t,r,o){let n=await this.executeSingleRun({run:e.run,timeout:e.timeout,retry:e.retry},t,r,o);return(typeof n=="boolean"?n:n.success)||!e.onError?n:this.executeRunChain(e.onError,t,r,o)}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 o=e.choose.as??r.id;this.workspace.setChoice(r.id,r.id),this.workspace.setVariable(o,r.id),this.workspace.setStepResult(t.stepIndex,!0)}async executePromptStep(e,t){let r=Y(e.prompt.message,this.workspace),o=e.prompt.default?Y(e.prompt.default,this.workspace):void 0,n=await this.textPrompt.prompt(r,o);this.workspace.setVariable(e.prompt.as,n),this.workspace.setFact(e.prompt.as,n),this.workspace.setStepResult(t.stepIndex,!0)}createParallelContexts(e,t){return e.parallel.map((r,o)=>({workspace:this.workspace.clone(),stepIndex:t.stepIndex*s.PARALLEL_STEP_INDEX_MULTIPLIER+o,branchIndex:o,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=[],o=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],n=0;for(let c=0;c<e.length;c++){let m=e[c],h=t[c];if(m.when&&!new D(h.workspace).evaluate(m.when))continue;let f=this.getBranchDisplayName(m,c);r.push({index:c,name:f,status:"pending"})}let a=setInterval(()=>{n=(n+1)%o.length,this.updateParallelBranchesDisplay(r,o[n])},100),i=r.map(async c=>{let{index:m}=c,h=e[m],f=t[m];c.status="running";try{let d=await this.executeStep(h,f,!0);return c.status="success",this.updateParallelBranchesDisplay(r,o[n]),{index:m,result:d,context:f}}catch(d){f.workspace.setStepResult(f.stepIndex,!1);let w=d instanceof Error?d.message:String(d);return c.status="failed",c.error=w,this.updateParallelBranchesDisplay(r,o[n]),{index:m,error:d,context:f}}}),p=await Promise.all(i);return clearInterval(a),this.updateParallelBranchesDisplay(r,"",!0),z.default.done(),p}updateParallelBranchesDisplay(e,t,r=!1){let o=e.map(n=>{let a=n.index+1,i="",p="";switch(n.status){case"pending":i="\u25CB",p=`Branch ${a}: ${n.name} - Pending`;break;case"running":i=t,p=`Branch ${a}: ${n.name} - Running...`;break;case"success":i="\u2713",p=`Branch ${a}: ${n.name} - Completed`;break;case"failed":i="\u2717",p=`Branch ${a}: ${n.name} - Failed${n.error?`: ${n.error}`:""}`;break}return`${i} ${p}`});r?(0,z.default)(o.join(`
13
13
  `)):(0,z.default)(o.join(`
14
- `))}displayParallelResults(e,t,r){let o=!0,n=!1;console.log("");for(let i of e){if(!i)continue;n=!0;let{index:p,result:c,error:m,context:h}=i;if(m){o=!1;let f=`Branch ${p+1} failed: ${m instanceof Error?m.message:String(m)}`,d=F(f);console.error(d)}else if(c&&typeof c=="object"&&"stdout"in c){let f=c;if(o=o&&f.success,f.stdout.length>0||f.stderr.length>0||!f.success){let d=t[p],w=this.getBranchDisplayName(d,p);this.taskRunner.displayBufferedOutput(f,w,!1,h.lineNumber,h.fileName)}}}n||console.log("\u26A0\uFE0F All parallel branches were skipped (conditions not met)");let a=ie(o);return console.log(a),o}mergeParallelResults(e){for(let t of e){let r=t.workspace.getAllFacts(),o=t.workspace.getAllVariables();for(let[n,a]of r)this.workspace.setFact(n,a);for(let[n,a]of o)this.workspace.setVariable(n,a)}}countExecutableBranches(e,t){let r=0;for(let o=0;o<e.length;o++){let n=e[o],a=t[o];n.when&&!new D(a.workspace).evaluate(n.when)||r++}return r}async executeParallelStep(e,t){let r=this.createParallelContexts(e,t),o=this.countExecutableBranches(e.parallel,r),n=ae(o);console.log(n);let a=await this.executeParallelBranches(e.parallel,r),i=this.displayParallelResults(a,e.parallel,t);if(this.workspace.setStepResult(t.stepIndex,i),!i){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 he=require("yaml"),re=require("zod");var l=require("zod"),Ne=l.z.object({file:l.z.string()}),Te=l.z.object({var:l.z.union([l.z.string(),l.z.record(l.z.string(),l.z.string())]).optional(),has:l.z.string().optional()}),Ae=l.z.object({status:l.z.object({fact:l.z.string(),is:l.z.enum(["ready","failed","pending"])})}),Ie=l.z.object({step:l.z.object({success:l.z.boolean()}).optional(),last_step:l.z.enum(["success","failure"]).optional()}),Be=l.z.object({choice:l.z.string()}),De=l.z.union([Ne,Be,Te,Ae,Ie]),$=l.z.lazy(()=>l.z.union([De,l.z.object({all:l.z.array($)}),l.z.object({any:l.z.array($)}),l.z.object({not:$})])),fe=l.z.lazy(()=>l.z.object({run:l.z.string(),timeout:l.z.number().optional(),retry:l.z.number().optional(),onError:fe.optional()})),je=l.z.object({run:l.z.string(),when:$.optional(),timeout:l.z.number().optional(),retry:l.z.number().optional(),continue:l.z.boolean().optional(),onError:fe.optional()}),Le=l.z.object({choose:l.z.object({message:l.z.string(),options:l.z.array(l.z.object({id:l.z.string(),label:l.z.string()})),as:l.z.string().optional()}),when:$.optional()}),Fe=l.z.object({prompt:l.z.object({message:l.z.string(),as:l.z.string(),default:l.z.string().optional(),validate:l.z.string().optional()}),when:$.optional()}),de=l.z.lazy(()=>l.z.union([je,Le,Fe,l.z.object({parallel:l.z.array(de),when:$.optional()}),l.z.object({fail:l.z.object({message:l.z.string()}),when:$.optional()})])),We=l.z.object({name:l.z.string().optional(),baseDir:l.z.string().optional(),steps:l.z.array(de).min(1,"Workflow must have at least one step")});function ee(s){return We.parse(s)}function oe(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=>oe(t))}:s}var Z=class{parse(e){let t;try{t=(0,he.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(o=>oe(o)))}try{return ee(t)}catch(r){if(r instanceof re.ZodError){let o=r.issues.map(n=>{let a=n.path.length>0?` at ${n.path.join(".")}`:"";return` - ${n.message}${a}`}).join(`
14
+ `))}displayParallelResults(e,t,r){let o=!0,n=!1;console.log("");for(let i of e){if(!i)continue;n=!0;let{index:p,result:c,error:m,context:h}=i;if(m){o=!1;let f=`Branch ${p+1} failed: ${m instanceof Error?m.message:String(m)}`,d=F(f);console.error(d)}else if(c&&typeof c=="object"&&"stdout"in c){let f=c;if(o=o&&f.success,f.stdout.length>0||f.stderr.length>0||!f.success){let d=t[p],w=this.getBranchDisplayName(d,p);this.taskRunner.displayBufferedOutput(f,w,!1,h.lineNumber,h.fileName)}}}n||console.log("\u26A0\uFE0F All parallel branches were skipped (conditions not met)");let a=ie(o);return console.log(a),o}mergeParallelResults(e){for(let t of e){let r=t.workspace.getAllFacts(),o=t.workspace.getAllVariables();for(let[n,a]of r)this.workspace.setFact(n,a);for(let[n,a]of o)this.workspace.setVariable(n,a)}}countExecutableBranches(e,t){let r=0;for(let o=0;o<e.length;o++){let n=e[o],a=t[o];n.when&&!new D(a.workspace).evaluate(n.when)||r++}return r}async executeParallelStep(e,t){let r=this.createParallelContexts(e,t),o=this.countExecutableBranches(e.parallel,r),n=ae(o);console.log(n);let a=await this.executeParallelBranches(e.parallel,r),i=this.displayParallelResults(a,e.parallel,t);if(this.workspace.setStepResult(t.stepIndex,i),!i){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 he=require("yaml"),re=require("zod");var l=require("zod"),Te=l.z.object({file:l.z.string()}),Ae=l.z.object({var:l.z.union([l.z.string(),l.z.record(l.z.string(),l.z.string())]).optional(),has:l.z.string().optional()}),Ie=l.z.object({status:l.z.object({fact:l.z.string(),is:l.z.enum(["ready","failed","pending"])})}),Be=l.z.object({step:l.z.object({success:l.z.boolean()}).optional(),last_step:l.z.enum(["success","failure"]).optional()}),De=l.z.object({choice:l.z.string()}),je=l.z.union([Te,De,Ae,Ie,Be]),$=l.z.lazy(()=>l.z.union([je,l.z.object({all:l.z.array($)}),l.z.object({any:l.z.array($)}),l.z.object({not:$})])),fe=l.z.lazy(()=>l.z.object({run:l.z.string(),timeout:l.z.number().optional(),retry:l.z.number().optional(),onError:fe.optional()})),Le=l.z.object({run:l.z.string(),when:$.optional(),timeout:l.z.number().optional(),retry:l.z.number().optional(),continue:l.z.boolean().optional(),onError:fe.optional()}),Fe=l.z.object({choose:l.z.object({message:l.z.string(),options:l.z.array(l.z.object({id:l.z.string(),label:l.z.string()})),as:l.z.string().optional()}),when:$.optional()}),We=l.z.object({prompt:l.z.object({message:l.z.string(),as:l.z.string(),default:l.z.string().optional(),validate:l.z.string().optional()}),when:$.optional()}),de=l.z.lazy(()=>l.z.union([Le,Fe,We,l.z.object({parallel:l.z.array(de),when:$.optional()}),l.z.object({fail:l.z.object({message:l.z.string()}),when:$.optional()})])),He=l.z.object({name:l.z.string().optional(),baseDir:l.z.string().optional(),steps:l.z.array(de).min(1,"Workflow must have at least one step")});function ee(s){return He.parse(s)}function oe(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=>oe(t))}:s}var Z=class{parse(e){let t;try{t=(0,he.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(o=>oe(o)))}try{return ee(t)}catch(r){if(r instanceof re.ZodError){let o=r.issues.map(n=>{let a=n.path.length>0?` at ${n.path.join(".")}`:"";return` - ${n.message}${a}`}).join(`
15
15
  `);throw new Error(`Invalid workflow structure:
16
16
  ${o}`)}throw r}}extractStepLineNumbers(e){let t=new Map,r=e.split(`
17
17
  `),o=0,n=!1;for(let a=0;a<r.length;a++){let i=r[a].trim();if(i==="steps:"||i.startsWith("steps:")){n=!0;continue}n&&i.startsWith("-")&&t.set(o++,a+1)}return t}},te=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(o=>oe(o)))}try{return ee(t)}catch(r){if(r instanceof re.ZodError){let o=r.issues.map(n=>{let a=n.path.length>0?` at ${n.path.join(".")}`:"";return` - ${n.message}${a}`}).join(`
18
18
  `);throw new Error(`Invalid workflow structure:
19
19
  ${o}`)}throw r}}extractStepLineNumbers(e){let t=new Map,r=e.split(`
20
- `),o=0,n=!1,a=!1;for(let i=0;i<r.length;i++){let c=r[i].trim();if(c.startsWith('"steps"')||c.startsWith("'steps'")){n=!0,c.includes("[")&&(a=!0);continue}if(n&&c==="["){a=!0;continue}if(a&&c==="]"){a=!1,n=!1;continue}a&&c.startsWith("{")&&t.set(o++,i+1)}return t}};function ge(s){switch(s.toLowerCase().split(".").pop()){case"yaml":case"yml":return new Z;case"json":return new te;default:return new Z}}var He=(0,Se.promisify)(we.exec),W=new xe.Command;W.name("task-pipeliner").description(`A powerful task pipeline runner with condition-based workflow execution.
20
+ `),o=0,n=!1,a=!1;for(let i=0;i<r.length;i++){let c=r[i].trim();if(c.startsWith('"steps"')||c.startsWith("'steps'")){n=!0,c.includes("[")&&(a=!0);continue}if(n&&c==="["){a=!0;continue}if(a&&c==="]"){a=!1,n=!1;continue}a&&c.startsWith("{")&&t.set(o++,i+1)}return t}};function ge(s){switch(s.toLowerCase().split(".").pop()){case"yaml":case"yml":return new Z;case"json":return new te;default:return new Z}}function we(){console.log=()=>{},console.error=()=>{},console.warn=()=>{},console.info=()=>{},process.stdout.write=()=>!0,process.stderr.write=()=>!0}var Oe=(0,xe.promisify)(be.exec),W=new ve.Command;W.name("task-pipeliner").description(`A powerful task pipeline runner with condition-based workflow execution.
21
21
 
22
22
  Define workflows in YAML or JSON files with conditional execution, parallel tasks,
23
23
  interactive prompts, and variable substitution.
@@ -68,12 +68,14 @@ Resources:
68
68
  \u{1F4DA} Documentation: https://task-pipeliner.racgoo.com/
69
69
  \u{1F3A8} Visual Generator: https://task-pipeliner-generator.racgoo.com/
70
70
 
71
- See README.md for complete DSL reference.`);W.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)").addHelpText("after",`
71
+ See README.md for complete DSL reference.`);W.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)").option("-s, --silent","Run in silent mode (suppress console output)").addHelpText("after",`
72
72
  Examples:
73
73
  $ tp run workflow.yaml
74
74
  $ tp run workflow.json
75
75
  $ tp run ./my-workflow.yaml
76
76
  $ tp run examples/simple-project/workflow.json
77
+ $ tp run workflow.yaml --silent
78
+ $ tp run workflow.yaml -s
77
79
 
78
80
  Workflow File Structure:
79
81
  A workflow file must contain a "steps" array with step definitions.
@@ -90,10 +92,10 @@ Workflow File Structure:
90
92
  \u2022 all/any/not: Combine conditions
91
93
 
92
94
  Supported formats: YAML (.yaml, .yml) and JSON (.json)
93
- See README.md for complete DSL documentation.`).action(async s=>{try{let e=ge(s);console.log(u.default.blue(`Loading workflow from ${s}...`));let t=(0,be.readFileSync)(s,"utf-8"),r=e.parse(t);if(!r.steps||!Array.isArray(r.steps))throw new Error("Invalid workflow: steps array is required");r._lineNumbers=e.extractStepLineNumbers(t),r._fileName=Ve(s),r._filePath=(0,ye.resolve)(s),console.log(u.default.green(`Starting workflow execution...
94
- `)),await new U().execute(r),console.log(u.default.green(`
95
- \u2713 Workflow completed successfully`))}catch(e){let t=e instanceof Error?e.message:String(e);console.error(u.default.red(`
96
- \u2717 Workflow failed: ${t}`)),process.exit(1)}});W.command("open").description("Open generator or docs website in browser").argument("<target>",'Target to open: "generator" or "docs"').addHelpText("after",`
95
+ See README.md for complete DSL documentation.`).action(async(s,e)=>{e.silent&&we();try{let t=ge(s);console.log(u.default.blue(`Loading workflow from ${s}...`));let r=(0,ye.readFileSync)(s,"utf-8"),o=t.parse(r);if(!o.steps||!Array.isArray(o.steps))throw new Error("Invalid workflow: steps array is required");o._lineNumbers=t.extractStepLineNumbers(r),o._fileName=_e(s),o._filePath=(0,Se.resolve)(s),console.log(u.default.green(`Starting workflow execution...
96
+ `)),await new U().execute(o),console.log(u.default.green(`
97
+ \u2713 Workflow completed successfully`))}catch(t){let r=t instanceof Error?t.message:String(t);console.error(u.default.red(`
98
+ \u2717 Workflow failed: ${r}`)),process.exit(1)}});W.command("open").description("Open generator or docs website in browser").argument("<target>",'Target to open: "generator" or "docs"').addHelpText("after",`
97
99
  Examples:
98
100
  $ tp open generator
99
101
  $ tp open docs
@@ -102,13 +104,13 @@ Targets:
102
104
  generator Open the visual workflow generator (https://task-pipeliner-generator.racgoo.com/)
103
105
  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(`
104
106
  \u2717 Invalid target: ${s}`)),console.log(u.default.yellow(`
105
- 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,o;r==="darwin"?o=`open "${t}"`:r==="win32"?o=`start "${t}"`:o=`xdg-open "${t}"`,await He(o),console.log(u.default.green(`
107
+ 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,o;r==="darwin"?o=`open "${t}"`:r==="win32"?o=`start "${t}"`:o=`xdg-open "${t}"`,await Oe(o),console.log(u.default.green(`
106
108
  \u2713 Opening ${s==="generator"?"generator":"documentation"} in browser...`)),console.log(u.default.blue(` ${t}`))}catch(r){let o=r instanceof Error?r.message:String(r);console.error(u.default.red(`
107
109
  \u2717 Failed to open browser: ${o}`)),console.log(u.default.yellow(`
108
- Please visit manually: ${t}`)),process.exit(1)}});var Oe=W.command("history").description("Manage workflow execution history");Oe.action(async()=>{let s=new T,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(`
110
+ Please visit manually: ${t}`)),process.exit(1)}});var Ve=W.command("history").description("Manage workflow execution history");Ve.action(async()=>{let s=new T,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(`
109
111
  \u2717 Invalid choice`)),process.exit(1));let t=new L;switch(e.id){case"show":{let r=await t.getHistoryNames();if(r.length===0){console.log(u.default.yellow(`
110
112
  \u26A0 No history found`));return}let o=await s.prompt("Select a history to view",r.map(n=>({id:n,label:n})));o?.id||(console.error(u.default.red(`
111
- \u2717 Invalid choice`)),process.exit(1));try{let n=await t.getHistory(o.id);_e(n,o.id)}catch(n){let a=n instanceof Error?n.message:String(n);console.error(u.default.red(`
113
+ \u2717 Invalid choice`)),process.exit(1));try{let n=await t.getHistory(o.id);Ye(n,o.id)}catch(n){let a=n instanceof Error?n.message:String(n);console.error(u.default.red(`
112
114
  \u2717 Failed to load history: ${a}`)),process.exit(1)}break}case"remove":{let r=await t.getHistoryNames();if(r.length===0){console.log(u.default.yellow(`
113
115
  \u26A0 No history found`));return}let o=await s.prompt("Select a history to remove",r.map(n=>({id:n,label:n})));o?.id||(console.error(u.default.red(`
114
116
  \u2717 Invalid choice`)),process.exit(1));try{await t.removeHistory(o.id),console.log(u.default.green(`
@@ -117,9 +119,9 @@ Please visit manually: ${t}`)),process.exit(1)}});var Oe=W.command("history").de
117
119
  \u2717 Cancelled`));return}try{await t.clearAllHistories(),console.log(u.default.green(`
118
120
  \u2713 All histories removed`))}catch(o){let n=o instanceof Error?o.message:String(o);console.error(u.default.red(`
119
121
  \u2717 Failed to remove histories: ${n}`)),process.exit(1)}break}default:console.error(u.default.red(`
120
- \u2717 Unknown action: ${e.id}`)),process.exit(1)}});function Ve(s){return s.split("/").pop()??s}function _e(s,e){console.log(`
121
- `);let t=s.records.reduce((c,m)=>c+m.duration,0),r=s.records.filter(c=>c.status==="success").length,o=s.records.filter(c=>c.status==="failure").length,n=(0,ve.default)(s.initialTimestamp).format("YYYY-MM-DD HH:mm:ss"),i=B(t),p=[u.default.bold("Workflow Execution History"),"",`${u.default.cyan("File:")} ${e}`,`${u.default.cyan("Started:")} ${n}`,`${u.default.cyan("Total Duration:")} ${i}`,`${u.default.cyan("Total Steps:")} ${s.records.length}`,`${u.default.green("\u2713 Successful:")} ${r}`,o>0?`${u.default.red("\u2717 Failed:")} ${o}`:""].filter(Boolean).join(`
122
- `);console.log((0,ne.default)(p,{borderStyle:"round",padding:{top:1,bottom:1,left:2,right:2},margin:{top:0,bottom:1},borderColor:"cyan"})),s.records.forEach((c,m)=>{Ye(c,m+1,s.records.length)}),console.log("")}function Ye(s,e,t){let r=Je(s.step),o=ze(s.step),n=s.status==="success"?u.default.green("\u2713"):u.default.red("\u2717"),a=s.status==="success"?u.default.green("Success"):u.default.red("Failed"),i=B(s.duration),p=[`${n} ${u.default.bold(`Step ${e}/${t}`)} - ${u.default.cyan(r)}`,`${u.default.gray("Duration:")} ${i} | ${u.default.gray("Status:")} ${a}`,"",u.default.white(o)].join(`
123
- `);console.log((0,ne.default)(p,{borderStyle:"round",padding:{top:1,bottom:1,left:2,right:2},margin:{top:0,bottom:1},borderColor:s.status==="success"?"green":"red"})),Ue(s.output)&&Ze(s.output)}function Je(s){return"run"in s?"Run":"choose"in s?"Choose":"prompt"in s?"Prompt":"parallel"in s?"Parallel":"fail"in s?"Fail":"Unknown"}function ze(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 Ue(s){return typeof s=="object"&&s!==null&&"success"in s&&"stdout"in s&&"stderr"in s}function Ze(s){if(s.stdout.length>0){let e=s.stdout.map(t=>u.default.gray(` ${t}`)).join(`
122
+ \u2717 Unknown action: ${e.id}`)),process.exit(1)}});function _e(s){return s.split("/").pop()??s}function Ye(s,e){console.log(`
123
+ `);let t=s.records.reduce((c,m)=>c+m.duration,0),r=s.records.filter(c=>c.status==="success").length,o=s.records.filter(c=>c.status==="failure").length,n=(0,ke.default)(s.initialTimestamp).format("YYYY-MM-DD HH:mm:ss"),i=B(t),p=[u.default.bold("Workflow Execution History"),"",`${u.default.cyan("File:")} ${e}`,`${u.default.cyan("Started:")} ${n}`,`${u.default.cyan("Total Duration:")} ${i}`,`${u.default.cyan("Total Steps:")} ${s.records.length}`,`${u.default.green("\u2713 Successful:")} ${r}`,o>0?`${u.default.red("\u2717 Failed:")} ${o}`:""].filter(Boolean).join(`
124
+ `);console.log((0,ne.default)(p,{borderStyle:"round",padding:{top:1,bottom:1,left:2,right:2},margin:{top:0,bottom:1},borderColor:"cyan"})),s.records.forEach((c,m)=>{Je(c,m+1,s.records.length)}),console.log("")}function Je(s,e,t){let r=ze(s.step),o=Ue(s.step),n=s.status==="success"?u.default.green("\u2713"):u.default.red("\u2717"),a=s.status==="success"?u.default.green("Success"):u.default.red("Failed"),i=B(s.duration),p=[`${n} ${u.default.bold(`Step ${e}/${t}`)} - ${u.default.cyan(r)}`,`${u.default.gray("Duration:")} ${i} | ${u.default.gray("Status:")} ${a}`,"",u.default.white(o)].join(`
125
+ `);console.log((0,ne.default)(p,{borderStyle:"round",padding:{top:1,bottom:1,left:2,right:2},margin:{top:0,bottom:1},borderColor:s.status==="success"?"green":"red"})),Ze(s.output)&&Ge(s.output)}function ze(s){return"run"in s?"Run":"choose"in s?"Choose":"prompt"in s?"Prompt":"parallel"in s?"Parallel":"fail"in s?"Fail":"Unknown"}function Ue(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 Ze(s){return typeof s=="object"&&s!==null&&"success"in s&&"stdout"in s&&"stderr"in s}function Ge(s){if(s.stdout.length>0){let e=s.stdout.map(t=>u.default.gray(` ${t}`)).join(`
124
126
  `);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(`
125
127
  `);console.log(u.default.red(" Errors:")),console.log(e)}}W.parse();
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import{exec as Ie}from"child_process";import{readFileSync as Be}from"fs";import{resolve as De}from"path";import{promisify as je}from"util";import le from"boxen";import u from"chalk";import{Command as Le}from"commander";import Fe from"dayjs";import{resolve as oe,isAbsolute as ye,dirname as Se}from"path";import xe from"chalk";import Z from"log-update";import K from"chalk";import Q from"inquirer";var E=class{async prompt(e,t){let{choice:r}=await Q.prompt([{type:"list",name:"choice",message:K.cyan(e),choices:t.map(o=>({name:o.label,value:o.id}))}]),n=t.find(o=>o.id===r);if(!n)throw new Error(`Invalid choice: ${r}`);return n}},j=class{async prompt(e,t){let{value:r}=await Q.prompt([{type:"input",name:"value",message:K.cyan(e),default:t}]);return r}};import J from"boxen";import I from"chalk";function z(s,e,t,r={}){let{borderColor:n="cyan",isNested:o=!1}=r,a;e!==void 0&&(t?a=`line ${e} in ${t}`:a=`line ${e}`);let i=o?`\u2502 ${s}`:`> ${s}`;return J(i,{title:a,borderStyle:"round",padding:{top:0,bottom:0,left:1,right:1},margin:{top:0,bottom:0},borderColor:n})}function P(s,e=!1,t){let r=s?"\u2713 Completed":"\u2717 Failed",n=s?I.green(r):I.red(r);if(t!==void 0){let o=M(t);return`${n} ${I.gray(`(${o})`)}`}return n}function B(s){return J(`\u2717 ${s}`,{borderStyle:"round",padding:{top:0,bottom:0,left:1,right:1},margin:{top:0,bottom:0},borderColor:"red"})}function ee(s){return J(`> Starting parallel execution (${s} branches)`,{borderStyle:"round",padding:{top:0,bottom:0,left:1,right:1},margin:{top:0,bottom:0},borderColor:"yellow"})}function te(s){let e=s?"\u2713 All parallel branches completed":"\u2717 Some parallel branches failed";return s?I.green(e):I.red(e)}function U(s,e=!1){return`${e?"| \u2502 ":"\u2502 "}${s}`}function M(s){return`${(s/1e3).toFixed(3)}s`}import{existsSync as ce}from"fs";import{resolve as ue}from"path";var N=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),a=this.workspace.getFact(r),i=o??(a!==void 0?a.toString():void 0);if(i===void 0||i!==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=ue(process.cwd(),t);return ce(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)}};import{mkdir as pe,readdir as me,readFile as fe,rm as re,writeFile as de}from"fs/promises";import{homedir as he}from"os";import{basename as ge,join as L}from"path";import we from"dayjs";var T=L(he(),".pipeliner","workflow-history"),A=class{constructor(){}async saveHistory(e){await pe(T,{recursive:!0});let t=we().format("YYYY-MM-DD_HH-mm-ss"),r=Math.random().toString(36).slice(2,6),n=L(T,`workflow-${t}-${r}.json`);return await de(n,JSON.stringify(e,null,2),{encoding:"utf8"}),n}async clearAllHistories(){await re(T,{recursive:!0,force:!0})}async removeHistory(e){await re(L(T,e),{force:!0})}async getHistoryNames(){try{let t=(await me(T)).map(r=>ge(r));return t.sort((r,n)=>{let o=p=>{let c=p.match(/workflow-(\d{4}-\d{2}-\d{2}_\d{2}-\d{2}-\d{2})-/);return c?c[1]:""},a=o(r),i=o(n);return a===i?n.localeCompare(r):i.localeCompare(a)}),t}catch(e){if(e instanceof Error&&"code"in e&&e.code==="ENOENT")return[];throw e}}async getHistory(e){let t=await fe(L(T,e),{encoding:"utf8"});return JSON.parse(t)}};var F=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 A,t={initialTimestamp:this.initialTimestamp,records:this.records};return await e.saveHistory(t)}getDuration(){return Date.now()-this.recordStartTimestamp}};var W=class{async run(e,t,r,n,o=!1,a=!1,i,p,c,m){return o?this.runBuffered(e,c,m):this.runRealtime(e,r||e,a,i,p,c,m)}async runBuffered(e,t,r){let{spawn:n}=await import("child_process"),[o,...a]=this.parseCommand(e),i=this.createSpawnOptions(t);return new Promise((p,c)=>{let m=n(o,a,i),h=[],f=[],d="",w="",S=null;r&&r>0&&(S=setTimeout(()=>{m.kill("SIGTERM");let g=`Command timed out after ${r} seconds`;f.push(g),p({success:!1,stdout:h,stderr:f})},r*1e3)),m.stdout?.on("data",g=>{let b=g.toString(),{lines:k,remaining:x}=this.processStreamBuffer(b,d);h.push(...k),d=x}),m.stderr?.on("data",g=>{let b=g.toString(),{lines:k,remaining:x}=this.processStreamBuffer(b,w);f.push(...k),w=x}),m.on("close",g=>{S&&clearTimeout(S),d.trim()&&h.push(d),w.trim()&&f.push(w),p({success:g===0,stdout:h,stderr:f})}),m.on("error",g=>{S&&clearTimeout(S);let b=`Error: ${g.message}`;p({success:!1,stdout:h,stderr:[...f,b]})})})}async runRealtime(e,t,r,n,o,a,i){let{spawn:p}=await import("child_process"),[c,...m]=this.parseCommand(e),h=this.createSpawnOptions(a),d=z(t,n,o,{borderColor:r?"green":"cyan"});console.log(d);let w=Date.now();return new Promise(S=>{let g=p(c,m,h),b="",k="",x=null;i&&i>0&&(x=setTimeout(()=>{g.kill("SIGTERM");let v=`Command timed out after ${i} seconds`,y=B(v);console.error(y);let C=Date.now()-w,$=P(!1,!1,C);console.log($),S(!1)},i*1e3)),g.stdout?.on("data",v=>{let y=v.toString(),{lines:C,remaining:$}=this.processStreamBuffer(y,b);C.forEach(Y=>process.stdout.write(`\u2502 ${Y}
2
+ import{exec as Be}from"child_process";import{readFileSync as De}from"fs";import{resolve as je}from"path";import{promisify as Le}from"util";import ce from"boxen";import u from"chalk";import{Command as Fe}from"commander";import We from"dayjs";import{resolve as oe,isAbsolute as Se,dirname as xe}from"path";import ve from"chalk";import Z from"log-update";import K from"chalk";import Q from"inquirer";var E=class{async prompt(e,t){let{choice:r}=await Q.prompt([{type:"list",name:"choice",message:K.cyan(e),choices:t.map(o=>({name:o.label,value:o.id}))}]),n=t.find(o=>o.id===r);if(!n)throw new Error(`Invalid choice: ${r}`);return n}},j=class{async prompt(e,t){let{value:r}=await Q.prompt([{type:"input",name:"value",message:K.cyan(e),default:t}]);return r}};import J from"boxen";import I from"chalk";function z(s,e,t,r={}){let{borderColor:n="cyan",isNested:o=!1}=r,a;e!==void 0&&(t?a=`line ${e} in ${t}`:a=`line ${e}`);let i=o?`\u2502 ${s}`:`> ${s}`;return J(i,{title:a,borderStyle:"round",padding:{top:0,bottom:0,left:1,right:1},margin:{top:0,bottom:0},borderColor:n})}function P(s,e=!1,t){let r=s?"\u2713 Completed":"\u2717 Failed",n=s?I.green(r):I.red(r);if(t!==void 0){let o=M(t);return`${n} ${I.gray(`(${o})`)}`}return n}function B(s){return J(`\u2717 ${s}`,{borderStyle:"round",padding:{top:0,bottom:0,left:1,right:1},margin:{top:0,bottom:0},borderColor:"red"})}function ee(s){return J(`> Starting parallel execution (${s} branches)`,{borderStyle:"round",padding:{top:0,bottom:0,left:1,right:1},margin:{top:0,bottom:0},borderColor:"yellow"})}function te(s){let e=s?"\u2713 All parallel branches completed":"\u2717 Some parallel branches failed";return s?I.green(e):I.red(e)}function U(s,e=!1){return`${e?"| \u2502 ":"\u2502 "}${s}`}function M(s){return`${(s/1e3).toFixed(3)}s`}import{existsSync as ue}from"fs";import{resolve as pe}from"path";var N=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),a=this.workspace.getFact(r),i=o??(a!==void 0?a.toString():void 0);if(i===void 0||i!==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=pe(process.cwd(),t);return ue(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)}};import{mkdir as me,readdir as fe,readFile as de,rm as re,writeFile as he}from"fs/promises";import{homedir as ge}from"os";import{basename as we,join as L}from"path";import be from"dayjs";var T=L(ge(),".pipeliner","workflow-history"),A=class{constructor(){}async saveHistory(e){await me(T,{recursive:!0});let t=be().format("YYYY-MM-DD_HH-mm-ss"),r=Math.random().toString(36).slice(2,6),n=L(T,`workflow-${t}-${r}.json`);return await he(n,JSON.stringify(e,null,2),{encoding:"utf8"}),n}async clearAllHistories(){await re(T,{recursive:!0,force:!0})}async removeHistory(e){await re(L(T,e),{force:!0})}async getHistoryNames(){try{let t=(await fe(T)).map(r=>we(r));return t.sort((r,n)=>{let o=p=>{let c=p.match(/workflow-(\d{4}-\d{2}-\d{2}_\d{2}-\d{2}-\d{2})-/);return c?c[1]:""},a=o(r),i=o(n);return a===i?n.localeCompare(r):i.localeCompare(a)}),t}catch(e){if(e instanceof Error&&"code"in e&&e.code==="ENOENT")return[];throw e}}async getHistory(e){let t=await de(L(T,e),{encoding:"utf8"});return JSON.parse(t)}};var F=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 A,t={initialTimestamp:this.initialTimestamp,records:this.records};return await e.saveHistory(t)}getDuration(){return Date.now()-this.recordStartTimestamp}};var W=class{async run(e,t,r,n,o=!1,a=!1,i,p,c,m){return o?this.runBuffered(e,c,m):this.runRealtime(e,r||e,a,i,p,c,m)}async runBuffered(e,t,r){let{spawn:n}=await import("child_process"),[o,...a]=this.parseCommand(e),i=this.createSpawnOptions(t);return new Promise((p,c)=>{let m=n(o,a,i),h=[],f=[],d="",w="",S=null;r&&r>0&&(S=setTimeout(()=>{m.kill("SIGTERM");let g=`Command timed out after ${r} seconds`;f.push(g),p({success:!1,stdout:h,stderr:f})},r*1e3)),m.stdout?.on("data",g=>{let b=g.toString(),{lines:k,remaining:x}=this.processStreamBuffer(b,d);h.push(...k),d=x}),m.stderr?.on("data",g=>{let b=g.toString(),{lines:k,remaining:x}=this.processStreamBuffer(b,w);f.push(...k),w=x}),m.on("close",g=>{S&&clearTimeout(S),d.trim()&&h.push(d),w.trim()&&f.push(w),p({success:g===0,stdout:h,stderr:f})}),m.on("error",g=>{S&&clearTimeout(S);let b=`Error: ${g.message}`;p({success:!1,stdout:h,stderr:[...f,b]})})})}async runRealtime(e,t,r,n,o,a,i){let{spawn:p}=await import("child_process"),[c,...m]=this.parseCommand(e),h=this.createSpawnOptions(a),d=z(t,n,o,{borderColor:r?"green":"cyan"});console.log(d);let w=Date.now();return new Promise(S=>{let g=p(c,m,h),b="",k="",x=null;i&&i>0&&(x=setTimeout(()=>{g.kill("SIGTERM");let v=`Command timed out after ${i} seconds`,y=B(v);console.error(y);let C=Date.now()-w,$=P(!1,!1,C);console.log($),S(!1)},i*1e3)),g.stdout?.on("data",v=>{let y=v.toString(),{lines:C,remaining:$}=this.processStreamBuffer(y,b);C.forEach(Y=>process.stdout.write(`\u2502 ${Y}
3
3
  `)),b=$}),g.stderr?.on("data",v=>{let y=v.toString(),{lines:C,remaining:$}=this.processStreamBuffer(y,k);C.forEach(Y=>process.stderr.write(`\u2502 ${Y}
4
4
  `)),k=$}),g.on("close",v=>{x&&clearTimeout(x),b.trim()&&process.stdout.write(`\u2502 ${b}
5
5
  `),k.trim()&&process.stderr.write(`\u2502 ${k}
@@ -8,16 +8,16 @@ import{exec as Ie}from"child_process";import{readFileSync as Be}from"fs";import{
8
8
  `),i=o.substring(0,a);o=o.substring(a+1),n.push(i)}return{lines:n,remaining:o}}formatNestedOutput(e,t){t?e.split(`
9
9
  `).forEach(r=>{r.trim()&&console.log(`| ${r}`)}):console.log(e)}displayBufferedOutput(e,t,r=!1,n,o){let a=z(t,n,o,{borderColor:"cyan",isNested:r});this.formatNestedOutput(a,r),e.stdout.forEach(p=>{let c=U(p,r);process.stdout.write(`${c}
10
10
  `)}),e.stderr.forEach(p=>{let c=U(p,r);process.stderr.write(`${c}
11
- `)});let i=P(e.success,r);console.log(i)}};function be(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 H(s,e){let t=/\{\{(\w+)\}\}/g;return s.replace(t,(r,n)=>be(n,e,r))}var O=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 V=class s{static PARALLEL_STEP_INDEX_MULTIPLIER=1e3;workspace;taskRunner;choicePrompt;textPrompt;baseDir;constructor(){this.workspace=new O,this.taskRunner=new W,this.choicePrompt=new E,this.textPrompt=new j}resolveBaseDir(e){if(e.baseDir)if(ye(e.baseDir))this.baseDir=e.baseDir;else if(e._filePath){let t=Se(e._filePath);this.baseDir=oe(t,e.baseDir)}else this.baseDir=oe(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 N(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 F,r=Date.now();for(let a=0;a<e.steps.length;a++){let i=e.steps[a],p=this.createStepContext(a,e),c=!!i.when;if(this.evaluateStepCondition(i)){t.recordStart();try{let m=await this.executeStep(i,p,!1,c);this.handleStepResult(i,p,a,m,t)}catch(m){throw this.handleStepError(i,p,a,m,t),m}}}let n=Date.now()-r,o=M(n);console.log(xe.cyan(`
11
+ `)});let i=P(e.success,r);console.log(i)}};function ye(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 H(s,e){let t=/\{\{(\w+)\}\}/g;return s.replace(t,(r,n)=>ye(n,e,r))}var O=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 V=class s{static PARALLEL_STEP_INDEX_MULTIPLIER=1e3;workspace;taskRunner;choicePrompt;textPrompt;baseDir;constructor(){this.workspace=new O,this.taskRunner=new W,this.choicePrompt=new E,this.textPrompt=new j}resolveBaseDir(e){if(e.baseDir)if(Se(e.baseDir))this.baseDir=e.baseDir;else if(e._filePath){let t=xe(e._filePath);this.baseDir=oe(t,e.baseDir)}else this.baseDir=oe(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 N(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 F,r=Date.now();for(let a=0;a<e.steps.length;a++){let i=e.steps[a],p=this.createStepContext(a,e),c=!!i.when;if(this.evaluateStepCondition(i)){t.recordStart();try{let m=await this.executeStep(i,p,!1,c);this.handleStepResult(i,p,a,m,t)}catch(m){throw this.handleStepError(i,p,a,m,t),m}}}let n=Date.now()-r,o=M(n);console.log(ve.cyan(`
12
12
  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 a=this.isRunStep(e)?(()=>{let c=this.workspace.getStepResult(r);return c?c.success:!0})():this.isStepSuccessful(n,e),i=a?"success":"failure",p=o.recordEnd(e,t,n,i);if(!this.isRunStep(e)){let c=P(a,!1,p);console.log(c)}if(this.isRunStep(e)){if(e.continue===!1){let c=t.lineNumber?` (line ${t.lineNumber})`:"",m=a?`Step ${r}${c} completed, but workflow stopped due to continue: false`:`Step ${r}${c} failed`;throw new Error(m)}if(!a&&e.continue!==!0){let c=t.lineNumber?` (line ${t.lineNumber})`:"";throw new Error(`Step ${r}${c} failed`)}}}handleStepError(e,t,r,n,o){this.workspace.setStepResult(r,!1);let a=n instanceof Error?n.message:String(n),i={success:!1,stdout:[],stderr:[a]};o.recordEnd(e,t,i,"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),a=H(e.run,this.workspace),i=e.retry??0,p=e.timeout,c=!1,m=0;for(;m<=i;){let h=await this.taskRunner.run(a,o,a,t.branchIndex,r,n,t.lineNumber,t.fileName,this.baseDir,p),f=typeof h=="boolean"?h:h.success;if(c=h,f||m>=i)break;if(m++,m<=i){let d=Math.min(1e3*Math.pow(2,m-1),1e4);await new Promise(w=>setTimeout(w,d))}}return c}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),a=typeof o=="boolean"?o:o.success;if(this.workspace.setStepResult(t.stepIndex,a),a||!e.onError)return o;let i={run:e.onError.run,timeout:e.onError.timeout,retry:e.onError.retry,onError:e.onError.onError??void 0};return await this.executeRunChain(i,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=H(e.prompt.message,this.workspace),n=e.prompt.default?H(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 c=0;c<e.length;c++){let m=e[c],h=t[c];if(m.when&&!new N(h.workspace).evaluate(m.when))continue;let f=this.getBranchDisplayName(m,c);r.push({index:c,name:f,status:"pending"})}let a=setInterval(()=>{o=(o+1)%n.length,this.updateParallelBranchesDisplay(r,n[o])},100),i=r.map(async c=>{let{index:m}=c,h=e[m],f=t[m];c.status="running";try{let d=await this.executeStep(h,f,!0);return c.status="success",this.updateParallelBranchesDisplay(r,n[o]),{index:m,result:d,context:f}}catch(d){f.workspace.setStepResult(f.stepIndex,!1);let w=d instanceof Error?d.message:String(d);return c.status="failed",c.error=w,this.updateParallelBranchesDisplay(r,n[o]),{index:m,error:d,context:f}}}),p=await Promise.all(i);return clearInterval(a),this.updateParallelBranchesDisplay(r,"",!0),Z.done(),p}updateParallelBranchesDisplay(e,t,r=!1){let n=e.map(o=>{let a=o.index+1,i="",p="";switch(o.status){case"pending":i="\u25CB",p=`Branch ${a}: ${o.name} - Pending`;break;case"running":i=t,p=`Branch ${a}: ${o.name} - Running...`;break;case"success":i="\u2713",p=`Branch ${a}: ${o.name} - Completed`;break;case"failed":i="\u2717",p=`Branch ${a}: ${o.name} - Failed${o.error?`: ${o.error}`:""}`;break}return`${i} ${p}`});r?Z(n.join(`
13
13
  `)):Z(n.join(`
14
- `))}displayParallelResults(e,t,r){let n=!0,o=!1;console.log("");for(let i of e){if(!i)continue;o=!0;let{index:p,result:c,error:m,context:h}=i;if(m){n=!1;let f=`Branch ${p+1} failed: ${m instanceof Error?m.message:String(m)}`,d=B(f);console.error(d)}else if(c&&typeof c=="object"&&"stdout"in c){let f=c;if(n=n&&f.success,f.stdout.length>0||f.stderr.length>0||!f.success){let d=t[p],w=this.getBranchDisplayName(d,p);this.taskRunner.displayBufferedOutput(f,w,!1,h.lineNumber,h.fileName)}}}o||console.log("\u26A0\uFE0F All parallel branches were skipped (conditions not met)");let a=te(n);return console.log(a),n}mergeParallelResults(e){for(let t of e){let r=t.workspace.getAllFacts(),n=t.workspace.getAllVariables();for(let[o,a]of r)this.workspace.setFact(o,a);for(let[o,a]of n)this.workspace.setVariable(o,a)}}countExecutableBranches(e,t){let r=0;for(let n=0;n<e.length;n++){let o=e[n],a=t[n];o.when&&!new N(a.workspace).evaluate(o.when)||r++}return r}async executeParallelStep(e,t){let r=this.createParallelContexts(e,t),n=this.countExecutableBranches(e.parallel,r),o=ee(n);console.log(o);let a=await this.executeParallelBranches(e.parallel,r),i=this.displayParallelResults(a,e.parallel,t);if(this.workspace.setStepResult(t.stepIndex,i),!i){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}};import{parse as Ae}from"yaml";import{ZodError as ae}from"zod";import{z as l}from"zod";var ve=l.object({file:l.string()}),ke=l.object({var:l.union([l.string(),l.record(l.string(),l.string())]).optional(),has:l.string().optional()}),Re=l.object({status:l.object({fact:l.string(),is:l.enum(["ready","failed","pending"])})}),Ce=l.object({step:l.object({success:l.boolean()}).optional(),last_step:l.enum(["success","failure"]).optional()}),$e=l.object({choice:l.string()}),Ee=l.union([ve,$e,ke,Re,Ce]),R=l.lazy(()=>l.union([Ee,l.object({all:l.array(R)}),l.object({any:l.array(R)}),l.object({not:R})])),ne=l.lazy(()=>l.object({run:l.string(),timeout:l.number().optional(),retry:l.number().optional(),onError:ne.optional()})),Pe=l.object({run:l.string(),when:R.optional(),timeout:l.number().optional(),retry:l.number().optional(),continue:l.boolean().optional(),onError:ne.optional()}),Me=l.object({choose:l.object({message:l.string(),options:l.array(l.object({id:l.string(),label:l.string()})),as:l.string().optional()}),when:R.optional()}),Ne=l.object({prompt:l.object({message:l.string(),as:l.string(),default:l.string().optional(),validate:l.string().optional()}),when:R.optional()}),se=l.lazy(()=>l.union([Pe,Me,Ne,l.object({parallel:l.array(se),when:R.optional()}),l.object({fail:l.object({message:l.string()}),when:R.optional()})])),Te=l.object({name:l.string().optional(),baseDir:l.string().optional(),steps:l.array(se).min(1,"Workflow must have at least one step")});function G(s){return Te.parse(s)}function q(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=>q(t))}:s}var _=class{parse(e){let t;try{t=Ae(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=>q(n)))}try{return G(t)}catch(r){if(r instanceof ae){let n=r.issues.map(o=>{let a=o.path.length>0?` at ${o.path.join(".")}`:"";return` - ${o.message}${a}`}).join(`
14
+ `))}displayParallelResults(e,t,r){let n=!0,o=!1;console.log("");for(let i of e){if(!i)continue;o=!0;let{index:p,result:c,error:m,context:h}=i;if(m){n=!1;let f=`Branch ${p+1} failed: ${m instanceof Error?m.message:String(m)}`,d=B(f);console.error(d)}else if(c&&typeof c=="object"&&"stdout"in c){let f=c;if(n=n&&f.success,f.stdout.length>0||f.stderr.length>0||!f.success){let d=t[p],w=this.getBranchDisplayName(d,p);this.taskRunner.displayBufferedOutput(f,w,!1,h.lineNumber,h.fileName)}}}o||console.log("\u26A0\uFE0F All parallel branches were skipped (conditions not met)");let a=te(n);return console.log(a),n}mergeParallelResults(e){for(let t of e){let r=t.workspace.getAllFacts(),n=t.workspace.getAllVariables();for(let[o,a]of r)this.workspace.setFact(o,a);for(let[o,a]of n)this.workspace.setVariable(o,a)}}countExecutableBranches(e,t){let r=0;for(let n=0;n<e.length;n++){let o=e[n],a=t[n];o.when&&!new N(a.workspace).evaluate(o.when)||r++}return r}async executeParallelStep(e,t){let r=this.createParallelContexts(e,t),n=this.countExecutableBranches(e.parallel,r),o=ee(n);console.log(o);let a=await this.executeParallelBranches(e.parallel,r),i=this.displayParallelResults(a,e.parallel,t);if(this.workspace.setStepResult(t.stepIndex,i),!i){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}};import{parse as Ie}from"yaml";import{ZodError as ae}from"zod";import{z as l}from"zod";var ke=l.object({file:l.string()}),Re=l.object({var:l.union([l.string(),l.record(l.string(),l.string())]).optional(),has:l.string().optional()}),Ce=l.object({status:l.object({fact:l.string(),is:l.enum(["ready","failed","pending"])})}),$e=l.object({step:l.object({success:l.boolean()}).optional(),last_step:l.enum(["success","failure"]).optional()}),Ee=l.object({choice:l.string()}),Pe=l.union([ke,Ee,Re,Ce,$e]),R=l.lazy(()=>l.union([Pe,l.object({all:l.array(R)}),l.object({any:l.array(R)}),l.object({not:R})])),ne=l.lazy(()=>l.object({run:l.string(),timeout:l.number().optional(),retry:l.number().optional(),onError:ne.optional()})),Me=l.object({run:l.string(),when:R.optional(),timeout:l.number().optional(),retry:l.number().optional(),continue:l.boolean().optional(),onError:ne.optional()}),Ne=l.object({choose:l.object({message:l.string(),options:l.array(l.object({id:l.string(),label:l.string()})),as:l.string().optional()}),when:R.optional()}),Te=l.object({prompt:l.object({message:l.string(),as:l.string(),default:l.string().optional(),validate:l.string().optional()}),when:R.optional()}),se=l.lazy(()=>l.union([Me,Ne,Te,l.object({parallel:l.array(se),when:R.optional()}),l.object({fail:l.object({message:l.string()}),when:R.optional()})])),Ae=l.object({name:l.string().optional(),baseDir:l.string().optional(),steps:l.array(se).min(1,"Workflow must have at least one step")});function G(s){return Ae.parse(s)}function q(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=>q(t))}:s}var _=class{parse(e){let t;try{t=Ie(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=>q(n)))}try{return G(t)}catch(r){if(r instanceof ae){let n=r.issues.map(o=>{let a=o.path.length>0?` at ${o.path.join(".")}`:"";return` - ${o.message}${a}`}).join(`
15
15
  `);throw new Error(`Invalid workflow structure:
16
16
  ${n}`)}throw r}}extractStepLineNumbers(e){let t=new Map,r=e.split(`
17
17
  `),n=0,o=!1;for(let a=0;a<r.length;a++){let i=r[a].trim();if(i==="steps:"||i.startsWith("steps:")){o=!0;continue}o&&i.startsWith("-")&&t.set(n++,a+1)}return t}},X=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=>q(n)))}try{return G(t)}catch(r){if(r instanceof ae){let n=r.issues.map(o=>{let a=o.path.length>0?` at ${o.path.join(".")}`:"";return` - ${o.message}${a}`}).join(`
18
18
  `);throw new Error(`Invalid workflow structure:
19
19
  ${n}`)}throw r}}extractStepLineNumbers(e){let t=new Map,r=e.split(`
20
- `),n=0,o=!1,a=!1;for(let i=0;i<r.length;i++){let c=r[i].trim();if(c.startsWith('"steps"')||c.startsWith("'steps'")){o=!0,c.includes("[")&&(a=!0);continue}if(o&&c==="["){a=!0;continue}if(a&&c==="]"){a=!1,o=!1;continue}a&&c.startsWith("{")&&t.set(n++,i+1)}return t}};function ie(s){switch(s.toLowerCase().split(".").pop()){case"yaml":case"yml":return new _;case"json":return new X;default:return new _}}var We=je(Ie),D=new Le;D.name("task-pipeliner").description(`A powerful task pipeline runner with condition-based workflow execution.
20
+ `),n=0,o=!1,a=!1;for(let i=0;i<r.length;i++){let c=r[i].trim();if(c.startsWith('"steps"')||c.startsWith("'steps'")){o=!0,c.includes("[")&&(a=!0);continue}if(o&&c==="["){a=!0;continue}if(a&&c==="]"){a=!1,o=!1;continue}a&&c.startsWith("{")&&t.set(n++,i+1)}return t}};function ie(s){switch(s.toLowerCase().split(".").pop()){case"yaml":case"yml":return new _;case"json":return new X;default:return new _}}function le(){console.log=()=>{},console.error=()=>{},console.warn=()=>{},console.info=()=>{},process.stdout.write=()=>!0,process.stderr.write=()=>!0}var He=Le(Be),D=new Fe;D.name("task-pipeliner").description(`A powerful task pipeline runner with condition-based workflow execution.
21
21
 
22
22
  Define workflows in YAML or JSON files with conditional execution, parallel tasks,
23
23
  interactive prompts, and variable substitution.
@@ -68,12 +68,14 @@ Resources:
68
68
  \u{1F4DA} Documentation: https://task-pipeliner.racgoo.com/
69
69
  \u{1F3A8} Visual Generator: https://task-pipeliner-generator.racgoo.com/
70
70
 
71
- See README.md for complete DSL reference.`);D.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)").addHelpText("after",`
71
+ See README.md for complete DSL reference.`);D.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)").option("-s, --silent","Run in silent mode (suppress console output)").addHelpText("after",`
72
72
  Examples:
73
73
  $ tp run workflow.yaml
74
74
  $ tp run workflow.json
75
75
  $ tp run ./my-workflow.yaml
76
76
  $ tp run examples/simple-project/workflow.json
77
+ $ tp run workflow.yaml --silent
78
+ $ tp run workflow.yaml -s
77
79
 
78
80
  Workflow File Structure:
79
81
  A workflow file must contain a "steps" array with step definitions.
@@ -90,10 +92,10 @@ Workflow File Structure:
90
92
  \u2022 all/any/not: Combine conditions
91
93
 
92
94
  Supported formats: YAML (.yaml, .yml) and JSON (.json)
93
- See README.md for complete DSL documentation.`).action(async s=>{try{let e=ie(s);console.log(u.blue(`Loading workflow from ${s}...`));let t=Be(s,"utf-8"),r=e.parse(t);if(!r.steps||!Array.isArray(r.steps))throw new Error("Invalid workflow: steps array is required");r._lineNumbers=e.extractStepLineNumbers(t),r._fileName=Oe(s),r._filePath=De(s),console.log(u.green(`Starting workflow execution...
94
- `)),await new V().execute(r),console.log(u.green(`
95
- \u2713 Workflow completed successfully`))}catch(e){let t=e instanceof Error?e.message:String(e);console.error(u.red(`
96
- \u2717 Workflow failed: ${t}`)),process.exit(1)}});D.command("open").description("Open generator or docs website in browser").argument("<target>",'Target to open: "generator" or "docs"').addHelpText("after",`
95
+ See README.md for complete DSL documentation.`).action(async(s,e)=>{e.silent&&le();try{let t=ie(s);console.log(u.blue(`Loading workflow from ${s}...`));let r=De(s,"utf-8"),n=t.parse(r);if(!n.steps||!Array.isArray(n.steps))throw new Error("Invalid workflow: steps array is required");n._lineNumbers=t.extractStepLineNumbers(r),n._fileName=Ve(s),n._filePath=je(s),console.log(u.green(`Starting workflow execution...
96
+ `)),await new V().execute(n),console.log(u.green(`
97
+ \u2713 Workflow completed successfully`))}catch(t){let r=t instanceof Error?t.message:String(t);console.error(u.red(`
98
+ \u2717 Workflow failed: ${r}`)),process.exit(1)}});D.command("open").description("Open generator or docs website in browser").argument("<target>",'Target to open: "generator" or "docs"').addHelpText("after",`
97
99
  Examples:
98
100
  $ tp open generator
99
101
  $ tp open docs
@@ -102,13 +104,13 @@ Targets:
102
104
  generator Open the visual workflow generator (https://task-pipeliner-generator.racgoo.com/)
103
105
  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.red(`
104
106
  \u2717 Invalid target: ${s}`)),console.log(u.yellow(`
105
- Valid targets:`)),console.log(u.yellow(" \u2022 generator - Open the visual workflow generator")),console.log(u.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 We(n),console.log(u.green(`
107
+ Valid targets:`)),console.log(u.yellow(" \u2022 generator - Open the visual workflow generator")),console.log(u.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 He(n),console.log(u.green(`
106
108
  \u2713 Opening ${s==="generator"?"generator":"documentation"} in browser...`)),console.log(u.blue(` ${t}`))}catch(r){let n=r instanceof Error?r.message:String(r);console.error(u.red(`
107
109
  \u2717 Failed to open browser: ${n}`)),console.log(u.yellow(`
108
- Please visit manually: ${t}`)),process.exit(1)}});var He=D.command("history").description("Manage workflow execution history");He.action(async()=>{let s=new E,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.red(`
110
+ Please visit manually: ${t}`)),process.exit(1)}});var Oe=D.command("history").description("Manage workflow execution history");Oe.action(async()=>{let s=new E,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.red(`
109
111
  \u2717 Invalid choice`)),process.exit(1));let t=new A;switch(e.id){case"show":{let r=await t.getHistoryNames();if(r.length===0){console.log(u.yellow(`
110
112
  \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.red(`
111
- \u2717 Invalid choice`)),process.exit(1));try{let o=await t.getHistory(n.id);Ve(o,n.id)}catch(o){let a=o instanceof Error?o.message:String(o);console.error(u.red(`
113
+ \u2717 Invalid choice`)),process.exit(1));try{let o=await t.getHistory(n.id);_e(o,n.id)}catch(o){let a=o instanceof Error?o.message:String(o);console.error(u.red(`
112
114
  \u2717 Failed to load history: ${a}`)),process.exit(1)}break}case"remove":{let r=await t.getHistoryNames();if(r.length===0){console.log(u.yellow(`
113
115
  \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.red(`
114
116
  \u2717 Invalid choice`)),process.exit(1));try{await t.removeHistory(n.id),console.log(u.green(`
@@ -117,9 +119,9 @@ Please visit manually: ${t}`)),process.exit(1)}});var He=D.command("history").de
117
119
  \u2717 Cancelled`));return}try{await t.clearAllHistories(),console.log(u.green(`
118
120
  \u2713 All histories removed`))}catch(n){let o=n instanceof Error?n.message:String(n);console.error(u.red(`
119
121
  \u2717 Failed to remove histories: ${o}`)),process.exit(1)}break}default:console.error(u.red(`
120
- \u2717 Unknown action: ${e.id}`)),process.exit(1)}});function Oe(s){return s.split("/").pop()??s}function Ve(s,e){console.log(`
121
- `);let t=s.records.reduce((c,m)=>c+m.duration,0),r=s.records.filter(c=>c.status==="success").length,n=s.records.filter(c=>c.status==="failure").length,o=Fe(s.initialTimestamp).format("YYYY-MM-DD HH:mm:ss"),i=M(t),p=[u.bold("Workflow Execution History"),"",`${u.cyan("File:")} ${e}`,`${u.cyan("Started:")} ${o}`,`${u.cyan("Total Duration:")} ${i}`,`${u.cyan("Total Steps:")} ${s.records.length}`,`${u.green("\u2713 Successful:")} ${r}`,n>0?`${u.red("\u2717 Failed:")} ${n}`:""].filter(Boolean).join(`
122
- `);console.log(le(p,{borderStyle:"round",padding:{top:1,bottom:1,left:2,right:2},margin:{top:0,bottom:1},borderColor:"cyan"})),s.records.forEach((c,m)=>{_e(c,m+1,s.records.length)}),console.log("")}function _e(s,e,t){let r=Ye(s.step),n=Je(s.step),o=s.status==="success"?u.green("\u2713"):u.red("\u2717"),a=s.status==="success"?u.green("Success"):u.red("Failed"),i=M(s.duration),p=[`${o} ${u.bold(`Step ${e}/${t}`)} - ${u.cyan(r)}`,`${u.gray("Duration:")} ${i} | ${u.gray("Status:")} ${a}`,"",u.white(n)].join(`
123
- `);console.log(le(p,{borderStyle:"round",padding:{top:1,bottom:1,left:2,right:2},margin:{top:0,bottom:1},borderColor:s.status==="success"?"green":"red"})),ze(s.output)&&Ue(s.output)}function Ye(s){return"run"in s?"Run":"choose"in s?"Choose":"prompt"in s?"Prompt":"parallel"in s?"Parallel":"fail"in s?"Fail":"Unknown"}function Je(s){return"run"in s?`Command: ${u.yellow(s.run)}`:"choose"in s?`Message: ${u.yellow(s.choose.message)}`:"prompt"in s?`Message: ${u.yellow(s.prompt.message)} | Variable: ${u.cyan(s.prompt.as)}`:"parallel"in s?`Parallel execution with ${s.parallel.length} branches`:"fail"in s?`Error: ${u.red(s.fail.message)}`:"Unknown step type"}function ze(s){return typeof s=="object"&&s!==null&&"success"in s&&"stdout"in s&&"stderr"in s}function Ue(s){if(s.stdout.length>0){let e=s.stdout.map(t=>u.gray(` ${t}`)).join(`
122
+ \u2717 Unknown action: ${e.id}`)),process.exit(1)}});function Ve(s){return s.split("/").pop()??s}function _e(s,e){console.log(`
123
+ `);let t=s.records.reduce((c,m)=>c+m.duration,0),r=s.records.filter(c=>c.status==="success").length,n=s.records.filter(c=>c.status==="failure").length,o=We(s.initialTimestamp).format("YYYY-MM-DD HH:mm:ss"),i=M(t),p=[u.bold("Workflow Execution History"),"",`${u.cyan("File:")} ${e}`,`${u.cyan("Started:")} ${o}`,`${u.cyan("Total Duration:")} ${i}`,`${u.cyan("Total Steps:")} ${s.records.length}`,`${u.green("\u2713 Successful:")} ${r}`,n>0?`${u.red("\u2717 Failed:")} ${n}`:""].filter(Boolean).join(`
124
+ `);console.log(ce(p,{borderStyle:"round",padding:{top:1,bottom:1,left:2,right:2},margin:{top:0,bottom:1},borderColor:"cyan"})),s.records.forEach((c,m)=>{Ye(c,m+1,s.records.length)}),console.log("")}function Ye(s,e,t){let r=Je(s.step),n=ze(s.step),o=s.status==="success"?u.green("\u2713"):u.red("\u2717"),a=s.status==="success"?u.green("Success"):u.red("Failed"),i=M(s.duration),p=[`${o} ${u.bold(`Step ${e}/${t}`)} - ${u.cyan(r)}`,`${u.gray("Duration:")} ${i} | ${u.gray("Status:")} ${a}`,"",u.white(n)].join(`
125
+ `);console.log(ce(p,{borderStyle:"round",padding:{top:1,bottom:1,left:2,right:2},margin:{top:0,bottom:1},borderColor:s.status==="success"?"green":"red"})),Ue(s.output)&&Ze(s.output)}function Je(s){return"run"in s?"Run":"choose"in s?"Choose":"prompt"in s?"Prompt":"parallel"in s?"Parallel":"fail"in s?"Fail":"Unknown"}function ze(s){return"run"in s?`Command: ${u.yellow(s.run)}`:"choose"in s?`Message: ${u.yellow(s.choose.message)}`:"prompt"in s?`Message: ${u.yellow(s.prompt.message)} | Variable: ${u.cyan(s.prompt.as)}`:"parallel"in s?`Parallel execution with ${s.parallel.length} branches`:"fail"in s?`Error: ${u.red(s.fail.message)}`:"Unknown step type"}function Ue(s){return typeof s=="object"&&s!==null&&"success"in s&&"stdout"in s&&"stderr"in s}function Ze(s){if(s.stdout.length>0){let e=s.stdout.map(t=>u.gray(` ${t}`)).join(`
124
126
  `);console.log(u.green(" Output:")),console.log(e)}if(s.stderr.length>0){let e=s.stderr.map(t=>u.gray(` ${t}`)).join(`
125
127
  `);console.log(u.red(" Errors:")),console.log(e)}}D.parse();
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "task-pipeliner",
3
- "version": "0.2.2",
3
+ "version": "0.2.4",
4
4
  "description": "A task pipeline runner with condition-based workflow execution",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -68,6 +68,22 @@
68
68
  "files": [
69
69
  "dist"
70
70
  ],
71
+ "pkg": {
72
+ "assets": [
73
+ "dist/**/*.node",
74
+ "dist/**/*.js",
75
+ "dist/**/*.json"
76
+ ],
77
+ "scripts": [
78
+ "dist/**/*.js"
79
+ ],
80
+ "targets": [
81
+ "node18-macos-arm64",
82
+ "node18-macos-x64",
83
+ "node18-linux-x64",
84
+ "node18-win-x64"
85
+ ]
86
+ },
71
87
  "scripts": {
72
88
  "build": "pnpm build:napi && pnpm build:ts && pnpm build:cleanup",
73
89
  "build:napi": "napi build dist --cargo-cwd rust --release",
@@ -1,19 +0,0 @@
1
- #!/usr/bin/env node
2
- /**
3
- * CLI Entry Point
4
- *
5
- * This is the main command-line interface for task-pipeliner.
6
- *
7
- * Usage:
8
- * task-pipeliner run workflow.yaml
9
- * task-pipeliner run workflow.json
10
- *
11
- * What it does:
12
- * 1. Reads workflow file (YAML or JSON)
13
- * 2. Parses workflow definition
14
- * 3. Extracts step line numbers (for error reporting)
15
- * 4. Executes workflow using Executor
16
- * 5. Handles errors and displays results
17
- */
18
- export {};
19
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;;;;GAeG"}