{
  "schemaVersion": "1.0",
  "item": {
    "slug": "data-model-designer",
    "name": "Data Model Designer",
    "source": "tencent",
    "type": "skill",
    "category": "AI 智能",
    "sourceUrl": "https://clawhub.ai/datadrivenconstruction/data-model-designer",
    "canonicalUrl": "https://clawhub.ai/datadrivenconstruction/data-model-designer",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/data-model-designer",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=data-model-designer",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "claw.json",
      "instructions.md",
      "SKILL.md"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-30T16:55:25.780Z",
      "expiresAt": "2026-05-07T16:55:25.780Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
        "contentDisposition": "attachment; filename=\"network-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/data-model-designer"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/data-model-designer",
    "agentPageUrl": "https://openagent3.xyz/skills/data-model-designer/agent",
    "manifestUrl": "https://openagent3.xyz/skills/data-model-designer/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/data-model-designer/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "Problem Statement",
        "body": "Construction data management challenges:\n\nFragmented data across systems\nInconsistent data structures\nMissing relationships between entities\nDifficult data integration"
      },
      {
        "title": "Solution",
        "body": "Systematic data model design for construction projects, defining entities, relationships, and schemas for effective data management."
      },
      {
        "title": "Technical Implementation",
        "body": "from typing import Dict, Any, List, Optional\nfrom dataclasses import dataclass, field\nfrom enum import Enum\nimport json\n\n\nclass DataType(Enum):\n    STRING = \"string\"\n    INTEGER = \"integer\"\n    FLOAT = \"float\"\n    BOOLEAN = \"boolean\"\n    DATE = \"date\"\n    DATETIME = \"datetime\"\n    TEXT = \"text\"\n    JSON = \"json\"\n\n\nclass RelationType(Enum):\n    ONE_TO_ONE = \"1:1\"\n    ONE_TO_MANY = \"1:N\"\n    MANY_TO_MANY = \"N:M\"\n\n\nclass ConstraintType(Enum):\n    PRIMARY_KEY = \"primary_key\"\n    FOREIGN_KEY = \"foreign_key\"\n    UNIQUE = \"unique\"\n    NOT_NULL = \"not_null\"\n\n\n@dataclass\nclass Field:\n    name: str\n    data_type: DataType\n    nullable: bool = True\n    default: Any = None\n    description: str = \"\"\n    constraints: List[ConstraintType] = field(default_factory=list)\n\n\n@dataclass\nclass Entity:\n    name: str\n    description: str\n    fields: List[Field] = field(default_factory=list)\n    primary_key: str = \"id\"\n\n\n@dataclass\nclass Relationship:\n    name: str\n    from_entity: str\n    to_entity: str\n    relation_type: RelationType\n    from_field: str\n    to_field: str\n\n\nclass ConstructionDataModel:\n    \"\"\"Design data models for construction projects.\"\"\"\n\n    def __init__(self, project_name: str):\n        self.project_name = project_name\n        self.entities: Dict[str, Entity] = {}\n        self.relationships: List[Relationship] = []\n\n    def add_entity(self, entity: Entity):\n        \"\"\"Add entity to model.\"\"\"\n        self.entities[entity.name] = entity\n\n    def add_relationship(self, relationship: Relationship):\n        \"\"\"Add relationship between entities.\"\"\"\n        self.relationships.append(relationship)\n\n    def create_entity(self, name: str, description: str,\n                      fields: List[Dict[str, Any]]) -> Entity:\n        \"\"\"Create entity from field definitions.\"\"\"\n\n        entity_fields = [\n            Field(\n                name=f['name'],\n                data_type=DataType(f.get('type', 'string')),\n                nullable=f.get('nullable', True),\n                default=f.get('default'),\n                description=f.get('description', ''),\n                constraints=[ConstraintType(c) for c in f.get('constraints', [])]\n            )\n            for f in fields\n        ]\n\n        entity = Entity(name=name, description=description, fields=entity_fields)\n        self.add_entity(entity)\n        return entity\n\n    def create_relationship(self, from_entity: str, to_entity: str,\n                           relation_type: str = \"1:N\",\n                           from_field: str = None) -> Relationship:\n        \"\"\"Create relationship between entities.\"\"\"\n\n        rel = Relationship(\n            name=f\"{from_entity}_{to_entity}\",\n            from_entity=from_entity,\n            to_entity=to_entity,\n            relation_type=RelationType(relation_type),\n            from_field=from_field or f\"{to_entity.lower()}_id\",\n            to_field=\"id\"\n        )\n        self.add_relationship(rel)\n        return rel\n\n    def generate_sql_schema(self, dialect: str = \"postgresql\") -> str:\n        \"\"\"Generate SQL DDL statements.\"\"\"\n\n        sql = []\n        type_map = {\n            DataType.STRING: \"VARCHAR(255)\",\n            DataType.INTEGER: \"INTEGER\",\n            DataType.FLOAT: \"DECIMAL(15,2)\",\n            DataType.BOOLEAN: \"BOOLEAN\",\n            DataType.DATE: \"DATE\",\n            DataType.DATETIME: \"TIMESTAMP\",\n            DataType.TEXT: \"TEXT\",\n            DataType.JSON: \"JSONB\" if dialect == \"postgresql\" else \"JSON\"\n        }\n\n        for name, entity in self.entities.items():\n            columns = []\n            for fld in entity.fields:\n                col = f\"    {fld.name} {type_map.get(fld.data_type, 'VARCHAR(255)')}\"\n                if not fld.nullable:\n                    col += \" NOT NULL\"\n                if ConstraintType.PRIMARY_KEY in fld.constraints:\n                    col += \" PRIMARY KEY\"\n                columns.append(col)\n\n            sql.append(f\"CREATE TABLE {name} (\\n\" + \",\\n\".join(columns) + \"\\n);\")\n\n        for rel in self.relationships:\n            sql.append(f\"\"\"ALTER TABLE {rel.from_entity}\nADD CONSTRAINT fk_{rel.name}\nFOREIGN KEY ({rel.from_field}) REFERENCES {rel.to_entity}({rel.to_field});\"\"\")\n\n        return \"\\n\\n\".join(sql)\n\n    def generate_json_schema(self) -> Dict[str, Any]:\n        \"\"\"Generate JSON Schema representation.\"\"\"\n\n        schemas = {}\n        for name, entity in self.entities.items():\n            properties = {}\n            required = []\n\n            for fld in entity.fields:\n                prop = {\"description\": fld.description}\n                if fld.data_type == DataType.STRING:\n                    prop[\"type\"] = \"string\"\n                elif fld.data_type == DataType.INTEGER:\n                    prop[\"type\"] = \"integer\"\n                elif fld.data_type == DataType.FLOAT:\n                    prop[\"type\"] = \"number\"\n                elif fld.data_type == DataType.BOOLEAN:\n                    prop[\"type\"] = \"boolean\"\n                else:\n                    prop[\"type\"] = \"string\"\n\n                properties[fld.name] = prop\n                if not fld.nullable:\n                    required.append(fld.name)\n\n            schemas[name] = {\n                \"type\": \"object\",\n                \"title\": entity.description,\n                \"properties\": properties,\n                \"required\": required\n            }\n        return schemas\n\n    def generate_er_diagram(self) -> str:\n        \"\"\"Generate Mermaid ER diagram.\"\"\"\n\n        lines = [\"erDiagram\"]\n        for name, entity in self.entities.items():\n            for fld in entity.fields[:5]:\n                lines.append(f\"    {name} {{\")\n                lines.append(f\"        {fld.data_type.value} {fld.name}\")\n                lines.append(\"    }\")\n\n        for rel in self.relationships:\n            rel_symbol = {\n                RelationType.ONE_TO_ONE: \"||--||\",\n                RelationType.ONE_TO_MANY: \"||--o{\",\n                RelationType.MANY_TO_MANY: \"}o--o{\"\n            }.get(rel.relation_type, \"||--o{\")\n            lines.append(f\"    {rel.from_entity} {rel_symbol} {rel.to_entity} : \\\"{rel.name}\\\"\")\n\n        return \"\\n\".join(lines)\n\n    def validate_model(self) -> List[str]:\n        \"\"\"Validate data model for issues.\"\"\"\n\n        issues = []\n        for rel in self.relationships:\n            if rel.from_entity not in self.entities:\n                issues.append(f\"Missing entity: {rel.from_entity}\")\n            if rel.to_entity not in self.entities:\n                issues.append(f\"Missing entity: {rel.to_entity}\")\n\n        for name, entity in self.entities.items():\n            has_pk = any(ConstraintType.PRIMARY_KEY in f.constraints for f in entity.fields)\n            if not has_pk:\n                issues.append(f\"Entity '{name}' has no primary key\")\n\n        return issues\n\n\nclass ConstructionEntities:\n    \"\"\"Standard construction data entities.\"\"\"\n\n    @staticmethod\n    def project_entity() -> Entity:\n        return Entity(\n            name=\"projects\",\n            description=\"Construction projects\",\n            fields=[\n                Field(\"id\", DataType.INTEGER, False, constraints=[ConstraintType.PRIMARY_KEY]),\n                Field(\"code\", DataType.STRING, False, constraints=[ConstraintType.UNIQUE]),\n                Field(\"name\", DataType.STRING, False),\n                Field(\"status\", DataType.STRING),\n                Field(\"start_date\", DataType.DATE),\n                Field(\"end_date\", DataType.DATE),\n                Field(\"budget\", DataType.FLOAT)\n            ]\n        )\n\n    @staticmethod\n    def activity_entity() -> Entity:\n        return Entity(\n            name=\"activities\",\n            description=\"Schedule activities\",\n            fields=[\n                Field(\"id\", DataType.INTEGER, False, constraints=[ConstraintType.PRIMARY_KEY]),\n                Field(\"project_id\", DataType.INTEGER, False),\n                Field(\"wbs_code\", DataType.STRING),\n                Field(\"name\", DataType.STRING, False),\n                Field(\"start_date\", DataType.DATE),\n                Field(\"end_date\", DataType.DATE),\n                Field(\"percent_complete\", DataType.FLOAT)\n            ]\n        )\n\n    @staticmethod\n    def cost_item_entity() -> Entity:\n        return Entity(\n            name=\"cost_items\",\n            description=\"Project cost items\",\n            fields=[\n                Field(\"id\", DataType.INTEGER, False, constraints=[ConstraintType.PRIMARY_KEY]),\n                Field(\"project_id\", DataType.INTEGER, False),\n                Field(\"wbs_code\", DataType.STRING),\n                Field(\"description\", DataType.STRING),\n                Field(\"budgeted_cost\", DataType.FLOAT),\n                Field(\"actual_cost\", DataType.FLOAT)\n            ]\n        )"
      },
      {
        "title": "Quick Start",
        "body": "# Create model\nmodel = ConstructionDataModel(\"Office Building A\")\n\n# Add standard entities\nmodel.add_entity(ConstructionEntities.project_entity())\nmodel.add_entity(ConstructionEntities.activity_entity())\nmodel.add_entity(ConstructionEntities.cost_item_entity())\n\n# Add relationships\nmodel.create_relationship(\"activities\", \"projects\")\nmodel.create_relationship(\"cost_items\", \"projects\")\n\n# Generate SQL\nsql = model.generate_sql_schema(\"postgresql\")\nprint(sql)"
      },
      {
        "title": "1. Custom Entity",
        "body": "model.create_entity(\n    name=\"change_orders\",\n    description=\"Project change orders\",\n    fields=[\n        {\"name\": \"id\", \"type\": \"integer\", \"nullable\": False, \"constraints\": [\"primary_key\"]},\n        {\"name\": \"project_id\", \"type\": \"integer\", \"nullable\": False},\n        {\"name\": \"amount\", \"type\": \"float\"},\n        {\"name\": \"status\", \"type\": \"string\"}\n    ]\n)"
      },
      {
        "title": "2. Generate ER Diagram",
        "body": "er_diagram = model.generate_er_diagram()\nprint(er_diagram)"
      },
      {
        "title": "3. Validate Model",
        "body": "issues = model.validate_model()\nfor issue in issues:\n    print(f\"Issue: {issue}\")"
      },
      {
        "title": "Resources",
        "body": "DDC Book: Chapter 2.5 - Data Models and Standards\nWebsite: https://datadrivenconstruction.io"
      }
    ],
    "body": "Data Model Designer\nBusiness Case\nProblem Statement\n\nConstruction data management challenges:\n\nFragmented data across systems\nInconsistent data structures\nMissing relationships between entities\nDifficult data integration\nSolution\n\nSystematic data model design for construction projects, defining entities, relationships, and schemas for effective data management.\n\nTechnical Implementation\nfrom typing import Dict, Any, List, Optional\nfrom dataclasses import dataclass, field\nfrom enum import Enum\nimport json\n\n\nclass DataType(Enum):\n    STRING = \"string\"\n    INTEGER = \"integer\"\n    FLOAT = \"float\"\n    BOOLEAN = \"boolean\"\n    DATE = \"date\"\n    DATETIME = \"datetime\"\n    TEXT = \"text\"\n    JSON = \"json\"\n\n\nclass RelationType(Enum):\n    ONE_TO_ONE = \"1:1\"\n    ONE_TO_MANY = \"1:N\"\n    MANY_TO_MANY = \"N:M\"\n\n\nclass ConstraintType(Enum):\n    PRIMARY_KEY = \"primary_key\"\n    FOREIGN_KEY = \"foreign_key\"\n    UNIQUE = \"unique\"\n    NOT_NULL = \"not_null\"\n\n\n@dataclass\nclass Field:\n    name: str\n    data_type: DataType\n    nullable: bool = True\n    default: Any = None\n    description: str = \"\"\n    constraints: List[ConstraintType] = field(default_factory=list)\n\n\n@dataclass\nclass Entity:\n    name: str\n    description: str\n    fields: List[Field] = field(default_factory=list)\n    primary_key: str = \"id\"\n\n\n@dataclass\nclass Relationship:\n    name: str\n    from_entity: str\n    to_entity: str\n    relation_type: RelationType\n    from_field: str\n    to_field: str\n\n\nclass ConstructionDataModel:\n    \"\"\"Design data models for construction projects.\"\"\"\n\n    def __init__(self, project_name: str):\n        self.project_name = project_name\n        self.entities: Dict[str, Entity] = {}\n        self.relationships: List[Relationship] = []\n\n    def add_entity(self, entity: Entity):\n        \"\"\"Add entity to model.\"\"\"\n        self.entities[entity.name] = entity\n\n    def add_relationship(self, relationship: Relationship):\n        \"\"\"Add relationship between entities.\"\"\"\n        self.relationships.append(relationship)\n\n    def create_entity(self, name: str, description: str,\n                      fields: List[Dict[str, Any]]) -> Entity:\n        \"\"\"Create entity from field definitions.\"\"\"\n\n        entity_fields = [\n            Field(\n                name=f['name'],\n                data_type=DataType(f.get('type', 'string')),\n                nullable=f.get('nullable', True),\n                default=f.get('default'),\n                description=f.get('description', ''),\n                constraints=[ConstraintType(c) for c in f.get('constraints', [])]\n            )\n            for f in fields\n        ]\n\n        entity = Entity(name=name, description=description, fields=entity_fields)\n        self.add_entity(entity)\n        return entity\n\n    def create_relationship(self, from_entity: str, to_entity: str,\n                           relation_type: str = \"1:N\",\n                           from_field: str = None) -> Relationship:\n        \"\"\"Create relationship between entities.\"\"\"\n\n        rel = Relationship(\n            name=f\"{from_entity}_{to_entity}\",\n            from_entity=from_entity,\n            to_entity=to_entity,\n            relation_type=RelationType(relation_type),\n            from_field=from_field or f\"{to_entity.lower()}_id\",\n            to_field=\"id\"\n        )\n        self.add_relationship(rel)\n        return rel\n\n    def generate_sql_schema(self, dialect: str = \"postgresql\") -> str:\n        \"\"\"Generate SQL DDL statements.\"\"\"\n\n        sql = []\n        type_map = {\n            DataType.STRING: \"VARCHAR(255)\",\n            DataType.INTEGER: \"INTEGER\",\n            DataType.FLOAT: \"DECIMAL(15,2)\",\n            DataType.BOOLEAN: \"BOOLEAN\",\n            DataType.DATE: \"DATE\",\n            DataType.DATETIME: \"TIMESTAMP\",\n            DataType.TEXT: \"TEXT\",\n            DataType.JSON: \"JSONB\" if dialect == \"postgresql\" else \"JSON\"\n        }\n\n        for name, entity in self.entities.items():\n            columns = []\n            for fld in entity.fields:\n                col = f\"    {fld.name} {type_map.get(fld.data_type, 'VARCHAR(255)')}\"\n                if not fld.nullable:\n                    col += \" NOT NULL\"\n                if ConstraintType.PRIMARY_KEY in fld.constraints:\n                    col += \" PRIMARY KEY\"\n                columns.append(col)\n\n            sql.append(f\"CREATE TABLE {name} (\\n\" + \",\\n\".join(columns) + \"\\n);\")\n\n        for rel in self.relationships:\n            sql.append(f\"\"\"ALTER TABLE {rel.from_entity}\nADD CONSTRAINT fk_{rel.name}\nFOREIGN KEY ({rel.from_field}) REFERENCES {rel.to_entity}({rel.to_field});\"\"\")\n\n        return \"\\n\\n\".join(sql)\n\n    def generate_json_schema(self) -> Dict[str, Any]:\n        \"\"\"Generate JSON Schema representation.\"\"\"\n\n        schemas = {}\n        for name, entity in self.entities.items():\n            properties = {}\n            required = []\n\n            for fld in entity.fields:\n                prop = {\"description\": fld.description}\n                if fld.data_type == DataType.STRING:\n                    prop[\"type\"] = \"string\"\n                elif fld.data_type == DataType.INTEGER:\n                    prop[\"type\"] = \"integer\"\n                elif fld.data_type == DataType.FLOAT:\n                    prop[\"type\"] = \"number\"\n                elif fld.data_type == DataType.BOOLEAN:\n                    prop[\"type\"] = \"boolean\"\n                else:\n                    prop[\"type\"] = \"string\"\n\n                properties[fld.name] = prop\n                if not fld.nullable:\n                    required.append(fld.name)\n\n            schemas[name] = {\n                \"type\": \"object\",\n                \"title\": entity.description,\n                \"properties\": properties,\n                \"required\": required\n            }\n        return schemas\n\n    def generate_er_diagram(self) -> str:\n        \"\"\"Generate Mermaid ER diagram.\"\"\"\n\n        lines = [\"erDiagram\"]\n        for name, entity in self.entities.items():\n            for fld in entity.fields[:5]:\n                lines.append(f\"    {name} {{\")\n                lines.append(f\"        {fld.data_type.value} {fld.name}\")\n                lines.append(\"    }\")\n\n        for rel in self.relationships:\n            rel_symbol = {\n                RelationType.ONE_TO_ONE: \"||--||\",\n                RelationType.ONE_TO_MANY: \"||--o{\",\n                RelationType.MANY_TO_MANY: \"}o--o{\"\n            }.get(rel.relation_type, \"||--o{\")\n            lines.append(f\"    {rel.from_entity} {rel_symbol} {rel.to_entity} : \\\"{rel.name}\\\"\")\n\n        return \"\\n\".join(lines)\n\n    def validate_model(self) -> List[str]:\n        \"\"\"Validate data model for issues.\"\"\"\n\n        issues = []\n        for rel in self.relationships:\n            if rel.from_entity not in self.entities:\n                issues.append(f\"Missing entity: {rel.from_entity}\")\n            if rel.to_entity not in self.entities:\n                issues.append(f\"Missing entity: {rel.to_entity}\")\n\n        for name, entity in self.entities.items():\n            has_pk = any(ConstraintType.PRIMARY_KEY in f.constraints for f in entity.fields)\n            if not has_pk:\n                issues.append(f\"Entity '{name}' has no primary key\")\n\n        return issues\n\n\nclass ConstructionEntities:\n    \"\"\"Standard construction data entities.\"\"\"\n\n    @staticmethod\n    def project_entity() -> Entity:\n        return Entity(\n            name=\"projects\",\n            description=\"Construction projects\",\n            fields=[\n                Field(\"id\", DataType.INTEGER, False, constraints=[ConstraintType.PRIMARY_KEY]),\n                Field(\"code\", DataType.STRING, False, constraints=[ConstraintType.UNIQUE]),\n                Field(\"name\", DataType.STRING, False),\n                Field(\"status\", DataType.STRING),\n                Field(\"start_date\", DataType.DATE),\n                Field(\"end_date\", DataType.DATE),\n                Field(\"budget\", DataType.FLOAT)\n            ]\n        )\n\n    @staticmethod\n    def activity_entity() -> Entity:\n        return Entity(\n            name=\"activities\",\n            description=\"Schedule activities\",\n            fields=[\n                Field(\"id\", DataType.INTEGER, False, constraints=[ConstraintType.PRIMARY_KEY]),\n                Field(\"project_id\", DataType.INTEGER, False),\n                Field(\"wbs_code\", DataType.STRING),\n                Field(\"name\", DataType.STRING, False),\n                Field(\"start_date\", DataType.DATE),\n                Field(\"end_date\", DataType.DATE),\n                Field(\"percent_complete\", DataType.FLOAT)\n            ]\n        )\n\n    @staticmethod\n    def cost_item_entity() -> Entity:\n        return Entity(\n            name=\"cost_items\",\n            description=\"Project cost items\",\n            fields=[\n                Field(\"id\", DataType.INTEGER, False, constraints=[ConstraintType.PRIMARY_KEY]),\n                Field(\"project_id\", DataType.INTEGER, False),\n                Field(\"wbs_code\", DataType.STRING),\n                Field(\"description\", DataType.STRING),\n                Field(\"budgeted_cost\", DataType.FLOAT),\n                Field(\"actual_cost\", DataType.FLOAT)\n            ]\n        )\n\nQuick Start\n# Create model\nmodel = ConstructionDataModel(\"Office Building A\")\n\n# Add standard entities\nmodel.add_entity(ConstructionEntities.project_entity())\nmodel.add_entity(ConstructionEntities.activity_entity())\nmodel.add_entity(ConstructionEntities.cost_item_entity())\n\n# Add relationships\nmodel.create_relationship(\"activities\", \"projects\")\nmodel.create_relationship(\"cost_items\", \"projects\")\n\n# Generate SQL\nsql = model.generate_sql_schema(\"postgresql\")\nprint(sql)\n\nCommon Use Cases\n1. Custom Entity\nmodel.create_entity(\n    name=\"change_orders\",\n    description=\"Project change orders\",\n    fields=[\n        {\"name\": \"id\", \"type\": \"integer\", \"nullable\": False, \"constraints\": [\"primary_key\"]},\n        {\"name\": \"project_id\", \"type\": \"integer\", \"nullable\": False},\n        {\"name\": \"amount\", \"type\": \"float\"},\n        {\"name\": \"status\", \"type\": \"string\"}\n    ]\n)\n\n2. Generate ER Diagram\ner_diagram = model.generate_er_diagram()\nprint(er_diagram)\n\n3. Validate Model\nissues = model.validate_model()\nfor issue in issues:\n    print(f\"Issue: {issue}\")\n\nResources\nDDC Book: Chapter 2.5 - Data Models and Standards\nWebsite: https://datadrivenconstruction.io"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/datadrivenconstruction/data-model-designer",
    "publisherUrl": "https://clawhub.ai/datadrivenconstruction/data-model-designer",
    "owner": "datadrivenconstruction",
    "version": "2.1.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/data-model-designer",
    "downloadUrl": "https://openagent3.xyz/downloads/data-model-designer",
    "agentUrl": "https://openagent3.xyz/skills/data-model-designer/agent",
    "manifestUrl": "https://openagent3.xyz/skills/data-model-designer/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/data-model-designer/agent.md"
  }
}