The silo submodule now uses silo-mod layout where the FreeCAD workbench
is at freecad/ (not pkg/freecad/). Also install the silo-client
submodule directory.
appimagetool is an AppImage itself and requires FUSE to self-mount.
CI containers typically don't have FUSE. Extract it with
--appimage-extract and run squashfs-root/AppRun instead.
Copy silo-bom, silo-commit, silo-info, silo-pull, and silo-push SVG
icons from mods/silo/pkg/freecad/resources/icons/ into src/Gui/Icons/
and register them in resource.qrc so they are compiled into the binary
and discoverable by BitmapFactory at runtime.
- OriginSelectorWidget: use BitmapFactoryInst::mergePixmap() instead of
BitmapFactory::mergePixmap() since BitmapFactory is a function, not a class
- OriginManager: use Console().log() instead of Console().Log() which
does not exist on ConsoleSingleton
viewDefaultOrientation is a method on View3DInventorPy (Python wrapper),
not on View3DInventorViewer (C++ viewer). Use doCommand with the Python
API, matching the pattern used in StdCmdViewHome.
SWIG 4.4.x uses runtime API version 5, which is incompatible with
conda-forge pivy 0.6.9 built with SWIG <=4.3.x (runtime version 4).
Pin to >=4.0,<4.4 to ensure matching runtime versions.
SelectModule is declared in FileDialog.h which was already included.
The separate #include "SelectModule.h" referenced a header that
doesn't exist, causing a fatal build error.
- Detect document's origin vs current (target) origin
- Route to appropriate workflow:
- Same origin: standard SaveAs
- Local → PLM: migration (handled by PLM origin)
- PLM → Local: export (handled by local origin)
- PLM → PLM: transfer (handled by target PLM origin)
This provides the infrastructure for Issue #17: Mixed origin workflows.
The actual migration/export dialogs will be implemented in the
respective origin adapters (SiloOrigin, LocalFileOrigin).
- Create OriginManagerDialog with list of configured origins
- Show connection status for remote origins
- Allow setting default origin
- Add/Edit/Remove buttons (Add/Edit show placeholder for now)
- Wire up 'Manage Origins...' button in OriginSelectorWidget
- Prevent removal of built-in local origin
Part of Issue #15: Multi-instance Silo configuration UI
- Create OriginSelectorWidget class (QToolButton with dropdown menu)
- Add OriginSelectorAction to create widget in toolbars
- Add Std_Origin command registered in CommandStd.cpp
- Add widget to File toolbar (before New/Open/Save)
- Connect to OriginManager fastsignals for origin changes
- Add Catppuccin Mocha styling for the widget
- Widget shows current origin name/icon with connection status overlay
This implements Issue #13: Origin selector toolbar widget
- Add openDocumentInteractive() and saveDocumentAsInteractive() to FileOriginPython
- Fix Console API: Warning -> warning, Error -> error in OriginManager.cpp
- These methods bridge Python origins to the new interactive document operations
Issue #10: Local filesystem origin implementation
- Add openDocumentInteractive() method to FileOrigin interface for UI-based
file opening (shows file dialog)
- Add saveDocumentAsInteractive() method for UI-based save as
- Implement LocalFileOrigin::openDocumentInteractive() with full file dialog
support, filter list building, and module handler integration
- Implement LocalFileOrigin::saveDocumentAsInteractive() delegating to
Gui::Document::saveAs()
Issue #12: Modify Std_* commands to delegate to current origin
- StdCmdNew::activated() now delegates to origin->newDocument() and sets
up view orientation for the new document
- StdCmdOpen::activated() delegates to origin->openDocumentInteractive()
with connection state checking for authenticated origins
- StdCmdSave::activated() uses document's owning origin (via findOwningOrigin)
for save, falling back to saveDocumentAsInteractive if no filename
- StdCmdSaveAs::activated() delegates to origin->saveDocumentAsInteractive()
- Updated isActive() methods to check for active document
The Std_* commands now work seamlessly with both LocalFileOrigin and
SiloOrigin. When Local origin is selected, standard file dialogs appear.
When Silo origin is selected, Silo's search/creation dialogs appear.
Import and Export commands are left unchanged as they operate on document
content rather than document lifecycle.
Closes#10, Closes#12
- build.yml: Add --force flag to tag fetch to prevent 'would clobber
existing tag' error when 'latest' tag already exists locally
- build.yml: Use github.run_id instead of github.sha for ccache keys
to ensure unique keys per workflow run while still benefiting from
restore-key prefix matching
- release.yml: Add --force flag to tag fetch commands
- release.yml: Use github.run_id for ccache keys (same reason)
- release.yml: Comment out build-macos and build-windows jobs since
no native runners are available for these platforms
- release.yml: Update publish-release to only depend on build-linux
- release.yml: Update release notes to indicate macOS/Windows builds
are not yet available
The ccache key strategy now works correctly with immutable caches:
- Save with unique key: ccache-{workflow}-{branch}-{run_id}
- Restore with prefix fallback: tries same branch first, then main
The macOS and Windows jobs require platform-specific tooling:
- macOS: dmgbuild, pyobjc-framework-Quartz for DMG creation
- Windows: NSIS, Visual Studio toolchain for installer creation
These cannot be easily cross-compiled from Linux. The jobs are
preserved as comments so they can be re-enabled when native runners
become available or when cross-compilation tooling is set up.
Complete the core toolbar icon set with 15 additional icons:
File Operations:
- document-save-as.svg - Save As with pencil indicator
- Std_SaveAll.svg - Save All with stacked disks
- Std_Import.svg - Import with arrow into document
- Std_Export.svg - Export with arrow out of document
- document-print.svg - Printer with paper
Edit Operations:
- edit-select-all.svg - Selection rectangle with corner handles
View Operations:
- zoom-fit-best.svg - Fit to view with corner arrows
- Std_ViewHome.svg - Home view with house icon
- view-fullscreen.svg - Fullscreen expand arrows
- Std_ViewScreenShot.svg - Camera for screenshots
- Std_ToggleVisibility.svg - Eye icon for visibility
- Std_Refresh.svg - Circular refresh arrow
Common Actions:
- help-browser.svg - Question mark in circle
- application-exit.svg - Door with exit arrow
- Std_DuplicateSelection.svg - Duplicate objects
All icons follow the Catppuccin Mocha design system with:
- 32x32 viewBox
- Rounded rectangle background (surface0 #313244)
- Consistent stroke widths and color usage
Ref #4
Add QApplication, QEvent, and Gui/Application.h includes that were
missing, causing build failures with undeclared identifiers for qApp,
QEvent::LanguageChange, and Gui::Application::Instance.
The previous `git fetch --tags` triggers full history negotiation
against the upstream FreeCAD-derived repo (~45k commits), causing
HTTP 504 gateway timeouts on the Gitea instance.
Replace with a depth=1 refspec fetch that pulls only tag refs
without negotiating reachable objects behind them. This is
sufficient for `git describe --tags --always` to resolve a
version string.
- Remove dead code in migrateOldTheme() that set Theme parameter for
KindredCreate.yaml, which no longer exists in the Stylesheets build
- Remove orphaned Classic.yaml and KindredCreate.yaml parameter files
from Stylesheets CMakeLists and from disk
- Remove unused includes in ThemeSelectorWidget.cpp (QApplication,
QEvent, Gui/Application.h)
fetch-depth: 0 downloads the entire FreeCAD history (45k+ commits),
causing 13+ minute checkout times. Switch to fetch-depth: 1 with a
separate lightweight tag fetch for git describe.
Gitea act_runner in Docker mode maps the runs-on label to a container
image via its config. The container: block conflicts with this by
attempting to create a nested container. Remove it so the runner's
own docker://ubuntu:24.04 mapping is used directly.
- Update .gitmodules: ztools, silo, and OndselSolver now reference
public git.kindred-systems.com URLs instead of internal Gitea
- Merge OndselSolver numerical solver with ML solver scaffolding
into unified kindred/solver repository
- Rewrite README.md for conciseness
- Add docs/CI_CD.md with full pipeline documentation
- Rework CI/CD workflows for public dockerized runners
- Add multi-platform release builds (Linux, macOS, Windows)
- Release workflow triggers on v* tags only
- Update docs/REPOSITORY_STATE.md and docs/INTEGRATION_PLAN.md
The isConvergedToNumericalLimit() method compared dxNorms->at(iterNo)
to itself instead of the previous iteration (iterNo - 1). This meant
the solver could never detect convergence improvement, causing it to
exhaust iterations on assemblies with many constraints, producing
'iterNo > iterMax' exceptions and 'grounded object moved' warnings.
Also updates silo submodule pointer.
InitGui.py: Store SiloAuthDockWidget reference on the QDockWidget to
prevent Python from garbage-collecting it while its 30-second QTimer is
still running. The lost reference caused 'QThread: Destroyed while
thread is still running' followed by abort.
ztools InitGui.py: Move addWorkbenchManipulator() call from module-level
into Initialize(), after command modules are imported. The manipulator
references ZTools_DatumCreator, ZTools_DatumManager, ZTools_EnhancedPocket,
and ZTools_RotatedLinearPattern, which don't exist until the imports run.
Also updates README.md and submodule pointers.
- Add _setup_silo_auth_panel() to dock auth widget in right panel at startup
- Update silo submodule: SSE listener, revision pull dialog, conflict detection
The Gitea runner assigns a different workspace directory hash on each
run (e.g. /var/lib/gitea-runner/.cache/act/<hash>/hostexecutor/). When
CCACHE_DIR was set to ${{ github.workspace }}/.ccache, the actions/cache
save and restore operated on a path that changed every run, making the
restored cache land in the wrong location. This caused 0% hit rate on
the second build despite the cache being saved successfully.
Fix by using a fixed path (/tmp/ccache-kindred-create) for CCACHE_DIR
and the cache action path. CCACHE_BASEDIR remains set to the workspace
so ccache stores relative source paths, making cache entries portable
across different workspace directories.
Replace the static QListWidget with a full SiloActivityPanel class
that provides:
- Search field with 300ms debounce for filtering items by name
- Type filter dropdown (All / Part / Assembly)
- Refresh button for manual reload
- QTableWidget with Part Number, Description, Type, and Updated columns
- Part Details pane that appears on row selection showing part number,
description, type, revision, last updated date, and project tags
- Open button / double-click to open items via SiloSync.open_item()
- Info button showing revision history dialog (reuses Silo_Info pattern)
- Graceful error handling for connection failures and empty results
Replace the simple open/closed disclosure arrows with full spanning
tree branch connectors that draw pipe-style lines between parent and
child items in the model tree.
New dark-theme SVGs created with Catppuccin colors:
- branch_vline_dark: vertical continuation line (#585b70)
- branch_more_dark: T-junction for mid-siblings
- branch_end_dark: L-junction for last sibling
- branch_more_closed_dark: T-junction + closed chevron (#a6adc8)
- branch_more_open_dark: T-junction + open chevron (#cdd6f4)
- branch_end_closed_dark: L-junction + closed chevron
- branch_end_open_dark: L-junction + open chevron
Updated QSS branch pseudo-selectors in KindredCreate.qss to map all
seven branch states (vline, more, end, more-closed, more-open,
end-closed, end-open) to the corresponding SVGs.
Updated ztools submodule with matching CatppuccinMocha.qss changes.
- Move CCACHE_DIR inside workspace for actions/cache compatibility
- Add CCACHE_BASEDIR for portable cache entries across workspaces
- Add cache restore step with fallback keys (branch -> main)
- Add cache save step (runs even on test/packaging failure)
- Enhance ccache diagnostics with pre/post build stats and cache size
- Release builds fall back to main branch build cache for warm starts