Merge pull request #15 from madhura68/fix/runner-node-path

fix(runner): NODE_PATH + cache-bust ARG + soft quota-probe
This commit is contained in:
Janpeter Visser 2026-05-09 11:21:46 +02:00 committed by GitHub
commit 095a277646
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 20 additions and 10 deletions

View file

@ -55,8 +55,13 @@ RUN curl -fsSL https://claude.ai/install.sh | bash -s ${CLAUDE_CODE_VERSION} \
# niet om te builden. Pin via build-arg; default = main.
ARG MCP_GIT_REPO=https://github.com/madhura68/scrum4me-mcp.git
ARG MCP_GIT_REF=main
# Cache-bust voor de clone-laag: hetzelfde MCP_GIT_REF kan tussen rebuilds
# een ander commit aanwijzen (bv. main na een merge). Geef als build-arg
# `--build-arg MCP_CACHE_BUST=$(date +%s)` mee om deze laag te invalidaten.
ARG MCP_CACHE_BUST=1
RUN git clone --branch ${MCP_GIT_REF} --depth 1 \
RUN echo "cache-bust=${MCP_CACHE_BUST}" \
&& git clone --branch ${MCP_GIT_REF} --depth 1 \
${MCP_GIT_REPO} /opt/scrum4me-mcp \
&& cd /opt/scrum4me-mcp \
&& npm ci --omit=dev --omit=optional || npm install --omit=dev \
@ -112,7 +117,8 @@ ENV PATH=/opt/agent/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:
AGENT_REPO_CACHE=/var/cache/repos \
AGENT_JOB_ROOT=/tmp \
AGENT_HEALTH_PORT=8080 \
SCRUM4ME_MCP_DIR=/opt/scrum4me-mcp
SCRUM4ME_MCP_DIR=/opt/scrum4me-mcp \
NODE_PATH=/opt/scrum4me-mcp/node_modules
EXPOSE 8080

View file

@ -60,24 +60,28 @@ const TOKEN_EXPIRY_PATTERNS: RegExp[] = [
]
// ----- quota probe ----------------------------------------------------
// Soft-fail: als de probe geen rate-limit-headers krijgt (sommige Anthropic
// endpoints retourneren ze niet) of een transient netwerkfout heeft, log
// een warning en ga door. Alleen bij gemeten quota-overschrijding sleepen.
// Dit spiegelt het gedrag van CLAUDE.md stap 0.4 ("anders: ga door").
async function quotaProbe(userId: string): Promise<void> {
const probe = spawnSync(QUOTA_PROBE_PATH, [], { encoding: 'utf8' })
if (probe.status !== 0) {
logError(
`quota probe failed: status=${probe.status} stderr=${(probe.stderr ?? '').trim()}`,
log(
`quota probe non-zero status=${probe.status} stdout=${probe.stdout.slice(0, 200).trim()} — continuing without gate`,
)
throw new Error('quota probe failed')
return
}
let parsed: { pct?: number; limit?: number; remaining?: number; reset_at_iso?: string }
let parsed: { pct?: number; limit?: number; remaining?: number; reset_at_iso?: string; error?: string }
try {
parsed = JSON.parse(probe.stdout)
} catch {
logError(`quota probe stdout not JSON: ${probe.stdout.slice(0, 200)}`)
throw new Error('quota probe stdout invalid')
log(`quota probe stdout not JSON (continuing): ${probe.stdout.slice(0, 200)}`)
return
}
if (parsed.pct === undefined) {
logError(`quota probe missing pct field: ${probe.stdout.slice(0, 200)}`)
throw new Error('quota probe missing pct')
log(`quota probe no pct (continuing): error=${parsed.error ?? '-'}`)
return
}
const user = await prisma.user.findUnique({