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.
Files changed (84) hide show
  1. agent_circus-0.1.0/.envrc.dist +15 -0
  2. agent_circus-0.1.0/.github/dependabot.yml +58 -0
  3. agent_circus-0.1.0/.github/workflows/ci.yml +43 -0
  4. agent_circus-0.1.0/.github/workflows/publish-pypi.yml +106 -0
  5. agent_circus-0.1.0/.github/workflows/publish-testpypi.yml +77 -0
  6. agent_circus-0.1.0/.github/workflows/security.yml +57 -0
  7. agent_circus-0.1.0/.gitignore +179 -0
  8. agent_circus-0.1.0/.pre-commit-config.yaml +33 -0
  9. agent_circus-0.1.0/.yamlfmt +27 -0
  10. agent_circus-0.1.0/.yamllint.yaml +12 -0
  11. agent_circus-0.1.0/AGENTS.md +61 -0
  12. agent_circus-0.1.0/CLAUDE.md +1 -0
  13. agent_circus-0.1.0/LICENSE +9 -0
  14. agent_circus-0.1.0/Makefile +49 -0
  15. agent_circus-0.1.0/PKG-INFO +1195 -0
  16. agent_circus-0.1.0/README.md +1170 -0
  17. agent_circus-0.1.0/assets/agent_circus_logo.png +0 -0
  18. agent_circus-0.1.0/assets/open_protocols.svg +22 -0
  19. agent_circus-0.1.0/devenv.lock +103 -0
  20. agent_circus-0.1.0/devenv.nix +27 -0
  21. agent_circus-0.1.0/devenv.yaml +24 -0
  22. agent_circus-0.1.0/pyproject.toml +78 -0
  23. agent_circus-0.1.0/src/agent_circus/__init__.py +5 -0
  24. agent_circus-0.1.0/src/agent_circus/agent_config.py +357 -0
  25. agent_circus-0.1.0/src/agent_circus/cli.py +73 -0
  26. agent_circus-0.1.0/src/agent_circus/commands/__init__.py +5 -0
  27. agent_circus-0.1.0/src/agent_circus/commands/build.py +83 -0
  28. agent_circus-0.1.0/src/agent_circus/commands/config_store.py +104 -0
  29. agent_circus-0.1.0/src/agent_circus/commands/destroy.py +123 -0
  30. agent_circus-0.1.0/src/agent_circus/commands/exec_.py +140 -0
  31. agent_circus-0.1.0/src/agent_circus/commands/init.py +498 -0
  32. agent_circus-0.1.0/src/agent_circus/commands/ps.py +113 -0
  33. agent_circus-0.1.0/src/agent_circus/commands/remove.py +127 -0
  34. agent_circus-0.1.0/src/agent_circus/commands/up.py +86 -0
  35. agent_circus-0.1.0/src/agent_circus/compose.py +481 -0
  36. agent_circus-0.1.0/src/agent_circus/config.py +1478 -0
  37. agent_circus-0.1.0/src/agent_circus/context.py +599 -0
  38. agent_circus-0.1.0/src/agent_circus/exceptions.py +29 -0
  39. agent_circus-0.1.0/src/agent_circus/mcp.py +164 -0
  40. agent_circus-0.1.0/src/agent_circus/runtime.py +109 -0
  41. agent_circus-0.1.0/src/agent_circus/state.py +343 -0
  42. agent_circus-0.1.0/src/agent_circus/templates/__init__.py +113 -0
  43. agent_circus-0.1.0/src/agent_circus/templates/agent-circus/Dockerfile +164 -0
  44. agent_circus-0.1.0/src/agent_circus/templates/agent-circus/compose.yaml +92 -0
  45. agent_circus-0.1.0/src/agent_circus/templates/agent-circus/docker-entrypoint.sh +57 -0
  46. agent_circus-0.1.0/src/agent_circus/templates/agent-circus/hooks/base-root.sh +3 -0
  47. agent_circus-0.1.0/src/agent_circus/templates/agent-circus/hooks/base-user.sh +3 -0
  48. agent_circus-0.1.0/src/agent_circus/templates/agent-circus/init-firewall.sh +147 -0
  49. agent_circus-0.1.0/src/agent_circus/templates/agent-circus/install-ca-certs.sh +9 -0
  50. agent_circus-0.1.0/src/agent_circus/templates/agent-circus/pyproject.toml +16 -0
  51. agent_circus-0.1.0/src/agent_circus/templates/agent-circus/setup-claude-mem.sh +24 -0
  52. agent_circus-0.1.0/src/agent_circus/templates/agent-circus/uv.lock +1531 -0
  53. agent_circus-0.1.0/src/agent_circus/update_versions.py +388 -0
  54. agent_circus-0.1.0/src/agent_circus/utils.py +28 -0
  55. agent_circus-0.1.0/tests/smoke_test_package.py +18 -0
  56. agent_circus-0.1.0/tests/test_additional_dirs.py +66 -0
  57. agent_circus-0.1.0/tests/test_agent_config.py +650 -0
  58. agent_circus-0.1.0/tests/test_ca_certs.py +88 -0
  59. agent_circus-0.1.0/tests/test_claude_mem.py +159 -0
  60. agent_circus-0.1.0/tests/test_command_validation_errors.py +39 -0
  61. agent_circus-0.1.0/tests/test_compose.py +260 -0
  62. agent_circus-0.1.0/tests/test_config.py +292 -0
  63. agent_circus-0.1.0/tests/test_config_store_command.py +72 -0
  64. agent_circus-0.1.0/tests/test_config_validation.py +126 -0
  65. agent_circus-0.1.0/tests/test_context.py +559 -0
  66. agent_circus-0.1.0/tests/test_data_stores.py +316 -0
  67. agent_circus-0.1.0/tests/test_destroy.py +93 -0
  68. agent_circus-0.1.0/tests/test_env_passthrough.py +82 -0
  69. agent_circus-0.1.0/tests/test_exec_auto_up.py +195 -0
  70. agent_circus-0.1.0/tests/test_git.py +46 -0
  71. agent_circus-0.1.0/tests/test_hooks_config.py +237 -0
  72. agent_circus-0.1.0/tests/test_hosts.py +136 -0
  73. agent_circus-0.1.0/tests/test_init_config.py +219 -0
  74. agent_circus-0.1.0/tests/test_llama_cpp.py +178 -0
  75. agent_circus-0.1.0/tests/test_mcp.py +217 -0
  76. agent_circus-0.1.0/tests/test_port_forwards.py +92 -0
  77. agent_circus-0.1.0/tests/test_runtime.py +49 -0
  78. agent_circus-0.1.0/tests/test_ssh.py +90 -0
  79. agent_circus-0.1.0/tests/test_startup_hook.py +50 -0
  80. agent_circus-0.1.0/tests/test_state.py +69 -0
  81. agent_circus-0.1.0/tests/test_templates.py +78 -0
  82. agent_circus-0.1.0/tests/test_update_versions.py +291 -0
  83. agent_circus-0.1.0/tests/test_utils.py +37 -0
  84. agent_circus-0.1.0/uv.lock +689 -0
@@ -0,0 +1,15 @@
1
+ eval "$(devenv direnvrc)"
2
+
3
+ use devenv
4
+
5
+ if [ -f .env.enc ]; then
6
+ set -a
7
+ eval $(sops --decrypt --input-type dotenv --output-type dotenv .env.enc)
8
+ set +a
9
+ fi
10
+
11
+ if [ -f .env ]; then
12
+ set -a
13
+ . .env
14
+ set +a
15
+ fi
@@ -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,12 @@
1
+ ---
2
+ extends: default
3
+
4
+ rules:
5
+ indentation:
6
+ spaces: 2
7
+ indent-sequences: false
8
+ line-length:
9
+ allow-non-breakable-words: true
10
+ max: 120
11
+
12
+ document-start: disable
@@ -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.