Commit graph

2921 commits

Author SHA1 Message Date
Bryan Helmkamp
6a41b2b67e
docs(server): document log destination configuration
Add the new destination key to [server.logging], list FABRO_LOG_DESTINATION
in the env vars table, and note that containers stream to stdout. Update
docs-internal/logging-strategy.md to describe the destination setting.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-26 16:09:05 -04:00
Bryan Helmkamp
126819a6c6
refactor(cli): collapse ServerLogDestination into LogDestination
The CLI-side ServerLogDestination enum duplicated the domain
LogDestination from fabro-types and only existed to bundle a PathBuf.
Replace InternalLogSink::Server { destination: ServerLogDestination }
with { log_path: Option<PathBuf> }, drop the server_log_destination
adapter, and let prepare_foreground_server_log derive the log path
from runtime_directory internally.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-26 16:06:38 -04:00
Bryan Helmkamp
d07596ca80
feat(server): support stdout log destination
Add configurable server log destinations with an environment override so containers can stream foreground server logs to stdout while local installs keep file logging by default. Validate configured log filters at load time and reject stdout logging for daemon mode.
2026-04-26 14:52:15 -04:00
Bryan Helmkamp
9f61c942cb
fix(server): redirect web requests to canonical host
Keep browser-facing web and auth flows on server.web.url so OAuth state cookies and redirect_uri use the same authority, while preserving API, webhook, health, and CLI token routes without cross-host redirects.
2026-04-26 12:27:27 -04:00
fabro-releases[bot]
98dd4595ed Bump version to 0.215.0-nightly.0 2026-04-26 09:33:44 +00:00
Bryan Helmkamp
bbe4d3c68c
refactor(dev): align cargo dev command modules
Some checks are pending
Rust / Format (push) Waiting to run
Rust / Clippy (push) Waiting to run
Rust / Generated Docs (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
2026-04-25 19:50:31 -04:00
Bryan Helmkamp
d37f75a878
feat(dev): group cargo dev spa and docs commands 2026-04-25 19:40:59 -04:00
Bryan Helmkamp
05e5623b2b
chore(dev): default docker-build tag to fabro-sh/fabro
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-25 19:40:59 -04:00
fabro-releases[bot]
9951f6dcfd Bump version to 0.214.0-nightly.2 2026-04-25 23:25:21 +00:00
Bryan Helmkamp
14aaf4f1d7
Merge remote-tracking branch 'origin/main' 2026-04-25 19:14:29 -04:00
Bryan Helmkamp
c890a70885
docs: capture cargo dev cleanup requirements 2026-04-25 19:14:16 -04:00
Bryan Helmkamp
b9b7efc46b
Merge remote-tracking branch 'origin/main' 2026-04-25 19:11:44 -04:00
Bryan Helmkamp
97f533c643
refactor(install): drop trivial wrappers and dead branches
Inline the one-line `validate_canonical_url` wrapper at its single
caller, collapse `check_config`'s repeated `is_empty()` branches into
one if/else, and remove an unreachable default in
`wildcard_public_url_details` (the function returns early when
`bad_urls` is empty, so `bad_urls[0]` always exists).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-25 19:11:35 -04:00
Bryan Helmkamp
c28b040c6f
fix(install): reject wildcard public URLs
Normalize bind-address wildcards before presenting install URLs, reject wildcard public origins at CLI and server install boundaries, and surface recovery guidance in the installer and doctor output.
2026-04-25 18:58:00 -04:00
Bryan Helmkamp
491072461f
Merge remote-tracking branch 'origin/main' 2026-04-25 18:57:34 -04:00
Bryan Helmkamp
e54597ec91
docs: sync admin and checkpoint pages with recent changes
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-25 18:57:32 -04:00
Bryan Helmkamp
d2cc37c615
docs(changelog): refresh recent product changes 2026-04-25 13:17:03 -04:00
Bryan Helmkamp
a1089b49fb
chore: remove old plan 2026-04-25 12:38:56 -04:00
Bryan Helmkamp
bebf472ad2
chore: move testing-strategy doc into docs-internal
The strategy doc lived alone under files-internal/ while every sibling
strategy doc (logging, events, server-secrets) lived under docs-internal/.
Move it next to the others and update plan/spec references.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-25 12:38:41 -04:00
Bryan Helmkamp
a4c04a296e
chore: move docker-context/ staging dir under tmp/
Keeps the repo root tidy. The staged Linux musl binaries used by
the Dockerfile and the release pipeline now live at
tmp/docker-context/<arch>/fabro instead of docker-context/<arch>/fabro.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-25 12:37:45 -04:00
Bryan Helmkamp
cf83ce683b
chore: remove legacy FABRO_JWT_* key generation script
SESSION_SECRET is the sole auth root; the JWT keypair env vars are no
longer part of the runtime auth model.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-25 12:33:03 -04:00
Bryan Helmkamp
cb0c39ee91
fix(server): style web OAuth state-failure error page
Render the OAuth callback state-validation error through the same
dark-themed browser shell used by the CLI auth flow instead of the bare
"<p>{body}</p>" fallback. Extract the shell into a shared
auth/browser_shell module so both flows reuse one definition.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-25 12:23:59 -04:00
Bryan Helmkamp
858f40d134
fix(test): extend CLI helper timeout in CI 2026-04-25 11:52:27 -04:00
Bryan Helmkamp
3d92a1a46b
Merge pull request #172 from fabro-sh/dependabot-fix/rustls-webpki-0.103.13
chore(deps): bump rustls-webpki to 0.103.13 (GHSA-82j2-j2ch-gfr8)
2026-04-25 10:24:14 -04:00
fabro-releases[bot]
859d7a3aa7 Bump version to 0.214.0-nightly.1 2026-04-25 14:07:53 +00:00
Bryan Helmkamp
fa7a496dcf
chore(deps): bump rustls-webpki to 0.103.13
Patches GHSA-82j2-j2ch-gfr8: a malformed CRL BIT STRING can panic
bit_string_flags() in rustls-webpki via BorrowedCertRevocationList::from_der().
Reachable when applications opt into CRL checking and load CRL bytes from an
attacker-influenced source.

Resolves Dependabot alert #25.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-25 10:01:40 -04:00
Bryan Helmkamp
d1b0548197
fix(web): unbox file tree sidebar
Drop the border, rounding, and background from the FileTree wrapper
(and its empty state) so the tree sits directly on the sidebar
container.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-25 09:43:12 -04:00
Bryan Helmkamp
40fa088410
refactor(web): redesign settings page as titled panels
Replace the raw JSON dump with three panels (Server, Access & Capacity,
Integrations & Artifacts), each rendering a small set of curated rows.
Each row uses an aligned two-column layout — title and help on the
left, a typed value renderer on the right (toggle dot, mono path,
URL link, badge, tabular-nums count, listen/object-store summaries).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-25 09:37:55 -04:00
Bryan Helmkamp
be63bda5c8
fix(web): stabilize run files sidebar interactions
Reserve the desktop file-tree column while files and the lazy sidebar load, and make the custom changed-files filter drive the rendered tree directly.
2026-04-25 09:34:40 -04:00
Bryan Helmkamp
0f5280d857
fix(web): tighten run files tree navigation
Keep the changed-files tree selection aligned to valid file paths, avoid mobile and initial-reset overhead, and lazy-load the tree bundle. Refresh the embedded SPA assets to match.
2026-04-25 09:07:12 -04:00
Bryan Helmkamp
5e61518769
chore: temporarily update hello workflow 2026-04-25 08:55:47 -04:00
Bryan Helmkamp
6f358b92a3
chore: temporarily disabsle rustfmt 2026-04-25 08:46:49 -04:00
Bryan Helmkamp
9b81aba086
feat(web): add Trees-based file tree sidebar to Files Changed tab
Adds a GitHub-style left sidebar to /runs/:id/files using @pierre/trees.
Lists only the modified files, shows git status per row, and wires
selection into the existing #file=<path> deep-link flow so clicking a
row scrolls and focuses the matching diff. Uses the @pierre/theme
pierre-dark Shiki theme for visual parity with @pierre/diffs.

Configured read-only (no drag-and-drop, no rename), flattens empty
directory chains, defaults to standard icons and default density, and
filters via hide-non-matches search. Hidden below the md breakpoint to
match where the diff style is forced to unified.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-25 08:32:11 -04:00
Bryan Helmkamp
e9388f02c0
Merge remote-tracking branch 'origin/main'
# Conflicts:
#	apps/fabro-web/app/routes/run-files.test.ts
#	apps/fabro-web/app/routes/run-files.tsx
#	lib/crates/fabro-spa/assets/assets/entry-5nzjj9ar.js
#	lib/crates/fabro-spa/assets/index.html
2026-04-25 07:51:59 -04:00
Bryan Helmkamp
ac1e218162
feat(web): append short SHA to run files freshness label
`useFreshness` now appends the GitHub-style 7-char prefix of `meta.to_sha`
to the captured/fetched timestamp, e.g. `Captured 2m ago · a1b2c3d`.
The OpenAPI pattern guarantees at least 7 hex chars when present;
degraded responses with no captured commit gracefully omit the SHA.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-25 07:46:40 -04:00
Bryan Helmkamp
15b85971d9
test(server): cover patch_to_stats edge cases
Adds four tests for the degraded-fallback line-stats path:

- aggregates_across_multiple_files: sums +/- across multiple file
  sections.
- ignores_hunk_headers_and_no_newline_marker: pins that `@@` and
  `\ No newline at end of file` lines never count.
- zero_for_empty_patch: boundary on empty input.
- after_strip_denylisted_ignores_sensitive_section: integration with
  `strip_denylisted_sections` — the `# sensitive file omitted: <path>`
  placeholder it leaves behind contributes 0 to the totals.

The existing tests already covered basic counting, header exclusion,
and symlink/submodule mode-line skipping.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-25 07:44:13 -04:00
Bryan Helmkamp
b0dfda617b
Merge remote-tracking branch 'origin/main' 2026-04-25 07:37:35 -04:00
Bryan Helmkamp
d4104be841
refactor(web): simplify SWR event plumbing
Share SSE subscription management, reuse query key builders, and remove duplicate route mapping/error helpers from the SWR refactor.
2026-04-25 07:37:17 -04:00
Bryan Helmkamp
a3906b0a84
Merge remote-tracking branch 'origin/main' 2026-04-25 07:36:43 -04:00
Bryan Helmkamp
ffbffa96aa
fix(run-files): align diff stats with visible files
Track numstat by path so sensitive, binary, symlink, and submodule entries do not inflate aggregate line counts, and clean generated client whitespace churn from the API update.
2026-04-25 07:36:33 -04:00
Bryan Helmkamp
a1f032e166
refactor(web): move server state to SWR
Replace React Router loader/action state paths with SWR query and mutation hooks.

Add targeted run and board EventSource managers that invalidate SWR keys, and refresh embedded SPA assets.
2026-04-25 07:16:41 -04:00
fabro-releases[bot]
7ea8698dbf Bump version to 0.214.0-nightly.0 2026-04-25 09:30:44 +00:00
Bryan Helmkamp
a4e63ec897
feat(api): expose aggregate +/- diff stats on run files response
Adds `meta.stats: DiffStats` (required) to `PaginatedRunFileList` so the
Files Changed toolbar can render `+387 −104` next to the file count.

Server: refactors `list_binary_paths` into `list_diff_numstat`, which
returns the binary-path set plus aggregate `+/-` totals from a single
`git diff --numstat` invocation. The degraded patch-only response
populates the same field by counting `+`/`-` line prefixes in the
filtered patch (excluding `+++`/`---` file headers).

UI: `Toolbar` accepts `additions` / `deletions` and renders them as
mono-tabular `+387 −104` to the right of the file count. The block is
elided when the diff has 0 changes (e.g. binary-only or empty runs) so
the empty case stays clean.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-24 23:38:02 -04:00
Bryan Helmkamp
664b15ae86
feat(web): redesign run files toolbar as PR-style header
Replaces the panel-style toolbar with a single-row header showing
"<N> files changed" on the left and Captured-time + Split/Stacked
toggle + icon Refresh on the right. Heights of left and right groups
match. The Unified label is renamed to Stacked to match diffs.com
terminology; the underlying DiffStyle value is unchanged so the
@pierre/diffs option and the localStorage key continue to roundtrip.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-24 21:08:40 -04:00
Bryan Helmkamp
abe58ee750
test(fabro-test): reap stale tmp socket daemons
Some checks are pending
TypeScript / Typecheck (push) Waiting to run
TypeScript / Build (push) Waiting to run
Rust / Format (push) Waiting to run
Rust / Clippy (push) Waiting to run
Rust / Generated Docs (push) Waiting to run
Rust / Test (Linux) (push) Waiting to run
Rust / Test (macOS) (push) Waiting to run
TypeScript / Test (push) Waiting to run
2026-04-24 21:02:23 -04:00
Bryan Helmkamp
a34d52b413
test(cli): align stale CI snapshots
Update CLI integration snapshots to match the current fatal error and help renderers so the release smoke suite passes.
2026-04-24 19:53:02 -04:00
Bryan Helmkamp
11be286fa1
refactor(dev): simplify generated docs tooling
Share the real CLI parser with reference generation, reuse option metadata flattening, and centralize dev command execution helpers.
2026-04-24 18:41:00 -04:00
Bryan Helmkamp
a4ee62a8a4
refactor(dev): dedupe shared helpers, remove check-boundary
Consolidate workspace_root, PlannedCommand, shell_arg, markdown_cell, and
replace_generated_region into commands/mod.rs; unify fabro_dev/output_text/
write_file/read_file into tests/it/main.rs. Drop the abandoned check-boundary
subcommand.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-24 18:10:31 -04:00
Bryan Helmkamp
5e28ec0f82
Merge remote-tracking branch 'origin/main'
# Conflicts:
#	.github/workflows/nightly.yml
#	bin/dev/release.sh
2026-04-24 17:04:55 -04:00
Bryan Helmkamp
12ea5341bb
feat(dev): generate options reference
Add a settings reference generator backed by OptionsMetadata on the sparse config layer structs. The generated user-configuration page is fenced and checked in CI alongside the CLI reference.
2026-04-24 16:49:16 -04:00