Skip to content

Commit 67949f7

Browse files
Rynaroclaude
andcommitted
fix(cli): canonical repo casing + stderr-only logging
Two fixes that together let `eidolons init --preset full` → sync succeed against the upstream Eidolon repos: 1. Roster + docs + examples now use canonical GitHub casing (Rynaro/ATLAS, Rynaro/IDG, Rynaro/FORGE, Rynaro/APIVR-Delta). GitHub HTTPS is case-insensitive so it wasn't strictly breaking clones, but it was inconsistent with the APIVR fix in 283b3b4. 2. `say`/`ok`/`info` log helpers now write to stderr (matching `warn`/`die`). Previously `fetch_eidolon` emitted "▸ Fetching…" on stdout, which was captured by `clone_dir=$(fetch_eidolon …)` in sync.sh — so `clone_dir` was a multiline string of log text plus the path, and every subsequent `[[ -f "$clone_dir/…" ]]` failed. The resolve_members stderr-redirect in init.sh becomes defense-in-depth once logging is stderr-only; kept for the extra whitespace-trim/empty-input guards. Test fixtures updated to match canonical casing. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent 7ffa36c commit 67949f7

9 files changed

Lines changed: 41 additions & 31 deletions

File tree

README.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,11 @@ This is the **nexus** — the canonical place where the team is defined, invento
2424

2525
| Eidolon | Role | Methodology | Repo | Status |
2626
|---------|------|-------------|------|--------|
27-
| **ATLAS** | Explorer / Scout | `A→T→L→A→S` | [Rynaro/atlas](https://github.com/Rynaro/atlas) | shipped |
27+
| **ATLAS** | Explorer / Scout | `A→T→L→A→S` | [Rynaro/ATLAS](https://github.com/Rynaro/ATLAS) | shipped |
2828
| **SPECTRA** | Planner | `S→P→E→C→T→R→A` | [Rynaro/SPECTRA](https://github.com/Rynaro/SPECTRA) | shipped |
29-
| **APIVR-Δ** | Coder | `A→P→I→V→Δ/R` | [Rynaro/apivr](https://github.com/Rynaro/apivr) | shipped |
30-
| **IDG** | Scriber / Chronicler | `I→D→G` | [Rynaro/idg](https://github.com/Rynaro/idg) | shipped |
31-
| **FORGE** | Reasoner | `TBD` | [Rynaro/forge](https://github.com/Rynaro/forge) | in construction |
29+
| **APIVR-Δ** | Coder | `A→P→I→V→Δ/R` | [Rynaro/APIVR-Delta](https://github.com/Rynaro/APIVR-Delta) | shipped |
30+
| **IDG** | Scriber / Chronicler | `I→D→G` | [Rynaro/IDG](https://github.com/Rynaro/IDG) | shipped |
31+
| **FORGE** | Reasoner | `TBD` | [Rynaro/FORGE](https://github.com/Rynaro/FORGE) | in construction |
3232

3333
See [`methodology/composition.md`](methodology/composition.md) for the canonical pipeline and handoff contracts.
3434

cli/src/init.sh

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -78,25 +78,32 @@ resolve_members() {
7878
if [[ "$NON_INTERACTIVE" == "true" ]]; then
7979
die "No members specified. Use --preset or --members when --non-interactive."
8080
fi
81-
# Interactive picker
82-
echo ""
83-
echo "${BOLD}Available presets:${RESET}"
84-
yaml_to_json "$ROSTER_FILE" | jq -r '.presets | to_entries[] | " \(.key) — \(.value.description)"'
85-
echo ""
86-
echo "${BOLD}Available Eidolons:${RESET}"
87-
yaml_to_json "$ROSTER_FILE" | jq -r '.eidolons[] | " \(.name) — \(.methodology.summary)"'
88-
echo ""
89-
read -rp "Enter preset name, or comma-separated members: " choice
81+
# Interactive picker — all listing output goes to stderr so it does not
82+
# pollute this function's stdout (captured by the caller).
83+
{
84+
echo ""
85+
echo "${BOLD}Available presets:${RESET}"
86+
yaml_to_json "$ROSTER_FILE" | jq -r '.presets | to_entries[] | " \(.key) — \(.value.description)"'
87+
echo ""
88+
echo "${BOLD}Available Eidolons:${RESET}"
89+
yaml_to_json "$ROSTER_FILE" | jq -r '.eidolons[] | " \(.name) — \(.methodology.summary)"'
90+
echo ""
91+
} >&2
92+
local choice=""
93+
read -rp "Enter preset name, or comma-separated members: " choice || true
94+
choice="$(echo "$choice" | xargs)"
95+
[[ -z "$choice" ]] && die "No selection made."
9096
if roster_presets | grep -Fxq "$choice"; then
9197
roster_preset_members "$choice" | paste -sd, -
9298
else
9399
echo "$choice"
94100
fi
95101
}
96102

97-
MEMBERS_CSV="$(resolve_members)"
103+
MEMBERS_CSV="$(resolve_members | tr -d '\n' | xargs)"
98104
[[ -z "$MEMBERS_CSV" ]] && die "No members resolved. Aborting."
99105
IFS=',' read -ra MEMBERS_ARR <<< "$MEMBERS_CSV"
106+
(( ${#MEMBERS_ARR[@]} > 0 )) || die "No members resolved. Aborting."
100107
say "Members: ${MEMBERS_ARR[*]}"
101108

102109
# Validate every member exists in the roster

cli/src/lib.sh

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,12 @@ else
2323
fi
2424

2525
# ─── Logging ───────────────────────────────────────────────────────────────
26-
say() { printf "%s▸%s %s\n" "$BOLD" "$RESET" "$*"; }
27-
ok() { printf "%s✓%s %s\n" "$GREEN" "$RESET" "$*"; }
28-
info() { printf "%s·%s %s\n" "$BLUE" "$RESET" "$*"; }
26+
# All log output goes to stderr so functions whose stdout is captured by
27+
# the caller (e.g. fetch_eidolon, roster_preset_members) can emit progress
28+
# without corrupting their return value.
29+
say() { printf "%s▸%s %s\n" "$BOLD" "$RESET" "$*" >&2; }
30+
ok() { printf "%s✓%s %s\n" "$GREEN" "$RESET" "$*" >&2; }
31+
info() { printf "%s·%s %s\n" "$BLUE" "$RESET" "$*" >&2; }
2932
warn() { printf "%s⚠%s %s\n" "$YELLOW" "$RESET" "$*" >&2; }
3033
die() { printf "%s✗%s %s\n" "$RED" "$RESET" "$*" >&2; exit 1; }
3134

cli/tests/helpers.bash

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ hosts:
4646
members:
4747
- name: atlas
4848
version: "^1.0.0"
49-
source: github:Rynaro/atlas
49+
source: github:Rynaro/ATLAS
5050
EOF
5151
}
5252

@@ -59,7 +59,7 @@ nexus_commit: "test"
5959
members:
6060
- name: atlas
6161
version: "1.0.0"
62-
resolved: "github:Rynaro/atlas@test"
62+
resolved: "github:Rynaro/ATLAS@test"
6363
target: "./agents/atlas"
6464
hosts_wired: ["claude-code"]
6565
EOF

docs/architecture.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@
2424
┌─────────────────────────────────────────────────────────────────────┐
2525
│ Layer 2 — EIDOLONS (5 × individual repos) │
2626
│ │
27-
│ Rynaro/atlas Rynaro/spectra Rynaro/apivr
28-
│ Rynaro/idg Rynaro/forge ... │
27+
│ Rynaro/ATLAS Rynaro/SPECTRA Rynaro/APIVR-Delta
28+
│ Rynaro/IDG Rynaro/FORGE ...
2929
│ │
3030
│ Each is: │
3131
│ - EIIS-conformant │

examples/brownfield-rails/README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,16 +68,16 @@ hosts:
6868
members:
6969
- name: atlas
7070
version: "^1.0.0"
71-
source: github:Rynaro/atlas
71+
source: github:Rynaro/ATLAS
7272
- name: spectra
7373
version: "^4.2.0"
7474
source: github:Rynaro/SPECTRA
7575
- name: apivr
7676
version: "^3.0.0"
77-
source: github:Rynaro/apivr
77+
source: github:Rynaro/APIVR-Delta
7878
- name: idg
7979
version: "^1.1.0"
80-
source: github:Rynaro/idg
80+
source: github:Rynaro/IDG
8181

8282
composition:
8383
pipeline: [atlas, spectra, apivr, idg]

examples/greenfield/README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,16 +58,16 @@ hosts:
5858
members:
5959
- name: atlas
6060
version: "^1.0.0"
61-
source: github:Rynaro/atlas
61+
source: github:Rynaro/ATLAS
6262
- name: spectra
6363
version: "^4.2.0"
6464
source: github:Rynaro/SPECTRA
6565
- name: apivr
6666
version: "^3.0.0"
67-
source: github:Rynaro/apivr
67+
source: github:Rynaro/APIVR-Delta
6868
- name: idg
6969
version: "^1.1.0"
70-
source: github:Rynaro/idg
70+
source: github:Rynaro/IDG
7171

7272
composition:
7373
pipeline: [atlas, spectra, apivr, idg]

examples/solo-atlas/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ hosts:
4646
members:
4747
- name: atlas
4848
version: "^1.0.0"
49-
source: github:Rynaro/atlas
49+
source: github:Rynaro/ATLAS
5050
```
5151
5252
## Use

roster/index.yaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ eidolons:
2525
summary: "Read-only codebase intelligence. Structural mapping, bounded probes, evidence-anchored findings."
2626
source:
2727
type: github
28-
repo: Rynaro/atlas
28+
repo: Rynaro/ATLAS
2929
default_ref: main
3030
versions:
3131
latest: "1.0.0"
@@ -134,7 +134,7 @@ eidolons:
134134
summary: "Documentation synthesis. Structured markers, CHT verification, provenance-first."
135135
source:
136136
type: github
137-
repo: Rynaro/idg
137+
repo: Rynaro/IDG
138138
default_ref: main
139139
versions:
140140
latest: "1.1.0"
@@ -171,7 +171,7 @@ eidolons:
171171
summary: "Deep reasoning for ambiguity, trade-offs, counterfactuals, novel problems."
172172
source:
173173
type: github
174-
repo: Rynaro/forge
174+
repo: Rynaro/FORGE
175175
default_ref: main
176176
versions:
177177
latest: "0.1.0-dev"

0 commit comments

Comments
 (0)