Register .kc as a recognized file type alongside .FCStd:
C++ changes:
- Document.cpp: checkFileName() accepts .kc extension
- Gui/Document.cpp: Save As and Save Copy dialogs include *.kc
- CommandDoc.cpp: Merge document dialog includes *.kc
- DlgProjectUtility.cpp: Project utility dialog includes *.kc
Python changes:
- FreeCADInit.py: register *.kc in import type system
- kc_format.py: DocumentObserver that preserves silo/ ZIP entries
across saves (caches before save, re-injects after save)
- InitGui.py: register kc_format observer on startup
Silo integration:
- get_cad_file_path() generates .kc paths for new files
- find_file_by_part_number() finds both .kc and .FCStd, preferring .kc
- search_local_files() lists both .kc and .FCStd files
The .kc format is a superset of .FCStd with a silo/ directory
containing Kindred platform metadata. See docs/KC_SPECIFICATION.md.
Generate 1254 Catppuccin Mocha themed placeholder SVGs covering every
icon referenced in FreeCAD's .qrc resource files that did not already
have a kindred-icons override.
Each placeholder uses:
- The standard 32x32 viewBox with #313244 surface0 background
- A dashed border in the workbench accent color (e.g. yellow for
Sketcher, blue for PartDesign, peach for BIM/Draft/Arch, etc.)
- An abbreviated label so the icon is identifiable at a glance
This brings total kindred-icons coverage from 190 to 1444 icons,
ensuring every FreeCAD icon resolves to a Catppuccin-themed version.
The Python wrapper in FreeCADGuiInit.py only accepted (name, cmds) and
did not forward the optional visibility parameter to the underlying C++
PythonWorkbench::appendToolbar which accepts 'sO|s'. This caused a
'takes 3 positional arguments but 4 were given' error when workbenches
passed a visibility string like 'Unavailable'.
- Set PACKAGE_VERSION_SUFFIX to "dev" so isDevelopmentVersion()
returns true for local and CI dev builds. Release build scripts
(build.sh, build.bat) override this to "" via cmake -D flag.
- Skip the version migration dialog for dev builds in
DlgVersionMigrator::exec(), alongside the existing
usingCustomDirectories() check.
- Set UserParameterTemplate to the KindredCreate preference pack so
first-run installs start with the Catppuccin Mocha theme defaults
instead of bare FreeCAD defaults.
The splash PNG already has the title and version baked in by
generate-splash.py, but SplashScreen::splashImage() was drawing them
again at position (6,75) which fell outside the rounded background
rectangle (starts at 30,30). Skip runtime text rendering for Kindred
Create while keeping the dev build warning.
Also switch the splash background from Catppuccin Mocha base (#1e1e2e)
to mantle (#181825) for a darker appearance and regenerate assets.
- Workbench.h: replace forward declaration of ToolBarItem with #include <Gui/ToolBarManager.h>
so that ToolBarItem::DefaultVisibility can be used as a default parameter (line 283)
- ApplicationPy.cpp: fix ReportException() → reportException() to match
the method name declared in Base::Interpreter.h
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