- Light theme text #111118, textSecondary #333345 (was too faint)
- FrontPage opacity values scale with isDark (0.45→0.65, 0.3→0.5, etc.)
- All secondary text now readable on gray backgrounds in both modes
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Light mode background #d8d8e0, paper #c8c8d2, surface #bfbfc9.
Enough contrast to read, not enough to need sunglasses.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Change default primary from green (#10a37f) to indigo (#6366f1/#4f46e5)
- Light theme: soft off-white (#f0f0f3) background instead of blinding #ffffff
- CAppBar now uses Theme.paper background instead of native ToolBar styling
- App.qml calls Theme.setTheme() on startup + on currentTheme change
- FrontPage uses isDark flag for all surface/border colors (works both modes)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Complete visual overhaul matching old/ reference design:
- Gradient hero section with "Build Anything, Visually" headline
- Platform stats bar (users, packages, workflows, backends)
- Five Levels of Power grid with colored badges, descriptions, feature chips
- Universal Platform tech stack grid (6 technologies)
- Platform Status with live service indicators
- About section with philosophy tagline
- Quick Access credential cards with one-click login
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- AppShell with level-based auth gating (Guest through SuperGod)
- Sidebar with static core items + dynamic DBAL package navigation
- God Panel with 10 tabs: schemas, workflows, packages, users, DB, etc.
- Super God Panel with multi-tenant control
- Admin panel with entity browser
- JSON-driven config (sidebar-config.json, god-panel-config.json)
- DBAL health banner and graceful offline fallbacks
- Workflow editor integration via existing WorkflowBuilder component
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
New workflow commands: list, get, run, create, status
New package commands: install, uninstall, info, search
All backed by DBAL REST API with formatted table/JSON output.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Wire up DBALProvider across all Qt6 views for live CRUD operations,
add PackageLoader, MediaServicePanel, NotificationsPanel, SettingsView,
and JSON-driven CMake config. Fix deployment helpers.py str|None syntax
for Python 3.9 compatibility via __future__ annotations.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add a Bash entry to .claude/settings.local.json that runs a find under frontends/qt6 to locate markdown, CLAUDE.md, README.md, and roadmap files (improves document discovery). Also adjusts list punctuation to include the new entry.
Ignore the .act-env file to prevent committing local 'act' environment settings and other developer-specific artifacts. Keeps local environment configuration out of version control.
- Downgrade all actions/upload-artifact and actions/download-artifact from
v6 to v4 for compatibility with act's local artifact server (v6 uses a
new Azure blob backend that act doesn't support)
- Add .actrc with arm64 architecture, artifact server, sequential jobs,
and secret/env file pointers for local act runs
- Add .act-env to .gitignore (contains local node PATH override)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Build metabuilder-cli C++ binary into DBAL frontend Docker image
via multi-stage build (conan-deps → cli-builder → nextjs → ubuntu runner)
- New /api/cli route executes the real C++ binary via child_process
- CLI mode runs actual metabuilder-cli commands (dbal, auth, user, tenant, package)
- Admin token forwarded via DBAL_ADMIN_TOKEN env var
- Ubuntu 24.04 runtime for glibc 2.38 compatibility with Conan builds
- Added standalone CLI Dockerfile at frontends/cli/Dockerfile
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Login screen with admin token (default pre-configured for local dev)
- CLI mode: type dbal commands directly (list, read, create, update, delete, rest, ping)
- Clickable example commands for quick start
- CLI/GUI mode toggle
- Token persisted in localStorage, forwarded as Bearer auth
- History shows CLI commands with $ prefix
- Disconnect button to logout
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Previous ICOs were just solid color squares. Now rendered with Pillow
using Arial Bold, rounded corners, and centered white text matching
the SVG designs.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Update all 12 Dockerfiles from node:18/20/22 to node:24-alpine
- Fix caproverforge portal: remove event handlers from Server Component
- Fix repoforge/caproverforge portals: ensure public/ dir exists in builder
- Fix packagerepo Dockerfile: node:18 → node:24 (Next.js 16 requires >=20)
- Fix DBAL frontend port conflict: 3009 → 3015 (3009 in use by external container)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Bio updates were sent directly to DBAL which returned 403 (user JWT lacks
admin privileges). Moved profile read/write through new Flask endpoints
(GET/PUT /api/profile) that use the DBAL admin token server-side.
Also fixed ProfileSettingsCard to fetch and populate the existing bio on
mount instead of always starting with an empty string.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The profile page was rendering without the shared PageLayout, so it was
missing the header (burger menu, logo, theme switcher, avatar) and footer.
Added PageLayout wrapper and a breadcrumb nav bar with back button.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The /api/auth/me endpoint read `username` from the top-level DBAL response,
but DBAL wraps records in {data: {...}, success: bool}. This caused the
avatar to show a blank circle and the profile menu to display "@" with no
username. Now correctly reads from `body.data.username`.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The code runner used `python3 -c` to decode FILES_PAYLOAD inside every
container, but 6+ runner images (node, golang, bash, ruby, php, perl)
don't ship python3 — so JS/Go/Bash/Ruby/PHP/Perl snippets all failed.
Replaced with a pure POSIX `base64 -d | awk` pipeline that works on
every image. Also fixes:
- pids_limit 64→256 (Go compiler crashed spawning threads)
- Per-user configurable runTimeout via settings panel (5–300s)
- Default run timeout 10→30s, server-side cap at 300s
- Frontend AbortSignal raised to 310s to match max timeout
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add 18 data-testid selectors and improved ARIA attributes across sign-in,
register, and forgot-password forms for Playwright e2e testing and accessibility.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Fix CW→CCW winding bug on polygon/mesh faces (types 1,3) that caused
backface culling to discard half the geometry. Decompose the monolithic
bsp.load step (1028 lines) into atomic workflow steps chainable via
JSON connections — each step only runs when connected:
- bsp.load: open pk3, read + validate BSP, store raw data in context
- bsp.lightmap_atlas: build lightmap atlas, upload to GPU
- bsp.parse_spawn: parse entity lump for spawn point
- bsp.build_geometry: build face geometry with CW→CCW winding fix
- bsp.extract_textures: load textures from pk3 with mipmaps
- bsp.upload_geometry: upload merged VB/IB to GPU
- bsp.build_collision: create Bullet physics convex hull collision
Shared BSP structs extracted to bsp_types.hpp. Workflow JSON updated
to chain: load → lightmap → geometry → textures → upload → collision → spawn.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Add missing classnames and @metabuilder/redux-core dependencies
- Replace bash-only typecheck script with cross-platform node script
(scripts/typecheck.cjs) that filters workspace resolution errors
- Downgrade no-redundant-type-constituents to warning for workflow files
where unresolved workspace types cause false positives
All 9 gates now pass: schema, typecheck, lint, security, file-size,
complexity, stubs, unit tests (478), and Next.js build.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
stack.py line 130 `run = run_cmd` shadowed the imported `run` helper from
cli.helpers, causing a recursive TypeError on `stack up`. Renamed import to
`run_shell` to avoid the collision. Moved storybook behind a profile since
its Docker build fails due to @storybook/addon-docs version mismatch.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- postfx.taa: temporal anti-aliasing with Halton jitter, neighborhood clamping,
Karis tonemap for stable history, configurable blend_factor from JSON
- Texture loader: auto-generate full mipmap chain via SDL_GenerateMipmapsForGPUTexture
- 16x anisotropic filtering on all textures
- LOD bias 0.5 to reduce moire patterns on high-frequency textures at distance
- TAA shader: 3x3 neighborhood clamp with expanded bbox to reduce flicker
- Ping-pong history buffers for temporal accumulation
- Sub-pixel jitter via Halton(2,3) sequence, 16-frame cycle
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- map.load: Assimp-based glTF/GLB scene loader with auto physics generation
- draw.map: renders all map meshes with JSON-driven texture-to-mesh mapping
- export_room_gltf.py: exports seed workflow physics bodies to GLB
- Seed demo room exported as map.glb (14 static meshes)
- Texture mapping configurable per mesh name pattern in workflow JSON
- Maps can be edited in Blender and re-exported
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Shift to sprint (1.8x speed), Ctrl to crouch (0.4x speed + lower camera)
- Smooth animated crouch via eye height lerp (no snap)
- Variable-height jump: hold space longer = jump higher, release for short hop
- Raycast ground detection for reliable jump triggering
- Air control for mid-air strafing (Quake-style)
- Configurable gravity scale for floaty/snappy feel
- All parameters driven from workflow JSON (no hardcoded values)
- Ctrl polled in input.poll step
- Camera reads crouch height override from physics.fps.move context
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- spotlight.setup: generic parameter passthrough, no hardcoded defaults
- spotlight.update: all values from spotlight.state JSON, zero fallbacks
- aim_distance now explicit in workflow JSON (was hardcoded 50.0f)
- C++ steps are pure executors, all config lives in workflow definitions
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Extract spotlight logic from render.prepare into dedicated spotlight.update step
- render.prepare now only handles camera, shadow, and lighting uniforms
- spotlight.update runs per-frame after render.prepare, reads spotlight.state from context
- Aim distance configurable via JSON (aim_distance parameter)
- Camera-local offset for spotlight origin (matches viewmodel position)
- Direction computed from torch position toward camera aim point (natural beam alignment)
- Add distance fog to whole room (exponential, dark blue-grey)
- Volumetric beam: 48 steps, UE4 interleaved gradient noise, cubic cone falloff
- Fog density increased for visible beam effect
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Build system:
- Fix generate_cmake.py backslash paths and UTF-8 encoding for Windows
- Auto C++20 in conan deps, auto-detect VS install location
- dev_commands.py: add generate, all --run commands, platform-aware bootstrap
- Add assimp to cmake_config.json link libraries
- Fix CMakeUserPresets.json duplicate preset issue
Cross-platform C++:
- UUID generation: Windows rpc.h/UuidCreate with #ifdef _WIN32
- HOME env var fallback to USERPROFILE on Windows
- Shader format detection for D3D12/DXIL Vulkan driver
Shader pipeline (12 new SPIRV shaders):
- Port all Metal shaders to Vulkan GLSL (PBR, shadows, post-FX, compute)
- SDL3 GPU descriptor set convention (set 0-3)
- Combined image samplers for Vulkan compatibility
- Bootstrap-driven shader path rewriting (msl↔spirv automatic per platform)
Rendering features:
- spotlight.setup: generic atomic workflow step, attach to camera or static
- PBR spotlight with cone attenuation, distance falloff, wrap lighting
- Volumetric light beam (16-step ray march through dust/fog in spotlight cone)
- geometry.create_flashlight: procedural flashlight mesh (cylinder + head + lens)
- draw.viewmodel: FPS weapon-style rendering locked to camera view
- model.load: Assimp-based 3D model loader (OBJ/GLB/FBX/BLEND)
- Indoor ambient lighting fix, SSAO bypass for Vulkan clip-space
Performance:
- Frame loop logging suppressed via _in_frame_loop context flag
Assets:
- Real PBR textures from ambientCG (CC0): wood floor, concrete ceiling
- Seed demo: dark room + flashlight beam + Quake-style viewmodel
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@storybook/addon-docs was importing { Tag } from storybook/internal/core-server
which didn't exist in the resolved core version. Pin all packages to the same
exact version and add overrides to prevent transitive dependency drift.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The module entry point `run = run_cmd` shadowed the imported subprocess
helper `run` from cli.helpers, causing TypeError on dispatch. Import as
`run_proc` and use a proper wrapper function for the module entry point.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Align PyJWT (2.8.0→2.10.1) and requests (2.32.5→2.32.4) in pastebin
backend to match all other services. Replace futile retry loop with a
merge-and-deduplicate strategy that gives pip a single consistent set
of constraints.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Rewrote both Docker init container scripts in Python using requests.
Switched init containers from alpine:3.21 to python:3.12-alpine.
Zero shell scripts remain in deployment/.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
All deployment commands now go through deployment.py. Deleted:
build-base-images.sh, build-apps.sh, build-testcontainers.sh, deploy.sh,
start-stack.sh, release.sh, nexus-ci-init.sh, push-to-nexus.sh,
populate-nexus.sh, publish-npm-patches.sh.
Kept nexus-init.sh and artifactory-init.sh (Docker container entrypoints).
Updated all references in CLAUDE.md, README.md, AGENTS.md, ROADMAP.md,
deployment docs, Dockerfiles, and docker-compose comments.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Dockerfile.node-deps: upgrade FROM node:22 to node:24
- Dockerfile.node-deps: rewrite main registry= line to Nexus when detected
(was only rewriting scoped @esbuild-kit registry, leaving registry.npmjs.org
unreachable inside Docker)
- Dockerfile.node-deps: fix sed ordering so cleanup of old auth lines runs
before registry rewrite (prevents new registry= line from being deleted)
- Add deployment/cli/ modular Python CLI powered by JSON config, replacing
12 shell scripts (build-base-images.sh, build-apps.sh, deploy.sh,
start-stack.sh, release.sh, nexus-init.sh, nexus-ci-init.sh,
push-to-nexus.sh, populate-nexus.sh, publish-npm-patches.sh,
build-testcontainers.sh, artifactory-init.sh)
- Bump rocksdict 0.3.23 -> 0.3.29 (old version removed from PyPI)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
node:20-slim lacks wget and curl, causing all registry connectivity
checks to silently fail and report reachable registries as UNREACHABLE.
Switching to the full node:22 image provides both tools and upgrades
to the current LTS.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Allows build containers to reach npm registries and local registries
on the host network.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The Dockerfile now probes for Nexus (:8091) and Verdaccio (:4873) via
both host.docker.internal and localhost, then rewrites .npmrc to point
at whichever is running. This lets the same .npmrc work in CI
(Verdaccio) and on desktops (Nexus) without manual editing.
When neither registry is found, a prominent warning banner is printed
with instructions to start one, then the build continues using only
the public npm registry.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>