fix: bug: TOML [agents.X] section name with dash crashes load-project.sh (#862)
TOML allows dashes in bare keys, so `[agents.dev-qwen2]` is a valid
section. Before this fix, load-project.sh derived bash var names via
Python `.upper()` alone, which kept the dash and produced
`AGENT_DEV-QWEN2_BASE_URL` — an invalid shell identifier. Under
`set -euo pipefail` the subsequent `export` aborted the whole file,
silently taking the factory down on the N+1 run after a dashed agent
was hired via `disinto hire-an-agent`.
Normalize via `.upper().replace('-', '_')` to match the
`tr 'a-z-' 'A-Z_'` convention already used by hire-agent.sh (#834)
and generators.sh (#852). Also harden hire-agent.sh to reject invalid
agent names at hire time (before any Forgejo side effects), so
unparseable TOML sections never land on disk.
- `lib/load-project.sh` — dash-to-underscore in emitted shell var names
- `lib/hire-agent.sh` — validate agent name against
`^[a-z]([a-z0-9]|-[a-z0-9])*$` up front
- `tests/lib-load-project.bats` — regression guard covering the parse
path and the hire-time reject path
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
c63ca86a3c
commit
721d7a6077
3 changed files with 221 additions and 6 deletions
|
|
@ -30,6 +30,29 @@ disinto_hire_an_agent() {
|
|||
echo "Usage: disinto hire-an-agent <agent-name> <role> [--formula <path>] [--local-model <url>] [--model <name>] [--poll-interval <seconds>]" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Validate agent name before any side effects (Forgejo user creation, TOML
|
||||
# write, token issuance). The name flows through several systems that have
|
||||
# stricter rules than the raw TOML spec:
|
||||
# - load-project.sh emits shell vars keyed by the name (dashes are mapped
|
||||
# to underscores via tr 'a-z-' 'A-Z_')
|
||||
# - generators.sh emits a docker-compose service name `agents-<name>` and
|
||||
# uppercases it for env var keys (#852 tracks the `^^` bug; we keep the
|
||||
# grammar tight here so that fix can happen without re-validation)
|
||||
# - Forgejo usernames are lowercase alnum + dash
|
||||
# Constraint: start with a lowercase letter, contain only [a-z0-9-], end
|
||||
# with a lowercase letter or digit (no trailing dash), no consecutive
|
||||
# dashes. Rejecting at hire-time prevents unparseable TOML sections like
|
||||
# [agents.dev-qwen2] from landing on disk and crashing load-project.sh on
|
||||
# the next `disinto up` (#862).
|
||||
if ! [[ "$agent_name" =~ ^[a-z]([a-z0-9]|-[a-z0-9])*$ ]]; then
|
||||
echo "Error: invalid agent name '${agent_name}'" >&2
|
||||
echo " Agent names must match: ^[a-z]([a-z0-9]|-[a-z0-9])*$" >&2
|
||||
echo " (lowercase letters/digits/single dashes, starts with letter, ends with alphanumeric)" >&2
|
||||
echo " Examples: dev, dev-qwen2, review-qwen, planner" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
shift 2
|
||||
|
||||
# Parse flags
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue