mirror of
https://github.com/domfelipe/hermes-client-onboarding.git
synced 2026-08-07 06:16:47 +00:00
Auto-start onboarding: agent speaks first via TUI kickoff
Install hermes-client-onboarding launcher that runs hermes --tui -s skill -q kickoff so Phase 1 begins without waiting for user hello.
This commit is contained in:
parent
f86c06d521
commit
3b98cb7253
4 changed files with 94 additions and 20 deletions
16
README.md
16
README.md
|
|
@ -117,8 +117,9 @@ test -f ~/.hermes/skills/hermes-client-onboarding/SKILL.md && echo skill_ok
|
||||||
hermes --version
|
hermes --version
|
||||||
hermes doctor
|
hermes doctor
|
||||||
|
|
||||||
# 4. onboarding interativo
|
# 4. onboarding interativo (agente fala primeiro — Phase 1)
|
||||||
hermes chat -s hermes-client-onboarding
|
hermes-client-onboarding
|
||||||
|
# ou: hermes --tui -s hermes-client-onboarding -q "Inicie AGORA o onboarding…"
|
||||||
# completar fases 1–6 com chaves reais de teste
|
# completar fases 1–6 com chaves reais de teste
|
||||||
|
|
||||||
# 5. smoke telegram
|
# 5. smoke telegram
|
||||||
|
|
@ -146,6 +147,17 @@ hermes config set model.base_url "https://api.deepseek.com/v1"
|
||||||
|
|
||||||
Não imprime secrets.
|
Não imprime secrets.
|
||||||
|
|
||||||
|
## Launcher (agente fala primeiro)
|
||||||
|
|
||||||
|
O bootstrap instala `~/.local/bin/hermes-client-onboarding`, que abre o TUI com kickoff automático:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
hermes-client-onboarding
|
||||||
|
```
|
||||||
|
|
||||||
|
Isso usa `hermes --tui -s hermes-client-onboarding -q "…"` — o Hermes **envia a primeira mensagem sozinho** e continua interativo.
|
||||||
|
`hermes chat -s …` sem `-q` / sem launcher espera o usuário falar primeiro.
|
||||||
|
|
||||||
## Licença
|
## Licença
|
||||||
|
|
||||||
MIT (skill + bootstrap DomHubs). Hermes Agent em si: licença do projeto Nous Research.
|
MIT (skill + bootstrap DomHubs). Hermes Agent em si: licença do projeto Nous Research.
|
||||||
|
|
|
||||||
58
install.sh
58
install.sh
|
|
@ -7,7 +7,7 @@ set -euo pipefail
|
||||||
SKILL_NAME="hermes-client-onboarding"
|
SKILL_NAME="hermes-client-onboarding"
|
||||||
DEFAULT_BASE="${HERMES_ONBOARD_BASE:-https://setup.domhubs.com.br/hermes}"
|
DEFAULT_BASE="${HERMES_ONBOARD_BASE:-https://setup.domhubs.com.br/hermes}"
|
||||||
HERMES_INSTALL_URL="${HERMES_INSTALL_URL:-https://hermes-agent.nousresearch.com/install.sh}"
|
HERMES_INSTALL_URL="${HERMES_INSTALL_URL:-https://hermes-agent.nousresearch.com/install.sh}"
|
||||||
KICKOFF_MSG="${HERMES_ONBOARD_KICKOFF:-Inicie agora o onboarding de cliente Hermes. Siga a skill hermes-client-onboarding fase a fase (Phase 1 primeiro). Fale em português brasileiro.}"
|
KICKOFF_MSG="${HERMES_ONBOARD_KICKOFF:-Inicie AGORA o onboarding de cliente Hermes. Siga a skill hermes-client-onboarding: pre-flight em silêncio e abra a Phase 1 com a primeira pergunta. Você fala primeiro — não espere eu dizer oi. Português brasileiro.}"
|
||||||
|
|
||||||
CONDUCTOR="${HERMES_ONBOARD_CONDUCTOR:-}"
|
CONDUCTOR="${HERMES_ONBOARD_CONDUCTOR:-}"
|
||||||
NO_LAUNCH=0
|
NO_LAUNCH=0
|
||||||
|
|
@ -104,6 +104,9 @@ copy_tree() {
|
||||||
if [[ -f "$dest/scripts/apply-core-config.sh" ]]; then
|
if [[ -f "$dest/scripts/apply-core-config.sh" ]]; then
|
||||||
chmod +x "$dest/scripts/apply-core-config.sh"
|
chmod +x "$dest/scripts/apply-core-config.sh"
|
||||||
fi
|
fi
|
||||||
|
if [[ -f "$dest/scripts/start-onboarding.sh" ]]; then
|
||||||
|
chmod +x "$dest/scripts/start-onboarding.sh"
|
||||||
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
fetch_skill_to() {
|
fetch_skill_to() {
|
||||||
|
|
@ -115,7 +118,9 @@ fetch_skill_to() {
|
||||||
curl -fsSL "${base}/skill/${SKILL_NAME}/SKILL.md" -o "$dest/SKILL.md"
|
curl -fsSL "${base}/skill/${SKILL_NAME}/SKILL.md" -o "$dest/SKILL.md"
|
||||||
curl -fsSL "${base}/skill/${SKILL_NAME}/references/troubleshooting.md" -o "$dest/references/troubleshooting.md"
|
curl -fsSL "${base}/skill/${SKILL_NAME}/references/troubleshooting.md" -o "$dest/references/troubleshooting.md"
|
||||||
curl -fsSL "${base}/skill/${SKILL_NAME}/scripts/apply-core-config.sh" -o "$dest/scripts/apply-core-config.sh"
|
curl -fsSL "${base}/skill/${SKILL_NAME}/scripts/apply-core-config.sh" -o "$dest/scripts/apply-core-config.sh"
|
||||||
|
curl -fsSL "${base}/skill/${SKILL_NAME}/scripts/start-onboarding.sh" -o "$dest/scripts/start-onboarding.sh" || true
|
||||||
chmod +x "$dest/scripts/apply-core-config.sh"
|
chmod +x "$dest/scripts/apply-core-config.sh"
|
||||||
|
[[ -f "$dest/scripts/start-onboarding.sh" ]] && chmod +x "$dest/scripts/start-onboarding.sh"
|
||||||
[[ -s "$dest/SKILL.md" ]] || die "failed to download SKILL.md from $base"
|
[[ -s "$dest/SKILL.md" ]] || die "failed to download SKILL.md from $base"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -137,6 +142,14 @@ install_skill() {
|
||||||
copy_tree "$staging" "$hermes_dest"
|
copy_tree "$staging" "$hermes_dest"
|
||||||
log "Skill installed for Hermes → $hermes_dest"
|
log "Skill installed for Hermes → $hermes_dest"
|
||||||
|
|
||||||
|
# Launcher: auto-starts Phase 1 (agent speaks first)
|
||||||
|
mkdir -p "${HOME}/.local/bin"
|
||||||
|
if [[ -f "$staging/scripts/start-onboarding.sh" ]]; then
|
||||||
|
cp -f "$staging/scripts/start-onboarding.sh" "${HOME}/.local/bin/hermes-client-onboarding"
|
||||||
|
chmod +x "${HOME}/.local/bin/hermes-client-onboarding"
|
||||||
|
log "Launcher → ~/.local/bin/hermes-client-onboarding (agent fala primeiro)"
|
||||||
|
fi
|
||||||
|
|
||||||
# Codex / agents (optional)
|
# Codex / agents (optional)
|
||||||
if [[ -d "${HOME}/.codex" ]] || need_cmd codex; then
|
if [[ -d "${HOME}/.codex" ]] || need_cmd codex; then
|
||||||
mkdir -p "${HOME}/.codex/skills"
|
mkdir -p "${HOME}/.codex/skills"
|
||||||
|
|
@ -196,30 +209,38 @@ pick_conductor() {
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
launch_hermes_onboarding() {
|
||||||
|
# Auto-start: TUI + -q submits first turn; session stays interactive.
|
||||||
|
export HERMES_ONBOARD_KICKOFF="$KICKOFF_MSG"
|
||||||
|
if [[ -x "${HOME}/.local/bin/hermes-client-onboarding" ]]; then
|
||||||
|
if [[ -r /dev/tty ]]; then
|
||||||
|
exec "${HOME}/.local/bin/hermes-client-onboarding" </dev/tty
|
||||||
|
else
|
||||||
|
exec "${HOME}/.local/bin/hermes-client-onboarding"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
# Fallback without launcher binary
|
||||||
|
if [[ -r /dev/tty ]]; then
|
||||||
|
exec hermes --tui -s "$SKILL_NAME" -q "$KICKOFF_MSG" </dev/tty
|
||||||
|
else
|
||||||
|
exec hermes --tui -s "$SKILL_NAME" -q "$KICKOFF_MSG"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
launch_conductor() {
|
launch_conductor() {
|
||||||
local c="$1"
|
local c="$1"
|
||||||
case "$c" in
|
case "$c" in
|
||||||
skip)
|
skip)
|
||||||
log "Skill pronta. Rode depois:"
|
log "Skill pronta. Rode depois (agente fala primeiro):"
|
||||||
echo " hermes chat -s ${SKILL_NAME}"
|
echo " hermes-client-onboarding"
|
||||||
|
echo " # ou: hermes --tui -s ${SKILL_NAME} -q \"${KICKOFF_MSG}\""
|
||||||
need_cmd codex && echo " codex \"${KICKOFF_MSG}\""
|
need_cmd codex && echo " codex \"${KICKOFF_MSG}\""
|
||||||
return 0
|
return 0
|
||||||
;;
|
;;
|
||||||
hermes)
|
hermes)
|
||||||
need_cmd hermes || die "hermes missing"
|
need_cmd hermes || die "hermes missing"
|
||||||
log "Abrindo Hermes com skill ${SKILL_NAME}..."
|
log "Abrindo Hermes (auto-start Phase 1)..."
|
||||||
echo ""
|
launch_hermes_onboarding
|
||||||
echo "────────────────────────────────────────"
|
|
||||||
echo "Quando o chat abrir, envie (ou já use):"
|
|
||||||
echo " ${KICKOFF_MSG}"
|
|
||||||
echo "────────────────────────────────────────"
|
|
||||||
echo ""
|
|
||||||
# Reattach stdin to TTY after curl|bash so the chat is interactive
|
|
||||||
if [[ -r /dev/tty ]]; then
|
|
||||||
exec hermes chat -s "$SKILL_NAME" </dev/tty
|
|
||||||
else
|
|
||||||
exec hermes chat -s "$SKILL_NAME"
|
|
||||||
fi
|
|
||||||
;;
|
;;
|
||||||
codex)
|
codex)
|
||||||
need_cmd codex || die "codex not found — install Codex or use --conductor hermes"
|
need_cmd codex || die "codex not found — install Codex or use --conductor hermes"
|
||||||
|
|
@ -243,8 +264,9 @@ main() {
|
||||||
install_skill
|
install_skill
|
||||||
|
|
||||||
if [[ "$NO_LAUNCH" -eq 1 ]]; then
|
if [[ "$NO_LAUNCH" -eq 1 ]]; then
|
||||||
log "Done (--no-launch). Start with:"
|
log "Done (--no-launch). Start with (agent speaks first):"
|
||||||
echo " hermes chat -s ${SKILL_NAME}"
|
echo " hermes-client-onboarding"
|
||||||
|
echo " # ou: hermes --tui -s ${SKILL_NAME} -q \"…\""
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -66,6 +66,24 @@ After install, confirm with `hermes --version` and `hermes doctor`.
|
||||||
|
|
||||||
Conduct the onboarding as a structured dialogue. Move phase by phase. Never skip confirmation of secrets or user IDs.
|
Conduct the onboarding as a structured dialogue. Move phase by phase. Never skip confirmation of secrets or user IDs.
|
||||||
|
|
||||||
|
### Auto-start (when preloaded / first turn)
|
||||||
|
|
||||||
|
When this skill is preloaded (`-s hermes-client-onboarding`) or the first user message is a kickoff like “Inicie o onboarding…”, **you speak first**:
|
||||||
|
|
||||||
|
1. Run Pre-flight Checks quietly (minimal output).
|
||||||
|
2. Immediately open **Phase 1** with the first question(s) — do **not** wait for “oi”, “olá”, or an empty prompt.
|
||||||
|
3. Do not dump the whole checklist; one short pre-flight status line is enough, then the Phase 1 questions.
|
||||||
|
|
||||||
|
Preferred launch (agent auto-starts):
|
||||||
|
|
||||||
|
```bash
|
||||||
|
hermes-client-onboarding
|
||||||
|
# or:
|
||||||
|
hermes --tui -s hermes-client-onboarding -q "Inicie AGORA o onboarding…"
|
||||||
|
```
|
||||||
|
|
||||||
|
Plain `hermes chat -s hermes-client-onboarding` without a kickoff waits for user input — avoid that for demos.
|
||||||
|
|
||||||
### Phase 1 — Context & Goals
|
### Phase 1 — Context & Goals
|
||||||
|
|
||||||
Ask:
|
Ask:
|
||||||
|
|
|
||||||
22
skill/hermes-client-onboarding/scripts/start-onboarding.sh
Executable file
22
skill/hermes-client-onboarding/scripts/start-onboarding.sh
Executable file
|
|
@ -0,0 +1,22 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
# Launch Hermes with hermes-client-onboarding and auto-start Phase 1
|
||||||
|
# (agent speaks first — does not wait for the user to say "oi").
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
export PATH="${HOME}/.local/bin:/usr/local/bin:${PATH}"
|
||||||
|
|
||||||
|
SKILL_NAME="${HERMES_ONBOARD_SKILL:-hermes-client-onboarding}"
|
||||||
|
KICKOFF="${HERMES_ONBOARD_KICKOFF:-Inicie AGORA o onboarding de cliente Hermes. Siga a skill hermes-client-onboarding: execute o pre-flight em silêncio e abra a Phase 1 fazendo a primeira pergunta ao usuário. Você fala primeiro — não espere eu dizer oi ou começar.}"
|
||||||
|
|
||||||
|
if ! command -v hermes >/dev/null 2>&1; then
|
||||||
|
echo "error: hermes not on PATH" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# TUI: -q becomes HERMES_TUI_QUERY — first turn auto-submits, session stays interactive.
|
||||||
|
if [[ -t 0 && -t 1 ]]; then
|
||||||
|
exec hermes --tui -s "$SKILL_NAME" -q "$KICKOFF" "$@"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Non-TTY fallback (CI/scripts): one-shot only
|
||||||
|
exec hermes chat -s "$SKILL_NAME" -Q -q "$KICKOFF" "$@"
|
||||||
Loading…
Add table
Add a link
Reference in a new issue