Add branch = main to mods/silo and mods/ztools in .gitmodules.
Add branch = main to silo-client in mods/silo/.gitmodules.
Enables 'git submodule update --remote' to auto-advance Kindred
submodules to latest main. Third-party deps (GSL, googletest,
AddonManager) remain pinned.
Also updates submodule pointers to latest main commits.
- Add Spreadsheet color preferences to KindredCreate.cfg using FCText
entries (TextColor, AliasedCellBackgroundColor, PositiveNumberColor,
NegativeNumberColor) matching the C++ GetASCII() reader in SheetModel.cpp
- Remove CatppuccinMocha install directive from CMakeLists.txt
- Update ztools submodule: theme.py deleted, CatppuccinMocha preference
pack removed, package.xml cleaned up
The previous apply_spreadsheet_colors() in ztools was a no-op: it called
SetUnsigned() but the Spreadsheet C++ reads GetASCII() — different param
types in FreeCAD's parameter system. Now properly fixed via preference pack.
Closes#278
Documentation updates:
- KNOWN_ISSUES.md: correct #6 (datum handling), resolve#10
(delete_bom_entry) and #11 (silo icons), fix stale formatDate
reference, mark completed next steps, add new next steps.
- INTEGRATION_PLAN.md: correct ztools SDK migration claim.
kc_format.py (#277):
- New _manifest_enrich_hook: populates part_uuid from SiloItemId and
silo_instance from Silo API URL on every .kc save.
- New update_manifest_fields(): public API to update manifest fields
in an already-saved .kc ZIP (used for post-upload revision_hash).
mods/silo submodule (#276):
- New bom_sync.py extraction engine.
- Post-commit hooks for BOM sync and manifest revision update.
- SSE bom_merged signal + Activity pane handler.
- merge_bom_json client method (forward-looking).
Refs: #276, #277
Wire live data fetching, SSE subscriptions, and server write-back into
the History, Metadata, and Dependency viewer widgets.
Changes:
- Add server integration helpers (_init_server, _is_online,
_get_part_number, offline banner) with lazy silo_commands import
- SiloHistoryViewer: Refresh button fetches live revisions via
SiloClient.get_revisions(); SSE revision_created auto-refreshes
- SiloMetadataEditor: Save pushes to server (update_metadata,
patch_lifecycle, patch_tags); SSE item_updated refreshes form
when no local edits pending; offline banner
- SiloDependencyTable: Server-side UUID resolution via
resolve_dependencies(); Download button for unresolved items;
Refresh re-checks status; three-state icons (resolved/
downloadable/missing)
- All viewers show 'Offline — showing cached data' banner when
disconnected and disable server-dependent controls
Bump silo submodule to track new silo-client API methods:
get_metadata, update_metadata, patch_lifecycle, patch_tags,
resolve_dependencies (silo-client PR #19)
Closeskindred/silo-mod#43
Add 10 SVG placeholder icons copied from existing silo action icons.
These provide immediate visual feedback in the document tree while
proper Catppuccin-themed icons are designed later.
Icons: silo-group, silo-manifest, silo-metadata, silo-history,
silo-approvals, silo-dependencies, silo-job, silo-macro,
silo-jobs-group, silo-macros-group
Also adds install(DIRECTORY) rule for resources/icons/ in CMakeLists.
Closes#42
Add four viewer widgets for the remaining Silo tree node types:
- SiloApprovalsViewer: ECO approval status cards with colored status
icons, state badge, and Open in Silo Web UI button
- SiloDependencyTable: QTableView with resolution status (checks open
documents for matching part_uuid)
- SiloJobViewer: YAML source editor with Edit/Lock toggle, monospace
font, dirty tracking, and unsaved-changes guard
- SiloMacroEditor: Python source editor with Run Now (exec in FreeCAD
context), Save button, and dirty tracking
Also extends the viewer factory with prefix-based routing for
silo/jobs/*.yaml and silo/macros/*.py entries.
Closes#41
Add SiloHistoryViewer widget that opens in an MDI subwindow when the
user double-clicks the History node in the Silo tree. Displays revision
cards newest-first with revision number, Catppuccin-themed lifecycle
status badges, author, timestamp, and commit comment.
Changes:
- silo_viewers.py: SiloHistoryViewer with revision card layout,
status badge QSS, scroll area, empty-history placeholder
Closes#40
Add SiloMetadataEditor widget that opens in an MDI subwindow when the
user double-clicks the Metadata node in the Silo tree. Supports editing
lifecycle state, tags (add/remove chips), and schema-defined fields with
type-inferred widgets (QCheckBox, QDoubleSpinBox, QLineEdit).
Changes:
- silo_viewers.py: SiloMetadataEditor with dirty tracking, Save/Reset
buttons, unsaved-changes close guard, and tag chip management
- silo_objects.py: mark_dirty()/is_dirty()/clear_dirty() on proxy
- kc_format.py: fix entries=None before hooks; _metadata_save_hook
writes dirty RawContent back to silo/ cache on document save
Closes#39
Add SiloManifestViewer widget that opens in an MDI subwindow when the
user double-clicks the Manifest node in the Silo tree. Displays all
manifest.json fields in a read-only QFormLayout with copy buttons for
Part UUID and Silo Instance.
New files:
- silo_viewers.py: SiloManifestViewer widget + create_viewer_widget()
factory with _VIEWER_REGISTRY for future viewer classes
Modified files:
- silo_viewproviders.py: doubleClicked() wired to open MDI subwindow
with deduplication via widget objectName()
- CMakeLists.txt: add silo_viewers.py to install list
Closes#38
Add document tree infrastructure that creates Silo metadata nodes when
a .kc file is opened. Nodes appear under a "Silo" group and represent
the silo/ ZIP directory entries (manifest, metadata, history, etc.).
New files:
- silo_objects.py: SiloViewerObject proxy with Transient properties
- silo_viewproviders.py: SiloViewerViewProvider with icon stubs
- silo_tree.py: SiloTreeBuilder with conditional node creation
- silo_document.py: SiloDocumentObserver singleton + registration
Modified files:
- kc_format.py: pre_reinject hook system for silo/ entry mutation
- InitGui.py: 600ms timer registration for document observer
- CMakeLists.txt: install list for 4 new Python files
Closes#37
Three tests for the loadPixmap() DPI fix:
- pixmapFromSvg(content, size) renders at the exact requested size
- getMaximumDPR() returns >= 1.0
- pixmap() loaded from an SVG file has correct devicePixelRatio and
physical size matching 64 * DPR
loadPixmap() rendered all SVGs at a hardcoded 64x64 pixels regardless of
display DPI. On HiDPI screens, Qt then downscaled these low-resolution
pixmaps to the toolbar icon size, producing chunky/aliased icons.
Multiply the render size by getMaximumDPR() and tag the resulting pixmap
with the correct devicePixelRatio, matching the pattern already used in
pixmapFromSvg(const char* name, QSizeF size). This ensures SVGs are
rasterized at the physical resolution needed for crisp display.
The SDK migration (#250) moved kindred_sdk into mods/sdk/ but the
test file was not updated with the new path, causing
ModuleNotFoundError when importing kindred_sdk.
Route platform API calls through kindred_sdk wrappers:
ZTools:
- Replace hardcoded MOCHA dict with kindred_sdk.get_theme_tokens()
- Add sdk dependency to package.xml
Silo:
- Replace FreeCADGui.registerEditingOverlay() with kindred_sdk.register_overlay()
- Replace FreeCADGui.addOrigin()/removeOrigin() with kindred_sdk wrappers
- Replace hardcoded _MOCHA palette subset with kindred_sdk.get_theme_tokens()
- Add sdk dependency to package.xml
Create module:
- Replace dock panel boilerplate with kindred_sdk.register_dock_panel()
Behavior is identical before and after — this is a refactor only.
Closes#250
Add mods/sdk/ with the kindred_sdk Python package providing a stable
API layer for addon integration with Kindred Create platform features.
Modules:
- context: editing context/overlay registration wrappers
- theme: YAML-driven palette system (Catppuccin Mocha)
- origin: FileOrigin registration helpers
- dock: deferred dock panel registration
- compat: version detection utilities
The SDK loads at priority 0 (before all other addons) via the existing
manifest-driven loader. Theme colors are defined in a single YAML
palette file instead of hardcoded Python dicts, enabling future theme
support and eliminating color duplication across addons.
Closes#249
Add FreeCAD.getAddonRegistry() function for runtime addon introspection.
Changes to addon_loader.py:
- Add contexts field to AddonManifest for tracking context IDs
- Add register_context() method for addons to declare contexts at runtime
- Add contexts() method returning {context_id: [addon_names]} mapping
- Parse <contexts> element from <kindred> in package.xml
- Add getAddonRegistry() function returning the registry singleton
Changes to Init.py:
- Expose getAddonRegistry as FreeCAD.getAddonRegistry after loading
Usage:
registry = FreeCAD.getAddonRegistry()
registry.get('ztools') # AddonManifest for ztools
registry.loaded() # list of loaded addons
registry.is_loaded('silo') # True/False
registry.contexts() # {context_id: [addon_names]}
Closes#253
Add <kindred> elements to ztools (priority=50) and silo (priority=60)
package.xml files declaring min_create_version, load_priority,
pure_python, and context metadata.
Fix addon_loader.py topological sort to use level-by-level processing
with (priority, name) sorting within each level, replacing
static_order() which did not guarantee deterministic ordering.
Add docs/src/development/package-xml-schema.md documenting the full
field reference, schema example, and backward compatibility notes.
Closes#252