Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
57 commits
Select commit Hold shift + click to select a range
5c2b01f
WIP: improve inclusion of most recent commits when latest major version
GJFR Feb 4, 2026
3655068
Fix bug where API is called for v8_sandbox instead of v8
GJFR Feb 4, 2026
c8a61e9
Unify subject availability logic
GJFR Feb 11, 2026
68ed188
Add playground and refactor
GJFR Feb 18, 2026
f3d4c8d
refactor: rename playground to lab and enhance experiment selection
GJFR Feb 19, 2026
3acab25
feat: update Lab UI with page title and active state indicator
GJFR Feb 19, 2026
72cde89
feat: track and display running containers and optimize worker concur…
GJFR Feb 19, 2026
3908fa6
fix: add correct routing for /lab page
GJFR Feb 25, 2026
29a3b10
fix: remove @staticmethod decorators from module-level functions
GJFR Feb 26, 2026
f2cf1d6
chore: upgrade frontend and Python dependencies
GJFR Feb 26, 2026
ba38537
fix: remove focus ring styles
GJFR Feb 26, 2026
9c03981
fix: apply correct editor theme on mount and improve README
GJFR Feb 26, 2026
f707091
refactor: rename configuration module to config
GJFR Mar 4, 2026
264396d
refactor: centralize env config in pydantic Settings
GJFR Mar 4, 2026
94324e7
feat: add button to delete a single experiment result from the database
GJFR Mar 4, 2026
c54dc34
fix: remove incorrect comment in .env.example
GJFR Mar 4, 2026
e1d848f
test: add unit tests
GJFR Mar 4, 2026
6f541e5
Merge branch 'dev' of github.com:DistriNet/BugHog into dev
GJFR Mar 4, 2026
f7463fd
feat: add dark mode support to Gantt chart and upgrade Bokeh to 3.8.2
GJFR Mar 6, 2026
14171cf
feat: add Servo as web browser subject with tar.gz support (WIP)
GJFR Mar 8, 2026
c7fdcb8
refactor: always run evaluations in worker containers, add dev debugp…
GJFR Mar 8, 2026
3adad24
feat: flesh out core architecture and make worker images subject-spec…
GJFR Apr 2, 2026
3d07955
docs: update CONTRIBUTING_DOCKER.md to reflect dev branch CI/CD builds
GJFR Apr 2, 2026
19b6311
ci: enable GitHub Actions layer cache for Docker builds
GJFR Apr 2, 2026
21fa4c0
Merge branch 'dev' into add-servo
GJFR Apr 3, 2026
adbfa74
feat: integrate Servo browser and enhance version handling
GJFR Apr 7, 2026
1e84c5d
refactor: version handling with new Version class
GJFR Apr 7, 2026
6874108
refactor: use Version class for centralized version parsing
GJFR Apr 8, 2026
2791c75
refactor: overhaul version and state factory to support complex versi…
GJFR Apr 14, 2026
8237e73
refactor: migrate tests from unittest to pytest
GJFR Apr 14, 2026
9811daa
ci: replace flake8 with ruff, add ty type checking, gate build on pas…
GJFR Apr 14, 2026
bcf092c
ci: fix ruff output format and pin Python to 3.13
GJFR Apr 14, 2026
9e564c6
ci: rename workflow, replace genbadge with anybadge, fix badge steps …
GJFR Apr 14, 2026
cf79972
fix: resolve all ty type errors and rename util modules
GJFR Apr 15, 2026
cd648ef
fix: use specific exception types and add strict=False to zip calls
GJFR Apr 15, 2026
5ccf431
ci: fix error when ruff finds no issues
GJFR Apr 15, 2026
678d8b4
ci: add ty badge generation and centralize badge deployment job
GJFR Apr 15, 2026
728f02a
build: overhaul Docker images for correctness and smaller size
GJFR Apr 16, 2026
f5904ad
build: simplify Docker setup and fix python-xlib dependency
GJFR Apr 16, 2026
b17ec0d
build: replace python3-xlib with python-xlib and update CI/simulation
GJFR Apr 16, 2026
95a1642
build: support rootless and rootful docker socket mounting
GJFR Apr 16, 2026
00776c6
build: use dynamic symlink for Docker socket mounting
GJFR Apr 16, 2026
4b4f727
fix: `evalParams.versions` is up-to-date on page load
GJFR Apr 17, 2026
1948100
fix: use correct type name for release state and add test
GJFR Apr 17, 2026
18d3804
fix: stop.sh also kills database container if running
GJFR Apr 17, 2026
7b20357
feat: expand and reorganise default Chromium flags and Firefox prefs
GJFR Apr 17, 2026
5b0fb0a
style: remove blank lines between sections in DEFAULT_PREFS
GJFR Apr 17, 2026
e9f3d78
build: centralise Python app into python-app stage, decouple apt layers
GJFR Apr 17, 2026
b2f549e
perf: pre-warm subject availability cache at startup
GJFR Apr 17, 2026
a77a425
fix: remove pkill usage in favor of python logic
GJFR May 7, 2026
5f8a020
chore: update github action versions
GJFR May 7, 2026
dd524db
fix: correct setup-uv action version
GJFR May 7, 2026
4c06d8f
fix: correct actions/checkout version
GJFR May 7, 2026
d0bdf1d
chore: update uv and npm packages
GJFR May 7, 2026
44ba209
fix: update uv.lock
GJFR May 7, 2026
0fc8d42
feat: add example poc
GJFR May 7, 2026
69c329b
docs: update and add content from wiki
GJFR May 7, 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
4 changes: 3 additions & 1 deletion .devcontainer/devcontainer.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@
"UV_PROJECT_ENVIRONMENT": "/app/.venv"
},

"initializeCommand": "if docker info 2>/dev/null | grep -q rootless; then DS=\"${XDG_RUNTIME_DIR:-/run/user/$(id -u)}/docker.sock\"; else DS=\"/var/run/docker.sock\"; fi; ln -sf \"$DS\" .docker.sock",

// The optional 'workspaceFolder' property is the path VS Code should open by default when
// connected. This is typically a file mount in .devcontainer/docker-compose.yml
"workspaceFolder": "/app",
Expand All @@ -36,7 +38,7 @@
}
},

"postCreateCommand": "uv sync --dev --locked",
"postCreateCommand": "uv sync --dev",

// Features to add to the dev container. More info: https://containers.dev/features.
// "features": {},
Expand Down
1 change: 0 additions & 1 deletion .dockerignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
**/dist
**/node_modules
.env
.flake8
.git
.gitignore
.github
Expand Down
205 changes: 205 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,205 @@
name: CI
on: [push]
jobs:
pytest:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v6

- name: Install uv
uses: astral-sh/setup-uv@v8.1.0
with:
enable-cache: true

- name: Install dependencies
# we use --locked instead of --frozen to elicit an error if pyproject.toml and uv.lock are not synced
run: uv sync --dev --locked

- name: Run pytest
run: uv run pytest --ignore=test/availability

- name: Generate badges
if: always()
run: |
PASSED=$(python -c "import xml.etree.ElementTree as ET; r=ET.parse('junit.xml').getroot(); ts=r.findall('testsuite'); print(sum(int(t.get('tests',0))-int(t.get('failures',0))-int(t.get('errors',0)) for t in ts))")
FAILED=$(python -c "import xml.etree.ElementTree as ET; r=ET.parse('junit.xml').getroot(); ts=r.findall('testsuite'); print(sum(int(t.get('failures',0))+int(t.get('errors',0)) for t in ts))")
if [ "$FAILED" -eq 0 ]; then
uv run anybadge --label=pytest --value="${PASSED} passed" --color=green --file=pytest.svg
else
uv run anybadge --label=pytest --value="${PASSED} passed, ${FAILED} failed" --color=red --file=pytest.svg
fi
COVERAGE=$(python -c "import xml.etree.ElementTree as ET; t=ET.parse('coverage.xml').getroot(); print(round(float(t.get('line-rate',0))*100))")
uv run anybadge --value=$COVERAGE --file=coverage.svg coverage

- name: Upload pytest badge
if: always()
uses: actions/upload-artifact@v7
with:
name: pytest
path: pytest.svg
overwrite: true

- name: Upload coverage badge
if: always()
uses: actions/upload-artifact@v7
with:
name: coverage
path: coverage.svg
overwrite: true


ty:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v6

- name: Install uv
uses: astral-sh/setup-uv@v8.1.0
with:
enable-cache: true

- name: Install dependencies
run: uv sync --dev --frozen

- name: Run ty
run: uv run ty check

- name: Generate badge
if: always()
run: |
if [ "${{ job.status }}" = "success" ]; then
uv run anybadge --label=ty --value=passing --color=green --file=ty.svg
else
uv run anybadge --label=ty --value=failing --color=red --file=ty.svg
fi

- name: Upload ty badge
if: always()
uses: actions/upload-artifact@v7
with:
name: ty
path: ty.svg
overwrite: true


ruff:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v6

- name: Install uv
uses: astral-sh/setup-uv@v8.1.0
with:
enable-cache: true

- name: Install dependencies
run: uv sync --dev --frozen

- name: Lint with ruff
run: uv run ruff check --output-format=concise > ruff.txt

- name: Generate badge
if: always()
run: |
VIOLATIONS=$(tail -1 ruff.txt | grep -oP '\d+' || echo 0)
if [ "$VIOLATIONS" -eq 0 ]; then
uv run anybadge --label=ruff --value=passing --color=green --file=ruff.svg
else
uv run anybadge --label=ruff --value="$VIOLATIONS violations" --color=orange --file=ruff.svg
fi

- name: Upload ruff badge
if: always()
uses: actions/upload-artifact@v7
with:
name: ruff
path: ruff.svg
overwrite: true


badges:
needs: [pytest, ty, ruff]
if: always() && github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- uses: actions/checkout@v6
with:
ref: badges
path: badges-branch

- uses: actions/download-artifact@v7
with:
name: pytest
path: badges-branch

- uses: actions/download-artifact@v7
with:
name: coverage
path: badges-branch

- uses: actions/download-artifact@v7
with:
name: ty
path: badges-branch

- uses: actions/download-artifact@v7
with:
name: ruff
path: badges-branch

- name: Commit and push badges
working-directory: badges-branch
run: |
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
git add pytest.svg coverage.svg ty.svg ruff.svg
git diff --staged --quiet || git commit -m "ci: update badges"
git push


build:
needs: [pytest, ty, ruff]
if: github.ref == 'refs/heads/dev' || github.ref == 'refs/heads/beta' || startsWith(github.ref, 'refs/tags/v')
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- name: Checkout
uses: actions/checkout@v6

- name: Resolve build metadata
id: meta
run: |
if [[ "$GITHUB_REF" == refs/tags/* ]]; then
echo "version=${GITHUB_REF_NAME#v}" >> $GITHUB_OUTPUT
echo "additional_tag=latest" >> $GITHUB_OUTPUT
elif [[ "$GITHUB_REF_NAME" == "beta" ]]; then
echo "version=beta" >> $GITHUB_OUTPUT
echo "additional_tag=" >> $GITHUB_OUTPUT
else
echo "version=dev" >> $GITHUB_OUTPUT
echo "additional_tag=" >> $GITHUB_OUTPUT
fi

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v4

- name: Log in to Docker Hub
uses: docker/login-action@v4
with:
username: ${{ secrets.DOCKER_HUB_USERNAME }}
password: ${{ secrets.DOCKER_HUB_TOKEN }}

- name: Build and push
run: |
docker buildx bake all --push \
--set "*.cache-from=type=gha" \
--set "*.cache-to=type=gha,mode=max"
env:
BUGHOG_VERSION: ${{ steps.meta.outputs.version }}
ADDITIONAL_TAG: ${{ steps.meta.outputs.additional_tag }}
23 changes: 23 additions & 0 deletions .github/workflows/create-release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
name: Create GitHub release

on:
create:

jobs:
package_release:
if: ${{ startsWith(github.ref, 'refs/tags/v') }}
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v6

- name: Create Release
id: create_release
uses: actions/create-release@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tag_name: ${{ github.ref }}
release_name: ${{ github.ref }}
draft: true
prerelease: false
69 changes: 0 additions & 69 deletions .github/workflows/run-tests-and-linter.yml

This file was deleted.

19 changes: 0 additions & 19 deletions .github/workflows/trigger-dev-build-job.yml

This file was deleted.

38 changes: 0 additions & 38 deletions .github/workflows/trigger-release-build-job.yml

This file was deleted.

3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
# Docker socket symlink
.docker.sock

database/data/

nginx/ssl/certs/*
Expand Down
Loading