Fix three bugs from PR review in the new `fabro resume` command:
1. RunArgs.workflow lost its required constraint when --run-branch was
removed — add #[arg(required = true)] so clap enforces it.
2. run_resumed ignored --preserve-sandbox (hardcoded false),
--verbose (no ProgressUI), and --ssh (no listener). Wire
preserve_sandbox through resolve_preserve_sandbox, create a
ProgressUI registered on the emitter, and handle SSH access.
3. prepare_from_checkpoint unconditionally created a LocalSandbox,
ignoring --sandbox. Add the same sandbox resolution logic used by
prepare_from_branch (Local, Docker, Ssh, Exe, Daytona).
Remove --ssh from `fabro run` and `fabro resume` since `fabro ssh`
is the dedicated command now. Remove the flag from RunArgs, ResumeArgs,
RunSpec, and all docs/changelogs.
Simplify EventEmitter: change on_event to take &self (via
Mutex<Vec<Arc<...>>>) instead of &mut self, removing the need for
the late_listeners workaround. emit() snapshots the listener list
before dispatching to prevent deadlocks from reentrant emit calls.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Update 47 MDX doc pages, OpenAPI spec, SVG diagram, language
grammar, frontend demo data, marketing page, skills, and README
to use .fabro extension. Add "fabro" to fileTypes in language
grammars. Document stack.child_workflow alongside stack.child_dotfile.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Fill in the SSH Access human-tools page with how to enable SSH into
Daytona sandboxes, credential lifetime, and limitations. Fill in the
VS Code page explaining how to connect VS Code Remote-SSH to a
sandbox. Add the SshAccessReady event to the observability event
catalog.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>