@tuongaz/seeflow 0.1.76 → 0.1.80

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 (107) hide show
  1. package/README.md +40 -0
  2. package/dist/web/assets/{architectureDiagram-3BPJPVTR-CVOsL8en.js → architectureDiagram-3BPJPVTR-id0XTZQC.js} +1 -1
  3. package/dist/web/assets/{blockDiagram-GPEHLZMM-C4ln3pHP.js → blockDiagram-GPEHLZMM-Cjvfg0ZP.js} +1 -1
  4. package/dist/web/assets/{c4Diagram-AAUBKEIU-COBq_O0m.js → c4Diagram-AAUBKEIU-Dyq-0e8Q.js} +1 -1
  5. package/dist/web/assets/channel-Ajb6KiL3.js +1 -0
  6. package/dist/web/assets/{chart-DD5RfLtm.js → chart-DuTGW-Dj.js} +1 -1
  7. package/dist/web/assets/{chunk-2J33WTMH-Bdm-YMMv.js → chunk-2J33WTMH-DsD65OzD.js} +1 -1
  8. package/dist/web/assets/{chunk-4BX2VUAB-BV9NRSCp.js → chunk-4BX2VUAB-BpytKE8P.js} +1 -1
  9. package/dist/web/assets/{chunk-55IACEB6-D-Xe7eUY.js → chunk-55IACEB6-DIILAUq9.js} +1 -1
  10. package/dist/web/assets/{chunk-727SXJPM-DB6EZ4tw.js → chunk-727SXJPM-C4ih-gTo.js} +1 -1
  11. package/dist/web/assets/{chunk-AQP2D5EJ-DDlp8cdl.js → chunk-AQP2D5EJ-BsYoWdVM.js} +1 -1
  12. package/dist/web/assets/{chunk-FMBD7UC4-qmkSV1r1.js → chunk-FMBD7UC4-Db6L0z4p.js} +1 -1
  13. package/dist/web/assets/{chunk-ND2GUHAM-BFkM9OZ5.js → chunk-ND2GUHAM-BNLqZYMx.js} +1 -1
  14. package/dist/web/assets/{chunk-QZHKN3VN-Cye5hUth.js → chunk-QZHKN3VN-DL5PK45j.js} +1 -1
  15. package/dist/web/assets/classDiagram-4FO5ZUOK-Cgw6ezRo.js +1 -0
  16. package/dist/web/assets/classDiagram-v2-Q7XG4LA2-Cgw6ezRo.js +1 -0
  17. package/dist/web/assets/{code-block-B2Jj4pwe.js → code-block-C1SJv-Al.js} +1 -1
  18. package/dist/web/assets/{cose-bilkent-S5V4N54A-B8Q15-m-.js → cose-bilkent-S5V4N54A-ChX5nR0f.js} +1 -1
  19. package/dist/web/assets/{dagre-BM42HDAG-BEYccL0v.js → dagre-BM42HDAG-BXeL3fEN.js} +1 -1
  20. package/dist/web/assets/{diagram-2AECGRRQ-BHPvhIzV.js → diagram-2AECGRRQ-B6WtmEP-.js} +1 -1
  21. package/dist/web/assets/{diagram-5GNKFQAL-Csqbxt3l.js → diagram-5GNKFQAL-SXs7ALwM.js} +1 -1
  22. package/dist/web/assets/{diagram-KO2AKTUF-BR6CIJyT.js → diagram-KO2AKTUF-D5zylPYo.js} +1 -1
  23. package/dist/web/assets/{diagram-LMA3HP47-CNtClLgB.js → diagram-LMA3HP47-CByIUlQF.js} +1 -1
  24. package/dist/web/assets/{diagram-OG6HWLK6-6C-uLOFp.js → diagram-OG6HWLK6-BH1MfUqV.js} +1 -1
  25. package/dist/web/assets/{erDiagram-TEJ5UH35-WbZOwkSY.js → erDiagram-TEJ5UH35-BOOnRFBh.js} +1 -1
  26. package/dist/web/assets/{flowDiagram-I6XJVG4X-DkXzWb1H.js → flowDiagram-I6XJVG4X-BynWDHJP.js} +1 -1
  27. package/dist/web/assets/{ganttDiagram-6RSMTGT7-CUvI4hDd.js → ganttDiagram-6RSMTGT7-Cgq_djyN.js} +1 -1
  28. package/dist/web/assets/{gitGraphDiagram-PVQCEYII-DQ5Z5DTr.js → gitGraphDiagram-PVQCEYII-ciGSgmfT.js} +1 -1
  29. package/dist/web/assets/index-DiakpHyc.js +8619 -0
  30. package/dist/web/assets/{index-DljfurDC.css → index-fl8DS9WO.css} +1 -1
  31. package/dist/web/assets/{index.es-DU_7oRoK.js → index.es-C7TtaIfa.js} +1 -1
  32. package/dist/web/assets/{infoDiagram-5YYISTIA-CVl3bX4h.js → infoDiagram-5YYISTIA-DqMb3_c-.js} +1 -1
  33. package/dist/web/assets/{ishikawaDiagram-YF4QCWOH-CQs9MZtd.js → ishikawaDiagram-YF4QCWOH-CAO6KqQU.js} +1 -1
  34. package/dist/web/assets/{journeyDiagram-JHISSGLW-B9emRTSL.js → journeyDiagram-JHISSGLW-Di8MsLTo.js} +1 -1
  35. package/dist/web/assets/{jspdf.es.min-DO9eBtyx.js → jspdf.es.min-Cq4dY-lT.js} +3 -3
  36. package/dist/web/assets/{kanban-definition-UN3LZRKU-CU4PXBkO.js → kanban-definition-UN3LZRKU-ClOmVNcX.js} +1 -1
  37. package/dist/web/assets/{linear-Djd98ym6.js → linear-B3OKBKaT.js} +1 -1
  38. package/dist/web/assets/{markdown-Dtbihta2.js → markdown-Dg8NEx1K.js} +1 -1
  39. package/dist/web/assets/{mermaid.core--5B4uu7H.js → mermaid.core-Bw-m7bH-.js} +4 -4
  40. package/dist/web/assets/{mindmap-definition-RKZ34NQL-DBa-qOvW.js → mindmap-definition-RKZ34NQL-CUBA1zfc.js} +1 -1
  41. package/dist/web/assets/{pieDiagram-4H26LBE5-BgO03eBD.js → pieDiagram-4H26LBE5-Dux5HvSU.js} +1 -1
  42. package/dist/web/assets/{quadrantDiagram-W4KKPZXB-D5qnQqxO.js → quadrantDiagram-W4KKPZXB-DU3gQGo3.js} +1 -1
  43. package/dist/web/assets/{requirementDiagram-4Y6WPE33-CvFTU_QP.js → requirementDiagram-4Y6WPE33-CD3A_U9j.js} +1 -1
  44. package/dist/web/assets/{sankeyDiagram-5OEKKPKP-BSwt6J0r.js → sankeyDiagram-5OEKKPKP-Cd4mc26P.js} +1 -1
  45. package/dist/web/assets/{sequenceDiagram-3UESZ5HK-B6xwt7gx.js → sequenceDiagram-3UESZ5HK-Da0iOMgq.js} +1 -1
  46. package/dist/web/assets/{stateDiagram-AJRCARHV-B4aBLe9A.js → stateDiagram-AJRCARHV-P94LaOD2.js} +1 -1
  47. package/dist/web/assets/stateDiagram-v2-BHNVJYJU--JLHF28o.js +1 -0
  48. package/dist/web/assets/{time-VmDaOXzG.js → time-0JEErjjJ.js} +1 -1
  49. package/dist/web/assets/{timeline-definition-PNZ67QCA-Bp46ZbZu.js → timeline-definition-PNZ67QCA-BqAYomix.js} +1 -1
  50. package/dist/web/assets/{vennDiagram-CIIHVFJN-ObB0ozDF.js → vennDiagram-CIIHVFJN-BWuPhfIM.js} +1 -1
  51. package/dist/web/assets/{wardley-L42UT6IY-DZQGppGX.js → wardley-L42UT6IY-iiGkgUQj.js} +1 -1
  52. package/dist/web/assets/{wardleyDiagram-YWT4CUSO-B3dCDfV5.js → wardleyDiagram-YWT4CUSO-CtqzFQXL.js} +1 -1
  53. package/dist/web/assets/{xychartDiagram-2RQKCTM6-CpxmkRi4.js → xychartDiagram-2RQKCTM6-BGrOXndI.js} +1 -1
  54. package/dist/web/index.html +2 -2
  55. package/examples/component-showcase/seeflow.json +6 -0
  56. package/examples/ecommerce-platform/seeflow.json +6 -0
  57. package/examples/order-pipeline/seeflow.json +6 -0
  58. package/package.json +1 -1
  59. package/src/api.ts +739 -94
  60. package/src/cli-e2e.ts +24 -13
  61. package/src/cli-helpers.ts +26 -0
  62. package/src/cli-manifest.ts +330 -87
  63. package/src/cli-ops.ts +56 -2
  64. package/src/cli.ts +228 -81
  65. package/src/cors.ts +93 -0
  66. package/src/jq-filter.ts +253 -0
  67. package/src/mcp-shim.ts +114 -7
  68. package/src/mcp-ui.ts +126 -0
  69. package/src/mcp.ts +258 -97
  70. package/src/node-files.ts +18 -7
  71. package/src/operations.ts +68 -32
  72. package/src/project-scanner.ts +105 -0
  73. package/src/registry.ts +79 -18
  74. package/src/route-resolve.ts +41 -0
  75. package/src/schema.ts +54 -0
  76. package/src/server.ts +24 -3
  77. package/src/slugify.ts +16 -0
  78. package/dist/web/assets/channel-BpDUSI6-.js +0 -1
  79. package/dist/web/assets/classDiagram-4FO5ZUOK-po1qHJgX.js +0 -1
  80. package/dist/web/assets/classDiagram-v2-Q7XG4LA2-po1qHJgX.js +0 -1
  81. package/dist/web/assets/index-DJa2Qm_q.js +0 -8614
  82. package/dist/web/assets/stateDiagram-v2-BHNVJYJU-D1iGL3Mj.js +0 -1
  83. /package/examples/component-showcase/{flow.json → flows/main/flow.json} +0 -0
  84. /package/examples/component-showcase/{nodes → flows/main/nodes}/chart/spec.json +0 -0
  85. /package/examples/component-showcase/{nodes → flows/main/nodes}/counter/spec.json +0 -0
  86. /package/examples/component-showcase/{nodes → flows/main/nodes}/fetcher/actions/refresh.ts +0 -0
  87. /package/examples/component-showcase/{nodes → flows/main/nodes}/fetcher/spec.json +0 -0
  88. /package/examples/component-showcase/{nodes → flows/main/nodes}/form/spec.json +0 -0
  89. /package/examples/component-showcase/{style.json → flows/main/style.json} +0 -0
  90. /package/examples/ecommerce-platform/{flow.json → flows/main/flow.json} +0 -0
  91. /package/examples/ecommerce-platform/{nodes → flows/main/nodes}/node-3zFtHg6ENc/detail.md +0 -0
  92. /package/examples/ecommerce-platform/{nodes → flows/main/nodes}/node-5F424NWbEu/detail.md +0 -0
  93. /package/examples/ecommerce-platform/{nodes → flows/main/nodes}/node-CbwYqb7NfB/detail.md +0 -0
  94. /package/examples/ecommerce-platform/{nodes → flows/main/nodes}/node-XwygzfKPZ5/view.html +0 -0
  95. /package/examples/ecommerce-platform/{nodes → flows/main/nodes}/node-fkptXw7uvs/detail.md +0 -0
  96. /package/examples/ecommerce-platform/{nodes → flows/main/nodes}/node-kwBY8YPmYM/detail.md +0 -0
  97. /package/examples/ecommerce-platform/{nodes → flows/main/nodes}/node-mPqan8rFYN/detail.md +0 -0
  98. /package/examples/ecommerce-platform/{nodes → flows/main/nodes}/node-yKrg9DV5fJ/detail.md +0 -0
  99. /package/examples/ecommerce-platform/{scripts → flows/main/scripts}/play.ts +0 -0
  100. /package/examples/ecommerce-platform/{style.json → flows/main/style.json} +0 -0
  101. /package/examples/order-pipeline/{flow.json → flows/main/flow.json} +0 -0
  102. /package/examples/order-pipeline/{nodes → flows/main/nodes}/node-GXTKUcE3ye/detail.md +0 -0
  103. /package/examples/order-pipeline/{nodes → flows/main/nodes}/node-XKIyds0TDg/detail.md +0 -0
  104. /package/examples/order-pipeline/{nodes → flows/main/nodes}/node-YOYiHJpY0i/detail.md +0 -0
  105. /package/examples/order-pipeline/{nodes → flows/main/nodes}/node-zUIH7WFnhK/detail.md +0 -0
  106. /package/examples/order-pipeline/{scripts → flows/main/scripts}/play.ts +0 -0
  107. /package/examples/order-pipeline/{style.json → flows/main/style.json} +0 -0
package/src/cli-e2e.ts CHANGED
@@ -43,7 +43,8 @@ export interface ValidationReport {
43
43
  }
44
44
 
45
45
  export interface ValidateOptions {
46
- flowId: string;
46
+ project: string;
47
+ flow: string;
47
48
  url: string;
48
49
  hardCeilingMs?: number;
49
50
  statusWaitMs?: number;
@@ -71,10 +72,11 @@ interface FlowGetResponse {
71
72
  id?: string;
72
73
  valid?: boolean;
73
74
  error?: string | null;
74
- // GET /api/flows/:id returns the resolved flow under the `flow` key (see
75
- // FlowGetResponse in operations.ts). Older versions of this file used `demo`,
76
- // which left the validator effectively broken (every call returned `ok:false`
77
- // with "demo not valid"). Renamed to match the wire format.
75
+ // GET /api/projects/:project/flows/:flow returns the resolved flow under
76
+ // the `flow` key (see FlowGetResponse in operations.ts). Older versions of
77
+ // this file used `demo`, which left the validator effectively broken (every
78
+ // call returned `ok:false` with "demo not valid"). Renamed to match the wire
79
+ // format.
78
80
  flow?: FlowBody | null;
79
81
  }
80
82
 
@@ -178,7 +180,7 @@ function hasStatusAction(node: NodeShape): boolean {
178
180
  }
179
181
 
180
182
  export async function validateEndToEnd(options: ValidateOptions): Promise<ValidationReport> {
181
- const { url } = options;
183
+ const { url, project, flow } = options;
182
184
  const hardCeilingMs = options.hardCeilingMs ?? DEFAULT_HARD_CEILING_MS;
183
185
  const statusWaitMs = options.statusWaitMs ?? DEFAULT_STATUS_WAIT_MS;
184
186
  const startedAt = Date.now();
@@ -188,7 +190,8 @@ export async function validateEndToEnd(options: ValidateOptions): Promise<Valida
188
190
  const statuses: StatusOutcome[] = [];
189
191
  const skipped: SkippedItem[] = [];
190
192
 
191
- const demoRes = await fetch(`${url}/api/flows/${encodeURIComponent(options.flowId)}`);
193
+ const flowBase = `${url}/api/projects/${encodeURIComponent(project)}/flows/${encodeURIComponent(flow)}`;
194
+ const demoRes = await fetch(flowBase);
192
195
  if (!demoRes.ok) {
193
196
  return {
194
197
  ok: false,
@@ -197,7 +200,7 @@ export async function validateEndToEnd(options: ValidateOptions): Promise<Valida
197
200
  skipped: [
198
201
  {
199
202
  nodeId: '<demo>',
200
- reason: `GET /api/flows/${options.flowId} returned HTTP ${demoRes.status}`,
203
+ reason: `GET /api/projects/${project}/flows/${flow} returned HTTP ${demoRes.status}`,
201
204
  },
202
205
  ],
203
206
  };
@@ -216,6 +219,17 @@ export async function validateEndToEnd(options: ValidateOptions): Promise<Valida
216
219
  ],
217
220
  };
218
221
  }
222
+ // /api/events still keys by the registry's short id — resolved here from
223
+ // the flow GET response so the SSE subscription matches the broadcasts.
224
+ const flowId = demoData.id;
225
+ if (!flowId) {
226
+ return {
227
+ ok: false,
228
+ plays,
229
+ statuses,
230
+ skipped: [{ nodeId: '<flow>', reason: 'flow detail missing registry id' }],
231
+ };
232
+ }
219
233
 
220
234
  const nodes = demoData.flow.nodes ?? [];
221
235
 
@@ -238,7 +252,7 @@ export async function validateEndToEnd(options: ValidateOptions): Promise<Valida
238
252
 
239
253
  let channel: SseChannel | undefined;
240
254
  try {
241
- const sseRes = await fetch(`${url}/api/events?flowId=${encodeURIComponent(options.flowId)}`, {
255
+ const sseRes = await fetch(`${url}/api/events?flowId=${encodeURIComponent(flowId)}`, {
242
256
  headers: { accept: 'text/event-stream' },
243
257
  });
244
258
  if (sseRes.ok && sseRes.body) {
@@ -274,10 +288,7 @@ export async function validateEndToEnd(options: ValidateOptions): Promise<Valida
274
288
  }
275
289
  let res: Response;
276
290
  try {
277
- res = await fetch(
278
- `${url}/api/flows/${encodeURIComponent(options.flowId)}/play/${encodeURIComponent(nodeId)}`,
279
- { method: 'POST' },
280
- );
291
+ res = await fetch(`${flowBase}/play/${encodeURIComponent(nodeId)}`, { method: 'POST' });
281
292
  } catch (err) {
282
293
  const message = err instanceof Error ? err.message : String(err);
283
294
  httpResults.set(nodeId, { httpError: message });
@@ -136,6 +136,7 @@ function describeOutcome(outcome: { kind: string } & Record<string, unknown>): s
136
136
  export const EXIT_CODE_BY_KIND: Record<string, number> = {
137
137
  badSchema: 2,
138
138
  badJson: 2,
139
+ badJq: 2,
139
140
  notFound: 3,
140
141
  flowNotFound: 3,
141
142
  fileNotFound: 3,
@@ -159,3 +160,28 @@ export const drainStdin: StdinReader = async () => {
159
160
  }
160
161
  return new TextDecoder().decode(Buffer.concat(chunks));
161
162
  };
163
+
164
+ /**
165
+ * Extract `--project <p>` and `--flow <f>` from a raw argv array. Throws when
166
+ * either flag is missing — every flow-scoped CLI verb (US-020) routes through
167
+ * this helper so the addressing convention stays uniform.
168
+ *
169
+ * Accepts both `--name value` and `--name=value` forms; the first occurrence
170
+ * wins (matches the behaviour of cli.ts's internal `flagValue`).
171
+ */
172
+ export function parseProjectFlow(argv: readonly string[]): { project: string; flow: string } {
173
+ const project = readArgvFlag(argv, 'project');
174
+ if (!project) throw new Error('Missing required flag: --project');
175
+ const flow = readArgvFlag(argv, 'flow');
176
+ if (!flow) throw new Error('Missing required flag: --flow');
177
+ return { project, flow };
178
+ }
179
+
180
+ function readArgvFlag(argv: readonly string[], name: string): string | undefined {
181
+ const flag = `--${name}`;
182
+ const eqArg = argv.find((a) => a.startsWith(`${flag}=`));
183
+ if (eqArg) return eqArg.slice(`${flag}=`.length);
184
+ const idx = argv.indexOf(flag);
185
+ if (idx >= 0 && idx + 1 < argv.length) return argv[idx + 1];
186
+ return undefined;
187
+ }