Establishes the framework's foundation as a multi-site adoptable platform. ADRs (migrations/adr/): - ADR-001 (ACCEPTED): Asset is the platform contract; Machine retires. Three relationship types (partof, controls, connectedto) with free-text label, position-resolution chain (asset > related > location), hierarchical locations, sibling-bay propagation. - ADR-002 (ACCEPTED): Plugin contract semver via __contract_version__. - ADR-003 (ACCEPTED): Hybrid plugin distribution (in-tree bundled + filesystem-based external). - ADR-004 (ACCEPTED): Per-site instances, not multi-tenant. - ADR-005 (ACCEPTED): Equipment plugin (manufacturing) split from measuringtools plugin (metrology). Subtype-table pattern for protocol data (FOCAS, CLM, MTConnect). - ADR-006 (ACCEPTED): Plugin collector contract via get_collector_schema hook with API-key auth and identity-based upsert. Naming convention v1 (CONTRIBUTING.md): - DB tables/columns: lowercase concatenated, no underscores or dashes - DB-mirrored Python/JS variables match column names exactly; pure code follows host-language convention (PEP 8 / camelCase) - Closed acronym allowlist (universal + shop-floor domain), banned shorthand list with suffix exception (printers_bp etc allowed) - Plain ASCII everywhere: chat, docs, comments, string literals Style enforcement (scripts/check-naming-and-style.sh): - Pre-commit-runnable check script: non-ASCII, banned shorthand, snake_case DB names, snake_case API params in frontend - Fixes 14 violations across 11 files (Unicode arrows, snake_case params, ctx -> canvasContext, res -> response, req -> request_obj) Project state (CLAUDE.md, README.md, frontend/CLAUDE.md): - De-staled CLAUDE.md to reflect actual current state - README unifies DB story (MySQL canonical, SQLite test-only) - frontend/CLAUDE.md points at root convention Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5.1 KiB
5.1 KiB
ShopDB Flask Project
Modern rewrite of the classic-ASP shopdb. Built as a framework so sister GE Aerospace sites can adopt it. Plugin system is the product.
Database
- Active database:
shopdb_flask(MySQL, asset-based schema) - Legacy database:
shopdb(Classic ASP schema, used only for one-time data import viascripts/import_from_mysql.py) - Connection:
.envfile. See.env.example.
Architecture decisions live in migrations/adr/. Read those before making schema or contract changes.
- ADR-001: Asset model is the platform contract (Machine retires) - ACCEPTED
- ADR-002: Plugin contract versioning (semver) - ACCEPTED
- ADR-003: Plugin distribution model (in-tree bundled + filesystem-based external) - ACCEPTED
- ADR-004: Deployment topology (per-site instances, not multi-tenant) - ACCEPTED
- ADR-005: Equipment vs measuringtools plugin scope - ACCEPTED
- ADR-006: Plugin collector contract pattern - ACCEPTED
Coding convention
CONTRIBUTING.md defines naming rules (DB tables, columns, Python, JS, Vue, API). Pre-commit hook at scripts/check-naming-and-style.sh enforces them. Read CONTRIBUTING.md before naming any new identifier.
Current state (as of 2026-05-08)
Wired in
- App factory pattern, Flask 3 + SQLAlchemy + Flask-Migrate + JWT + Marshmallow + CORS + Caching
- 6 plugins: computers, equipment, network, notifications, printers, usb
- Plugin contract:
BasePluginABC,PluginMeta, registry, dependency-aware loader - JWT auth with refresh tokens, audit logging, system settings, user management
- Frontend: Vue 3 + Pinia + Vite, dynamic plugin routing, dark mode default
- Search across all plugins via
get_searchable_fieldshook - Asset relationships (cross-plugin)
In progress / partial
- Dual model coexistence: legacy
Machineand newAssetboth live. ADR-001 settles direction (Asset wins). Migration plan is the next concrete deliverable. - Plugin verification: 6 plugins follow
BasePlugininterface but no contract test asserts compliance. Skillenforcing-plugin-contractand the contract test suite are pending. - Tests: hollow.
tests/conftest.pyexists but uses Flask-SQLAlchemy 2.x patterns that error on 3.x. No actual test files. Skillpinning-flask-behaviorcovers the rebuild.
Pending
- Alembic versions directory exists (
migrations/versions/) but is empty. No migrations have been generated yet. Runflask db initis partial; needflask db migrateto capture current schema. - Plugin scaffold CLI (
flask plugin new <name>) - Plugin author docs (
docs/PLUGIN-QUICKSTART.md,docs/PLUGIN-REFERENCE.md) - Per-site deploy story (
Dockerfile,docs/DEPLOY.md) - Frontend hook contract (asset-detail, map markers, search results)
Quick start
# Start dev environment
~/start-dev-env.sh
# Activate venv and install deps
cd /home/camp/projects/shopdb-flask
source venv/bin/activate
pip install -r requirements.txt
# Configure environment
cp .env.example .env
# Edit .env with DB credentials, JWT secrets
# Create / update database tables
flask db-utils create-all
# Seed reference data
flask seed reference-data
# Restart services
pm2 restart shopdb-flask-api shopdb-flask-ui
Service URLs
- Flask API: http://localhost:5001
- Flask UI: http://localhost:5173
- Legacy ASP (data source for one-time import): http://192.168.122.151:8080
Plugin structure
plugins/
<plugin_name>/
__init__.py
plugin.py # BasePlugin implementation
manifest.json # Plugin metadata (name, version, dependencies, api_prefix)
models/
__init__.py # Export all models
<model>.py # SQLAlchemy models
api/
__init__.py
routes.py # Flask Blueprint
services/ # Optional, business logic
schemas/ # Optional, marshmallow schemas
migrations/ # Optional, plugin-specific Alembic migrations
Each plugin must have:
models/__init__.pyexports all modelsplugin.pyextendsBasePluginmanifest.jsonwith metadata (single source of truth per ADR-002)- No direct imports from core code (use the contract surface defined in ADR-001)
Key files
shopdb/__init__.py- app factory, blueprint registrationshopdb/plugins/base.py- BasePlugin ABC, PluginMeta dataclassshopdb/plugins/loader.py- filesystem discovery, dependency-aware loadingshopdb/core/api/assets.py- example of optional plugin importsfrontend/src/router/index.js- frontend routingfrontend/src/components/AppSidebar.vue- navigation menumigrations/adr/- architecture decision records
Migration notes
migrations/DATA_MIGRATION_GUIDE.md- one-time import from legacy ASP shopdbmigrations/MIGRATE_USB_DEVICES_FROM_EQUIPMENT.md- USB device migration from equipment tablemigrations/FIX_LOCATIONONLY_EQUIPMENT_TYPES.md- LocationOnly equipment type fixmigrations/PRODUCTION_MIGRATION_GUIDE.md- production import methodsmigrations/rename_underscore_columns.sql- one-time rename of snake_case columns to lowercase concatenated (per CONTRIBUTING.md)migrations/versions/- Alembic versions (currently empty)