hermes-agent/hermes_cli
kshitijk4poor cd188b814e feat(cli): make `hermes portal` run the full quick-setup Nous flow (model picker)
`hermes portal` / `hermes setup --portal` previously logged in and set
provider=nous but left the model UNSELECTED (blank -> runtime default) and
never showed a picker — unlike the first-time quick setup, which runs the
model picker.

Route `_run_portal_one_shot` through `_model_flow_nous` — the exact same
routine quick setup (`_run_first_time_quick_setup`) and `hermes model` -> Nous
use. It handles both the logged-out path (device-code OAuth, which picks a
model internally) and the logged-in path (curated Nous model picker), then
offers the Tool Gateway opt-in and sets provider=nous. Net effect: `hermes
portal` now offers a model picker every time and is a true single-command
collapse of quick setup's Nous step.

Removes the hand-rolled auth_add_command + manual provider write + separate
Tool Gateway prompt (now a single source of truth). Re-syncs the in-memory
config from disk afterward so a caller's later save_config can't clobber the
model/provider written by the login flow.

Docs (CLI help, portal_cli docstrings, nous-portal EN + zh-Hans) updated to
mention model selection. New regression test asserts `_run_portal_one_shot`
delegates to `_model_flow_nous`.

Verified live: `hermes portal` now shows the 27-model curated picker, 'Skip
(keep current)' preserves prior provider/model.
2026-06-04 02:20:31 +05:30
..
dashboard_auth
…
proxy
…
__init__.py
…
_parser.py
…
_subprocess_compat.py
…
auth.py
…
auth_commands.py
…
azure_detect.py
…
backup.py
…
banner.py
…
browser_connect.py
…
build_info.py
…
bundles.py
…
callbacks.py
…
checkpoints.py
…
claw.py
…
cli_output.py
…
clipboard.py
…
codex_models.py
…
codex_runtime_plugin_migration.py
…
codex_runtime_switch.py
…
colors.py
…
commands.py
…
completion.py
…
config.py
…
container_boot.py
…
copilot_auth.py
…
cron.py
…
curator.py
…
curses_ui.py
…
debug.py
…
default_soul.py
…
dep_ensure.py
…
dingtalk_auth.py
…
doctor.py
…
dump.py
…
env_loader.py
…
fallback_cmd.py
…
fallback_config.py
…
gateway.py
…
gateway_windows.py fix(gateway): decode schtasks output with locale encoding on Windows 2026-06-03 09:29:19 -07:00
goals.py
…
hooks.py
…
inventory.py
…
kanban.py
…
kanban_db.py
…
kanban_decompose.py
…
kanban_diagnostics.py
…
kanban_specify.py
…
kanban_swarm.py
…
logs.py
…
main.py
…
managed_uv.py
…
mcp_catalog.py
…
mcp_config.py
…
mcp_picker.py
…
mcp_startup.py
…
memory_setup.py
…
migrate.py
…
model_catalog.py
…
model_normalize.py
…
model_switch.py
…
models.py
…
nous_account.py
…
nous_subscription.py
…
oneshot.py
…
pairing.py
…
partial_compress.py
…
platforms.py
…
plugins.py
…
plugins_cmd.py
…
portal_cli.py feat(cli): make `hermes portal` run the full quick-setup Nous flow (model picker) 2026-06-04 02:20:31 +05:30
profile_describer.py
…
profile_distribution.py
…
profiles.py
…
prompt_size.py
…
providers.py
…
psutil_android.py
…
pt_input_extras.py
…
pty_bridge.py
…
relaunch.py
…
runtime_provider.py
…
secret_prompt.py
…
secrets_cli.py
…
security_advisories.py
…
security_audit.py
…
send_cmd.py
…
service_manager.py
…
session_recap.py
…
setup.py feat(cli): make `hermes portal` run the full quick-setup Nous flow (model picker) 2026-06-04 02:20:31 +05:30
skills_config.py
…
skills_hub.py
…
skin_engine.py
…
slack_cli.py
…
status.py feat(cli): make `hermes portal` the human-readable Portal onboarding alias 2026-06-04 01:19:28 +05:30
stdio.py
…
timeouts.py
…
tips.py
…
tools_config.py
…
uninstall.py
…
voice.py
…
web_server.py fix(desktop): guard reconnect sockets and keep branch search precise 2026-06-03 13:13:21 -05:00
webhook.py
…
xai_retirement.py
…