7c67256f87
CI / Go · build + vet + test (pull_request) Failing after 30m3s
CI / Frontend · tsc (sundynix-admin) (pull_request) Failing after 9m42s
CI / Frontend · tsc (sundynix-desktop/frontend) (pull_request) Failing after 16m53s
CI / Frontend · tsc (sundynix-web) (pull_request) Has been cancelled
CI / mcp-py · sandbox guard (pull_request) Has been cancelled
SaaS P3 收口第二刀(设计见 SAAS_DESIGN.md §8)。第三个产品面:desktop=用户 工作产品、admin=平台超管控制塔、web=租户客户的自助柜台——做「装桌面端之前 就要能用」的那些事,三者不合并。 - 骨架抄 admin(HashRouter+路由注册表+me()/sdx:logout 鉴权门+vite/vitest 单文件配置);UI 整目录搬 desktop 的 ui/ 组件+ink/brand 主题 token(亮暗 双主题),品牌观感与桌面端一致;api.ts 抄 desktop 的 auth/tenant/usage 段 (纯 fetch 零 Wails 依赖),成员管理/建组织打新的租户自助接口。 - 页面:登录注册(一页两态)/概览(组织+角色+余额+桌面端下载指引)/团队(名册+ 邀请+改角色+移除,写控件按角色显隐、真闸在后端)/组织(列表+自助新建+切换)/ 用量与账单(余额 hero+趋势+合计+最近消耗,数据全来自现成 /me/usage;充值 只放说明占位,支付 P5 再接,不做假入口)。 - 工程:vite :5175、launch.json 配置、make webface、ci.yml web 矩阵纳入。 - 测试:tsc 干净;vitest 3 例(fmtCredits 去尾零——测试先行抓出 1.50 毛刺; ASSIGNABLE_ROLES 不含 owner)。浏览器 live 全流程:甲(owner)登录→概览→ 团队邀请乙→乙(member)登录写控件全隐藏、名册只读,组织/用量页真数据渲染。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
73 lines
2.2 KiB
YAML
73 lines
2.2 KiB
YAML
name: CI
|
||
|
||
# 只认 main:push 到 main、以及任何以 main 为目标的 PR。
|
||
# 开发分支(feat/*)自己 push 不跑 CI,靠合入 main 前的 PR 把关。
|
||
on:
|
||
push:
|
||
branches: [main]
|
||
pull_request:
|
||
branches: [main]
|
||
|
||
# 同一分支新 push 取消上一次未完成的运行,省 CI 时间。
|
||
concurrency:
|
||
group: ci-${{ github.ref }}
|
||
cancel-in-progress: true
|
||
|
||
jobs:
|
||
go:
|
||
name: Go · build + vet + test
|
||
runs-on: ubuntu-latest
|
||
steps:
|
||
- uses: actions/checkout@v4
|
||
- uses: actions/setup-go@v5
|
||
with:
|
||
go-version: "1.25"
|
||
cache-dependency-path: "**/go.sum"
|
||
- name: build + vet + test(4 模块;bus 用内嵌 NATS,无需外部服务)
|
||
run: |
|
||
set -e
|
||
for m in sundynix-shared sundynix-gateway sundynix-dispatcher sundynix-mcp-go; do
|
||
echo "::group::$m"
|
||
(cd "$m" && go build ./... && go vet ./... && go test ./...)
|
||
echo "::endgroup::"
|
||
done
|
||
|
||
web:
|
||
name: Frontend · tsc
|
||
runs-on: ubuntu-latest
|
||
strategy:
|
||
fail-fast: false
|
||
matrix:
|
||
dir: [sundynix-desktop/frontend, sundynix-admin, sundynix-web]
|
||
steps:
|
||
- uses: actions/checkout@v4
|
||
- uses: actions/setup-node@v4
|
||
with:
|
||
node-version: "20"
|
||
cache: npm
|
||
cache-dependency-path: ${{ matrix.dir }}/package-lock.json
|
||
- name: install + typecheck
|
||
working-directory: ${{ matrix.dir }}
|
||
run: |
|
||
npm ci
|
||
npx tsc --noEmit
|
||
|
||
py:
|
||
name: mcp-py · sandbox guard
|
||
runs-on: ubuntu-latest
|
||
steps:
|
||
- uses: actions/checkout@v4
|
||
- uses: actions/setup-python@v5
|
||
with:
|
||
python-version: "3.11"
|
||
cache: pip
|
||
- name: install + test(无 Docker 时测降级路径)
|
||
working-directory: sundynix-mcp-py
|
||
run: |
|
||
python -m pip install --upgrade pip
|
||
python -m pip install -e . pytest
|
||
PYTHONPATH=src:tests python -m pytest tests/ -q || \
|
||
PYTHONPATH=src:tests python -c "import test_sandbox as t; \
|
||
fns=[getattr(t,n) for n in dir(t) if n.startswith('test_')]; \
|
||
[ (f(),print('PASS',f.__name__)) for f in fns ]; print(f'{len(fns)} passed')"
|