Nano Banana Pro
Agent skill for nano-banana-pro
Macrograph is a visual programming platform with node-based graph interfaces. Supports both desktop (single-project) and server (multi-project) environments with real-time event processing and type-safe ID management.
Sign in to like and favorite skills
Macrograph is a visual programming platform with node-based graph interfaces. Supports both desktop (single-project) and server (multi-project) environments with real-time event processing and type-safe ID management.
This guide provides essential information for working with Macrograph. For detailed technical documentation, see the
agents/ folder.
Schema.brand() (ProjectId, GraphId, NodeId, PackageId, SchemaId)NEVER use
type assertions. Always use as
methods:.make()
// ✅ CORRECT const projectId = ProjectId.make(123); const packageId = PackageId.make("core"); // ❌ INCORRECT - Never do this const projectId = 123 as ProjectId;
Always work within Effect context:
const program = Effect.gen(function* () { const projectService = yield* ProjectService; return yield* projectService.get(); });
Use Effect's error channels, not try-catch:
yield* pipe( operation(), Effect.catchTag("ProjectNotFoundError", () => Effect.succeed(defaultProject)) );
Use immutable patterns:
yield* Ref.set(runtime.projectRef, Option.some(project));
Each project runs in isolated
ProjectRuntime with independent state, event queues, and event node caches.
Do NOT use TypeScript CLI (
) or tsc
command for type checking. Use LSP diagnostics instead:typecheck
npm run typecheck or tsc commandsconst project = yield* registry.create("My Project");
const node = yield* graphService.addNode( graphId, new SchemaRef({ pkgId: PackageId.make("core"), schemaId: SchemaId.make("log") }), "Logger Node" );
yield* withProjectRuntime( ProjectId.make(projectId), Effect.gen(function* () { const graphService = yield* GraphService; // Operations within project context }) );
Never use:
as ProjectId, as GraphId, as NodeId, as PackageId, as SchemaId
pnpm format