xiaoju
d1a0a135d4
feat: Phase 7 — CLI json-cas commands
...
- json-cas init/workflow register+show/thread show/node get+list+walk
- Nested subcommand dispatch under 'json-cas' group
- Default store: ~/.uncaged/workflow/json-cas/
- 15 tests passing, biome clean
Closes #304
小橘 <xiaoju@shazhou.work >
2026-05-18 03:04:36 +00:00
xiaoju
34e00bebdf
chore: switch json-cas deps from file: to npm ^0.1.0
...
小橘 <xiaoju@shazhou.work >
2026-05-18 02:49:49 +00:00
xiaoju
33cf23ed01
Merge pull request 'feat: Phase 5+6 — React layer + Agent model' ( #303 ) from feat/294-phase5-react-layer into main
2026-05-18 02:47:31 +00:00
xiaoju
94c719870f
feat: Phase 5 — React layer instrumentation
...
- json-cas-react-recorder.ts: writeReactSession stores full ReAct trace
- ReactTrace/ReactTurnTrace/ReactToolCallTrace types
- JsonCasAgentResult with optional react trace
- Engine integration: real react-session when trace provided, placeholder when null
- 10 new tests (29 total for json-cas engine), biome clean
Closes #301
小橘 <xiaoju@shazhou.work >
2026-05-18 02:47:18 +00:00
xiaoju
5af2d54e0f
Merge pull request 'feat: Phase 4 — json-cas engine migration' ( #300 ) from feat/294-phase4-engine-migration into main
2026-05-18 02:38:04 +00:00
xiaoju
e01c08dacb
feat: Phase 4 — json-cas engine (new engine alongside old)
...
- json-cas-engine.ts: new engine using json-cas Store + typed nodes
- json-cas-context.ts: build ThreadContext from thread-step chain
- json-cas-types.ts: engine types (JsonCasEngineIo, JsonCasAgentFn, etc.)
- thread-start/step/end/content nodes in json-cas format
- JSONata moderator via evaluateModerator
- react placeholder (Phase 5 will fill in)
- 21 tests passing, biome clean
Closes #299
小橘 <xiaoju@shazhou.work >
2026-05-18 02:37:05 +00:00
xiaoju
f9d3d38008
Merge pull request 'feat: Phase 3 — workflow JSON definitions in CAS' ( #298 ) from feat/294-phase3-workflow-json into main
2026-05-18 02:27:55 +00:00
xiaoju
9e99e58405
feat: Phase 3 — workflow JSON definitions in CAS
...
- New package: @uncaged/workflow-json-def
- registerWorkflow/loadWorkflow for CAS round-trip
- solve-issue and develop templates converted to pure JSON
- Zod schemas → JSON Schema, moderator → JSONata
- 30 tests passing, biome clean
Closes #297
小橘 <xiaoju@shazhou.work >
2026-05-18 02:24:52 +00:00
xiaoju
6af3059fb4
Merge pull request 'feat: JSONata moderator engine (Phase 2 of #294 )' ( #296 ) from feat/294-jsonata-moderator into main
2026-05-18 02:13:56 +00:00
xiaoju
dfeba9d8fc
feat: JSONata moderator engine (Phase 2 of #294 )
...
- evaluateModerator(rules, context) with JSONata expression evaluation
- Fallback (when: null), conditional branching, no-match → __end__
- Full develop workflow moderator ported to JSONata
- 31 tests passing
Closes #295
小橘 <xiaoju@shazhou.work >
2026-05-18 02:08:03 +00:00
xingyue
0da1aabfab
Merge pull request 'docs: add .cards/ architecture documentation' ( #293 ) from docs/architecture-cards into main
2026-05-17 07:40:09 +00:00
xiaoju
bb3618cc42
chore: remove _spec.md from cards (build artifact)
...
小橘 <xiaoju@shazhou.work >
2026-05-17 07:39:04 +00:00
xiaoju
2b21d981dd
docs: add .cards/ architecture documentation
...
12 interlinked architecture cards + index, covering:
- Core: Bundle, Thread, CAS, Registry
- Execution: Engine, Role, Agent Binding, Reactor
- Tooling: CLI, Dashboard, Package Map
- Authoring: Workflow Templates
小橘 <xiaoju@shazhou.work >
2026-05-17 07:34:02 +00:00
xiaomo
ebfb99bf4c
Merge pull request 'refactor: rename casRef to x-cas-ref for JSON Schema compliance (Phase 3)' ( #292 ) from feat/285-phase3-x-cas-ref into main
2026-05-16 11:55:24 +00:00
xiaoju
33f9425848
refactor: rename casRef to x-cas-ref for JSON Schema compliance
...
Rename .meta({ casRef: true }) to .meta({ 'x-cas-ref': true }) across
all schema annotations. Zod v4 toJSONSchema automatically outputs
x-cas-ref in the generated JSON Schema, so buildDescriptor preserves
the annotation without any code changes.
Add buildDescriptor test verifying x-cas-ref appears in descriptor
output for annotated fields and is absent for plain fields.
220 tests pass, 0 fail.
Fixes #291 , Refs #285
2026-05-16 11:52:17 +00:00
xiaomo
2b707fb44e
Merge pull request 'refactor: replace extractRefs with schema casRef annotations (Phase 2)' ( #290 ) from feat/285-phase2-remove-extractrefs into main
2026-05-16 11:50:47 +00:00
xiaoju
6306b23a9f
refactor: replace extractRefs with schema casRef annotations
...
Migrate all templates to use .meta({ casRef: true }) on Zod schema
fields instead of manual extractRefs functions. Remove extractRefs
from RoleDefinition type entirely.
- develop: planner phases[].hash, coder completedPhase annotated
- solve-issue, smoke, init templates: extractRefs removed
- create-workflow.ts: uses collectCasRefs(schema, meta)
- RoleDefinition: extractRefs field removed (breaking)
218 tests pass, 0 fail.
Fixes #289 , Refs #285
2026-05-16 10:48:45 +00:00
xiaomo
6bb8cf8315
Merge pull request 'feat: add collectCasRefs — schema-level CAS ref annotation (Phase 1)' ( #288 ) from feat/285-cas-ref-annotation into main
2026-05-16 10:43:16 +00:00
xiaoju
93b7947d7c
feat: add collectCasRefs — extract CAS refs from schema meta annotations
...
Replaces manual extractRefs functions with declarative schema-level
casRef annotations. Walks Zod v4 schemas recursively, collecting
string values from fields marked with .meta({ casRef: true }).
Supports: objects, arrays, discriminatedUnion, nullable/optional.
8/8 test cases pass (flat, nested, union, null, mixed).
Refs #285 , addresses #286
2026-05-16 10:42:24 +00:00
xingyue
9584a86fb7
Merge pull request 'chore: fix biome cognitive complexity warnings' ( #287 ) from chore/fix-biome-complexity-warnings into main
2026-05-16 10:40:27 +00:00
Scott Wei
defc0afc27
chore: fix biome cognitive complexity warnings
...
Refactor dashboard graph/schema helpers and descriptor role validation
into smaller functions so bun run check passes without warnings.
Co-authored-by: Cursor <cursoragent@cursor.com >
2026-05-16 18:33:00 +08:00
xiaomo
9f6633d5bf
Merge pull request 'refactor(workflow-protocol): require AgentFn Opt generic' ( #284 ) from refactor/agent-fn-required-opt into main
2026-05-16 10:27:07 +00:00
Scott Wei
7dadf874e1
refactor(workflow-protocol): require AgentFn Opt generic
...
Make AgentFn<Opt> always take a mandatory options argument, removing
the void conditional overload. Simplify createAgentAdapter, restore
exports needed by tests, and fix CLI test bundles to use cas.put
instead of disallowed @uncaged/* imports.
Co-authored-by: Cursor <cursoragent@cursor.com >
2026-05-16 18:23:07 +08:00
xiaomo
ba90214af6
Merge pull request 'chore: internalize unused exports across all packages' ( #283 ) from chore/audit-exports-cleanup into main
2026-05-16 09:59:57 +00:00
xiaoju
5bbac3e4f7
chore: internalize unused exports across all packages
...
Audit public API surfaces using reachability analysis from application
entry points (Worker, CLI, Dashboard). Symbols not reachable from any
application's customization tree are removed from package index.ts files.
Source files and internal usage are untouched — only the public export
surface is narrowed.
Changes by package:
- workflow-util: -7 exports (base32 internals, logger config types)
- workflow-cas: -12 exports (merkle internals, serialization details)
- workflow-execute: -24 exports (engine internals, LLM extract details)
- workflow-reactor: -4 exports (reactor config/invocation internals)
- workflow-register: -8 exports (redundant protocol re-exports, internal YAML fns)
- workflow-runtime: curated re-export subset (stop full protocol re-export)
- workflow-util-agent: -5 exports (internal agent helpers)
- workflow-agent-cursor: -1 export (validateCursorAgentConfig)
- workflow-agent-hermes: -1 export (validateHermesAgentConfig)
Note: workflow-protocol index.ts unchanged — downstream packages still
import removed symbols via internal paths. Protocol cleanup requires
updating workflow-runtime/src/types.ts first (separate PR).
Refs #273 , #274 , #275 , #276 , #277 , #278 , #279 , #280 , #281 , #282
2026-05-16 09:58:56 +00:00
xiaomo
131021b1a7
Merge pull request 'chore: remove symlink dead code' ( #271 ) from chore/remove-symlink-dead-code into main
2026-05-16 06:22:34 +00:00
xiaoju
e42555fd9c
chore: remove symlink dead code
...
Now that bundles are fully self-contained (no external @uncaged/* imports),
the symlink mechanism is no longer needed.
- Delete ensure-uncaged-workflow-symlink.ts
- Remove ensureUncagedWorkflowSymlink from all imports/exports
- Remove ExtractBundleExportsOptions type (storageRoot param)
- Simplify extractBundleExports to single-arg signature
- Clean up stale comments
2026-05-16 06:21:34 +00:00
xiaomo
3a26eb28e5
Merge pull request 'chore: make bundle fully self-contained, no external imports' ( #270 ) from chore/no-external-bundle into main
2026-05-16 06:16:28 +00:00
xiaoju
c1a17b707c
chore: make bundle fully self-contained, no external imports
...
- Remove uncagedWorkflowExternals() from scaffold build script
- Remove --external from Bun.build config
- Tighten bundle validator: only Node built-ins allowed, all deps must be inlined
- Update skill.ts documentation
Bundles are now deterministic — same Node/Bun version = same behavior,
no dependency resolution at runtime.
2026-05-16 05:12:49 +00:00
xiaoju
4ea1e0d8a4
chore: publish 0.5.0-alpha.4 — unified env() API
2026-05-15 10:19:38 +00:00
xiaoju
b1a9d2ec3f
refactor: replace requireEnv/optionalEnv with env(name, fallback)
...
Bundles must run without env vars — env vars are overrides, not requirements.
Single function: env(name, fallback) always returns string with a default.
- Removed requireEnv and optionalEnv
- Updated bundle entries, tests, and skill docs
小橘 🍊
2026-05-15 10:07:49 +00:00
xiaoju
2b8707a706
style: use optionalEnv fallback param instead of ?? operator
...
小橘 🍊
2026-05-15 09:52:07 +00:00
xiaoju
241bfbf6d9
fix: hardcode absolute paths for agent CLI defaults in bundle entry
...
Validator requires absolute paths — bare command names like 'cursor-agent'
fail validation. Use `which` to discover the path, write it directly.
小橘 🍊
2026-05-15 09:49:42 +00:00
xiaoju
40530d757e
fix: use optionalEnv with defaults for agent CLI paths in bundle entry
...
requireEnv causes silent worker crash when env vars are missing —
thread shows 0 steps with no error. Use optionalEnv + sensible defaults.
Also added pitfall guidance in skill author docs.
小橘 🍊
2026-05-15 09:25:39 +00:00
xiaoju
0f3661b566
refactor: unify GATEWAY_SECRET + DASHBOARD_API_KEY into WORKFLOW_DASHBOARD_SECRET
2026-05-15 09:12:12 +00:00
xingyue
9c44c709e9
fix(dashboard): replace broken partial-order layering with longest-path
...
The previous computeLayers used a reachability-based relation (a « b)
with depth tiebreaker to define a < b, then grouped nodes by == into
equivalence classes. However == is NOT an equivalence relation (fails
transitivity), making the grouping order-dependent and incorrect for
graphs with parallel branches.
Replace with standard Sugiyama longest-path layering:
1. DFS to detect and remove back-edges (break cycles)
2. Kahn's topological sort on the resulting DAG
3. rank(n) = max(rank(pred) + 1) for longest-path assignment
4. Group nodes by rank into layers
Also removes the experimental dagre layout strategy that was added
for comparison — longest-path produces better results for our
workflow graphs.
2026-05-15 14:48:02 +08:00
xingyue
8892ab9978
fix(dashboard): add left/right handles to end node for skip-forward edges
2026-05-15 14:15:35 +08:00
xingyue
7ec86d82a3
fix(dashboard): sidePath supports both feedback and skip-forward edges
2026-05-15 14:11:58 +08:00
xingyue
f728b36e8d
fix(dashboard): route skip-forward edges to side (planner→end was hidden)
2026-05-15 14:10:25 +08:00
xingyue
3431d3070b
refactor(dashboard): reachability-based partial order for graph layout
...
Replace linear spine walk with a proper partial order:
- a « b = a ~> b AND NOT b ~> a (strict precedence)
- a ~ b = incomparable under «
- depth tiebreaker for incomparable nodes
- Equivalent nodes (same layer) placed side-by-side horizontally
2026-05-15 14:05:53 +08:00
xingyue
576df067d4
chore: remove generated bundle from git, fix biome format
2026-05-15 09:42:33 +08:00
xingyue
a46a225d04
fix(dashboard): render system prompt as markdown
2026-05-15 09:41:52 +08:00
xiaoju
f74b482cc0
chore: version 0.5.0-alpha.3, add publish-all script
...
- scripts/publish-all.mjs: pins workspace:^ before npm publish, restores after
- Workaround for bun publish workspace:^ resolution bug in pre mode
小橘 🍊
2026-05-15 01:37:27 +00:00
xiaomo
89abfdc257
Merge pull request 'feat(dashboard): show system prompt per role' ( #269 ) from feat/show-system-prompt into main
2026-05-15 01:28:12 +00:00
xiaoju
77e395b913
chore: version 0.5.0-alpha.1
...
小橘 🍊
2026-05-15 01:27:54 +00:00
xingyue
b65a006d45
feat(dashboard): show system prompt per role in workflow detail
...
- Add systemPrompt to WorkflowRoleDescriptor (protocol)
- Propagate systemPrompt through buildDescriptor and validateWorkflowDescriptor
- Display system prompt as collapsible <details> in RoleCard
2026-05-15 09:27:03 +08:00
xiaomo
5994548f0b
Merge pull request 'chore: add .env.example with all supported env vars' ( #207 ) from chore/205-env-example into main
2026-05-15 01:25:10 +00:00
xiaoju
0871ae54ea
fix: remove unused WORKFLOW_LLM_API_KEY per review
...
No consumers after #262 removed llmProvider from bundle entries.
WORKFLOW_CURSOR_WORKSPACE has no env var counterpart, not added.
小橘 🍊
2026-05-15 01:24:29 +00:00
xiaoju
9576d69032
chore: enter changeset pre mode (alpha), version 0.5.0-alpha.0
...
小橘 🍊
2026-05-15 01:22:44 +00:00
xiaoju
64dadf114d
fix: align .env.example with actual env vars
...
- Remove non-existent: WORKFLOW_LLM_BASE_URL, WORKFLOW_LLM_MODEL, WORKFLOW_CURSOR_LLM_PROVIDER
- Add missing: WORKFLOW_CURSOR_COMMAND (required for develop workflow)
小橘 🍊
2026-05-15 01:20:38 +00:00