Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
7b00c48
feat: add source workflow canvas
2233admin Jun 21, 2026
00f6713
feat: enrich topology node skill insights
2233admin Jun 21, 2026
544f0a5
feat: add topology flow modes and ports
2233admin Jun 21, 2026
7bd818e
feat: add skill matrix and skill-focused topology views
2233admin Jun 21, 2026
7fe1d93
build: bootstrap Nx workspace for project management
2233admin Jun 21, 2026
c1c9b14
chore: add env bootstrap notes and checks
2233admin Jun 21, 2026
f9e90b1
chore: add GitHub CI build and backend test pipeline
2233admin Jun 21, 2026
df4c1d1
feat: add node action workflow views
2233admin Jun 24, 2026
9c0c502
feat: add collection operations run inbox
2233admin Jun 24, 2026
38470d7
feat: add adaptive live run surface
2233admin Jun 24, 2026
fb7efab
feat: surface topology operations queue
2233admin Jun 24, 2026
187e082
feat: make topology the core workspace
2233admin Jun 24, 2026
dbf0e96
feat: establish operator design tokens
2233admin Jun 24, 2026
588560f
chore: install latest UI libraries
2233admin Jun 24, 2026
ebbfe04
feat: reshape topology workbench
2233admin Jun 24, 2026
f01fc03
feat: back topology canvas with FlowGram
2233admin Jun 24, 2026
c7eaddc
chore(frontend): establish Vite as sole frontend mainline
2233admin Jun 25, 2026
d157881
feat(node-kit): L3 atomic node system + ELK auto-layout, wire into co…
2233admin Jun 29, 2026
4f01201
feat(topology): migrate 采集网络 stage nodes to node-kit defineNode specs
2233admin Jun 29, 2026
1a41516
feat(node-kit): macro nodes MVP — collapse an atom subgraph into one …
2233admin Jun 30, 2026
134277f
feat(node-kit): inline config editing (autoForm) in KitNode
2233admin Jun 30, 2026
3f298f5
feat(node-kit): side property panel + AI graph authoring API
2233admin Jun 30, 2026
3bb827a
feat(skills): skill execute loop v1 — distill + CDP execute + correct
2233admin Jun 30, 2026
57dd5b4
fix(pipeline): dedup records within a batch before flush
2233admin Jun 30, 2026
38c34c8
chore: gitignore .repowise/ cache
2233admin Jun 30, 2026
426b50e
feat(skills): dock 重蒸技能 trigger — human-triggered re-distill UI
2233admin Jun 30, 2026
7f9d477
feat(skills): wire SkillService — execute a stored skill from the DB
2233admin Jun 30, 2026
417ef61
refactor(skills): decouple execute core from dock + spine for reuse
2233admin Jun 30, 2026
c056848
feat(skills): /skill/invoke bridge endpoint — Universal Studio kernel…
2233admin Jun 30, 2026
de52c25
feat(channels): Phase 0 — thicken the channel contract (FetchContext/…
2233admin Jun 30, 2026
56fa0c4
feat(channels): Phase 1a — thick runner foundation (cursor store + ra…
2233admin Jun 30, 2026
b33416a
refactor(pipeline): introduce LegacyDbSink write seam (strangler-fig …
2233admin Jun 30, 2026
532291b
refactor(odp): lock ODP forward contract — typed schemas + mapper (st…
2233admin Jun 30, 2026
74ac704
feat(sinks): move ODP forward into OdpSink + DualSink no double-send …
2233admin Jun 30, 2026
db10450
feat(sinks): write_strategy state machine selects the write sink (str…
2233admin Jun 30, 2026
9cbfb80
feat(rss): incremental cursor store + RSS conditional fetch (strangle…
2233admin Jun 30, 2026
09e4860
feat(pipeline): incremental channels collect via run_channel, cursor …
2233admin Jun 30, 2026
073d391
refactor(pipeline): gate browser binding by capabilities.session_affi…
2233admin Jun 30, 2026
d4aa324
feat(auth): encrypted credential store + AuthManager (Phase 2 PR-C)
2233admin Jun 30, 2026
6e08d41
feat(runner): per-domain concurrency cap at the task layer (Phase 3 P…
2233admin Jun 30, 2026
5eab908
fix(ci): bump frontend Node to 24 for native TS test support; fix tri…
2233admin Jul 1, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
177 changes: 61 additions & 116 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -1,152 +1,97 @@
name: CI
name: ci

on:
push:
branches: [main]
branches:
- main
- develop
- codex/**
pull_request:
branches: [main]

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

jobs:
# ── 前端检查 ─────────────────────────────────────────────
web-lint:
name: Web Lint
frontend:
runs-on: ubuntu-latest
name: Frontend (Vite)
defaults:
run:
working-directory: apps/web
working-directory: frontend
steps:
- uses: actions/checkout@v4
- name: Checkout
uses: actions/checkout@v4

- uses: actions/setup-node@v4
- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: '22'
cache: 'npm'
cache-dependency-path: apps/web/package-lock.json

- run: npm ci --legacy-peer-deps
- run: npm run lint

web-typecheck:
name: Web Type Check
runs-on: ubuntu-latest
defaults:
run:
working-directory: apps/web
steps:
- uses: actions/checkout@v4
node-version: "24"
cache: npm
cache-dependency-path: frontend/package-lock.json

- uses: actions/setup-node@v4
with:
node-version: '22'
cache: 'npm'
cache-dependency-path: apps/web/package-lock.json
- name: Install dependencies
run: npm ci --legacy-peer-deps

- run: npm ci --legacy-peer-deps
- run: npm run type-check
- name: Test
run: npm run test

web-test:
name: Web Test
runs-on: ubuntu-latest
defaults:
run:
working-directory: apps/web
steps:
- uses: actions/checkout@v4
- name: Build
run: npm run build

- uses: actions/setup-node@v4
- name: Upload frontend dist
uses: actions/upload-artifact@v4
if: success()
with:
node-version: '22'
cache: 'npm'
cache-dependency-path: apps/web/package-lock.json

- run: npm ci --legacy-peer-deps
- run: npm test -- --coverage
name: frontend-dist
path: frontend/dist

web-build:
name: Web Build
extension:
runs-on: ubuntu-latest
needs: [web-lint, web-typecheck]
name: Browser Extension
defaults:
run:
working-directory: apps/web
working-directory: chrome/extension-src
steps:
- uses: actions/checkout@v4
- name: Checkout
uses: actions/checkout@v4

- uses: actions/setup-node@v4
- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: '22'
cache: 'npm'
cache-dependency-path: apps/web/package-lock.json
node-version: "20"
cache: npm
cache-dependency-path: chrome/extension-src/package-lock.json

- run: npm ci --legacy-peer-deps
- run: npm run build
- name: Install dependencies
run: npm ci

# ── Python 后端检查 ──────────────────────────────────────
backend-test:
name: Backend Test
runs-on: ubuntu-latest
defaults:
run:
working-directory: backend
steps:
- uses: actions/checkout@v4
- name: Build
run: npm run build

- uses: actions/setup-python@v5
- name: Upload extension dist
uses: actions/upload-artifact@v4
if: success()
with:
python-version: '3.11'
cache: 'pip'
cache-dependency-path: pyproject.toml

- run: pip install .[dev]
- run: pytest --cov=backend --cov-fail-under=80
name: extension-dist
path: chrome/extension-src/dist

backend-lint:
name: Backend Lint
backend:
runs-on: ubuntu-latest
defaults:
run:
working-directory: backend
name: Backend Quality
steps:
- uses: actions/checkout@v4
- name: Checkout
uses: actions/checkout@v4

- uses: actions/setup-python@v5
- name: Setup Python
uses: actions/setup-python@v5
with:
python-version: '3.11'

- run: pip install ruff
- run: ruff check .
python-version: "3.11"

# ── Docker 构建 ──────────────────────────────────────────
docker-build:
name: Docker Build
runs-on: ubuntu-latest
needs: [web-build, backend-test]
steps:
- uses: actions/checkout@v4
- name: Install dependencies
run: |
python -m pip install --upgrade pip
python -m pip install -e .[dev]

- uses: docker/setup-buildx-action@v3

- uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Backend syntax check
run: python -m compileall backend

- name: Build Web
uses: docker/build-push-action@v5
with:
context: ./apps/web
push: false
tags: ghcr.io/${{ github.repository }}/web:${{ github.sha }}

- name: Build API
uses: docker/build-push-action@v5
with:
context: .
file: ./Dockerfile
push: false
tags: ghcr.io/${{ github.repository }}/api:${{ github.sha }}
- name: Unit tests
run: pytest tests/unit -m "not live" --no-cov
7 changes: 7 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ env/
htmlcov/
*.coveragerc
coverage.xml
.tmp-smoke/

# Database files
*.db
Expand All @@ -37,9 +38,11 @@ coverage.xml
# backend/migrations/versions/*.py

# Node / frontend
node_modules/
frontend/node_modules/
frontend/dist/
frontend/tsconfig.tsbuildinfo
.nx/

# macOS
.DS_Store
Expand All @@ -55,6 +58,8 @@ frontend/tsconfig.tsbuildinfo
# Logs
*.log
logs/
.omx/
.serena/

# Docker volumes / data
data/
Expand All @@ -70,3 +75,5 @@ chrome/extension-src/store-assets/

# Rust build
odp-rs/target/
.gstack/
.repowise/
17 changes: 17 additions & 0 deletions .gitleaks.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
title = "opencli-admin gitleaks config"

[extend]
useDefault = true

[allowlist]
description = "Ignore generated local artifacts that are not part of the repository."
paths = [
'''(^|/)\.venv/''',
'''(^|/)venv/''',
'''(^|/)env/''',
'''(^|/)\.tmp-smoke/''',
'''(^|/)node_modules/''',
'''(^|/)frontend/node_modules/''',
'''(^|/)frontend/dist/''',
'''(^|/)chrome/extension-src/node_modules/''',
]
1 change: 1 addition & 0 deletions .nvmrc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
20.12.2
23 changes: 23 additions & 0 deletions CONTEXT.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# OpenCLI Admin Context

OpenCLI Admin is an operations console for collection work that needs browser session control, scheduled collection, and operator review.

## Language

**Collection Operations Console**: The primary operator surface for turning collection work into captured, triaged, owned, stateful, and closed work. It is the product shape that contains Run Inbox, Data Sources, Live Collection View, and Diagnostic Canvas without making any one visualization the whole product.
_Avoid_: Dashboard wall, canvas-first app

**Collection Operations**: The operator-facing domain for deciding what should be collected, when collection should run, what recently happened, and which actions are currently safe. It groups Data Sources, Collection Plans, Recent Runs, and Node Actions without making a canvas the primary operating surface.
_Avoid_: Source Workflow Workbench, canvas-first operations

**Diagnostic Canvas**: A secondary view for understanding relationships among collection entities when troubleshooting or explaining system state. It is not the default place to configure routine collection work.
_Avoid_: Main workflow, primary operating surface

**Live Collection View**: The operator-facing view of an active collection run as it happens, including streamed progress, rendered browser or pipeline state, and run-specific artifacts. It is anchored to a Recent Run, not to the default configuration surface.
_Avoid_: Static task log, canvas-only monitoring

**Adaptive Run Surface**: The on-demand layout that opens the right Live Collection View panels for the active run type. It should reveal pipeline events, browser or adapter rendering, and artifacts only when they help the operator understand that run.
_Avoid_: Clock shop, always-on dashboard wall

**Run Inbox**: The operator-facing queue of collection runs that need observation, review, retry, acknowledgement, or dismissal. It treats a run as work to triage and close, not as a passive row in a log table.
_Avoid_: Recent tasks table, static run history
Loading
Loading