feat(workflow): workflow-generator — meta-workflow that creates new workflows from natural language #99
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Background
Currently creating a new workflow requires manually writing a TypeScript module that implements
WorkflowDefinition<M>— defining roles, moderator, and wiring up@uncaged/nerve-workflow-utils. This is powerful but has a high barrier to entry.A workflow-generator workflow would let users describe what they want in natural language, and produce a working workflow directory (
~/.uncaged-nerve/workflows/<name>/) ready to run.How It Works
Input
A prompt describing the desired workflow, e.g.:
Roles
analystarchitectWorkflowDefinitionstructure — role graph, moderator routing logic, message types, error handling strategycoderindex.ts+ any helper files, using@uncaged/nerve-coretypes and@uncaged/nerve-workflow-utilsutilitiesreviewertsc --noEmit, verify imports resolve, check moderator covers all transitions, lint for common pitfallsModerator Flow
Reviewer can loop back to coder with fix instructions (max 3 rounds).
Output
Plus auto-register in
nerve.yamlunderworkflows:if not already present.Key Design Decisions
llmExtract<T>()in analyst — structured extraction with Zod schema for workflow speccursorAgent()in coder — leverage cursor-agent for code generation with.cursor/rulescontext from the nerve repospawnSafe()in reviewer — runtsc --noEmitsafely to validate generated codesense-generatoras referenceAcceptance Criteria
~/.uncaged-nerve/workflows/workflow-generator/index.tsimplementsWorkflowDefinitiontsc --noEmitsense-generatornerve.yamlllmExtractReferences
sense-generatorworkflow as the canonical examplepackages/workflow-utilsfor shared utilitiespackages/core/src/types.tsforWorkflowDefinition,Role,Moderator小橘 🍊(NEKO Team)
Implementation Notes (小橘 🍊)
Design Decision: Business failures are workflow-level, not exit-code-level
After discussion with 主人, we agreed:
{ status: "blocked", reason: "..." }→ moderator decides retry/ENDReference Implementation
~/.uncaged-nerve/workflows/sense-generator/index.ts— follow this exact pattern:@uncaged/nerve-coreand@uncaged/nerve-workflow-utilscursorAgent()for code generation,llmExtract()for structured extraction,spawnSafe()for validationresolveDashScopeProvider()pattern for LLM provider resolutionKey Files to Read
packages/core/src/workflow.ts—WorkflowDefinition<M>,Role,Moderator,RoleResult,StartStep,WorkflowMessagepackages/workflow-utils/src/index.ts— exportscursorAgent,llmExtract,spawnSafe,readNerveYaml,nerveAgentContextCLAUDE.md— coding conventions (functional-first, no class, no optional props, Result type)Coding Conventions (from CLAUDE.md)
typeoverinterface,functionoverclass, nothis, no inheritance?:), useT | nullinsteadexport default workflow— this is the one exception for workflow entry points)Result<T, E>for expected failures, throw only for bugsExit Point
The output directory is
~/.uncaged-nerve/workflows/<name>/with:index.ts— WorkflowDefinition implementationpackage.json—{ "type": "module" }+ depstsconfig.json— extends basePlus auto-register in
~/.uncaged-nerve/nerve.yamlunderworkflows:.