xingyue
201abf98ce
refactor(cli): Phase 4 cleanup — dedup, extract, deprecate
...
- bundle-store.ts: remove private pathExists, import from fs-utils
- thread-scan.ts: extract parseFirstJsonLineObject helper, dedup first-line parsing
- commands/workflow/add-argv.ts: extract parseAddArgv from add.ts
- commands/thread/fork-argv.ts: extract parseForkArgv from fork.ts
- commands/cas/*.ts: remove unused _threadId params from cmdCas* functions
- cli-dispatch.ts: add deprecation warning to help command
- commands/init/templates.ts: extract template strings from template.ts
- cli-color.ts: extract shouldUseColor, highlightLiveRole, dimGreyLine from live.ts
- 242 tests pass, biome clean
Closes #97
2026-05-08 09:14:40 +08:00
xingyue
6a99f84025
refactor(cli): split cli-dispatch.ts into group dispatchers + usage module
...
- cli-dispatch.ts: 775 → 149 lines (top-level routing only)
- cli-usage.ts: usage formatting (formatCliUsage, formatUsageCommandLines)
- cli-command-types.ts: shared types (DispatchFn, CommandEntry, CommandGroup)
- cli-registry.ts: getCommandRegistry() assembling all group tables
- cli-usage-context.ts: decouple usage from registry (avoids circular deps)
- commands/{workflow,thread,cas,init}/dispatch.ts: group-specific dispatch
functions + subcommand tables
- 242 tests pass, CLI output identical, biome clean
Refs #96
2026-05-08 09:04:27 +08:00
xingyue
9bdb18afd0
refactor(cli): merge kill/pause/resume into control.ts + extract readWorkerCtl
...
- Merge three near-identical files (kill.ts, pause.ts, resume.ts) into
commands/thread/control.ts with parameterized cmdThreadControl()
- Extract readWorkerCtl() into worker-spawn.ts to eliminate duplicated
WorkerCtl parsing logic
- Update cli-dispatch.ts and test imports
- Net reduction: ~59 lines
Refs #95
2026-05-08 08:55:25 +08:00
xiaomo
2af299f3ce
Merge pull request 'refactor(cli): restructure cmd-*.ts into commands/ subdirectories' ( #98 ) from refactor/93-phase1-directory-restructure into main
2026-05-08 00:48:30 +00:00
xiaoju
485bfcb0b6
chore: remove unused build scripts
...
All packages are pure Bun/TS — no build step needed.
The build scripts were all placeholder `echo 'TODO'` anyway.
2026-05-08 00:46:35 +00:00
xingyue
2ef004eecf
refactor(cli): restructure cmd-*.ts into commands/ subdirectories
...
Reorganize flat cmd-*.ts files into commands/{workflow,thread,cas,init}/
subdirectories that strictly mirror the CLI subcommand hierarchy:
- workflow/: add, list, show, rm, history, rollback
- thread/: run, list, show, rm, fork, ps, kill, live, pause, resume
- cas/: get, put, list, rm, gc
- init/: workspace, template
Each group has an index.ts re-export. Split multi-command files
(cmd-cas.ts, cmd-thread.ts, cmd-init.ts) into per-subcommand files.
Rename cmd-help.ts → skill.ts to match the primary command name.
Update all import paths in cli-dispatch.ts and test files.
Pure structural change — no logic modifications.
Ref: #93 , closes #94
2026-05-08 00:36:54 +08:00
xiaoju
5e411a1f19
fix(cli): improve usage output format + fix skill index title
...
- Usage: grouped sections with titles, aligned descriptions
- Header: 'uncaged-workflow — workflow engine CLI'
- Footer: 'Use <command> --help for subcommand details.'
- Fix skill index title: 'uncaged-workflow skill' (was: help --skill)
- 242 tests pass
Closes #85
小橘 🍊
2026-05-07 15:31:48 +00:00
xiaoju
6b3aa4ce35
fix(cli): usage not red + skill subcommand + --help flag on groups
...
1. No-args usage uses printCliLine (not printCliError), exit 1
2. 'skill [topic]' as first-class command (help --skill kept as compat)
3. 'workflow --help', 'thread --help' etc. show group subcommands
4. Role prompts updated: 'uncaged-workflow skill develop'
240 tests (6 new), build clean.
Closes #83
小橘 🍊
2026-05-07 15:17:20 +00:00
xiaoju
66bca9ef03
feat(cli): help --skill <topic> — context-specific docs for agents
...
- help --skill (no args) → lists available topics
- help --skill cli → full CLI reference (was: help --skill)
- help --skill develop → thread ID, CAS, meta output guide for roles
- help --skill author → bundle structure, descriptor, role definition
- Role prompts updated: planner/coder reference 'help --skill develop'
- Legacy formatSkillDoc() preserved for compat
- 234 tests (15 new), build clean
Closes #81
小橘 🍊
2026-05-07 15:03:08 +00:00
xiaoju
86a422f7e2
fix(cli): nits from review — live --latest in args, dispatchInit uses dispatchGroup
...
小橘 🍊
2026-05-07 14:54:02 +00:00
xiaomo
c44b773a86
refactor(cli): auto-generate skill doc from command registry ( #71 )
2026-05-07 14:35:53 +00:00
xiaoju
7b0e256c13
feat(cli): add WORKFLOW_STORAGE_ROOT env var support
...
Add user-facing WORKFLOW_STORAGE_ROOT environment variable to override
the default storage directory (~/.uncaged/workflow). The existing
UNCAGED_WORKFLOW_STORAGE_ROOT (internal/test) takes priority.
- Update storage-env.ts with priority chain: internal > user > default
- Add env var documentation to CLI help text
- Add 5 tests covering all priority/fallback scenarios
Fixes #63
2026-05-07 22:29:26 +08:00
xiaomo
61be1c662a
feat(cli): help --skill command for agent-consumable docs ( #69 )
2026-05-07 14:20:06 +00:00
xiaomo
8976f4cf3b
fix(cli): move 'remove' from workflow table to deprecation path
...
Per review nit: 'workflow rm' is canonical, 'workflow remove' now shows
deprecation warning. Consistent with top-level 'remove' → 'workflow rm'.
2026-05-07 14:09:37 +00:00
xiaomo
07730dd24c
refactor(cli): group commands by noun-verb pattern (RFC #54 )
...
Phase 1: workflow subcommand group (add/list/show/rm/history/rollback)
Phase 2: thread subcommand group (run/list/show/rm/fork/ps/kill/live/pause/resume)
Phase 3: cas gc + top-level aliases + deprecation warnings for old flat commands
- Follow existing CAS_SUBCOMMAND_TABLE pattern for workflow and thread groups
- Top-level 'run' and 'live' stay as shortcuts (no deprecation)
- Old flat commands print deprecation warning then delegate
- Update usage string to show grouped format
- Update tests to use new grouped syntax
2026-05-07 14:03:35 +00:00
xingyue
8fe26417cf
feat(cli): add --latest, --debug, --role flags to live command ( #37 Phase 2)
...
- --latest: auto-find most recent thread by start timestamp
- --debug: display .info.jsonl debug log with tags
- --role: filter output to specific role
- Add live-argv.ts for flag parsing
- Add fixtures and test coverage for all flags
Testing: #50
2026-05-07 21:44:19 +08:00
xingyue
990200230b
feat(cli): add live command for real-time thread monitoring ( #37 Phase 1)
...
- Add cmd-live.ts: tail .data.jsonl with formatted output
- Display role steps with timestamp, role name, truncated content, meta
- fs.watch for running threads, auto-exit on completion
- Write WorkflowResult to .data.jsonl in worker.ts for completion detection
- Add live.test.ts with JSONL fixtures
Testing: #49
2026-05-07 21:42:32 +08:00
xiaomo
19769efea6
Merge pull request 'feat(cli): init command — scaffold workflow workspace' ( #56 ) from feat/36-init-command into main
2026-05-07 13:37:56 +00:00
xingyue
74e3f5434c
feat(cli): complete AGENTS.md generation ( #36 Phase 3)
...
- Replace placeholder with comprehensive coding agent instructions
- Covers: project structure, core concepts, dev workflow, coding
conventions, template reuse, build/test, common pitfalls
- Add test coverage for AGENTS.md sections and terms
Testing: #48
2026-05-07 21:23:41 +08:00
xiaoju
cae59b589e
feat: global extract provider config
...
- workflow.yaml supports config section (maxDepth, extract provider)
- ExtractProviderConfig with env: prefix for apiKey resolution
- getExtractProvider(storageRoot) returns LlmProvider from config
- workflowAsAgent uses config maxDepth (fallback 3)
- Registry read/write preserves config
- 158 tests passing
Fixes #43
2026-05-07 13:21:38 +00:00
xingyue
703ac9dfcc
feat(cli): add init template command ( #36 Phase 2)
...
- Implement cmdInitTemplate: find workspace root, generate template package
- Generate roles.ts, moderator.ts, index.ts with hello-world boilerplate
- Detect workspace by walking up to find package.json with workspaces
- Error on existing template dir or outside workspace
- Add init-template.test.ts
Testing: #47
2026-05-07 21:21:23 +08:00
xingyue
2df8accf2f
feat(cli): add init workspace command ( #36 Phase 1)
...
- Add cmd-init.ts with cmdInitWorkspace and stub cmdInitTemplate
- Wire init subcommands into cli-dispatch.ts
- Generate monorepo skeleton: package.json (bun workspace), biome.json,
tsconfig.json, AGENTS.md placeholder, README.md, templates/, workflows/
- Error on existing directory
- Add init-workspace.test.ts (all passing)
Testing: #46
2026-05-07 21:18:58 +08:00
xiaoju
84de74721d
feat: Merkle node format + content → CAS
...
- MerkleNode type: { type, payload, children } serialized as YAML
- RoleOutput.content → contentHash (CAS hash of Merkle content node)
- Engine stores content in global CAS before writing to .data.jsonl
- create-workflow puts content as Merkle node, merges contentHash into refs
- fork/parse adapted for contentHash format
- buildAgentPrompt now async, reads content from CAS
- Bundle validator allows @uncaged/workflow import
- 150 tests passing
BREAKING: .data.jsonl no longer contains inline content
Fixes #41
2026-05-07 13:14:01 +00:00
xiaoju
e95e76c145
feat: workflowAsAgent factory
...
- workflowAsAgent(name) resolves via registry → bundle → child thread
- System-level depth limit (max 3, constant)
- Returns summary string, errors as string (no throw)
- Integration test with nested workflow execution
- 146 tests passing
Fixes #33
2026-05-07 10:52:26 +00:00
xiaoju
6488b7bbb4
feat: CAS garbage collection
...
- garbageCollectCas() mark-and-sweep: scan .data.jsonl refs, delete orphans
- 'uncaged-workflow gc' CLI command
- thread rm triggers GC automatically
- 141 tests passing
Fixes #32
2026-05-07 10:47:52 +00:00
xiaoju
12d58a8206
feat: migrate CAS to global storage
...
- Add getGlobalCasDir() to storage-root.ts
- cmd-cas.ts uses global CAS dir, threadId kept for CLI compat
- thread rm no longer deletes .cas/ directories
- Rename createThreadCas → createCasStore (deprecated alias kept)
- 134 tests passing
BREAKING: CAS moves from <thread>.cas/ to <storageRoot>/cas/
Fixes #30
2026-05-07 10:40:14 +00:00
xiaoju
4b44665c7e
feat(workflow): add thread-scoped CAS (Content-Addressable Storage)
...
Phase 1 of #23 :
- createThreadCas() core API: put/get/delete/list with XXH64 hashing
- hashString() utility for string → 13-char Crockford Base32
- CLI: uncaged-workflow cas get/put/list/rm subcommands
- thread rm now cleans up .cas/ directory
- 10 new tests for CAS operations
Refs #23
2026-05-07 04:30:19 +00:00
xiaoju
2482fb7e62
chore: remove all dryRun infrastructure
...
dryRun no longer needed — tests use mock agents + mock fetch instead.
Removes isDryRun from WorkflowFnOptions, dryRun from ExtractConfig,
dryRunMeta from RoleDefinition, --dry-run from CLI, and all related
plumbing in engine/worker/fork/extract.
小橘 <xiaoju@shazhou.work >
2026-05-06 14:25:44 +00:00
xingyue
98b6153070
fix(workflow): resolve type errors across all packages and remove tsbuildinfo from tracking
...
- Add bun-types and @types/xxhashjs to root devDependencies
- Add types: ['bun-types'] to root and package tsconfigs
- Fix AST Node type narrowing in bundle-validator.ts with AcornNode type and narrowNode helper
- Fix generic ThreadContext variance in create-role-moderator.ts
- Add explicit parameter types in worker.ts
- Fix ChildProcess type in worker-spawn.ts to match spawn() stdio config
- Remove all tsconfig.tsbuildinfo from git tracking
- Add tsconfig.tsbuildinfo to .gitignore
2026-05-06 17:41:11 +08:00
xiaoju
f21014fcdd
feat: @uncaged/workflow-agent-cursor + @uncaged/workflow-agent-hermes
...
- Cursor adapter: spawn cursor-agent CLI, auto/specified model
- Hermes adapter: spawn hermes chat CLI
- Both: AgentFn interface, no nerve-core deps, Result-based config validation
- 93 tests pass, biome clean
Closes #10 , Closes #11
小橘 <xiaoju@shazhou.work >
2026-05-06 06:54:24 +00:00
xiaoju
3467b772e6
refactor: named exports (run + descriptor), remove build pipeline
...
- Bundle contract: export const run + export const descriptor (no default export)
- add only accepts .esm.js, extracts descriptor via dynamic import → .yaml
- Removed: build-pipeline, generate-types, json-schema-to-ts
- Worker loads mod.run instead of mod.default
- Biome: no more noDefaultExport overrides for bundles
- 62 tests pass, biome clean
Closes #8
小橘 <xiaoju@shazhou.work >
2026-05-06 06:39:15 +00:00
xiaoju
e670047e6a
feat: build pipeline — .ts → .esm.js + .yaml + .d.ts 三件套
...
- add command auto-detects .ts vs .esm.js input
- .ts: Bun.build → bundle + descriptor extraction + JSON Schema → .d.ts
- .esm.js: requires .yaml alongside, .d.ts optional
- JSON Schema → TypeScript type converter
- hello-world example workflow
- 63 tests pass, biome clean
Closes #7
小橘 <xiaoju@shazhou.work >
2026-05-06 06:26:14 +00:00
xiaoju
47e8fdf5b3
chore: replace hand-written xxhashjs.d.ts with @types/xxhashjs
...
小橘 <xiaoju@shazhou.work >
2026-05-06 06:21:46 +00:00
xiaoju
dfbba0f58c
feat: Phase 4 — fork threads + bun publish verified
...
- fork-thread.ts: parse .data.jsonl, trim steps by role
- cmd-fork.ts: --from-role <role> or retry last step
- engine: forkFrom lineage tracking, prefilled step replay
- worker: accept steps in run IPC command
- bun publish --dry-run: both packages pass
- 53 tests pass, biome clean
Closes #5
小橘 <xiaoju@shazhou.work >
2026-05-06 05:45:01 +00:00
xiaoju
0becafeb44
feat: Phase 3 — version history/rollback + pause/resume threads
...
- CLI: history, rollback, pause, resume commands
- Registry: rollbackWorkflowToHistoryHash
- Engine: awaitAfterEachYield hook for pause gate
- Worker: ThreadPauseGate with Promise-based latch
- TCP IPC: bidirectional response for kill/pause/resume
- 44 tests pass, biome clean
小橘 <xiaoju@shazhou.work >
2026-05-06 05:36:33 +00:00
xiaoju
9943f21f5c
refactor: WorkflowFn input → ThreadInput, remove threadId from bundle contract
...
- WorkflowFn first param is now ThreadInput { prompt, steps }
- threadId removed from WorkflowFnOptions and ThreadContext (engine-only)
- createRoleModerator seeds context from input.steps (fork/resume ready)
- New test: pre-filled steps skip already-completed roles
Closes #6
小橘 <xiaoju@shazhou.work >
2026-05-06 05:27:14 +00:00
xiaoju
9a4cec2b2d
docs(rfc-001): WorkflowFn input → ThreadInput for fork/resume support
...
- First param is now { prompt, steps } instead of bare prompt
- steps: [] for new thread, pre-filled for fork/resume
- createRoleModerator naturally handles resume via moderator routing
- No special replay logic needed
小橘 <xiaoju@shazhou.work >
2026-05-06 05:25:00 +00:00
xiaoju
7582a88d6b
feat: Phase 2 — Thread lifecycle, execution engine, worker, CLI
...
- types.ts: START/END, RoleMeta, ThreadContext, Role, Moderator, WorkflowDefinition
- engine.ts: executeThread with JSONL persistence + AbortSignal
- worker.ts: per-bundle process, TCP IPC, kill individual threads
- CLI: run/ps/kill/threads/thread/thread rm commands
- 32 tests pass, biome clean
小橘 <xiaoju@shazhou.work >
2026-05-06 04:59:54 +00:00
xiaoju
01e930df8f
docs(rfc-001): add execution model — Role, Moderator, Agent types
...
Ported from nerve's workflow types. Covers ThreadContext, StartStep,
RoleStep, Moderator (pure router), Role (async actor), AgentFn (LLM adapter),
WorkflowDefinition, and execution flow.
小橘 <xiaoju@shazhou.work >
2026-05-06 04:41:52 +00:00
xiaoju
8939194133
init: bun workspace + RFC-001 workflow engine design
...
- @uncaged/workflow (core lib) + @uncaged/cli-workflow (CLI)
- RFC-001: full design doc covering storage, threading, CLI
小橘 <xiaoju@shazhou.work >
2026-05-06 04:20:05 +00:00