import { Command } from "effect/unstable/cli" type Options> = { readonly description?: string readonly params?: Config readonly commands?: Commands } export interface Node< Name extends string, Spec extends Command.Command, Commands extends Children, > { readonly name: Name readonly spec: Spec readonly commands: Commands } export type Any = Node, Children> export type Children = Readonly> export function make< const Name extends string, const Config extends Command.Command.Config = {}, const Commands extends ReadonlyArray = [], >(name: Name, options: Options = {}) { const command = Command.make(name, options.params ?? ({} as Config)) const spec = options.description ? command.pipe(Command.withDescription(options.description)) : command return { name, spec, commands: Object.fromEntries( (options.commands ?? []).map((command) => [command.name, command]), ) as ChildrenOf, } } type ChildrenOf> = { readonly [Node in Commands[number] as Node["name"]]: Node } export * as Spec from "./spec"