Commit Graph

180 Commits

Author SHA1 Message Date
2dad658e91 Merge pull request 'feat(api): add GET /api/items/by-uuid/{uuid} endpoint' (#49) from issue-43-uuid-lookup into main
Reviewed-on: #49
2026-02-09 01:21:07 +00:00
ce37fdd169 Merge branch 'main' into issue-43-uuid-lookup 2026-02-09 01:20:59 +00:00
c557ca736c Merge pull request 'feat(web): user-selectable density mode (compact/comfortable)' (#48) from ui-density-mode into main
Reviewed-on: #48
2026-02-09 01:20:51 +00:00
6805a3c662 Merge branch 'main' into ui-density-mode 2026-02-09 01:20:44 +00:00
4324214b4d Merge pull request 'chore: repo cleanup — stale docs, redundant files, config update' (#42) from cleanup-repo-hygiene into main
Reviewed-on: #42
2026-02-09 01:20:35 +00:00
98aac5e0be Merge branch 'main' into cleanup-repo-hygiene 2026-02-09 01:20:26 +00:00
Forbes
08e84703d5 chore(docs): delete stale REPOSITORY_STATUS.md (#31)
Generated 2026-01-31, references HTML templates and 8 migrations
that are now outdated. Superseded by STATUS.md and SPECIFICATION.md.

API.md and silo-spec.md were already deleted in earlier commits.
2026-02-08 19:17:53 -06:00
Forbes
fbe4f3a36c feat(api): add POST /api/items/{partNumber}/bom/merge endpoint (#45)
Add BOM merge endpoint for syncing assembly-derived BOM entries from
FreeCAD's silo-mod plugin.

Merge rules:
- Added: entries in request but not in server BOM are auto-created
  with source='assembly'
- Quantity changed: existing entries with different quantity are
  auto-updated
- Unchanged: same part and quantity are skipped
- Unreferenced: assembly-sourced entries in server BOM but not in
  request are flagged as warnings (never auto-deleted)
- Manual entries are silently ignored in unreferenced detection

Also emits SSE 'bom.merged' event on successful merge (#46).
2026-02-08 19:15:27 -06:00
Forbes
163dc9f0f0 feat(db): add source column to relationships table (#44)
Promote BOM source from metadata JSONB to a dedicated VARCHAR(20)
column with CHECK constraint ('manual' or 'assembly').

- Add migration 012_bom_source.sql (column, data migration, cleanup)
- Add Source field to Relationship and BOMEntry structs
- Update all SQL queries (GetBOM, GetWhereUsed, GetExpandedBOM, Create)
- Update API response/request types with source field
- Update CSV/ODS export to read e.Source instead of metadata
- Update CSV import to set source on relationship directly
- Update frontend types and BOMTab to use top-level source field
2026-02-08 18:45:41 -06:00
Forbes
e5ddb30a4a feat(api): add GET /api/items/by-uuid/{uuid} endpoint
Closes #43

Adds a new read-only endpoint to resolve a Silo item UUID to its full
ItemResponse. Used by silo-mod to resolve FreeCAD document SiloUUID
properties to part numbers during BOM sync.

- Reuses existing ItemRepository.GetByID() (items.id is the stable UUID)
- Returns 404 for archived items
- Registered in viewer-accessible route group (no editor role required)
2026-02-08 18:37:33 -06:00
Forbes
cb88b3977c feat(web): add user-selectable density mode with compact/comfortable toggle
Implements #17, #18, #19, #20, #21

- Add CSS custom properties for density-dependent spacing (--d-* vars)
  in theme.css with comfortable (default) and compact modes
- Create useDensity hook with localStorage persistence and DOM attribute sync
- Add FOUC prevention in main.tsx (sync density before first paint)
- Create shared PageFooter component merging stats + pagination
- Refactor AppShell to flex layout with density toggle button (COM/CMP)
- Consolidate inline pagination from ItemsPage/AuditPage into PageFooter
- Delete FooterStats.tsx (replaced by PageFooter)
- Replace all hardcoded padding/font/gap values in ItemTable, AuditTable,
  ItemsToolbar, and AuditToolbar with var(--d-*) references

Comfortable mode is already tighter than the previous hardcoded values.
Compact mode reduces further for power-user density.
2026-02-08 18:35:25 -06:00
Forbes
de8370481f chore: fix stale docs, add read_only to config example
- Update COMPONENT_AUDIT.md: replace htmx reference with React SPA
- Add server.read_only to config.example.yaml and CONFIGURATION.md
2026-02-08 16:07:05 -06:00
Forbes
fbe80d6a2f chore: delete stale REPOSITORY_STATUS.md
Generated Jan 31, references HTML templates and 8 migrations.
Superseded by STATUS.md, SPECIFICATION.md, and frontend-spec.md.
2026-02-08 16:03:55 -06:00
2b7a9ae73a Merge pull request 'main' (#41) from main into production
Reviewed-on: #41
2026-02-08 22:02:18 +00:00
80b334f308 Merge branch 'production' into main 2026-02-08 22:02:12 +00:00
741df1a1ba Merge pull request 'feat: SSE endpoint and server mode system (#38, #39)' (#40) from feat-38-39-sse-server-mode into main
Reviewed-on: #40
2026-02-08 22:00:11 +00:00
98e9898ae9 Merge branch 'main' into feat-38-39-sse-server-mode 2026-02-08 22:00:01 +00:00
Forbes
3d7302f383 feat: add SSE endpoint and server mode system
Add server-sent events at GET /api/events for live mutation
notifications. Add server mode (normal/read-only/degraded) exposed
via /health, /ready, and SSE server.state events.

New files:
- broker.go: SSE event hub with client management, non-blocking
  fan-out, ring buffer history for Last-Event-ID replay, heartbeat
- servermode.go: mode state machine with periodic MinIO health
  check and SIGUSR1 read-only toggle
- sse_handler.go: HTTP handler using http.Flusher and
  ResponseController to disable WriteTimeout for long-lived SSE
- broker_test.go, servermode_test.go: 13 unit tests

Modified:
- handlers.go: Server struct gains broker/serverState fields,
  Health/Ready include mode and sse_clients, write handlers
  emit item.created/updated/deleted and revision.created events
- routes.go: register GET /api/events, add RequireWritable
  middleware to all 8 editor-gated route groups
- middleware.go: RequireWritable returns 503 in read-only mode
- csv.go, ods.go: emit bulk item.created events after import
- storage.go: add Ping() method for health checks
- config.go: add ReadOnly field to ServerConfig
- main.go: create broker/state, start background goroutines,
  SIGUSR1 handler, graceful shutdown sequence

Closes #38, closes #39
2026-02-08 15:59:23 -06:00
9a25c72b11 Merge pull request 'main' (#36) from main into production
Reviewed-on: #36
2026-02-08 21:25:02 +00:00
2d45042cdb Merge branch 'production' into main 2026-02-08 21:24:56 +00:00
c4572af1f0 Merge pull request 'docs: update README.md for React SPA and current state' (#35) from issue-25-readme-update into main
Reviewed-on: #35
2026-02-08 21:24:00 +00:00
15e71d936e Merge pull request 'fix: render project tags as strings, not objects' (#34) from fix-33-project-tags-render into main
Reviewed-on: #34
2026-02-08 21:23:19 +00:00
Forbes
c49f8f78c9 fix: render project tags as strings, not objects
The /api/items/{pn}/projects endpoint returns Project objects
({id, code, name, created_at}), but MainTab typed them as string[].
React error #31 was thrown when trying to render the object as a
child node.

Change itemProjects state from string[] to Project[] and use
proj.code in all rendering and comparison logic.

Closes #33
2026-02-08 15:11:20 -06:00
21227b7586 Merge pull request 'docs: update all documentation for React SPA migration' (#32) from issue-26-31-doc-updates into main
Reviewed-on: #32
2026-02-08 20:13:36 +00:00
Forbes
e3da072229 docs: update SPECIFICATION.md for React SPA and current endpoints
- Replace htmx with React SPA in architecture diagram and tech stack
- Rewrite Section 6 (Web Interface) with React SPA architecture,
  pages table, and design patterns
- Update Section 11.1: remove old web UI routes, add /api/auth/config,
  /api/uploads/presign, file attachment endpoints, thumbnail endpoint
- Fix endpoint count: 76 → 75 (actual registered routes)
- Fix migration count: 10 → 11
- Add file attachments to MVP checklist
- Update test coverage note (9 test files exist)

Closes #26
2026-02-08 14:11:12 -06:00
Forbes
eb43fbb9ec docs: update frontend-spec.md for completed migration
- Mark Phase 4 (remove Go templates) as complete
- Update architecture: SPA serves at / via NotFound handler
- Update overview to past tense (migration is done)
- Update file/line counts (~40 files, ~7,600 lines)
- Mark backend changes 1-3 and 5 as implemented
- Reorganize remaining work section

Closes #30
2026-02-08 14:07:38 -06:00
Forbes
5fd499fef3 docs: update GAP_ANALYSIS.md for current state
- Remove silo-spec.md from doc table (deleted)
- Add CONFIGURATION.md, AUTH.md, AUTH_USER_GUIDE.md, frontend-spec.md to doc table
- Mark Configuration Reference as complete
- Fix audit_handlers.go filename (was handlers_audit.go)
- Update Appendix A file structure to match actual codebase
- Fix future migration numbering (012/013, since 011 is taken)
- Add file attachment endpoints to Appendix B
- Remove completed Documentation Overhaul from medium-term

Closes #28
2026-02-08 14:06:18 -06:00
Forbes
adf64d722c docs: update ROADMAP.md for React SPA and current counts
- Replace all htmx references with React SPA
- Update endpoint count from 74 to 75 (6 occurrences)
- Update migration count from 10 to 11
- Update test file count from 1 to 9
- Fix comparison matrix web access entry

Closes #29
2026-02-08 14:05:08 -06:00
Forbes
124eac1391 docs: update STATUS.md for current state
- Update migration count to 11, add 011_item_files.sql
- Update endpoint count from 74 to 75
- Replace htmx reference with React SPA
- Add file attachments as complete feature
- Update test file count from 1 to 9
- Update date to 2026-02-08

Closes #27
2026-02-08 14:04:26 -06:00
Forbes
e61df2db04 docs: update README.md for React SPA and current state
- Replace htmx reference with React SPA (Vite + TypeScript, Catppuccin Mocha)
- Update component tree: add web/ subtree, testutil package, remove templates
- Correct endpoint count (75) and migration count (11)
- Expand documentation table from 6 to 10 entries (add CONFIGURATION.md,
  GAP_ANALYSIS.md, COMPONENT_AUDIT.md, frontend-spec.md)

Closes #25
2026-02-08 14:00:50 -06:00
d504de84a7 Merge pull request 'feat: production React SPA, file attachments, and UI improvements' (#24) from issue-16-remove-max-width into main
Reviewed-on: #24
2026-02-08 19:47:00 +00:00
Forbes
1b73a1e070 docs: add workflow integration mention to overview 2026-02-08 13:45:48 -06:00
d3b8fca660 Merge pull request 'main' (#23) from main into production
Reviewed-on: #23
2026-02-07 21:01:36 +00:00
11a3944270 Merge pull request 'issue-16-remove-max-width' (#22) from issue-16-remove-max-width into main
Reviewed-on: #22
2026-02-07 21:00:47 +00:00
Forbes
888cebe875 feat(web): remove max-width constraint and reduce main padding
Remove maxWidth: 1400 and margin: 0 auto from AppShell main container.
Reduce padding from 2rem to 1rem so content fills available browser width.
Adjust height calc in ItemsPage and AuditPage from 80px to 64px offset
to account for reduced top padding.

Closes #16
2026-02-07 14:51:55 -06:00
Forbes
50923cf56d feat: production release with React SPA, file attachments, and deploy tooling
Backend:
- Add file_handlers.go: presigned upload/download for item attachments
- Add item_files.go: item file and thumbnail DB operations
- Add migration 011: item_files table and thumbnail_key column
- Update items/projects/relationships DB with extended field support
- Update routes: React SPA serving from web/dist, file upload endpoints
- Update auth handlers and middleware for cookie + bearer token auth
- Remove Go HTML templates (replaced by React SPA)
- Update storage client for presigned URL generation

Frontend:
- Add TagInput component for tag/keyword entry
- Add SVG assets for Silo branding and UI icons
- Update API client and types for file uploads, auth, extended fields
- Update AuthContext for session-based auth flow
- Update LoginPage, ProjectsPage, SchemasPage, SettingsPage
- Fix tsconfig.node.json

Deployment:
- Update config.prod.yaml: single-binary SPA layout at /opt/silo
- Update silod.service: ReadOnlyPaths for /opt/silo
- Add scripts/deploy.sh: build, package, ship, migrate, start
- Update docker-compose.yaml and Dockerfile
- Add frontend-spec.md design document
2026-02-07 13:35:22 -06:00
Forbes
d61f939d84 feat(web): redesign CreateItemPane with two-column layout
Rewrite CreateItemPane from single-column scrolling form to a
two-column CSS Grid layout (1fr 280px):

Left column (scrollable form):
- Identity section: Type select, Description input, CategoryPicker
- Sourcing section: Sourcing Type, Standard Cost, Sourcing Link
- Details section: Long Description textarea, Projects TagInput
- Category Properties: dynamic fields from schema (2-column sub-grid)
- Section headers with uppercase labels and horizontal dividers

Right column (sidebar):
- Metadata: auto-assigned revision ('A'), created by (current user)
- Attachments: FileDropZone with presigned upload integration
- Thumbnail: 4:3 preview box, click to upload image

Submission flow:
1. POST /api/items with form data
2. Associate uploaded attachments via POST /api/items/{pn}/files
3. Set thumbnail via PUT /api/items/{pn}/thumbnail
4. File failures are non-blocking (item already created)

Integrates: CategoryPicker (#13), TagInput (#11), FileDropZone (#14),
useFileUpload presigned upload hook (#12)

Closes #15
2026-02-07 10:15:03 -06:00
Forbes
3358e7dd1c feat(web): add FileDropZone component with upload progress
New files:
- web/src/hooks/useFileUpload.ts: presigned upload hook that gets
  a presigned PUT URL from POST /api/uploads/presign then uploads
  via XMLHttpRequest for progress tracking
- web/src/components/items/FileDropZone.tsx: drag-and-drop file
  upload zone with file list, type-colored badges (CAD/PDF/IMG),
  progress bars, and remove buttons

Features:
- Dashed border drop zone with drag-over visual feedback
- Click to browse or drag files to add
- File type detection by extension with colored badges
- Upload progress bar (2px mauve) during active uploads
- Error state display per file
- Configurable accepted file types via accept prop

Closes #14
2026-02-07 10:13:18 -06:00
Forbes
6f357c2199 feat(web): add CategoryPicker searchable selector component
Replace the flat <select> dropdown for category selection in
CreateItemPane with a searchable, scrollable CategoryPicker component.

New files:
- web/src/hooks/useCategories.ts: fetches and caches category enum
  values from GET /api/schemas/kindred-rd, extracts the category
  segment values map
- web/src/components/items/CategoryPicker.tsx: scrollable list with
  search input filtering by code and description, selected item
  highlighted with mauve, breadcrumb showing current selection

Modified:
- web/src/components/items/CreateItemPane.tsx: replaced <select>
  with <CategoryPicker>, uses useCategories hook instead of
  fetching full schema inline

Closes #13
2026-02-07 10:11:59 -06:00
Forbes
cf02ce4231 feat(web): implement Component Audit UI with inline editing
Build the full Audit page replacing the minimal stub with:

Phase 1 - Audit Overview:
- useAudit hook with server-side filtering by project, category,
  tier (mapped to min_score/max_score), sort, and pagination
- AuditSummaryBar: horizontal stacked bar with tier counts, colored
  segments (critical/low/partial/good/complete), clickable to filter
- AuditToolbar: project and category dropdowns, sort selector,
  layout toggle
- AuditTable: sortable table with score badge (colored by tier),
  part number, description, category, sourcing type, missing count
- SplitPanel integration (reused from items) with persistent layout

Phase 2 - Inline Edit Panel:
- AuditDetailPanel: split-panel detail view with field-by-field
  breakdown from GET /api/audit/completeness/{pn}
- Fields grouped into Required, Procurement, Category Properties,
  and Computed sections
- Color-coded left border per field: green if filled, red if empty
- Critical fields (weight >= 3) marked with asterisk
- Inline editing with debounced auto-save on blur (500ms)
- Item-level fields saved via PUT /api/items/{pn}
- Property fields saved via PUT with merged properties + new revision
- Score progress bar updates live after each save
- Computed fields (has_bom) shown read-only

All components use inline CSS with Catppuccin Mocha theme variables,
matching the existing frontend patterns.

Closes #5
2026-02-07 08:48:50 -06:00
Forbes
d08b178466 test: add comprehensive test suite for backend
Add 56 tests covering the core backend packages:

Unit tests (no database required):
- internal/partnum: 7 tests for part number generation logic
  (sequence, format templates, enum validation, constants)
- internal/schema: 8 tests for YAML schema loading, property
  merging, validation, and default application

Integration tests (require TEST_DATABASE_URL):
- internal/db/items: 10 tests for item CRUD, archive/unarchive,
  revisions, and thumbnail operations
- internal/db/relationships: 10 tests for BOM CRUD, cycle detection,
  self-reference blocking, where-used, expanded/flat BOM
- internal/db/projects: 5 tests for project CRUD and item association
- internal/api/bom_handlers: 6 HTTP handler tests for BOM endpoints
  including flat BOM, cost calculation, add/delete entries
- internal/api/items: 5 HTTP handler tests for item CRUD endpoints

Infrastructure:
- internal/testutil: shared helpers for test DB pool setup,
  migration runner, and table truncation
- internal/db/helpers_test.go: DB wrapper for integration tests
- internal/db/db.go: add NewFromPool constructor
- Makefile: add test-integration target with default DSN

Integration tests skip gracefully when TEST_DATABASE_URL is unset.
Dev-mode auth (nil authConfig) used for API handler tests.

Fixes: fmt.Errorf Go vet warning in partnum/generator.go

Closes #2
2026-02-07 01:57:10 -06:00
Forbes
3704adb584 docs: document flat BOM and assembly costing endpoints
Add section 8.4 to SPECIFICATION.md describing the flat BOM flattening
and assembly cost roll-up endpoints with example request/response JSON.

- GET /api/items/{pn}/bom/flat — consolidated leaf parts with
  rolled-up quantities and cycle detection
- GET /api/items/{pn}/bom/cost — per-line extended costs and total
  assembly cost using standard_cost

Update endpoint count from 74 to 76 in SPECIFICATION.md and README.md.
Add checklist entries for flat BOM and assembly costing features.
2026-02-07 01:35:56 -06:00
Forbes
a4f32b2b49 feat(web): migrate Items page to React with UI improvements
Phase 2 of frontend migration (epic #6, issue #8).

Rebuild the Items page (4,243 lines of vanilla JS) as 16 React
components with full feature parity plus UI improvements.

UI improvements:
- Footer stats bar (28px fixed bottom) replacing top stat cards
- Compact row density (28-32px) with alternating background colors
- Right-click column configuration via reusable ContextMenu component
- Resizable horizontal/vertical split panel layout (persisted)
- In-pane CRUD forms replacing modal dialogs (Infor-style)

Components (web/src/components/items/):
- ItemTable: sortable columns, alternating rows, column config
- ItemsToolbar: search with scope (All/PN/Desc), filters, actions
- SplitPanel: drag-resizable horizontal/vertical container
- FooterStats: fixed bottom bar with reactive item counts
- ItemDetail: 5-tab detail pane (Main, Properties, Revisions, BOM,
  Where Used) with header actions
- MainTab: metadata, inline project tag editor, file download
- PropertiesTab: form/JSON dual-mode editor, save as new revision
- RevisionsTab: comparison diff, status management, rollback
- BOMTab: inline CRUD, cost calculations, CSV export
- WhereUsedTab: parent assemblies table
- CreateItemPane: in-pane form with schema category properties
- EditItemPane: in-pane edit form for basic fields
- DeleteItemPane: in-pane confirmation with warning
- ImportItemsPane: CSV upload with dry-run validation flow

Shared components:
- ContextMenu: positioned right-click menu with checkbox support

Hooks:
- useItems: items fetching with search, filters, pagination, debounce
- useLocalStorage: typed localStorage state hook

Extended api/types.ts with request/response types for search, BOM,
revisions, CSV import, schema properties, and revision comparison.
2026-02-06 17:21:18 -06:00
Forbes
118c32dc14 feat(web): scaffold React + Vite + TypeScript frontend
Phase 1 of frontend migration (epic #6, issue #7).

Project setup (web/):
- React 19, React Router 7, Vite 6, TypeScript 5.7
- Catppuccin Mocha theme CSS variables matching existing Go templates
- Vite dev proxy to Go backend at :8080 for /api/*, /login, /logout,
  /auth/*, /health, /ready

Shared infrastructure:
- api/client.ts: typed fetch wrapper (get/post/put/del) with 401
  redirect and credentials:include for session cookies
- api/types.ts: TypeScript interfaces for all API response types
  (User, Item, Project, Schema, Revision, BOMEntry, Audit, Error)
- context/AuthContext.tsx: AuthProvider calling GET /api/auth/me
- hooks/useAuth.ts: useAuth() hook exposing user/loading/logout

UI shell:
- AppShell.tsx: header nav matching current Go template navbar
  (Items, Projects, Schemas, Audit, Settings) with role badges
  (admin=mauve, editor=blue, viewer=teal) and active tab highlighting
- LoginPage: redirects to Go-served /login during transition
- Placeholder pages: Items, Projects, Schemas fetch from API and
  display data in tables; Audit shows summary stats; Settings shows
  current user profile

Go server changes:
- routes.go: serve web/dist/ at /app/* with SPA index.html fallback
  (only activates when web/dist/ directory exists)
- .gitignore: web/node_modules/, web/dist/
- Makefile: web-install, web-dev, web-build targets
2026-02-06 16:19:52 -06:00
Forbes
5f46efc8ed docs: add comprehensive configuration reference
Closes #4 — Document all config.yaml options.

New file: docs/CONFIGURATION.md covering all 7 config sections:
- Server: bind address, port, read/write timeouts
- Database: host, port, name, user, password, SSL mode, pool sizes
- Storage: MinIO endpoint, bucket, access/secret keys, SSL, region
- Schemas: directory path for part number schema YAML files
- FreeCAD: command path for server-side thumbnail generation
- Odoo: URL, database, API key, default company, field mappings
- Auth: enabled flag, session secret/lifetime, JWT secret,
  CORS origins, local/LDAP/OIDC provider configuration

Includes all 12 environment variable overrides, SSL mode
guidance, and 4 deployment example snippets (minimal, Docker
Compose with env vars, LDAP + OIDC, production hardened).
2026-02-06 16:19:32 -06:00
Forbes
41e99c1581 docs: rewrite README with complete project overview
Closes #3 — README now reflects the full scope of Silo.

- Updated subtitle: 'structured item database and part lifecycle server'
- 10 overview bullets covering all major features
- Complete component tree (internal/, cmd/, migrations/, docs/)
- Docker Compose quick start with config.yaml example
- Authentication section: local, LDAP/FreeIPA, OIDC/Keycloak, API tokens
- Client integrations section linking silo-mod and silo-calc repos
- Documentation table linking all docs/*.md files
2026-02-06 16:19:22 -06:00
Forbes
60fa48285d refactor: remove LibreOffice Calc extension from server repo
Move pkg/calc/ to its own repository (19 files, ~4,600 lines):
- silo_calc_component.py, sync_engine.py, dialogs.py, push/pull
- AI client, completion wizard, settings, sheet format
- Addons.xcu, manifest.xml, description.xml, tests

Replace docs/CALC_EXTENSION.md with redirect to silo-calc repo
and reference to server-side ODS export endpoints.

The Calc extension now lives at:
https://git.kindred-systems.com/kindred/silo-calc
2026-02-06 16:19:15 -06:00
Forbes
503c3d1831 refactor: remove FreeCAD workbench from server repo
Closes #2 — FreeCAD client code belongs in silo-mod, not the server.

Remove pkg/freecad/ (16 files, ~4,500 lines):
- InitGui.py, Init.py, silo_commands.py, silo_origin.py
- package.xml manifest, 10 SVG icons
- HolePattern.FCMacro

The FreeCAD workbench now lives at:
https://git.kindred-systems.com/kindred/silo-mod
2026-02-06 16:19:07 -06:00
Forbes
004dc9aef0 docs: update stale documentation to reflect current state
Closes #1 — Bring documentation in line with implemented features.

GAP_ANALYSIS.md:
- Mark auth system and audit log gaps as Implemented
- Replace FreeCAD Integration section with Client Integration (silo-mod)
- Update Phase 2 sections: auth and audit marked COMPLETE
- Update Appendix A file structure and Appendix B endpoints

STATUS.md:
- Update client integrations to reference silo-mod and silo-calc repos
- Update unit tests row to remove pkg/calc/tests reference

ROADMAP.md:
- Update executive summary with links to silo-mod and silo-calc
- Update unit tests row, CAD gap section references

SPECIFICATION.md:
- Update architecture overview to reference silo-mod and silo-calc
- Update Section 5 Client Integration with both repos

REPOSITORY_STATUS.md:
- Remove Python/FreeCAD row from language stats, update totals
2026-02-06 16:18:58 -06:00
Forbes
31586755b7 feat(origin): add interactive open/saveAs methods to SiloOrigin
Add openDocumentInteractive() and saveDocumentAsInteractive() methods
to support the updated FileOrigin interface from Issue #10/#12.

- openDocumentInteractive: Delegates to Silo_Open command for search dialog
- saveDocumentAsInteractive: Triggers new item creation form for Save As

These methods enable the Std_* commands in FreeCAD to delegate to
SiloOrigin when Silo is the active origin.
2026-02-05 14:02:07 -06:00