agent-circus 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- agent_circus-0.1.0/.envrc.dist +15 -0
- agent_circus-0.1.0/.github/dependabot.yml +58 -0
- agent_circus-0.1.0/.github/workflows/ci.yml +43 -0
- agent_circus-0.1.0/.github/workflows/publish-pypi.yml +106 -0
- agent_circus-0.1.0/.github/workflows/publish-testpypi.yml +77 -0
- agent_circus-0.1.0/.github/workflows/security.yml +57 -0
- agent_circus-0.1.0/.gitignore +179 -0
- agent_circus-0.1.0/.pre-commit-config.yaml +33 -0
- agent_circus-0.1.0/.yamlfmt +27 -0
- agent_circus-0.1.0/.yamllint.yaml +12 -0
- agent_circus-0.1.0/AGENTS.md +61 -0
- agent_circus-0.1.0/CLAUDE.md +1 -0
- agent_circus-0.1.0/LICENSE +9 -0
- agent_circus-0.1.0/Makefile +49 -0
- agent_circus-0.1.0/PKG-INFO +1195 -0
- agent_circus-0.1.0/README.md +1170 -0
- agent_circus-0.1.0/assets/agent_circus_logo.png +0 -0
- agent_circus-0.1.0/assets/open_protocols.svg +22 -0
- agent_circus-0.1.0/devenv.lock +103 -0
- agent_circus-0.1.0/devenv.nix +27 -0
- agent_circus-0.1.0/devenv.yaml +24 -0
- agent_circus-0.1.0/pyproject.toml +78 -0
- agent_circus-0.1.0/src/agent_circus/__init__.py +5 -0
- agent_circus-0.1.0/src/agent_circus/agent_config.py +357 -0
- agent_circus-0.1.0/src/agent_circus/cli.py +73 -0
- agent_circus-0.1.0/src/agent_circus/commands/__init__.py +5 -0
- agent_circus-0.1.0/src/agent_circus/commands/build.py +83 -0
- agent_circus-0.1.0/src/agent_circus/commands/config_store.py +104 -0
- agent_circus-0.1.0/src/agent_circus/commands/destroy.py +123 -0
- agent_circus-0.1.0/src/agent_circus/commands/exec_.py +140 -0
- agent_circus-0.1.0/src/agent_circus/commands/init.py +498 -0
- agent_circus-0.1.0/src/agent_circus/commands/ps.py +113 -0
- agent_circus-0.1.0/src/agent_circus/commands/remove.py +127 -0
- agent_circus-0.1.0/src/agent_circus/commands/up.py +86 -0
- agent_circus-0.1.0/src/agent_circus/compose.py +481 -0
- agent_circus-0.1.0/src/agent_circus/config.py +1478 -0
- agent_circus-0.1.0/src/agent_circus/context.py +599 -0
- agent_circus-0.1.0/src/agent_circus/exceptions.py +29 -0
- agent_circus-0.1.0/src/agent_circus/mcp.py +164 -0
- agent_circus-0.1.0/src/agent_circus/runtime.py +109 -0
- agent_circus-0.1.0/src/agent_circus/state.py +343 -0
- agent_circus-0.1.0/src/agent_circus/templates/__init__.py +113 -0
- agent_circus-0.1.0/src/agent_circus/templates/agent-circus/Dockerfile +164 -0
- agent_circus-0.1.0/src/agent_circus/templates/agent-circus/compose.yaml +92 -0
- agent_circus-0.1.0/src/agent_circus/templates/agent-circus/docker-entrypoint.sh +57 -0
- agent_circus-0.1.0/src/agent_circus/templates/agent-circus/hooks/base-root.sh +3 -0
- agent_circus-0.1.0/src/agent_circus/templates/agent-circus/hooks/base-user.sh +3 -0
- agent_circus-0.1.0/src/agent_circus/templates/agent-circus/init-firewall.sh +147 -0
- agent_circus-0.1.0/src/agent_circus/templates/agent-circus/install-ca-certs.sh +9 -0
- agent_circus-0.1.0/src/agent_circus/templates/agent-circus/pyproject.toml +16 -0
- agent_circus-0.1.0/src/agent_circus/templates/agent-circus/setup-claude-mem.sh +24 -0
- agent_circus-0.1.0/src/agent_circus/templates/agent-circus/uv.lock +1531 -0
- agent_circus-0.1.0/src/agent_circus/update_versions.py +388 -0
- agent_circus-0.1.0/src/agent_circus/utils.py +28 -0
- agent_circus-0.1.0/tests/smoke_test_package.py +18 -0
- agent_circus-0.1.0/tests/test_additional_dirs.py +66 -0
- agent_circus-0.1.0/tests/test_agent_config.py +650 -0
- agent_circus-0.1.0/tests/test_ca_certs.py +88 -0
- agent_circus-0.1.0/tests/test_claude_mem.py +159 -0
- agent_circus-0.1.0/tests/test_command_validation_errors.py +39 -0
- agent_circus-0.1.0/tests/test_compose.py +260 -0
- agent_circus-0.1.0/tests/test_config.py +292 -0
- agent_circus-0.1.0/tests/test_config_store_command.py +72 -0
- agent_circus-0.1.0/tests/test_config_validation.py +126 -0
- agent_circus-0.1.0/tests/test_context.py +559 -0
- agent_circus-0.1.0/tests/test_data_stores.py +316 -0
- agent_circus-0.1.0/tests/test_destroy.py +93 -0
- agent_circus-0.1.0/tests/test_env_passthrough.py +82 -0
- agent_circus-0.1.0/tests/test_exec_auto_up.py +195 -0
- agent_circus-0.1.0/tests/test_git.py +46 -0
- agent_circus-0.1.0/tests/test_hooks_config.py +237 -0
- agent_circus-0.1.0/tests/test_hosts.py +136 -0
- agent_circus-0.1.0/tests/test_init_config.py +219 -0
- agent_circus-0.1.0/tests/test_llama_cpp.py +178 -0
- agent_circus-0.1.0/tests/test_mcp.py +217 -0
- agent_circus-0.1.0/tests/test_port_forwards.py +92 -0
- agent_circus-0.1.0/tests/test_runtime.py +49 -0
- agent_circus-0.1.0/tests/test_ssh.py +90 -0
- agent_circus-0.1.0/tests/test_startup_hook.py +50 -0
- agent_circus-0.1.0/tests/test_state.py +69 -0
- agent_circus-0.1.0/tests/test_templates.py +78 -0
- agent_circus-0.1.0/tests/test_update_versions.py +291 -0
- agent_circus-0.1.0/tests/test_utils.py +37 -0
- agent_circus-0.1.0/uv.lock +689 -0
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
version: 2
|
|
2
|
+
|
|
3
|
+
updates:
|
|
4
|
+
- package-ecosystem: uv
|
|
5
|
+
directory: /
|
|
6
|
+
target-branch: develop
|
|
7
|
+
schedule:
|
|
8
|
+
interval: weekly
|
|
9
|
+
day: monday
|
|
10
|
+
time: "06:00"
|
|
11
|
+
timezone: Europe/Vienna
|
|
12
|
+
open-pull-requests-limit: 5
|
|
13
|
+
groups:
|
|
14
|
+
python-dependencies:
|
|
15
|
+
patterns:
|
|
16
|
+
- "*"
|
|
17
|
+
|
|
18
|
+
- package-ecosystem: uv
|
|
19
|
+
directory: /src/agent_circus/templates/agent-circus
|
|
20
|
+
target-branch: develop
|
|
21
|
+
schedule:
|
|
22
|
+
interval: weekly
|
|
23
|
+
day: monday
|
|
24
|
+
time: "06:15"
|
|
25
|
+
timezone: Europe/Vienna
|
|
26
|
+
open-pull-requests-limit: 5
|
|
27
|
+
groups:
|
|
28
|
+
template-python-dependencies:
|
|
29
|
+
patterns:
|
|
30
|
+
- "*"
|
|
31
|
+
|
|
32
|
+
- package-ecosystem: github-actions
|
|
33
|
+
directory: /
|
|
34
|
+
target-branch: develop
|
|
35
|
+
schedule:
|
|
36
|
+
interval: weekly
|
|
37
|
+
day: monday
|
|
38
|
+
time: "06:30"
|
|
39
|
+
timezone: Europe/Vienna
|
|
40
|
+
open-pull-requests-limit: 5
|
|
41
|
+
groups:
|
|
42
|
+
github-actions:
|
|
43
|
+
patterns:
|
|
44
|
+
- "*"
|
|
45
|
+
|
|
46
|
+
- package-ecosystem: docker
|
|
47
|
+
directory: /src/agent_circus/templates/agent-circus
|
|
48
|
+
target-branch: develop
|
|
49
|
+
schedule:
|
|
50
|
+
interval: weekly
|
|
51
|
+
day: monday
|
|
52
|
+
time: "06:45"
|
|
53
|
+
timezone: Europe/Vienna
|
|
54
|
+
open-pull-requests-limit: 5
|
|
55
|
+
groups:
|
|
56
|
+
docker-images:
|
|
57
|
+
patterns:
|
|
58
|
+
- "*"
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches:
|
|
6
|
+
- develop
|
|
7
|
+
- main
|
|
8
|
+
pull_request:
|
|
9
|
+
branches:
|
|
10
|
+
- develop
|
|
11
|
+
- main
|
|
12
|
+
workflow_dispatch:
|
|
13
|
+
|
|
14
|
+
permissions:
|
|
15
|
+
contents: read
|
|
16
|
+
|
|
17
|
+
concurrency:
|
|
18
|
+
group: ci-${{ github.workflow }}-${{ github.ref }}
|
|
19
|
+
cancel-in-progress: true
|
|
20
|
+
|
|
21
|
+
jobs:
|
|
22
|
+
checks:
|
|
23
|
+
name: Checks
|
|
24
|
+
runs-on: ubuntu-latest
|
|
25
|
+
|
|
26
|
+
steps:
|
|
27
|
+
- name: Check out repository
|
|
28
|
+
uses: actions/checkout@v7
|
|
29
|
+
|
|
30
|
+
- name: Set up uv
|
|
31
|
+
uses: astral-sh/setup-uv@v10.0.1
|
|
32
|
+
with:
|
|
33
|
+
enable-cache: true
|
|
34
|
+
version: latest-known
|
|
35
|
+
|
|
36
|
+
- name: Install Python
|
|
37
|
+
run: uv python install 3.14
|
|
38
|
+
|
|
39
|
+
- name: Install dependencies
|
|
40
|
+
run: uv sync --locked --all-groups
|
|
41
|
+
|
|
42
|
+
- name: Run checks
|
|
43
|
+
run: make check
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
name: Publish to PyPI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
release:
|
|
5
|
+
types: [published]
|
|
6
|
+
|
|
7
|
+
permissions:
|
|
8
|
+
contents: read
|
|
9
|
+
|
|
10
|
+
jobs:
|
|
11
|
+
build:
|
|
12
|
+
name: Build and verify distributions
|
|
13
|
+
runs-on: ubuntu-latest
|
|
14
|
+
|
|
15
|
+
steps:
|
|
16
|
+
- name: Check out release tag
|
|
17
|
+
uses: actions/checkout@v7
|
|
18
|
+
with:
|
|
19
|
+
ref: ${{ github.event.release.tag_name }}
|
|
20
|
+
persist-credentials: false
|
|
21
|
+
|
|
22
|
+
- name: Set up uv
|
|
23
|
+
uses: astral-sh/setup-uv@v10.0.1
|
|
24
|
+
with:
|
|
25
|
+
enable-cache: false
|
|
26
|
+
version: latest-known
|
|
27
|
+
|
|
28
|
+
- name: Install Python
|
|
29
|
+
run: uv python install 3.14
|
|
30
|
+
|
|
31
|
+
- name: Validate release version
|
|
32
|
+
env:
|
|
33
|
+
RELEASE_TAG: ${{ github.event.release.tag_name }}
|
|
34
|
+
run: |
|
|
35
|
+
if [[ ! "$RELEASE_TAG" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
|
|
36
|
+
echo "Release tag must be a stable vMAJOR.MINOR.PATCH tag: $RELEASE_TAG" >&2
|
|
37
|
+
exit 1
|
|
38
|
+
fi
|
|
39
|
+
|
|
40
|
+
uv run --no-project --python 3.14 python - <<'PY'
|
|
41
|
+
import os
|
|
42
|
+
import pathlib
|
|
43
|
+
import tomllib
|
|
44
|
+
|
|
45
|
+
tag_version = os.environ["RELEASE_TAG"].removeprefix("v")
|
|
46
|
+
with pathlib.Path("pyproject.toml").open("rb") as file:
|
|
47
|
+
project_version = tomllib.load(file)["project"]["version"]
|
|
48
|
+
|
|
49
|
+
if tag_version != project_version:
|
|
50
|
+
raise SystemExit(
|
|
51
|
+
"Release version does not match: "
|
|
52
|
+
f"release tag={tag_version!r}, pyproject.toml={project_version!r}"
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
print(f"Validated release version {tag_version}")
|
|
56
|
+
PY
|
|
57
|
+
|
|
58
|
+
- name: Build distributions
|
|
59
|
+
run: uv build --no-sources
|
|
60
|
+
|
|
61
|
+
- name: Validate distribution metadata
|
|
62
|
+
run: uv run --with twine twine check --strict dist/*
|
|
63
|
+
|
|
64
|
+
- name: Smoke test wheel
|
|
65
|
+
run: uv run --isolated --no-project --with dist/*.whl tests/smoke_test_package.py
|
|
66
|
+
|
|
67
|
+
- name: Smoke test source distribution
|
|
68
|
+
run: uv run --isolated --no-project --with dist/*.tar.gz tests/smoke_test_package.py
|
|
69
|
+
|
|
70
|
+
- name: Upload distributions
|
|
71
|
+
uses: actions/upload-artifact@v7
|
|
72
|
+
with:
|
|
73
|
+
name: distributions
|
|
74
|
+
path: dist/
|
|
75
|
+
if-no-files-found: error
|
|
76
|
+
retention-days: 7
|
|
77
|
+
|
|
78
|
+
publish:
|
|
79
|
+
name: Publish distributions
|
|
80
|
+
needs: build
|
|
81
|
+
runs-on: ubuntu-latest
|
|
82
|
+
environment:
|
|
83
|
+
name: pypi
|
|
84
|
+
url: https://pypi.org/project/agent-circus/
|
|
85
|
+
permissions:
|
|
86
|
+
contents: read
|
|
87
|
+
id-token: write
|
|
88
|
+
|
|
89
|
+
steps:
|
|
90
|
+
- name: Set up uv
|
|
91
|
+
uses: astral-sh/setup-uv@v10.0.1
|
|
92
|
+
with:
|
|
93
|
+
enable-cache: false
|
|
94
|
+
version: latest-known
|
|
95
|
+
|
|
96
|
+
- name: Download distributions
|
|
97
|
+
uses: actions/download-artifact@v8
|
|
98
|
+
with:
|
|
99
|
+
name: distributions
|
|
100
|
+
path: dist/
|
|
101
|
+
|
|
102
|
+
- name: Generate PEP 740 attestations
|
|
103
|
+
uses: astral-sh/attest-action@v0.0.6
|
|
104
|
+
|
|
105
|
+
- name: Publish to PyPI
|
|
106
|
+
run: uv publish
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
name: Publish to TestPyPI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
workflow_dispatch:
|
|
5
|
+
|
|
6
|
+
permissions:
|
|
7
|
+
contents: read
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
build:
|
|
11
|
+
name: Build and verify distributions
|
|
12
|
+
runs-on: ubuntu-latest
|
|
13
|
+
|
|
14
|
+
steps:
|
|
15
|
+
- name: Check out repository
|
|
16
|
+
uses: actions/checkout@v7
|
|
17
|
+
with:
|
|
18
|
+
persist-credentials: false
|
|
19
|
+
|
|
20
|
+
- name: Set up uv
|
|
21
|
+
uses: astral-sh/setup-uv@v10.0.1
|
|
22
|
+
with:
|
|
23
|
+
enable-cache: false
|
|
24
|
+
version: latest-known
|
|
25
|
+
|
|
26
|
+
- name: Install Python
|
|
27
|
+
run: uv python install 3.14
|
|
28
|
+
|
|
29
|
+
- name: Build distributions
|
|
30
|
+
run: uv build --no-sources
|
|
31
|
+
|
|
32
|
+
- name: Validate distribution metadata
|
|
33
|
+
run: uv run --with twine twine check --strict dist/*
|
|
34
|
+
|
|
35
|
+
- name: Smoke test wheel
|
|
36
|
+
run: uv run --isolated --no-project --with dist/*.whl tests/smoke_test_package.py
|
|
37
|
+
|
|
38
|
+
- name: Smoke test source distribution
|
|
39
|
+
run: uv run --isolated --no-project --with dist/*.tar.gz tests/smoke_test_package.py
|
|
40
|
+
|
|
41
|
+
- name: Upload distributions
|
|
42
|
+
uses: actions/upload-artifact@v7
|
|
43
|
+
with:
|
|
44
|
+
name: distributions
|
|
45
|
+
path: dist/
|
|
46
|
+
if-no-files-found: error
|
|
47
|
+
|
|
48
|
+
publish:
|
|
49
|
+
name: Publish distributions
|
|
50
|
+
needs: build
|
|
51
|
+
runs-on: ubuntu-latest
|
|
52
|
+
environment:
|
|
53
|
+
name: testpypi
|
|
54
|
+
url: https://test.pypi.org/project/agent-circus/
|
|
55
|
+
permissions:
|
|
56
|
+
id-token: write
|
|
57
|
+
|
|
58
|
+
steps:
|
|
59
|
+
- name: Check out repository
|
|
60
|
+
uses: actions/checkout@v7
|
|
61
|
+
with:
|
|
62
|
+
persist-credentials: false
|
|
63
|
+
|
|
64
|
+
- name: Set up uv
|
|
65
|
+
uses: astral-sh/setup-uv@v10.0.1
|
|
66
|
+
with:
|
|
67
|
+
enable-cache: false
|
|
68
|
+
version: latest-known
|
|
69
|
+
|
|
70
|
+
- name: Download distributions
|
|
71
|
+
uses: actions/download-artifact@v8
|
|
72
|
+
with:
|
|
73
|
+
name: distributions
|
|
74
|
+
path: dist/
|
|
75
|
+
|
|
76
|
+
- name: Publish to TestPyPI
|
|
77
|
+
run: uv publish --index testpypi
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
name: Security
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches:
|
|
6
|
+
- develop
|
|
7
|
+
- main
|
|
8
|
+
pull_request:
|
|
9
|
+
branches:
|
|
10
|
+
- develop
|
|
11
|
+
- main
|
|
12
|
+
schedule:
|
|
13
|
+
- cron: "27 5 * * 1"
|
|
14
|
+
workflow_dispatch:
|
|
15
|
+
|
|
16
|
+
permissions:
|
|
17
|
+
contents: read
|
|
18
|
+
pull-requests: read
|
|
19
|
+
|
|
20
|
+
concurrency:
|
|
21
|
+
group: security-${{ github.workflow }}-${{ github.ref }}
|
|
22
|
+
cancel-in-progress: true
|
|
23
|
+
|
|
24
|
+
jobs:
|
|
25
|
+
dependency-review:
|
|
26
|
+
name: Dependency review
|
|
27
|
+
runs-on: ubuntu-latest
|
|
28
|
+
if: github.event_name == 'pull_request'
|
|
29
|
+
|
|
30
|
+
steps:
|
|
31
|
+
- name: Check out repository
|
|
32
|
+
uses: actions/checkout@v7
|
|
33
|
+
|
|
34
|
+
- name: Review dependency changes
|
|
35
|
+
uses: actions/dependency-review-action@v5
|
|
36
|
+
with:
|
|
37
|
+
fail-on-severity: moderate
|
|
38
|
+
|
|
39
|
+
uv-audit:
|
|
40
|
+
name: uv audit
|
|
41
|
+
runs-on: ubuntu-latest
|
|
42
|
+
|
|
43
|
+
steps:
|
|
44
|
+
- name: Check out repository
|
|
45
|
+
uses: actions/checkout@v7
|
|
46
|
+
|
|
47
|
+
- name: Set up uv
|
|
48
|
+
uses: astral-sh/setup-uv@v10.0.1
|
|
49
|
+
with:
|
|
50
|
+
enable-cache: true
|
|
51
|
+
version: latest-known
|
|
52
|
+
|
|
53
|
+
- name: Install Python
|
|
54
|
+
run: uv python install 3.14
|
|
55
|
+
|
|
56
|
+
- name: Audit locked dependencies
|
|
57
|
+
run: make audit
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
# ---> Python
|
|
2
|
+
# Byte-compiled / optimized / DLL files
|
|
3
|
+
__pycache__/
|
|
4
|
+
*.py[cod]
|
|
5
|
+
*$py.class
|
|
6
|
+
|
|
7
|
+
# C extensions
|
|
8
|
+
*.so
|
|
9
|
+
|
|
10
|
+
# Distribution / packaging
|
|
11
|
+
.Python
|
|
12
|
+
build/
|
|
13
|
+
develop-eggs/
|
|
14
|
+
dist/
|
|
15
|
+
downloads/
|
|
16
|
+
eggs/
|
|
17
|
+
.eggs/
|
|
18
|
+
lib/
|
|
19
|
+
lib64/
|
|
20
|
+
parts/
|
|
21
|
+
sdist/
|
|
22
|
+
var/
|
|
23
|
+
wheels/
|
|
24
|
+
share/python-wheels/
|
|
25
|
+
*.egg-info/
|
|
26
|
+
.installed.cfg
|
|
27
|
+
*.egg
|
|
28
|
+
MANIFEST
|
|
29
|
+
|
|
30
|
+
# PyInstaller
|
|
31
|
+
# Usually these files are written by a python script from a template
|
|
32
|
+
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
|
33
|
+
*.manifest
|
|
34
|
+
*.spec
|
|
35
|
+
|
|
36
|
+
# Installer logs
|
|
37
|
+
pip-log.txt
|
|
38
|
+
pip-delete-this-directory.txt
|
|
39
|
+
|
|
40
|
+
# Unit test / coverage reports
|
|
41
|
+
htmlcov/
|
|
42
|
+
.tox/
|
|
43
|
+
.nox/
|
|
44
|
+
.coverage
|
|
45
|
+
.coverage.*
|
|
46
|
+
.cache
|
|
47
|
+
nosetests.xml
|
|
48
|
+
coverage.xml
|
|
49
|
+
*.cover
|
|
50
|
+
*.py,cover
|
|
51
|
+
.hypothesis/
|
|
52
|
+
.pytest_cache/
|
|
53
|
+
cover/
|
|
54
|
+
|
|
55
|
+
# Translations
|
|
56
|
+
*.mo
|
|
57
|
+
*.pot
|
|
58
|
+
|
|
59
|
+
# Django stuff:
|
|
60
|
+
*.log
|
|
61
|
+
local_settings.py
|
|
62
|
+
db.sqlite3
|
|
63
|
+
db.sqlite3-journal
|
|
64
|
+
|
|
65
|
+
# Flask stuff:
|
|
66
|
+
instance/
|
|
67
|
+
.webassets-cache
|
|
68
|
+
|
|
69
|
+
# Scrapy stuff:
|
|
70
|
+
.scrapy
|
|
71
|
+
|
|
72
|
+
# Sphinx documentation
|
|
73
|
+
docs/_build/
|
|
74
|
+
|
|
75
|
+
# PyBuilder
|
|
76
|
+
.pybuilder/
|
|
77
|
+
target/
|
|
78
|
+
|
|
79
|
+
# Jupyter Notebook
|
|
80
|
+
.ipynb_checkpoints
|
|
81
|
+
|
|
82
|
+
# IPython
|
|
83
|
+
profile_default/
|
|
84
|
+
ipython_config.py
|
|
85
|
+
|
|
86
|
+
# pyenv
|
|
87
|
+
# For a library or package, you might want to ignore these files since the code is
|
|
88
|
+
# intended to run in multiple environments; otherwise, check them in:
|
|
89
|
+
# .python-version
|
|
90
|
+
|
|
91
|
+
# pipenv
|
|
92
|
+
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
|
|
93
|
+
# However, in case of collaboration, if having platform-specific dependencies or dependencies
|
|
94
|
+
# having no cross-platform support, pipenv may install dependencies that don't work, or not
|
|
95
|
+
# install all needed dependencies.
|
|
96
|
+
#Pipfile.lock
|
|
97
|
+
|
|
98
|
+
# poetry
|
|
99
|
+
# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
|
|
100
|
+
# This is especially recommended for binary packages to ensure reproducibility, and is more
|
|
101
|
+
# commonly ignored for libraries.
|
|
102
|
+
# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
|
|
103
|
+
#poetry.lock
|
|
104
|
+
|
|
105
|
+
# pdm
|
|
106
|
+
# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
|
|
107
|
+
#pdm.lock
|
|
108
|
+
# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
|
|
109
|
+
# in version control.
|
|
110
|
+
# https://pdm.fming.dev/latest/usage/project/#working-with-version-control
|
|
111
|
+
.pdm.toml
|
|
112
|
+
.pdm-python
|
|
113
|
+
.pdm-build/
|
|
114
|
+
|
|
115
|
+
# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
|
|
116
|
+
__pypackages__/
|
|
117
|
+
|
|
118
|
+
# Celery stuff
|
|
119
|
+
celerybeat-schedule
|
|
120
|
+
celerybeat.pid
|
|
121
|
+
|
|
122
|
+
# SageMath parsed files
|
|
123
|
+
*.sage.py
|
|
124
|
+
|
|
125
|
+
# Environments
|
|
126
|
+
.env
|
|
127
|
+
.envrc
|
|
128
|
+
.venv
|
|
129
|
+
env/
|
|
130
|
+
venv/
|
|
131
|
+
ENV/
|
|
132
|
+
env.bak/
|
|
133
|
+
venv.bak/
|
|
134
|
+
|
|
135
|
+
# Spyder project settings
|
|
136
|
+
.spyderproject
|
|
137
|
+
.spyproject
|
|
138
|
+
|
|
139
|
+
# Rope project settings
|
|
140
|
+
.ropeproject
|
|
141
|
+
|
|
142
|
+
# mkdocs documentation
|
|
143
|
+
/site
|
|
144
|
+
|
|
145
|
+
# mypy
|
|
146
|
+
.mypy_cache/
|
|
147
|
+
.dmypy.json
|
|
148
|
+
dmypy.json
|
|
149
|
+
|
|
150
|
+
# Pyre type checker
|
|
151
|
+
.pyre/
|
|
152
|
+
|
|
153
|
+
# pytype static type analyzer
|
|
154
|
+
.pytype/
|
|
155
|
+
|
|
156
|
+
# Cython debug symbols
|
|
157
|
+
cython_debug/
|
|
158
|
+
|
|
159
|
+
# PyCharm
|
|
160
|
+
# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
|
|
161
|
+
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
|
|
162
|
+
# and can be added to the global gitignore or merged into this file. For a more nuclear
|
|
163
|
+
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
|
|
164
|
+
#.idea/
|
|
165
|
+
|
|
166
|
+
# AI
|
|
167
|
+
.agent-shell/
|
|
168
|
+
.claude/
|
|
169
|
+
|
|
170
|
+
# others
|
|
171
|
+
.direnv/
|
|
172
|
+
.devenv/
|
|
173
|
+
|
|
174
|
+
# Node
|
|
175
|
+
node_modules/
|
|
176
|
+
|
|
177
|
+
# agent-circus
|
|
178
|
+
.agent-circus/
|
|
179
|
+
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
---
|
|
2
|
+
repos:
|
|
3
|
+
- repo: https://github.com/astral-sh/ruff-pre-commit
|
|
4
|
+
rev: v0.15.0
|
|
5
|
+
hooks:
|
|
6
|
+
- id: ruff-check
|
|
7
|
+
args: [--fix]
|
|
8
|
+
- id: ruff-format
|
|
9
|
+
- repo: https://github.com/astral-sh/ty-pre-commit
|
|
10
|
+
# ty version.
|
|
11
|
+
rev: v0.0.58
|
|
12
|
+
hooks:
|
|
13
|
+
- id: ty
|
|
14
|
+
- repo: local
|
|
15
|
+
hooks:
|
|
16
|
+
- id: pytest
|
|
17
|
+
name: pytest
|
|
18
|
+
entry: uv run pytest
|
|
19
|
+
language: system
|
|
20
|
+
pass_filenames: false
|
|
21
|
+
always_run: true
|
|
22
|
+
- id: uv-audit
|
|
23
|
+
name: uv audit (root)
|
|
24
|
+
entry: uv audit --locked
|
|
25
|
+
language: system
|
|
26
|
+
pass_filenames: false
|
|
27
|
+
files: ^(pyproject\.toml|uv\.lock)$
|
|
28
|
+
- id: uv-audit-agent-circus-template
|
|
29
|
+
name: uv audit (agent-circus template)
|
|
30
|
+
entry: uv --directory src/agent_circus/templates/agent-circus audit --locked
|
|
31
|
+
language: system
|
|
32
|
+
pass_filenames: false
|
|
33
|
+
files: ^src/agent_circus/templates/agent-circus/(pyproject\.toml|uv\.lock)$
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
continue_on_error: false
|
|
2
|
+
doublestar: false
|
|
3
|
+
exclude: []
|
|
4
|
+
extensions:
|
|
5
|
+
- yaml
|
|
6
|
+
- yml
|
|
7
|
+
gitignore_excludes: false
|
|
8
|
+
gitignore_path: .gitignore
|
|
9
|
+
include: []
|
|
10
|
+
line_ending: lf
|
|
11
|
+
output_format: default
|
|
12
|
+
regex_exclude: []
|
|
13
|
+
formatter:
|
|
14
|
+
disallow_anchors: false
|
|
15
|
+
drop_merge_tag: false
|
|
16
|
+
eof_newline: false
|
|
17
|
+
include_document_start: true
|
|
18
|
+
indent: 2
|
|
19
|
+
indentless_arrays: true
|
|
20
|
+
line_ending: lf
|
|
21
|
+
max_line_length: 0
|
|
22
|
+
pad_line_comments: 2
|
|
23
|
+
retain_line_breaks: true
|
|
24
|
+
retain_line_breaks_single: true
|
|
25
|
+
scan_folded_as_literal: false
|
|
26
|
+
trim_trailing_whitespace: false
|
|
27
|
+
type: basic
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# AGENTS.md
|
|
2
|
+
|
|
3
|
+
## Repository Overview
|
|
4
|
+
|
|
5
|
+
- Purpose: CLI tool for running AI coding agents in sandboxed Docker containers.
|
|
6
|
+
- Core tech: Python, Docker, Docker Compose, Typer, pytest, uv, ruff, ty.
|
|
7
|
+
|
|
8
|
+
Used (minimum) versions can be found in pyproject.toml.
|
|
9
|
+
|
|
10
|
+
## Layout
|
|
11
|
+
|
|
12
|
+
- `tests/`: unit tests for the agent-circus tool.
|
|
13
|
+
- `src/`: source code of this repository/agent-circus
|
|
14
|
+
- `src/agent_circus/templates`: dependencies and versions for containerized agents/libraries
|
|
15
|
+
- `pyproject.toml`: formal description of the project environment/dependencies
|
|
16
|
+
|
|
17
|
+
## Common Commands
|
|
18
|
+
|
|
19
|
+
Always prefix any python-related command with `uv run`, e.g.:
|
|
20
|
+
|
|
21
|
+
- Run tests: `uv run pytest`
|
|
22
|
+
- Run test "name": `uv run pytest -k name`
|
|
23
|
+
- Run test with marker "marker": `uv run pytest -m marker`
|
|
24
|
+
- Run test in specific path "tests/file.py": `uv run pytest tests/file.py`
|
|
25
|
+
- Collect tests: `uv run pytest --co`
|
|
26
|
+
- Lint/format: `uv run ruff check`, `uv run ruff format --check`, `uv run ty check`
|
|
27
|
+
|
|
28
|
+
## Commit Messages
|
|
29
|
+
|
|
30
|
+
For agent template dependency update commits, use this format:
|
|
31
|
+
|
|
32
|
+
```text
|
|
33
|
+
chore: update agent template dependencies
|
|
34
|
+
|
|
35
|
+
Updated versions:
|
|
36
|
+
|
|
37
|
+
- <tool>: <old> -> <new>
|
|
38
|
+
|
|
39
|
+
Python dependency updates:
|
|
40
|
+
|
|
41
|
+
- <package>: <old> -> <new>
|
|
42
|
+
|
|
43
|
+
Signed-off-by: <name> <email>
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
- Omit a section if there are no entries for it.
|
|
47
|
+
- Use the package/tool names as they appear in the project where practical, preserving established capitalization from previous dependency update commits.
|
|
48
|
+
- Include transitive Python dependency changes from `uv.lock` under "Python dependency updates".
|
|
49
|
+
|
|
50
|
+
## Testing Patterns
|
|
51
|
+
|
|
52
|
+
- Naming: `test_<feature>_<scenario>.py`, test functions `test_<action>_<expected_outcome>`
|
|
53
|
+
- Create tests for utility functions such as parsing functions.
|
|
54
|
+
- You won't be able to run any docker-related commands because you are running inside a container and you don't have the docker socket mounted into it.
|
|
55
|
+
|
|
56
|
+
## Implementation Details
|
|
57
|
+
|
|
58
|
+
- Add concise/precise docstrings to utility functions.
|
|
59
|
+
- Docstrings use Python Sphinx format (e.g. `:param foo:`, `:returns:`, `:raises ValueError:`).
|
|
60
|
+
- Add Python typing hints where possible.
|
|
61
|
+
- Prefer pragmatic solutions; if a shortcut is taken, call out the shortcomings explicitly.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@AGENTS.md
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 rpoisel
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
6
|
+
|
|
7
|
+
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
8
|
+
|
|
9
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|