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.
- codexloop-0.4.0/.gitattributes +2 -0
- codexloop-0.4.0/.githooks/commit-msg +67 -0
- codexloop-0.4.0/.githooks/commit-msg.local +11 -0
- codexloop-0.4.0/.githooks/pre-commit +11 -0
- codexloop-0.4.0/.githooks/pre-push +78 -0
- codexloop-0.4.0/.githooks/pre-push.local +11 -0
- codexloop-0.4.0/.github/vibey-gh/release/channel.js +63 -0
- codexloop-0.4.0/.github/vibey-gh/release/vibey.css +605 -0
- codexloop-0.4.0/.github/workflows/automation-bootstrap.yml +105 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/.github/workflows/ci.yml +17 -9
- codexloop-0.4.0/.github/workflows/merge-train.yml +84 -0
- codexloop-0.4.0/.github/workflows/pr-automation.yml +1123 -0
- codexloop-0.4.0/.github/workflows/promote-to-main.yml +76 -0
- codexloop-0.4.0/.github/workflows/provenance.yml +68 -0
- codexloop-0.4.0/.github/workflows/release-surfaces.yml +702 -0
- codexloop-0.4.0/.github/workflows/release.yml +163 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/.pre-commit-config.yaml +5 -0
- codexloop-0.4.0/.vibey-gh.toml +69 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/PKG-INFO +15 -2
- {codexloop-0.3.1 → codexloop-0.4.0}/README.md +12 -1
- codexloop-0.4.0/docs/javascripts/channel.js +63 -0
- codexloop-0.4.0/docs/stylesheets/vibey.css +605 -0
- codexloop-0.4.0/properdocs.yml +54 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/pyproject.toml +19 -2
- codexloop-0.4.0/src/codexloop/__init__.py +4 -0
- codexloop-0.4.0/src/codexloop/application/__init__.py +2 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/application/dto.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/application/interfaces/__init__.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/application/interfaces/agent.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/application/interfaces/api.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/application/interfaces/control.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/application/interfaces/doctor.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/application/interfaces/observability.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/application/interfaces/permissions.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/application/interfaces/storage.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/application/interfaces/system.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/application/ports.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/application/runner.py +57 -0
- codexloop-0.4.0/src/codexloop/application/usecases/__init__.py +2 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/application/usecases/doctor.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/application/usecases/list_threads.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/application/usecases/preflight.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/application/usecases/resume_thread.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/application/usecases/run_control.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/application/usecases/run_plan.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/bootstrap.py +32 -3
- codexloop-0.4.0/src/codexloop/cli/__init__.py +2 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/cli/app.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/cli/asyncio.py +1 -0
- codexloop-0.4.0/src/codexloop/cli/commands/__init__.py +2 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/cli/commands/approval_cmd.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/cli/commands/capacity.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/cli/commands/cwd_cmd.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/cli/commands/doctor.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/cli/commands/effort_cmd.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/cli/commands/logs.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/cli/commands/model_cmd.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/cli/commands/prompt.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/cli/commands/reset.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/cli/commands/resume.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/cli/commands/run.py +10 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/cli/commands/runs.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/cli/commands/sandbox_cmd.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/cli/commands/savepoints.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/cli/commands/snapshot.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/cli/commands/status.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/cli/commands/stop.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/cli/commands/threads.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/cli/commands/unwind.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/cli/commands/watch.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/cli/commands/wind_down_cmd.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/cli/render.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/domain/__init__.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/domain/approval.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/domain/backoff.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/domain/budget.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/domain/capacity.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/domain/classify.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/domain/completion.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/domain/control.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/domain/error_codes.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/domain/errors.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/domain/forecast.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/domain/handoff_marker.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/domain/loop.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/domain/model_profile.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/domain/plan.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/domain/savepoint.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/domain/savepoint_message.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/domain/session.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/domain/signals.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/domain/verbosity.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/domain/waiting.py +1 -0
- codexloop-0.4.0/src/codexloop/infrastructure/__init__.py +1 -0
- codexloop-0.4.0/src/codexloop/infrastructure/agent/__init__.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/infrastructure/agent/argv.py +7 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/infrastructure/agent/events.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/infrastructure/agent/gateway.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/infrastructure/agent/probe.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/infrastructure/agent/process.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/infrastructure/agent/schema.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/infrastructure/agent/scripted.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/infrastructure/agent/translate.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/infrastructure/api/__init__.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/infrastructure/api/binder.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/infrastructure/api/gateway.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/infrastructure/api/introspect.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/infrastructure/api/json_io.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/infrastructure/api/params.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/infrastructure/api/providers.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/infrastructure/api/registry.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/infrastructure/appserver/__init__.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/infrastructure/appserver/client.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/infrastructure/appserver/gateway.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/infrastructure/appserver/ratelimits.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/infrastructure/audit.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/infrastructure/capacity_probe.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/infrastructure/clock.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/infrastructure/config.py +3 -1
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/infrastructure/control.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/infrastructure/doctor_env.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/infrastructure/events.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/infrastructure/git_savepoints.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/infrastructure/lock.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/infrastructure/logging.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/infrastructure/notify.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/infrastructure/progress.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/infrastructure/redact.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/infrastructure/rollout.py +1 -0
- codexloop-0.4.0/src/codexloop/infrastructure/run_snapshot.py +44 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/infrastructure/rundir.py +9 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/infrastructure/snapshot.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/infrastructure/state.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/infrastructure/state_bus.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/infrastructure/stream_ui.py +1 -0
- codexloop-0.4.0/tests/__init__.py +1 -0
- codexloop-0.4.0/tests/application/__init__.py +2 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/application/fakes.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/application/test_doctor.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/application/test_interfaces_convention.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/application/test_ports.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/application/test_runner.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/application/test_runner_wind_down_coverage.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/application/test_sleep_interruptible.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/application/test_usecases.py +82 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/application/test_waiting_runner.py +1 -0
- codexloop-0.4.0/tests/cli/__init__.py +2 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/cli/test_api.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/cli/test_app.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/cli/test_asyncio.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/cli/test_e2e_shim.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/cli/test_ops_commands.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/cli/test_sysexit.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/cli/test_verbosity_flags.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/cli/test_wind_down_cmd.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/conftest.py +1 -0
- codexloop-0.4.0/tests/domain/__init__.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/domain/strategies.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/domain/test_approval.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/domain/test_backoff.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/domain/test_budget.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/domain/test_capacity.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/domain/test_classify.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/domain/test_completion.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/domain/test_control.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/domain/test_error_codes.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/domain/test_forecast.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/domain/test_handoff_marker.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/domain/test_loop.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/domain/test_model_profile.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/domain/test_plan.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/domain/test_savepoint.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/domain/test_session.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/domain/test_verbosity.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/domain/test_waiting.py +1 -0
- codexloop-0.4.0/tests/infrastructure/__init__.py +1 -0
- codexloop-0.4.0/tests/infrastructure/api/__init__.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/infrastructure/api/test_binder.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/infrastructure/api/test_drift.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/infrastructure/api/test_gateway.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/infrastructure/api/test_introspect.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/infrastructure/api/test_json_io.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/infrastructure/api/test_params.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/infrastructure/api/test_params_extra.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/infrastructure/api/test_providers.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/infrastructure/api/test_providers_gateway_extra.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/infrastructure/test_appserver.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/infrastructure/test_appserver_gateway.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/infrastructure/test_argv.py +20 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/infrastructure/test_capacity_probe.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/infrastructure/test_config.py +14 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/infrastructure/test_control_and_savepoints.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/infrastructure/test_coverage_boost.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/infrastructure/test_doctor_env.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/infrastructure/test_event_to_dict.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/infrastructure/test_events.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/infrastructure/test_gateway.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/infrastructure/test_git_savepoints_units.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/infrastructure/test_handoff_marker.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/infrastructure/test_lock.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/infrastructure/test_logging_redact.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/infrastructure/test_probe.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/infrastructure/test_process.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/infrastructure/test_ratelimits_extra.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/infrastructure/test_rollout.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/infrastructure/test_rollout_scan.py +1 -0
- codexloop-0.4.0/tests/infrastructure/test_run_snapshot.py +57 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/infrastructure/test_rundir_run_id.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/infrastructure/test_rundir_state.py +17 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/infrastructure/test_scripted.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/infrastructure/test_snapshot.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/infrastructure/test_state_bus.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/infrastructure/test_stream_ui.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/infrastructure/test_translate.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/live/system/conftest.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/live/system/test_matrix_inprocess.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/live/system/test_subprocess_smoke.py +1 -0
- codexloop-0.4.0/tests/shim/__init__.py +2 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/shim/fake_appserver.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/shim/fake_codex.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/shim/test_fake_codex.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/test_bootstrap.py +33 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/test_no_vendor_leak.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/test_packaging.py +1 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/uv.lock +36 -1
- codexloop-0.3.1/.github/workflows/docs.yml +0 -40
- codexloop-0.3.1/.github/workflows/publish-testpypi.yml +0 -36
- codexloop-0.3.1/.github/workflows/release-please.yml +0 -82
- codexloop-0.3.1/.release-please-manifest.json +0 -3
- codexloop-0.3.1/release-please-config.json +0 -9
- codexloop-0.3.1/src/codexloop/__init__.py +0 -3
- codexloop-0.3.1/src/codexloop/application/__init__.py +0 -1
- codexloop-0.3.1/src/codexloop/application/usecases/__init__.py +0 -1
- codexloop-0.3.1/src/codexloop/cli/__init__.py +0 -1
- codexloop-0.3.1/src/codexloop/cli/commands/__init__.py +0 -1
- codexloop-0.3.1/src/codexloop/infrastructure/__init__.py +0 -0
- codexloop-0.3.1/src/codexloop/infrastructure/agent/__init__.py +0 -0
- codexloop-0.3.1/tests/__init__.py +0 -0
- codexloop-0.3.1/tests/application/__init__.py +0 -1
- codexloop-0.3.1/tests/cli/__init__.py +0 -1
- codexloop-0.3.1/tests/domain/__init__.py +0 -0
- codexloop-0.3.1/tests/infrastructure/__init__.py +0 -0
- codexloop-0.3.1/tests/infrastructure/api/__init__.py +0 -0
- codexloop-0.3.1/tests/shim/__init__.py +0 -1
- {codexloop-0.3.1 → codexloop-0.4.0}/.agent/rules/codexloop-architecture.md +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/.agent/rules/codexloop-completion.md +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/.agent/rules/codexloop-docs.md +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/.agent/rules/codexloop-quota-and-capacity.md +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/.agent/rules/codexloop-releasing.md +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/.agent/rules/codexloop-rest-surface.md +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/.agent/rules/codexloop-run.md +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/.agent/rules/codexloop-testing.md +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/.agents/skills/codexloop-architecture/SKILL.md +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/.agents/skills/codexloop-completion/SKILL.md +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/.agents/skills/codexloop-docs/SKILL.md +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/.agents/skills/codexloop-quota-and-capacity/SKILL.md +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/.agents/skills/codexloop-releasing/SKILL.md +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/.agents/skills/codexloop-rest-surface/SKILL.md +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/.agents/skills/codexloop-run/SKILL.md +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/.agents/skills/codexloop-testing/SKILL.md +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/.claude/skills/codexloop-architecture/SKILL.md +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/.claude/skills/codexloop-completion/SKILL.md +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/.claude/skills/codexloop-docs/SKILL.md +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/.claude/skills/codexloop-quota-and-capacity/SKILL.md +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/.claude/skills/codexloop-releasing/SKILL.md +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/.claude/skills/codexloop-rest-surface/SKILL.md +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/.claude/skills/codexloop-run/SKILL.md +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/.claude/skills/codexloop-testing/SKILL.md +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/.cursor/rules/codexloop-architecture.mdc +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/.cursor/rules/codexloop-completion.mdc +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/.cursor/rules/codexloop-docs.mdc +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/.cursor/rules/codexloop-quota-and-capacity.mdc +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/.cursor/rules/codexloop-releasing.mdc +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/.cursor/rules/codexloop-rest-surface.mdc +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/.cursor/rules/codexloop-run.mdc +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/.cursor/rules/codexloop-testing.mdc +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/.editorconfig +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/.github/CODEOWNERS +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/.gitignore +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/AGENTS.md +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/CHANGELOG.md +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/CLAUDE.md +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/CODE_OF_CONDUCT.md +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/CONTRIBUTING.md +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/GEMINI.md +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/LICENSE +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/SECURITY.md +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/SUPPORT.md +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/docs/architecture/adr/0001-onion-import-linter.md +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/docs/architecture/adr/0002-subprocess-codex-exec.md +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/docs/architecture/adr/0003-credits-exhausted.md +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/docs/architecture/adr/0004-adaptive-probe-loop.md +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/docs/architecture/adr/0005-layered-capacity-probe.md +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/docs/architecture/adr/0006-generated-openai-rest.md +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/docs/architecture/adr/0007-default-approval-sandbox.md +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/docs/architecture/adr/0008-policy-via-c-flags.md +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/docs/architecture/adr/0009-optional-app-server.md +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/docs/architecture/adr/0010-rollout-best-effort.md +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/docs/architecture/adr/0011-never-consume-resets.md +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/docs/architecture/adr/0012-minimum-codex-version.md +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/docs/architecture/adr/index.md +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/docs/architecture/index.md +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/docs/contributing.md +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/docs/getting-started.md +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/docs/guides/rest-api-surface.md +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/docs/index.md +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/docs/plans/_shared-transplant-outline.md +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/docs/plans/architecture-and-roadmap.md +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/docs/plans/research-notes.md +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/docs/publishing.md +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/docs/reference/cli.md +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/docs/superpowers/plans/2026-08-13-codexloop-implementation.md +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/mkdocs.yml +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/infrastructure/api/api_baseline.json +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/src/codexloop/py.typed +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/fixtures/jsonl/README.md +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/fixtures/jsonl/clean_completion.jsonl +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/fixtures/jsonl/done_with_marker.jsonl +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/fixtures/jsonl/huge_line.jsonl +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/fixtures/jsonl/malformed_line.jsonl +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/fixtures/jsonl/tool_heavy.jsonl +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/fixtures/jsonl/truncated_stream.jsonl +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/fixtures/jsonl/turn_failed_429_quota.jsonl +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/fixtures/jsonl/turn_failed_429_window.jsonl +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/live/fixtures/agent_scripts/done.json +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/live/fixtures/agent_scripts/quota_then_topup.json +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/live/fixtures/agent_scripts/unknown_429.json +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/live/fixtures/agent_scripts/wait_long.json +0 -0
- {codexloop-0.3.1 → codexloop-0.4.0}/tests/live/fixtures/agent_scripts/window_then_done.json +0 -0
|
@@ -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
|
+
})();
|