@tuongaz/seeflow 0.1.77 → 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.
- package/README.md +40 -0
- package/dist/web/assets/{architectureDiagram-3BPJPVTR-D5iHwVvy.js → architectureDiagram-3BPJPVTR-id0XTZQC.js} +1 -1
- package/dist/web/assets/{blockDiagram-GPEHLZMM-MAYYm7FM.js → blockDiagram-GPEHLZMM-Cjvfg0ZP.js} +1 -1
- package/dist/web/assets/{c4Diagram-AAUBKEIU-7P7yfHg1.js → c4Diagram-AAUBKEIU-Dyq-0e8Q.js} +1 -1
- package/dist/web/assets/channel-Ajb6KiL3.js +1 -0
- package/dist/web/assets/{chart-C68vupBE.js → chart-DuTGW-Dj.js} +1 -1
- package/dist/web/assets/{chunk-2J33WTMH-Bb4cSusI.js → chunk-2J33WTMH-DsD65OzD.js} +1 -1
- package/dist/web/assets/{chunk-4BX2VUAB-DXYpcpTh.js → chunk-4BX2VUAB-BpytKE8P.js} +1 -1
- package/dist/web/assets/{chunk-55IACEB6-BxuYKDnf.js → chunk-55IACEB6-DIILAUq9.js} +1 -1
- package/dist/web/assets/{chunk-727SXJPM-DbWlxAr2.js → chunk-727SXJPM-C4ih-gTo.js} +1 -1
- package/dist/web/assets/{chunk-AQP2D5EJ-DT8S1q80.js → chunk-AQP2D5EJ-BsYoWdVM.js} +1 -1
- package/dist/web/assets/{chunk-FMBD7UC4-Dc0wDuZz.js → chunk-FMBD7UC4-Db6L0z4p.js} +1 -1
- package/dist/web/assets/{chunk-ND2GUHAM-CqLLK6H0.js → chunk-ND2GUHAM-BNLqZYMx.js} +1 -1
- package/dist/web/assets/{chunk-QZHKN3VN-CxF7nkDI.js → chunk-QZHKN3VN-DL5PK45j.js} +1 -1
- package/dist/web/assets/classDiagram-4FO5ZUOK-Cgw6ezRo.js +1 -0
- package/dist/web/assets/classDiagram-v2-Q7XG4LA2-Cgw6ezRo.js +1 -0
- package/dist/web/assets/{code-block-DR9fiK_U.js → code-block-C1SJv-Al.js} +1 -1
- package/dist/web/assets/{cose-bilkent-S5V4N54A-BflFbtY2.js → cose-bilkent-S5V4N54A-ChX5nR0f.js} +1 -1
- package/dist/web/assets/{dagre-BM42HDAG-BJ5UdyYS.js → dagre-BM42HDAG-BXeL3fEN.js} +1 -1
- package/dist/web/assets/{diagram-2AECGRRQ-D0M8fCf7.js → diagram-2AECGRRQ-B6WtmEP-.js} +1 -1
- package/dist/web/assets/{diagram-5GNKFQAL-D67gAMS4.js → diagram-5GNKFQAL-SXs7ALwM.js} +1 -1
- package/dist/web/assets/{diagram-KO2AKTUF-XX62HBG-.js → diagram-KO2AKTUF-D5zylPYo.js} +1 -1
- package/dist/web/assets/{diagram-LMA3HP47-DCFq3Oac.js → diagram-LMA3HP47-CByIUlQF.js} +1 -1
- package/dist/web/assets/{diagram-OG6HWLK6-Be392NCN.js → diagram-OG6HWLK6-BH1MfUqV.js} +1 -1
- package/dist/web/assets/{erDiagram-TEJ5UH35-DP4eP0as.js → erDiagram-TEJ5UH35-BOOnRFBh.js} +1 -1
- package/dist/web/assets/{flowDiagram-I6XJVG4X-Ch1GVJ9R.js → flowDiagram-I6XJVG4X-BynWDHJP.js} +1 -1
- package/dist/web/assets/{ganttDiagram-6RSMTGT7-DtvkTizu.js → ganttDiagram-6RSMTGT7-Cgq_djyN.js} +1 -1
- package/dist/web/assets/{gitGraphDiagram-PVQCEYII-YGcuBgb9.js → gitGraphDiagram-PVQCEYII-ciGSgmfT.js} +1 -1
- package/dist/web/assets/index-DiakpHyc.js +8619 -0
- package/dist/web/assets/{index-DljfurDC.css → index-fl8DS9WO.css} +1 -1
- package/dist/web/assets/{index.es-jrsJPbYZ.js → index.es-C7TtaIfa.js} +1 -1
- package/dist/web/assets/{infoDiagram-5YYISTIA-wce0BORz.js → infoDiagram-5YYISTIA-DqMb3_c-.js} +1 -1
- package/dist/web/assets/{ishikawaDiagram-YF4QCWOH-u2MvPgdW.js → ishikawaDiagram-YF4QCWOH-CAO6KqQU.js} +1 -1
- package/dist/web/assets/{journeyDiagram-JHISSGLW-BsOyrTiA.js → journeyDiagram-JHISSGLW-Di8MsLTo.js} +1 -1
- package/dist/web/assets/{jspdf.es.min-ptMERvnN.js → jspdf.es.min-Cq4dY-lT.js} +3 -3
- package/dist/web/assets/{kanban-definition-UN3LZRKU-BaraYV9q.js → kanban-definition-UN3LZRKU-ClOmVNcX.js} +1 -1
- package/dist/web/assets/{linear-BVqXcDUJ.js → linear-B3OKBKaT.js} +1 -1
- package/dist/web/assets/{markdown-DqP0Cywq.js → markdown-Dg8NEx1K.js} +1 -1
- package/dist/web/assets/{mermaid.core-CakR_vo1.js → mermaid.core-Bw-m7bH-.js} +4 -4
- package/dist/web/assets/{mindmap-definition-RKZ34NQL-CO5AsZw3.js → mindmap-definition-RKZ34NQL-CUBA1zfc.js} +1 -1
- package/dist/web/assets/{pieDiagram-4H26LBE5-CiDJY-kx.js → pieDiagram-4H26LBE5-Dux5HvSU.js} +1 -1
- package/dist/web/assets/{quadrantDiagram-W4KKPZXB-BS6oN3s_.js → quadrantDiagram-W4KKPZXB-DU3gQGo3.js} +1 -1
- package/dist/web/assets/{requirementDiagram-4Y6WPE33-CNbUR_FF.js → requirementDiagram-4Y6WPE33-CD3A_U9j.js} +1 -1
- package/dist/web/assets/{sankeyDiagram-5OEKKPKP-0Esj5uzm.js → sankeyDiagram-5OEKKPKP-Cd4mc26P.js} +1 -1
- package/dist/web/assets/{sequenceDiagram-3UESZ5HK-DR3U38Zi.js → sequenceDiagram-3UESZ5HK-Da0iOMgq.js} +1 -1
- package/dist/web/assets/{stateDiagram-AJRCARHV-C50RQjWe.js → stateDiagram-AJRCARHV-P94LaOD2.js} +1 -1
- package/dist/web/assets/stateDiagram-v2-BHNVJYJU--JLHF28o.js +1 -0
- package/dist/web/assets/{time-C_2J9tFX.js → time-0JEErjjJ.js} +1 -1
- package/dist/web/assets/{timeline-definition-PNZ67QCA-BQXyo2r_.js → timeline-definition-PNZ67QCA-BqAYomix.js} +1 -1
- package/dist/web/assets/{vennDiagram-CIIHVFJN-DZJ8M3EA.js → vennDiagram-CIIHVFJN-BWuPhfIM.js} +1 -1
- package/dist/web/assets/{wardley-L42UT6IY-B96HtW3i.js → wardley-L42UT6IY-iiGkgUQj.js} +1 -1
- package/dist/web/assets/{wardleyDiagram-YWT4CUSO-BHkQ79WC.js → wardleyDiagram-YWT4CUSO-CtqzFQXL.js} +1 -1
- package/dist/web/assets/{xychartDiagram-2RQKCTM6-B_f8koGI.js → xychartDiagram-2RQKCTM6-BGrOXndI.js} +1 -1
- package/dist/web/index.html +2 -2
- package/examples/component-showcase/seeflow.json +6 -0
- package/examples/ecommerce-platform/seeflow.json +6 -0
- package/examples/order-pipeline/seeflow.json +6 -0
- package/package.json +1 -1
- package/src/api.ts +739 -94
- package/src/cli-e2e.ts +24 -13
- package/src/cli-helpers.ts +26 -0
- package/src/cli-manifest.ts +330 -87
- package/src/cli-ops.ts +56 -2
- package/src/cli.ts +228 -81
- package/src/cors.ts +93 -0
- package/src/jq-filter.ts +253 -0
- package/src/mcp-shim.ts +114 -7
- package/src/mcp-ui.ts +126 -0
- package/src/mcp.ts +258 -97
- package/src/node-files.ts +18 -7
- package/src/operations.ts +68 -32
- package/src/project-scanner.ts +105 -0
- package/src/registry.ts +79 -18
- package/src/route-resolve.ts +41 -0
- package/src/schema.ts +54 -0
- package/src/server.ts +24 -3
- package/src/slugify.ts +16 -0
- package/dist/web/assets/channel-BjsQQK93.js +0 -1
- package/dist/web/assets/classDiagram-4FO5ZUOK-p3FY5uNC.js +0 -1
- package/dist/web/assets/classDiagram-v2-Q7XG4LA2-p3FY5uNC.js +0 -1
- package/dist/web/assets/index-Bg3PU4Ev.js +0 -8614
- package/dist/web/assets/stateDiagram-v2-BHNVJYJU-BbNrmkIR.js +0 -1
- /package/examples/component-showcase/{flow.json → flows/main/flow.json} +0 -0
- /package/examples/component-showcase/{nodes → flows/main/nodes}/chart/spec.json +0 -0
- /package/examples/component-showcase/{nodes → flows/main/nodes}/counter/spec.json +0 -0
- /package/examples/component-showcase/{nodes → flows/main/nodes}/fetcher/actions/refresh.ts +0 -0
- /package/examples/component-showcase/{nodes → flows/main/nodes}/fetcher/spec.json +0 -0
- /package/examples/component-showcase/{nodes → flows/main/nodes}/form/spec.json +0 -0
- /package/examples/component-showcase/{style.json → flows/main/style.json} +0 -0
- /package/examples/ecommerce-platform/{flow.json → flows/main/flow.json} +0 -0
- /package/examples/ecommerce-platform/{nodes → flows/main/nodes}/node-3zFtHg6ENc/detail.md +0 -0
- /package/examples/ecommerce-platform/{nodes → flows/main/nodes}/node-5F424NWbEu/detail.md +0 -0
- /package/examples/ecommerce-platform/{nodes → flows/main/nodes}/node-CbwYqb7NfB/detail.md +0 -0
- /package/examples/ecommerce-platform/{nodes → flows/main/nodes}/node-XwygzfKPZ5/view.html +0 -0
- /package/examples/ecommerce-platform/{nodes → flows/main/nodes}/node-fkptXw7uvs/detail.md +0 -0
- /package/examples/ecommerce-platform/{nodes → flows/main/nodes}/node-kwBY8YPmYM/detail.md +0 -0
- /package/examples/ecommerce-platform/{nodes → flows/main/nodes}/node-mPqan8rFYN/detail.md +0 -0
- /package/examples/ecommerce-platform/{nodes → flows/main/nodes}/node-yKrg9DV5fJ/detail.md +0 -0
- /package/examples/ecommerce-platform/{scripts → flows/main/scripts}/play.ts +0 -0
- /package/examples/ecommerce-platform/{style.json → flows/main/style.json} +0 -0
- /package/examples/order-pipeline/{flow.json → flows/main/flow.json} +0 -0
- /package/examples/order-pipeline/{nodes → flows/main/nodes}/node-GXTKUcE3ye/detail.md +0 -0
- /package/examples/order-pipeline/{nodes → flows/main/nodes}/node-XKIyds0TDg/detail.md +0 -0
- /package/examples/order-pipeline/{nodes → flows/main/nodes}/node-YOYiHJpY0i/detail.md +0 -0
- /package/examples/order-pipeline/{nodes → flows/main/nodes}/node-zUIH7WFnhK/detail.md +0 -0
- /package/examples/order-pipeline/{scripts → flows/main/scripts}/play.ts +0 -0
- /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
|
-
|
|
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/:
|
|
75
|
-
// FlowGetResponse in operations.ts). Older versions of
|
|
76
|
-
// which left the validator effectively broken (every
|
|
77
|
-
// with "demo not valid"). Renamed to match the wire
|
|
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
|
|
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/${
|
|
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(
|
|
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 });
|
package/src/cli-helpers.ts
CHANGED
|
@@ -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
|
+
}
|