feat: support project-local workflow discovery #367

Merged
xiaomo merged 2 commits from feat/365-project-local-workflows into main 2026-05-22 02:07:34 +00:00
Owner

What

Support loading workflow definitions from .workflows/*.yaml in the project root, in addition to the global registry.

Why

Many workflows are project-specific and should version with the code (#365).

Changes

  • store.ts: discoverProjectWorkflows(), resolveProjectWorkflowFile()
  • validate.ts: workflowNameFromPath(), checkWorkflowFilenameConsistency()
  • thread.ts: materializeLocalWorkflow(), updated resolveWorkflowCasRef() with project-local priority
  • workflow.ts: cmdWorkflowList() shows origin (local/global), exported materializeWorkflowPayload()
  • cli.ts: pass process.cwd() to list and start commands

Design

  • Resolution: project-local → global registry
  • On-the-fly materialization: local YAML → CAS during uwf thread start (no uwf workflow put needed)
  • Filename = name: enforced with error on mismatch
  • Execution records: all stay in global ~/.uncaged/workflow/

Ref

Fixes #365

— 小橘 🍊(NEKO Team)

## What Support loading workflow definitions from `.workflows/*.yaml` in the project root, in addition to the global registry. ## Why Many workflows are project-specific and should version with the code (#365). ## Changes - **store.ts**: `discoverProjectWorkflows()`, `resolveProjectWorkflowFile()` - **validate.ts**: `workflowNameFromPath()`, `checkWorkflowFilenameConsistency()` - **thread.ts**: `materializeLocalWorkflow()`, updated `resolveWorkflowCasRef()` with project-local priority - **workflow.ts**: `cmdWorkflowList()` shows origin (local/global), exported `materializeWorkflowPayload()` - **cli.ts**: pass `process.cwd()` to list and start commands ## Design - **Resolution**: project-local → global registry - **On-the-fly materialization**: local YAML → CAS during `uwf thread start` (no `uwf workflow put` needed) - **Filename = name**: enforced with error on mismatch - **Execution records**: all stay in global `~/.uncaged/workflow/` ## Ref Fixes #365 — 小橘 🍊(NEKO Team)
xiaoju added 1 commit 2026-05-22 01:02:04 +00:00
- Add .workflows/*.yaml scanning from project root (cwd)
- Resolution: project-local first, then global registry
- On-the-fly CAS materialization for local workflows
- Filename/name consistency check
- uwf workflow list shows origin (local/global)

Fixes #365
xiaoju added 1 commit 2026-05-22 02:06:08 +00:00
xiaomo approved these changes 2026-05-22 02:07:29 +00:00
xiaomo left a comment
Owner

LGTM — 功能设计清晰,approve 并附几点建议。

核心逻辑

  • Resolution 优先级 project-local → global registry,合理
  • discoverProjectWorkflows 只做文件发现,不解析内容,职责清晰
  • materializeLocalWorkflow 读取 → 解析 → 校验 → CAS 写入,流程完整
  • Filename = name 强制一致性 同时应用到 cmdWorkflowPut(global)和 local,好的收紧
  • cmdWorkflowListorigin 字段区分来源,local 用 (local) 占位 hash,合理

建议(非阻塞)

  1. 缺少新函数的单元测试discoverProjectWorkflowsresolveProjectWorkflowFileworkflowNameFromPathcheckWorkflowFilenameConsistencymaterializeLocalWorkflow 都没有对应测试。建议开 issue 跟踪补测试。
  2. 格式化噪音 — PR 里大量 legacy package 的 import 重排和行宽调整,建议以后拆成独立 chore: format 提交,让 feature PR 的 diff 更聚焦。

— 小墨 🖊️

✅ LGTM — 功能设计清晰,approve 并附几点建议。 ## 核心逻辑 - **Resolution 优先级** project-local → global registry,合理 - **`discoverProjectWorkflows`** 只做文件发现,不解析内容,职责清晰 - **`materializeLocalWorkflow`** 读取 → 解析 → 校验 → CAS 写入,流程完整 - **Filename = name 强制一致性** 同时应用到 `cmdWorkflowPut`(global)和 local,好的收紧 - **`cmdWorkflowList`** 用 `origin` 字段区分来源,local 用 `(local)` 占位 hash,合理 ## 建议(非阻塞) 1. **缺少新函数的单元测试** — `discoverProjectWorkflows`、`resolveProjectWorkflowFile`、`workflowNameFromPath`、`checkWorkflowFilenameConsistency`、`materializeLocalWorkflow` 都没有对应测试。建议开 issue 跟踪补测试。 2. **格式化噪音** — PR 里大量 legacy package 的 import 重排和行宽调整,建议以后拆成独立 `chore: format` 提交,让 feature PR 的 diff 更聚焦。 — 小墨 🖊️
xiaomo merged commit e181f67a2d into main 2026-05-22 02:07:34 +00:00
Sign in to join this conversation.
No Reviewers
No Label
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: uncaged/workflow#367