codexloop 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.
- codexloop-0.1.0/.agents/skills/codexloop-run/SKILL.md +12 -0
- codexloop-0.1.0/.claude/skills/codexloop-run/SKILL.md +12 -0
- codexloop-0.1.0/.cursor/rules/codexloop-run.mdc +13 -0
- codexloop-0.1.0/.editorconfig +22 -0
- codexloop-0.1.0/.github/CODEOWNERS +2 -0
- codexloop-0.1.0/.github/workflows/ci.yml +59 -0
- codexloop-0.1.0/.github/workflows/publish-testpypi.yml +35 -0
- codexloop-0.1.0/.github/workflows/release-please.yml +75 -0
- codexloop-0.1.0/.gitignore +48 -0
- codexloop-0.1.0/.pre-commit-config.yaml +72 -0
- codexloop-0.1.0/.release-please-manifest.json +3 -0
- codexloop-0.1.0/AGENTS.md +10 -0
- codexloop-0.1.0/CHANGELOG.md +42 -0
- codexloop-0.1.0/CLAUDE.md +5 -0
- codexloop-0.1.0/CODE_OF_CONDUCT.md +4 -0
- codexloop-0.1.0/CONTRIBUTING.md +29 -0
- codexloop-0.1.0/LICENSE +21 -0
- codexloop-0.1.0/PKG-INFO +104 -0
- codexloop-0.1.0/README.md +53 -0
- codexloop-0.1.0/SECURITY.md +13 -0
- codexloop-0.1.0/docs/architecture/adr/0001-onion-import-linter.md +17 -0
- codexloop-0.1.0/docs/architecture/adr/0002-subprocess-codex-exec.md +17 -0
- codexloop-0.1.0/docs/architecture/adr/0003-credits-exhausted.md +17 -0
- codexloop-0.1.0/docs/architecture/adr/0004-adaptive-probe-loop.md +17 -0
- codexloop-0.1.0/docs/architecture/adr/0005-layered-capacity-probe.md +17 -0
- codexloop-0.1.0/docs/architecture/adr/0006-generated-openai-rest.md +17 -0
- codexloop-0.1.0/docs/architecture/adr/0007-default-approval-sandbox.md +17 -0
- codexloop-0.1.0/docs/architecture/adr/0008-policy-via-c-flags.md +17 -0
- codexloop-0.1.0/docs/architecture/adr/0009-optional-app-server.md +17 -0
- codexloop-0.1.0/docs/architecture/adr/0010-rollout-best-effort.md +17 -0
- codexloop-0.1.0/docs/architecture/adr/0011-never-consume-resets.md +17 -0
- codexloop-0.1.0/docs/architecture/adr/0012-minimum-codex-version.md +17 -0
- codexloop-0.1.0/docs/architecture/adr/index.md +16 -0
- codexloop-0.1.0/docs/architecture/index.md +12 -0
- codexloop-0.1.0/docs/contributing.md +29 -0
- codexloop-0.1.0/docs/getting-started.md +28 -0
- codexloop-0.1.0/docs/guides/rest-api-surface.md +56 -0
- codexloop-0.1.0/docs/index.md +13 -0
- codexloop-0.1.0/docs/plans/_shared-transplant-outline.md +72 -0
- codexloop-0.1.0/docs/plans/architecture-and-roadmap.md +954 -0
- codexloop-0.1.0/docs/plans/research-notes.md +940 -0
- codexloop-0.1.0/docs/publishing.md +65 -0
- codexloop-0.1.0/docs/reference/cli.md +12 -0
- codexloop-0.1.0/docs/superpowers/plans/2026-08-13-codexloop-implementation.md +852 -0
- codexloop-0.1.0/mkdocs.yml +28 -0
- codexloop-0.1.0/pyproject.toml +175 -0
- codexloop-0.1.0/release-please-config.json +9 -0
- codexloop-0.1.0/src/codexloop/__init__.py +3 -0
- codexloop-0.1.0/src/codexloop/application/__init__.py +1 -0
- codexloop-0.1.0/src/codexloop/application/dto.py +41 -0
- codexloop-0.1.0/src/codexloop/application/ports.py +158 -0
- codexloop-0.1.0/src/codexloop/application/runner.py +467 -0
- codexloop-0.1.0/src/codexloop/application/usecases/__init__.py +1 -0
- codexloop-0.1.0/src/codexloop/application/usecases/doctor.py +37 -0
- codexloop-0.1.0/src/codexloop/application/usecases/list_threads.py +14 -0
- codexloop-0.1.0/src/codexloop/application/usecases/preflight.py +10 -0
- codexloop-0.1.0/src/codexloop/application/usecases/resume_thread.py +11 -0
- codexloop-0.1.0/src/codexloop/application/usecases/run_control.py +20 -0
- codexloop-0.1.0/src/codexloop/application/usecases/run_plan.py +11 -0
- codexloop-0.1.0/src/codexloop/bootstrap.py +461 -0
- codexloop-0.1.0/src/codexloop/cli/__init__.py +1 -0
- codexloop-0.1.0/src/codexloop/cli/app.py +94 -0
- codexloop-0.1.0/src/codexloop/cli/asyncio.py +80 -0
- codexloop-0.1.0/src/codexloop/cli/commands/__init__.py +1 -0
- codexloop-0.1.0/src/codexloop/cli/commands/approval_cmd.py +24 -0
- codexloop-0.1.0/src/codexloop/cli/commands/capacity.py +33 -0
- codexloop-0.1.0/src/codexloop/cli/commands/cwd_cmd.py +22 -0
- codexloop-0.1.0/src/codexloop/cli/commands/doctor.py +27 -0
- codexloop-0.1.0/src/codexloop/cli/commands/effort_cmd.py +24 -0
- codexloop-0.1.0/src/codexloop/cli/commands/logs.py +15 -0
- codexloop-0.1.0/src/codexloop/cli/commands/model_cmd.py +22 -0
- codexloop-0.1.0/src/codexloop/cli/commands/prompt.py +32 -0
- codexloop-0.1.0/src/codexloop/cli/commands/reset.py +25 -0
- codexloop-0.1.0/src/codexloop/cli/commands/resume.py +38 -0
- codexloop-0.1.0/src/codexloop/cli/commands/run.py +50 -0
- codexloop-0.1.0/src/codexloop/cli/commands/runs.py +13 -0
- codexloop-0.1.0/src/codexloop/cli/commands/sandbox_cmd.py +24 -0
- codexloop-0.1.0/src/codexloop/cli/commands/savepoints.py +25 -0
- codexloop-0.1.0/src/codexloop/cli/commands/snapshot.py +26 -0
- codexloop-0.1.0/src/codexloop/cli/commands/status.py +15 -0
- codexloop-0.1.0/src/codexloop/cli/commands/stop.py +21 -0
- codexloop-0.1.0/src/codexloop/cli/commands/threads.py +15 -0
- codexloop-0.1.0/src/codexloop/cli/commands/unwind.py +24 -0
- codexloop-0.1.0/src/codexloop/cli/commands/watch.py +66 -0
- codexloop-0.1.0/src/codexloop/cli/render.py +39 -0
- codexloop-0.1.0/src/codexloop/domain/__init__.py +26 -0
- codexloop-0.1.0/src/codexloop/domain/approval.py +38 -0
- codexloop-0.1.0/src/codexloop/domain/backoff.py +34 -0
- codexloop-0.1.0/src/codexloop/domain/budget.py +56 -0
- codexloop-0.1.0/src/codexloop/domain/capacity.py +81 -0
- codexloop-0.1.0/src/codexloop/domain/classify.py +98 -0
- codexloop-0.1.0/src/codexloop/domain/completion.py +130 -0
- codexloop-0.1.0/src/codexloop/domain/control.py +167 -0
- codexloop-0.1.0/src/codexloop/domain/error_codes.py +75 -0
- codexloop-0.1.0/src/codexloop/domain/errors.py +35 -0
- codexloop-0.1.0/src/codexloop/domain/loop.py +190 -0
- codexloop-0.1.0/src/codexloop/domain/model_profile.py +30 -0
- codexloop-0.1.0/src/codexloop/domain/plan.py +38 -0
- codexloop-0.1.0/src/codexloop/domain/savepoint.py +32 -0
- codexloop-0.1.0/src/codexloop/domain/savepoint_message.py +56 -0
- codexloop-0.1.0/src/codexloop/domain/session.py +32 -0
- codexloop-0.1.0/src/codexloop/domain/signals.py +25 -0
- codexloop-0.1.0/src/codexloop/domain/waiting.py +120 -0
- codexloop-0.1.0/src/codexloop/infrastructure/__init__.py +0 -0
- codexloop-0.1.0/src/codexloop/infrastructure/agent/__init__.py +0 -0
- codexloop-0.1.0/src/codexloop/infrastructure/agent/argv.py +102 -0
- codexloop-0.1.0/src/codexloop/infrastructure/agent/events.py +274 -0
- codexloop-0.1.0/src/codexloop/infrastructure/agent/gateway.py +189 -0
- codexloop-0.1.0/src/codexloop/infrastructure/agent/probe.py +74 -0
- codexloop-0.1.0/src/codexloop/infrastructure/agent/process.py +208 -0
- codexloop-0.1.0/src/codexloop/infrastructure/agent/schema.py +31 -0
- codexloop-0.1.0/src/codexloop/infrastructure/agent/scripted.py +201 -0
- codexloop-0.1.0/src/codexloop/infrastructure/agent/translate.py +120 -0
- codexloop-0.1.0/src/codexloop/infrastructure/api/__init__.py +26 -0
- codexloop-0.1.0/src/codexloop/infrastructure/api/api_baseline.json +340 -0
- codexloop-0.1.0/src/codexloop/infrastructure/api/binder.py +170 -0
- codexloop-0.1.0/src/codexloop/infrastructure/api/gateway.py +142 -0
- codexloop-0.1.0/src/codexloop/infrastructure/api/introspect.py +248 -0
- codexloop-0.1.0/src/codexloop/infrastructure/api/json_io.py +26 -0
- codexloop-0.1.0/src/codexloop/infrastructure/api/params.py +162 -0
- codexloop-0.1.0/src/codexloop/infrastructure/api/providers.py +70 -0
- codexloop-0.1.0/src/codexloop/infrastructure/api/registry.py +13 -0
- codexloop-0.1.0/src/codexloop/infrastructure/appserver/__init__.py +6 -0
- codexloop-0.1.0/src/codexloop/infrastructure/appserver/client.py +245 -0
- codexloop-0.1.0/src/codexloop/infrastructure/appserver/gateway.py +437 -0
- codexloop-0.1.0/src/codexloop/infrastructure/appserver/ratelimits.py +100 -0
- codexloop-0.1.0/src/codexloop/infrastructure/audit.py +26 -0
- codexloop-0.1.0/src/codexloop/infrastructure/capacity_probe.py +57 -0
- codexloop-0.1.0/src/codexloop/infrastructure/clock.py +26 -0
- codexloop-0.1.0/src/codexloop/infrastructure/config.py +150 -0
- codexloop-0.1.0/src/codexloop/infrastructure/control.py +89 -0
- codexloop-0.1.0/src/codexloop/infrastructure/doctor_env.py +239 -0
- codexloop-0.1.0/src/codexloop/infrastructure/events.py +23 -0
- codexloop-0.1.0/src/codexloop/infrastructure/git_savepoints.py +176 -0
- codexloop-0.1.0/src/codexloop/infrastructure/lock.py +88 -0
- codexloop-0.1.0/src/codexloop/infrastructure/logging.py +124 -0
- codexloop-0.1.0/src/codexloop/infrastructure/notify.py +27 -0
- codexloop-0.1.0/src/codexloop/infrastructure/progress.py +14 -0
- codexloop-0.1.0/src/codexloop/infrastructure/redact.py +52 -0
- codexloop-0.1.0/src/codexloop/infrastructure/rollout.py +113 -0
- codexloop-0.1.0/src/codexloop/infrastructure/rundir.py +57 -0
- codexloop-0.1.0/src/codexloop/infrastructure/snapshot.py +39 -0
- codexloop-0.1.0/src/codexloop/infrastructure/state.py +32 -0
- codexloop-0.1.0/src/codexloop/infrastructure/state_bus.py +27 -0
- codexloop-0.1.0/src/codexloop/infrastructure/stream_ui.py +44 -0
- codexloop-0.1.0/src/codexloop/py.typed +0 -0
- codexloop-0.1.0/tests/__init__.py +0 -0
- codexloop-0.1.0/tests/application/__init__.py +1 -0
- codexloop-0.1.0/tests/application/fakes.py +304 -0
- codexloop-0.1.0/tests/application/test_doctor.py +23 -0
- codexloop-0.1.0/tests/application/test_ports.py +112 -0
- codexloop-0.1.0/tests/application/test_runner.py +642 -0
- codexloop-0.1.0/tests/application/test_usecases.py +108 -0
- codexloop-0.1.0/tests/application/test_waiting_runner.py +203 -0
- codexloop-0.1.0/tests/cli/__init__.py +1 -0
- codexloop-0.1.0/tests/cli/test_api.py +38 -0
- codexloop-0.1.0/tests/cli/test_app.py +407 -0
- codexloop-0.1.0/tests/cli/test_asyncio.py +93 -0
- codexloop-0.1.0/tests/cli/test_e2e_shim.py +48 -0
- codexloop-0.1.0/tests/cli/test_ops_commands.py +418 -0
- codexloop-0.1.0/tests/conftest.py +52 -0
- codexloop-0.1.0/tests/domain/__init__.py +0 -0
- codexloop-0.1.0/tests/domain/strategies.py +102 -0
- codexloop-0.1.0/tests/domain/test_approval.py +57 -0
- codexloop-0.1.0/tests/domain/test_backoff.py +135 -0
- codexloop-0.1.0/tests/domain/test_budget.py +75 -0
- codexloop-0.1.0/tests/domain/test_capacity.py +133 -0
- codexloop-0.1.0/tests/domain/test_classify.py +234 -0
- codexloop-0.1.0/tests/domain/test_completion.py +263 -0
- codexloop-0.1.0/tests/domain/test_control.py +150 -0
- codexloop-0.1.0/tests/domain/test_error_codes.py +103 -0
- codexloop-0.1.0/tests/domain/test_loop.py +633 -0
- codexloop-0.1.0/tests/domain/test_model_profile.py +27 -0
- codexloop-0.1.0/tests/domain/test_plan.py +70 -0
- codexloop-0.1.0/tests/domain/test_savepoint.py +62 -0
- codexloop-0.1.0/tests/domain/test_session.py +33 -0
- codexloop-0.1.0/tests/domain/test_waiting.py +280 -0
- codexloop-0.1.0/tests/fixtures/jsonl/README.md +11 -0
- codexloop-0.1.0/tests/fixtures/jsonl/clean_completion.jsonl +4 -0
- codexloop-0.1.0/tests/fixtures/jsonl/done_with_marker.jsonl +4 -0
- codexloop-0.1.0/tests/fixtures/jsonl/huge_line.jsonl +1 -0
- codexloop-0.1.0/tests/fixtures/jsonl/malformed_line.jsonl +3 -0
- codexloop-0.1.0/tests/fixtures/jsonl/tool_heavy.jsonl +10 -0
- codexloop-0.1.0/tests/fixtures/jsonl/truncated_stream.jsonl +2 -0
- codexloop-0.1.0/tests/fixtures/jsonl/turn_failed_429_quota.jsonl +3 -0
- codexloop-0.1.0/tests/fixtures/jsonl/turn_failed_429_window.jsonl +3 -0
- codexloop-0.1.0/tests/infrastructure/__init__.py +0 -0
- codexloop-0.1.0/tests/infrastructure/api/__init__.py +0 -0
- codexloop-0.1.0/tests/infrastructure/api/test_binder.py +45 -0
- codexloop-0.1.0/tests/infrastructure/api/test_drift.py +43 -0
- codexloop-0.1.0/tests/infrastructure/api/test_gateway.py +189 -0
- codexloop-0.1.0/tests/infrastructure/api/test_introspect.py +33 -0
- codexloop-0.1.0/tests/infrastructure/api/test_json_io.py +37 -0
- codexloop-0.1.0/tests/infrastructure/api/test_params.py +20 -0
- codexloop-0.1.0/tests/infrastructure/api/test_params_extra.py +79 -0
- codexloop-0.1.0/tests/infrastructure/api/test_providers.py +69 -0
- codexloop-0.1.0/tests/infrastructure/api/test_providers_gateway_extra.py +163 -0
- codexloop-0.1.0/tests/infrastructure/test_appserver.py +139 -0
- codexloop-0.1.0/tests/infrastructure/test_appserver_gateway.py +215 -0
- codexloop-0.1.0/tests/infrastructure/test_argv.py +303 -0
- codexloop-0.1.0/tests/infrastructure/test_capacity_probe.py +225 -0
- codexloop-0.1.0/tests/infrastructure/test_config.py +199 -0
- codexloop-0.1.0/tests/infrastructure/test_control_and_savepoints.py +146 -0
- codexloop-0.1.0/tests/infrastructure/test_coverage_boost.py +308 -0
- codexloop-0.1.0/tests/infrastructure/test_doctor_env.py +153 -0
- codexloop-0.1.0/tests/infrastructure/test_events.py +562 -0
- codexloop-0.1.0/tests/infrastructure/test_gateway.py +353 -0
- codexloop-0.1.0/tests/infrastructure/test_lock.py +124 -0
- codexloop-0.1.0/tests/infrastructure/test_logging_redact.py +180 -0
- codexloop-0.1.0/tests/infrastructure/test_probe.py +119 -0
- codexloop-0.1.0/tests/infrastructure/test_process.py +191 -0
- codexloop-0.1.0/tests/infrastructure/test_ratelimits_extra.py +44 -0
- codexloop-0.1.0/tests/infrastructure/test_rollout.py +347 -0
- codexloop-0.1.0/tests/infrastructure/test_rundir_state.py +109 -0
- codexloop-0.1.0/tests/infrastructure/test_scripted.py +164 -0
- codexloop-0.1.0/tests/infrastructure/test_snapshot.py +41 -0
- codexloop-0.1.0/tests/infrastructure/test_state_bus.py +29 -0
- codexloop-0.1.0/tests/infrastructure/test_stream_ui.py +27 -0
- codexloop-0.1.0/tests/infrastructure/test_translate.py +290 -0
- codexloop-0.1.0/tests/live/fixtures/agent_scripts/done.json +11 -0
- codexloop-0.1.0/tests/live/fixtures/agent_scripts/quota_then_topup.json +18 -0
- codexloop-0.1.0/tests/live/fixtures/agent_scripts/unknown_429.json +18 -0
- codexloop-0.1.0/tests/live/fixtures/agent_scripts/wait_long.json +33 -0
- codexloop-0.1.0/tests/live/fixtures/agent_scripts/window_then_done.json +23 -0
- codexloop-0.1.0/tests/live/system/conftest.py +139 -0
- codexloop-0.1.0/tests/live/system/test_matrix_inprocess.py +163 -0
- codexloop-0.1.0/tests/live/system/test_subprocess_smoke.py +134 -0
- codexloop-0.1.0/tests/shim/__init__.py +1 -0
- codexloop-0.1.0/tests/shim/fake_appserver.py +148 -0
- codexloop-0.1.0/tests/shim/fake_codex.py +117 -0
- codexloop-0.1.0/tests/shim/test_fake_codex.py +281 -0
- codexloop-0.1.0/tests/test_bootstrap.py +324 -0
- codexloop-0.1.0/tests/test_no_vendor_leak.py +80 -0
- codexloop-0.1.0/tests/test_packaging.py +28 -0
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: codexloop-run
|
|
3
|
+
description: Run and debug codexloop autonomous sessions.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# codexloop-run
|
|
7
|
+
|
|
8
|
+
1. `codexloop doctor` before a long run.
|
|
9
|
+
2. Prefer `--transport exec` unless you need interrupt/steer.
|
|
10
|
+
3. Never pass `--full-auto`. Never invoke bare `codex`.
|
|
11
|
+
4. Capacity waits are probe-driven; billing walls (`insufficient_quota`) are terminal.
|
|
12
|
+
5. After SDK upgrades, refresh `api_baseline.json` only when intentional.
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: codexloop-run
|
|
3
|
+
description: Run and debug codexloop autonomous sessions.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# codexloop-run
|
|
7
|
+
|
|
8
|
+
1. `codexloop doctor` before a long run.
|
|
9
|
+
2. Prefer `--transport exec` unless you need interrupt/steer.
|
|
10
|
+
3. Never pass `--full-auto`. Never invoke bare `codex`.
|
|
11
|
+
4. Capacity waits are probe-driven; billing walls (`insufficient_quota`) are terminal.
|
|
12
|
+
5. After SDK upgrades, refresh `api_baseline.json` only when intentional.
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Run and debug codexloop autonomous sessions.
|
|
3
|
+
globs:
|
|
4
|
+
alwaysApply: false
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# codexloop-run
|
|
8
|
+
|
|
9
|
+
1. `codexloop doctor` before a long run.
|
|
10
|
+
2. Prefer `--transport exec` unless you need interrupt/steer.
|
|
11
|
+
3. Never pass `--full-auto`. Never invoke bare `codex`.
|
|
12
|
+
4. Capacity waits are probe-driven; billing walls (`insufficient_quota`) are terminal.
|
|
13
|
+
5. After SDK upgrades, refresh `api_baseline.json` only when intentional.
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
root = true
|
|
2
|
+
|
|
3
|
+
[*]
|
|
4
|
+
end_of_line = lf
|
|
5
|
+
insert_final_newline = true
|
|
6
|
+
trim_trailing_whitespace = true
|
|
7
|
+
charset = utf-8
|
|
8
|
+
indent_style = space
|
|
9
|
+
indent_size = 4
|
|
10
|
+
|
|
11
|
+
[*.py]
|
|
12
|
+
max_line_length = 100
|
|
13
|
+
|
|
14
|
+
[*.{yml,yaml,json}]
|
|
15
|
+
indent_size = 2
|
|
16
|
+
|
|
17
|
+
[*.md]
|
|
18
|
+
trim_trailing_whitespace = false
|
|
19
|
+
max_line_length = off
|
|
20
|
+
|
|
21
|
+
[Makefile]
|
|
22
|
+
indent_style = tab
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main, develop]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [main, develop]
|
|
8
|
+
|
|
9
|
+
permissions:
|
|
10
|
+
contents: read
|
|
11
|
+
|
|
12
|
+
concurrency:
|
|
13
|
+
group: ci-${{ github.workflow }}-${{ github.ref }}
|
|
14
|
+
cancel-in-progress: true
|
|
15
|
+
|
|
16
|
+
jobs:
|
|
17
|
+
quality:
|
|
18
|
+
name: Gates py${{ matrix.python-version }} / ${{ matrix.os }}
|
|
19
|
+
runs-on: ${{ matrix.os }}
|
|
20
|
+
strategy:
|
|
21
|
+
fail-fast: false
|
|
22
|
+
matrix:
|
|
23
|
+
os: [ubuntu-latest, macos-latest]
|
|
24
|
+
python-version: ["3.12", "3.13"]
|
|
25
|
+
steps:
|
|
26
|
+
- uses: actions/checkout@v7.0.1
|
|
27
|
+
- uses: actions/setup-python@v7.0.0
|
|
28
|
+
with:
|
|
29
|
+
python-version: ${{ matrix.python-version }}
|
|
30
|
+
- run: python -m pip install --upgrade pip
|
|
31
|
+
- run: pip install -e ".[dev]"
|
|
32
|
+
- run: ruff check src tests
|
|
33
|
+
- run: ruff format --check src tests
|
|
34
|
+
- run: mypy src/codexloop
|
|
35
|
+
- run: lint-imports
|
|
36
|
+
- run: bandit -q -r src/codexloop
|
|
37
|
+
- run: pip-audit
|
|
38
|
+
- run: pytest --cov-report=term-missing
|
|
39
|
+
|
|
40
|
+
build:
|
|
41
|
+
name: Package builds and is installable
|
|
42
|
+
runs-on: ubuntu-latest
|
|
43
|
+
steps:
|
|
44
|
+
- uses: actions/checkout@v7.0.1
|
|
45
|
+
- uses: actions/setup-python@v7.0.0
|
|
46
|
+
with:
|
|
47
|
+
python-version: "3.12"
|
|
48
|
+
- run: python -m pip install --upgrade pip build twine
|
|
49
|
+
- run: python -m build
|
|
50
|
+
- run: twine check --strict dist/*
|
|
51
|
+
- name: Confirm py.typed ships in the wheel
|
|
52
|
+
run: unzip -l dist/*.whl | grep -q py.typed
|
|
53
|
+
- name: Install the built wheel into a clean venv and run the console script
|
|
54
|
+
run: |
|
|
55
|
+
python -m venv /tmp/codexloop-smoke
|
|
56
|
+
/tmp/codexloop-smoke/bin/pip install --upgrade pip
|
|
57
|
+
/tmp/codexloop-smoke/bin/pip install dist/*.whl
|
|
58
|
+
/tmp/codexloop-smoke/bin/codexloop --version
|
|
59
|
+
/tmp/codexloop-smoke/bin/codexloop --help
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
name: Publish TestPyPI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
workflow_dispatch:
|
|
5
|
+
push:
|
|
6
|
+
branches: [develop]
|
|
7
|
+
|
|
8
|
+
permissions:
|
|
9
|
+
contents: read
|
|
10
|
+
id-token: write
|
|
11
|
+
|
|
12
|
+
concurrency:
|
|
13
|
+
group: testpypi-${{ github.ref }}
|
|
14
|
+
cancel-in-progress: true
|
|
15
|
+
|
|
16
|
+
jobs:
|
|
17
|
+
publish:
|
|
18
|
+
name: Build and publish to TestPyPI
|
|
19
|
+
runs-on: ubuntu-latest
|
|
20
|
+
environment: testpypi
|
|
21
|
+
steps:
|
|
22
|
+
- uses: actions/checkout@v4
|
|
23
|
+
- uses: actions/setup-python@v5
|
|
24
|
+
with:
|
|
25
|
+
python-version: "3.12"
|
|
26
|
+
- run: python -m pip install --upgrade pip build twine
|
|
27
|
+
- run: python -m build
|
|
28
|
+
- run: twine check --strict dist/*
|
|
29
|
+
- name: Publish to TestPyPI
|
|
30
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
31
|
+
with:
|
|
32
|
+
repository-url: https://test.pypi.org/legacy/
|
|
33
|
+
packages-dir: dist/
|
|
34
|
+
skip-existing: true
|
|
35
|
+
print-hash: true
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
name: release-please
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
workflow_dispatch:
|
|
7
|
+
inputs:
|
|
8
|
+
publish_to_testpypi:
|
|
9
|
+
description: "Also build and publish this commit to TestPyPI (Trusted Publishing)."
|
|
10
|
+
type: boolean
|
|
11
|
+
default: false
|
|
12
|
+
|
|
13
|
+
permissions:
|
|
14
|
+
contents: write
|
|
15
|
+
pull-requests: write
|
|
16
|
+
id-token: write
|
|
17
|
+
|
|
18
|
+
jobs:
|
|
19
|
+
release-please:
|
|
20
|
+
runs-on: ubuntu-latest
|
|
21
|
+
outputs:
|
|
22
|
+
release_created: ${{ steps.release.outputs.release_created }}
|
|
23
|
+
tag_name: ${{ steps.release.outputs.tag_name }}
|
|
24
|
+
steps:
|
|
25
|
+
- uses: googleapis/release-please-action@v4
|
|
26
|
+
id: release
|
|
27
|
+
with:
|
|
28
|
+
release-type: python
|
|
29
|
+
config-file: release-please-config.json
|
|
30
|
+
manifest-file: .release-please-manifest.json
|
|
31
|
+
|
|
32
|
+
publish-pypi:
|
|
33
|
+
needs: release-please
|
|
34
|
+
if: ${{ needs.release-please.outputs.release_created == 'true' }}
|
|
35
|
+
runs-on: ubuntu-latest
|
|
36
|
+
environment: pypi
|
|
37
|
+
permissions:
|
|
38
|
+
id-token: write
|
|
39
|
+
contents: read
|
|
40
|
+
steps:
|
|
41
|
+
- uses: actions/checkout@v4
|
|
42
|
+
with:
|
|
43
|
+
ref: ${{ needs.release-please.outputs.tag_name }}
|
|
44
|
+
- uses: actions/setup-python@v5
|
|
45
|
+
with:
|
|
46
|
+
python-version: "3.12"
|
|
47
|
+
- run: python -m pip install --upgrade pip build twine
|
|
48
|
+
- run: python -m build
|
|
49
|
+
- run: twine check --strict dist/*
|
|
50
|
+
- uses: pypa/gh-action-pypi-publish@release/v1
|
|
51
|
+
with:
|
|
52
|
+
packages-dir: dist/
|
|
53
|
+
print-hash: true
|
|
54
|
+
|
|
55
|
+
publish-testpypi-manual:
|
|
56
|
+
if: ${{ github.event_name == 'workflow_dispatch' && inputs.publish_to_testpypi }}
|
|
57
|
+
runs-on: ubuntu-latest
|
|
58
|
+
environment: testpypi
|
|
59
|
+
permissions:
|
|
60
|
+
id-token: write
|
|
61
|
+
contents: read
|
|
62
|
+
steps:
|
|
63
|
+
- uses: actions/checkout@v4
|
|
64
|
+
- uses: actions/setup-python@v5
|
|
65
|
+
with:
|
|
66
|
+
python-version: "3.12"
|
|
67
|
+
- run: python -m pip install --upgrade pip build twine
|
|
68
|
+
- run: python -m build
|
|
69
|
+
- run: twine check --strict dist/*
|
|
70
|
+
- uses: pypa/gh-action-pypi-publish@release/v1
|
|
71
|
+
with:
|
|
72
|
+
repository-url: https://test.pypi.org/legacy/
|
|
73
|
+
packages-dir: dist/
|
|
74
|
+
skip-existing: true
|
|
75
|
+
print-hash: true
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# --- Python ---
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*$py.class
|
|
5
|
+
*.so
|
|
6
|
+
.Python
|
|
7
|
+
build/
|
|
8
|
+
dist/
|
|
9
|
+
*.egg-info/
|
|
10
|
+
*.egg
|
|
11
|
+
wheels/
|
|
12
|
+
pip-wheel-metadata/
|
|
13
|
+
|
|
14
|
+
# --- Virtual environments ---
|
|
15
|
+
.venv/
|
|
16
|
+
venv/
|
|
17
|
+
env/
|
|
18
|
+
ENV/
|
|
19
|
+
|
|
20
|
+
# --- Test / coverage / type-check / lint caches ---
|
|
21
|
+
.pytest_cache/
|
|
22
|
+
.hypothesis/
|
|
23
|
+
.coverage
|
|
24
|
+
.coverage.*
|
|
25
|
+
coverage.xml
|
|
26
|
+
htmlcov/
|
|
27
|
+
.mypy_cache/
|
|
28
|
+
.dmypy.json
|
|
29
|
+
dmypy.json
|
|
30
|
+
.ruff_cache/
|
|
31
|
+
.import_linter_cache/
|
|
32
|
+
.tox/
|
|
33
|
+
.nox/
|
|
34
|
+
|
|
35
|
+
# --- Docs build output ---
|
|
36
|
+
site/
|
|
37
|
+
|
|
38
|
+
# --- Editors / OS ---
|
|
39
|
+
.vscode/
|
|
40
|
+
.idea/
|
|
41
|
+
*.swp
|
|
42
|
+
.DS_Store
|
|
43
|
+
|
|
44
|
+
# --- Local run state ---
|
|
45
|
+
.codexloop/
|
|
46
|
+
|
|
47
|
+
# --- SDD scratch ---
|
|
48
|
+
.superpowers/
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# Install once per clone with: pre-commit install
|
|
2
|
+
# That single command wires up BOTH hook types below — no extra flags needed,
|
|
3
|
+
# because of `default_install_hook_types`.
|
|
4
|
+
default_install_hook_types: [pre-commit, commit-msg]
|
|
5
|
+
|
|
6
|
+
repos:
|
|
7
|
+
# --- Lint / format ---
|
|
8
|
+
- repo: https://github.com/astral-sh/ruff-pre-commit
|
|
9
|
+
rev: v0.16.2
|
|
10
|
+
hooks:
|
|
11
|
+
- id: ruff
|
|
12
|
+
args: [--fix]
|
|
13
|
+
- id: ruff-format
|
|
14
|
+
|
|
15
|
+
# --- Generic file hygiene ---
|
|
16
|
+
- repo: https://github.com/pre-commit/pre-commit-hooks
|
|
17
|
+
rev: v6.0.0
|
|
18
|
+
hooks:
|
|
19
|
+
- id: trailing-whitespace
|
|
20
|
+
- id: end-of-file-fixer
|
|
21
|
+
- id: check-merge-conflict
|
|
22
|
+
- id: check-added-large-files
|
|
23
|
+
args: [--maxkb=1024]
|
|
24
|
+
- id: check-yaml
|
|
25
|
+
- id: check-toml
|
|
26
|
+
- id: check-case-conflict
|
|
27
|
+
- id: mixed-line-ending
|
|
28
|
+
args: [--fix=lf]
|
|
29
|
+
- id: debug-statements
|
|
30
|
+
|
|
31
|
+
# --- Conventional Commits, enforced at commit-msg time ---
|
|
32
|
+
- repo: https://github.com/compilerla/conventional-pre-commit
|
|
33
|
+
rev: v4.4.0
|
|
34
|
+
hooks:
|
|
35
|
+
- id: conventional-pre-commit
|
|
36
|
+
stages: [commit-msg]
|
|
37
|
+
args:
|
|
38
|
+
- --strict
|
|
39
|
+
- feat
|
|
40
|
+
- fix
|
|
41
|
+
- docs
|
|
42
|
+
- style
|
|
43
|
+
- refactor
|
|
44
|
+
- perf
|
|
45
|
+
- test
|
|
46
|
+
- build
|
|
47
|
+
- ci
|
|
48
|
+
- chore
|
|
49
|
+
- revert
|
|
50
|
+
|
|
51
|
+
# --- Type checking and security, run locally against the project venv ---
|
|
52
|
+
- repo: local
|
|
53
|
+
hooks:
|
|
54
|
+
- id: mypy
|
|
55
|
+
name: mypy --strict
|
|
56
|
+
entry: mypy
|
|
57
|
+
language: system
|
|
58
|
+
types: [python]
|
|
59
|
+
pass_filenames: false
|
|
60
|
+
args: [src/codexloop]
|
|
61
|
+
- id: bandit
|
|
62
|
+
name: bandit
|
|
63
|
+
entry: bandit
|
|
64
|
+
language: system
|
|
65
|
+
types: [python]
|
|
66
|
+
pass_filenames: false
|
|
67
|
+
args: [-q, -r, src/codexloop]
|
|
68
|
+
- id: import-linter
|
|
69
|
+
name: import-linter (onion contract)
|
|
70
|
+
entry: lint-imports
|
|
71
|
+
language: system
|
|
72
|
+
pass_filenames: false
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# AGENTS.md — codexloop
|
|
2
|
+
|
|
3
|
+
Facts for coding agents (not procedures).
|
|
4
|
+
|
|
5
|
+
- Onion: domain (stdlib) → application → infrastructure → cli; only `bootstrap.py` spans layers.
|
|
6
|
+
- No `anthropic` / `claude-agent-sdk` / `claudeloop` anywhere under `src/`.
|
|
7
|
+
- `QuotaExhausted` has no reset field. Body-first classification. Never `--full-auto`. Never bare `codex`.
|
|
8
|
+
- Default pytest: `-m "not live and not system"`.
|
|
9
|
+
- Generated REST: `codexloop api` + `api_baseline.json` drift gate.
|
|
10
|
+
- App-server transport is optional and falls back to exec.
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## 0.1.0 (2026-08-13)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Features
|
|
7
|
+
|
|
8
|
+
* add app-server rate-limit probe client ([a30ef93](https://github.com/adammatthewsteinberger/codexloop/commit/a30ef9377685ef9aea8f5096e1759b0f6293574e))
|
|
9
|
+
* add application ports and fakes ([33e721d](https://github.com/adammatthewsteinberger/codexloop/commit/33e721d0dab21b38c614ab71ea7c3e47a8126fb3))
|
|
10
|
+
* add autonomous runner and run/resume use cases ([bd36f45](https://github.com/adammatthewsteinberger/codexloop/commit/bd36f457548c5969f0fd37453c2d1ab5727d3302))
|
|
11
|
+
* add backoff and adaptive wait policy ([43c70c6](https://github.com/adammatthewsteinberger/codexloop/commit/43c70c68396255e10c61907497c53dd0d1c2ba63))
|
|
12
|
+
* add bootstrap and core CLI commands ([6b6aafc](https://github.com/adammatthewsteinberger/codexloop/commit/6b6aafc94f8d2513282389f154682b1b5a97bcee))
|
|
13
|
+
* add capacity value objects ([1aa3fed](https://github.com/adammatthewsteinberger/codexloop/commit/1aa3fede743d6c5db518f869d03826788c64da5b))
|
|
14
|
+
* add clock, logging, config, rundir, state, and lock adapters ([8f7e4ad](https://github.com/adammatthewsteinberger/codexloop/commit/8f7e4ad1aad0f9a754e7ff5777898bfe5a35c5cd))
|
|
15
|
+
* add codex argv builder ([42ab842](https://github.com/adammatthewsteinberger/codexloop/commit/42ab8426e676b0c6b59bb655bfc94e4a607338ba))
|
|
16
|
+
* add control plane, savepoints, and ops CLI ([512e03f](https://github.com/adammatthewsteinberger/codexloop/commit/512e03f24eddf226425326b992eacc4732f1bc7b))
|
|
17
|
+
* add ephemeral read-only exec capacity probe ([427620b](https://github.com/adammatthewsteinberger/codexloop/commit/427620bda645389caf571bcef010d269d3457093))
|
|
18
|
+
* add error hierarchy and OpenAI error-code taxonomy ([1bf5aa2](https://github.com/adammatthewsteinberger/codexloop/commit/1bf5aa2f2805c80aeba0f37fbe6da1dcb4a59585))
|
|
19
|
+
* add generated OpenAI REST CLI surface with drift gate ([53320f8](https://github.com/adammatthewsteinberger/codexloop/commit/53320f82512869b43075d6eeaf3f6fe73a06a3dd))
|
|
20
|
+
* add optional app-server gateway, stream UI, docs, and release scaffolding ([23bfddf](https://github.com/adammatthewsteinberger/codexloop/commit/23bfddfb169cfb37e8fe60a9a80bd7f9b644bba9))
|
|
21
|
+
* add plan, budget, session, profile, approval, and control types ([07a8188](https://github.com/adammatthewsteinberger/codexloop/commit/07a8188207fa6fbac5f85114d891b266b6be1bf9))
|
|
22
|
+
* add read-only CODEX_HOME rollout tail ([071d6ab](https://github.com/adammatthewsteinberger/codexloop/commit/071d6abe526935893d7d330909e96a308e5203b2))
|
|
23
|
+
* add run-loop state machine ([582144f](https://github.com/adammatthewsteinberger/codexloop/commit/582144fcd2b5d3c327f6af36c74307a9a8818966))
|
|
24
|
+
* add scripted system harness and test-agent gate ([68a7ebf](https://github.com/adammatthewsteinberger/codexloop/commit/68a7ebf9483013f5e7fae4ff98ff2b0f5da843f0))
|
|
25
|
+
* add three-layer completion evaluation ([eee2cc3](https://github.com/adammatthewsteinberger/codexloop/commit/eee2cc3a70562126c438e1a1ba842abca9aa0db6))
|
|
26
|
+
* classify turn signals into capacity states ([f7c4162](https://github.com/adammatthewsteinberger/codexloop/commit/f7c4162048b62f83a7b7ea3f99474605f18376ef))
|
|
27
|
+
* implement codexloop M1–M5 (onion runner + REST + docs) ([1dbef91](https://github.com/adammatthewsteinberger/codexloop/commit/1dbef9118097d8b8210f6a770df8c4c05956f6ce))
|
|
28
|
+
* parse codex exec JSONL events ([1cdc76c](https://github.com/adammatthewsteinberger/codexloop/commit/1cdc76c754f0e0f023f7dc94472be59f9776d3f5))
|
|
29
|
+
* supervise codex subprocess with concurrent pumps ([1c95f6e](https://github.com/adammatthewsteinberger/codexloop/commit/1c95f6e6fe628daefe0256e5ba5fb921bfd595a5))
|
|
30
|
+
* translate JSONL and drive codex exec gateway ([6a1842c](https://github.com/adammatthewsteinberger/codexloop/commit/6a1842c3bab3b9eb57d052b2bb8f1c45b919b69f))
|
|
31
|
+
* wire composite capacity probe and adaptive wait loop ([ab682b1](https://github.com/adammatthewsteinberger/codexloop/commit/ab682b16130829e3ae7a523597213c33509dec22))
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
### Bug Fixes
|
|
35
|
+
|
|
36
|
+
* jitter throttle waits above Retry-After ([666a4e6](https://github.com/adammatthewsteinberger/codexloop/commit/666a4e6c3d73f277946e866d33866091c225e1c8))
|
|
37
|
+
* only break session locks for known-dead pids ([712b0f4](https://github.com/adammatthewsteinberger/codexloop/commit/712b0f4a4b25d83ba27c0ca53d8278e6961efbd9))
|
|
38
|
+
* preserve remaining work across capacity-rejected turns ([d2d10c3](https://github.com/adammatthewsteinberger/codexloop/commit/d2d10c36a93084a36f48509433d9bb6865172fde))
|
|
39
|
+
* seal onion contracts and order drain before signals ([cecf827](https://github.com/adammatthewsteinberger/codexloop/commit/cecf827e841d11df0fb34c71724415970da3ab7d))
|
|
40
|
+
* stabilize CI help and process-group cancel tests ([3fe2c6d](https://github.com/adammatthewsteinberger/codexloop/commit/3fe2c6d09f94adb0de528a74364a0d9d177ee77b))
|
|
41
|
+
* terminate fatals, apply mid-run controls, harden ops edges ([9171835](https://github.com/adammatthewsteinberger/codexloop/commit/91718359a07f5e25ffd1366c7ea8bbfba51b0a01))
|
|
42
|
+
* treat ControlCommand as the inbox union and wrap parse errors ([0885204](https://github.com/adammatthewsteinberger/codexloop/commit/08852040d2a48a14eb5b7b750fa5d02bb9314e4b))
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Contributing
|
|
2
|
+
|
|
3
|
+
## Setup
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
python -m venv .venv
|
|
7
|
+
source .venv/bin/activate
|
|
8
|
+
pip install -e ".[dev,docs]"
|
|
9
|
+
pre-commit install
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
## Tests
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
pytest # default: not live and not system
|
|
16
|
+
pytest -m system # scripted system harness
|
|
17
|
+
pytest -m live # real Codex account (opt-in)
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
Coverage floors: whole package 100% (`pytest --cov=codexloop --cov-fail-under=100`).
|
|
21
|
+
|
|
22
|
+
## Commits
|
|
23
|
+
|
|
24
|
+
Conventional Commits (`feat:`, `fix:`, `test:`, `chore:`, `docs:`).
|
|
25
|
+
|
|
26
|
+
## Publishing
|
|
27
|
+
|
|
28
|
+
See [docs/publishing.md](docs/publishing.md) for TestPyPI → PyPI Trusted
|
|
29
|
+
Publishing, GitHub Environments, and the release-please flow.
|
codexloop-0.1.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Adam Matthew Steinberger
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
codexloop-0.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: codexloop
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Onion-architected, autonomous OpenAI Codex session runner — never blocks on a human, distinguishes rate limits from exhausted credits, and resumes safely across usage windows.
|
|
5
|
+
Project-URL: Homepage, https://github.com/adammatthewsteinberger/codexloop
|
|
6
|
+
Project-URL: Repository, https://github.com/adammatthewsteinberger/codexloop
|
|
7
|
+
Project-URL: Documentation, https://adammatthewsteinberger.github.io/codexloop/
|
|
8
|
+
Project-URL: Issues, https://github.com/adammatthewsteinberger/codexloop/issues
|
|
9
|
+
Project-URL: Changelog, https://github.com/adammatthewsteinberger/codexloop/blob/main/CHANGELOG.md
|
|
10
|
+
Author-email: Adam Matthew Steinberger <adam@matthewsteinberger.com>
|
|
11
|
+
License-Expression: MIT
|
|
12
|
+
License-File: LICENSE
|
|
13
|
+
Keywords: agent,automation,cli,codex,gpt,llm,openai
|
|
14
|
+
Classifier: Development Status :: 3 - Alpha
|
|
15
|
+
Classifier: Environment :: Console
|
|
16
|
+
Classifier: Intended Audience :: Developers
|
|
17
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
18
|
+
Classifier: Operating System :: MacOS
|
|
19
|
+
Classifier: Operating System :: POSIX :: Linux
|
|
20
|
+
Classifier: Programming Language :: Python :: 3
|
|
21
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
22
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
23
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
24
|
+
Classifier: Topic :: Software Development :: Build Tools
|
|
25
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
26
|
+
Classifier: Topic :: Utilities
|
|
27
|
+
Classifier: Typing :: Typed
|
|
28
|
+
Requires-Python: >=3.12
|
|
29
|
+
Requires-Dist: anyio>=4.0
|
|
30
|
+
Requires-Dist: openai>=1.40
|
|
31
|
+
Requires-Dist: structlog>=24.1
|
|
32
|
+
Requires-Dist: textual>=1.0
|
|
33
|
+
Requires-Dist: typer>=0.12
|
|
34
|
+
Provides-Extra: dev
|
|
35
|
+
Requires-Dist: bandit>=1.7; extra == 'dev'
|
|
36
|
+
Requires-Dist: build>=1.2; extra == 'dev'
|
|
37
|
+
Requires-Dist: hypothesis>=6.100; extra == 'dev'
|
|
38
|
+
Requires-Dist: import-linter>=2.0; extra == 'dev'
|
|
39
|
+
Requires-Dist: mypy>=1.10; extra == 'dev'
|
|
40
|
+
Requires-Dist: packaging>=24.0; extra == 'dev'
|
|
41
|
+
Requires-Dist: pip-audit>=2.7; extra == 'dev'
|
|
42
|
+
Requires-Dist: pre-commit>=3.7; extra == 'dev'
|
|
43
|
+
Requires-Dist: pytest-asyncio>=0.24; extra == 'dev'
|
|
44
|
+
Requires-Dist: pytest-cov>=5.0; extra == 'dev'
|
|
45
|
+
Requires-Dist: pytest>=8.0; extra == 'dev'
|
|
46
|
+
Requires-Dist: ruff>=0.6; extra == 'dev'
|
|
47
|
+
Requires-Dist: twine>=5.0; extra == 'dev'
|
|
48
|
+
Provides-Extra: docs
|
|
49
|
+
Requires-Dist: mkdocs-material>=9.5; extra == 'docs'
|
|
50
|
+
Description-Content-Type: text/markdown
|
|
51
|
+
|
|
52
|
+
# codexloop
|
|
53
|
+
|
|
54
|
+
Autonomous OpenAI Codex / GPT session runner. Same job as
|
|
55
|
+
[claudeloop](https://github.com/adammatthewsteinberger/claudeloop): never block on
|
|
56
|
+
a human, and never treat `insufficient_quota` / billing as a waitable
|
|
57
|
+
`rate_limit_exceeded` window.
|
|
58
|
+
|
|
59
|
+
**Status:** M1–M5 implemented on `feat/m1-pure-core` (onion core, exec gateway,
|
|
60
|
+
capacity probes, control plane, generated REST CLI, optional app-server transport
|
|
61
|
+
with exec fallback). MIT-licensed; author Adam Matthew Steinberger.
|
|
62
|
+
|
|
63
|
+
## Install
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
pip install -e ".[dev]"
|
|
67
|
+
codexloop --version
|
|
68
|
+
codexloop doctor
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Quick start
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
codexloop run path/to/plan.md
|
|
75
|
+
codexloop watch --follow
|
|
76
|
+
codexloop stop
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## Plans
|
|
80
|
+
|
|
81
|
+
| Document | Purpose |
|
|
82
|
+
|---|---|
|
|
83
|
+
| [docs/plans/architecture-and-roadmap.md](docs/plans/architecture-and-roadmap.md) | Full design / transplant plan from claudeloop 0.5.4 |
|
|
84
|
+
| [docs/plans/research-notes.md](docs/plans/research-notes.md) | Vendor SDK/CLI capacity + autonomy research |
|
|
85
|
+
| [docs/plans/_shared-transplant-outline.md](docs/plans/_shared-transplant-outline.md) | Cross-product keep/swap + Global Constraints |
|
|
86
|
+
| [docs/superpowers/plans/2026-08-13-codexloop-implementation.md](docs/superpowers/plans/2026-08-13-codexloop-implementation.md) | Bite-sized TDD implementation plan |
|
|
87
|
+
|
|
88
|
+
## Naming
|
|
89
|
+
|
|
90
|
+
| Item | Value |
|
|
91
|
+
|---|---|
|
|
92
|
+
| PyPI / CLI | `codexloop` |
|
|
93
|
+
| Env prefix | `CODEXLOOP_*` |
|
|
94
|
+
| State dir | `.codexloop/` |
|
|
95
|
+
| Done marker | `CODEXLOOP_TASK_FULLY_COMPLETE` |
|
|
96
|
+
|
|
97
|
+
## License
|
|
98
|
+
|
|
99
|
+
MIT — see [LICENSE](LICENSE).
|
|
100
|
+
|
|
101
|
+
## Publishing
|
|
102
|
+
|
|
103
|
+
Releases go **TestPyPI → PyPI** via Trusted Publishing. See
|
|
104
|
+
[docs/publishing.md](docs/publishing.md).
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# codexloop
|
|
2
|
+
|
|
3
|
+
Autonomous OpenAI Codex / GPT session runner. Same job as
|
|
4
|
+
[claudeloop](https://github.com/adammatthewsteinberger/claudeloop): never block on
|
|
5
|
+
a human, and never treat `insufficient_quota` / billing as a waitable
|
|
6
|
+
`rate_limit_exceeded` window.
|
|
7
|
+
|
|
8
|
+
**Status:** M1–M5 implemented on `feat/m1-pure-core` (onion core, exec gateway,
|
|
9
|
+
capacity probes, control plane, generated REST CLI, optional app-server transport
|
|
10
|
+
with exec fallback). MIT-licensed; author Adam Matthew Steinberger.
|
|
11
|
+
|
|
12
|
+
## Install
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
pip install -e ".[dev]"
|
|
16
|
+
codexloop --version
|
|
17
|
+
codexloop doctor
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Quick start
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
codexloop run path/to/plan.md
|
|
24
|
+
codexloop watch --follow
|
|
25
|
+
codexloop stop
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Plans
|
|
29
|
+
|
|
30
|
+
| Document | Purpose |
|
|
31
|
+
|---|---|
|
|
32
|
+
| [docs/plans/architecture-and-roadmap.md](docs/plans/architecture-and-roadmap.md) | Full design / transplant plan from claudeloop 0.5.4 |
|
|
33
|
+
| [docs/plans/research-notes.md](docs/plans/research-notes.md) | Vendor SDK/CLI capacity + autonomy research |
|
|
34
|
+
| [docs/plans/_shared-transplant-outline.md](docs/plans/_shared-transplant-outline.md) | Cross-product keep/swap + Global Constraints |
|
|
35
|
+
| [docs/superpowers/plans/2026-08-13-codexloop-implementation.md](docs/superpowers/plans/2026-08-13-codexloop-implementation.md) | Bite-sized TDD implementation plan |
|
|
36
|
+
|
|
37
|
+
## Naming
|
|
38
|
+
|
|
39
|
+
| Item | Value |
|
|
40
|
+
|---|---|
|
|
41
|
+
| PyPI / CLI | `codexloop` |
|
|
42
|
+
| Env prefix | `CODEXLOOP_*` |
|
|
43
|
+
| State dir | `.codexloop/` |
|
|
44
|
+
| Done marker | `CODEXLOOP_TASK_FULLY_COMPLETE` |
|
|
45
|
+
|
|
46
|
+
## License
|
|
47
|
+
|
|
48
|
+
MIT — see [LICENSE](LICENSE).
|
|
49
|
+
|
|
50
|
+
## Publishing
|
|
51
|
+
|
|
52
|
+
Releases go **TestPyPI → PyPI** via Trusted Publishing. See
|
|
53
|
+
[docs/publishing.md](docs/publishing.md).
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Security Policy
|
|
2
|
+
|
|
3
|
+
## Reporting a vulnerability
|
|
4
|
+
|
|
5
|
+
Email the maintainers privately. Do not open a public issue for secrets,
|
|
6
|
+
credential leaks, or sandbox escapes.
|
|
7
|
+
|
|
8
|
+
## Hardening notes
|
|
9
|
+
|
|
10
|
+
- Default sandbox is `workspace-write` with `approval_policy=never`.
|
|
11
|
+
- `danger-full-access` requires an explicit opt-in and refuses root / non-git cwd.
|
|
12
|
+
- Logs redact API keys and `auth.json` material.
|
|
13
|
+
- Never invoke bare `codex` or `--full-auto`.
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# ADR 0001 — Onion architecture enforced by import-linter
|
|
2
|
+
|
|
3
|
+
## Status
|
|
4
|
+
|
|
5
|
+
Accepted
|
|
6
|
+
|
|
7
|
+
## Context
|
|
8
|
+
|
|
9
|
+
Recorded from the architecture seed list.
|
|
10
|
+
|
|
11
|
+
## Decision
|
|
12
|
+
|
|
13
|
+
Keep domain pure and prevent layer leaks via import-linter contracts.
|
|
14
|
+
|
|
15
|
+
## Consequences
|
|
16
|
+
|
|
17
|
+
Documented in the architecture roadmap; CI enforces the load-bearing ones.
|