@tuongaz/seeflow 0.1.83 → 0.1.84
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/dist/web/assets/{architectureDiagram-3BPJPVTR-CHtgIZZ1.js → architectureDiagram-3BPJPVTR-I46aqv2T.js} +1 -1
- package/dist/web/assets/{blockDiagram-GPEHLZMM-D4zjpGBX.js → blockDiagram-GPEHLZMM-C08px5xi.js} +1 -1
- package/dist/web/assets/{c4Diagram-AAUBKEIU-zSpjD7ZC.js → c4Diagram-AAUBKEIU-iyIMetcW.js} +1 -1
- package/dist/web/assets/channel-X0ALvlnb.js +1 -0
- package/dist/web/assets/{chart-D6WVIyqJ.js → chart-BGNzA0s8.js} +1 -1
- package/dist/web/assets/{chunk-2J33WTMH-Cr7utMp9.js → chunk-2J33WTMH-CQFLt-Og.js} +1 -1
- package/dist/web/assets/{chunk-4BX2VUAB-B6PCB6H4.js → chunk-4BX2VUAB-M_HU7fhX.js} +1 -1
- package/dist/web/assets/{chunk-55IACEB6-D_PUAOtb.js → chunk-55IACEB6-CZ6tcHFC.js} +1 -1
- package/dist/web/assets/{chunk-727SXJPM-DTQLQ_nx.js → chunk-727SXJPM-ZXC_1s3s.js} +1 -1
- package/dist/web/assets/{chunk-AQP2D5EJ-OBgrFsDS.js → chunk-AQP2D5EJ-D1nyTSxR.js} +1 -1
- package/dist/web/assets/{chunk-FMBD7UC4-Cqo28fuY.js → chunk-FMBD7UC4-D8IemyXd.js} +1 -1
- package/dist/web/assets/{chunk-ND2GUHAM-DcquCeO4.js → chunk-ND2GUHAM-aT_PIEvu.js} +1 -1
- package/dist/web/assets/{chunk-QZHKN3VN-SKsRSBcC.js → chunk-QZHKN3VN-BKY6KT8K.js} +1 -1
- package/dist/web/assets/classDiagram-4FO5ZUOK-mwGbzVrI.js +1 -0
- package/dist/web/assets/classDiagram-v2-Q7XG4LA2-mwGbzVrI.js +1 -0
- package/dist/web/assets/{code-block-CQcwHam8.js → code-block-CMPt7Auf.js} +1 -1
- package/dist/web/assets/{cose-bilkent-S5V4N54A-Ds8DGArP.js → cose-bilkent-S5V4N54A-Cr3EeHXE.js} +1 -1
- package/dist/web/assets/{dagre-BM42HDAG-CqMyTq3c.js → dagre-BM42HDAG-BfJiRz9t.js} +1 -1
- package/dist/web/assets/{diagram-2AECGRRQ-CWEIApTd.js → diagram-2AECGRRQ-CZ1Rti0o.js} +1 -1
- package/dist/web/assets/{diagram-5GNKFQAL-8TEzgir4.js → diagram-5GNKFQAL-COe7jS3C.js} +1 -1
- package/dist/web/assets/{diagram-KO2AKTUF-UNKtOw9m.js → diagram-KO2AKTUF-lmIy3eJx.js} +1 -1
- package/dist/web/assets/{diagram-LMA3HP47-D6QoRbi6.js → diagram-LMA3HP47-Dv9UOOZz.js} +1 -1
- package/dist/web/assets/{diagram-OG6HWLK6-CQqkl0nk.js → diagram-OG6HWLK6-C8HoI5ul.js} +1 -1
- package/dist/web/assets/{erDiagram-TEJ5UH35-Clv5A-5B.js → erDiagram-TEJ5UH35-CvqQcwx_.js} +1 -1
- package/dist/web/assets/{flowDiagram-I6XJVG4X-4hg7rn9v.js → flowDiagram-I6XJVG4X-B0f8FFr8.js} +1 -1
- package/dist/web/assets/{ganttDiagram-6RSMTGT7-3PAgpAEA.js → ganttDiagram-6RSMTGT7-C0FgETUZ.js} +1 -1
- package/dist/web/assets/{gitGraphDiagram-PVQCEYII-D5g_5z1o.js → gitGraphDiagram-PVQCEYII-BSUklsqu.js} +1 -1
- package/dist/web/assets/{index-CaE1zYAX.js → index-Cnz1Cpa9.js} +5 -5
- package/dist/web/assets/{index.es-Cgv8Vcjx.js → index.es-CcTdlE2B.js} +1 -1
- package/dist/web/assets/{infoDiagram-5YYISTIA-BuFXAl4D.js → infoDiagram-5YYISTIA-qq3OPeKx.js} +1 -1
- package/dist/web/assets/{ishikawaDiagram-YF4QCWOH-DOE-GUy-.js → ishikawaDiagram-YF4QCWOH-BxoH_vWZ.js} +1 -1
- package/dist/web/assets/{journeyDiagram-JHISSGLW-B5BXjJgy.js → journeyDiagram-JHISSGLW-ClnMLnWd.js} +1 -1
- package/dist/web/assets/{jspdf.es.min-_GQ7N2xd.js → jspdf.es.min-C17Fkx-5.js} +3 -3
- package/dist/web/assets/{kanban-definition-UN3LZRKU-DTLQ2kuG.js → kanban-definition-UN3LZRKU-BiBGcvgP.js} +1 -1
- package/dist/web/assets/{linear-DCKgJuDe.js → linear-D--UMRYt.js} +1 -1
- package/dist/web/assets/{markdown-DQ9_ZAvJ.js → markdown-D-hxiBfP.js} +1 -1
- package/dist/web/assets/{mermaid.core-Cf2CUPpR.js → mermaid.core-ClLm1p66.js} +4 -4
- package/dist/web/assets/{mindmap-definition-RKZ34NQL-CI-_BCCZ.js → mindmap-definition-RKZ34NQL-CLSXYvAW.js} +1 -1
- package/dist/web/assets/{pieDiagram-4H26LBE5-BdTv4DaU.js → pieDiagram-4H26LBE5-CjvKFGOn.js} +1 -1
- package/dist/web/assets/{quadrantDiagram-W4KKPZXB-pqQ7pKT1.js → quadrantDiagram-W4KKPZXB-BUYqMtGH.js} +1 -1
- package/dist/web/assets/{requirementDiagram-4Y6WPE33-CCP9fYhL.js → requirementDiagram-4Y6WPE33-DNCHy1eI.js} +1 -1
- package/dist/web/assets/{sankeyDiagram-5OEKKPKP-CpMAd0Mj.js → sankeyDiagram-5OEKKPKP-zoL2eKAM.js} +1 -1
- package/dist/web/assets/{sequenceDiagram-3UESZ5HK-BWg19eGL.js → sequenceDiagram-3UESZ5HK-DePRNn1e.js} +1 -1
- package/dist/web/assets/{stateDiagram-AJRCARHV-BliITsKN.js → stateDiagram-AJRCARHV-uLinqFcr.js} +1 -1
- package/dist/web/assets/stateDiagram-v2-BHNVJYJU-hyQj-KY3.js +1 -0
- package/dist/web/assets/{time-Dqs-aHL0.js → time-C9xT3sm_.js} +1 -1
- package/dist/web/assets/{timeline-definition-PNZ67QCA-Bk8P84Jg.js → timeline-definition-PNZ67QCA-BnQVT-CY.js} +1 -1
- package/dist/web/assets/{vennDiagram-CIIHVFJN-CMtXVM_H.js → vennDiagram-CIIHVFJN-BUyqbvsU.js} +1 -1
- package/dist/web/assets/{wardley-L42UT6IY-CHP-BfXr.js → wardley-L42UT6IY-zz-5TvX0.js} +1 -1
- package/dist/web/assets/{wardleyDiagram-YWT4CUSO-DInIu6_2.js → wardleyDiagram-YWT4CUSO-DVnYIARL.js} +1 -1
- package/dist/web/assets/{xychartDiagram-2RQKCTM6-B0gobaUy.js → xychartDiagram-2RQKCTM6-BMxn2lA_.js} +1 -1
- package/dist/web/index.html +1 -1
- package/package.json +1 -1
- package/src/api.ts +2 -17
- package/src/cli-helpers.ts +3 -0
- package/src/cli-manifest.ts +60 -14
- package/src/cli.ts +75 -5
- package/src/operations.ts +77 -2
- package/src/project-scanner.ts +18 -0
- package/dist/web/assets/channel-CXa0j4Re.js +0 -1
- package/dist/web/assets/classDiagram-4FO5ZUOK-DGPggFxp.js +0 -1
- package/dist/web/assets/classDiagram-v2-Q7XG4LA2-DGPggFxp.js +0 -1
- package/dist/web/assets/stateDiagram-v2-BHNVJYJU-BCerI8Jf.js +0 -1
package/src/cli.ts
CHANGED
|
@@ -178,6 +178,8 @@ if (argv.includes('--version') || argv.includes('-v')) {
|
|
|
178
178
|
await runRegister();
|
|
179
179
|
} else if (sub === 'projects:create') {
|
|
180
180
|
await runProjectsCreate();
|
|
181
|
+
} else if (sub === 'projects:list') {
|
|
182
|
+
await runProjectsList();
|
|
181
183
|
} else if (sub === 'flows:list') {
|
|
182
184
|
await runFlowsList();
|
|
183
185
|
} else if (sub === 'flows:summary') {
|
|
@@ -243,10 +245,11 @@ Usage:
|
|
|
243
245
|
Commands (work without a running studio):
|
|
244
246
|
start Start the SeeFlow Studio server (default port 4321) — default when no command is given
|
|
245
247
|
stop Stop a background studio instance
|
|
246
|
-
register Register a demo repo,
|
|
247
|
-
flows:register Register a demo repo
|
|
248
|
+
register Register a demo repo. Manifest-aware: when <repoPath>/seeflow.json exists, re-scans every declared flow; otherwise reads <repoPath>/<flow> (defaults to flow.json) as a single-flow project (alias of flows:register)
|
|
249
|
+
flows:register Register a demo repo (manifest-aware — same behaviour as register)
|
|
248
250
|
projects:create Scaffold a new project (writes <path>/seeflow.json + <path>/flows/main/flow.json) — (--path <dir> --name <name> [--description <text>])
|
|
249
|
-
|
|
251
|
+
projects:list List every registered project with projectSlug, name, defaultFlow, flowCount
|
|
252
|
+
flows:list List registered flows. With --project <p>, filters to one project (returns flowSlug, name, icon?, isDefault per flow)
|
|
250
253
|
flows:summary List registered flows (id + name + description only)
|
|
251
254
|
flows:get Get flow details (--project <p> --flow <f>)
|
|
252
255
|
flows:graph List nodes + connectors without inlined file content (--project <p> --flow <f>)
|
|
@@ -594,12 +597,24 @@ function isEsrch(err: unknown): boolean {
|
|
|
594
597
|
|
|
595
598
|
async function runRegister() {
|
|
596
599
|
const repoPath = resolve(flagValue('path') ?? '.');
|
|
597
|
-
const demoPathArg = flagValue('flow') ?? DEFAULT_FLOW_PATH;
|
|
598
600
|
|
|
601
|
+
// Manifest-aware path: if <repoPath>/seeflow.json is on disk, scan and
|
|
602
|
+
// upsert every declared flow in one shot.
|
|
603
|
+
if (existsSync(join(repoPath, 'seeflow.json'))) {
|
|
604
|
+
await runRegisterManifest(repoPath);
|
|
605
|
+
return;
|
|
606
|
+
}
|
|
607
|
+
|
|
608
|
+
// Legacy single-flow path: pre-manifest projects (and skill tests that
|
|
609
|
+
// exercise registerFlow directly) still pass a bare flow.json at the
|
|
610
|
+
// root. Read it, schema-validate, upsert one entry.
|
|
611
|
+
const demoPathArg = flagValue('flow') ?? DEFAULT_FLOW_PATH;
|
|
599
612
|
const fullPath = isAbsolute(demoPathArg) ? demoPathArg : join(repoPath, demoPathArg);
|
|
600
613
|
if (!existsSync(fullPath)) {
|
|
601
614
|
console.error(`No demo file at ${fullPath}`);
|
|
602
|
-
console.error(
|
|
615
|
+
console.error(
|
|
616
|
+
`Create ${DEFAULT_FLOW_PATH} in your repo, or pass --flow <path>. For manifest-driven projects, place a seeflow.json at the repo root.`,
|
|
617
|
+
);
|
|
603
618
|
process.exit(1);
|
|
604
619
|
}
|
|
605
620
|
|
|
@@ -643,6 +658,48 @@ async function runRegister() {
|
|
|
643
658
|
}
|
|
644
659
|
}
|
|
645
660
|
|
|
661
|
+
async function runRegisterManifest(repoPath: string) {
|
|
662
|
+
const outcome = registerProject({ repoPath });
|
|
663
|
+
if (outcome.kind !== 'ok') {
|
|
664
|
+
switch (outcome.kind) {
|
|
665
|
+
case 'manifest-invalid':
|
|
666
|
+
console.error(`${join(repoPath, 'seeflow.json')} is invalid: ${outcome.message}`);
|
|
667
|
+
process.exit(2);
|
|
668
|
+
break;
|
|
669
|
+
case 'manifest-missing':
|
|
670
|
+
// Defensive — runRegister gated on existsSync, so this should not fire.
|
|
671
|
+
console.error(`No seeflow.json at ${repoPath}`);
|
|
672
|
+
process.exit(3);
|
|
673
|
+
break;
|
|
674
|
+
case 'legacy-root-flow':
|
|
675
|
+
console.error(
|
|
676
|
+
`${repoPath} has a legacy root flow.json but no seeflow.json. Migrate it into the new flows/<id>/ layout before re-registering.`,
|
|
677
|
+
);
|
|
678
|
+
process.exit(3);
|
|
679
|
+
break;
|
|
680
|
+
case 'flow-json-missing':
|
|
681
|
+
console.error(
|
|
682
|
+
`Manifest declares flow "${outcome.flowId}" but ${outcome.flowPath} is missing.`,
|
|
683
|
+
);
|
|
684
|
+
process.exit(3);
|
|
685
|
+
break;
|
|
686
|
+
}
|
|
687
|
+
process.exit(1);
|
|
688
|
+
}
|
|
689
|
+
|
|
690
|
+
const pid = readPid();
|
|
691
|
+
const live = pid !== undefined && isPidAlive(pid);
|
|
692
|
+
const overrideUrl = process.env.SEEFLOW_STUDIO_URL?.replace(/\/+$/, '');
|
|
693
|
+
const baseUrl = live ? (overrideUrl ?? studioUrl(readConfig())) : null;
|
|
694
|
+
|
|
695
|
+
for (const entry of outcome.entries) {
|
|
696
|
+
const tail = baseUrl
|
|
697
|
+
? ` → ${baseUrl}/projects/${outcome.projectSlug}/flows/${entry.flowSlug}`
|
|
698
|
+
: ` (slug: ${entry.slug})`;
|
|
699
|
+
console.log(`Registered "${entry.name}"${tail}`);
|
|
700
|
+
}
|
|
701
|
+
}
|
|
702
|
+
|
|
646
703
|
async function ensureStudioRunning(url: string, port: number, noStart: boolean) {
|
|
647
704
|
if (await healthOk(url)) return;
|
|
648
705
|
|
|
@@ -709,10 +766,23 @@ async function runProjectsCreate() {
|
|
|
709
766
|
|
|
710
767
|
async function runFlowsList() {
|
|
711
768
|
const ops = createCliOperations();
|
|
769
|
+
const project = flagValue('project');
|
|
770
|
+
if (project) {
|
|
771
|
+
const result = ops.listFlowsByProject(project);
|
|
772
|
+
if (result.kind !== 'ok') printOutcome(result);
|
|
773
|
+
printOk({ projectSlug: result.data.projectSlug, flows: result.data.flows });
|
|
774
|
+
return;
|
|
775
|
+
}
|
|
712
776
|
const result = ops.listFlows();
|
|
713
777
|
printOk({ flows: result.data });
|
|
714
778
|
}
|
|
715
779
|
|
|
780
|
+
function runProjectsList() {
|
|
781
|
+
const ops = createCliOperations();
|
|
782
|
+
const result = ops.listProjects();
|
|
783
|
+
printOk({ projects: result.data });
|
|
784
|
+
}
|
|
785
|
+
|
|
716
786
|
async function runFlowsSummary() {
|
|
717
787
|
const ops = createCliOperations();
|
|
718
788
|
const result = ops.listFlowsSummary();
|
package/src/operations.ts
CHANGED
|
@@ -22,8 +22,8 @@ import {
|
|
|
22
22
|
removeNodeDir,
|
|
23
23
|
writeNodeFile,
|
|
24
24
|
} from './node-files.ts';
|
|
25
|
-
import { scanProject } from './project-scanner.ts';
|
|
26
|
-
import { type Registry, slugify } from './registry.ts';
|
|
25
|
+
import { readProjectManifest, scanProject } from './project-scanner.ts';
|
|
26
|
+
import { type FlowEntry, type Registry, slugify } from './registry.ts';
|
|
27
27
|
import {
|
|
28
28
|
ColorTokenSchema,
|
|
29
29
|
ComponentSpecSchema,
|
|
@@ -404,6 +404,31 @@ export interface CreateProjectSuccess {
|
|
|
404
404
|
|
|
405
405
|
export type ListFlowsOutcome = { kind: 'ok'; data: FlowListItem[] };
|
|
406
406
|
|
|
407
|
+
export interface ProjectListItem {
|
|
408
|
+
projectSlug: string;
|
|
409
|
+
name: string;
|
|
410
|
+
description?: string;
|
|
411
|
+
defaultFlow: string;
|
|
412
|
+
flowCount: number;
|
|
413
|
+
repoPath: string;
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
export type ListProjectsOutcome = { kind: 'ok'; data: ProjectListItem[] };
|
|
417
|
+
|
|
418
|
+
export interface ProjectFlowListItem {
|
|
419
|
+
id: string;
|
|
420
|
+
slug: string;
|
|
421
|
+
flowSlug: string;
|
|
422
|
+
name: string;
|
|
423
|
+
icon?: string;
|
|
424
|
+
isDefault: boolean;
|
|
425
|
+
valid: boolean;
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
export type ListFlowsByProjectOutcome =
|
|
429
|
+
| { kind: 'ok'; data: { projectSlug: string; flows: ProjectFlowListItem[] } }
|
|
430
|
+
| { kind: 'projectNotFound'; projectSlug: string };
|
|
431
|
+
|
|
407
432
|
// Minimal projection for agent/CLI discovery — `description` and `name` come
|
|
408
433
|
// from the live watcher snapshot when available so author edits to flow.json
|
|
409
434
|
// surface immediately; fall back to the registry value at startup before
|
|
@@ -951,6 +976,52 @@ export function listDemosImpl(deps: OperationsDeps): ListFlowsOutcome {
|
|
|
951
976
|
return { kind: 'ok', data };
|
|
952
977
|
}
|
|
953
978
|
|
|
979
|
+
export function listProjectsImpl(deps: OperationsDeps): ListProjectsOutcome {
|
|
980
|
+
const grouped = new Map<string, FlowEntry[]>();
|
|
981
|
+
for (const entry of deps.registry.list()) {
|
|
982
|
+
const existing = grouped.get(entry.projectSlug);
|
|
983
|
+
if (existing) existing.push(entry);
|
|
984
|
+
else grouped.set(entry.projectSlug, [entry]);
|
|
985
|
+
}
|
|
986
|
+
const data: ProjectListItem[] = [];
|
|
987
|
+
for (const [projectSlug, entries] of grouped) {
|
|
988
|
+
const head = entries[0];
|
|
989
|
+
if (!head) continue;
|
|
990
|
+
const manifest = readProjectManifest(head.repoPath);
|
|
991
|
+
const defaultEntry = entries.find((e) => e.isDefault) ?? head;
|
|
992
|
+
data.push({
|
|
993
|
+
projectSlug,
|
|
994
|
+
name: manifest?.name ?? projectSlug,
|
|
995
|
+
...(manifest?.description !== undefined ? { description: manifest.description } : {}),
|
|
996
|
+
defaultFlow: manifest?.defaultFlow ?? defaultEntry.flowSlug,
|
|
997
|
+
flowCount: entries.length,
|
|
998
|
+
repoPath: head.repoPath,
|
|
999
|
+
});
|
|
1000
|
+
}
|
|
1001
|
+
return { kind: 'ok', data };
|
|
1002
|
+
}
|
|
1003
|
+
|
|
1004
|
+
export function listFlowsByProjectImpl(
|
|
1005
|
+
deps: OperationsDeps,
|
|
1006
|
+
projectSlug: string,
|
|
1007
|
+
): ListFlowsByProjectOutcome {
|
|
1008
|
+
const entries = deps.registry.list().filter((e) => e.projectSlug === projectSlug);
|
|
1009
|
+
if (entries.length === 0) return { kind: 'projectNotFound', projectSlug };
|
|
1010
|
+
const flows: ProjectFlowListItem[] = entries.map((e) => {
|
|
1011
|
+
const fileExists = existsSync(resolveFilePath(e.repoPath, e.flowPath));
|
|
1012
|
+
return {
|
|
1013
|
+
id: e.id,
|
|
1014
|
+
slug: e.slug,
|
|
1015
|
+
flowSlug: e.flowSlug,
|
|
1016
|
+
name: e.name,
|
|
1017
|
+
...(e.icon !== undefined ? { icon: e.icon } : {}),
|
|
1018
|
+
isDefault: e.isDefault,
|
|
1019
|
+
valid: e.valid && fileExists,
|
|
1020
|
+
};
|
|
1021
|
+
});
|
|
1022
|
+
return { kind: 'ok', data: { projectSlug, flows } };
|
|
1023
|
+
}
|
|
1024
|
+
|
|
954
1025
|
export function listFlowsSummaryImpl(deps: OperationsDeps): ListFlowsSummaryOutcome {
|
|
955
1026
|
const { registry, watcher } = deps;
|
|
956
1027
|
const data = registry.list().map((e) => {
|
|
@@ -1899,6 +1970,8 @@ export async function applyLayoutImpl(
|
|
|
1899
1970
|
export interface Operations {
|
|
1900
1971
|
listFlows(): ReturnType<typeof listDemosImpl>;
|
|
1901
1972
|
listFlowsSummary(): ReturnType<typeof listFlowsSummaryImpl>;
|
|
1973
|
+
listProjects(): ReturnType<typeof listProjectsImpl>;
|
|
1974
|
+
listFlowsByProject(projectSlug: string): ReturnType<typeof listFlowsByProjectImpl>;
|
|
1902
1975
|
getFlow(id: string): ReturnType<typeof getFlowImpl>;
|
|
1903
1976
|
getFlowGraph(id: string): ReturnType<typeof getFlowGraphImpl>;
|
|
1904
1977
|
getNode(flowId: string, nodeId: string): ReturnType<typeof getNodeImpl>;
|
|
@@ -1946,6 +2019,8 @@ export function createOperations(deps: OperationsDeps): Operations {
|
|
|
1946
2019
|
return {
|
|
1947
2020
|
listFlows: () => listDemosImpl(deps),
|
|
1948
2021
|
listFlowsSummary: () => listFlowsSummaryImpl(deps),
|
|
2022
|
+
listProjects: () => listProjectsImpl(deps),
|
|
2023
|
+
listFlowsByProject: (projectSlug) => listFlowsByProjectImpl(deps, projectSlug),
|
|
1949
2024
|
getFlow: (id) => getFlowImpl(deps, id),
|
|
1950
2025
|
getFlowGraph: (id) => getFlowGraphImpl(deps, id),
|
|
1951
2026
|
getNode: (flowId, nodeId) => getNodeImpl(deps, flowId, nodeId),
|
package/src/project-scanner.ts
CHANGED
|
@@ -47,6 +47,24 @@ export type ScanResult =
|
|
|
47
47
|
const MANIFEST_FILENAME = 'seeflow.json';
|
|
48
48
|
const LEGACY_FLOW_FILENAME = 'flow.json';
|
|
49
49
|
|
|
50
|
+
/**
|
|
51
|
+
* Best-effort manifest read for listing routes / CLI listing verbs.
|
|
52
|
+
* Returns `null` when the manifest is missing or malformed — callers fall
|
|
53
|
+
* back to derived defaults (projectSlug, isDefault entry) so one broken
|
|
54
|
+
* project does not collapse the whole listing.
|
|
55
|
+
*/
|
|
56
|
+
export function readProjectManifest(repoPath: string): SeeflowManifest | null {
|
|
57
|
+
const manifestPath = join(repoPath, MANIFEST_FILENAME);
|
|
58
|
+
if (!existsSync(manifestPath)) return null;
|
|
59
|
+
try {
|
|
60
|
+
const raw = JSON.parse(readFileSync(manifestPath, 'utf8'));
|
|
61
|
+
const parsed = SeeflowManifestSchema.safeParse(raw);
|
|
62
|
+
return parsed.success ? parsed.data : null;
|
|
63
|
+
} catch {
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
50
68
|
export function scanProject(repoPath: string): ScanResult {
|
|
51
69
|
const manifestPath = join(repoPath, MANIFEST_FILENAME);
|
|
52
70
|
if (!existsSync(manifestPath)) {
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{U as a,C as n}from"./mermaid.core-Cf2CUPpR.js";const t=(r,o)=>a.lang.round(n.parse(r)[o]);export{t as c};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{s as a,a as s,c as e,C as t}from"./chunk-727SXJPM-DTQLQ_nx.js";import{a as i}from"./mermaid.core-Cf2CUPpR.js";import"./index-CaE1zYAX.js";import"./chunk-FMBD7UC4-Cqo28fuY.js";import"./chunk-ND2GUHAM-DcquCeO4.js";import"./chunk-55IACEB6-D_PUAOtb.js";import"./chunk-2J33WTMH-Cr7utMp9.js";import"./purify.es-CLGrRn1w.js";import"./step-CWvwoXpJ.js";var b={parser:e,get db(){return new t},renderer:s,styles:a,init:i(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{b as diagram};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{s as a,a as s,c as e,C as t}from"./chunk-727SXJPM-DTQLQ_nx.js";import{a as i}from"./mermaid.core-Cf2CUPpR.js";import"./index-CaE1zYAX.js";import"./chunk-FMBD7UC4-Cqo28fuY.js";import"./chunk-ND2GUHAM-DcquCeO4.js";import"./chunk-55IACEB6-D_PUAOtb.js";import"./chunk-2J33WTMH-Cr7utMp9.js";import"./purify.es-CLGrRn1w.js";import"./step-CWvwoXpJ.js";var b={parser:e,get db(){return new t},renderer:s,styles:a,init:i(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{b as diagram};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{b as r,a as e,s as a,S as s}from"./chunk-AQP2D5EJ-OBgrFsDS.js";import{a as i}from"./mermaid.core-Cf2CUPpR.js";import"./index-CaE1zYAX.js";import"./chunk-55IACEB6-D_PUAOtb.js";import"./chunk-2J33WTMH-Cr7utMp9.js";import"./purify.es-CLGrRn1w.js";import"./step-CWvwoXpJ.js";var n={parser:a,get db(){return new s(2)},renderer:e,styles:r,init:i(t=>{t.state||(t.state={}),t.state.arrowMarkerAbsolute=t.arrowMarkerAbsolute},"init")};export{n as diagram};
|