Skip to content

Commit 0acff9c

Browse files
authored
Merge pull request #117 from itmisx/feature/workflow
✨ workflow
2 parents c9b5fd8 + 317da0c commit 0acff9c

40 files changed

Lines changed: 4029 additions & 187 deletions

README.en.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
- **📎 `@` file / directory reference** — type `@` in the input to open a local fuzzy path picker; selecting inserts `@path` into the message, then the model fetches it on demand via Read (file) / List (directory). Precise context — no need to stuff everything in.
2929
- **🧠 Dual-model auto-routing** — flash for cheap iteration, auto-escalates to pro for hard work; pin a model with `/model flash|pro` or switch mode with `/auto` `/plan` `/review`.
3030
- **🗂️ Sequential Todo + concurrent Plan DAG** — step through a visible checklist for multi-step work; fan out independent subtasks to concurrent sub-agents.
31+
- **🔁 Reusable Workflows** — pin a repeatable multi-agent process as a JS script (`agent()` / `parallel()` / `pipeline()`): multi-perspective review, fan-out research, pipelines, loop-until-dry. `/ultracode <desc>` makes the model generate & save one, `/workflow <name>` runs it. True concurrency, resumable on interrupt, structured output enforced via a tool, all phases shown up front with live timing. Compatible with Claude Code's workflow-script convention — scripts interchange directly.
3132
- **💾 Lossless session persistence** — gob preserves `tool_calls` / tool results / `reasoning_content`, so restarts resume seamlessly; auto layered compaction when the window fills.
3233
- **🔌 MCP + skill ecosystem** — native MCP; compatible with Claude's skill directories, reuse what you have.
3334
- **🛡️ Review mode** — file writes / shell run behind human confirmation by default.
@@ -239,6 +240,7 @@ A built-in symbol-graph engine lets the model do symbol-level navigation + call-
239240
| `/web-config` | popup to set the web dashboard bind IP & port (enter "IP [port]", space-separated; IP empty/`127.0.0.1` = local only, `0.0.0.0` = LAN access for phone/tablet, port optional = random). Saves and takes effect immediately (no restart) and shows the new URL; config lives in the session's `meta.json`, and the access token is fixed per session and stable across restarts. ⚠️ The panel can control the session and run commands over plain HTTP — expose it only on trusted LANs |
240241
| `/sandbox` | sandbox mode: `off` / `native` (default, OS isolation: macOS Seatbelt, Linux bubblewrap — writes confined to the workspace + process isolation; falls back to a soft-policy blacklist where no OS mechanism is available) / `docker` (container isolation, `/sandbox docker <image>`) |
241242
| `/working-mode` | working mode (methodology): `karpathy` (default, pragmatic) / `openspec` (spec-driven) / `superpowers` (rigorous full workflow); pick via popup, or `/working-mode kp\|spec\|sp` to switch directly. The three modes are mutually exclusive — selecting one disables the other two's skills, preventing methodology mixing. Persisted per session, injected each turn without polluting history |
243+
| `/ultracode` `/workflow` `/workflows` | Workflows (JS multi-agent orchestration): `/ultracode <desc>` makes the model generate & save one, `/workflow <name> [k=v]` runs it (confirm before run), `/workflows` lists them |
242244
| `/lang` | switch UI language (zh / en) |
243245
| `/mcp-list` `/mcp-add` `/mcp-delete` | manage MCP servers |
244246
| `/skills` `/config` `/mode` | list skills / reconfigure key / show mode |

README.ja.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
- **📎 `@` ファイル / ディレクトリ参照** —— 入力欄で `@` を打つとローカルのファジー検索パスピッカーが開く。選択すると `@パス` がメッセージに挿入され、モデルは必要に応じて Read(ファイル)/ List(ディレクトリ)を呼ぶ。コンテキストを精密に渡せて、全部詰め込まなくて済む。
2929
- **🧠 デュアルモデル自動ルーティング** —— 軽い処理は flash、複雑なタスクは自動で pro に昇格。`/model flash|pro` でモデル固定、`/auto` `/plan` `/review` でモード切替も可能。
3030
- **🗂️ 逐次 Todo + 並列 Plan DAG** —— 多段階タスクは可視チェックリストで一歩ずつ。独立した並列タスクは DAG に分解してサブエージェントを並列実行。
31+
- **🔁 再利用可能な Workflow** —— 繰り返し実行する複数エージェントのフローを JS スクリプトで固定化(`agent()` / `parallel()` / `pipeline()`):多視点レビュー、ファンアウト調査、パイプライン、空になるまでループなど。`/ultracode <説明>` でモデルが自動生成・保存、`/workflow <名前>` で実行。真の並列・中断後 resume・構造化出力はツールで強制・実行前に全フェーズを表示し所要時間をリアルタイム表示。Claude Code の workflow スクリプト規約に準拠し、スクリプトはそのまま相互利用可能。
3132
- **💾 ロスレスなセッション永続化** —— gob が `tool_calls` / ツール結果 / `reasoning_content` を完全保持し、再起動後もシームレスに継続。ウィンドウが埋まると自動で階層圧縮。
3233
- **🔌 MCP + Skill エコシステム** —— MCP ネイティブ対応。Claude の skill ディレクトリと互換で、既存の skill をそのまま再利用。
3334
- **🛡️ レビューモード** —— ファイル書き込み / Shell 実行はデフォルトで人間の確認を要求。
@@ -239,6 +240,7 @@ CreatePlan
239240
| `/web-config` | web パネルのバインド IP とポートをポップアップで設定(「IP [ポート]」を空白区切りで入力;IP 空欄/`127.0.0.1`=ローカルのみ、`0.0.0.0`=LAN でスマホ/タブレットからアクセス可、ポート省略=ランダム)。保存すると再起動なしで即時反映され新しい URL を表示;設定はセッションの `meta.json` に保存、アクセストークンはセッションごとに固定で再起動後も不変。⚠️ このパネルはセッションを操作しコマンドを実行でき、かつ平文 HTTP — 外部公開は信頼できる LAN のみ |
240241
| `/sandbox` | サンドボックス:`off`(無効)/ `native`(既定、OS 隔離:macOS は Seatbelt、Linux は bubblewrap — 書き込みを workspace に限定 + プロセス隔離;OS 機構が無い環境ではソフトポリシーのブラックリストにフォールバック)/ `docker`(コンテナ隔離、`/sandbox docker <image>`|
241242
| `/working-mode` | 作業モード(方法論):`karpathy`(既定、実用重視)/ `openspec`(仕様駆動)/ `superpowers`(全工程を厳格に);ポップアップで選択、または `/working-mode kp\|spec\|sp` で直接切替。3 モードは排他的で、1 つ選ぶと他 2 つの skill を無効化し方法論の混在を防ぐ。セッションに保存され、毎ターン履歴を汚さずプロンプトを注入 |
243+
| `/ultracode` `/workflow` `/workflows` | Workflow(JS マルチエージェント編成):`/ultracode <説明>` でモデルが生成・保存、`/workflow <名前> [k=v]` で実行(実行前に確認)、`/workflows` で一覧 |
242244
| `/lang` | UI 言語切替(中 / 英) |
243245
| `/mcp-list` `/mcp-add` `/mcp-delete` | MCP サーバー管理 |
244246
| `/skills` `/config` `/mode` | skill 一覧 / key 再設定 / モード表示 |

README.ko.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
- **📎 `@` 파일/디렉터리 참조** —— 입력창에 `@` 입력 시 로컬 퍼지 경로 선택기가 열림. 선택하면 `@경로`가 메시지에 삽입되고 모델이 필요에 따라 Read(파일)/ List(디렉터리)를 호출. 정확한 컨텍스트 제공, 전부 욱여넣을 필요 없음.
2929
- **🧠 듀얼 모델 자동 라우팅** —— 가벼운 작업은 flash, 복잡한 작업은 자동으로 pro 승격. `/model flash|pro`로 모델 고정, `/auto` `/plan` `/review`로 모드 전환도 가능.
3030
- **🗂️ 순차 Todo + 병렬 Plan DAG** —— 다단계 작업은 보이는 체크리스트로 한 단계씩. 독립적인 병렬 작업은 DAG로 분해해 서브 에이전트를 병렬 실행.
31+
- **🔁 재사용 가능한 Workflow** —— 반복 실행하는 멀티 에이전트 흐름을 JS 스크립트로 고정(`agent()` / `parallel()` / `pipeline()`): 다관점 리뷰, 팬아웃 리서치, 파이프라인, 빌 때까지 루프 등. `/ultracode <설명>`으로 모델이 자동 생성·저장, `/workflow <이름>`으로 실행. 진짜 병렬·중단 후 resume·구조화 출력은 도구로 강제·실행 전 모든 단계 표시 및 소요 시간 실시간 표시. Claude Code 의 workflow 스크립트 규약과 호환되어 스크립트를 그대로 상호 사용 가능.
3132
- **💾 무손실 세션 영속화** —— gob가 `tool_calls` / 도구 결과 / `reasoning_content`를 완전 보존해 재시작 후에도 매끄럽게 이어감. 윈도가 차면 자동 계층 압축.
3233
- **🔌 MCP + Skill 생태계** —— MCP 네이티브 지원. Claude의 skill 디렉터리와 호환되어 기존 skill을 그대로 재사용.
3334
- **🛡️ 검토 모드** —— 파일 쓰기 / Shell 실행은 기본적으로 사람의 확인을 요구.
@@ -239,6 +240,7 @@ CreatePlan
239240
| `/web-config` | 웹 대시보드 바인드 IP·포트를 팝업으로 설정("IP [포트]"를 공백으로 구분 입력; IP 비움/`127.0.0.1`=로컬 전용, `0.0.0.0`=LAN에서 휴대폰/태블릿 접속 가능, 포트 생략=랜덤). 저장 즉시 재시작 없이 적용되고 새 주소를 표시; 설정은 세션의 `meta.json`에 저장되며 접근 토큰은 세션별로 고정되어 재시작 후에도 동일. ⚠️ 이 패널은 세션을 제어하고 명령을 실행할 수 있으며 평문 HTTP이므로 신뢰할 수 있는 LAN에서만 노출하세요 |
240241
| `/sandbox` | 샌드박스: `off`(끄기) / `native`(기본, OS 격리: macOS Seatbelt, Linux bubblewrap — 쓰기를 workspace로 제한 + 프로세스 격리; OS 메커니즘이 없는 플랫폼은 소프트 정책 블랙리스트로 폴백) / `docker`(컨테이너 격리, `/sandbox docker <image>`) | / `native`(기본, OS 격리: macOS Seatbelt, Linux bubblewrap — 쓰기를 workspace로 제한 + 프로세스 격리; OS 메커니즘이 없는 플랫폼은 소프트 정책 블랙리스트로 폴백) / `docker`(컨테이너 격리, `/sandbox docker <image>`) |
241242
| `/working-mode` | 작업 모드(방법론): `karpathy`(기본, 실용주의) / `openspec`(스펙 주도) / `superpowers`(전체 워크플로 엄격); 팝업으로 선택하거나 `/working-mode kp\|spec\|sp`로 직접 전환. 세 모드는 상호 배타적 — 하나를 선택하면 나머지 두 개의 skill을 비활성화해 방법론 혼용을 방지. 세션에 저장되며 매 턴 히스토리를 오염시키지 않고 프롬프트 주입 |
243+
| `/ultracode` `/workflow` `/workflows` | Workflow(JS 멀티 에이전트 편성): `/ultracode <설명>`으로 모델이 생성·저장, `/workflow <이름> [k=v]`으로 실행(실행 전 확인), `/workflows`로 목록 |
242244
| `/lang` | UI 언어 전환(중 / 영) |
243245
| `/mcp-list` `/mcp-add` `/mcp-delete` | MCP 서버 관리 |
244246
| `/skills` `/config` `/mode` | skill 목록 / key 재설정 / 모드 표시 |

README.md

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
- **📎 `@` 文件 / 目录引用** —— 输入框打 `@` 弹本地模糊路径选择器,选中即把 `@路径` 塞进消息;模型按需调 Read(文件)/ List(目录),精准给上下文不用全塞。
2929
- **🧠 双模型自动路由** —— flash 起手省钱,复杂任务自动升 pro;也可用 `/model flash|pro` 锁定模型、`/auto` `/plan` `/review` 切模式。
3030
- **🗂️ 顺序 Todo + 并发 Plan DAG** —— 多步任务用可见待办清单逐步勾选;可并行的独立子任务拆成 DAG 派并发子 agent。
31+
- **🔁 可复用 Workflow** —— 用 JS 脚本把多 agent 流程固化下来反复跑(`agent()` / `parallel()` / `pipeline()`):多视角审查、扇出研究、流水线、循环到无新增等。`/ultracode <描述>` 让模型自动生成并保存,`/workflow <名>` 运行;真并发、可中断 resume、结构化输出走工具强约束、运行前预列全部阶段并实时显示耗时。对齐 Claude Code 的 workflow 脚本约定,脚本可直接互用。
3132
- **💾 无损会话持久化** —— gob 完整保留 `tool_calls` / `tool results` / `reasoning_content`,重启无缝续接;超窗自动分层压缩。
3233
- **🔌 MCP + Skill 生态** —— 原生 MCP;兼容 Claude 的 skill 目录,已有 skill 直接复用。
3334
- **🛡️ 审核模式** —— 写文件 / 执行 Shell 默认需人工确认,安全可控。
@@ -164,10 +165,11 @@ deepx exec "把 README 的功能列表翻译成英文,写到 README.en.md"
164165
</details>
165166

166167
<details>
167-
<summary><b>任务规划:Todo(顺序)vs Plan DAG(并发)</b></summary>
168+
<summary><b>任务规划:Todo(顺序)vs Plan DAG(并发)vs Workflow(可复用脚本)</b></summary>
168169

169-
- **Todo** —— 多步、强顺序、强上下文的任务(如从零搭一个应用):模型用可见待办清单列出步骤、逐项勾选,自己一步步执行,给你实时进度。
170-
- **CreatePlan(Plan DAG)** —— 真正可并行、彼此独立的扇出任务:拆成 DAG,按依赖关系派并发子 agent,每个节点独立选 flash / pro,最后汇总。
170+
- **Todo** —— 多步、强顺序、强上下文的任务(如从零搭一个应用):模型用可见待办清单列出步骤、逐项勾选,自己一步步执行,给你实时进度。
171+
- **CreatePlan(Plan DAG)** —— 当下这一轮里真正可并行、彼此独立的扇出任务:拆成 DAG,按依赖关系派并发子 agent,每个节点独立选 flash / pro,最后汇总。
172+
- **Workflow(可复用脚本)** —— 把一套**会重复跑**的多 agent 流程固化成 JS 脚本(`agent()` / `parallel()` / `pipeline()` / `phase()`),存进 `.deepx/workflows/` 反复用。和上面两者的区别:Todo/Plan 是模型每轮临时规划;Workflow 是事先写定、可复用、可中断 resume 的固定流程。`/ultracode <描述>` 自动生成,`/workflow <名>` 运行。
171173

172174
```
173175
CreatePlan
@@ -244,6 +246,7 @@ CreatePlan
244246
| `/web-config` | 弹窗设置 web 面板绑定 IP 与端口(填「IP [端口]」,空格分隔;IP 留空/`127.0.0.1`=仅本机,`0.0.0.0`=局域网手机/平板可访问,端口可省=随机)。保存即热生效并显示新地址,无需重启;配置存入会话 `meta.json`,访问令牌按会话固定、跨重启不变。⚠️ 该面板可控制会话、执行命令,且为明文 HTTP,对外暴露仅限可信局域网 |
245247
| `/sandbox` | 沙箱模式:`off`(关闭)/ `native`(默认,OS 隔离:macOS Seatbelt、Linux bubblewrap,写操作限定在 workspace + 进程隔离;无 OS 机制的平台退回软策略黑名单)/ `docker`(容器隔离,`/sandbox docker <镜像>`|
246248
| `/working-mode` | 工作模式(方法论):`karpathy`(默认,务实工匠)/ `openspec`(规格驱动)/ `superpowers`(全流程严谨);弹窗选择,也可 `/working-mode kp\|spec\|sp` 直切。三种模式互斥——选中一种会禁用另外两种对应的 skill,避免方法论混搭。切换后存入会话,每轮自动注入提示且不污染历史 |
249+
| `/ultracode` `/workflow` `/workflows` | workflow(JS 多 agent 编排):`/ultracode <描述>` 让模型生成并保存一个 workflow,`/workflow <名> [k=v]` 运行(运行前需确认),`/workflows` 列出已有 |
247250
| `/lang` | 切换界面语言(中 / 英) |
248251
| `/mcp-list` `/mcp-add` `/mcp-delete` | 管理 MCP server |
249252
| `/skills` `/config` `/mode` | 列出 skill / 重配 key / 查看模式 |

agent/llm.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -698,9 +698,10 @@ func StartStream(
698698
// - SwitchModel → 改本轮 currentEntry / role,通过 ModelSwitchMsg 通知 UI
699699
// 拦截后仍要给 LLM 一个 fake tool result,让 OpenAI 工具循环能正常推进。
700700
for _, tc := range toolCalls {
701-
// review 模式:对 Write/Update/Bash 发起审核
701+
// review 模式:对 Write/Update/Bash 发起审核。
702+
// Workflow(run) 无论何种模式都强制确认:它会执行模型生成的脚本(进而派子 agent)。
702703
var reviewCh chan bool
703-
if mode == AgentMode_Review && isReviewable(tc.Function.Name) {
704+
if (mode == AgentMode_Review && isReviewable(tc.Function.Name)) || isWorkflowRun(tc) {
704705
reviewCh = make(chan bool, 1)
705706
}
706707
ch <- ToolCallStartMsg{Name: tc.Function.Name, Args: tc.Function.Arguments, ReviewCh: reviewCh}
@@ -760,6 +761,10 @@ func StartStream(
760761
Success: true,
761762
}
762763
}
764+
case "Workflow":
765+
// 创建/运行/列出 workflow。run 已在上方经 reviewCh 确认;run 期间的进度
766+
// 经 ch 以 TokenMsg 流式呈现,结果回给模型续写总结。
767+
result = handleWorkflowTool(ctx, tc, models, mode, workspace, skillCatalog, ch)
763768
case "CreatePlan":
764769
plans, perr := parseCreatePlanArgs(tc.Function.Arguments)
765770
if perr != nil {

agent/planner.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"encoding/json"
55
"fmt"
66
"strings"
7+
"time"
78
)
89

910
// PlanStatus 是 plan/task 在生命周期里的状态。UI 用 statusIcon 渲染成符号。
@@ -27,6 +28,11 @@ type PlanItem struct {
2728
// 运行时字段 — LLM 看不到,deepx 内部状态机驱动
2829
Status PlanStatus `json:"-"`
2930
Summary string `json:"-"`
31+
Phase string `json:"-"` // workflow 用:所属阶段名,渲染时据此分组(CreatePlan 留空 → 平铺)
32+
33+
// workflow 用:子 agent 计时(Go 侧计时,不入 journal、不影响 resume)。
34+
StartedAt time.Time `json:"-"` // 开跑时刻(start 时记)
35+
Elapsed time.Duration `json:"-"` // 完成耗时(finish 时 = now-StartedAt);>0 才显示
3036
}
3137

3238
// === TUI 事件 ===
@@ -38,6 +44,9 @@ type PlanItem struct {
3844
type PlanCreatedMsg struct {
3945
Plans []PlanItem
4046
Kind string
47+
// Phases 是 workflow 声明的全部阶段名(meta.phases,声明顺序)。非空时 UI 在运行前就把所有阶段
48+
// 当成清单展示出来,逐步点亮;各步骤(agent)动态产生,运行到才出现在所属阶段下。CreatePlan/Todo 为空。
49+
Phases []string
4150
}
4251

4352
// TaskStatusMsg 通知 TUI: 某个 plan 节点的状态变了。

0 commit comments

Comments
 (0)