Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
e1f1116
chore: establish harness engineering standard (Phase 1 — 仓库入口归一) (#124)
dev01lay2 Mar 16, 2026
3965880
chore: harness engineering Phase 2 — 验证与流程归一 (#125)
dev01lay2 Mar 16, 2026
da7e3d2
refactor: extract commands/mod.rs into domain submodules
dev01lay2 Mar 16, 2026
8f17a07
style: cargo fmt --all
dev01lay2 Mar 16, 2026
af051e0
fix: add missing use super::* imports to extracted modules
dev01lay2 Mar 16, 2026
c6ce937
Merge pull request #126 from lay2dev/chore/harness-phase3
dev01lay2 Mar 16, 2026
98c5abd
chore: add architecture docs, CODEOWNERS (Phase 3b + Phase 4 partial)
dev01lay2 Mar 16, 2026
0bdaeae
chore: complete remaining Phase 3 + Phase 4 items
dev01lay2 Mar 16, 2026
382eb9f
chore: remove CODEOWNERS (unnecessary for current team size)
dev01lay2 Mar 16, 2026
9f81447
Merge pull request #127 from lay2dev/chore/harness-phase3b
dev01lay2 Mar 16, 2026
73d316d
perf: optimize Home page data loading — parallel requests, unified po…
dev01lay2 Mar 17, 2026
05c92fb
chore: add metrics framework, instrumentation, and CI gates (#136)
dev01lay2 Mar 18, 2026
1f039de
refactor: reduce commands/mod.rs from 8,869 to 230 lines (#137)
dev01lay2 Mar 18, 2026
5d6b568
feat: UI screenshot harness — automated visual acceptance for every P…
dev01lay2 Mar 18, 2026
50db11b
chore: optimize metrics framework and codebase readability (#140)
dev01lay2 Mar 19, 2026
e912222
fix: replace mock IPC with real SSH bridge for Home render probes (#141)
dev01lay2 Mar 19, 2026
ba37742
fix(ci): support fork PR workflows (skip write-back steps for externa…
dev01lay2 Mar 19, 2026
12b6a0c
fix(ci): post coverage/metrics comments on fork PRs via workflow_run
dev01lay2 Mar 19, 2026
242e262
fix(ci): handle missing artifacts in fork-pr-comment workflow
dev01lay2 Mar 19, 2026
648db50
fix: fall back to github.repository/ref for workflow_dispatch in scre…
dev01lay2 Mar 19, 2026
45463b1
fix(ci): save screenshots before orphan checkout clears worktree
dev01lay2 Mar 19, 2026
8528c0e
chore: add local CI scripts, metrics gate, and pre-commit hook (#144)
dev01lay2 Mar 19, 2026
6eb41b5
feat: reimplement stream-based session and backup loading (#145)
Keith-CY Mar 19, 2026
d3d26ad
chore: add lefthook for automatic pre-commit hook installation (#146)
dev01lay2 Mar 20, 2026
8fd0640
feat: add recipe coming soon nav placeholder (#154)
Keith-CY Mar 23, 2026
28fec55
feat(ssh): add exec_streaming for bounded-memory remote session analy…
dev01lay2 Mar 24, 2026
379ada8
fix: flatten Context page nesting and fix session loading state (#156)
dev01lay2 Mar 24, 2026
67152b3
fix: separate guild/channel resolution warnings and clear on cache hi…
dev01lay2 Mar 24, 2026
a188a51
fix(security): proxy Discord API calls through SSH to keep bot token …
dev01lay2 Mar 26, 2026
66e7038
fix: prevent Apply stuck state on gateway restart timeout (#160)
dev01lay2 Mar 27, 2026
47acbe5
feat: move profile sync to Profiles page with selectable devices (#161)
dev01lay2 Mar 31, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
31 changes: 31 additions & 0 deletions .github/ISSUE_TEMPLATE/bug_report.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
---
name: Bug Report
about: 报告一个 bug
title: 'bug: '
labels: bug
assignees: ''
---

## 描述

<!-- 简要描述 bug -->

## 复现步骤

1.
2.
3.

## 期望行为

## 实际行为

## 环境

- OS:
- ClawPal 版本:
- OpenClaw 版本:

## 截图/日志

<!-- 如有 -->
19 changes: 19 additions & 0 deletions .github/ISSUE_TEMPLATE/feature_request.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
---
name: Feature Request
about: 提出一个新功能
title: 'feat: '
labels: enhancement
assignees: ''
---

## 描述

<!-- 你希望实现什么功能? -->

## 动机

<!-- 为什么需要这个功能?解决什么问题? -->

## 方案建议

<!-- 你认为怎么实现比较好?(可选) -->
25 changes: 25 additions & 0 deletions .github/ISSUE_TEMPLATE/task.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
---
name: Task
about: 工程任务(重构、文档、工具链等)
title: 'chore: '
labels: chore
assignees: ''
---

## 目标

## 非目标

## 背景

## 影响范围

## 约束条件

## 执行步骤

- [ ]

## 验收标准

## 风险与回滚
23 changes: 23 additions & 0 deletions .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
## 目标

<!-- 这个 PR 做了什么?为什么? -->

## 影响范围

<!-- 哪些模块/文件受影响? -->

## 验证方式

<!-- 怎么验证这个改动是正确的? -->

## 验证证据

<!-- 附上测试输出、截图、日志等 -->

- [ ] CI 全部通过
- [ ] 涉及 UI 改动已附截图
- [ ] 涉及权限/安全改动已附 capability 变更说明

## 风险与回滚

<!-- 这个改动有什么风险?如何回滚? -->
4 changes: 4 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -73,3 +73,7 @@ jobs:
- name: Run tests
run: cargo test -p clawpal-core
working-directory: src-tauri

- name: Run perf metrics tests
run: cargo test -p clawpal --test perf_metrics -- --nocapture
working-directory: src-tauri
12 changes: 12 additions & 0 deletions .github/workflows/coverage.yml
Original file line number Diff line number Diff line change
Expand Up @@ -113,18 +113,30 @@ jobs:
f.write('body<<EOF\n')
f.write(body + '\n')
f.write('EOF\n')

with open('/tmp/coverage_comment.md', 'w') as f:
f.write(body)
PYEOF

- name: Save comment as artifact (for fork PRs)
uses: actions/upload-artifact@v4
with:
name: coverage-comment
path: /tmp/coverage_comment.md
retention-days: 1

- name: Find existing comment
uses: peter-evans/find-comment@v3
id: fc
if: github.event.pull_request.head.repo.full_name == github.repository
with:
issue-number: ${{ github.event.pull_request.number }}
comment-author: 'github-actions[bot]'
body-includes: '<!-- pr-coverage-bot -->'

- name: Create or update comment
uses: peter-evans/create-or-update-comment@v4
if: github.event.pull_request.head.repo.full_name == github.repository
with:
comment-id: ${{ steps.fc.outputs.comment-id }}
issue-number: ${{ github.event.pull_request.number }}
Expand Down
25 changes: 25 additions & 0 deletions .github/workflows/deploy-site.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
name: Deploy Site

on:
push:
branches: [main]
paths:
- 'docs/site/**'
workflow_dispatch:

jobs:
deploy:
runs-on: ubuntu-latest
permissions:
contents: read
deployments: write
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Deploy to Cloudflare Pages
uses: cloudflare/wrangler-action@v3
with:
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
command: pages deploy docs/site --project-name=clawpal
41 changes: 41 additions & 0 deletions .github/workflows/e2e.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,58 @@ on:
branches:
- main
- develop
- feat/recipe
pull_request:
branches:
- main
- develop
- feat/recipe

concurrency:
group: e2e-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

jobs:
recipe-docker-e2e:
name: Docker Recipe E2E
runs-on: ubuntu-latest
timeout-minutes: 25
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Install system dependencies
run: |
sudo apt-get update
sudo apt-get install -y \
libwebkit2gtk-4.1-dev \
libappindicator3-dev \
librsvg2-dev \
patchelf \
libssl-dev \
libgtk-3-dev \
libsoup-3.0-dev \
libjavascriptcoregtk-4.1-dev

- name: Setup Rust
uses: dtolnay/rust-toolchain@stable

- name: Cache Rust dependencies
uses: Swatinem/rust-cache@v2
with:
workspaces: src-tauri

- name: Verify Docker is available
run: docker info

- name: Run recipe docker e2e
env:
CLAWPAL_RUN_DOCKER_RECIPE_E2E: "1"
run: cargo test -p clawpal --test recipe_docker_e2e -- --nocapture --test-threads=1
working-directory: src-tauri

profile-e2e:
name: Provider Auth E2E
runs-on: ubuntu-latest
environment: ${{ (github.base_ref == 'main' || github.ref == 'refs/heads/main') && 'production' || 'development' }}
steps:
Expand Down
87 changes: 87 additions & 0 deletions .github/workflows/fork-pr-comment.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
name: Post Fork PR Comments

# Runs after Coverage / Metrics Gate complete — has write access to post comments
# even when the triggering PR came from a fork.
on:
workflow_run:
workflows: ["Coverage", "Metrics Gate"]
types: [completed]

permissions:
pull-requests: write
actions: read

jobs:
comment:
# Only run for fork PRs (same-repo PRs post comments directly)
if: >
github.event.workflow_run.event == 'pull_request' &&
github.event.workflow_run.head_repository.full_name != github.repository
runs-on: ubuntu-latest
steps:
- name: Determine artifact name
id: meta
run: |
WF="${{ github.event.workflow_run.name }}"
if [ "$WF" = "Coverage" ]; then
echo "artifact=coverage-comment" >> "$GITHUB_OUTPUT"
echo "marker=<!-- pr-coverage-bot -->" >> "$GITHUB_OUTPUT"
elif [ "$WF" = "Metrics Gate" ]; then
echo "artifact=metrics-comment" >> "$GITHUB_OUTPUT"
echo "marker=<!-- pr-metrics-bot -->" >> "$GITHUB_OUTPUT"
else
echo "Unknown workflow: $WF"
exit 1
fi

- name: Get PR number
id: pr
uses: actions/github-script@v7
with:
script: |
const result = await github.rest.pulls.list({
owner: context.repo.owner,
repo: context.repo.repo,
state: 'open',
head: `${context.payload.workflow_run.head_repository.owner.login}:${context.payload.workflow_run.head_branch}`,
});
if (result.data.length > 0) {
core.setOutput('number', result.data[0].number);
} else {
core.setFailed('Could not find PR for this workflow run');
}

- name: Download artifact
id: download
continue-on-error: true
uses: actions/download-artifact@v4
with:
name: ${{ steps.meta.outputs.artifact }}
run-id: ${{ github.event.workflow_run.id }}
github-token: ${{ secrets.GITHUB_TOKEN }}
path: /tmp/comment

- name: Find comment file
if: steps.download.outcome == 'success'
id: file
run: |
FILE=$(find /tmp/comment -name '*.md' | head -1)
echo "path=${FILE}" >> "$GITHUB_OUTPUT"

- name: Find existing comment
if: steps.download.outcome == 'success'
uses: peter-evans/find-comment@v3
id: fc
with:
issue-number: ${{ steps.pr.outputs.number }}
comment-author: 'github-actions[bot]'
body-includes: ${{ steps.meta.outputs.marker }}

- name: Create or update comment
if: steps.download.outcome == 'success'
uses: peter-evans/create-or-update-comment@v4
with:
comment-id: ${{ steps.fc.outputs.comment-id }}
issue-number: ${{ steps.pr.outputs.number }}
body-path: ${{ steps.file.outputs.path }}
edit-mode: replace
Loading
Loading