Commit Graph
2204 Commits
Author SHA1 Message Date
Juan DenisandClaude Fable 5 ffec0ca3ad fix(restore-points): json one-door model reads; modernize last-domain restore test
RestorePoint hand-rolled json.loads for payload/coverage — now reads
through JsonColumnMixin._json_read like every other model, keeping the
models-json ratchet green.

test_restoring_the_last_domain_re_enables_the_site mocked create_site
and counted enable_site calls, but since write_vhost became the one
enabling door (enable=True re-links sites-enabled and create_site goes
through it), write_app_vhost no longer calls enable_site separately —
test_site_domain_writer_does_not_enable_twice pins that. The restore
test now asserts through write_vhost's enable flag instead, still
failing if a restore path ever opts out of enabling.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-25 03:13:06 -04:00
Juan DenisandClaude Fable 5 e29872f0cd fix(restore-points): satisfy jwt-only and seed-factory ratchets
The three restore-point read routes authenticated with bare
@jwt_required(), pushing the census to 579 against a 577 ceiling.
They now use the auth_required() policy door like the file's mutating
routes (which already accept API keys via @developer_required), keeping
read access consistent with write access for API-key callers; scope
authorization stays in-route. test_restore_point_env.py hand-rolled
Application/User seeds — switched to the make_application/make_user
factories. Migration inventory regenerated.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-25 02:52:59 -04:00
Juan DenisandClaude Fable 5 6f51b3b3c0 fix(i18n): drop orphaned noChange/envVar locale keys
ConfigDiffModal renamed noChange to noChangeValue and DeploymentTimeline
renamed envVar to envVarCount, but the old keys were left behind in the
16 translated locales, failing the i18n lint orphan check.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-25 02:44:09 -04:00
Juan Denis 69182c3d95 feat(restore-points): add server restore points UI 2026-08-23 23:40:22 -04:00
Juan Denis d060e77e99 feat(servers): add merged restore timeline 2026-08-23 17:16:29 -04:00
Juan Denis aa82fc4082 feat(restore-points): add authorized lifecycle API 2026-08-23 17:00:50 -04:00
Juan Denis cf2cce6041 feat(restore-points): add surface adapters and checkpoints 2026-08-23 16:41:02 -04:00
Juan Denis cd956d1cb0 feat(restore-points): add generic checkpoint core 2026-08-23 16:07:09 -04:00
Juan Denis ded7d54039 refactor(nginx): consolidate vhost writes 2026-08-23 15:50:53 -04:00
Juan Denis 44b3ff3a9d Preserve frontend assets in release builds
Adjust release cleanup/packaging to stop stripping image files from frontend/dist, which broke Vite hashed asset references at runtime. The script now excludes dist from image deletion, removes image-wide tar excludes, and adds a bundle integrity check that fails the build if referenced /assets files are missing.
2026-08-23 15:16:08 -04:00
github-actions[bot] e6d3477c3c chore: bump version to 1.9.5 [skip ci] 2026-08-22 19:07:39 +00:00
Juan Denis 7cb04576bc fix(styles): remove duplicate disk reclaim owner 2026-08-22 15:00:53 -04:00
Juan Denis a2901bf064 perf(deployments): skip unused plan parsing 2026-08-22 15:00:52 -04:00
Juan Denis 1e4922746c fix(operations): normalize recipe handoff descriptors 2026-08-22 15:00:46 -04:00
github-actions[bot] 853ca5ce3b chore: bump version to 1.9.4 [skip ci] 2026-08-22 18:55:56 +00:00
Juan Denis c756b61abe Merge remote-tracking branch 'origin/main' into dev 2026-08-22 14:49:20 -04:00
Juan Denis dd59a84619 fix(ci): keep version bumps behind green checks 2026-08-22 14:49:12 -04:00
Juan Denis 1fad04e880 fix(recipes): restore CI boundary contracts 2026-08-22 14:49:11 -04:00
github-actions[bot] ab0c3174b0 chore: bump version to 1.9.3 [skip ci] 2026-08-22 18:25:23 +00:00
Juan DenisandClaude Fable 5 2a5d18867f refactor(walkthroughs): the shell dock says Walkthroughs, not Recipes
Reserve the word Recipes for installers. The status-bar segment, dock
tab, hub aria-label and command-palette category now read Walkthroughs
(new app.walkthroughs.title/all keys; stale es allRecipes dropped).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-22 14:21:04 -04:00
Juan DenisandClaude Fable 5 93c8abbbbe feat(recipes): serverkit-recipes registry catalog with one-call installs
The curated serverkit-recipes index is consumed like the themes registry
(cached remote index, bundled fallback, SERVERKIT_RECIPES_REGISTRY_URL
override). GET /recipes/registry[/<slug>] browses it; POST /recipes/runs
now accepts a registry_slug plus server_id — targeting a server finds or
creates the per-workspace Recipes project — and validated non-secret
params that pre-supply handoff inputs so only true secrets pause the run.

Frontend: Recipes catalog page (cards, category chips, install drawer
with running-server picker, preflight table, up-front inputs and an
asked-during-the-run secrets preview) under new Services and Marketplace
tabs; runs land in the deployment console.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-22 14:20:55 -04:00
github-actions[bot] 82dc866c41 chore: bump version to 1.9.2 [skip ci] 2026-08-22 06:55:21 +00:00
Juan DenisandClaude Fable 5 d867b92c98 chore(i18n): sync locales for the shell console round
en.json regenerated from inline defaults (new statusbar/console/palette/
recipes strings; Prompture and old walkthrough-hub strings gone). es picks
up translations for all 26 new keys; every locale drops the now-orphaned
keys so the parity gate stays green.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-22 02:43:38 -04:00
Juan DenisandClaude Fable 5 adf6b48bff style(buttons): prototype accent treatment for the primary button
Gradient fill (accent-bright to accent), accent glow, inner top highlight,
and a hover that lifts the gradient toward white — all from theme tokens so
runtime skins keep recoloring it.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-22 02:43:27 -04:00
Juan DenisandClaude Fable 5 8b7cecb62e feat(palette): create tile grid + recipes; the sidebar + opens the palette
The palette's empty state now leads with a Create tile grid (shared list in
data/createItems.js) plus a '+ n more' shelf that folds in the less-common
targets and any extension-contributed 'New ...' commands, then a Recipes
group (picking one starts it and opens the recipes console). Create and
recipe entries also score into regular search results.

The sidebar '+' stops carrying its own little dropdown and opens this
palette instead — one door for every new-thing flow, like the prototype.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-22 02:43:24 -04:00
Juan DenisandClaude Fable 5 3f3ff156f1 feat(ai): dock the assistant into the shell console; drop Prompture branding
The right-side chat drawer now carries the shared console tab strip, so the
assistant reads as the right-docked tab of the same console the bottom
panels belong to (its close moved into the strip). The 'powered by
Prompture' lines are gone from the header and empty state — the empty state
now tells the user what to ask instead.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-22 02:43:15 -04:00
Juan DenisandClaude Fable 5 6a8e80d7f1 feat(shell): one tabbed console + styled scope menus (port prototype chrome)
The bottom-edge surfaces (Operations, Alerts, Recipes, Assistant) now share
one console: every panel carries the same four-tab strip (ShellDockTabs) and
a ShellDockContext keeps exactly one open, so switching surfaces is a tab
click instead of hunting separate popovers. Recipes is rebuilt into the
prototype's split layout — step rail left, one step's story right, with a
deep-link action button, 'Done - next step', and Back.

The workspace/server switchers get real themed menus (dot - name - meta -
check) replacing the native <select> popup that ignored the theme, and the
sidebar keeps its full height again: it was shortened by the statusbar
height even though the bar only spans the content column, leaving a dead
30px hole under the user card.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-22 02:43:06 -04:00
github-actions[bot] a91c07ba20 chore: bump version to 1.9.1 [skip ci] 2026-08-22 05:33:46 +00:00
Juan Denis c0de9fbcac refactor(i18n): consolidate duplicate locale strings into common.* namespace
en.json drops from 8107 to 6624 keys: repeated UI copy (Cancel x95,
Status x67, Refresh x54, ...) now lives under common.actions /
common.labels / common.loading, and extractor-era suffix duplicates
(refresh2, status3) within a component collapse onto one key.
Trailing ... defaults are normalized to the ellipsis character.

Translations are preserved: all 16 locales were re-keyed, carrying
existing per-component translations onto their new common.* keys
(majority vote where sources disagreed), and stale keys were pruned.

Verified: npm run lint (0 errors), node --test (140 pass), vite build.

edit
2026-08-22 01:32:52 -04:00
github-actions[bot] 77dfed6a64 chore: bump version to 1.9.0 [skip ci] 2026-08-22 04:55:39 +00:00
Juan Denis 6eb7e5433d feat: redesign app shell and file manager 2026-08-22 00:41:06 -04:00
Juan Denis 7b7779a6b2 fix(monitoring): restore missing disk-reclaim stylesheet (unbreaks build) 2026-08-21 23:59:46 -04:00
Juan Denis a16561a0fb refactor(ds): fold Drawer/PageTopbar/AppMap static styles into SCSS 2026-08-21 23:54:26 -04:00
Juan Denis 5a297adf97 refactor(ui): move widget/skeleton static inline styles into SCSS 2026-08-21 23:50:42 -04:00
Juan Denis 6ddeb0dad4 refactor(setup): replace wizard inline styles with modifier classes 2026-08-21 23:45:03 -04:00
Juan Denis 9f1aed7943 refactor(settings): replace static inline styles with SCSS classes 2026-08-21 23:43:02 -04:00
Juan Denis ab7505c934 refactor(servers): replace static inline styles with SCSS classes 2026-08-21 23:35:44 -04:00
Juan Denis 58dce6225b fix(a11y): make JS smooth-scrolls honor prefers-reduced-motion 2026-08-21 23:20:11 -04:00
github-actions[bot] 81875f0e77 chore: bump version to 1.8.1 [skip ci] 2026-08-22 03:07:04 +00:00
Juan Denis 515d960614 chore(ratchets): regenerate the boundary baseline, error ceiling and migration inventory
The recipes Phase 0 commit moved all three measured counts without
regenerating their baselines. The new api/recipes.py persistence
crossings are owned and documented in the baseline; the hand-shaped
error census is unchanged by this branch.
2026-08-21 23:05:56 -04:00
Juan Denis 36409d6ddf fix(crypto): keep recipe handoff secrets behind the vault one door
RecipeExecutionService encrypted handoff inputs with a direct
app.utils.crypto import, tripping the service-level crypto ratchet.
SecretService gains upsert_internal_secret — create-or-update without
the human display-name grammar, for machine-named secrets in a
dedicated vault slug — and the recipe service routes through it.
2026-08-21 23:05:48 -04:00
Juan Denis f5023c0613 feat(disk): reclaim space from the panel
Expose disk_reclaim_service behind /api/v1/system/disk/reclaim: a
read-only report and a confirm-gated POST whose keys are re-validated
against a fresh scan server-side (safe candidates only — telemetry
stays CLI-only). ?wait=false runs it as a background job; both paths
are audit-logged.

The curated fix shows up where the problem is reported: a failing
disk.headroom doctor check and an alerting disk tile each offer
'Reclaim space', which previews measured candidates before handing
the run to Operations.
2026-08-21 23:05:40 -04:00
github-actions[bot] 954af86199 chore: bump version to 1.8.0 [skip ci] 2026-08-22 02:06:28 +00:00
Juan Denis d6950cc40f feat: add guided operator walkthroughs 2026-08-21 22:04:09 -04:00
Juan Denis 811cf7dde9 feat: add resumable recipe execution foundation 2026-08-21 21:47:24 -04:00
Juan Denis 5ff4a4e87b Merge pull request #115 from jhd3197/dev
Unify runs and resource pickers, and stop the disk filling up
v1.7.130
2026-08-21 20:49:58 -04:00
Juan Denis 72f0c780dd Merge branch 'main' into dev 2026-08-21 20:30:52 -04:00
github-actions[bot] 4e543dbd86 chore: bump version to 1.7.130 [skip ci] 2026-08-22 00:20:09 +00:00
Juan DenisandClaude Opus 5 924a08c3ff chore(dev): add scripts/preflight.sh -- run what CI checks, locally
Five red CI rounds in one day, none of them a broken feature: a floor measured
on a dev box, a fingerprint baseline left unregenerated after a refactor, a
ceiling that moved with the code, a generated doc gone stale, and a text-grep
guard that matched a docstring. Every one is an AST or text scan over the tree
that needs no shard and no push to run.

preflight.sh runs the test-count ratchet, every backend ratchet/census/guard
test (matched by filename, so a new ratchet is covered the day it lands rather
than the day someone remembers this script), the frontend boundary check, and
the migration-inventory freshness check. About two minutes against a five-minute
push-and-wait.

It resolves node.exe through WSL interop, so the one WSL invocation in the
header comment covers both halves on this dev box. The inventory check compares
against a snapshot of the file rather than against HEAD, so an uncommitted but
correct regeneration is a pass.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-21 20:15:15 -04:00
Juan DenisandClaude Opus 5 550dd47585 fix(ratchets): regenerate the boundary baseline and the migration inventory
Two more shards were red on generated artifacts nobody regenerated:

- api_controller_boundary_baseline.json: the attachment round rewrote
  _persist_user_message to build the row before adding it, so the fingerprint
  moved from `db.session.add(AiMessage(...))` to `db.session.add(message)`.
  Same crossing, same category, count unchanged at 509 -- one line.

- docs/MIGRATION_INVENTORY.md: three measured numbers had moved without a
  regeneration -- bare @jwt_required() routes 577 -> 576, and the two frontend
  rows whose totals come from maps inside check-frontend-boundaries.mjs
  (setInterval pollers 10 -> 9, hex colour literals 151 -> 150). All three are
  deterministic AST/constant counts, so these are CI's numbers, not this box's.

The reason nobody caught the inventory locally is the third fix here: the
generator hardcoded `node`, and under WSL the Windows nvm directory is on PATH
but exposes only `node.exe`, so test_migration_inventory.py skipped on the dev
box. Both the generator and the test now resolve $NODE / node / node.exe, and
the test runs instead of skipping.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-21 20:14:34 -04:00