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.
Files changed (234) hide show
  1. codexloop-0.1.0/.agents/skills/codexloop-run/SKILL.md +12 -0
  2. codexloop-0.1.0/.claude/skills/codexloop-run/SKILL.md +12 -0
  3. codexloop-0.1.0/.cursor/rules/codexloop-run.mdc +13 -0
  4. codexloop-0.1.0/.editorconfig +22 -0
  5. codexloop-0.1.0/.github/CODEOWNERS +2 -0
  6. codexloop-0.1.0/.github/workflows/ci.yml +59 -0
  7. codexloop-0.1.0/.github/workflows/publish-testpypi.yml +35 -0
  8. codexloop-0.1.0/.github/workflows/release-please.yml +75 -0
  9. codexloop-0.1.0/.gitignore +48 -0
  10. codexloop-0.1.0/.pre-commit-config.yaml +72 -0
  11. codexloop-0.1.0/.release-please-manifest.json +3 -0
  12. codexloop-0.1.0/AGENTS.md +10 -0
  13. codexloop-0.1.0/CHANGELOG.md +42 -0
  14. codexloop-0.1.0/CLAUDE.md +5 -0
  15. codexloop-0.1.0/CODE_OF_CONDUCT.md +4 -0
  16. codexloop-0.1.0/CONTRIBUTING.md +29 -0
  17. codexloop-0.1.0/LICENSE +21 -0
  18. codexloop-0.1.0/PKG-INFO +104 -0
  19. codexloop-0.1.0/README.md +53 -0
  20. codexloop-0.1.0/SECURITY.md +13 -0
  21. codexloop-0.1.0/docs/architecture/adr/0001-onion-import-linter.md +17 -0
  22. codexloop-0.1.0/docs/architecture/adr/0002-subprocess-codex-exec.md +17 -0
  23. codexloop-0.1.0/docs/architecture/adr/0003-credits-exhausted.md +17 -0
  24. codexloop-0.1.0/docs/architecture/adr/0004-adaptive-probe-loop.md +17 -0
  25. codexloop-0.1.0/docs/architecture/adr/0005-layered-capacity-probe.md +17 -0
  26. codexloop-0.1.0/docs/architecture/adr/0006-generated-openai-rest.md +17 -0
  27. codexloop-0.1.0/docs/architecture/adr/0007-default-approval-sandbox.md +17 -0
  28. codexloop-0.1.0/docs/architecture/adr/0008-policy-via-c-flags.md +17 -0
  29. codexloop-0.1.0/docs/architecture/adr/0009-optional-app-server.md +17 -0
  30. codexloop-0.1.0/docs/architecture/adr/0010-rollout-best-effort.md +17 -0
  31. codexloop-0.1.0/docs/architecture/adr/0011-never-consume-resets.md +17 -0
  32. codexloop-0.1.0/docs/architecture/adr/0012-minimum-codex-version.md +17 -0
  33. codexloop-0.1.0/docs/architecture/adr/index.md +16 -0
  34. codexloop-0.1.0/docs/architecture/index.md +12 -0
  35. codexloop-0.1.0/docs/contributing.md +29 -0
  36. codexloop-0.1.0/docs/getting-started.md +28 -0
  37. codexloop-0.1.0/docs/guides/rest-api-surface.md +56 -0
  38. codexloop-0.1.0/docs/index.md +13 -0
  39. codexloop-0.1.0/docs/plans/_shared-transplant-outline.md +72 -0
  40. codexloop-0.1.0/docs/plans/architecture-and-roadmap.md +954 -0
  41. codexloop-0.1.0/docs/plans/research-notes.md +940 -0
  42. codexloop-0.1.0/docs/publishing.md +65 -0
  43. codexloop-0.1.0/docs/reference/cli.md +12 -0
  44. codexloop-0.1.0/docs/superpowers/plans/2026-08-13-codexloop-implementation.md +852 -0
  45. codexloop-0.1.0/mkdocs.yml +28 -0
  46. codexloop-0.1.0/pyproject.toml +175 -0
  47. codexloop-0.1.0/release-please-config.json +9 -0
  48. codexloop-0.1.0/src/codexloop/__init__.py +3 -0
  49. codexloop-0.1.0/src/codexloop/application/__init__.py +1 -0
  50. codexloop-0.1.0/src/codexloop/application/dto.py +41 -0
  51. codexloop-0.1.0/src/codexloop/application/ports.py +158 -0
  52. codexloop-0.1.0/src/codexloop/application/runner.py +467 -0
  53. codexloop-0.1.0/src/codexloop/application/usecases/__init__.py +1 -0
  54. codexloop-0.1.0/src/codexloop/application/usecases/doctor.py +37 -0
  55. codexloop-0.1.0/src/codexloop/application/usecases/list_threads.py +14 -0
  56. codexloop-0.1.0/src/codexloop/application/usecases/preflight.py +10 -0
  57. codexloop-0.1.0/src/codexloop/application/usecases/resume_thread.py +11 -0
  58. codexloop-0.1.0/src/codexloop/application/usecases/run_control.py +20 -0
  59. codexloop-0.1.0/src/codexloop/application/usecases/run_plan.py +11 -0
  60. codexloop-0.1.0/src/codexloop/bootstrap.py +461 -0
  61. codexloop-0.1.0/src/codexloop/cli/__init__.py +1 -0
  62. codexloop-0.1.0/src/codexloop/cli/app.py +94 -0
  63. codexloop-0.1.0/src/codexloop/cli/asyncio.py +80 -0
  64. codexloop-0.1.0/src/codexloop/cli/commands/__init__.py +1 -0
  65. codexloop-0.1.0/src/codexloop/cli/commands/approval_cmd.py +24 -0
  66. codexloop-0.1.0/src/codexloop/cli/commands/capacity.py +33 -0
  67. codexloop-0.1.0/src/codexloop/cli/commands/cwd_cmd.py +22 -0
  68. codexloop-0.1.0/src/codexloop/cli/commands/doctor.py +27 -0
  69. codexloop-0.1.0/src/codexloop/cli/commands/effort_cmd.py +24 -0
  70. codexloop-0.1.0/src/codexloop/cli/commands/logs.py +15 -0
  71. codexloop-0.1.0/src/codexloop/cli/commands/model_cmd.py +22 -0
  72. codexloop-0.1.0/src/codexloop/cli/commands/prompt.py +32 -0
  73. codexloop-0.1.0/src/codexloop/cli/commands/reset.py +25 -0
  74. codexloop-0.1.0/src/codexloop/cli/commands/resume.py +38 -0
  75. codexloop-0.1.0/src/codexloop/cli/commands/run.py +50 -0
  76. codexloop-0.1.0/src/codexloop/cli/commands/runs.py +13 -0
  77. codexloop-0.1.0/src/codexloop/cli/commands/sandbox_cmd.py +24 -0
  78. codexloop-0.1.0/src/codexloop/cli/commands/savepoints.py +25 -0
  79. codexloop-0.1.0/src/codexloop/cli/commands/snapshot.py +26 -0
  80. codexloop-0.1.0/src/codexloop/cli/commands/status.py +15 -0
  81. codexloop-0.1.0/src/codexloop/cli/commands/stop.py +21 -0
  82. codexloop-0.1.0/src/codexloop/cli/commands/threads.py +15 -0
  83. codexloop-0.1.0/src/codexloop/cli/commands/unwind.py +24 -0
  84. codexloop-0.1.0/src/codexloop/cli/commands/watch.py +66 -0
  85. codexloop-0.1.0/src/codexloop/cli/render.py +39 -0
  86. codexloop-0.1.0/src/codexloop/domain/__init__.py +26 -0
  87. codexloop-0.1.0/src/codexloop/domain/approval.py +38 -0
  88. codexloop-0.1.0/src/codexloop/domain/backoff.py +34 -0
  89. codexloop-0.1.0/src/codexloop/domain/budget.py +56 -0
  90. codexloop-0.1.0/src/codexloop/domain/capacity.py +81 -0
  91. codexloop-0.1.0/src/codexloop/domain/classify.py +98 -0
  92. codexloop-0.1.0/src/codexloop/domain/completion.py +130 -0
  93. codexloop-0.1.0/src/codexloop/domain/control.py +167 -0
  94. codexloop-0.1.0/src/codexloop/domain/error_codes.py +75 -0
  95. codexloop-0.1.0/src/codexloop/domain/errors.py +35 -0
  96. codexloop-0.1.0/src/codexloop/domain/loop.py +190 -0
  97. codexloop-0.1.0/src/codexloop/domain/model_profile.py +30 -0
  98. codexloop-0.1.0/src/codexloop/domain/plan.py +38 -0
  99. codexloop-0.1.0/src/codexloop/domain/savepoint.py +32 -0
  100. codexloop-0.1.0/src/codexloop/domain/savepoint_message.py +56 -0
  101. codexloop-0.1.0/src/codexloop/domain/session.py +32 -0
  102. codexloop-0.1.0/src/codexloop/domain/signals.py +25 -0
  103. codexloop-0.1.0/src/codexloop/domain/waiting.py +120 -0
  104. codexloop-0.1.0/src/codexloop/infrastructure/__init__.py +0 -0
  105. codexloop-0.1.0/src/codexloop/infrastructure/agent/__init__.py +0 -0
  106. codexloop-0.1.0/src/codexloop/infrastructure/agent/argv.py +102 -0
  107. codexloop-0.1.0/src/codexloop/infrastructure/agent/events.py +274 -0
  108. codexloop-0.1.0/src/codexloop/infrastructure/agent/gateway.py +189 -0
  109. codexloop-0.1.0/src/codexloop/infrastructure/agent/probe.py +74 -0
  110. codexloop-0.1.0/src/codexloop/infrastructure/agent/process.py +208 -0
  111. codexloop-0.1.0/src/codexloop/infrastructure/agent/schema.py +31 -0
  112. codexloop-0.1.0/src/codexloop/infrastructure/agent/scripted.py +201 -0
  113. codexloop-0.1.0/src/codexloop/infrastructure/agent/translate.py +120 -0
  114. codexloop-0.1.0/src/codexloop/infrastructure/api/__init__.py +26 -0
  115. codexloop-0.1.0/src/codexloop/infrastructure/api/api_baseline.json +340 -0
  116. codexloop-0.1.0/src/codexloop/infrastructure/api/binder.py +170 -0
  117. codexloop-0.1.0/src/codexloop/infrastructure/api/gateway.py +142 -0
  118. codexloop-0.1.0/src/codexloop/infrastructure/api/introspect.py +248 -0
  119. codexloop-0.1.0/src/codexloop/infrastructure/api/json_io.py +26 -0
  120. codexloop-0.1.0/src/codexloop/infrastructure/api/params.py +162 -0
  121. codexloop-0.1.0/src/codexloop/infrastructure/api/providers.py +70 -0
  122. codexloop-0.1.0/src/codexloop/infrastructure/api/registry.py +13 -0
  123. codexloop-0.1.0/src/codexloop/infrastructure/appserver/__init__.py +6 -0
  124. codexloop-0.1.0/src/codexloop/infrastructure/appserver/client.py +245 -0
  125. codexloop-0.1.0/src/codexloop/infrastructure/appserver/gateway.py +437 -0
  126. codexloop-0.1.0/src/codexloop/infrastructure/appserver/ratelimits.py +100 -0
  127. codexloop-0.1.0/src/codexloop/infrastructure/audit.py +26 -0
  128. codexloop-0.1.0/src/codexloop/infrastructure/capacity_probe.py +57 -0
  129. codexloop-0.1.0/src/codexloop/infrastructure/clock.py +26 -0
  130. codexloop-0.1.0/src/codexloop/infrastructure/config.py +150 -0
  131. codexloop-0.1.0/src/codexloop/infrastructure/control.py +89 -0
  132. codexloop-0.1.0/src/codexloop/infrastructure/doctor_env.py +239 -0
  133. codexloop-0.1.0/src/codexloop/infrastructure/events.py +23 -0
  134. codexloop-0.1.0/src/codexloop/infrastructure/git_savepoints.py +176 -0
  135. codexloop-0.1.0/src/codexloop/infrastructure/lock.py +88 -0
  136. codexloop-0.1.0/src/codexloop/infrastructure/logging.py +124 -0
  137. codexloop-0.1.0/src/codexloop/infrastructure/notify.py +27 -0
  138. codexloop-0.1.0/src/codexloop/infrastructure/progress.py +14 -0
  139. codexloop-0.1.0/src/codexloop/infrastructure/redact.py +52 -0
  140. codexloop-0.1.0/src/codexloop/infrastructure/rollout.py +113 -0
  141. codexloop-0.1.0/src/codexloop/infrastructure/rundir.py +57 -0
  142. codexloop-0.1.0/src/codexloop/infrastructure/snapshot.py +39 -0
  143. codexloop-0.1.0/src/codexloop/infrastructure/state.py +32 -0
  144. codexloop-0.1.0/src/codexloop/infrastructure/state_bus.py +27 -0
  145. codexloop-0.1.0/src/codexloop/infrastructure/stream_ui.py +44 -0
  146. codexloop-0.1.0/src/codexloop/py.typed +0 -0
  147. codexloop-0.1.0/tests/__init__.py +0 -0
  148. codexloop-0.1.0/tests/application/__init__.py +1 -0
  149. codexloop-0.1.0/tests/application/fakes.py +304 -0
  150. codexloop-0.1.0/tests/application/test_doctor.py +23 -0
  151. codexloop-0.1.0/tests/application/test_ports.py +112 -0
  152. codexloop-0.1.0/tests/application/test_runner.py +642 -0
  153. codexloop-0.1.0/tests/application/test_usecases.py +108 -0
  154. codexloop-0.1.0/tests/application/test_waiting_runner.py +203 -0
  155. codexloop-0.1.0/tests/cli/__init__.py +1 -0
  156. codexloop-0.1.0/tests/cli/test_api.py +38 -0
  157. codexloop-0.1.0/tests/cli/test_app.py +407 -0
  158. codexloop-0.1.0/tests/cli/test_asyncio.py +93 -0
  159. codexloop-0.1.0/tests/cli/test_e2e_shim.py +48 -0
  160. codexloop-0.1.0/tests/cli/test_ops_commands.py +418 -0
  161. codexloop-0.1.0/tests/conftest.py +52 -0
  162. codexloop-0.1.0/tests/domain/__init__.py +0 -0
  163. codexloop-0.1.0/tests/domain/strategies.py +102 -0
  164. codexloop-0.1.0/tests/domain/test_approval.py +57 -0
  165. codexloop-0.1.0/tests/domain/test_backoff.py +135 -0
  166. codexloop-0.1.0/tests/domain/test_budget.py +75 -0
  167. codexloop-0.1.0/tests/domain/test_capacity.py +133 -0
  168. codexloop-0.1.0/tests/domain/test_classify.py +234 -0
  169. codexloop-0.1.0/tests/domain/test_completion.py +263 -0
  170. codexloop-0.1.0/tests/domain/test_control.py +150 -0
  171. codexloop-0.1.0/tests/domain/test_error_codes.py +103 -0
  172. codexloop-0.1.0/tests/domain/test_loop.py +633 -0
  173. codexloop-0.1.0/tests/domain/test_model_profile.py +27 -0
  174. codexloop-0.1.0/tests/domain/test_plan.py +70 -0
  175. codexloop-0.1.0/tests/domain/test_savepoint.py +62 -0
  176. codexloop-0.1.0/tests/domain/test_session.py +33 -0
  177. codexloop-0.1.0/tests/domain/test_waiting.py +280 -0
  178. codexloop-0.1.0/tests/fixtures/jsonl/README.md +11 -0
  179. codexloop-0.1.0/tests/fixtures/jsonl/clean_completion.jsonl +4 -0
  180. codexloop-0.1.0/tests/fixtures/jsonl/done_with_marker.jsonl +4 -0
  181. codexloop-0.1.0/tests/fixtures/jsonl/huge_line.jsonl +1 -0
  182. codexloop-0.1.0/tests/fixtures/jsonl/malformed_line.jsonl +3 -0
  183. codexloop-0.1.0/tests/fixtures/jsonl/tool_heavy.jsonl +10 -0
  184. codexloop-0.1.0/tests/fixtures/jsonl/truncated_stream.jsonl +2 -0
  185. codexloop-0.1.0/tests/fixtures/jsonl/turn_failed_429_quota.jsonl +3 -0
  186. codexloop-0.1.0/tests/fixtures/jsonl/turn_failed_429_window.jsonl +3 -0
  187. codexloop-0.1.0/tests/infrastructure/__init__.py +0 -0
  188. codexloop-0.1.0/tests/infrastructure/api/__init__.py +0 -0
  189. codexloop-0.1.0/tests/infrastructure/api/test_binder.py +45 -0
  190. codexloop-0.1.0/tests/infrastructure/api/test_drift.py +43 -0
  191. codexloop-0.1.0/tests/infrastructure/api/test_gateway.py +189 -0
  192. codexloop-0.1.0/tests/infrastructure/api/test_introspect.py +33 -0
  193. codexloop-0.1.0/tests/infrastructure/api/test_json_io.py +37 -0
  194. codexloop-0.1.0/tests/infrastructure/api/test_params.py +20 -0
  195. codexloop-0.1.0/tests/infrastructure/api/test_params_extra.py +79 -0
  196. codexloop-0.1.0/tests/infrastructure/api/test_providers.py +69 -0
  197. codexloop-0.1.0/tests/infrastructure/api/test_providers_gateway_extra.py +163 -0
  198. codexloop-0.1.0/tests/infrastructure/test_appserver.py +139 -0
  199. codexloop-0.1.0/tests/infrastructure/test_appserver_gateway.py +215 -0
  200. codexloop-0.1.0/tests/infrastructure/test_argv.py +303 -0
  201. codexloop-0.1.0/tests/infrastructure/test_capacity_probe.py +225 -0
  202. codexloop-0.1.0/tests/infrastructure/test_config.py +199 -0
  203. codexloop-0.1.0/tests/infrastructure/test_control_and_savepoints.py +146 -0
  204. codexloop-0.1.0/tests/infrastructure/test_coverage_boost.py +308 -0
  205. codexloop-0.1.0/tests/infrastructure/test_doctor_env.py +153 -0
  206. codexloop-0.1.0/tests/infrastructure/test_events.py +562 -0
  207. codexloop-0.1.0/tests/infrastructure/test_gateway.py +353 -0
  208. codexloop-0.1.0/tests/infrastructure/test_lock.py +124 -0
  209. codexloop-0.1.0/tests/infrastructure/test_logging_redact.py +180 -0
  210. codexloop-0.1.0/tests/infrastructure/test_probe.py +119 -0
  211. codexloop-0.1.0/tests/infrastructure/test_process.py +191 -0
  212. codexloop-0.1.0/tests/infrastructure/test_ratelimits_extra.py +44 -0
  213. codexloop-0.1.0/tests/infrastructure/test_rollout.py +347 -0
  214. codexloop-0.1.0/tests/infrastructure/test_rundir_state.py +109 -0
  215. codexloop-0.1.0/tests/infrastructure/test_scripted.py +164 -0
  216. codexloop-0.1.0/tests/infrastructure/test_snapshot.py +41 -0
  217. codexloop-0.1.0/tests/infrastructure/test_state_bus.py +29 -0
  218. codexloop-0.1.0/tests/infrastructure/test_stream_ui.py +27 -0
  219. codexloop-0.1.0/tests/infrastructure/test_translate.py +290 -0
  220. codexloop-0.1.0/tests/live/fixtures/agent_scripts/done.json +11 -0
  221. codexloop-0.1.0/tests/live/fixtures/agent_scripts/quota_then_topup.json +18 -0
  222. codexloop-0.1.0/tests/live/fixtures/agent_scripts/unknown_429.json +18 -0
  223. codexloop-0.1.0/tests/live/fixtures/agent_scripts/wait_long.json +33 -0
  224. codexloop-0.1.0/tests/live/fixtures/agent_scripts/window_then_done.json +23 -0
  225. codexloop-0.1.0/tests/live/system/conftest.py +139 -0
  226. codexloop-0.1.0/tests/live/system/test_matrix_inprocess.py +163 -0
  227. codexloop-0.1.0/tests/live/system/test_subprocess_smoke.py +134 -0
  228. codexloop-0.1.0/tests/shim/__init__.py +1 -0
  229. codexloop-0.1.0/tests/shim/fake_appserver.py +148 -0
  230. codexloop-0.1.0/tests/shim/fake_codex.py +117 -0
  231. codexloop-0.1.0/tests/shim/test_fake_codex.py +281 -0
  232. codexloop-0.1.0/tests/test_bootstrap.py +324 -0
  233. codexloop-0.1.0/tests/test_no_vendor_leak.py +80 -0
  234. 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,2 @@
1
+ # Default owners for the whole repository.
2
+ * @adammatthewsteinberger
@@ -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,3 @@
1
+ {
2
+ ".": "0.1.0"
3
+ }
@@ -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,5 @@
1
+ # CLAUDE.md
2
+
3
+ Router for Claude Code. Canonical agent facts live in [AGENTS.md](AGENTS.md).
4
+ Shared procedures: `.claude/skills/codexloop-run/SKILL.md` (mirrored under
5
+ `.agents/skills/` and `.cursor/rules/`).
@@ -0,0 +1,4 @@
1
+ # Code of Conduct
2
+
3
+ Be respectful. Harassment and discrimination are not tolerated.
4
+ Report concerns to the maintainers. Inspired by the Contributor Covenant.
@@ -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.
@@ -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.
@@ -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.