feat: ton of shufflin' #2

Merged
joshtronic merged 15 commits from development into master 2026-05-15 04:20:40 +00:00
Owner
No description provided.
refactor: rename harness to foreman
All checks were successful
Lint / check-sync (push) Successful in 4s
f486743fa7
Disambiguates the coordinator (foreman) from the bot user identity
(igor, unchanged). IGOR_HOME → FOREMAN_HOME, igor-tick@ →
foreman-tick@, state dir, prose references throughout. Bot user
references (Forgejo assignee, git author, ~/.config/igor mentions
that were stale anyway) updated accordingly.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
feat: README and configurable BOT_USER
All checks were successful
Lint / check-sync (push) Successful in 3s
dd22ec7ecb
README now describes the system without leaning on "harness"; uses
the boss/worker framing (Foreman gives orders, igor pulls the lever).

tick.sh's hardcoded `igor` assignee is replaced with $BOT_USER from
the environment, defaulting to igor. Override via .env when needed.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Less igor-centric name for the project validator. Checks .env vars,
per-project conf, repo presence, .claude/settings.json, ENQUEUE_CMD
executability if declared, Forgejo API reachability, required labels
(Agent + Status/Blocked), and bot user existence. systemd unit
status and bot push/comment permissions are TODO.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
feat: systemd templates and enqueue wrapper
All checks were successful
Lint / check-sync (push) Successful in 4s
714ca5f2fe
systemd/foreman-{tick,enqueue}@.{service,timer} as user-unit
templates, instance = project name. Defaults: tick every 10min from
previous completion (OnUnitInactiveSec, prevents overlap), enqueue
every 6h. Per-project overrides via timer drop-ins.

bin/enqueue.sh is a thin wrapper that loads a project's .conf,
sources the harness .env, and execs the project's ENQUEUE_CMD with
working dir set to REPO_PATH. Keeps systemd unit files generic.

README updated with the install one-liner.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
chore: add .env.example and projects/test.conf stub
All checks were successful
Lint / check-sync (push) Successful in 4s
ad18f5e92d
.env.example shows the three required vars and two optional knobs
(BOT_USER, FOREMAN_STATE_DIR). Copy to .env, chmod 600, fill in.

projects/test.conf is the sandbox config. Adjust REPO_PATH and
FORGEJO_REPO to point at a test repo, then validate-project.sh
test gives the remaining setup punch-list.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
feat: install/uninstall-project scripts for systemd timers
All checks were successful
Lint / check-sync (push) Successful in 4s
d39ac32eba
install-project.sh verifies the conf exists, copies templates to
~/.config/systemd/user/ (idempotent), enables foreman-tick, and
conditionally enables foreman-enqueue based on whether ENQUEUE_CMD
is set in the conf. uninstall-project.sh disables timers cleanly
without removing shared templates.

Replaces the blind-cp setup in the README.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
feat: add max turns, and drop old ref
All checks were successful
Lint / check-sync (push) Successful in 4s
c151924d2e
Bot now runs with a dev-centric --settings file (broad allow list,
targeted deny). Noop comments include the tail of claude's output in
a <details> block so permission denials and silent failures are
debuggable from the Forgejo UI without journal-diving.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
validate.sh always checks the global env plus every project — drop
the optional single-project arg, less ceremony. Also adds a check
that agent-settings.json is present.

uninstall.sh mirrors install.sh: stops/disables tick.timer and removes
the unit files. Leaves the rest of the repo alone.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Nothing called forgejo_remove_label — humans clear Status/Blocked via
the Forgejo UI when unblocking. With that gone, the label-id cache
serves nothing, so inline the lookup into forgejo_add_label.

README gets some superhero flavor without losing the docs.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
BOT_USER default flipped from "igor" to the generic "agent" — the
name fits the role (Agent-labeled issues, agent does the work) and
keeps the harness branding-neutral.

SPEC.md is gone. Its load-bearing content (labels state machine,
bot user prereqs, conf schema, scope, trade-offs) moves into README
as proper sections. The redundant sections (model, lifecycle,
tick.sh contract step-list, file responsibilities) get dropped —
README + code are the source of truth.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Also fixed up tables
The install script is already systemd-only; the cron alternative was
hedging. Dropping it. Added an Operating section with the three
commands actually worth knowing day-to-day (list-timers, journalctl,
manual start).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
chore: strip em-dashes and fancy arrows, ASCII only
All checks were successful
Lint / check-sync (push) Successful in 4s
Lint / check-sync (pull_request) Successful in 3s
bb34e787d5
If you can't type it on a keyboard, it doesn't belong in the source.
Em-dashes become --, arrows become -> and <->. Tree-drawing chars in
file-layout blocks stay (they look like `tree` output and are
copy-pasteable as a unit).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
joshtronic deleted branch development 2026-05-15 04:20:40 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
joshtronic/igor!2
No description provided.