yaml-flow 3.1.1 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (148) hide show
  1. package/README.md +81 -20
  2. package/board-live-cards-cli.js +37 -0
  3. package/browser/card-compute.js +132 -431
  4. package/browser/live-cards.js +41 -27
  5. package/browser/live-cards.schema.json +59 -77
  6. package/dist/card-compute/index.cjs +135 -415
  7. package/dist/card-compute/index.cjs.map +1 -1
  8. package/dist/card-compute/index.d.cts +52 -49
  9. package/dist/card-compute/index.d.ts +52 -49
  10. package/dist/card-compute/index.js +134 -415
  11. package/dist/card-compute/index.js.map +1 -1
  12. package/dist/cli/board-live-cards-cli.cjs +2379 -0
  13. package/dist/cli/board-live-cards-cli.cjs.map +1 -0
  14. package/dist/cli/board-live-cards-cli.d.cts +213 -0
  15. package/dist/cli/board-live-cards-cli.d.ts +213 -0
  16. package/dist/cli/board-live-cards-cli.js +2332 -0
  17. package/dist/cli/board-live-cards-cli.js.map +1 -0
  18. package/dist/{constants-B2zqu10b.d.ts → constants-DuzE5n03.d.ts} +2 -2
  19. package/dist/{constants-DJZU1pwJ.d.cts → constants-ozjf1Ejw.d.cts} +2 -2
  20. package/dist/continuous-event-graph/index.cjs +201 -448
  21. package/dist/continuous-event-graph/index.cjs.map +1 -1
  22. package/dist/continuous-event-graph/index.d.cts +16 -340
  23. package/dist/continuous-event-graph/index.d.ts +16 -340
  24. package/dist/continuous-event-graph/index.js +198 -448
  25. package/dist/continuous-event-graph/index.js.map +1 -1
  26. package/dist/event-graph/index.cjs +4 -4
  27. package/dist/event-graph/index.cjs.map +1 -1
  28. package/dist/event-graph/index.d.cts +5 -5
  29. package/dist/event-graph/index.d.ts +5 -5
  30. package/dist/event-graph/index.js +4 -4
  31. package/dist/event-graph/index.js.map +1 -1
  32. package/dist/index.cjs +278 -533
  33. package/dist/index.cjs.map +1 -1
  34. package/dist/index.d.cts +8 -7
  35. package/dist/index.d.ts +8 -7
  36. package/dist/index.js +278 -533
  37. package/dist/index.js.map +1 -1
  38. package/dist/inference/index.cjs +138 -19
  39. package/dist/inference/index.cjs.map +1 -1
  40. package/dist/inference/index.d.cts +2 -2
  41. package/dist/inference/index.d.ts +2 -2
  42. package/dist/inference/index.js +138 -19
  43. package/dist/inference/index.js.map +1 -1
  44. package/dist/journal-BJDjWb5Q.d.cts +343 -0
  45. package/dist/journal-B_2JnBMF.d.ts +343 -0
  46. package/dist/step-machine/index.cjs +18 -1
  47. package/dist/step-machine/index.cjs.map +1 -1
  48. package/dist/step-machine/index.d.cts +2 -2
  49. package/dist/step-machine/index.d.ts +2 -2
  50. package/dist/step-machine/index.js +18 -1
  51. package/dist/step-machine/index.js.map +1 -1
  52. package/dist/stores/file.d.cts +1 -1
  53. package/dist/stores/file.d.ts +1 -1
  54. package/dist/stores/index.d.cts +1 -1
  55. package/dist/stores/index.d.ts +1 -1
  56. package/dist/stores/localStorage.d.cts +1 -1
  57. package/dist/stores/localStorage.d.ts +1 -1
  58. package/dist/stores/memory.d.cts +1 -1
  59. package/dist/stores/memory.d.ts +1 -1
  60. package/dist/{types-BwvgvlOO.d.cts → types-BzLD8bjb.d.cts} +1 -1
  61. package/dist/{types-ClRA8hzC.d.ts → types-C2eJ7DAV.d.ts} +1 -1
  62. package/dist/{types-DEj7OakX.d.cts → types-CMFSIjpc.d.cts} +39 -4
  63. package/dist/{types-DEj7OakX.d.ts → types-CMFSIjpc.d.ts} +39 -4
  64. package/dist/{types-FZ_eyErS.d.cts → types-ycun84cq.d.cts} +1 -0
  65. package/dist/{types-FZ_eyErS.d.ts → types-ycun84cq.d.ts} +1 -0
  66. package/dist/{validate-DEZ2Ymdb.d.ts → validate-DJQTQ6bP.d.ts} +1 -1
  67. package/dist/{validate-DqKTZg_o.d.cts → validate-ke92Cleg.d.cts} +1 -1
  68. package/examples/browser/boards/portfolio-tracker/cards/holdings-table.json +22 -0
  69. package/examples/browser/boards/portfolio-tracker/cards/portfolio-form.json +16 -0
  70. package/examples/browser/boards/portfolio-tracker/cards/portfolio-value.json +15 -0
  71. package/examples/browser/boards/portfolio-tracker/cards/price-fetch.json +15 -0
  72. package/examples/browser/boards/portfolio-tracker/fetch-prices.js +43 -0
  73. package/examples/browser/boards/portfolio-tracker/portfolio-tracker.bat +7 -0
  74. package/examples/browser/boards/portfolio-tracker/portfolio-tracker.js +189 -0
  75. package/examples/browser/livecards-browser/index.html +688 -0
  76. package/examples/browser/{index.html → step-machine-browser/index.html} +53 -53
  77. package/examples/cli/step-machine-cli/portfolio-tracker/cards/holdings-table.json +22 -0
  78. package/examples/cli/step-machine-cli/portfolio-tracker/cards/portfolio-form.json +43 -0
  79. package/examples/cli/step-machine-cli/portfolio-tracker/cards/portfolio-value.json +15 -0
  80. package/examples/cli/step-machine-cli/portfolio-tracker/cards/price-fetch.json +15 -0
  81. package/examples/cli/step-machine-cli/portfolio-tracker/fetch-prices.js +48 -0
  82. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/_board-cli.js +58 -0
  83. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/add-cards-cli.js +27 -0
  84. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/init-board-cli.js +25 -0
  85. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/reset-board-dir-cli.js +29 -0
  86. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/retrigger-cli.js +27 -0
  87. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/status-cli.js +25 -0
  88. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/update-holdings-cli.js +37 -0
  89. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/wait-completed-cli.js +53 -0
  90. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/write-prices-cli.js +35 -0
  91. package/examples/cli/step-machine-cli/portfolio-tracker/portfolio-tracker.flow.yaml +227 -0
  92. package/examples/cli/step-machine-cli/portfolio-tracker/portfolio-tracker.input.json +38 -0
  93. package/examples/cli/step-machine-cli/portfolio-tracker/run-portfolio-tracker.bat +29 -0
  94. package/examples/cli/step-machine-demo/jsonata-init-board-cli.js +36 -0
  95. package/examples/cli/step-machine-demo/jsonata-init-board.flow.yaml +30 -0
  96. package/examples/cli/step-machine-demo/one-step-cli-only.flow.yaml +19 -0
  97. package/examples/cli/step-machine-demo/step-cli-echo-y.js +15 -0
  98. package/examples/cli/step-machine-demo/step2-double-cli.js +39 -0
  99. package/examples/cli/step-machine-demo/two-step-math-handlers.js +32 -0
  100. package/examples/cli/step-machine-demo/two-step-math.flow.yaml +31 -0
  101. package/examples/cli/step-machine-demo/two-step-mixed-handlers.js +24 -0
  102. package/examples/cli/step-machine-demo/two-step-mixed.flow.yaml +35 -0
  103. package/examples/index.html +792 -0
  104. package/examples/{batch → npm-libs/batch}/batch-step-machine.ts +1 -1
  105. package/examples/{continuous-event-graph → npm-libs/continuous-event-graph}/live-cards-board.ts +1 -1
  106. package/examples/{continuous-event-graph → npm-libs/continuous-event-graph}/live-portfolio-dashboard.ts +1 -1
  107. package/examples/{continuous-event-graph → npm-libs/continuous-event-graph}/portfolio-tracker.ts +1 -1
  108. package/examples/{continuous-event-graph → npm-libs/continuous-event-graph}/reactive-monitoring.ts +1 -1
  109. package/examples/{continuous-event-graph → npm-libs/continuous-event-graph}/reactive-pipeline.ts +1 -1
  110. package/examples/{continuous-event-graph → npm-libs/continuous-event-graph}/soc-incident-board.ts +1 -1
  111. package/examples/{continuous-event-graph → npm-libs/continuous-event-graph}/stock-dashboard.ts +1 -1
  112. package/examples/{event-graph → npm-libs/event-graph}/ci-cd-pipeline.ts +1 -1
  113. package/examples/{event-graph → npm-libs/event-graph}/executor-diamond.ts +1 -1
  114. package/examples/{event-graph → npm-libs/event-graph}/executor-pipeline.ts +1 -1
  115. package/examples/{event-graph → npm-libs/event-graph}/research-pipeline.ts +1 -1
  116. package/examples/{graph-of-graphs → npm-libs/graph-of-graphs}/multi-stage-etl.ts +1 -1
  117. package/examples/{graph-of-graphs → npm-libs/graph-of-graphs}/url-processing-pipeline.ts +1 -1
  118. package/examples/{inference → npm-libs/inference}/azure-deployment.ts +1 -1
  119. package/examples/{inference → npm-libs/inference}/copilot-cli.ts +1 -1
  120. package/examples/{inference → npm-libs/inference}/data-pipeline.ts +1 -1
  121. package/examples/{inference → npm-libs/inference}/pluggable-adapters.ts +1 -1
  122. package/examples/{node → npm-libs/node}/ai-conversation.ts +1 -1
  123. package/examples/{node → npm-libs/node}/simple-greeting.ts +2 -2
  124. package/examples/step-machine-cli/portfolio-tracker/cards/holdings-table.json +22 -0
  125. package/examples/step-machine-cli/portfolio-tracker/cards/portfolio-form.json +43 -0
  126. package/examples/step-machine-cli/portfolio-tracker/cards/portfolio-value.json +15 -0
  127. package/examples/step-machine-cli/portfolio-tracker/cards/price-fetch.json +15 -0
  128. package/examples/step-machine-cli/portfolio-tracker/fetch-prices.js +48 -0
  129. package/examples/step-machine-cli/portfolio-tracker/handlers/_board-cli.js +58 -0
  130. package/examples/step-machine-cli/portfolio-tracker/handlers/add-cards-cli.js +27 -0
  131. package/examples/step-machine-cli/portfolio-tracker/handlers/init-board-cli.js +25 -0
  132. package/examples/step-machine-cli/portfolio-tracker/handlers/reset-board-dir-cli.js +29 -0
  133. package/examples/step-machine-cli/portfolio-tracker/handlers/retrigger-cli.js +27 -0
  134. package/examples/step-machine-cli/portfolio-tracker/handlers/status-cli.js +25 -0
  135. package/examples/step-machine-cli/portfolio-tracker/handlers/update-holdings-cli.js +37 -0
  136. package/examples/step-machine-cli/portfolio-tracker/handlers/wait-completed-cli.js +53 -0
  137. package/examples/step-machine-cli/portfolio-tracker/handlers/write-prices-cli.js +35 -0
  138. package/examples/step-machine-cli/portfolio-tracker/portfolio-tracker.flow.yaml +227 -0
  139. package/examples/step-machine-cli/portfolio-tracker/portfolio-tracker.input.json +38 -0
  140. package/examples/step-machine-cli/portfolio-tracker/run-portfolio-tracker.bat +29 -0
  141. package/package.json +12 -1
  142. package/schema/board-status.schema.json +118 -0
  143. package/schema/flow.schema.json +5 -0
  144. package/schema/live-cards.schema.json +59 -77
  145. package/step-machine-cli.js +674 -0
  146. /package/examples/{flows → npm-libs/flows}/ai-conversation.yaml +0 -0
  147. /package/examples/{flows → npm-libs/flows}/order-processing.yaml +0 -0
  148. /package/examples/{flows → npm-libs/flows}/simple-greeting.yaml +0 -0
@@ -0,0 +1,35 @@
1
+ #!/usr/bin/env node
2
+
3
+ import * as fs from 'node:fs';
4
+ import * as path from 'node:path';
5
+ import { readStdinJson, writeFailure, writeResult } from './_board-cli.js';
6
+
7
+ try {
8
+ const input = await readStdinJson();
9
+ const boardDirInput = String(input.BOARD_DIR ?? '').trim();
10
+ const tmpFileName = String(input.TMP_FILE_NAME ?? '').trim() || 'tmp_file1';
11
+ const prices = input.PRICES;
12
+
13
+ if (!boardDirInput || !prices || typeof prices !== 'object' || Array.isArray(prices)) {
14
+ writeFailure('BOARD_DIR and PRICES object are required');
15
+ process.exit(0);
16
+ }
17
+
18
+ const boardDir = path.resolve(boardDirInput);
19
+ const payload = JSON.stringify(prices);
20
+ const tmpFile = path.join(boardDir, tmpFileName);
21
+
22
+ fs.mkdirSync(path.dirname(tmpFile), { recursive: true });
23
+ fs.writeFileSync(tmpFile, payload, 'utf-8');
24
+
25
+ writeResult({
26
+ result: 'success',
27
+ data: {
28
+ wrote: true,
29
+ tmp_file: tmpFile,
30
+ },
31
+ });
32
+ } catch (error) {
33
+ const message = error instanceof Error ? error.message : String(error);
34
+ writeFailure(message);
35
+ }
@@ -0,0 +1,227 @@
1
+ id: portfolio-tracker-step-machine
2
+ handler_vars:
3
+ BOARDCLI_CMD: ../../../board-live-cards-cli.js
4
+ TMP_FILE_NAME: tmp_file1
5
+ settings:
6
+ start_step: t0_reset_board
7
+ max_total_steps: 150
8
+ timeout_ms: 300000
9
+
10
+ steps:
11
+ t0_reset_board:
12
+ description: Reset board runtime directory for idempotent reruns
13
+ expects_data: [runtime_root, board_name]
14
+ produces_data: [board_dir]
15
+ handler:
16
+ cli: node ./handlers/reset-board-dir-cli.js
17
+ input-transforms:
18
+ BOARD_DIR: runtime_root & "/" & board_name
19
+ output-transforms:
20
+ board_dir: data.board_dir
21
+ transitions:
22
+ success: t0_init_board
23
+ failure_transitions:
24
+ failure: failed_state
25
+
26
+ t0_init_board:
27
+ description: Initialize board runtime directory
28
+ expects_data: [board_dir]
29
+ produces_data: [board_dir]
30
+ handler:
31
+ cli: node %%BOARDCLI_CMD%% init "%%BOARD_DIR%%"
32
+ result-mode: exit-code
33
+ input-transforms:
34
+ BOARD_DIR: board_dir
35
+ output-transforms:
36
+ board_dir: BOARD_DIR
37
+ transitions:
38
+ success: t0_add_cards
39
+ failure_transitions:
40
+ failure: failed_state
41
+
42
+ t0_add_cards:
43
+ description: Add local portfolio cards
44
+ expects_data: [board_dir, cards_template_dir]
45
+ produces_data: [cards_dir]
46
+ handler:
47
+ cli: node %%BOARDCLI_CMD%% add-cards --rg "%%BOARD_DIR%%" --card-glob "%%CARDS_GLOB%%"
48
+ result-mode: exit-code
49
+ input-transforms:
50
+ BOARD_DIR: board_dir
51
+ CARDS_GLOB: cards_template_dir & "/*.json"
52
+ output-transforms:
53
+ cards_dir: cards_template_dir
54
+ transitions:
55
+ success: t1_write_prices
56
+ failure_transitions:
57
+ failure: failed_state
58
+
59
+ t1_write_prices:
60
+ description: Write baseline prices
61
+ expects_data: [board_dir, prices_t1]
62
+ produces_data: [prices_written_t1]
63
+ handler:
64
+ cli: node ./handlers/write-prices-cli.js
65
+ input-transforms:
66
+ BOARD_DIR: board_dir
67
+ TMP_FILE_NAME: TMP_FILE_NAME
68
+ PRICES: prices_t1
69
+ output-transforms:
70
+ prices_written_t1: data.wrote
71
+ transitions:
72
+ success: t1_wait
73
+ failure_transitions:
74
+ failure: failed_state
75
+
76
+ t1_wait:
77
+ description: Wait for cards to complete after T1
78
+ expects_data: [board_dir, completion_tasks]
79
+ produces_data: [t1_done]
80
+ handler:
81
+ cli: node ./handlers/wait-completed-cli.js
82
+ input-transforms:
83
+ BOARD_DIR: board_dir
84
+ COMPLETION_TASKS: completion_tasks
85
+ LABEL: "'T1'"
86
+ TIMEOUT_MS: "60000"
87
+ POLL_MS: "500"
88
+ output-transforms:
89
+ t1_done: data.completed
90
+ transitions:
91
+ success: t2_update_holdings
92
+ failure_transitions:
93
+ timeout: failed_state
94
+ failure: failed_state
95
+
96
+ t2_update_holdings:
97
+ description: Add GOOG position to holdings
98
+ expects_data: [board_dir, cards_dir, holdings_t2]
99
+ produces_data: [t2_holdings_saved]
100
+ handler:
101
+ cli: node ./handlers/update-holdings-cli.js
102
+ input-transforms:
103
+ BOARD_DIR: board_dir
104
+ CARDS_DIR: cards_dir
105
+ HOLDINGS: holdings_t2
106
+ output-transforms:
107
+ t2_holdings_saved: data.saved
108
+ transitions:
109
+ success: t2_write_prices
110
+ failure_transitions:
111
+ failure: failed_state
112
+
113
+ t2_write_prices:
114
+ description: Write prices after T2 holdings update
115
+ expects_data: [board_dir, prices_t2]
116
+ produces_data: [prices_written_t2]
117
+ handler:
118
+ cli: node ./handlers/write-prices-cli.js
119
+ input-transforms:
120
+ BOARD_DIR: board_dir
121
+ TMP_FILE_NAME: TMP_FILE_NAME
122
+ PRICES: prices_t2
123
+ output-transforms:
124
+ prices_written_t2: data.wrote
125
+ transitions:
126
+ success: t2_wait
127
+ failure_transitions:
128
+ failure: failed_state
129
+
130
+ t2_wait:
131
+ description: Wait for cards to complete after T2
132
+ expects_data: [board_dir, completion_tasks]
133
+ produces_data: [t2_done]
134
+ handler:
135
+ cli: node ./handlers/wait-completed-cli.js
136
+ input-transforms:
137
+ BOARD_DIR: board_dir
138
+ COMPLETION_TASKS: completion_tasks
139
+ LABEL: "'T2'"
140
+ TIMEOUT_MS: "60000"
141
+ POLL_MS: "500"
142
+ output-transforms:
143
+ t2_done: data.completed
144
+ transitions:
145
+ success: t3_retrigger
146
+ failure_transitions:
147
+ timeout: failed_state
148
+ failure: failed_state
149
+
150
+ t3_retrigger:
151
+ description: Retrigger price-fetch task
152
+ expects_data: [board_dir, price_fetch_task]
153
+ produces_data: [t3_retriggered]
154
+ handler:
155
+ cli: node %%BOARDCLI_CMD%% retrigger --rg "%%BOARD_DIR%%" --task "%%TASK%%"
156
+ result-mode: exit-code
157
+ input-transforms:
158
+ BOARD_DIR: board_dir
159
+ TASK: price_fetch_task
160
+ output-transforms:
161
+ t3_retriggered: true
162
+ transitions:
163
+ success: t3_write_prices
164
+ failure_transitions:
165
+ failure: failed_state
166
+
167
+ t3_write_prices:
168
+ description: Write final refreshed prices
169
+ expects_data: [board_dir, prices_t3]
170
+ produces_data: [prices_written_t3]
171
+ handler:
172
+ cli: node ./handlers/write-prices-cli.js
173
+ input-transforms:
174
+ BOARD_DIR: board_dir
175
+ TMP_FILE_NAME: TMP_FILE_NAME
176
+ PRICES: prices_t3
177
+ output-transforms:
178
+ prices_written_t3: data.wrote
179
+ transitions:
180
+ success: t3_wait
181
+ failure_transitions:
182
+ failure: failed_state
183
+
184
+ t3_wait:
185
+ description: Wait for cards to complete after T3
186
+ expects_data: [board_dir, completion_tasks]
187
+ produces_data: [t3_done]
188
+ handler:
189
+ cli: node ./handlers/wait-completed-cli.js
190
+ input-transforms:
191
+ BOARD_DIR: board_dir
192
+ COMPLETION_TASKS: completion_tasks
193
+ LABEL: "'T3'"
194
+ TIMEOUT_MS: "60000"
195
+ POLL_MS: "500"
196
+ output-transforms:
197
+ t3_done: data.completed
198
+ transitions:
199
+ success: t4_status
200
+ failure_transitions:
201
+ timeout: failed_state
202
+ failure: failed_state
203
+
204
+ t4_status:
205
+ description: Capture final board status
206
+ expects_data: [board_dir]
207
+ produces_data: [final_status]
208
+ handler:
209
+ cli: node %%BOARDCLI_CMD%% status --rg "%%BOARD_DIR%%"
210
+ result-mode: exit-code
211
+ input-transforms:
212
+ BOARD_DIR: board_dir
213
+ output-transforms:
214
+ final_status: stdout
215
+ transitions:
216
+ success: success_state
217
+ failure_transitions:
218
+ failure: failed_state
219
+
220
+ terminal_states:
221
+ success_state:
222
+ return_intent: success
223
+ return_artifacts: [board_dir, t1_done, t2_done, t3_done, final_status]
224
+
225
+ failed_state:
226
+ return_intent: failure
227
+ return_artifacts: [error, board_dir, final_status]
@@ -0,0 +1,38 @@
1
+ {
2
+ "runtime_root": "./runtime",
3
+ "board_name": "portfolio-tracker-board",
4
+ "cards_template_dir": "./cards",
5
+ "completion_tasks": [
6
+ "portfolio-form",
7
+ "price-fetch",
8
+ "holdings-table",
9
+ "portfolio-value"
10
+ ],
11
+ "price_fetch_task": "price-fetch",
12
+ "prices_t1": {
13
+ "AAPL": 198.5,
14
+ "MSFT": 425.3,
15
+ "GOOG": 178.9,
16
+ "AMZN": 192.4,
17
+ "TSLA": 168.75
18
+ },
19
+ "holdings_t2": [
20
+ { "symbol": "AAPL", "qty": 50 },
21
+ { "symbol": "MSFT", "qty": 30 },
22
+ { "symbol": "GOOG", "qty": 100 }
23
+ ],
24
+ "prices_t2": {
25
+ "AAPL": 198.5,
26
+ "MSFT": 425.3,
27
+ "GOOG": 178.9,
28
+ "AMZN": 192.4,
29
+ "TSLA": 168.75
30
+ },
31
+ "prices_t3": {
32
+ "AAPL": 205,
33
+ "MSFT": 425.3,
34
+ "GOOG": 178.9,
35
+ "AMZN": 192.4,
36
+ "TSLA": 168.75
37
+ }
38
+ }
@@ -0,0 +1,29 @@
1
+ @echo off
2
+ setlocal
3
+ cd /d "%~dp0"
4
+
5
+ set "BOARD_LIVE_CARDS_NO_SPAWN=1"
6
+ set "EXAMPLE_TEMP_ROOT=%TEMP%\yaml-flow-step-machine-portfolio-tracker"
7
+ set "STORE_DIR=%EXAMPLE_TEMP_ROOT%\store"
8
+ set "RUNTIME_ROOT=%EXAMPLE_TEMP_ROOT%\runtime"
9
+
10
+ if /I "%~1"=="pause" goto :pause
11
+ if /I "%~1"=="resume" goto :resume
12
+ if /I "%~1"=="status" goto :status
13
+ goto :run
14
+
15
+ :pause
16
+ node ..\..\..\step-machine-cli.js --store file --store-dir "%STORE_DIR%" --pause
17
+ exit /b %ERRORLEVEL%
18
+
19
+ :resume
20
+ node ..\..\..\step-machine-cli.js portfolio-tracker.flow.yaml --store file --store-dir "%STORE_DIR%" --resume
21
+ exit /b %ERRORLEVEL%
22
+
23
+ :status
24
+ node ..\..\..\step-machine-cli.js --store file --store-dir "%STORE_DIR%" --status
25
+ exit /b %ERRORLEVEL%
26
+
27
+ :run
28
+ node -e "const fs=require('fs');const cp=require('child_process');const raw=JSON.parse(fs.readFileSync('portfolio-tracker.input.json','utf8'));raw.runtime_root=(process.env.RUNTIME_ROOT||'').replace(/\\\\/g,'/');const input=JSON.stringify(raw);const r=cp.spawnSync(process.execPath,['..\\..\\..\\step-machine-cli.js','portfolio-tracker.flow.yaml','--store','file','--store-dir',process.env.STORE_DIR,'--initial-data',input],{stdio:'inherit',windowsHide:true,env:{...process.env,BOARD_LIVE_CARDS_NO_SPAWN:'1'}});process.exit(r.status??1);"
29
+ exit /b %ERRORLEVEL%
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "yaml-flow",
3
- "version": "3.1.1",
3
+ "version": "4.0.0",
4
4
  "description": "Unified workflow engine: step-machine (sequential) + event-graph (stateless DAG) with pluggable storage",
5
5
  "author": "",
6
6
  "license": "MIT",
@@ -8,6 +8,10 @@
8
8
  "main": "./dist/index.cjs",
9
9
  "module": "./dist/index.js",
10
10
  "types": "./dist/index.d.ts",
11
+ "bin": {
12
+ "board-live-cards-cli": "./board-live-cards-cli.js",
13
+ "step-machine-cli": "./step-machine-cli.js"
14
+ },
11
15
  "exports": {
12
16
  ".": {
13
17
  "types": "./dist/index.d.ts",
@@ -74,6 +78,8 @@
74
78
  "./stores/file": false
75
79
  },
76
80
  "files": [
81
+ "board-live-cards-cli.js",
82
+ "step-machine-cli.js",
77
83
  "dist",
78
84
  "schema",
79
85
  "browser",
@@ -90,12 +96,17 @@
90
96
  },
91
97
  "devDependencies": {
92
98
  "@types/node": "^20.10.0",
99
+ "@types/proper-lockfile": "^4.1.4",
93
100
  "tsup": "^8.0.0",
101
+ "tsx": "^4.21.0",
94
102
  "typescript": "^5.3.0",
95
103
  "vitest": "^1.0.0"
96
104
  },
97
105
  "dependencies": {
98
106
  "ajv-formats": "^3.0.1",
107
+ "fast-glob": "^3.3.3",
108
+ "jsonata": "^2.1.0",
109
+ "proper-lockfile": "^4.1.2",
99
110
  "yaml": "^2.3.4"
100
111
  },
101
112
  "optionalDependencies": {
@@ -0,0 +1,118 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://yaml-flow.dev/schema/board-status.schema.json",
4
+ "title": "Board Status Object",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": ["schema_version", "meta", "summary", "cards"],
8
+ "properties": {
9
+ "schema_version": {
10
+ "type": "string",
11
+ "const": "v1"
12
+ },
13
+ "meta": {
14
+ "type": "object",
15
+ "additionalProperties": false,
16
+ "required": ["board"],
17
+ "properties": {
18
+ "board": {
19
+ "type": "object",
20
+ "additionalProperties": false,
21
+ "required": ["path"],
22
+ "properties": {
23
+ "path": { "type": "string" }
24
+ }
25
+ }
26
+ }
27
+ },
28
+ "summary": {
29
+ "type": "object",
30
+ "additionalProperties": false,
31
+ "required": ["card_count", "completed", "eligible", "pending", "blocked", "unresolved"],
32
+ "properties": {
33
+ "card_count": { "type": "integer", "minimum": 0 },
34
+ "completed": { "type": "integer", "minimum": 0 },
35
+ "eligible": { "type": "integer", "minimum": 0 },
36
+ "pending": { "type": "integer", "minimum": 0 },
37
+ "blocked": { "type": "integer", "minimum": 0 },
38
+ "unresolved": { "type": "integer", "minimum": 0 },
39
+ "failed": { "type": "integer", "minimum": 0 },
40
+ "in_progress": { "type": "integer", "minimum": 0 },
41
+ "orphan_cards": { "type": "integer", "minimum": 0 },
42
+ "topology": {
43
+ "type": "object",
44
+ "additionalProperties": false,
45
+ "required": ["edge_count", "max_fan_out_card", "max_fan_out"],
46
+ "properties": {
47
+ "edge_count": { "type": "integer", "minimum": 0 },
48
+ "max_fan_out_card": { "type": ["string", "null"] },
49
+ "max_fan_out": { "type": "integer", "minimum": 0 }
50
+ }
51
+ }
52
+ }
53
+ },
54
+ "cards": {
55
+ "type": "array",
56
+ "items": {
57
+ "type": "object",
58
+ "additionalProperties": false,
59
+ "required": [
60
+ "name",
61
+ "status",
62
+ "requires",
63
+ "requires_satisfied",
64
+ "requires_missing",
65
+ "provides_declared",
66
+ "provides_runtime",
67
+ "blocked_by",
68
+ "unblocks",
69
+ "runtime"
70
+ ],
71
+ "properties": {
72
+ "name": { "type": "string" },
73
+ "status": { "type": "string" },
74
+ "error": {
75
+ "type": "object",
76
+ "additionalProperties": false,
77
+ "required": ["message"],
78
+ "properties": {
79
+ "message": { "type": "string" },
80
+ "code": { "type": "string" },
81
+ "at": { "type": ["string", "null"] },
82
+ "source": { "type": "string" }
83
+ }
84
+ },
85
+ "requires": { "type": "array", "items": { "type": "string" } },
86
+ "requires_satisfied": { "type": "array", "items": { "type": "string" } },
87
+ "requires_missing": { "type": "array", "items": { "type": "string" } },
88
+ "provides_declared": { "type": "array", "items": { "type": "string" } },
89
+ "provides_runtime": { "type": "array", "items": { "type": "string" } },
90
+ "blocked_by": { "type": "array", "items": { "type": "string" } },
91
+ "unblocks": { "type": "array", "items": { "type": "string" } },
92
+ "runtime": {
93
+ "type": "object",
94
+ "additionalProperties": false,
95
+ "required": [
96
+ "attempt_count",
97
+ "restart_count",
98
+ "in_progress_since",
99
+ "last_transition_at",
100
+ "last_completed_at",
101
+ "last_restarted_at",
102
+ "status_age_ms"
103
+ ],
104
+ "properties": {
105
+ "attempt_count": { "type": "integer", "minimum": 0 },
106
+ "restart_count": { "type": "integer", "minimum": 0 },
107
+ "in_progress_since": { "type": ["string", "null"] },
108
+ "last_transition_at": { "type": ["string", "null"] },
109
+ "last_completed_at": { "type": ["string", "null"] },
110
+ "last_restarted_at": { "type": ["string", "null"] },
111
+ "status_age_ms": { "type": ["integer", "null"], "minimum": 0 }
112
+ }
113
+ }
114
+ }
115
+ }
116
+ }
117
+ }
118
+ }
@@ -77,6 +77,11 @@
77
77
  "additionalProperties": { "type": "string" },
78
78
  "minProperties": 1
79
79
  },
80
+ "failure_transitions": {
81
+ "type": "object",
82
+ "description": "Mapping of failure-like results (e.g. failure, timeout) -> next step name",
83
+ "additionalProperties": { "type": "string" }
84
+ },
80
85
  "retry": {
81
86
  "$ref": "#/definitions/retry_config"
82
87
  },