Commit graph

1003 commits

Author SHA1 Message Date
Bryan Helmkamp
1ab1327f96
fix(ci): stabilize graphviz Rust checks
Some checks are pending
Rust / Format (push) Waiting to run
Rust / Clippy (push) Waiting to run
Rust / Test (Linux) (push) Waiting to run
Rust / Test (macOS) (push) Waiting to run
TypeScript / Typecheck (push) Waiting to run
TypeScript / Test (push) Waiting to run
TypeScript / Build (push) Waiting to run
Keep the render-graph CLI integration test explicitly documented for
synchronous stdio subprocess usage, and make the garbage-stdout server
test drain stdin before returning invalid output so the Linux test path
stays deterministic.
2026-04-14 19:31:01 -04:00
Bryan Helmkamp
3e9683b6a0 refactor(graphviz): extract graphviz-sys into fabro-sh/graphviz-sys
Move the vendored Graphviz FFI crate to its own repo so it can be
reused independently and reduce this repo's footprint (~250 C/H files).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-14 19:03:01 -04:00
Bryan Helmkamp
8c361afc51 Merge remote-tracking branch 'origin/main' 2026-04-14 18:38:49 -04:00
Bryan Helmkamp
27583aa13e fix(graphviz): satisfy clippy for subprocess renderer 2026-04-14 18:23:15 -04:00
Bryan Helmkamp
286eee7efa fix(graphviz): isolate rendering in a subprocess
Run Graphviz through an internal fabro subprocess so renderer failures no
longer share process fate with the server. Keep expected DOT parse failures
on the 400 path via an explicit stdout protocol, and treat child crashes or
protocol violations as 500s.
2026-04-14 18:15:23 -04:00
Bryan Helmkamp
fa73407b35 feat(cli): add fabro version command
Add a server-targeted `fabro version` command for checking client and
server build identity without reading local storage directly.

This also removes version data from `/health`, moves doctor parity checks
to diagnostics, and updates the API spec, docs, generated client, and
coverage for the new contract.
2026-04-14 16:30:53 -04:00
Bryan Helmkamp
d6ed6b3cda fix(ci): fix vendored Graphviz build on Linux
Three issues prevented the vendored Graphviz C source from working on
Linux:

1. Missing _GNU_SOURCE: with -std=c11, strdup is not declared on
   glibc. The compiler assumes it returns int, truncating the 64-bit
   return value on aarch64 and causing a SIGSEGV in gvplugin_install.

2. Circular static library dependency: common/emit.c references
   gvevent symbols from gvc, but gvc depends on common. The Linux
   single-pass linker cannot resolve this cycle. Fixed by merging all
   archives into one combined archive using GNU ar's MRI script mode.

3. HAVE_MEMRCHR: with _GNU_SOURCE, glibc declares memrchr, which
   conflicts with Graphviz's own static definition. Fixed by defining
   HAVE_MEMRCHR on Linux to use the glibc declaration instead.

Also fixes: clippy borrow_as_ptr warning, disallowed_methods in
build.rs, and resolves a pre-existing merge conflict in serve.rs.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-14 15:56:07 -04:00
Bryan Helmkamp
bf5da76678 Merge remote-tracking branch 'origin/main' 2026-04-14 15:45:01 -04:00
Bryan Helmkamp
ce26f66846 feat(release): support prerelease builds
Add prerelease-aware release automation and keep default install and upgrade
paths pinned to the latest stable tag unless an explicit prerelease version is
requested.
2026-04-14 15:43:00 -04:00
Bryan Helmkamp
09dc823e15 Fix clippy absolute_paths warnings in install command
Import fabro_util::path and use path::contract_tilde instead of
fully-qualified fabro_util::path::contract_tilde calls.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-14 15:37:06 -04:00
Bryan Helmkamp
be748a880d Show fabro secret set command in doctor remediation output
Doctor warnings for Sandbox and Brave Search now display the exact
command needed to configure the secret. Backtick-delimited text in
remediation strings renders in bold cyan, matching the conventional
CLI command styling used elsewhere.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-14 15:22:25 -04:00
Bryan Helmkamp
e366e4e761 Remove "Generating secrets and auth material..." status line
Secret generation is fast enough that the progress message is unnecessary.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-14 15:16:49 -04:00
Bryan Helmkamp
2ba84be748 Improve install command output ordering and path display
Reorder output so file-write confirmations appear immediately after
secret generation, move "To start Fabro" call-to-action to the end,
collapse duplicate blank line, shorten home-dir paths with ~, and
style the `fabro server start` command with bold cyan.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-14 15:16:21 -04:00
Bryan Helmkamp
4f521b96a6 Run doctor in non-verbose mode after install
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-14 15:15:00 -04:00
Bryan Helmkamp
635b11b39a Use ~ for home directory paths in doctor output
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-14 15:11:58 -04:00
Bryan Helmkamp
bda0d2e1f2 Improve doctor check labels for Sandbox and Brave Search
Sandbox shows "recommended, not configured" and Brave Search is
renamed to "Web Search (Brave)" with "optional, not configured".

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-14 15:10:41 -04:00
Bryan Helmkamp
26f5c8f4a0 Format install command imports 2026-04-14 13:12:56 -04:00
Bryan Helmkamp
74dfb9f652 Restructure local object store layout 2026-04-14 13:08:07 -04:00
Bryan Helmkamp
2047e490d8 Merge remote-tracking branch 'origin/main' 2026-04-14 12:30:40 -04:00
Bryan Helmkamp
05c7fedd31 refactor(server): remove implicit dry-run fallback
Remove the server startup path that inferred dry-run from provider
availability and let run.execution.mode inherit normally from
settings.

Model tests now return skip for unconfigured providers at request
time, completions use the real error path, and the CLI/docs/tests are
updated for the removed server --dry-run flag.
2026-04-14 12:28:55 -04:00
Bryan Helmkamp
99ce9a66c4 refactor(cli): route global args through settings layer
Resolve CLI settings once from user config plus process-local overrides
and pass the resolved view through command dispatch and CommandContext.

This keeps config-driven cli.output, cli.updates, and cli.logging
behavior working while preserving commands that only reject explicit
--json overrides. It also removes the implicit auto-approve coupling
from JSON run output.
2026-04-14 12:27:59 -04:00
Bryan Helmkamp
e2897fc910 refactor(store): rename SlateDB prefix from "db" to "slatedb"
Makes the on-disk storage subdirectory self-descriptive.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-14 11:54:25 -04:00
Bryan Helmkamp
c7461c31dc fix(doctor): omit absent legacy env check 2026-04-14 11:54:25 -04:00
Bryan Helmkamp
e199dea33a test(cli): refresh list output expectations
Update stale fabro-cli secret and workflow list tests to match the
intentional cli_table-rendered output introduced by the list-output
standardization refactor.
2026-04-14 11:30:34 -04:00
Bryan Helmkamp
b486d3125e Merge remote-tracking branch 'origin/main' 2026-04-14 08:12:06 -04:00
Bryan Helmkamp
5a7a42ede5 refactor(cli): standardize list command output with cli_table
Migrate secret list, artifact list, pr list, workflow list, and run
output artifacts from manual format-string tables to cli_table with
bold headers, no borders/separators, and color support — matching the
convention used by model list, runs list, and system df. Also improve
secret list timestamps to show relative ages (e.g. "8h ago").

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-14 08:11:22 -04:00
Bryan Helmkamp
5acfa46ddd fix(lint): use if-let instead of single-arm match in server start
Fixes clippy::single_match_else warning that was blocking CI.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-14 07:54:21 -04:00
Bryan Helmkamp
3389f1d551 chore: remove dead system dependency check infrastructure
Now that Graphviz is vendored, remove the DepSpec/probe_system_deps/
check_system_deps infrastructure from doctor.rs (empty since the
vendoring), the no-op pre-flight check from install.rs, and the
stale hardcoded "dot" check from demo diagnostics.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-14 07:30:32 -04:00
Bryan Helmkamp
829f2ae1d2 Merge remote-tracking branch 'origin/main' 2026-04-13 23:54:13 -04:00
Bryan Helmkamp
d22be78575 fix(server): honor server.listen when bind is omitted 2026-04-13 23:54:08 -04:00
Bryan Helmkamp
b3ae342a55 Merge branch 'vendor-graphviz-sys' 2026-04-13 23:42:45 -04:00
Bryan Helmkamp
ee5cd96f52 fix(tests): disable proxy discovery in install test 2026-04-13 23:34:59 -04:00
Bryan Helmkamp
15cf4d8640 refactor: wire vendored Graphviz into fabro-graphviz, remove dot dependency
Replace the Command::new("dot") shell-out in render_dot() with a direct
FFI call to the vendored Graphviz library. Drop PNG support (SVG only).
Remove GraphFormat enum, dot_is_available() helpers, dot-related
diagnostics/doctor checks, and the graphviz install prompt. Update
OpenAPI spec to remove png format and 502 responses. Update CLI help
text, snapshot tests, and documentation.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 22:46:29 -04:00
Bryan Helmkamp
ad775f2cb0 chore: refresh fabro spa assets
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 22:36:03 -04:00
Bryan Helmkamp
3674b112cb chore: regenerate TypeScript API client from OpenAPI spec
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 22:32:35 -04:00
Bryan Helmkamp
4cff947b87 fix(test): update snapshot placeholder [HOME] -> [HOME_DIR]
The test framework now replaces home directory paths with [HOME_DIR],
but this snapshot still used the old [HOME] placeholder.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 22:30:38 -04:00
Bryan Helmkamp
54a11e1426 fix(lint): resolve clippy warnings for Rust 1.94 on CI
- Use short imports instead of absolute paths in test assertions
  (fabro-config merge.rs, resolve/mod.rs)
- Remove needless raw string hashes where string body has no quotes
  (fabro-config, fabro-workflow, fabro-server)
- Use struct initializer instead of field reassignment on Default
  (fabro-types resolved.rs)
- Allow disallowed_methods for Command::new in test that exercises
  a real login command (fabro-auth resolve.rs)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 22:26:36 -04:00
Bryan Helmkamp
e5b7bb1909 fix(tests): disable macOS proxy discovery via FABRO_HTTP_PROXY_POLICY
The fabro-http crate's proxy policy mechanism was not being used in
tests. http_api.rs used #[cfg(test)] to call .no_proxy(), but cfg(test)
only applies within the crate being tested — downstream crates like
fabro-workflow and fabro-cli hit the production path with system proxy
discovery, adding ~900ms per reqwest client per process.

- Set FABRO_HTTP_PROXY_POLICY=disabled in .cargo/config.toml so all
  test HTTP clients skip proxy discovery automatically
- Remove dead #[cfg(test)] branch in http_api.rs; it now relies on the
  env var like every other fabro-http consumer
- Remove kind(test) from nextest overrides so timeout budgets apply to
  unit tests too, not just integration tests
- Remove unused SessionCookie import in web_auth.rs

Eliminates all 11 flaky nextest timeouts under parallel load.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 22:14:51 -04:00
Bryan Helmkamp
01b1fd13bd Merge origin/main into local main
Resolve conflicts in install.rs: apply gh_cli→token rename from local
to new non-interactive App support and pending_github_settings pattern
from origin/main.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 21:38:54 -04:00
Bryan Helmkamp
6db2408f2c fix(tests): isolate test secret store paths to prevent shared /tmp/server.env
test_secret_store_path() placed secrets directly in /tmp/, meaning all
tests shared /tmp/server.env. Under parallel nextest, tests that needed
SESSION_SECRET would race on this file, and tests that didn't provide one
(auth_login_github_redirects_to_github) would accidentally inherit it
from another test.

Fix: each test now gets its own temp directory via a ULID-keyed subdirectory.
Also fix the github redirect test to explicitly provide its session key.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 21:26:02 -04:00
Bryan Helmkamp
67819457ad fix(install): harden GitHub app bootstrap
Replace the install-time OpenSSL Ed25519 shell-out with Rust-native key
material generation, drop the stale OpenSSL doctor requirement, and make
GitHub App setup persist valid auth settings and secrets together.

This also fixes the live non-interactive app install path by enabling
GitHub auth, populating allowed usernames, and avoiding half-written
settings when later persistence fails.
2026-04-13 21:20:10 -04:00
Bryan Helmkamp
f91923892c refactor(github): rename gh_cli strategy to token, GITHUB_CLI_TOKEN to GITHUB_TOKEN
The gh_cli strategy was named after its bootstrap mechanism, not what it
actually is at runtime: a stored token. This rename makes the abstraction
honest and decouples runtime behavior from the gh CLI.

- Rename GithubIntegrationStrategy::GhCli to Token (serialized as "token")
- Rename vault/env secret from GITHUB_CLI_TOKEN to GITHUB_TOKEN
- Accept GH_TOKEN as a fallback in both CLI and server
- CLI no longer shells out to `gh auth token` at runtime; reads from
  vault/env like the server already did
- fabro install still bootstraps from `gh auth token` as a one-time op

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 20:46:11 -04:00
Bryan Helmkamp
72c7147d73 chore(lint): fix fabro-cli clippy warnings 2026-04-13 19:45:26 -04:00
Bryan Helmkamp
f04e59f83f feat(install): support non-interactive github app setup 2026-04-13 19:42:03 -04:00
Bryan Helmkamp
f4bae6e9bc refactor(setup): remove browser-based GitHub app bootstrap
Make fabro install the only supported GitHub App setup path. This removes
HTTP endpoints and browser routes that mutated local server config, rewrites
/setup as an operator instructions page, and aligns the installer manifest
with the live GitHub OAuth callback and setup URLs.
2026-04-13 18:25:29 -04:00
Bryan Helmkamp
3692f0a6fa fix: use module imports instead of absolute paths for session_secret
Clippy's absolute_paths lint requires importing the module rather than
using fully-qualified paths in production code.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 15:55:49 -04:00
Bryan Helmkamp
a7e9dbe8b9 Merge origin/main into local main
Conflicts resolved:
- install.rs: kept simplified auth (port 32276, no TLS, no username
  in merge_server_settings), adapted to origin's input_source API by
  removing username from ServerConfigSelection::Write
- serve.rs: kept ProviderCredentials import from origin, dropped
  ClientAuth (removed with mTLS)
- server.rs: kept both imports (ServerAuthMethod + Provider)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 12:28:08 -04:00
Bryan Helmkamp
c7a9f1e30b refactor(auth): deduplicate session secret, remove dead code, tighten test helpers
- Extract generate_session_secret and validate_session_secret to
  fabro_util::session_secret, removing duplicate implementations in
  install.rs (with private hex module) and start.rs
- Remove dead run_auth_method_for_config/run_auth_method_for_method
  from jwt_auth.rs (zero callers)
- Replace test read_dev_token helper with dev_token::read_dev_token_file
  which validates the fabro_dev_ prefix rather than just non-empty
- Extract build_unix_socket_probe_client to deduplicate probe client
  construction in try_connect/connect_unix_socket_api_client_bundle

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 12:18:01 -04:00
Bryan Helmkamp
47de0914f3 fix(auth): harden setup registration and oauth state
Require dev-token operator auth for setup registration and move the
GitHub OAuth state cookie onto the protected SESSION_SECRET-backed
cookie path.
2026-04-13 12:07:02 -04:00
Bryan Helmkamp
015fe94c29 Merge remote-tracking branch 'origin/main' 2026-04-13 11:36:29 -04:00