Update silo submodule to include the new pre-document tab for item
creation. Silo_New now opens an MDI tab instead of a blocking modal
dialog, allowing multiple items to be prepared in parallel.
- COMPONENTS.md: describe schema-driven form with runtime API fetching
- silo.md: update command description with domain/subcategory picker,
dynamic properties, live PN preview; add schema_form.py and
silo_start.py to directory structure
- configuration.md: update keyboard shortcut description
Replace Silo_New hardcoded dialog chain with a dynamic SchemaFormDialog
that builds the UI from Silo API schema data at runtime. See submodule
commit for details.
setWindowModality(2) raises TypeError in PySide6 which requires the
proper enum QtCore.Qt.WindowModal instead of a raw integer. This caused
the pull download progress dialog to fail immediately, leaving it hung.
- Replace statusBar()->setStyleSheet() with QPalette color changes
in MainWindow::showStatus() and clearStatus(). The setStyleSheet()
call triggered full style recalculation on every status message
(selection, pan, tooltip hover), causing the entire window to flicker.
- Add min-height: 24px to QListView::item in KindredCreate.qss so
Sketcher constraint and element icons (24x24) are not clipped by
the 4px padding.
- Re-apply Gui.Document.Modified fix lost in rebase
- Add traceback logging to save error handler
- Reset SSE retry counter after stable connections (>30s)
_check_pull_conflicts() called doc.IsModified() which does not exist on
App.Document. Use FreeCADGui.getDocument().Modified instead, matching
the pattern used elsewhere in silo_commands.py.
Replace QWebEngineView-based start page with a rich native Qt panel.
QWebEngineView (PySide6.QtWebEngineWidgets) is not available on
conda-forge for Qt6, so the start page was always falling back to a
bare offline widget.
Start panel (silo_start.py):
- Database Items list with search from Silo REST API
- Recent Files from FreeCAD preferences
- Real-time Activity Feed via SSE (SiloEventListener)
- Context menu: Open in Create, Open in Browser, Copy Part Number
- 'Open in Browser' button via QDesktopServices
- Catppuccin Mocha dark theme
kindred:// URL scheme:
- Desktop file registers x-scheme-handler/kindred MIME type
- MainWindow::processMessages() dispatches kindred:// URLs to Python
- handle_kindred_url() in silo_commands.py opens items by part number
- InitGui.py handles kindred:// URLs on cold start via QTimer
Closes#167
Replace duplicated server setup, deployment, migrations, and config
sections in guide/silo.md, architecture/silo-server.md, and
reference/configuration.md with cross-references to the authoritative
docs/src/silo-server/ directory.
Fix dead link in COMPONENTS.md (mods/silo/docs/ → docs/src/silo-server/).
Document the FileOriginPython bridge: registration via
FreeCADGui.addOrigin()/removeOrigin(), method dispatch pattern with GIL
management, callStringMethod/callBoolMethod/callMethod helpers, document
argument marshalling (App::Document* <-> App.Document), enum mapping
tables for OriginType and ConnectionState, required vs optional Python
interface methods with defaults, error handling (never propagates Python
exceptions into C++), icon resolution via BitmapFactory, and lifetime/
ownership model between Py::Object, _instances vector, and
OriginManager unique_ptr.
Closes#135
Document the five origin commands: activation pattern (ownership lookup
via findOwningOrigin, capability gate check), command table with IDs,
shortcuts, icons and capability gates, eType flags for undo integration,
registration in CreateOriginCommands(), and the full dispatch call chain
from C++ through FileOriginPython bridge to Python SiloOrigin.
Closes#134
Document the OriginManager singleton: origin registration/unregistration
lifecycle, document-to-origin resolution algorithm (non-local checked
first, local as fallback), explicit vs detected ownership, preference
persistence, signal catalog, and memory model.
Closes#132
- Add docs/src/reference/cpp-file-origin.md: full API reference for the
FileOrigin abstract interface, OriginType/ConnectionState enums,
LocalFileOrigin behavior, and ownership detection algorithm
- Add SUMMARY.md entry under new 'C++ API Reference' section
- Add tests/test_kindred_pure.py: 78 pure-logic unit tests covering
update_checker, datum_commands, spreadsheet_commands, silo_commands,
silo_start, and silo_origin (no FreeCAD binary required)
- Add tests/run_kindred_tests.py: two-tier test runner with CI exit codes
- Add pixi task 'test-kindred' for running addon tests
- Add CI/CD step in build.yml to run addon tests before build
Closes#130
Pins silo to silo-mod@7cf5867 which fixes:
- 'App.Document' object has no attribute 'Modified' error on every save
(uses Gui.Document.Modified instead of App.Document.Modified)
Root cause: compiler_check=mtime (default) invalidates the entire
cache on every run because pixi installs fresh compiler binaries with
new mtimes each time. The CI logs confirm 0/2579 cache hits (0.00%)
despite successfully restoring a 225MB cache.
Fix: set CCACHE_COMPILERCHECK=content to hash compiler binary content
instead of mtime. Same compiler version = same content = cache hits.
Also fix cache save strategy: use github.run_id for save keys so every
build persists its ccache objects. Previously date-based keys with
cache-hit guard meant the cache was only saved once per day — all
subsequent compilations were thrown away.
Changes:
- Add CCACHE_COMPILERCHECK=content to build.yml, release.yml, build.sh
- Use github.run_id in cache save keys (unique per run = always saves)
- Remove date-based cache key computation step
- Remove cache-hit != true guard on save step
- Add ccache-build-main- fallback to release workflow restore-keys
Node.js actions (checkout, cache, upload-artifact, download-artifact)
use their own TLS stack and don't trust the system CA store. Setting
NODE_EXTRA_CA_CERTS points Node to the system bundle which includes
the Cloudflare origin CA.
git sparse-checkout fails on individual files (README.md, ROADMAP.md)
with 'is not a directory' error. A shallow clone is simpler and the
silo repo is small enough that it's fine.
- Change runs-on from ubuntu-latest to docs
- Use internal gitea:3000 URLs for clone and push
- Remove unnecessary apt-get/CA cert steps (docs runner has access)
- Fix push to use authenticated URL via RELEASE_TOKEN
Points mods/silo to silo-mod@8937cb5 which includes the Silo-aware
start page (silo_start.py + InitGui.py override). The previous ref
pointed to a commit from the wrong repo (kindred/silo instead of
kindred/silo-mod), causing checkout failures.