codexloop 0.3.1__tar.gz → 0.4.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 (333) hide show
  1. codexloop-0.4.0/.gitattributes +2 -0
  2. codexloop-0.4.0/.githooks/commit-msg +67 -0
  3. codexloop-0.4.0/.githooks/commit-msg.local +11 -0
  4. codexloop-0.4.0/.githooks/pre-commit +11 -0
  5. codexloop-0.4.0/.githooks/pre-push +78 -0
  6. codexloop-0.4.0/.githooks/pre-push.local +11 -0
  7. codexloop-0.4.0/.github/vibey-gh/release/channel.js +63 -0
  8. codexloop-0.4.0/.github/vibey-gh/release/vibey.css +605 -0
  9. codexloop-0.4.0/.github/workflows/automation-bootstrap.yml +105 -0
  10. {codexloop-0.3.1 → codexloop-0.4.0}/.github/workflows/ci.yml +17 -9
  11. codexloop-0.4.0/.github/workflows/merge-train.yml +84 -0
  12. codexloop-0.4.0/.github/workflows/pr-automation.yml +1123 -0
  13. codexloop-0.4.0/.github/workflows/promote-to-main.yml +76 -0
  14. codexloop-0.4.0/.github/workflows/provenance.yml +68 -0
  15. codexloop-0.4.0/.github/workflows/release-surfaces.yml +702 -0
  16. codexloop-0.4.0/.github/workflows/release.yml +163 -0
  17. {codexloop-0.3.1 → codexloop-0.4.0}/.pre-commit-config.yaml +5 -0
  18. codexloop-0.4.0/.vibey-gh.toml +69 -0
  19. {codexloop-0.3.1 → codexloop-0.4.0}/PKG-INFO +15 -2
  20. {codexloop-0.3.1 → codexloop-0.4.0}/README.md +12 -1
  21. codexloop-0.4.0/docs/javascripts/channel.js +63 -0
  22. codexloop-0.4.0/docs/stylesheets/vibey.css +605 -0
  23. codexloop-0.4.0/properdocs.yml +54 -0
  24. {codexloop-0.3.1 → codexloop-0.4.0}/pyproject.toml +19 -2
  25. codexloop-0.4.0/src/codexloop/__init__.py +4 -0
  26. codexloop-0.4.0/src/codexloop/application/__init__.py +2 -0
  27. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/application/dto.py +1 -0
  28. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/application/interfaces/__init__.py +1 -0
  29. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/application/interfaces/agent.py +1 -0
  30. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/application/interfaces/api.py +1 -0
  31. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/application/interfaces/control.py +1 -0
  32. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/application/interfaces/doctor.py +1 -0
  33. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/application/interfaces/observability.py +1 -0
  34. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/application/interfaces/permissions.py +1 -0
  35. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/application/interfaces/storage.py +1 -0
  36. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/application/interfaces/system.py +1 -0
  37. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/application/ports.py +1 -0
  38. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/application/runner.py +57 -0
  39. codexloop-0.4.0/src/codexloop/application/usecases/__init__.py +2 -0
  40. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/application/usecases/doctor.py +1 -0
  41. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/application/usecases/list_threads.py +1 -0
  42. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/application/usecases/preflight.py +1 -0
  43. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/application/usecases/resume_thread.py +1 -0
  44. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/application/usecases/run_control.py +1 -0
  45. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/application/usecases/run_plan.py +1 -0
  46. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/bootstrap.py +32 -3
  47. codexloop-0.4.0/src/codexloop/cli/__init__.py +2 -0
  48. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/cli/app.py +1 -0
  49. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/cli/asyncio.py +1 -0
  50. codexloop-0.4.0/src/codexloop/cli/commands/__init__.py +2 -0
  51. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/cli/commands/approval_cmd.py +1 -0
  52. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/cli/commands/capacity.py +1 -0
  53. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/cli/commands/cwd_cmd.py +1 -0
  54. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/cli/commands/doctor.py +1 -0
  55. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/cli/commands/effort_cmd.py +1 -0
  56. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/cli/commands/logs.py +1 -0
  57. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/cli/commands/model_cmd.py +1 -0
  58. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/cli/commands/prompt.py +1 -0
  59. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/cli/commands/reset.py +1 -0
  60. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/cli/commands/resume.py +1 -0
  61. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/cli/commands/run.py +10 -0
  62. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/cli/commands/runs.py +1 -0
  63. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/cli/commands/sandbox_cmd.py +1 -0
  64. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/cli/commands/savepoints.py +1 -0
  65. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/cli/commands/snapshot.py +1 -0
  66. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/cli/commands/status.py +1 -0
  67. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/cli/commands/stop.py +1 -0
  68. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/cli/commands/threads.py +1 -0
  69. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/cli/commands/unwind.py +1 -0
  70. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/cli/commands/watch.py +1 -0
  71. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/cli/commands/wind_down_cmd.py +1 -0
  72. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/cli/render.py +1 -0
  73. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/domain/__init__.py +1 -0
  74. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/domain/approval.py +1 -0
  75. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/domain/backoff.py +1 -0
  76. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/domain/budget.py +1 -0
  77. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/domain/capacity.py +1 -0
  78. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/domain/classify.py +1 -0
  79. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/domain/completion.py +1 -0
  80. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/domain/control.py +1 -0
  81. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/domain/error_codes.py +1 -0
  82. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/domain/errors.py +1 -0
  83. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/domain/forecast.py +1 -0
  84. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/domain/handoff_marker.py +1 -0
  85. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/domain/loop.py +1 -0
  86. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/domain/model_profile.py +1 -0
  87. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/domain/plan.py +1 -0
  88. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/domain/savepoint.py +1 -0
  89. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/domain/savepoint_message.py +1 -0
  90. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/domain/session.py +1 -0
  91. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/domain/signals.py +1 -0
  92. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/domain/verbosity.py +1 -0
  93. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/domain/waiting.py +1 -0
  94. codexloop-0.4.0/src/codexloop/infrastructure/__init__.py +1 -0
  95. codexloop-0.4.0/src/codexloop/infrastructure/agent/__init__.py +1 -0
  96. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/infrastructure/agent/argv.py +7 -0
  97. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/infrastructure/agent/events.py +1 -0
  98. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/infrastructure/agent/gateway.py +1 -0
  99. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/infrastructure/agent/probe.py +1 -0
  100. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/infrastructure/agent/process.py +1 -0
  101. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/infrastructure/agent/schema.py +1 -0
  102. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/infrastructure/agent/scripted.py +1 -0
  103. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/infrastructure/agent/translate.py +1 -0
  104. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/infrastructure/api/__init__.py +1 -0
  105. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/infrastructure/api/binder.py +1 -0
  106. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/infrastructure/api/gateway.py +1 -0
  107. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/infrastructure/api/introspect.py +1 -0
  108. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/infrastructure/api/json_io.py +1 -0
  109. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/infrastructure/api/params.py +1 -0
  110. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/infrastructure/api/providers.py +1 -0
  111. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/infrastructure/api/registry.py +1 -0
  112. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/infrastructure/appserver/__init__.py +1 -0
  113. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/infrastructure/appserver/client.py +1 -0
  114. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/infrastructure/appserver/gateway.py +1 -0
  115. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/infrastructure/appserver/ratelimits.py +1 -0
  116. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/infrastructure/audit.py +1 -0
  117. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/infrastructure/capacity_probe.py +1 -0
  118. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/infrastructure/clock.py +1 -0
  119. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/infrastructure/config.py +3 -1
  120. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/infrastructure/control.py +1 -0
  121. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/infrastructure/doctor_env.py +1 -0
  122. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/infrastructure/events.py +1 -0
  123. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/infrastructure/git_savepoints.py +1 -0
  124. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/infrastructure/lock.py +1 -0
  125. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/infrastructure/logging.py +1 -0
  126. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/infrastructure/notify.py +1 -0
  127. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/infrastructure/progress.py +1 -0
  128. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/infrastructure/redact.py +1 -0
  129. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/infrastructure/rollout.py +1 -0
  130. codexloop-0.4.0/src/codexloop/infrastructure/run_snapshot.py +44 -0
  131. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/infrastructure/rundir.py +9 -0
  132. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/infrastructure/snapshot.py +1 -0
  133. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/infrastructure/state.py +1 -0
  134. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/infrastructure/state_bus.py +1 -0
  135. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/infrastructure/stream_ui.py +1 -0
  136. codexloop-0.4.0/tests/__init__.py +1 -0
  137. codexloop-0.4.0/tests/application/__init__.py +2 -0
  138. {codexloop-0.3.1 → codexloop-0.4.0}/tests/application/fakes.py +1 -0
  139. {codexloop-0.3.1 → codexloop-0.4.0}/tests/application/test_doctor.py +1 -0
  140. {codexloop-0.3.1 → codexloop-0.4.0}/tests/application/test_interfaces_convention.py +1 -0
  141. {codexloop-0.3.1 → codexloop-0.4.0}/tests/application/test_ports.py +1 -0
  142. {codexloop-0.3.1 → codexloop-0.4.0}/tests/application/test_runner.py +1 -0
  143. {codexloop-0.3.1 → codexloop-0.4.0}/tests/application/test_runner_wind_down_coverage.py +1 -0
  144. {codexloop-0.3.1 → codexloop-0.4.0}/tests/application/test_sleep_interruptible.py +1 -0
  145. {codexloop-0.3.1 → codexloop-0.4.0}/tests/application/test_usecases.py +82 -0
  146. {codexloop-0.3.1 → codexloop-0.4.0}/tests/application/test_waiting_runner.py +1 -0
  147. codexloop-0.4.0/tests/cli/__init__.py +2 -0
  148. {codexloop-0.3.1 → codexloop-0.4.0}/tests/cli/test_api.py +1 -0
  149. {codexloop-0.3.1 → codexloop-0.4.0}/tests/cli/test_app.py +1 -0
  150. {codexloop-0.3.1 → codexloop-0.4.0}/tests/cli/test_asyncio.py +1 -0
  151. {codexloop-0.3.1 → codexloop-0.4.0}/tests/cli/test_e2e_shim.py +1 -0
  152. {codexloop-0.3.1 → codexloop-0.4.0}/tests/cli/test_ops_commands.py +1 -0
  153. {codexloop-0.3.1 → codexloop-0.4.0}/tests/cli/test_sysexit.py +1 -0
  154. {codexloop-0.3.1 → codexloop-0.4.0}/tests/cli/test_verbosity_flags.py +1 -0
  155. {codexloop-0.3.1 → codexloop-0.4.0}/tests/cli/test_wind_down_cmd.py +1 -0
  156. {codexloop-0.3.1 → codexloop-0.4.0}/tests/conftest.py +1 -0
  157. codexloop-0.4.0/tests/domain/__init__.py +1 -0
  158. {codexloop-0.3.1 → codexloop-0.4.0}/tests/domain/strategies.py +1 -0
  159. {codexloop-0.3.1 → codexloop-0.4.0}/tests/domain/test_approval.py +1 -0
  160. {codexloop-0.3.1 → codexloop-0.4.0}/tests/domain/test_backoff.py +1 -0
  161. {codexloop-0.3.1 → codexloop-0.4.0}/tests/domain/test_budget.py +1 -0
  162. {codexloop-0.3.1 → codexloop-0.4.0}/tests/domain/test_capacity.py +1 -0
  163. {codexloop-0.3.1 → codexloop-0.4.0}/tests/domain/test_classify.py +1 -0
  164. {codexloop-0.3.1 → codexloop-0.4.0}/tests/domain/test_completion.py +1 -0
  165. {codexloop-0.3.1 → codexloop-0.4.0}/tests/domain/test_control.py +1 -0
  166. {codexloop-0.3.1 → codexloop-0.4.0}/tests/domain/test_error_codes.py +1 -0
  167. {codexloop-0.3.1 → codexloop-0.4.0}/tests/domain/test_forecast.py +1 -0
  168. {codexloop-0.3.1 → codexloop-0.4.0}/tests/domain/test_handoff_marker.py +1 -0
  169. {codexloop-0.3.1 → codexloop-0.4.0}/tests/domain/test_loop.py +1 -0
  170. {codexloop-0.3.1 → codexloop-0.4.0}/tests/domain/test_model_profile.py +1 -0
  171. {codexloop-0.3.1 → codexloop-0.4.0}/tests/domain/test_plan.py +1 -0
  172. {codexloop-0.3.1 → codexloop-0.4.0}/tests/domain/test_savepoint.py +1 -0
  173. {codexloop-0.3.1 → codexloop-0.4.0}/tests/domain/test_session.py +1 -0
  174. {codexloop-0.3.1 → codexloop-0.4.0}/tests/domain/test_verbosity.py +1 -0
  175. {codexloop-0.3.1 → codexloop-0.4.0}/tests/domain/test_waiting.py +1 -0
  176. codexloop-0.4.0/tests/infrastructure/__init__.py +1 -0
  177. codexloop-0.4.0/tests/infrastructure/api/__init__.py +1 -0
  178. {codexloop-0.3.1 → codexloop-0.4.0}/tests/infrastructure/api/test_binder.py +1 -0
  179. {codexloop-0.3.1 → codexloop-0.4.0}/tests/infrastructure/api/test_drift.py +1 -0
  180. {codexloop-0.3.1 → codexloop-0.4.0}/tests/infrastructure/api/test_gateway.py +1 -0
  181. {codexloop-0.3.1 → codexloop-0.4.0}/tests/infrastructure/api/test_introspect.py +1 -0
  182. {codexloop-0.3.1 → codexloop-0.4.0}/tests/infrastructure/api/test_json_io.py +1 -0
  183. {codexloop-0.3.1 → codexloop-0.4.0}/tests/infrastructure/api/test_params.py +1 -0
  184. {codexloop-0.3.1 → codexloop-0.4.0}/tests/infrastructure/api/test_params_extra.py +1 -0
  185. {codexloop-0.3.1 → codexloop-0.4.0}/tests/infrastructure/api/test_providers.py +1 -0
  186. {codexloop-0.3.1 → codexloop-0.4.0}/tests/infrastructure/api/test_providers_gateway_extra.py +1 -0
  187. {codexloop-0.3.1 → codexloop-0.4.0}/tests/infrastructure/test_appserver.py +1 -0
  188. {codexloop-0.3.1 → codexloop-0.4.0}/tests/infrastructure/test_appserver_gateway.py +1 -0
  189. {codexloop-0.3.1 → codexloop-0.4.0}/tests/infrastructure/test_argv.py +20 -0
  190. {codexloop-0.3.1 → codexloop-0.4.0}/tests/infrastructure/test_capacity_probe.py +1 -0
  191. {codexloop-0.3.1 → codexloop-0.4.0}/tests/infrastructure/test_config.py +14 -0
  192. {codexloop-0.3.1 → codexloop-0.4.0}/tests/infrastructure/test_control_and_savepoints.py +1 -0
  193. {codexloop-0.3.1 → codexloop-0.4.0}/tests/infrastructure/test_coverage_boost.py +1 -0
  194. {codexloop-0.3.1 → codexloop-0.4.0}/tests/infrastructure/test_doctor_env.py +1 -0
  195. {codexloop-0.3.1 → codexloop-0.4.0}/tests/infrastructure/test_event_to_dict.py +1 -0
  196. {codexloop-0.3.1 → codexloop-0.4.0}/tests/infrastructure/test_events.py +1 -0
  197. {codexloop-0.3.1 → codexloop-0.4.0}/tests/infrastructure/test_gateway.py +1 -0
  198. {codexloop-0.3.1 → codexloop-0.4.0}/tests/infrastructure/test_git_savepoints_units.py +1 -0
  199. {codexloop-0.3.1 → codexloop-0.4.0}/tests/infrastructure/test_handoff_marker.py +1 -0
  200. {codexloop-0.3.1 → codexloop-0.4.0}/tests/infrastructure/test_lock.py +1 -0
  201. {codexloop-0.3.1 → codexloop-0.4.0}/tests/infrastructure/test_logging_redact.py +1 -0
  202. {codexloop-0.3.1 → codexloop-0.4.0}/tests/infrastructure/test_probe.py +1 -0
  203. {codexloop-0.3.1 → codexloop-0.4.0}/tests/infrastructure/test_process.py +1 -0
  204. {codexloop-0.3.1 → codexloop-0.4.0}/tests/infrastructure/test_ratelimits_extra.py +1 -0
  205. {codexloop-0.3.1 → codexloop-0.4.0}/tests/infrastructure/test_rollout.py +1 -0
  206. {codexloop-0.3.1 → codexloop-0.4.0}/tests/infrastructure/test_rollout_scan.py +1 -0
  207. codexloop-0.4.0/tests/infrastructure/test_run_snapshot.py +57 -0
  208. {codexloop-0.3.1 → codexloop-0.4.0}/tests/infrastructure/test_rundir_run_id.py +1 -0
  209. {codexloop-0.3.1 → codexloop-0.4.0}/tests/infrastructure/test_rundir_state.py +17 -0
  210. {codexloop-0.3.1 → codexloop-0.4.0}/tests/infrastructure/test_scripted.py +1 -0
  211. {codexloop-0.3.1 → codexloop-0.4.0}/tests/infrastructure/test_snapshot.py +1 -0
  212. {codexloop-0.3.1 → codexloop-0.4.0}/tests/infrastructure/test_state_bus.py +1 -0
  213. {codexloop-0.3.1 → codexloop-0.4.0}/tests/infrastructure/test_stream_ui.py +1 -0
  214. {codexloop-0.3.1 → codexloop-0.4.0}/tests/infrastructure/test_translate.py +1 -0
  215. {codexloop-0.3.1 → codexloop-0.4.0}/tests/live/system/conftest.py +1 -0
  216. {codexloop-0.3.1 → codexloop-0.4.0}/tests/live/system/test_matrix_inprocess.py +1 -0
  217. {codexloop-0.3.1 → codexloop-0.4.0}/tests/live/system/test_subprocess_smoke.py +1 -0
  218. codexloop-0.4.0/tests/shim/__init__.py +2 -0
  219. {codexloop-0.3.1 → codexloop-0.4.0}/tests/shim/fake_appserver.py +1 -0
  220. {codexloop-0.3.1 → codexloop-0.4.0}/tests/shim/fake_codex.py +1 -0
  221. {codexloop-0.3.1 → codexloop-0.4.0}/tests/shim/test_fake_codex.py +1 -0
  222. {codexloop-0.3.1 → codexloop-0.4.0}/tests/test_bootstrap.py +33 -0
  223. {codexloop-0.3.1 → codexloop-0.4.0}/tests/test_no_vendor_leak.py +1 -0
  224. {codexloop-0.3.1 → codexloop-0.4.0}/tests/test_packaging.py +1 -0
  225. {codexloop-0.3.1 → codexloop-0.4.0}/uv.lock +36 -1
  226. codexloop-0.3.1/.github/workflows/docs.yml +0 -40
  227. codexloop-0.3.1/.github/workflows/publish-testpypi.yml +0 -36
  228. codexloop-0.3.1/.github/workflows/release-please.yml +0 -82
  229. codexloop-0.3.1/.release-please-manifest.json +0 -3
  230. codexloop-0.3.1/release-please-config.json +0 -9
  231. codexloop-0.3.1/src/codexloop/__init__.py +0 -3
  232. codexloop-0.3.1/src/codexloop/application/__init__.py +0 -1
  233. codexloop-0.3.1/src/codexloop/application/usecases/__init__.py +0 -1
  234. codexloop-0.3.1/src/codexloop/cli/__init__.py +0 -1
  235. codexloop-0.3.1/src/codexloop/cli/commands/__init__.py +0 -1
  236. codexloop-0.3.1/src/codexloop/infrastructure/__init__.py +0 -0
  237. codexloop-0.3.1/src/codexloop/infrastructure/agent/__init__.py +0 -0
  238. codexloop-0.3.1/tests/__init__.py +0 -0
  239. codexloop-0.3.1/tests/application/__init__.py +0 -1
  240. codexloop-0.3.1/tests/cli/__init__.py +0 -1
  241. codexloop-0.3.1/tests/domain/__init__.py +0 -0
  242. codexloop-0.3.1/tests/infrastructure/__init__.py +0 -0
  243. codexloop-0.3.1/tests/infrastructure/api/__init__.py +0 -0
  244. codexloop-0.3.1/tests/shim/__init__.py +0 -1
  245. {codexloop-0.3.1 → codexloop-0.4.0}/.agent/rules/codexloop-architecture.md +0 -0
  246. {codexloop-0.3.1 → codexloop-0.4.0}/.agent/rules/codexloop-completion.md +0 -0
  247. {codexloop-0.3.1 → codexloop-0.4.0}/.agent/rules/codexloop-docs.md +0 -0
  248. {codexloop-0.3.1 → codexloop-0.4.0}/.agent/rules/codexloop-quota-and-capacity.md +0 -0
  249. {codexloop-0.3.1 → codexloop-0.4.0}/.agent/rules/codexloop-releasing.md +0 -0
  250. {codexloop-0.3.1 → codexloop-0.4.0}/.agent/rules/codexloop-rest-surface.md +0 -0
  251. {codexloop-0.3.1 → codexloop-0.4.0}/.agent/rules/codexloop-run.md +0 -0
  252. {codexloop-0.3.1 → codexloop-0.4.0}/.agent/rules/codexloop-testing.md +0 -0
  253. {codexloop-0.3.1 → codexloop-0.4.0}/.agents/skills/codexloop-architecture/SKILL.md +0 -0
  254. {codexloop-0.3.1 → codexloop-0.4.0}/.agents/skills/codexloop-completion/SKILL.md +0 -0
  255. {codexloop-0.3.1 → codexloop-0.4.0}/.agents/skills/codexloop-docs/SKILL.md +0 -0
  256. {codexloop-0.3.1 → codexloop-0.4.0}/.agents/skills/codexloop-quota-and-capacity/SKILL.md +0 -0
  257. {codexloop-0.3.1 → codexloop-0.4.0}/.agents/skills/codexloop-releasing/SKILL.md +0 -0
  258. {codexloop-0.3.1 → codexloop-0.4.0}/.agents/skills/codexloop-rest-surface/SKILL.md +0 -0
  259. {codexloop-0.3.1 → codexloop-0.4.0}/.agents/skills/codexloop-run/SKILL.md +0 -0
  260. {codexloop-0.3.1 → codexloop-0.4.0}/.agents/skills/codexloop-testing/SKILL.md +0 -0
  261. {codexloop-0.3.1 → codexloop-0.4.0}/.claude/skills/codexloop-architecture/SKILL.md +0 -0
  262. {codexloop-0.3.1 → codexloop-0.4.0}/.claude/skills/codexloop-completion/SKILL.md +0 -0
  263. {codexloop-0.3.1 → codexloop-0.4.0}/.claude/skills/codexloop-docs/SKILL.md +0 -0
  264. {codexloop-0.3.1 → codexloop-0.4.0}/.claude/skills/codexloop-quota-and-capacity/SKILL.md +0 -0
  265. {codexloop-0.3.1 → codexloop-0.4.0}/.claude/skills/codexloop-releasing/SKILL.md +0 -0
  266. {codexloop-0.3.1 → codexloop-0.4.0}/.claude/skills/codexloop-rest-surface/SKILL.md +0 -0
  267. {codexloop-0.3.1 → codexloop-0.4.0}/.claude/skills/codexloop-run/SKILL.md +0 -0
  268. {codexloop-0.3.1 → codexloop-0.4.0}/.claude/skills/codexloop-testing/SKILL.md +0 -0
  269. {codexloop-0.3.1 → codexloop-0.4.0}/.cursor/rules/codexloop-architecture.mdc +0 -0
  270. {codexloop-0.3.1 → codexloop-0.4.0}/.cursor/rules/codexloop-completion.mdc +0 -0
  271. {codexloop-0.3.1 → codexloop-0.4.0}/.cursor/rules/codexloop-docs.mdc +0 -0
  272. {codexloop-0.3.1 → codexloop-0.4.0}/.cursor/rules/codexloop-quota-and-capacity.mdc +0 -0
  273. {codexloop-0.3.1 → codexloop-0.4.0}/.cursor/rules/codexloop-releasing.mdc +0 -0
  274. {codexloop-0.3.1 → codexloop-0.4.0}/.cursor/rules/codexloop-rest-surface.mdc +0 -0
  275. {codexloop-0.3.1 → codexloop-0.4.0}/.cursor/rules/codexloop-run.mdc +0 -0
  276. {codexloop-0.3.1 → codexloop-0.4.0}/.cursor/rules/codexloop-testing.mdc +0 -0
  277. {codexloop-0.3.1 → codexloop-0.4.0}/.editorconfig +0 -0
  278. {codexloop-0.3.1 → codexloop-0.4.0}/.github/CODEOWNERS +0 -0
  279. {codexloop-0.3.1 → codexloop-0.4.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  280. {codexloop-0.3.1 → codexloop-0.4.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  281. {codexloop-0.3.1 → codexloop-0.4.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  282. {codexloop-0.3.1 → codexloop-0.4.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  283. {codexloop-0.3.1 → codexloop-0.4.0}/.gitignore +0 -0
  284. {codexloop-0.3.1 → codexloop-0.4.0}/AGENTS.md +0 -0
  285. {codexloop-0.3.1 → codexloop-0.4.0}/CHANGELOG.md +0 -0
  286. {codexloop-0.3.1 → codexloop-0.4.0}/CLAUDE.md +0 -0
  287. {codexloop-0.3.1 → codexloop-0.4.0}/CODE_OF_CONDUCT.md +0 -0
  288. {codexloop-0.3.1 → codexloop-0.4.0}/CONTRIBUTING.md +0 -0
  289. {codexloop-0.3.1 → codexloop-0.4.0}/GEMINI.md +0 -0
  290. {codexloop-0.3.1 → codexloop-0.4.0}/LICENSE +0 -0
  291. {codexloop-0.3.1 → codexloop-0.4.0}/SECURITY.md +0 -0
  292. {codexloop-0.3.1 → codexloop-0.4.0}/SUPPORT.md +0 -0
  293. {codexloop-0.3.1 → codexloop-0.4.0}/docs/architecture/adr/0001-onion-import-linter.md +0 -0
  294. {codexloop-0.3.1 → codexloop-0.4.0}/docs/architecture/adr/0002-subprocess-codex-exec.md +0 -0
  295. {codexloop-0.3.1 → codexloop-0.4.0}/docs/architecture/adr/0003-credits-exhausted.md +0 -0
  296. {codexloop-0.3.1 → codexloop-0.4.0}/docs/architecture/adr/0004-adaptive-probe-loop.md +0 -0
  297. {codexloop-0.3.1 → codexloop-0.4.0}/docs/architecture/adr/0005-layered-capacity-probe.md +0 -0
  298. {codexloop-0.3.1 → codexloop-0.4.0}/docs/architecture/adr/0006-generated-openai-rest.md +0 -0
  299. {codexloop-0.3.1 → codexloop-0.4.0}/docs/architecture/adr/0007-default-approval-sandbox.md +0 -0
  300. {codexloop-0.3.1 → codexloop-0.4.0}/docs/architecture/adr/0008-policy-via-c-flags.md +0 -0
  301. {codexloop-0.3.1 → codexloop-0.4.0}/docs/architecture/adr/0009-optional-app-server.md +0 -0
  302. {codexloop-0.3.1 → codexloop-0.4.0}/docs/architecture/adr/0010-rollout-best-effort.md +0 -0
  303. {codexloop-0.3.1 → codexloop-0.4.0}/docs/architecture/adr/0011-never-consume-resets.md +0 -0
  304. {codexloop-0.3.1 → codexloop-0.4.0}/docs/architecture/adr/0012-minimum-codex-version.md +0 -0
  305. {codexloop-0.3.1 → codexloop-0.4.0}/docs/architecture/adr/index.md +0 -0
  306. {codexloop-0.3.1 → codexloop-0.4.0}/docs/architecture/index.md +0 -0
  307. {codexloop-0.3.1 → codexloop-0.4.0}/docs/contributing.md +0 -0
  308. {codexloop-0.3.1 → codexloop-0.4.0}/docs/getting-started.md +0 -0
  309. {codexloop-0.3.1 → codexloop-0.4.0}/docs/guides/rest-api-surface.md +0 -0
  310. {codexloop-0.3.1 → codexloop-0.4.0}/docs/index.md +0 -0
  311. {codexloop-0.3.1 → codexloop-0.4.0}/docs/plans/_shared-transplant-outline.md +0 -0
  312. {codexloop-0.3.1 → codexloop-0.4.0}/docs/plans/architecture-and-roadmap.md +0 -0
  313. {codexloop-0.3.1 → codexloop-0.4.0}/docs/plans/research-notes.md +0 -0
  314. {codexloop-0.3.1 → codexloop-0.4.0}/docs/publishing.md +0 -0
  315. {codexloop-0.3.1 → codexloop-0.4.0}/docs/reference/cli.md +0 -0
  316. {codexloop-0.3.1 → codexloop-0.4.0}/docs/superpowers/plans/2026-08-13-codexloop-implementation.md +0 -0
  317. {codexloop-0.3.1 → codexloop-0.4.0}/mkdocs.yml +0 -0
  318. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/infrastructure/api/api_baseline.json +0 -0
  319. {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/py.typed +0 -0
  320. {codexloop-0.3.1 → codexloop-0.4.0}/tests/fixtures/jsonl/README.md +0 -0
  321. {codexloop-0.3.1 → codexloop-0.4.0}/tests/fixtures/jsonl/clean_completion.jsonl +0 -0
  322. {codexloop-0.3.1 → codexloop-0.4.0}/tests/fixtures/jsonl/done_with_marker.jsonl +0 -0
  323. {codexloop-0.3.1 → codexloop-0.4.0}/tests/fixtures/jsonl/huge_line.jsonl +0 -0
  324. {codexloop-0.3.1 → codexloop-0.4.0}/tests/fixtures/jsonl/malformed_line.jsonl +0 -0
  325. {codexloop-0.3.1 → codexloop-0.4.0}/tests/fixtures/jsonl/tool_heavy.jsonl +0 -0
  326. {codexloop-0.3.1 → codexloop-0.4.0}/tests/fixtures/jsonl/truncated_stream.jsonl +0 -0
  327. {codexloop-0.3.1 → codexloop-0.4.0}/tests/fixtures/jsonl/turn_failed_429_quota.jsonl +0 -0
  328. {codexloop-0.3.1 → codexloop-0.4.0}/tests/fixtures/jsonl/turn_failed_429_window.jsonl +0 -0
  329. {codexloop-0.3.1 → codexloop-0.4.0}/tests/live/fixtures/agent_scripts/done.json +0 -0
  330. {codexloop-0.3.1 → codexloop-0.4.0}/tests/live/fixtures/agent_scripts/quota_then_topup.json +0 -0
  331. {codexloop-0.3.1 → codexloop-0.4.0}/tests/live/fixtures/agent_scripts/unknown_429.json +0 -0
  332. {codexloop-0.3.1 → codexloop-0.4.0}/tests/live/fixtures/agent_scripts/wait_long.json +0 -0
  333. {codexloop-0.3.1 → codexloop-0.4.0}/tests/live/fixtures/agent_scripts/window_then_done.json +0 -0
@@ -0,0 +1,2 @@
1
+ # vibey-gh: append-only files merge instead of conflicting
2
+ CHANGELOG.md merge=union
@@ -0,0 +1,67 @@
1
+ #!/bin/sh
2
+ # Installed by `vibey-gh install` — do not edit; edit the template in vibey-gh.
3
+ #
4
+ # Appends the provenance trailer to any commit message that lacks it, so the rule holds
5
+ # locally without anyone having to remember it. CI enforces the same trailer, so a commit
6
+ # made without this hook fails the pull request rather than slipping through.
7
+
8
+
9
+ # Resolve the CLI. `vibey-gh` on PATH is the normal case, but a project virtualenv that
10
+ # has not been activated is just as normal — and a gate that reports "not installed"
11
+ # when the tool IS installed is a gate people learn to bypass. Look where it actually
12
+ # lives before giving up. Hooks run from the top of the working tree.
13
+ vibey_gh() {
14
+ # A repository that IS vibey-gh must run its own working tree, never an installed copy.
15
+ # Its `develop` is ahead of the last release nearly always, so a globally installed
16
+ # vibey-gh compares the repository's managed assets against the older ones it bundles,
17
+ # reports them out of date, and refuses every push — a contributor who installed the
18
+ # tool the obvious way cannot commit to it. The package is dependency-free stdlib, so
19
+ # `python3 -m` against the checkout needs no install and no virtualenv at all.
20
+ if [ -f pyproject.toml ] && grep -qE '^name = "vibey-gh"' pyproject.toml \
21
+ && [ -d vibey_gh ] && python3 -c "import vibey_gh.cli" >/dev/null 2>&1; then
22
+ python3 -m vibey_gh.cli "$@"
23
+ elif command -v vibey-gh >/dev/null 2>&1; then
24
+ vibey-gh "$@"
25
+ elif [ -n "${VIRTUAL_ENV:-}" ] && [ -x "${VIRTUAL_ENV}/bin/vibey-gh" ]; then
26
+ "${VIRTUAL_ENV}/bin/vibey-gh" "$@"
27
+ elif [ -x ".venv/bin/vibey-gh" ]; then
28
+ ./.venv/bin/vibey-gh "$@"
29
+ elif [ -x "venv/bin/vibey-gh" ]; then
30
+ ./venv/bin/vibey-gh "$@"
31
+ elif python3 -c "import vibey_gh.cli" >/dev/null 2>&1; then
32
+ python3 -m vibey_gh.cli "$@"
33
+ elif python3 -c "import vibey_bootstrap.gh.cli" >/dev/null 2>&1; then
34
+ python3 -m vibey_bootstrap.gh.cli "$@" # pre-split layout
35
+ else
36
+ return 127
37
+ fi
38
+ }
39
+
40
+
41
+ msg_file="$1"
42
+ key=$(vibey_gh trailer-key 2>/dev/null || echo "Made-With")
43
+ trailer=$(vibey_gh trailer 2>/dev/null || echo "Made-With: Made with ❤️ by [Vibey](https://adammatthewsteinberger.github.io/vibey/), Developed by [Adam Matthew Steinberger](https://hire.adam.matthewsteinberger.com/) ([@adammatthewsteinberger](https://github.com/adammatthewsteinberger/)).")
44
+
45
+ # A pre-existing project hook runs first and may do its own thing.
46
+ [ -x "$(dirname "$0")/commit-msg.local" ] && "$(dirname "$0")/commit-msg.local" "$@"
47
+
48
+ # Normalize the subject without assuming the Python package is importable in the hook's
49
+ # process. The body and existing trailers remain unchanged.
50
+ subject=$(sed -n '1p' "$msg_file")
51
+ if [ -n "$subject" ] && ! printf '%s\n' "$subject" | grep -Eq '^[a-z][a-z0-9-]*(\([a-z0-9][a-z0-9._/-]*\))?!?: [^[:space:]].*$'; then
52
+ tmp="${msg_file}.vibey-gh.tmp"
53
+ { printf 'chore: %s\n' "$subject"; sed '1d' "$msg_file"; } > "$tmp"
54
+ mv "$tmp" "$msg_file"
55
+ fi
56
+
57
+ # Already present in any case — nothing to do.
58
+ if grep -qiE "^${key}:[[:space:]]*[^[:space:]]" "$msg_file"; then
59
+ exit 0
60
+ fi
61
+
62
+ # A comment-only or empty message means an aborted commit; leave it alone.
63
+ if ! grep -qvE '^\s*(#.*)?$' "$msg_file"; then
64
+ exit 0
65
+ fi
66
+
67
+ printf '\n%s\n' "$trailer" >> "$msg_file"
@@ -0,0 +1,11 @@
1
+ #!/bin/sh
2
+ # vibey-gh owns core.hooksPath, so .git/hooks is never consulted again and the
3
+ # pre-commit framework's hooks would silently stop running -- a worse failure
4
+ # than any gate they enforce, because everything keeps looking green.
5
+ #
6
+ # Delegates to the framework's OWN generated hook rather than calling
7
+ # `pre-commit run`: that script knows where its environment lives, and a git
8
+ # hook does not inherit an activated virtualenv, so re-invoking by name finds
9
+ # the wrong tools or none at all.
10
+ [ -x ".git/hooks/commit-msg" ] || exit 0
11
+ exec ".git/hooks/commit-msg" "$@"
@@ -0,0 +1,11 @@
1
+ #!/bin/sh
2
+ # vibey-gh owns core.hooksPath, so .git/hooks is never consulted again and the
3
+ # pre-commit framework's hooks would silently stop running -- a worse failure
4
+ # than any gate they enforce, because everything keeps looking green.
5
+ #
6
+ # Delegates to the framework's OWN generated hook rather than calling
7
+ # `pre-commit run`: that script knows where its environment lives, and a git
8
+ # hook does not inherit an activated virtualenv, so re-invoking by name finds
9
+ # the wrong tools or none at all.
10
+ [ -x ".git/hooks/pre-commit" ] || exit 0
11
+ exec ".git/hooks/pre-commit" "$@"
@@ -0,0 +1,78 @@
1
+ #!/bin/sh
2
+ # Installed by `vibey-gh install` — do not edit; edit the template in vibey-gh.
3
+ #
4
+ # THE GATE. A repository that has adopted the vibey GitHub automation must keep it
5
+ # installed and working. If the tooling is missing, or the fingerprints it enforces are
6
+ # not intact, the push is refused — to any branch, local or remote.
7
+ #
8
+ # The point is not ceremony. Provenance that can be skipped whenever it is inconvenient
9
+ # is provenance nobody can rely on, so the check has to sit on the last action before
10
+ # code leaves the machine.
11
+ #
12
+ # Escape hatch: `git push --no-verify` still works, because a hook that cannot be
13
+ # bypassed in an emergency gets uninstalled instead. CI applies the same rule server-side,
14
+ # so skipping here only defers the failure rather than avoiding it.
15
+
16
+ set -e
17
+
18
+ red() { printf '\033[0;31m%s\033[0m\n' "$1"; }
19
+
20
+
21
+ # Resolve the CLI. `vibey-gh` on PATH is the normal case, but a project virtualenv that
22
+ # has not been activated is just as normal — and a gate that reports "not installed"
23
+ # when the tool IS installed is a gate people learn to bypass. Look where it actually
24
+ # lives before giving up. Hooks run from the top of the working tree.
25
+ vibey_gh() {
26
+ # A repository that IS vibey-gh must run its own working tree, never an installed copy.
27
+ # Its `develop` is ahead of the last release nearly always, so a globally installed
28
+ # vibey-gh compares the repository's managed assets against the older ones it bundles,
29
+ # reports them out of date, and refuses every push — a contributor who installed the
30
+ # tool the obvious way cannot commit to it. The package is dependency-free stdlib, so
31
+ # `python3 -m` against the checkout needs no install and no virtualenv at all.
32
+ if [ -f pyproject.toml ] && grep -qE '^name = "vibey-gh"' pyproject.toml \
33
+ && [ -d vibey_gh ] && python3 -c "import vibey_gh.cli" >/dev/null 2>&1; then
34
+ python3 -m vibey_gh.cli "$@"
35
+ elif command -v vibey-gh >/dev/null 2>&1; then
36
+ vibey-gh "$@"
37
+ elif [ -n "${VIRTUAL_ENV:-}" ] && [ -x "${VIRTUAL_ENV}/bin/vibey-gh" ]; then
38
+ "${VIRTUAL_ENV}/bin/vibey-gh" "$@"
39
+ elif [ -x ".venv/bin/vibey-gh" ]; then
40
+ ./.venv/bin/vibey-gh "$@"
41
+ elif [ -x "venv/bin/vibey-gh" ]; then
42
+ ./venv/bin/vibey-gh "$@"
43
+ elif python3 -c "import vibey_gh.cli" >/dev/null 2>&1; then
44
+ python3 -m vibey_gh.cli "$@"
45
+ elif python3 -c "import vibey_bootstrap.gh.cli" >/dev/null 2>&1; then
46
+ python3 -m vibey_bootstrap.gh.cli "$@" # pre-split layout
47
+ else
48
+ return 127
49
+ fi
50
+ }
51
+
52
+ if ! vibey_gh trailer-key >/dev/null 2>&1; then
53
+ red "✖ push refused: the vibey GitHub automation is not installed."
54
+ echo
55
+ echo " This repository requires it for provenance and release automation."
56
+ echo
57
+ echo " pip install vibey-gh"
58
+ echo " vibey-gh install"
59
+ echo
60
+ echo " Then push again. To bypass once: git push --no-verify"
61
+ exit 1
62
+ fi
63
+
64
+ if ! vibey_gh check --quiet; then
65
+ red "✖ push refused: the provenance fingerprints are not intact."
66
+ echo
67
+ echo " vibey-gh check # see what is missing"
68
+ echo " vibey-gh check --apply # add the missing file headers"
69
+ echo
70
+ echo " Commit trailers are added automatically by the commit-msg hook."
71
+ echo " To bypass once: git push --no-verify"
72
+ exit 1
73
+ fi
74
+
75
+ # Chain to a pre-existing project hook, so adopting this does not discard local checks.
76
+ if [ -x "$(dirname "$0")/pre-push.local" ]; then
77
+ "$(dirname "$0")/pre-push.local" "$@"
78
+ fi
@@ -0,0 +1,11 @@
1
+ #!/bin/sh
2
+ # vibey-gh owns core.hooksPath, so .git/hooks is never consulted again and the
3
+ # pre-commit framework's hooks would silently stop running -- a worse failure
4
+ # than any gate they enforce, because everything keeps looking green.
5
+ #
6
+ # Delegates to the framework's OWN generated hook rather than calling
7
+ # `pre-commit run`: that script knows where its environment lives, and a git
8
+ # hook does not inherit an activated virtualenv, so re-invoking by name finds
9
+ # the wrong tools or none at all.
10
+ [ -x ".git/hooks/pre-push" ] || exit 0
11
+ exec ".git/hooks/pre-push" "$@"
@@ -0,0 +1,63 @@
1
+ (() => {
2
+ "use strict";
3
+
4
+ document.documentElement.dataset.bsTheme = "dark";
5
+
6
+ const segments = window.location.pathname.split("/").filter(Boolean);
7
+ const channel = segments.includes("develop") ? "develop" : "main";
8
+ document.body.dataset.releaseChannel = channel;
9
+
10
+ const brand = document.querySelector(".navbar-brand");
11
+ if (brand) {
12
+ const badge = document.createElement("span");
13
+ badge.className = "release-badge";
14
+ badge.innerHTML = `<span aria-hidden="true"></span>${channel === "main" ? "__PRODUCTION_LABEL__" : "__PREVIEW_LABEL__"}`;
15
+ brand.insertAdjacentElement("afterend", badge);
16
+ }
17
+
18
+ const primaryNav = document.querySelector("#navbar-collapse .navbar-nav");
19
+ if (primaryNav) {
20
+ const pagesRoot = "__PAGES_ROOT__";
21
+ primaryNav.querySelectorAll("a.nav-link").forEach((link) => {
22
+ if (link.textContent.trim() === "Home") {
23
+ link.href = pagesRoot;
24
+ } else {
25
+ link.closest("li")?.remove();
26
+ }
27
+ });
28
+ for (const [label, target] of [["__PRODUCTION_LABEL__", "main"], ["__PREVIEW_LABEL__", "develop"]]) {
29
+ const item = document.createElement("li");
30
+ item.className = "nav-item";
31
+ const link = document.createElement("a");
32
+ link.className = `nav-link channel-link${channel === target ? " active" : ""}`;
33
+ link.href = `${pagesRoot}${target}/`;
34
+ link.textContent = label;
35
+ item.append(link);
36
+ primaryNav.append(item);
37
+ }
38
+ document.querySelectorAll("[data-release-target]").forEach((link) => {
39
+ link.href = `${pagesRoot}${link.dataset.releaseTarget}/`;
40
+ });
41
+ }
42
+
43
+ const editLink = [...document.querySelectorAll("a.nav-link")].find((link) =>
44
+ link.textContent.includes("Edit on GitHub"),
45
+ );
46
+ if (editLink) {
47
+ editLink.href = editLink.href.replace("/edit/main/", `/edit/${channel}/`);
48
+ }
49
+
50
+ const footer = document.querySelector("footer.col-md-12");
51
+ if (footer) {
52
+ const provenance = document.createElement("p");
53
+ provenance.className = "release-provenance";
54
+ provenance.innerHTML = [
55
+ `<strong>Provenance</strong>`,
56
+ `<a href="__REPOSITORY_URL__/tree/__RELEASE_SHA__">__REPOSITORY__@__SHORT_SHA__</a>`,
57
+ `<span>branch / __RELEASE_BRANCH__</span>`,
58
+ `<span>channel / __RELEASE_CHANNEL__</span>`,
59
+ `<span>Made with ❤️ by <a href="https://adammatthewsteinberger.github.io/vibey/">Vibey</a>, Developed by <a href="https://hire.adam.matthewsteinberger.com/">Adam Matthew Steinberger</a> (<a href="https://github.com/adammatthewsteinberger/">@adammatthewsteinberger</a>).</span>`,
60
+ ].join('<span aria-hidden="true">·</span>');
61
+ footer.append(provenance);
62
+ }
63
+ })();