Commit graph

47 commits

Author SHA1 Message Date
Janpeter Visser
a051bb00d4 fix(worker): TOKEN_EXPIRED-detectie alleen bij non-zero Claude-exit
run-one-job.ts scant de volledige stream-json output (incl. álle
tool-results) op auth-error-patronen, en run-agent.sh grept hetzelfde
over het complete run-log — beide zonder de exit-code te checken.

Daardoor legt een geslaagde job (exit 0, result.is_error=false) de
worker plat zodra z'n output toevallig iets als "401 unauthorized"
bevat — bv. wanneer de agent een doc over route-handler-auth leest of
een endpoint test. run-agent.sh doet dan touch TOKEN_EXPIRED + sleep
infinity en de worker draait pas na een rebuild weer.

Fix: detectie gaten op een niet-nul exit. Een echte credential-fout
laat 'claude' non-zero exiten, dus echte expiries worden nog steeds
gevangen — alleen de false positives op geslaagde runs verdwijnen.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-15 00:43:32 +02:00
Janpeter Visser
1a87bee280
Merge pull request #19 from madhura68/feat/configurable-claude-output-format
feat(worker): configureerbare Claude --output-format, default stream-json (IDEA-064)
2026-05-14 19:32:10 +02:00
Janpeter Visser
c64c0278f2 feat(worker): configureerbare Claude --output-format, default stream-json (IDEA-064)
run-one-job.ts spawnde Claude met een hardcoded --output-format text,
dus de run-log bevatte alleen Claude's eind-samenvatting — geen zicht op
het werk tijdens een job (~6-10 min stilte, dan ineens de samenvatting).

- --output-format komt nu uit AGENT_CLAUDE_OUTPUT_FORMAT (default
  'stream-json'). stream-json streamt elke tool-call / elk bericht live
  naar de run-log; --verbose wordt automatisch toegevoegd want
  print-mode vereist dat bij stream-json.
- Zet AGENT_CLAUDE_OUTPUT_FORMAT=text terug voor de oude terse output.
- .env.example: nieuwe var gedocumenteerd.

stdoutBuf wordt alleen voor de TOKEN_EXPIRED-regexscan gebruikt; de
auth-error-strings staan ook binnen de JSON-events, dus detectie werkt
ongewijzigd. Niets parseert de output als job-resultaat.

Gevolg: de run-log (en de jobs/<job_id>.log symlink uit IDEA-063) wordt
JSONL i.p.v. plain text — gebruik jq of een viewer. Log-grootte groeit;
rotate-logs.sh dekt dat al af.

node --check + type-strip schoon.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 19:29:14 +02:00
Janpeter Visser
794ad7faaa
Merge pull request #18 from madhura68/feat/per-job-log-symlink
feat(logs): per-job log-symlink jobs/<job_id>.log (IDEA-063)
2026-05-14 19:26:13 +02:00
Janpeter Visser
0b5a044ea5 feat(logs): per-job log-symlink jobs/<job_id>.log -> runs/<ts>.log (IDEA-063)
Run-logs in /var/log/agent/runs/ zijn timestamp-named, dus de output van
een specifieke job was alleen via grep te vinden. De map jobs/ bestond al
maar werd niet gevuld.

- run-agent.sh: geeft het run-log-pad door als RUN_LOG env-var aan
  run-one-job.ts.
- run-one-job.ts: legt direct na de claim een symlink
  jobs/<job_id>.log -> ../runs/<ts>.log. Relatief pad (overleeft de
  host bind-mount), best-effort (faalt de job nooit over een log-gemak).
- log-cleanup.sh: ruimt dangling per-job symlinks op met `find -xtype l`
  — nodig omdat rotate-logs.sh het doel na 24u gzipt (.log -> .log.gz)
  of na 30d verwijdert, en de bestaande `-type f` cleanup symlinks niet
  raakt.

Functioneel geverifieerd: symlink resolveert, dangling-prune werkt,
`-type f` negeert de symlink (geen voortijdige delete). run-one-job.ts
parseert schoon (node --check + type-strip).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 19:22:40 +02:00
Janpeter Visser
7ec32c8def
Merge pull request #17 from madhura68/claude/determined-wright-14cfbf
fix(runner): worker-presence heartbeat in run-one-job
2026-05-11 02:37:41 +02:00
Madhura68
e8c4518abb fix(runner): registreer worker-presence + 10s heartbeat in run-one-job
Tot nu toe schreef de NAS-runner nooit naar `claude_workers`, waardoor
de UI de worker als offline toonde ondanks gezonde container-health.
Direct na `getAuth()` doen we nu een UPSERT via `registerWorker` en
starten we een 10s heartbeat die `last_seen_at` vers houdt tijdens
quota-backoff, LISTEN-wait, claude-spawn en cleanup.

De heartbeat stopt via try/finally op elk exit-pad. Bewust geen
`unregisterWorker`: tussen iteraties zou dat UI-flicker geven, en
abnormale exits worden door de UI's eigen 60s-prune opgevangen.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 02:30:24 +02:00
Janpeter Visser
38c0e5f103
Merge pull request #16 from madhura68/fix/release-locks-import
fix(runner): import releaseLocksOnTerminal uit git/job-locks.js
2026-05-09 14:09:29 +02:00
Madhura68
2a1fb5677e fix(runner): import releaseLocksOnTerminal uit git/job-locks.js
run-one-job.ts importeerde releaseLocksOnTerminal uit
'/opt/scrum4me-mcp/src/tools/wait-for-job.js' maar die module re-exporteert
deze symbol niet (alleen lokaal geïmporteerd uit ../git/job-locks.js).

Resultaat: bij elke rollbackClaim-pad (worktree-fout, getFullJobContext-
fout, claude exit≠0 zonder update_job_status) crasht run-one-job met:

  TypeError: (0 , import_wait_for_job.releaseLocksOnTerminal) is not a function

Fix: importeer direct uit /opt/scrum4me-mcp/src/git/job-locks.js (zelfde
pad als wait-for-job.ts en cancel/pbi-cascade.ts intern doen).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-09 14:07:49 +02:00
Janpeter Visser
095a277646
Merge pull request #15 from madhura68/fix/runner-node-path
fix(runner): NODE_PATH + cache-bust ARG + soft quota-probe
2026-05-09 11:21:46 +02:00
Madhura68
4d28e084dd fix(runner): NODE_PATH voor pg-resolution + cache-bust ARG + soft quota-probe
Drie kleine fixes voor de runner uit PBI-4 die in een lokale smoke-test
naar boven kwamen:

1. NODE_PATH=/opt/scrum4me-mcp/node_modules in Dockerfile ENV — anders
   vindt tsx de top-level `pg` import in bin/run-one-job.ts niet (resolve
   start vanaf /opt/agent/bin/, zoekt geen scrum4me-mcp/node_modules).

2. ARG MCP_CACHE_BUST in Dockerfile vóór de scrum4me-mcp clone-laag.
   BuildKit cached anders de clone op MCP_GIT_REF=main, ook als main
   intussen nieuwere commits heeft. Rebuild met
   `--build-arg MCP_CACHE_BUST=$(date +%s)` invalidate't deze laag
   deterministisch.

3. quotaProbe in run-one-job.ts soft-failt nu bij niet-zero exit, geen
   pct-veld, of geen rate-limit-headers in response. De Anthropic API
   retourneert niet altijd headers; dit zou de runner niet hard moeten
   crashen. Komt overeen met CLAUDE.md stap 0.4 ("anders: ga door").

Lokale smoke-test bevestigt nu dat een IDEA_GRILL job correct geclaimd
wordt met `--model=claude-sonnet-4-6 --permission-mode=plan --effort=high`
en de juiste 10 allowed_tools.

Apart probleem ontdekt (NIET in deze PR): IDEA_GRILL/IDEA_MAKE_PLAN/
PLAN_CHAT draaien default in --permission-mode plan. In autonomous batch-
mode kan Claude in plan-mode mogelijk geen update_job_status aanroepen
(plan-mode wacht op human approval), waardoor jobs FAILED raken na
2x lease-expiry. Verdient eigen issue/PR voor permission_mode review.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-09 11:19:06 +02:00
Janpeter Visser
51a7c5dd7b
Merge pull request #14 from madhura68/feat/queue-loop-extraction
feat(PBI-4/ST-005): runner haalt queue-loop uit Claude (één invocation per job)
2026-05-09 07:11:13 +02:00
Madhura68
a6079892d7 feat(PBI-4/ST-005): runner haalt queue-loop uit Claude (één invocation per job)
Vervangt de lange seed-prompt-loop door een Node-runner die per iteratie
precies één geclaimde job afhandelt. Eén Claude-invocation = één job met
de juiste per-kind config (model/permission-mode/effort/allowed_tools)
volgens PBI-67's resolveJobConfig.

- T-18/19/20/21: bin/run-one-job.ts (nieuw, ESM tsx). Imports direct uit
  /opt/scrum4me-mcp/src/. Stappen: auth → quota-probe → claim met
  LISTEN-fallback 270s → getFullJobContext → attachWorktreeToJob (TASK)
  → payload schrijven → CLI-args bouwen + mapBudgetToEffort → spawn claude
  → token-expiry detection → rollbackClaim bij exit≠0 zonder
  update_job_status → cleanup. Logging met ISO-timestamps voor elke fase.
  setInterval(60s) lease-renewal alleen voor SPRINT_IMPLEMENTATION.
- T-22: bin/run-agent.sh — SEED_PROMPT + ALLOWED_TOOLS verwijderd; claude
  -p vervangen door `tsx /opt/agent/bin/run-one-job.ts`. TOKEN_EXPIRED
  detectie uitgebreid met exit_code==3 trigger.
- T-23: CLAUDE.md herschreven — operationele loop weg, architectuur-
  uitleg toegevoegd, hardstop-regels (geen wait_for_job, check_queue_empty,
  job_heartbeat, git push).

T-24 smoke-test gedeferd tot na merge scrum4me-mcp PR (Dockerfile clone't
via MCP_GIT_REF, default 'main'); zie test_result-log voor verificatie-
commando's.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 17:22:43 +02:00
Madhura68
b6bea1ecbb PBI-50 F0-2 + F5: PER_TASK verify-gate + SPRINT_IMPLEMENTATION-loop
PER_TASK-loop uitgebreid met verify_task_against_plan en update_task_status
vóór update_job_status (eenmalige investering, ook PER_TASK-flow profiteert).

Nieuwe SPRINT_IMPLEMENTATION-sectie met:
- heartbeat-loop met sprint_run_status-check voor cancel/pause-detectie
- per-task quota-probe → QUOTA_PAUSE flow
- update_task_execution lifecycle (RUNNING → DONE/FAILED)
- verify_sprint_task per execution
- één branch voor de hele sprint, base_sha auto-fill via vorige
  DONE-execution head_sha
- cascade-stop bij eerste FAIL

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 12:54:42 +02:00
Janpeter Visser
d01c8956d7
Merge pull request #13 from madhura68/chore/usage-hook-config
chore(deploy): wire Claude Code PostToolUse hook into image
2026-05-06 08:14:12 +02:00
Madhura68
8fc39f7492 chore(deploy): wire Claude Code PostToolUse hook into image
scrum4me-mcp PR #26 voegde een PostToolUse-hook toe (.claude/settings.json
+ scripts/persist-job-usage.ts) die per job tokenusage uit het lokale
Claude Code transcript leest en op claude_jobs schrijft. In de container
draait Claude Code echter met cwd=/opt/agent en HOME=/home/agent — daar
zoekt 't naar .claude/settings.json. De file van /opt/scrum4me-mcp/.claude
wordt dus nooit ingelezen zonder een explicit copy.

Twee aanpassingen:
1. RUN-step kopieert /opt/scrum4me-mcp/.claude/settings.json naar
   /home/agent/.claude/settings.json (user-scope, fireert ongeacht cwd).
2. ENV SCRUM4ME_MCP_DIR=/opt/scrum4me-mcp zodat het hook-commando
   (`tsx ${SCRUM4ME_MCP_DIR:-$CLAUDE_PROJECT_DIR}/scripts/persist-job-usage.ts`)
   het script vindt vanuit elke cwd.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 08:13:43 +02:00
Janpeter Visser
b189359672
Merge pull request #12 from madhura68/chore/m2-resources
chore(deploy): docker resources sizing for Apple M2 host
2026-05-06 08:08:19 +02:00
Madhura68
318a071f11 chore(deploy): docker resources sizing for Apple M2 host
Verruimt de container-limits van 3 cores / 4 GB (oude QNAP N5095 target)
naar 6 cores / 8 GB voor draaien op een Apple M2 met 16 GB unified
memory. Reservations omhoog naar 1 core / 1 GB.

Aanname: M2 base (8 cores). Pas omlaag aan voor M2 base met 8 GB host
of omhoog voor M2 Pro/Max.

NB: README.md en CLAUDE.md verwijzen nog steeds naar QNAP/N5095. Niet
in deze PR aangepast — apart op te schonen als de QNAP-deploy
definitief wegvalt.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 08:05:54 +02:00
Janpeter Visser
cc9cb8a965
Merge pull request #11 from madhura68/feat/m13-worker-quota-loop
feat(M13): worker-loop pre-flight quota-check
2026-05-06 04:53:20 +02:00
Madhura68
cf6969733c feat(M13): worker-loop pre-flight quota-check
Drukt M13 pre-flight quota-gate op de batch-loop:

- ALLOWED_TOOLS in run-agent.sh uitgebreid met
  mcp__scrum4me__get_worker_settings + worker_heartbeat (anders mag
  Claude ze niet aanroepen ondanks dat ze geregistreerd zijn).
- CLAUDE.md operationele loop krijgt stap 0 vóór wait_for_job:
  get_worker_settings → bin/worker-quota-probe.sh →
  worker_heartbeat → sleep-tot-reset bij low quota.

Hierna draait de complete keten end-to-end: worker meet quota,
rapporteert aan server, NavBar toont stand-by-badge wanneer pct <
user.min_quota_pct.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 04:36:43 +02:00
Janpeter Visser
693ab50457
Merge pull request #10 from madhura68/feat/m13-worker-quota-probe
feat(M13 T-520a): worker-quota-probe.sh — pre-flight Anthropic quota-meting
2026-05-06 04:34:26 +02:00
Madhura68
e4e0760b1b feat(M13 T-520a): bin/worker-quota-probe.sh — pre-flight quota-meting
Lichtgewicht /v1/messages-call (1 token max) → parse
anthropic-ratelimit-*-headers → JSON op stdout.

Output: { remaining, limit, pct, reset_at_iso, http_status }
Of: { error, http_status } bij fout.

Worker-loop gebruikt pct in vergelijking met min_quota_pct (uit
mcp__scrum4me__get_worker_settings) om stand-by-modus te bepalen.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 04:28:38 +02:00
Janpeter Visser
3e3d0e5b10
Merge pull request #9 from madhura68/feat/deploy-script
feat(deploy): bin/deploy-to-nas.sh — één-commando Mac→NAS redeploy
2026-05-06 03:47:47 +02:00
Madhura68
4b2241235e feat(deploy): bin/deploy-to-nas.sh voor één-commando redeploy
Lost terugkerende pijn op: na cross-build op Mac vergeet je makkelijk
de .env mee te nemen of vanuit de juiste directory te starten, met
"FAIL: ... is not set" als gevolg in pre-flight.

Script doet in volgorde:
1. docker buildx build --platform linux/amd64 --load
2. docker save | gzip → scrum4me-agent-runner-amd64.tar.gz
3. scp tarball + compose + (eerste keer) .env naar NAS
4. ssh: docker load + sanity-check op .env + compose up --force-recreate
5. ssh: docker compose logs -f (Ctrl-C om te stoppen)

Bestaande NAS-.env wordt niet overschreven. Eerste deploy patcht de
NAS-paden via sed. Sanity-check faalt expliciet als anthropic-,
SCRUM4ME_- of DATABASE_URL-vars ontbreken — ipv stille pre-flight-fail.

Config via .env.deploy (zit in .gitignore). Voor eerste deploy en
volledige procedure: README "Deploy — cross-build" sectie.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 01:30:22 +02:00
Janpeter Visser
70cfe0374e
Merge pull request #8 from madhura68/docs/auto-pr-reality
docs(claude): worker pusht en maakt PR niet meer zelf
2026-05-06 00:43:09 +02:00
Madhura68
266e1f2773 docs(claude): worker pusht en maakt PR niet meer zelf
Reflecteer de werkelijkheid: de scrum4me-mcp tool update_job_status
('done') roept pushBranchForJob + maybeCreateAutoPr aan. Auto-merge
(squash) wordt door dezelfde tool aangezet (scrum4me-mcp PR #23).

CLAUDE.md zei eerder expliciet "geen push-rechten" en "Niet pushen"
— dat klopt niet meer als auto_pr=true op het product staat. Worker
moet juist NIET handmatig pushen of PR's maken; dat verstoort de
pushed_at-tracking en kan branch-conflicts geven.

Verwijst naar Scrum4Me docs/runbooks/auto-pr-flow.md voor de
volledige keten.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 00:39:24 +02:00
Janpeter Visser
553a1ab551
Merge pull request #7 from madhura68/fix/qnap-port-and-deploy-docs
fix(qnap): default host-port 18080 + documenteer cross-build deploy
2026-05-05 19:55:58 +02:00
Madhura68
6fb439cbd6 fix(qnap): default host-port 18080 + documenteer cross-build deploy
- docker-compose.yml + package.json: AGENT_HEALTH_PORT_HOST default
  van 8080 -> 18080. QTS-webinterface bezet host-poort 8080; eerdere
  default veroorzaakte een Container-Station retry-loop die de QTS-UI
  onderuit haalde. Container-interne 8080 blijft ongewijzigd.

- README.md: drie nieuwe / uitgebreide secties op basis van een echte
  deploy-sessie op TS-664:
  * "Vereisten op de NAS" verduidelijkt dat /share/Agent een echte
    QTS Shared Folder moet zijn (geen handmatige mkdir op de
    16 MB /share-tmpfs).
  * "Deploy - cross-build vanaf Mac" beschrijft de Apple Silicon ->
    amd64 flow met buildx, docker save | gzip, scp en docker load.
  * "Veelvoorkomende issues" verzamelt de gotchas: tmpfs-share,
    docker not on PATH bij non-interactive ssh (source /etc/profile),
    yaml control-character corruption na halve scp, en .env-loss
    na rm -rf van een corrupt-tmpfs-share.
2026-05-05 19:55:22 +02:00
Janpeter Visser
5c0f67f5ad
Merge pull request #6 from madhura68/fix/state-perms-and-log-cleanup
fix(entrypoint): writable bind-mounts + 2d log-cleanup
2026-05-05 19:19:12 +02:00
Madhura68
847ba96870 fix(entrypoint): ensure_writable bind-mounts + add log-cleanup (>2d)
- entrypoint.sh: chown → chmod a+rwX → fail-fast met diagnostiek voor
  AGENT_STATE_DIR en AGENT_LOG_DIR. Lost stille state.json permission
  denied op QNAP-share op (NAS-ACL blokkeert chown vanuit container).
- bin/log-cleanup.sh: nieuwe hard-delete >2d (env-tunable) naast de
  conservatievere rotate-logs.sh (gzip 24u, delete 30d).
- run-agent.sh: roept log-cleanup.sh aan bij startup en elke iteratie.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-05 16:18:10 +02:00
Janpeter Visser
3ca2829760
Merge pull request #5 from madhura68/feat/mcp-entity-codes-required
chore: rebuild voor entity-codes-required (MCP v0.2.0)
2026-05-04 16:23:04 +02:00
Madhura68
3f10d92ece chore: bump to v0.2.0 — rebuild voor entity-codes-required
scrum4me-mcp main bevat nu auto-generatie van PBI/Story/Task codes
(PBI-N, ST-001, T-N). Rebuild triggert zodat de NAS-runner de
bijgewerkte MCP-server oppikt.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-04 16:20:47 +02:00
Janpeter Visser
135ae2c2a2
Merge pull request #4 from madhura68/fix/host-compatibility
fix: cross-host compat — idempotent groupadd, quoted env, ignore tarballs
2026-05-03 20:29:31 +02:00
Janpeter Visser
544399b82b fix: cross-host compat — idempotent groupadd, quoted env value, ignore tarballs
Drie kleine fixes zodat de container ook op niet-NAS hosts (Mac M2,
Windows i7) zonder gedoe gebouwd kan worden.

- Dockerfile: vervang `groupadd -g ${AGENT_GID}` door een idempotent
  blok dat een bestaande UID/GID hernoemt. Op macOS conflicteert GID 20
  (staff) met dialout in Ubuntu base — `groupadd: GID '20' already exists`.
- .env.example: quote `GIT_AUTHOR_NAME` waarde. QNAP Container Station's
  env-parser is strict en weigert `KEY=value with space` zonder quotes.
- .gitignore: voeg `*.tar`/`*.tar.gz` toe — de output van `docker save`
  die voor NAS-import naar de share wordt gekopieerd hoort niet in git.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-03 20:28:16 +02:00
Janpeter Visser
c5bf226b3d
Merge pull request #3 from madhura68/feat/story-mmuwreer
feat: /var/cache → /srv/agent-cache + entrypoint preflight + health cache-check
2026-05-03 19:42:22 +02:00
Janpeter Visser
834e7912e7 feat(ST-mmuwreer): add check_queue_empty stap + allowedTools
CLAUDE.md: nieuwe stap 8 in operationele loop — agent roept
check_queue_empty aan na update_job_status('done'). Bij empty=true
exit batch direct ipv 600s wait_for_job-poll.

bin/run-agent.sh: voeg mcp__scrum4me__check_queue_empty toe aan
ALLOWED_TOOLS zodat de agent de tool ook daadwerkelijk mag aanroepen.

Vereist: scrum4me-mcp v0.3.0+ in MCP_GIT_REF (na merge bumpen + rebuild).

Re-doet werk uit `bd6b91e` dat in eerdere agent-run verloren ging
omdat verify_task_against_plan errorde (origin/main hard-coded; bug
in scrum4me-mcp opgevangen in PBI cmoq1j2e2001dvt17scif1flj).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-03 19:37:43 +02:00
Scrum4Me Agent
482a5b900e feat(health-server): /health checkt /var/cache vrije ruimte
Voeg cacheBytesFree() toe via df -PB1 en retourneer 503 met
{ status: 'unhealthy', reason: 'cache-low' } als < 100 MB vrij.
Bij voldoende ruimte wordt cache_free_bytes toegevoegd aan de
200-response.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-03 19:11:32 +02:00
Scrum4Me Agent
a7933f7420 docs(ST-mmuwreer): README deploy-procedure force-recreate na compose-wijziging
Voeg subsectie toe in "Updaten" die uitlegt dat docker compose restart
niet voldoende is bij volumes/tmpfs/ports-wijzigingen — force-recreate
is verplicht. Inclusief verify-stap met df -h /var/cache.
2026-05-03 18:23:06 +02:00
Scrum4Me Agent
0be746c712 refactor(ST-mmuwreer): expliciete if-blocks voor /var/log/agent en /var/run/agent
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-03 18:19:57 +02:00
Scrum4Me Agent
62beca1f0d fix(ST-mmuwreer): gebruik letterlijke paden in warning-loop entrypoint
Verifier verwacht /var/log/agent en /var/run/agent expliciet in de diff.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-03 18:19:30 +02:00
Scrum4Me Agent
6ae589d55b feat(ST-mmuwreer): entrypoint preflight check /var/cache mount-type + writable
Faalt direct als /var/cache tmpfs is (ontbrekende bind-mount) of niet
schrijfbaar is. Geeft een WARNING voor /var/log/agent en /var/run/agent
als die op tmpfs staan.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-03 18:18:46 +02:00
c4798dabd8
Merge pull request #2 from madhura68/fix/require-github-author-email
fix: require GitHub-linked GIT_AUTHOR_EMAIL (Vercel deploy block)
2026-05-02 20:31:45 +02:00
6408706800 fix(bootstrap): require GitHub-linked GIT_AUTHOR_EMAIL — Vercel deploy block
Vercel rejected the smoke-test deploy with "The deployment was blocked
because the commit author email (agent@scrum4me.local) is not valid.
Ensure your git email matches your GitHub account."

The default `agent@scrum4me.local` in repo-bootstrap.sh was a phony
local domain not tied to any GitHub account. Vercel's deploy-protection
checks the latest commit's author email and blocks unknown ones.

Fix: error out with a helpful message if GIT_AUTHOR_EMAIL is unset, and
document the GitHub noreply form (`<user-id>+<username>@users.noreply.github.com`)
in `.env.example` as the recommended choice.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-02 20:14:28 +02:00
aca661bb02
Merge pull request #1 from madhura68/feat/gh-token-clone-bootstrap
feat(bootstrap): GH_TOKEN clone-on-start for Scrum4Me + scrum4me-mcp
2026-05-02 19:50:24 +02:00
c090e6c349 feat(bootstrap): GH_TOKEN-based clone of Scrum4Me + scrum4me-mcp
Fixes the 'no GitHub credentials' deadlock observed in the first
NAS-Docker batch run (2 May 2026): scrum4me-mcp's `wait_for_job`
expects a local clone at `~/Projects/<repo-name>` (convention-fallback
in resolveRepoRoot) but the container had no credentials and no clone.
Agent asked the user how to proceed; turn closed without claim.

Changes:
- `.env.example`: GH_TOKEN (fine-grained PAT, repo+PR scope) and
  GH_PRECLONE_REPOS (comma-separated owner/name list, default covers
  Scrum4Me + scrum4me-mcp).
- `bin/repo-bootstrap.sh` (new): runs as agent-user; configures git
  credential-helper with HTTPS oauth2 token, then clones-or-fetches
  each entry in GH_PRECLONE_REPOS into ~/Projects/<name>. Idempotent.
- `bin/entrypoint.sh`: hooks repo-bootstrap before run-agent.sh.
- `Dockerfile`:
  - installs `gh` CLI (used for auto_pr `gh pr create`; reads GH_TOKEN
    from env directly).
  - pre-creates `~agent/Projects` and `~agent/.scrum4me-agent-worktrees`
    so directory-ownership is right from the first boot.
- `README.md`: 'Repo bootstrap (clone-on-start)' section + GH_TOKEN
  step in the deploy checklist; corrects the obsolete 'no push
  credentials' note (agent now pushes feature-branches, gh creates PRs).

Same token covers clone, push and PR-creation — one secret to rotate.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-02 19:48:57 +02:00
47b1de93db fix: lokale Docker build werkend krijgen
Drie fixes om de container lokaal (en op de NAS) te kunnen builden en draaien:

- Dockerfile: clone scrum4me-mcp zonder --recurse-submodules. De Prisma-
  schema zit al gecommit in het scrum4me-mcp repo; de vendor/scrum4me
  submodule is alleen nodig voor schema-updates en wijst naar een
  privaat repo dat tijdens docker build niet bereikbaar is.

- Dockerfile: voeg /usr/sbin en /sbin toe aan PATH zodat gosu (in
  /usr/sbin/gosu na apt-install) gevonden wordt door entrypoint.sh.
  Zonder dit faalt de container in een restart loop.

- Verplaats alle runner scripts naar bin/ en maak etc/ aan, zodat
  COPY bin/ en COPY etc/ in de Dockerfile bestanden vinden.

Verder:
- .gitattributes om CRLF-corruptie van shell scripts op Windows te
  voorkomen (core.autocrlf=true is default actief).
- .gitignore: docker-compose.override.yml uitsluiten zodat lokale
  dev-overrides niet worden gecommit.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-02 19:18:35 +02:00
9d8a7fe237 initial: NAS agent runner setup 2026-05-02 15:43:59 +02:00