From d56ac6499cdab5a25a052b59d2d3795febd1a228 Mon Sep 17 00:00:00 2001 From: minorcell Date: Sat, 31 Jan 2026 00:25:54 +0800 Subject: [PATCH] refactor: restructure CI workflows and rename ui package to cli - Split CI into separate workflows: lint, test, and build - Rename packages/ui to packages/cli for clarity - Update documentation and dependencies --- .github/workflows/build.yml | 99 +++++++++++++++++++ .github/workflows/{ci.yml => lint.yml} | 13 ++- .github/workflows/test.yml | 69 +++++++++++++ CLAUDE.md | 6 +- bun.lock | 6 +- docs/future-plan.md | 2 +- docs/multi-turn.md | 4 +- package.json | 13 ++- packages/{ui => cli}/package.json | 2 +- packages/{ui => cli}/src/index.tsx | 0 packages/{ui => cli}/src/tui/App.tsx | 0 packages/{ui => cli}/src/tui/commands.ts | 0 .../tui/components/input/SuggestionList.tsx | 0 .../src/tui/components/layout/HeaderBar.tsx | 0 .../src/tui/components/layout/InputPrompt.tsx | 0 .../src/tui/components/layout/MainContent.tsx | 0 .../src/tui/components/layout/TokenBar.tsx | 0 .../components/messages/AssistantMessage.tsx | 0 .../components/messages/MarkdownMessage.tsx | 0 .../tui/components/messages/StatusMessage.tsx | 0 .../components/messages/SystemMessageView.tsx | 0 .../tui/components/messages/UserMessage.tsx | 0 .../src/tui/components/turns/StepView.tsx | 0 .../src/tui/components/turns/TurnView.tsx | 0 packages/{ui => cli}/src/tui/constants.ts | 0 packages/{ui => cli}/src/tui/slash/clear.ts | 0 packages/{ui => cli}/src/tui/slash/exit.ts | 0 packages/{ui => cli}/src/tui/slash/history.ts | 0 packages/{ui => cli}/src/tui/slash/index.ts | 0 packages/{ui => cli}/src/tui/slash/models.ts | 0 packages/{ui => cli}/src/tui/slash/types.ts | 0 packages/{ui => cli}/src/tui/types.ts | 0 packages/{ui => cli}/src/tui/utils.ts | 0 33 files changed, 193 insertions(+), 21 deletions(-) create mode 100644 .github/workflows/build.yml rename .github/workflows/{ci.yml => lint.yml} (63%) create mode 100644 .github/workflows/test.yml rename packages/{ui => cli}/package.json (94%) rename packages/{ui => cli}/src/index.tsx (100%) rename packages/{ui => cli}/src/tui/App.tsx (100%) rename packages/{ui => cli}/src/tui/commands.ts (100%) rename packages/{ui => cli}/src/tui/components/input/SuggestionList.tsx (100%) rename packages/{ui => cli}/src/tui/components/layout/HeaderBar.tsx (100%) rename packages/{ui => cli}/src/tui/components/layout/InputPrompt.tsx (100%) rename packages/{ui => cli}/src/tui/components/layout/MainContent.tsx (100%) rename packages/{ui => cli}/src/tui/components/layout/TokenBar.tsx (100%) rename packages/{ui => cli}/src/tui/components/messages/AssistantMessage.tsx (100%) rename packages/{ui => cli}/src/tui/components/messages/MarkdownMessage.tsx (100%) rename packages/{ui => cli}/src/tui/components/messages/StatusMessage.tsx (100%) rename packages/{ui => cli}/src/tui/components/messages/SystemMessageView.tsx (100%) rename packages/{ui => cli}/src/tui/components/messages/UserMessage.tsx (100%) rename packages/{ui => cli}/src/tui/components/turns/StepView.tsx (100%) rename packages/{ui => cli}/src/tui/components/turns/TurnView.tsx (100%) rename packages/{ui => cli}/src/tui/constants.ts (100%) rename packages/{ui => cli}/src/tui/slash/clear.ts (100%) rename packages/{ui => cli}/src/tui/slash/exit.ts (100%) rename packages/{ui => cli}/src/tui/slash/history.ts (100%) rename packages/{ui => cli}/src/tui/slash/index.ts (100%) rename packages/{ui => cli}/src/tui/slash/models.ts (100%) rename packages/{ui => cli}/src/tui/slash/types.ts (100%) rename packages/{ui => cli}/src/tui/types.ts (100%) rename packages/{ui => cli}/src/tui/utils.ts (100%) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..f83fc64 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,99 @@ +name: Build + +on: + push: + branches: [main, dev] + tags: ['v*'] + pull_request: + branches: [main, dev] + workflow_dispatch: + +jobs: + # 多平台二进制构建 + build-binary: + name: Build ${{ matrix.target }} + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + include: + # Linux builds + - os: ubuntu-latest + target: linux-x64 + artifact: memo-linux-x64 + - os: ubuntu-latest + target: linux-arm64 + artifact: memo-linux-arm64 + + # macOS builds + - os: macos-latest + target: darwin-x64 + artifact: memo-darwin-x64 + - os: macos-latest + target: darwin-arm64 + artifact: memo-darwin-arm64 + + # Windows build + - os: windows-latest + target: windows-x64 + artifact: memo-windows-x64.exe + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Bun + uses: oven-sh/setup-bun@v1 + + - name: Install ripgrep (Linux) + if: runner.os == 'Linux' + run: sudo apt-get update && sudo apt-get install -y ripgrep + + - name: Install ripgrep (macOS) + if: runner.os == 'macOS' + run: brew install ripgrep + + - name: Install ripgrep (Windows) + if: runner.os == 'Windows' + run: choco install ripgrep -y + + - name: Install dependencies + run: bun install + + - name: Build binary (Unix) + if: runner.os != 'Windows' + run: bun build packages/cli/src/index.tsx --target=bun --compile --outfile=${{ matrix.artifact }} + + - name: Build binary (Windows) + if: runner.os == 'Windows' + run: bun build packages/cli/src/index.tsx --target=bun --compile --outfile=${{ matrix.artifact }} + + - name: Test binary (Unix) + if: runner.os != 'Windows' + run: ./${{ matrix.artifact }} --help + + - name: Test binary (Windows) + if: runner.os == 'Windows' + run: .\${{ matrix.artifact }} --help + + - name: Upload artifact + uses: actions/upload-artifact@v4 + with: + name: ${{ matrix.artifact }} + path: ${{ matrix.artifact }} + retention-days: 7 + + # 汇总构建结果 + build-summary: + name: Build Summary + runs-on: ubuntu-latest + needs: build-binary + if: always() + steps: + - name: Check build status + run: | + echo "All builds completed" + if [ "${{ needs.build-binary.result }}" != "success" ]; then + echo "Some builds failed" + exit 1 + fi diff --git a/.github/workflows/ci.yml b/.github/workflows/lint.yml similarity index 63% rename from .github/workflows/ci.yml rename to .github/workflows/lint.yml index 6509455..ae9cba6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/lint.yml @@ -1,13 +1,15 @@ -name: CI +name: Lint on: push: branches: ['**'] pull_request: branches: ['**'] + workflow_dispatch: jobs: - test: + lint: + name: Code Quality Check runs-on: ubuntu-latest steps: - name: Checkout @@ -16,11 +18,8 @@ jobs: - name: Setup Bun uses: oven-sh/setup-bun@v1 - - name: Install ripgrep (for grep tool) - run: sudo apt-get update && sudo apt-get install -y ripgrep - - name: Install dependencies run: bun install - - name: Run tests - run: bun test + - name: Check code formatting + run: bun run format:check diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..fb5c160 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,69 @@ +name: Test + +on: + push: + branches: ['**'] + pull_request: + branches: ['**'] + workflow_dispatch: + +jobs: + # 测试各个包 (Linux only, 快速反馈) + test-packages: + name: Test @memo/${{ matrix.package }} + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + package: [core, tools, cli] + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Bun + uses: oven-sh/setup-bun@v1 + + - name: Install ripgrep + run: sudo apt-get update && sudo apt-get install -y ripgrep + + - name: Install dependencies + run: bun install + + - name: Run tests + run: bun run test:${{ matrix.package }} + + # 多平台集成测试 + test-integration: + name: Integration (${{ matrix.os }}) + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, macos-latest, windows-latest] + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Bun + uses: oven-sh/setup-bun@v1 + + - name: Install ripgrep (Linux) + if: runner.os == 'Linux' + run: sudo apt-get update && sudo apt-get install -y ripgrep + + - name: Install ripgrep (macOS) + if: runner.os == 'macOS' + run: brew install ripgrep + + - name: Install ripgrep (Windows) + if: runner.os == 'Windows' + run: choco install ripgrep -y + + - name: Install dependencies + run: bun install + + - name: Run all tests + run: bun run test:all + + - name: Test build + run: bun run build diff --git a/CLAUDE.md b/CLAUDE.md index dc58e28..6d799e8 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -21,7 +21,7 @@ memo-cli 是基于 Bun + TypeScript 的终端 ReAct Agent(monorepo 结构,~2 - 基于 MCP 协议,Zod 验证输入 - 统一导出为 `TOOLKIT` -- **packages/ui** (~170 行):CLI 交互层(REPL + `--once` 模式) +- **packages/cli** (~170 行):CLI 交互层(REPL + `--once` 模式) - **docs/**:架构文档(core.md、config-storage.md、tools/\*.md) @@ -105,7 +105,7 @@ bun run format # 代码格式化 bun run format:check # 检查格式 # 调试 -bun run packages/ui/src/index.tsx "问题" +bun run packages/cli/src/index.tsx "问题" ``` **环境变量**: @@ -168,7 +168,7 @@ main() → parseArgs() → ensureProviderConfig() ## 关键文件 -- `packages/ui/src/index.tsx` - 入口 +- `packages/cli/src/index.tsx` - 入口 - `packages/core/src/runtime/session.ts` - ReAct 核心 - `packages/core/src/utils/utils.ts` - JSON 解析 - `packages/core/src/config/config.ts` - 配置管理 diff --git a/bun.lock b/bun.lock index dd722a2..fc2b4ee 100644 --- a/bun.lock +++ b/bun.lock @@ -33,8 +33,8 @@ "zod": "^4.1.13", }, }, - "packages/ui": { - "name": "@memo/ui", + "packages/cli": { + "name": "@memo/cli", "dependencies": { "@memo/core": "workspace:*", "@memo/tools": "workspace:*", @@ -58,7 +58,7 @@ "@memo/tools": ["@memo/tools@workspace:packages/tools"], - "@memo/ui": ["@memo/ui@workspace:packages/ui"], + "@memo/cli": ["@memo/cli@workspace:packages/cli"], "@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.24.3", "https://registry.npmmirror.com/@modelcontextprotocol/sdk/-/sdk-1.24.3.tgz", { "dependencies": { "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-YgSHW29fuzKKAHTGe9zjNoo+yF8KaQPzDC2W9Pv41E7/57IfY+AMGJ/aDFlgTLcVVELoggKE4syABCE75u3NCw=="], diff --git a/docs/future-plan.md b/docs/future-plan.md index 3eea863..ab749e7 100644 --- a/docs/future-plan.md +++ b/docs/future-plan.md @@ -14,7 +14,7 @@ memo-cli 是一个基于 Bun + TypeScript 的 ReAct Agent CLI 工具,具有以 - `packages/core`:配置、运行时(Session/Turn)、LLM 适配、工具集装配 - `packages/tools`:内置工具实现与测试 -- `packages/ui`:CLI 入口,组装 Core + Tools +- `packages/cli`:CLI 入口,组装 Core + Tools - `docs/`:架构与设计文档 ## 2. 市场竞品对比 diff --git a/docs/multi-turn.md b/docs/multi-turn.md index 5faa814..535c86f 100644 --- a/docs/multi-turn.md +++ b/docs/multi-turn.md @@ -4,7 +4,7 @@ ## 背景与痛点 -- 当前 `packages/ui/src/index.tsx` 只接受一次问题,调用 `runAgent` 后直接退出,无法继续追问或补充上下文。 +- 当前 `packages/cli/src/index.tsx` 只接受一次问题,调用 `runAgent` 后直接退出,无法继续追问或补充上下文。 - 日志仅有 `history.xml`(旧方案)时无法按消息维度索引/分析;现统一写 JSONL。 - 缺少 Session/Turn 概念,无法区分同一进程内的多轮、或复盘某一轮的工具轨迹。 @@ -31,7 +31,7 @@ ## 运行模式与 CLI 行为 - **交互模式(默认)**: - - `bun start` 或 `bun run packages/ui/src/index.tsx` 启动 Session,打印 `sessionId`。 + - `bun start` 或 `bun run packages/cli/src/index.tsx` 启动 Session,打印 `sessionId`。 - 可选第一个问题来自 argv,其余问题从 stdin 读取;支持 `/exit`、`/help` 之类的指令退出或查看状态。 - 每个 Turn 结束后继续等待输入,直到用户退出或遇到致命错误。 - **一次性模式(`--once`)**: diff --git a/package.json b/package.json index 48edd99..4674600 100644 --- a/package.json +++ b/package.json @@ -3,11 +3,16 @@ "type": "module", "private": true, "scripts": { - "start": "bun run packages/ui/src/index.tsx", - "build": "bun build packages/ui/src/index.tsx --target bun --outdir dist --minify", - "build:binary": "bun build packages/ui/src/index.tsx --target=bun --compile --outfile=memo", + "start": "bun run packages/cli/src/index.tsx", + "build": "bun build packages/cli/src/index.tsx --target bun --outdir dist --minify", + "build:binary": "bun build packages/cli/src/index.tsx --target=bun --compile --outfile=memo", "format": "bunx prettier --write .", - "format:check": "bunx prettier --check ." + "format:check": "bunx prettier --check .", + "test": "bun test", + "test:core": "cd packages/core && bun test", + "test:tools": "cd packages/tools && bun test", + "test:cli": "cd packages/cli && bun test", + "test:all": "bun run test:core && bun run test:tools && bun run test:cli" }, "workspaces": [ "packages/*" diff --git a/packages/ui/package.json b/packages/cli/package.json similarity index 94% rename from packages/ui/package.json rename to packages/cli/package.json index ecf2a84..b4b9357 100644 --- a/packages/ui/package.json +++ b/packages/cli/package.json @@ -1,5 +1,5 @@ { - "name": "@memo/ui", + "name": "@memo/cli", "type": "module", "module": "src/index.tsx", "private": true, diff --git a/packages/ui/src/index.tsx b/packages/cli/src/index.tsx similarity index 100% rename from packages/ui/src/index.tsx rename to packages/cli/src/index.tsx diff --git a/packages/ui/src/tui/App.tsx b/packages/cli/src/tui/App.tsx similarity index 100% rename from packages/ui/src/tui/App.tsx rename to packages/cli/src/tui/App.tsx diff --git a/packages/ui/src/tui/commands.ts b/packages/cli/src/tui/commands.ts similarity index 100% rename from packages/ui/src/tui/commands.ts rename to packages/cli/src/tui/commands.ts diff --git a/packages/ui/src/tui/components/input/SuggestionList.tsx b/packages/cli/src/tui/components/input/SuggestionList.tsx similarity index 100% rename from packages/ui/src/tui/components/input/SuggestionList.tsx rename to packages/cli/src/tui/components/input/SuggestionList.tsx diff --git a/packages/ui/src/tui/components/layout/HeaderBar.tsx b/packages/cli/src/tui/components/layout/HeaderBar.tsx similarity index 100% rename from packages/ui/src/tui/components/layout/HeaderBar.tsx rename to packages/cli/src/tui/components/layout/HeaderBar.tsx diff --git a/packages/ui/src/tui/components/layout/InputPrompt.tsx b/packages/cli/src/tui/components/layout/InputPrompt.tsx similarity index 100% rename from packages/ui/src/tui/components/layout/InputPrompt.tsx rename to packages/cli/src/tui/components/layout/InputPrompt.tsx diff --git a/packages/ui/src/tui/components/layout/MainContent.tsx b/packages/cli/src/tui/components/layout/MainContent.tsx similarity index 100% rename from packages/ui/src/tui/components/layout/MainContent.tsx rename to packages/cli/src/tui/components/layout/MainContent.tsx diff --git a/packages/ui/src/tui/components/layout/TokenBar.tsx b/packages/cli/src/tui/components/layout/TokenBar.tsx similarity index 100% rename from packages/ui/src/tui/components/layout/TokenBar.tsx rename to packages/cli/src/tui/components/layout/TokenBar.tsx diff --git a/packages/ui/src/tui/components/messages/AssistantMessage.tsx b/packages/cli/src/tui/components/messages/AssistantMessage.tsx similarity index 100% rename from packages/ui/src/tui/components/messages/AssistantMessage.tsx rename to packages/cli/src/tui/components/messages/AssistantMessage.tsx diff --git a/packages/ui/src/tui/components/messages/MarkdownMessage.tsx b/packages/cli/src/tui/components/messages/MarkdownMessage.tsx similarity index 100% rename from packages/ui/src/tui/components/messages/MarkdownMessage.tsx rename to packages/cli/src/tui/components/messages/MarkdownMessage.tsx diff --git a/packages/ui/src/tui/components/messages/StatusMessage.tsx b/packages/cli/src/tui/components/messages/StatusMessage.tsx similarity index 100% rename from packages/ui/src/tui/components/messages/StatusMessage.tsx rename to packages/cli/src/tui/components/messages/StatusMessage.tsx diff --git a/packages/ui/src/tui/components/messages/SystemMessageView.tsx b/packages/cli/src/tui/components/messages/SystemMessageView.tsx similarity index 100% rename from packages/ui/src/tui/components/messages/SystemMessageView.tsx rename to packages/cli/src/tui/components/messages/SystemMessageView.tsx diff --git a/packages/ui/src/tui/components/messages/UserMessage.tsx b/packages/cli/src/tui/components/messages/UserMessage.tsx similarity index 100% rename from packages/ui/src/tui/components/messages/UserMessage.tsx rename to packages/cli/src/tui/components/messages/UserMessage.tsx diff --git a/packages/ui/src/tui/components/turns/StepView.tsx b/packages/cli/src/tui/components/turns/StepView.tsx similarity index 100% rename from packages/ui/src/tui/components/turns/StepView.tsx rename to packages/cli/src/tui/components/turns/StepView.tsx diff --git a/packages/ui/src/tui/components/turns/TurnView.tsx b/packages/cli/src/tui/components/turns/TurnView.tsx similarity index 100% rename from packages/ui/src/tui/components/turns/TurnView.tsx rename to packages/cli/src/tui/components/turns/TurnView.tsx diff --git a/packages/ui/src/tui/constants.ts b/packages/cli/src/tui/constants.ts similarity index 100% rename from packages/ui/src/tui/constants.ts rename to packages/cli/src/tui/constants.ts diff --git a/packages/ui/src/tui/slash/clear.ts b/packages/cli/src/tui/slash/clear.ts similarity index 100% rename from packages/ui/src/tui/slash/clear.ts rename to packages/cli/src/tui/slash/clear.ts diff --git a/packages/ui/src/tui/slash/exit.ts b/packages/cli/src/tui/slash/exit.ts similarity index 100% rename from packages/ui/src/tui/slash/exit.ts rename to packages/cli/src/tui/slash/exit.ts diff --git a/packages/ui/src/tui/slash/history.ts b/packages/cli/src/tui/slash/history.ts similarity index 100% rename from packages/ui/src/tui/slash/history.ts rename to packages/cli/src/tui/slash/history.ts diff --git a/packages/ui/src/tui/slash/index.ts b/packages/cli/src/tui/slash/index.ts similarity index 100% rename from packages/ui/src/tui/slash/index.ts rename to packages/cli/src/tui/slash/index.ts diff --git a/packages/ui/src/tui/slash/models.ts b/packages/cli/src/tui/slash/models.ts similarity index 100% rename from packages/ui/src/tui/slash/models.ts rename to packages/cli/src/tui/slash/models.ts diff --git a/packages/ui/src/tui/slash/types.ts b/packages/cli/src/tui/slash/types.ts similarity index 100% rename from packages/ui/src/tui/slash/types.ts rename to packages/cli/src/tui/slash/types.ts diff --git a/packages/ui/src/tui/types.ts b/packages/cli/src/tui/types.ts similarity index 100% rename from packages/ui/src/tui/types.ts rename to packages/cli/src/tui/types.ts diff --git a/packages/ui/src/tui/utils.ts b/packages/cli/src/tui/utils.ts similarity index 100% rename from packages/ui/src/tui/utils.ts rename to packages/cli/src/tui/utils.ts