refactor: separate standalone and managed room configs
- veins → shunts rename - add cfg/standalone/ and cfg/<room>/ structure - remove old data/*.json (moved to cfg/<room>/data/) - update build.py and ctrl scripts
This commit is contained in:
@@ -56,15 +56,27 @@
|
||||
"connector": {
|
||||
"name": "vein",
|
||||
"title": "Vein",
|
||||
"description": "Single responsibility connector",
|
||||
"description": "Stateless API connector",
|
||||
"plural": "veins"
|
||||
},
|
||||
"mock": {
|
||||
"name": "shunt",
|
||||
"title": "Shunt",
|
||||
"description": "Fake connector for testing",
|
||||
"plural": "shunts"
|
||||
},
|
||||
"composed": {
|
||||
"name": "pulse",
|
||||
"title": "Pulse",
|
||||
"description": "Composed data flow",
|
||||
"plural": "pulses",
|
||||
"formula": "Vein + Room + Depot"
|
||||
},
|
||||
"app": {
|
||||
"name": "plexus",
|
||||
"title": "Plexus",
|
||||
"description": "Full app with backend, frontend and DB",
|
||||
"plural": "plexus"
|
||||
}
|
||||
},
|
||||
"documentation": {
|
||||
156
cfg/amar/data/__init__.py
Normal file
156
cfg/amar/data/__init__.py
Normal file
@@ -0,0 +1,156 @@
|
||||
"""
|
||||
Pawprint Data Layer
|
||||
|
||||
JSON file storage (future: MongoDB)
|
||||
"""
|
||||
|
||||
import json
|
||||
from pathlib import Path
|
||||
from typing import List, Optional
|
||||
|
||||
# Add parent to path for models import
|
||||
import sys
|
||||
sys.path.insert(0, str(Path(__file__).parent.parent))
|
||||
|
||||
from models.pydantic import (
|
||||
Vein, Nest, Larder, Template, Tool,
|
||||
Pulse, Book, Table,
|
||||
VeinCollection, NestCollection, LarderCollection,
|
||||
TemplateCollection, ToolCollection,
|
||||
PulseCollection, BookCollection, TableCollection,
|
||||
Status
|
||||
)
|
||||
|
||||
DATA_DIR = Path(__file__).parent.resolve()
|
||||
|
||||
# Debug: print data dir on import
|
||||
print(f"[data] DATA_DIR: {DATA_DIR}")
|
||||
print(f"[data] DATA_DIR exists: {DATA_DIR.exists()}")
|
||||
print(f"[data] veins.json exists: {(DATA_DIR / 'veins.json').exists()}")
|
||||
|
||||
|
||||
def _load_json(filename: str) -> dict:
|
||||
filepath = DATA_DIR / filename
|
||||
if filepath.exists():
|
||||
with open(filepath) as f:
|
||||
data = json.load(f)
|
||||
print(f"[data] Loaded {filename}: {len(data.get('items', []))} items")
|
||||
return data
|
||||
print(f"[data] File not found: {filepath}")
|
||||
return {"items": []}
|
||||
|
||||
|
||||
def _save_json(filename: str, data: dict):
|
||||
filepath = DATA_DIR / filename
|
||||
with open(filepath, 'w') as f:
|
||||
json.dump(data, f, indent=2)
|
||||
|
||||
|
||||
# === Loaders ===
|
||||
|
||||
def get_veins() -> List[Vein]:
|
||||
data = _load_json("veins.json")
|
||||
return VeinCollection(**data).items
|
||||
|
||||
|
||||
def get_nests() -> List[Nest]:
|
||||
data = _load_json("nests.json")
|
||||
return NestCollection(**data).items
|
||||
|
||||
|
||||
def get_larders() -> List[Larder]:
|
||||
data = _load_json("larders.json")
|
||||
return LarderCollection(**data).items
|
||||
|
||||
|
||||
def get_templates() -> List[Template]:
|
||||
data = _load_json("templates.json")
|
||||
return TemplateCollection(**data).items
|
||||
|
||||
|
||||
def get_tools() -> List[Tool]:
|
||||
data = _load_json("tools.json")
|
||||
return ToolCollection(**data).items
|
||||
|
||||
|
||||
def get_cabinets() -> list:
|
||||
"""Load cabinets (simple dict, no pydantic yet)."""
|
||||
data = _load_json("cabinets.json")
|
||||
return data.get("items", [])
|
||||
|
||||
|
||||
def get_monitors() -> list:
|
||||
"""Load monitors (simple dict, no pydantic yet)."""
|
||||
data = _load_json("monitors.json")
|
||||
return data.get("items", [])
|
||||
|
||||
|
||||
def get_pulses() -> List[Pulse]:
|
||||
data = _load_json("pulses.json")
|
||||
return PulseCollection(**data).items
|
||||
|
||||
|
||||
def get_books() -> List[Book]:
|
||||
data = _load_json("books.json")
|
||||
return BookCollection(**data).items
|
||||
|
||||
|
||||
def get_tables() -> List[Table]:
|
||||
data = _load_json("tables.json")
|
||||
return TableCollection(**data).items
|
||||
|
||||
|
||||
# === Helpers ===
|
||||
|
||||
def get_vein(name: str) -> Optional[Vein]:
|
||||
for v in get_veins():
|
||||
if v.name == name:
|
||||
return v
|
||||
return None
|
||||
|
||||
|
||||
def get_nest(name: str) -> Optional[Nest]:
|
||||
for n in get_nests():
|
||||
if n.name == name:
|
||||
return n
|
||||
return None
|
||||
|
||||
|
||||
def get_larder(name: str) -> Optional[Larder]:
|
||||
for l in get_larders():
|
||||
if l.name == name:
|
||||
return l
|
||||
return None
|
||||
|
||||
|
||||
# === For frontend rendering ===
|
||||
|
||||
def get_artery_data() -> dict:
|
||||
"""Data for artery frontend."""
|
||||
return {
|
||||
"veins": [v.model_dump() for v in get_veins()],
|
||||
"nests": [n.model_dump() for n in get_nests()],
|
||||
"larders": [l.model_dump() for l in get_larders()],
|
||||
"pulses": [p.model_dump() for p in get_pulses()],
|
||||
}
|
||||
|
||||
|
||||
def get_album_data() -> dict:
|
||||
"""Data for album frontend."""
|
||||
return {
|
||||
"templates": [t.model_dump() for t in get_templates()],
|
||||
"larders": [l.model_dump() for l in get_larders()],
|
||||
"books": [b.model_dump() for b in get_books()],
|
||||
}
|
||||
|
||||
|
||||
def get_ward_data() -> dict:
|
||||
"""Data for ward frontend."""
|
||||
return {
|
||||
"tools": [t.model_dump() for t in get_tools()],
|
||||
"monitors": get_monitors(),
|
||||
"cabinets": get_cabinets(),
|
||||
"nests": [n.model_dump() for n in get_nests()],
|
||||
"larders": [l.model_dump() for l in get_larders()],
|
||||
"tables": [t.model_dump() for t in get_tables()],
|
||||
}
|
||||
79
cfg/amar/data/books.json
Normal file
79
cfg/amar/data/books.json
Normal file
@@ -0,0 +1,79 @@
|
||||
{
|
||||
"items": [
|
||||
{
|
||||
"name": "arch-model",
|
||||
"slug": "arch-model",
|
||||
"title": "Architecture Model",
|
||||
"status": "ready",
|
||||
"template": null,
|
||||
"larder": {
|
||||
"name": "arch-model",
|
||||
"slug": "arch-model",
|
||||
"title": "Architecture Model",
|
||||
"status": "ready",
|
||||
"source_template": null,
|
||||
"data_path": "album/book/arch-model"
|
||||
},
|
||||
"output_larder": null,
|
||||
"system": "album"
|
||||
},
|
||||
{
|
||||
"name": "feature-flow",
|
||||
"slug": "feature-flow",
|
||||
"title": "Feature Flow Pipeline",
|
||||
"status": "ready",
|
||||
"template": null,
|
||||
"larder": {
|
||||
"name": "feature-flow",
|
||||
"slug": "feature-flow",
|
||||
"title": "Feature Flow Pipeline",
|
||||
"status": "ready",
|
||||
"source_template": null,
|
||||
"data_path": "album/book/feature-flow"
|
||||
},
|
||||
"output_larder": null,
|
||||
"system": "album"
|
||||
},
|
||||
{
|
||||
"name": "gherkin-samples",
|
||||
"slug": "gherkin-samples",
|
||||
"title": "Gherkin Samples",
|
||||
"status": "ready",
|
||||
"template": null,
|
||||
"larder": {
|
||||
"name": "gherkin-samples",
|
||||
"slug": "gherkin-samples",
|
||||
"title": "Gherkin Samples",
|
||||
"status": "ready",
|
||||
"source_template": null,
|
||||
"data_path": "album/book/gherkin-samples"
|
||||
},
|
||||
"output_larder": null,
|
||||
"system": "album"
|
||||
},
|
||||
{
|
||||
"name": "feature-form-samples",
|
||||
"slug": "feature-form-samples",
|
||||
"title": "Feature Form Samples",
|
||||
"status": "ready",
|
||||
"template": {
|
||||
"name": "feature-form",
|
||||
"slug": "feature-form",
|
||||
"title": "Feature Form Template",
|
||||
"status": "ready",
|
||||
"template_path": "album/template/feature-form",
|
||||
"system": "album"
|
||||
},
|
||||
"larder": {
|
||||
"name": "feature-form",
|
||||
"slug": "feature-form",
|
||||
"title": "Feature Forms",
|
||||
"status": "ready",
|
||||
"source_template": "feature-form",
|
||||
"data_path": "album/book/feature-form-samples/feature-form"
|
||||
},
|
||||
"output_larder": null,
|
||||
"system": "album"
|
||||
}
|
||||
]
|
||||
}
|
||||
12
cfg/amar/data/depots.json
Normal file
12
cfg/amar/data/depots.json
Normal file
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"items": [
|
||||
{
|
||||
"name": "feature-form",
|
||||
"slug": "feature-form",
|
||||
"title": "Feature Forms",
|
||||
"status": "ready",
|
||||
"source_template": "feature-form",
|
||||
"data_path": "album/book/feature-form-samples/feature-form"
|
||||
}
|
||||
]
|
||||
}
|
||||
3
cfg/amar/data/desks.json
Normal file
3
cfg/amar/data/desks.json
Normal file
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"items": []
|
||||
}
|
||||
22
cfg/amar/data/monitors.json
Normal file
22
cfg/amar/data/monitors.json
Normal file
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"items": [
|
||||
{
|
||||
"name": "turnos",
|
||||
"slug": "turnos",
|
||||
"title": "Turnos Monitor",
|
||||
"status": "dev",
|
||||
"system": "ward",
|
||||
"description": "Pipeline view of requests → turnos. Shows vet-petowner at a glance.",
|
||||
"path": "ward/monitor/turnos"
|
||||
},
|
||||
{
|
||||
"name": "data_browse",
|
||||
"slug": "data-browse",
|
||||
"title": "Data Browse",
|
||||
"status": "ready",
|
||||
"system": "ward",
|
||||
"description": "Quick navigation to test users and data states. Book/larder pattern with SQL mode for manual testing workflows.",
|
||||
"path": "ward/monitor/data_browse"
|
||||
}
|
||||
]
|
||||
}
|
||||
3
cfg/amar/data/pulses.json
Normal file
3
cfg/amar/data/pulses.json
Normal file
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"items": []
|
||||
}
|
||||
5
cfg/amar/data/rooms.json
Normal file
5
cfg/amar/data/rooms.json
Normal file
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"items": [
|
||||
{"name": "pawprint-local", "slug": "pawprint-local", "title": "Pawprint Local", "status": "dev", "config_path": "deploy/pawprint-local"}
|
||||
]
|
||||
}
|
||||
3
cfg/amar/data/tables.json
Normal file
3
cfg/amar/data/tables.json
Normal file
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"items": []
|
||||
}
|
||||
38
cfg/amar/data/template/feature-form/template.md
Normal file
38
cfg/amar/data/template/feature-form/template.md
Normal file
@@ -0,0 +1,38 @@
|
||||
# {{nombre_flujo}}
|
||||
|
||||
## Tipo de usuario
|
||||
{{tipo_usuario}}
|
||||
|
||||
## Donde empieza
|
||||
{{punto_entrada}}
|
||||
|
||||
## Que quiere hacer el usuario
|
||||
{{objetivo}}
|
||||
|
||||
## Pasos
|
||||
|
||||
1. {{paso_1}}
|
||||
2. {{paso_2}}
|
||||
3. {{paso_3}}
|
||||
|
||||
## Que deberia pasar
|
||||
|
||||
- {{resultado_1}}
|
||||
- {{resultado_2}}
|
||||
|
||||
## Problemas comunes
|
||||
|
||||
- {{problema_1}}
|
||||
- {{problema_2}}
|
||||
|
||||
## Casos especiales
|
||||
|
||||
- {{caso_especial_1}}
|
||||
|
||||
## Flujos relacionados
|
||||
|
||||
- {{flujo_relacionado_1}}
|
||||
|
||||
## Notas tecnicas
|
||||
|
||||
- {{nota_tecnica_1}}
|
||||
12
cfg/amar/data/templates.json
Normal file
12
cfg/amar/data/templates.json
Normal file
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"items": [
|
||||
{
|
||||
"name": "feature-form",
|
||||
"slug": "feature-form",
|
||||
"title": "Feature Form Template",
|
||||
"status": "ready",
|
||||
"template_path": "data/template/feature-form",
|
||||
"system": "album"
|
||||
}
|
||||
]
|
||||
}
|
||||
48
cfg/amar/data/tools.json
Normal file
48
cfg/amar/data/tools.json
Normal file
@@ -0,0 +1,48 @@
|
||||
{
|
||||
"items": [
|
||||
{
|
||||
"name": "tester",
|
||||
"slug": "tester",
|
||||
"title": "Contract Tests",
|
||||
"status": "live",
|
||||
"system": "ward",
|
||||
"type": "app",
|
||||
"description": "HTTP contract test runner with multi-environment support. Filter, run, and track tests against dev/stage/prod.",
|
||||
"path": "ward/tools/tester",
|
||||
"url": "/tools/tester/"
|
||||
},
|
||||
{
|
||||
"name": "datagen",
|
||||
"slug": "datagen",
|
||||
"title": "Test Data Generator",
|
||||
"status": "live",
|
||||
"system": "ward",
|
||||
"type": "cli",
|
||||
"description": "Generate realistic test data for Amar domain (users, pets, services) and MercadoPago API responses. Used by mock veins and test seeders.",
|
||||
"path": "ward/tools/datagen",
|
||||
"cli": "python -m datagen"
|
||||
},
|
||||
{
|
||||
"name": "generate_test_data",
|
||||
"slug": "generate-test-data",
|
||||
"title": "DB Test Data Extractor",
|
||||
"status": "dev",
|
||||
"system": "ward",
|
||||
"type": "cli",
|
||||
"description": "Extract representative subsets from PostgreSQL dumps for testing/development.",
|
||||
"path": "ward/tools/generate_test_data",
|
||||
"cli": "python -m generate_test_data"
|
||||
},
|
||||
{
|
||||
"name": "modelgen",
|
||||
"slug": "modelgen",
|
||||
"title": "Model Generator",
|
||||
"status": "dev",
|
||||
"system": "ward",
|
||||
"type": "cli",
|
||||
"description": "Generate platform-specific models (Pydantic, Django, Prisma) from JSON Schema.",
|
||||
"path": "ward/tools/modelgen",
|
||||
"cli": "python -m modelgen"
|
||||
}
|
||||
]
|
||||
}
|
||||
60
cfg/amar/data/veins.json
Normal file
60
cfg/amar/data/veins.json
Normal file
@@ -0,0 +1,60 @@
|
||||
{
|
||||
"items": [
|
||||
{
|
||||
"name": "jira",
|
||||
"slug": "jira",
|
||||
"title": "Jira",
|
||||
"status": "live",
|
||||
"system": "artery"
|
||||
},
|
||||
{
|
||||
"name": "slack",
|
||||
"slug": "slack",
|
||||
"title": "Slack",
|
||||
"status": "building",
|
||||
"system": "artery"
|
||||
},
|
||||
{
|
||||
"name": "google",
|
||||
"slug": "google",
|
||||
"title": "Google",
|
||||
"status": "planned",
|
||||
"system": "artery"
|
||||
},
|
||||
{
|
||||
"name": "maps",
|
||||
"slug": "maps",
|
||||
"title": "Maps",
|
||||
"status": "planned",
|
||||
"system": "artery"
|
||||
},
|
||||
{
|
||||
"name": "whatsapp",
|
||||
"slug": "whatsapp",
|
||||
"title": "WhatsApp",
|
||||
"status": "planned",
|
||||
"system": "artery"
|
||||
},
|
||||
{
|
||||
"name": "gnucash",
|
||||
"slug": "gnucash",
|
||||
"title": "GNUCash",
|
||||
"status": "planned",
|
||||
"system": "artery"
|
||||
},
|
||||
{
|
||||
"name": "vnc",
|
||||
"slug": "vnc",
|
||||
"title": "VNC",
|
||||
"status": "planned",
|
||||
"system": "artery"
|
||||
},
|
||||
{
|
||||
"name": "ia",
|
||||
"slug": "ia",
|
||||
"title": "IA",
|
||||
"status": "planned",
|
||||
"system": "artery"
|
||||
}
|
||||
]
|
||||
}
|
||||
140
cfg/standalone/config.json
Normal file
140
cfg/standalone/config.json
Normal file
@@ -0,0 +1,140 @@
|
||||
{
|
||||
"framework": {
|
||||
"name": "soleprint",
|
||||
"slug": "soleprint",
|
||||
"version": "0.1.0",
|
||||
"description": "Development workflow and documentation system",
|
||||
"tagline": "Mapping development footprints",
|
||||
"icon": "👣",
|
||||
"hub_port": 12000
|
||||
},
|
||||
"systems": [
|
||||
{
|
||||
"key": "data_flow",
|
||||
"name": "artery",
|
||||
"slug": "artery",
|
||||
"title": "Artery",
|
||||
"tagline": "Todo lo vital",
|
||||
"port": 12001,
|
||||
"icon": "💉"
|
||||
},
|
||||
{
|
||||
"key": "documentation",
|
||||
"name": "atlas",
|
||||
"slug": "atlas",
|
||||
"title": "Atlas",
|
||||
"tagline": "Documentación accionable",
|
||||
"port": 12002,
|
||||
"icon": "🗺️"
|
||||
},
|
||||
{
|
||||
"key": "execution",
|
||||
"name": "station",
|
||||
"slug": "station",
|
||||
"title": "Station",
|
||||
"tagline": "Monitores, Entornos y Herramientas",
|
||||
"port": 12003,
|
||||
"icon": "🎛️"
|
||||
}
|
||||
],
|
||||
"components": {
|
||||
"shared": {
|
||||
"config": {
|
||||
"name": "room",
|
||||
"title": "Room",
|
||||
"description": "Runtime environment configuration",
|
||||
"plural": "rooms"
|
||||
},
|
||||
"data": {
|
||||
"name": "depot",
|
||||
"title": "Depot",
|
||||
"description": "Data storage / provisions",
|
||||
"plural": "depots"
|
||||
}
|
||||
},
|
||||
"data_flow": {
|
||||
"connector": {
|
||||
"name": "vein",
|
||||
"title": "Vein",
|
||||
"description": "Stateless API connector",
|
||||
"plural": "veins"
|
||||
},
|
||||
"mock": {
|
||||
"name": "shunt",
|
||||
"title": "Shunt",
|
||||
"description": "Fake connector for testing",
|
||||
"plural": "shunts"
|
||||
},
|
||||
"composed": {
|
||||
"name": "pulse",
|
||||
"title": "Pulse",
|
||||
"description": "Composed data flow",
|
||||
"plural": "pulses",
|
||||
"formula": "Vein + Room + Depot"
|
||||
},
|
||||
"app": {
|
||||
"name": "plexus",
|
||||
"title": "Plexus",
|
||||
"description": "Full app with backend, frontend and DB",
|
||||
"plural": "plexus"
|
||||
}
|
||||
},
|
||||
"documentation": {
|
||||
"pattern": {
|
||||
"name": "template",
|
||||
"title": "Template",
|
||||
"description": "Documentation pattern",
|
||||
"plural": "templates"
|
||||
},
|
||||
"library": {
|
||||
"name": "book",
|
||||
"title": "Book",
|
||||
"description": "Documentation library"
|
||||
},
|
||||
"composed": {
|
||||
"name": "book",
|
||||
"title": "Book",
|
||||
"description": "Composed documentation",
|
||||
"plural": "books",
|
||||
"formula": "Template + Depot"
|
||||
}
|
||||
},
|
||||
"execution": {
|
||||
"utility": {
|
||||
"name": "tool",
|
||||
"title": "Tool",
|
||||
"description": "Execution utility",
|
||||
"plural": "tools"
|
||||
},
|
||||
"watcher": {
|
||||
"name": "monitor",
|
||||
"title": "Monitor",
|
||||
"description": "Service monitor",
|
||||
"plural": "monitors"
|
||||
},
|
||||
"container": {
|
||||
"name": "cabinet",
|
||||
"title": "Cabinet",
|
||||
"description": "Tool container",
|
||||
"plural": "cabinets"
|
||||
},
|
||||
"workspace": {
|
||||
"name": "desk",
|
||||
"title": "Desk",
|
||||
"description": "Execution workspace"
|
||||
},
|
||||
"workbench": {
|
||||
"name": "desk",
|
||||
"title": "Desk",
|
||||
"description": "Work surface"
|
||||
},
|
||||
"composed": {
|
||||
"name": "desk",
|
||||
"title": "Desk",
|
||||
"description": "Composed execution bundle",
|
||||
"plural": "desks",
|
||||
"formula": "Cabinet + Room + Depots"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
156
cfg/standalone/data/__init__.py
Normal file
156
cfg/standalone/data/__init__.py
Normal file
@@ -0,0 +1,156 @@
|
||||
"""
|
||||
Pawprint Data Layer
|
||||
|
||||
JSON file storage (future: MongoDB)
|
||||
"""
|
||||
|
||||
import json
|
||||
from pathlib import Path
|
||||
from typing import List, Optional
|
||||
|
||||
# Add parent to path for models import
|
||||
import sys
|
||||
sys.path.insert(0, str(Path(__file__).parent.parent))
|
||||
|
||||
from models.pydantic import (
|
||||
Vein, Nest, Larder, Template, Tool,
|
||||
Pulse, Book, Table,
|
||||
VeinCollection, NestCollection, LarderCollection,
|
||||
TemplateCollection, ToolCollection,
|
||||
PulseCollection, BookCollection, TableCollection,
|
||||
Status
|
||||
)
|
||||
|
||||
DATA_DIR = Path(__file__).parent.resolve()
|
||||
|
||||
# Debug: print data dir on import
|
||||
print(f"[data] DATA_DIR: {DATA_DIR}")
|
||||
print(f"[data] DATA_DIR exists: {DATA_DIR.exists()}")
|
||||
print(f"[data] veins.json exists: {(DATA_DIR / 'veins.json').exists()}")
|
||||
|
||||
|
||||
def _load_json(filename: str) -> dict:
|
||||
filepath = DATA_DIR / filename
|
||||
if filepath.exists():
|
||||
with open(filepath) as f:
|
||||
data = json.load(f)
|
||||
print(f"[data] Loaded {filename}: {len(data.get('items', []))} items")
|
||||
return data
|
||||
print(f"[data] File not found: {filepath}")
|
||||
return {"items": []}
|
||||
|
||||
|
||||
def _save_json(filename: str, data: dict):
|
||||
filepath = DATA_DIR / filename
|
||||
with open(filepath, 'w') as f:
|
||||
json.dump(data, f, indent=2)
|
||||
|
||||
|
||||
# === Loaders ===
|
||||
|
||||
def get_veins() -> List[Vein]:
|
||||
data = _load_json("veins.json")
|
||||
return VeinCollection(**data).items
|
||||
|
||||
|
||||
def get_nests() -> List[Nest]:
|
||||
data = _load_json("nests.json")
|
||||
return NestCollection(**data).items
|
||||
|
||||
|
||||
def get_larders() -> List[Larder]:
|
||||
data = _load_json("larders.json")
|
||||
return LarderCollection(**data).items
|
||||
|
||||
|
||||
def get_templates() -> List[Template]:
|
||||
data = _load_json("templates.json")
|
||||
return TemplateCollection(**data).items
|
||||
|
||||
|
||||
def get_tools() -> List[Tool]:
|
||||
data = _load_json("tools.json")
|
||||
return ToolCollection(**data).items
|
||||
|
||||
|
||||
def get_cabinets() -> list:
|
||||
"""Load cabinets (simple dict, no pydantic yet)."""
|
||||
data = _load_json("cabinets.json")
|
||||
return data.get("items", [])
|
||||
|
||||
|
||||
def get_monitors() -> list:
|
||||
"""Load monitors (simple dict, no pydantic yet)."""
|
||||
data = _load_json("monitors.json")
|
||||
return data.get("items", [])
|
||||
|
||||
|
||||
def get_pulses() -> List[Pulse]:
|
||||
data = _load_json("pulses.json")
|
||||
return PulseCollection(**data).items
|
||||
|
||||
|
||||
def get_books() -> List[Book]:
|
||||
data = _load_json("books.json")
|
||||
return BookCollection(**data).items
|
||||
|
||||
|
||||
def get_tables() -> List[Table]:
|
||||
data = _load_json("tables.json")
|
||||
return TableCollection(**data).items
|
||||
|
||||
|
||||
# === Helpers ===
|
||||
|
||||
def get_vein(name: str) -> Optional[Vein]:
|
||||
for v in get_veins():
|
||||
if v.name == name:
|
||||
return v
|
||||
return None
|
||||
|
||||
|
||||
def get_nest(name: str) -> Optional[Nest]:
|
||||
for n in get_nests():
|
||||
if n.name == name:
|
||||
return n
|
||||
return None
|
||||
|
||||
|
||||
def get_larder(name: str) -> Optional[Larder]:
|
||||
for l in get_larders():
|
||||
if l.name == name:
|
||||
return l
|
||||
return None
|
||||
|
||||
|
||||
# === For frontend rendering ===
|
||||
|
||||
def get_artery_data() -> dict:
|
||||
"""Data for artery frontend."""
|
||||
return {
|
||||
"veins": [v.model_dump() for v in get_veins()],
|
||||
"nests": [n.model_dump() for n in get_nests()],
|
||||
"larders": [l.model_dump() for l in get_larders()],
|
||||
"pulses": [p.model_dump() for p in get_pulses()],
|
||||
}
|
||||
|
||||
|
||||
def get_album_data() -> dict:
|
||||
"""Data for album frontend."""
|
||||
return {
|
||||
"templates": [t.model_dump() for t in get_templates()],
|
||||
"larders": [l.model_dump() for l in get_larders()],
|
||||
"books": [b.model_dump() for b in get_books()],
|
||||
}
|
||||
|
||||
|
||||
def get_ward_data() -> dict:
|
||||
"""Data for ward frontend."""
|
||||
return {
|
||||
"tools": [t.model_dump() for t in get_tools()],
|
||||
"monitors": get_monitors(),
|
||||
"cabinets": get_cabinets(),
|
||||
"nests": [n.model_dump() for n in get_nests()],
|
||||
"larders": [l.model_dump() for l in get_larders()],
|
||||
"tables": [t.model_dump() for t in get_tables()],
|
||||
}
|
||||
79
cfg/standalone/data/books.json
Normal file
79
cfg/standalone/data/books.json
Normal file
@@ -0,0 +1,79 @@
|
||||
{
|
||||
"items": [
|
||||
{
|
||||
"name": "arch-model",
|
||||
"slug": "arch-model",
|
||||
"title": "Architecture Model",
|
||||
"status": "ready",
|
||||
"template": null,
|
||||
"larder": {
|
||||
"name": "arch-model",
|
||||
"slug": "arch-model",
|
||||
"title": "Architecture Model",
|
||||
"status": "ready",
|
||||
"source_template": null,
|
||||
"data_path": "album/book/arch-model"
|
||||
},
|
||||
"output_larder": null,
|
||||
"system": "album"
|
||||
},
|
||||
{
|
||||
"name": "feature-flow",
|
||||
"slug": "feature-flow",
|
||||
"title": "Feature Flow Pipeline",
|
||||
"status": "ready",
|
||||
"template": null,
|
||||
"larder": {
|
||||
"name": "feature-flow",
|
||||
"slug": "feature-flow",
|
||||
"title": "Feature Flow Pipeline",
|
||||
"status": "ready",
|
||||
"source_template": null,
|
||||
"data_path": "album/book/feature-flow"
|
||||
},
|
||||
"output_larder": null,
|
||||
"system": "album"
|
||||
},
|
||||
{
|
||||
"name": "gherkin-samples",
|
||||
"slug": "gherkin-samples",
|
||||
"title": "Gherkin Samples",
|
||||
"status": "ready",
|
||||
"template": null,
|
||||
"larder": {
|
||||
"name": "gherkin-samples",
|
||||
"slug": "gherkin-samples",
|
||||
"title": "Gherkin Samples",
|
||||
"status": "ready",
|
||||
"source_template": null,
|
||||
"data_path": "album/book/gherkin-samples"
|
||||
},
|
||||
"output_larder": null,
|
||||
"system": "album"
|
||||
},
|
||||
{
|
||||
"name": "feature-form-samples",
|
||||
"slug": "feature-form-samples",
|
||||
"title": "Feature Form Samples",
|
||||
"status": "ready",
|
||||
"template": {
|
||||
"name": "feature-form",
|
||||
"slug": "feature-form",
|
||||
"title": "Feature Form Template",
|
||||
"status": "ready",
|
||||
"template_path": "album/template/feature-form",
|
||||
"system": "album"
|
||||
},
|
||||
"larder": {
|
||||
"name": "feature-form",
|
||||
"slug": "feature-form",
|
||||
"title": "Feature Forms",
|
||||
"status": "ready",
|
||||
"source_template": "feature-form",
|
||||
"data_path": "album/book/feature-form-samples/feature-form"
|
||||
},
|
||||
"output_larder": null,
|
||||
"system": "album"
|
||||
}
|
||||
]
|
||||
}
|
||||
12
cfg/standalone/data/depots.json
Normal file
12
cfg/standalone/data/depots.json
Normal file
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"items": [
|
||||
{
|
||||
"name": "feature-form",
|
||||
"slug": "feature-form",
|
||||
"title": "Feature Forms",
|
||||
"status": "ready",
|
||||
"source_template": "feature-form",
|
||||
"data_path": "album/book/feature-form-samples/feature-form"
|
||||
}
|
||||
]
|
||||
}
|
||||
3
cfg/standalone/data/desks.json
Normal file
3
cfg/standalone/data/desks.json
Normal file
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"items": []
|
||||
}
|
||||
22
cfg/standalone/data/monitors.json
Normal file
22
cfg/standalone/data/monitors.json
Normal file
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"items": [
|
||||
{
|
||||
"name": "turnos",
|
||||
"slug": "turnos",
|
||||
"title": "Turnos Monitor",
|
||||
"status": "dev",
|
||||
"system": "ward",
|
||||
"description": "Pipeline view of requests → turnos. Shows vet-petowner at a glance.",
|
||||
"path": "ward/monitor/turnos"
|
||||
},
|
||||
{
|
||||
"name": "data_browse",
|
||||
"slug": "data-browse",
|
||||
"title": "Data Browse",
|
||||
"status": "ready",
|
||||
"system": "ward",
|
||||
"description": "Quick navigation to test users and data states. Book/larder pattern with SQL mode for manual testing workflows.",
|
||||
"path": "ward/monitor/data_browse"
|
||||
}
|
||||
]
|
||||
}
|
||||
3
cfg/standalone/data/pulses.json
Normal file
3
cfg/standalone/data/pulses.json
Normal file
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"items": []
|
||||
}
|
||||
5
cfg/standalone/data/rooms.json
Normal file
5
cfg/standalone/data/rooms.json
Normal file
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"items": [
|
||||
{"name": "pawprint-local", "slug": "pawprint-local", "title": "Pawprint Local", "status": "dev", "config_path": "deploy/pawprint-local"}
|
||||
]
|
||||
}
|
||||
3
cfg/standalone/data/tables.json
Normal file
3
cfg/standalone/data/tables.json
Normal file
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"items": []
|
||||
}
|
||||
38
cfg/standalone/data/template/feature-form/template.md
Normal file
38
cfg/standalone/data/template/feature-form/template.md
Normal file
@@ -0,0 +1,38 @@
|
||||
# {{nombre_flujo}}
|
||||
|
||||
## Tipo de usuario
|
||||
{{tipo_usuario}}
|
||||
|
||||
## Donde empieza
|
||||
{{punto_entrada}}
|
||||
|
||||
## Que quiere hacer el usuario
|
||||
{{objetivo}}
|
||||
|
||||
## Pasos
|
||||
|
||||
1. {{paso_1}}
|
||||
2. {{paso_2}}
|
||||
3. {{paso_3}}
|
||||
|
||||
## Que deberia pasar
|
||||
|
||||
- {{resultado_1}}
|
||||
- {{resultado_2}}
|
||||
|
||||
## Problemas comunes
|
||||
|
||||
- {{problema_1}}
|
||||
- {{problema_2}}
|
||||
|
||||
## Casos especiales
|
||||
|
||||
- {{caso_especial_1}}
|
||||
|
||||
## Flujos relacionados
|
||||
|
||||
- {{flujo_relacionado_1}}
|
||||
|
||||
## Notas tecnicas
|
||||
|
||||
- {{nota_tecnica_1}}
|
||||
12
cfg/standalone/data/templates.json
Normal file
12
cfg/standalone/data/templates.json
Normal file
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"items": [
|
||||
{
|
||||
"name": "feature-form",
|
||||
"slug": "feature-form",
|
||||
"title": "Feature Form Template",
|
||||
"status": "ready",
|
||||
"template_path": "data/template/feature-form",
|
||||
"system": "album"
|
||||
}
|
||||
]
|
||||
}
|
||||
48
cfg/standalone/data/tools.json
Normal file
48
cfg/standalone/data/tools.json
Normal file
@@ -0,0 +1,48 @@
|
||||
{
|
||||
"items": [
|
||||
{
|
||||
"name": "tester",
|
||||
"slug": "tester",
|
||||
"title": "Contract Tests",
|
||||
"status": "live",
|
||||
"system": "ward",
|
||||
"type": "app",
|
||||
"description": "HTTP contract test runner with multi-environment support. Filter, run, and track tests against dev/stage/prod.",
|
||||
"path": "ward/tools/tester",
|
||||
"url": "/tools/tester/"
|
||||
},
|
||||
{
|
||||
"name": "datagen",
|
||||
"slug": "datagen",
|
||||
"title": "Test Data Generator",
|
||||
"status": "live",
|
||||
"system": "ward",
|
||||
"type": "cli",
|
||||
"description": "Generate realistic test data for Amar domain (users, pets, services) and MercadoPago API responses. Used by mock veins and test seeders.",
|
||||
"path": "ward/tools/datagen",
|
||||
"cli": "python -m datagen"
|
||||
},
|
||||
{
|
||||
"name": "generate_test_data",
|
||||
"slug": "generate-test-data",
|
||||
"title": "DB Test Data Extractor",
|
||||
"status": "dev",
|
||||
"system": "ward",
|
||||
"type": "cli",
|
||||
"description": "Extract representative subsets from PostgreSQL dumps for testing/development.",
|
||||
"path": "ward/tools/generate_test_data",
|
||||
"cli": "python -m generate_test_data"
|
||||
},
|
||||
{
|
||||
"name": "modelgen",
|
||||
"slug": "modelgen",
|
||||
"title": "Model Generator",
|
||||
"status": "dev",
|
||||
"system": "ward",
|
||||
"type": "cli",
|
||||
"description": "Generate platform-specific models (Pydantic, Django, Prisma) from JSON Schema.",
|
||||
"path": "ward/tools/modelgen",
|
||||
"cli": "python -m modelgen"
|
||||
}
|
||||
]
|
||||
}
|
||||
60
cfg/standalone/data/veins.json
Normal file
60
cfg/standalone/data/veins.json
Normal file
@@ -0,0 +1,60 @@
|
||||
{
|
||||
"items": [
|
||||
{
|
||||
"name": "jira",
|
||||
"slug": "jira",
|
||||
"title": "Jira",
|
||||
"status": "live",
|
||||
"system": "artery"
|
||||
},
|
||||
{
|
||||
"name": "slack",
|
||||
"slug": "slack",
|
||||
"title": "Slack",
|
||||
"status": "building",
|
||||
"system": "artery"
|
||||
},
|
||||
{
|
||||
"name": "google",
|
||||
"slug": "google",
|
||||
"title": "Google",
|
||||
"status": "planned",
|
||||
"system": "artery"
|
||||
},
|
||||
{
|
||||
"name": "maps",
|
||||
"slug": "maps",
|
||||
"title": "Maps",
|
||||
"status": "planned",
|
||||
"system": "artery"
|
||||
},
|
||||
{
|
||||
"name": "whatsapp",
|
||||
"slug": "whatsapp",
|
||||
"title": "WhatsApp",
|
||||
"status": "planned",
|
||||
"system": "artery"
|
||||
},
|
||||
{
|
||||
"name": "gnucash",
|
||||
"slug": "gnucash",
|
||||
"title": "GNUCash",
|
||||
"status": "planned",
|
||||
"system": "artery"
|
||||
},
|
||||
{
|
||||
"name": "vnc",
|
||||
"slug": "vnc",
|
||||
"title": "VNC",
|
||||
"status": "planned",
|
||||
"system": "artery"
|
||||
},
|
||||
{
|
||||
"name": "ia",
|
||||
"slug": "ia",
|
||||
"title": "IA",
|
||||
"status": "planned",
|
||||
"system": "artery"
|
||||
}
|
||||
]
|
||||
}
|
||||
Reference in New Issue
Block a user