Commit graph

25 commits

Author SHA1 Message Date
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