@flow-as-code/cli 0.1.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 (120) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +446 -0
  3. package/dist/aws.d.ts +28 -0
  4. package/dist/aws.d.ts.map +1 -0
  5. package/dist/aws.js +104 -0
  6. package/dist/aws.js.map +1 -0
  7. package/dist/bin.d.ts +3 -0
  8. package/dist/bin.d.ts.map +1 -0
  9. package/dist/bin.js +132 -0
  10. package/dist/bin.js.map +1 -0
  11. package/dist/bridge/exportFiles.d.ts +16 -0
  12. package/dist/bridge/exportFiles.d.ts.map +1 -0
  13. package/dist/bridge/exportFiles.js +95 -0
  14. package/dist/bridge/exportFiles.js.map +1 -0
  15. package/dist/bridge/pair.d.ts +103 -0
  16. package/dist/bridge/pair.d.ts.map +1 -0
  17. package/dist/bridge/pair.js +219 -0
  18. package/dist/bridge/pair.js.map +1 -0
  19. package/dist/bridge/protocol.d.ts +187 -0
  20. package/dist/bridge/protocol.d.ts.map +1 -0
  21. package/dist/bridge/protocol.js +132 -0
  22. package/dist/bridge/protocol.js.map +1 -0
  23. package/dist/bridge/server.d.ts +95 -0
  24. package/dist/bridge/server.d.ts.map +1 -0
  25. package/dist/bridge/server.js +669 -0
  26. package/dist/bridge/server.js.map +1 -0
  27. package/dist/cdk-scaffold.d.ts +16 -0
  28. package/dist/cdk-scaffold.d.ts.map +1 -0
  29. package/dist/cdk-scaffold.js +28 -0
  30. package/dist/cdk-scaffold.js.map +1 -0
  31. package/dist/codegen.d.ts +5 -0
  32. package/dist/codegen.d.ts.map +1 -0
  33. package/dist/codegen.js +27 -0
  34. package/dist/codegen.js.map +1 -0
  35. package/dist/diff.d.ts +33 -0
  36. package/dist/diff.d.ts.map +1 -0
  37. package/dist/diff.js +225 -0
  38. package/dist/diff.js.map +1 -0
  39. package/dist/docs.d.ts +46 -0
  40. package/dist/docs.d.ts.map +1 -0
  41. package/dist/docs.js +223 -0
  42. package/dist/docs.js.map +1 -0
  43. package/dist/emit.d.ts +8 -0
  44. package/dist/emit.d.ts.map +1 -0
  45. package/dist/emit.js +55 -0
  46. package/dist/emit.js.map +1 -0
  47. package/dist/errors.d.ts +12 -0
  48. package/dist/errors.d.ts.map +1 -0
  49. package/dist/errors.js +25 -0
  50. package/dist/errors.js.map +1 -0
  51. package/dist/export.d.ts +27 -0
  52. package/dist/export.d.ts.map +1 -0
  53. package/dist/export.js +126 -0
  54. package/dist/export.js.map +1 -0
  55. package/dist/index.d.ts +4 -0
  56. package/dist/index.d.ts.map +1 -0
  57. package/dist/index.js +23 -0
  58. package/dist/index.js.map +1 -0
  59. package/dist/lint.d.ts +6 -0
  60. package/dist/lint.d.ts.map +1 -0
  61. package/dist/lint.js +31 -0
  62. package/dist/lint.js.map +1 -0
  63. package/dist/render.d.ts +6 -0
  64. package/dist/render.d.ts.map +1 -0
  65. package/dist/render.js +49 -0
  66. package/dist/render.js.map +1 -0
  67. package/dist/run.d.ts +13 -0
  68. package/dist/run.d.ts.map +1 -0
  69. package/dist/run.js +38 -0
  70. package/dist/run.js.map +1 -0
  71. package/dist/simulate.d.ts +35 -0
  72. package/dist/simulate.d.ts.map +1 -0
  73. package/dist/simulate.js +194 -0
  74. package/dist/simulate.js.map +1 -0
  75. package/dist/studio.d.ts +23 -0
  76. package/dist/studio.d.ts.map +1 -0
  77. package/dist/studio.js +120 -0
  78. package/dist/studio.js.map +1 -0
  79. package/dist/synth-resolve-hook.d.ts +19 -0
  80. package/dist/synth-resolve-hook.d.ts.map +1 -0
  81. package/dist/synth-resolve-hook.js +127 -0
  82. package/dist/synth-resolve-hook.js.map +1 -0
  83. package/dist/synth-runner.d.ts +12 -0
  84. package/dist/synth-runner.d.ts.map +1 -0
  85. package/dist/synth-runner.js +145 -0
  86. package/dist/synth-runner.js.map +1 -0
  87. package/dist/synth.d.ts +55 -0
  88. package/dist/synth.d.ts.map +1 -0
  89. package/dist/synth.js +327 -0
  90. package/dist/synth.js.map +1 -0
  91. package/dist/watch.d.ts +66 -0
  92. package/dist/watch.d.ts.map +1 -0
  93. package/dist/watch.js +293 -0
  94. package/dist/watch.js.map +1 -0
  95. package/package.json +85 -0
  96. package/schema/flowdoc-0.1.schema.json +669 -0
  97. package/schema/scenario-0.1.schema.json +318 -0
  98. package/src/aws.ts +149 -0
  99. package/src/bin.ts +179 -0
  100. package/src/bridge/exportFiles.ts +116 -0
  101. package/src/bridge/pair.ts +312 -0
  102. package/src/bridge/protocol.ts +289 -0
  103. package/src/bridge/server.ts +827 -0
  104. package/src/cdk-scaffold.ts +41 -0
  105. package/src/codegen.ts +36 -0
  106. package/src/diff.ts +279 -0
  107. package/src/docs.ts +249 -0
  108. package/src/emit.ts +69 -0
  109. package/src/errors.ts +27 -0
  110. package/src/export.ts +167 -0
  111. package/src/index.ts +27 -0
  112. package/src/lint.ts +42 -0
  113. package/src/render.ts +58 -0
  114. package/src/run.ts +42 -0
  115. package/src/simulate.ts +244 -0
  116. package/src/studio.ts +143 -0
  117. package/src/synth-resolve-hook.ts +152 -0
  118. package/src/synth-runner.ts +157 -0
  119. package/src/synth.ts +380 -0
  120. package/src/watch.ts +388 -0
package/dist/watch.js ADDED
@@ -0,0 +1,293 @@
1
+ /*
2
+ * Copyright 2026 The flow-as-code Authors
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ */
5
+ // Watch engine: keeps <name>.flow.ts and <name>.flowdoc.json pairs in sync
6
+ // inside one directory. A library, not a command: the studio server (A11)
7
+ // consumes these events, and `flow-cli studio` will sit on top.
8
+ //
9
+ // Sync direction here is ts -> doc only. On a ts change the file is re-synthed
10
+ // in the same sandboxed child process `flow-cli synth` uses, and the FlowDoc
11
+ // is rewritten UNLESS the doc on disk was edited by someone else since this
12
+ // watcher last wrote or observed it AND that edit does not carry the
13
+ // sourceHash of the previous ts content. That state is dirty-both: the
14
+ // watcher emits "conflict" and writes nothing. Never silently overwrite
15
+ // (docs/01-flowdoc-spec.md, invariants 3 and the sourceHash dirty guard).
16
+ //
17
+ // One event is emitted for a change that alters nothing: a builder file edited
18
+ // back to the exact bytes of the last successful sync, after a failed one.
19
+ // Consumers latch "error" (the studio keeps a badge up until the document syncs
20
+ // again), so a state that ends by being undone has to end with a "synced" or
21
+ // the badge outlives the condition it reports.
22
+ import { createHash } from "node:crypto";
23
+ import { readFile } from "node:fs/promises";
24
+ import { writeFile } from "node:fs/promises";
25
+ import { basename, join, resolve } from "node:path";
26
+ import { watch as chokidarWatch } from "chokidar";
27
+ import { serializeWithMeta, synthFile } from "./synth.js";
28
+ const TS_SUFFIX = ".flow.ts";
29
+ const DOC_SUFFIX = ".flowdoc.json";
30
+ function hashHex(bytes) {
31
+ return createHash("sha256").update(bytes).digest("hex");
32
+ }
33
+ class Watcher {
34
+ listeners = new Map();
35
+ ledger = new Map();
36
+ /** Per-pair task chain so two changes to one pair never synth concurrently. */
37
+ chains = new Map();
38
+ fsWatcher;
39
+ dir;
40
+ closed = false;
41
+ constructor(dir) {
42
+ this.dir = resolve(dir);
43
+ // chokidar v5 takes no globs: watch the directory, filter paths here.
44
+ // awaitWriteFinish debounces editors' partial/atomic writes; the
45
+ // thresholds are far below the 1 second sync budget.
46
+ this.fsWatcher = chokidarWatch(this.dir, {
47
+ ignoreInitial: false,
48
+ depth: 0,
49
+ awaitWriteFinish: { stabilityThreshold: 50, pollInterval: 10 },
50
+ });
51
+ this.fsWatcher.on("add", (path) => this.route(path));
52
+ this.fsWatcher.on("change", (path) => this.route(path));
53
+ this.fsWatcher.on("error", (err) => {
54
+ this.emit("error", {
55
+ path: this.dir,
56
+ message: err instanceof Error ? err.message : String(err),
57
+ });
58
+ });
59
+ this.fsWatcher.on("ready", () => {
60
+ // Let the initial adds settle before declaring readiness.
61
+ void this.settled().then(() => {
62
+ if (!this.closed)
63
+ this.emit("ready", {});
64
+ });
65
+ });
66
+ }
67
+ on(event, listener) {
68
+ let set = this.listeners.get(event);
69
+ if (set === undefined) {
70
+ set = new Set();
71
+ this.listeners.set(event, set);
72
+ }
73
+ set.add(listener);
74
+ return this;
75
+ }
76
+ off(event, listener) {
77
+ this.listeners.get(event)?.delete(listener);
78
+ return this;
79
+ }
80
+ once(event, listener) {
81
+ const wrapped = (payload) => {
82
+ this.off(event, wrapped);
83
+ listener(payload);
84
+ };
85
+ return this.on(event, wrapped);
86
+ }
87
+ noteWrite(name, contents) {
88
+ const entry = this.entry(name);
89
+ if (contents.tsContent !== undefined)
90
+ entry.lastTsHash = hashHex(contents.tsContent);
91
+ if (contents.docContent !== undefined)
92
+ entry.lastDocHash = hashHex(contents.docContent);
93
+ }
94
+ async close() {
95
+ this.closed = true;
96
+ await this.fsWatcher.close();
97
+ await this.settled();
98
+ }
99
+ emit(event, payload) {
100
+ for (const listener of [...(this.listeners.get(event) ?? [])]) {
101
+ listener(payload);
102
+ }
103
+ }
104
+ settled() {
105
+ return Promise.all([...this.chains.values()]).then(() => undefined);
106
+ }
107
+ route(path) {
108
+ const file = basename(path);
109
+ let name;
110
+ if (file.endsWith(TS_SUFFIX))
111
+ name = file.slice(0, -TS_SUFFIX.length);
112
+ else if (file.endsWith(DOC_SUFFIX))
113
+ name = file.slice(0, -DOC_SUFFIX.length);
114
+ if (name === undefined || name === "")
115
+ return;
116
+ this.enqueue(name, file.endsWith(TS_SUFFIX));
117
+ }
118
+ enqueue(name, tsChanged) {
119
+ const prev = this.chains.get(name) ?? Promise.resolve();
120
+ const next = prev.then(() => tsChanged ? this.handleTsChange(name) : this.handleDocChange(name));
121
+ // Keep the chain alive even if a handler slips an exception through.
122
+ this.chains.set(name, next.catch((e) => {
123
+ this.emit("error", {
124
+ path: join(this.dir, name + TS_SUFFIX),
125
+ message: e instanceof Error ? e.message : String(e),
126
+ });
127
+ }));
128
+ }
129
+ entry(name) {
130
+ let e = this.ledger.get(name);
131
+ if (e === undefined) {
132
+ e = {};
133
+ this.ledger.set(name, e);
134
+ }
135
+ return e;
136
+ }
137
+ /**
138
+ * A doc file appeared or changed. Our own writes echo back here and are
139
+ * recognized by hash; anything else is an external edit. The ledger keeps
140
+ * the last CLEAN state, so an external edit deliberately does not update
141
+ * it: the divergence is detected on the next ts change.
142
+ */
143
+ async handleDocChange(name) {
144
+ const entry = this.entry(name);
145
+ const docPath = join(this.dir, name + DOC_SUFFIX);
146
+ let bytes;
147
+ try {
148
+ bytes = await readFile(docPath);
149
+ }
150
+ catch {
151
+ return; // deleted between event and read; the next ts change re-creates it
152
+ }
153
+ const docHash = hashHex(bytes);
154
+ if (entry.lastDocHash === undefined) {
155
+ // First observation of this doc (startup scan or a doc that appeared
156
+ // before its ts): record it as the observed baseline.
157
+ entry.lastDocHash = docHash;
158
+ }
159
+ // Otherwise: external edit (or our own echo, which matches lastDocHash
160
+ // and needs nothing). Leave the ledger pointing at the clean state.
161
+ }
162
+ async handleTsChange(name) {
163
+ if (this.closed)
164
+ return;
165
+ const entry = this.entry(name);
166
+ const tsPath = join(this.dir, name + TS_SUFFIX);
167
+ const docPath = join(this.dir, name + DOC_SUFFIX);
168
+ let tsBytes;
169
+ try {
170
+ tsBytes = await readFile(tsPath);
171
+ }
172
+ catch {
173
+ return; // deleted between event and read
174
+ }
175
+ const tsHash = hashHex(tsBytes);
176
+ if (tsHash === entry.lastTsHash) {
177
+ // Normally an echo of our own write, or a touch: nothing to say. But it
178
+ // is also how a broken edit gets undone. Ctrl+Z back to the bytes we last
179
+ // synced from produces no synth and no event, so a consumer that latched
180
+ // the preceding `error` (the studio's "Code out of sync" badge) kept
181
+ // showing it until some unrelated edit happened. The doc on disk is still
182
+ // the one these bytes produced, so the pair IS in sync: say so.
183
+ if (entry.errored === true) {
184
+ entry.errored = false;
185
+ this.emit("synced", { tsPath, docPath, name });
186
+ }
187
+ return;
188
+ }
189
+ // Read the doc side to run the dirty guard.
190
+ let docBytes;
191
+ try {
192
+ docBytes = await readFile(docPath);
193
+ }
194
+ catch {
195
+ docBytes = undefined;
196
+ }
197
+ if (docBytes !== undefined) {
198
+ const docHash = hashHex(docBytes);
199
+ const docSourceHash = readSourceHash(docBytes);
200
+ if (entry.lastTsHash === undefined) {
201
+ // First look at this ts while a doc already exists (startup scan, or
202
+ // a pair dirty since startup). If the doc carries this ts content's
203
+ // hash the pair is in sync: baseline it without a synth. Anything
204
+ // else is dirty in an unknowable direction, so surface it instead of
205
+ // overwriting. Deliberately independent of lastDocHash: chokidar's
206
+ // initial add order (ts before doc or doc before ts) must not change
207
+ // the outcome.
208
+ if (docSourceHash === `sha256:${tsHash}`) {
209
+ entry.lastDocHash = docHash;
210
+ entry.lastTsHash = tsHash;
211
+ return;
212
+ }
213
+ this.emit("conflict", {
214
+ tsPath,
215
+ docPath,
216
+ name,
217
+ reason: "doc exists but its meta.sourceHash does not match the ts content, and this " +
218
+ "watcher has not seen the pair in sync; run `flow-cli synth` explicitly or " +
219
+ "remove the stale side",
220
+ });
221
+ return;
222
+ }
223
+ const docChangedExternally = entry.lastDocHash !== undefined && docHash !== entry.lastDocHash;
224
+ if (docChangedExternally && docSourceHash !== `sha256:${entry.lastTsHash}`) {
225
+ // Dirty-both: the doc was edited externally (studio or hand edit)
226
+ // AND the ts changed. Never silently overwrite either side.
227
+ this.emit("conflict", {
228
+ tsPath,
229
+ docPath,
230
+ name,
231
+ reason: "both sides changed: the flowdoc was edited since the last sync " +
232
+ "and the ts file changed too; resolve manually and re-save one side",
233
+ });
234
+ return;
235
+ }
236
+ }
237
+ // Clean (or doc missing): re-synth in the sandboxed child and write.
238
+ try {
239
+ const { flows, sourceHash } = await synthFile(tsPath);
240
+ const doc = pickDoc(flows, name);
241
+ if (doc === undefined) {
242
+ entry.errored = true;
243
+ this.emit("error", {
244
+ path: tsPath,
245
+ message: `${basename(tsPath)} exports ${flows.length} flows and none is named "${name}"; ` +
246
+ `the watcher pairs ${name}${TS_SUFFIX} with ${name}${DOC_SUFFIX} by name`,
247
+ });
248
+ return;
249
+ }
250
+ const outBytes = serializeWithMeta(doc, sourceHash);
251
+ await writeFile(docPath, outBytes, "utf8");
252
+ entry.lastDocHash = hashHex(outBytes);
253
+ entry.lastTsHash = tsHash;
254
+ entry.errored = false;
255
+ this.emit("synced", { tsPath, docPath, name });
256
+ }
257
+ catch (e) {
258
+ entry.errored = true;
259
+ this.emit("error", { path: tsPath, message: e instanceof Error ? e.message : String(e) });
260
+ }
261
+ }
262
+ }
263
+ /**
264
+ * The flow whose name matches the file base name, else a lone export. Exported
265
+ * so the studio bridge pairs a builder file with its FlowDoc by exactly the
266
+ * rule the watcher uses, rather than a second one that could disagree.
267
+ */
268
+ export function pickDoc(flows, name) {
269
+ const named = flows.find((f) => f.name === name);
270
+ if (named !== undefined)
271
+ return named.doc;
272
+ const only = flows.length === 1 ? flows[0] : undefined;
273
+ return only?.doc;
274
+ }
275
+ function readSourceHash(docBytes) {
276
+ try {
277
+ const doc = JSON.parse(docBytes.toString("utf8"));
278
+ const hash = doc.meta?.sourceHash;
279
+ return typeof hash === "string" ? hash : undefined;
280
+ }
281
+ catch {
282
+ return undefined; // unparseable doc counts as an external edit with no provenance
283
+ }
284
+ }
285
+ /**
286
+ * Watches `dir` (non-recursive) and keeps every <name>.flow.ts /
287
+ * <name>.flowdoc.json pair in sync, ts -> doc, with the sourceHash dirty
288
+ * guard described at the top of this file.
289
+ */
290
+ export function createWatcher(dir) {
291
+ return new Watcher(dir);
292
+ }
293
+ //# sourceMappingURL=watch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch.js","sourceRoot":"","sources":["../src/watch.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,85 @@
1
+ {
2
+ "name": "@flow-as-code/cli",
3
+ "version": "0.1.0",
4
+ "description": "CLI over @flow-as-code/core: lint, codegen, synth, render, emit, the local studio server, and export, simulate, and diff against a live Amazon Connect instance.",
5
+ "license": "Apache-2.0",
6
+ "type": "module",
7
+ "main": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js"
13
+ },
14
+ "./synth": {
15
+ "types": "./dist/synth.d.ts",
16
+ "import": "./dist/synth.js"
17
+ },
18
+ "./watch": {
19
+ "types": "./dist/watch.d.ts",
20
+ "import": "./dist/watch.js"
21
+ },
22
+ "./bridge": {
23
+ "types": "./dist/bridge/server.d.ts",
24
+ "import": "./dist/bridge/server.js"
25
+ }
26
+ },
27
+ "bin": {
28
+ "flow-cli": "dist/bin.js"
29
+ },
30
+ "files": [
31
+ "dist",
32
+ "src",
33
+ "README.md",
34
+ "LICENSE",
35
+ "schema",
36
+ "!**/*.test.ts",
37
+ "!**/*.test.tsx",
38
+ "!**/__fixtures__",
39
+ "!**/__generated__",
40
+ "!**/*.tsbuildinfo",
41
+ "!**/__snapshots__",
42
+ "!**/*.snap",
43
+ "!**/test-helpers.ts",
44
+ "!**/test-helpers.tsx"
45
+ ],
46
+ "publishConfig": {
47
+ "access": "public"
48
+ },
49
+ "engines": {
50
+ "node": ">=22.12"
51
+ },
52
+ "scripts": {
53
+ "build": "tsc -p tsconfig.json",
54
+ "prepack": "node ../../scripts/chmod-bins.mjs",
55
+ "test": "vitest run"
56
+ },
57
+ "dependencies": {
58
+ "@flow-as-code/cdk": "0.1.0",
59
+ "@flow-as-code/core": "0.1.0",
60
+ "@flow-as-code/studio": "0.1.0",
61
+ "@flow-as-code/tf": "0.1.0",
62
+ "ajv": "^8.20.0",
63
+ "chokidar": "^5.0.0",
64
+ "commander": "^14.0.3",
65
+ "tsx": "^4.23.13",
66
+ "yaml": "^2.9.0"
67
+ },
68
+ "peerDependencies": {
69
+ "@aws-sdk/client-connect": "^3.600.0"
70
+ },
71
+ "peerDependenciesMeta": {
72
+ "@aws-sdk/client-connect": {
73
+ "optional": true
74
+ }
75
+ },
76
+ "repository": {
77
+ "type": "git",
78
+ "url": "git+https://github.com/flow-as-code/flow-as-code.git",
79
+ "directory": "packages/cli"
80
+ },
81
+ "homepage": "https://github.com/flow-as-code/flow-as-code/tree/main/packages/cli#readme",
82
+ "bugs": {
83
+ "url": "https://github.com/flow-as-code/flow-as-code/issues"
84
+ }
85
+ }