Windows Store Python installs packages without adding Scripts to PATH,
causing FileNotFoundError when invoking conan directly.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
After moving compose.yml into metabuilder/ subfolder, all .././ context
paths were one level short — updated to ../../ to correctly resolve from
deployment/metabuilder/ to the project root siblings (dbal, frontends,
services).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- actions/checkout@v6 → @v4 (v6 does not exist) in both workflows
- actions/cache@v6 → @v4 and actions/upload-artifact@v6 → @v4 in dbal-tests.yml
- gate-2-complete: add if:always() guard so skip_tests=true no longer
kills Gate 3/4/5/6 by leaving gate-2-complete in skipped state
- deployment: move nexus-init.py and artifactory-init.py into metabuilder/
subfolder; update compose.yml volume paths from ../ to ./
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Gives the stack a clean name in Portainer ("metabuilder") instead of
the directory name. Updated all relative paths inside compose.yml and
COMPOSE_FILE references in CLI helpers.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Merge docker-compose.nexus.yml into compose.yml as --profile registry
- Drop docker-compose.smoke.yml, docker-compose.test.yml (deprecated), and docker-compose.stack.yml
- Rename to compose.yml (Docker Compose default; no -f flag needed)
- build apps / deploy now derive buildable services from compose.yml directly instead of hardcoded all_apps/service_map in commands.json — covers all 29 buildable services automatically
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
run = run_cmd alias at module level shadowed the imported subprocess
helper, causing recursive calls and TypeError on input kwarg.
Renamed import to run_proc to match the pattern used in deploy.py.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
package-lock.json is gitignored (**/package-lock.json) so it never
exists in the build context. npm install on line 41 handles deps fine.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Three QML syntax errors introduced by the a11y agents:
- CommentsDBAL.js:25 — string literal split across lines by line-wrapper
- LuaEditor.qml:50 — semicolon between sibling QML elements (invalid)
- SMTPConfigEditor.qml:48 — same semicolon issue
generate_cmake.py: list .hpp files in qt_add_executable so AUTOMOC
scans them for Q_OBJECT — required for header-only Qt classes to link
(signals/vtable are generated by moc, not the compiler).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
generate_cmake.py now includes *.hpp alongside *.h when building
the header list. CMakeLists.txt regenerated — src/ now has 2 .cpp
sources (DBALClient, PackageLoader) after ModPlayer, NodeRegistry,
and PackageRegistry were converted to header-only .hpp files.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Move ModPlayer, NodeRegistry, PackageRegistry from .cpp/.h pairs to
single .hpp files. Add DBALRequest.hpp and DBALTypes.hpp. Update
DBALClient and main.cpp for new structure.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Selected email card: add secondary-container bg + left accent border
- Unread email cards: add primary left border accent
- StarButton: sync local state with parent via useEffect([isStarred])
- Initial dark mode: useEffect applies data-theme on mount
- Star active color: amber #f9a825 via .star-button--active CSS rule
- Unread count badge: styled as pill with primary-container background
- Empty state: add inbox/folder_open material icon
- Folder toolbar label: capitalize + replace underscores with spaces
- ComposeWindow: CC/BCC hidden by default, revealed via Cc/Bcc button
- Email header: flex layout for .header-top, column gap for .header-details
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Extract ctx alias for rootContext() calls and wrap long string
literals to stay within the 80-character line margin.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Second-pass a11y work across all 12 component groups. Every interactive
element now has activeFocusOnTab, Keys.onReturnPressed/SpacePressed, and
context-aware Accessible.name/description bindings.
Highlights:
- Dialogs: keyboard handlers with enabled-guard on confirm buttons
- CDropdownMenu: full keyboard nav (Up/Down/Enter/Escape)
- CLoginForm: explicit KeyNavigation.tab chain (username→password→submit)
- CNotificationBell: dynamic "3 notifications"/"No notifications" name
- CJobProgressBar: Accessible.minimumValue/maximumValue/currentValue
- CExecutionStatusDot: "Execution status: Running/Passed/Failed" binding
- CKeyboardShortcuts: invisible Repeater exposes all shortcuts to a11y tree
- CDataTable rows: "Row N of M" descriptions
- Canvas elements: Accessible.Canvas role + keyboard zoom (+/- keys)
- DropdownExpandedList: focus-highlight extended to :activeFocus
- Dynamic names reflect loading state (e.g. "Signing in, please wait")
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Continues the a11y pass from the previous commit — adds objectName,
Accessible.role, Accessible.name to all remaining qml/MetaBuilder/,
qml/qt6/, and qml/widgets/ files. Widget files also get activeFocusOnTab
on interactive elements and dynamic Accessible.name bindings.
Cleans up redundant addImportPath(projectRoot) call in main.cpp.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Folders and emails constants extracted to folders.json and emails.json.
The TS loader hydrates relative hoursAgo into absolute timestamps.
Follows the 95% JSON / 5% code principle.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
SMTPConfigEditor: split property declarations + handler bodies
DatabaseManager: break long strings + property chains
FrontPage: split Layout properties onto separate lines
CCard: trim section comment rulers
Result: 0 lines over 80 chars across all qml/**/*.qml and qml/**/*.js
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Replace all emoji with Material Symbols Outlined (self-hosted woff2)
- Softer dark mode palette (blue-purple surface tones instead of near-black)
- Header: burger menu, notifications bell with badge, theme switcher,
language selector, settings, avatar
- Folder nav icons render via Material Symbols font ligatures
- Fix Dockerfile to copy public/ dir for font serving
- Improved padding and spacing throughout
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
88 files reformatted — zero logic changes:
- All views, components, and JS modules wrapped to 80-char margin
- Long property bindings, ternaries, and strings broken at natural points
- Theme.qml theme definitions expanded to multi-line
- StyleVariables tokens wrapped
- Section comment rulers trimmed to 80 chars
Trade-off: LOC increases from line wrapping (compact single-line properties
now span 2-3 lines). Content unchanged.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
No symlinks, no QmlComponents directory. main.cpp adds qml/
as import path — Qt finds QmlComponents module via qml/qmldir
and MetaBuilder via qml/MetaBuilder/qmldir.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
WorkflowEditor (325→80): CWorkflowState.qml + WorkflowConnectionState.js
DashboardView (121→95): DashboardDBAL.js + config/dashboard-config.json
Storybook (114→78): StorybookSidebar + config/storybook-components.json
+ 7 components compacted to under 100 via formatting (no logic changes)
+ Multiple view/component splits across all remaining 100+ LOC files
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Moves inline JSX from EmailClientContent into proper FakeMUI email
components in components/fakemui/email/layout/. All styling uses M3
CSS custom properties (--mat-sys-*) from the FakeMUI token system.
New components:
- MailboxHeader: top bar with search, avatar, settings
- MailboxSidebar: compose button + folder navigation
- EmailDetail: reading pane with toolbar, header, body, reply bar
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Register all new components in qml/MetaBuilder/qmldir
- Fix backgroundColor → bgColor in 18 PackageView files
- Fix SMTP signal handlers: onHostChanged → onHostEdited (matching actual signals)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add support for an extracted component layout where QML files live in ../../qml/ and may need QT_RESOURCE_ALIAS to preserve original QRC URIs. Refactor scanning logic (_scan_dir), make find_root_qml_files and find_qmllib_files return (path, alias) tuples, add find_config_files, and collect aliased resources to set QT_RESOURCE_ALIAS properties before qt_add_qml_module. Also streamline source/resource aggregation, compile-def handling, and generation header/output reporting.
- Delete QmlComponents symlink (Windows incompatible, bad practice)
- main.cpp: add qml/ and project root as import paths directly
- No more symlink dependency — works cross-platform
- Clean up stale duplicate files from background agents
- Update generate_cmake.py and CMakeLists.txt for new paths
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add handling for config assets in the Qt6 frontend generator: generate_cmake.py now discovers config files (find_config_files) and includes their QML/JS entries and JSON resources in the generated lists. CMakeLists.txt was updated to use ../../qml/qt6 path prefixes for root QML files, to include numerous config JSON/JS resources, and to update the auto-generated header file counts. Also rename several frontend docs into frontends/qt6/docs/.
Delete bundled frontends/qt6/qmllib QML libraries (Material, MetaBuilder, dbal, etc.) now provided from the extracted qml/qt6 tree. Update frontends/qt6/generate_cmake.py to also scan ../../qml/qt6 (relative to the root) and include those files (using relative paths) when generating the list. Also apply small updates to a few qml/MetaBuilder files (CSmtpServerForm.qml, CWorkflowTestPanel.qml, ThemeColorTokens.qml, ThemeTypography.qml) to align with the extraction.
Delete duplicated frontend QML files under frontends/qt6 (GodPanel.qml, SettingsView.qml). Adjust qml/qt6/GodPanel.qml to import the local qmllib/MetaBuilder path instead of the MetaBuilder 1.0 module, keeping the canonical QML implementation in qml/qt6.
Add a large set of QML components (qml/Material, qml/MetaBuilder, qml/dbal) and a QmlComponents symlink for local development; migrate many frontends/qt6 files into qml/qt6. Replace the email client bootloader with a self-contained demo UI using FakeMUI primitives (MailboxLayout, ThreadList, EmailHeader, ComposeWindow), demo data, handlers, and new folder-navigation styles in globals.css. Update several QML component APIs to new signal/handler names (e.g. selectAllChanged→selectAllToggled, pageChanged→pageRequested, *Changed→*Edited) to standardize events. Add find_config_files() to frontends/qt6/generate_cmake.py to include config JS/JSON in QML/files and resources. Also add /frontends/qt6/_build to .gitignore.
Terminal scrollIntoView was scrolling the entire page instead of just
the terminal panel. Replaced with container.scrollTop for scoped scroll.
Snippet cards in dark mode were invisible (surface-container-low ≈
background). Added border, background, and shadow to differentiate them.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>