{
  "schemaVersion": "1.0",
  "item": {
    "slug": "estimate-builder-qmohd",
    "name": "Estimate Builder",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/qmohd/estimate-builder-qmohd",
    "canonicalUrl": "https://clawhub.ai/qmohd/estimate-builder-qmohd",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/estimate-builder-qmohd",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=estimate-builder-qmohd",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "claw.json",
      "instructions.md",
      "SKILL.md",
      "_meta.json"
    ],
    "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/estimate-builder-qmohd"
    },
    "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/estimate-builder-qmohd",
    "agentPageUrl": "https://openagent3.xyz/skills/estimate-builder-qmohd/agent",
    "manifestUrl": "https://openagent3.xyz/skills/estimate-builder-qmohd/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/estimate-builder-qmohd/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": "Estimate creation challenges:\n\nComplex cost structures\nMultiple cost categories\nMarkup calculations\nFormat requirements vary"
      },
      {
        "title": "Solution",
        "body": "Structured estimate builder that creates professional construction estimates with proper cost categorization, markups, and export capabilities."
      },
      {
        "title": "Technical Implementation",
        "body": "import pandas as pd\nfrom typing import Dict, Any, List, Optional\nfrom dataclasses import dataclass, field\nfrom datetime import date\nfrom enum import Enum\n\n\nclass CostCategory(Enum):\n    LABOR = \"labor\"\n    MATERIAL = \"material\"\n    EQUIPMENT = \"equipment\"\n    SUBCONTRACTOR = \"subcontractor\"\n    OTHER = \"other\"\n\n\n@dataclass\nclass EstimateLineItem:\n    line_number: int\n    wbs_code: str\n    description: str\n    quantity: float\n    unit: str\n    unit_cost: float\n    category: CostCategory\n    notes: str = \"\"\n\n    @property\n    def total_cost(self) -> float:\n        return round(self.quantity * self.unit_cost, 2)\n\n\n@dataclass\nclass CostSummary:\n    labor: float = 0\n    material: float = 0\n    equipment: float = 0\n    subcontractor: float = 0\n    other: float = 0\n\n    @property\n    def direct_cost(self) -> float:\n        return self.labor + self.material + self.equipment + self.subcontractor + self.other\n\n\n@dataclass\nclass Markup:\n    name: str\n    rate: float  # As decimal (0.10 = 10%)\n    base: str = \"direct\"  # \"direct\" or \"subtotal\"\n\n\nclass EstimateBuilder:\n    \"\"\"Build construction project estimates.\"\"\"\n\n    def __init__(self, project_name: str, project_number: str = \"\"):\n        self.project_name = project_name\n        self.project_number = project_number\n        self.estimate_date = date.today()\n        self.items: List[EstimateLineItem] = []\n        self.markups: List[Markup] = []\n        self._next_line = 1\n\n    def add_item(self,\n                 wbs_code: str,\n                 description: str,\n                 quantity: float,\n                 unit: str,\n                 unit_cost: float,\n                 category: CostCategory = CostCategory.OTHER,\n                 notes: str = \"\") -> EstimateLineItem:\n        \"\"\"Add line item to estimate.\"\"\"\n\n        item = EstimateLineItem(\n            line_number=self._next_line,\n            wbs_code=wbs_code,\n            description=description,\n            quantity=quantity,\n            unit=unit,\n            unit_cost=unit_cost,\n            category=category,\n            notes=notes\n        )\n        self.items.append(item)\n        self._next_line += 1\n        return item\n\n    def add_markup(self, name: str, rate: float, base: str = \"direct\"):\n        \"\"\"Add markup (overhead, profit, contingency, etc.).\"\"\"\n        self.markups.append(Markup(name=name, rate=rate, base=base))\n\n    def set_standard_markups(self,\n                             overhead: float = 0.15,\n                             profit: float = 0.10,\n                             contingency: float = 0.05):\n        \"\"\"Set standard construction markups.\"\"\"\n\n        self.markups = [\n            Markup(\"General Conditions / Overhead\", overhead, \"direct\"),\n            Markup(\"Profit\", profit, \"subtotal\"),\n            Markup(\"Contingency\", contingency, \"subtotal\")\n        ]\n\n    def get_cost_summary(self) -> CostSummary:\n        \"\"\"Get cost summary by category.\"\"\"\n\n        summary = CostSummary()\n        for item in self.items:\n            cost = item.total_cost\n            if item.category == CostCategory.LABOR:\n                summary.labor += cost\n            elif item.category == CostCategory.MATERIAL:\n                summary.material += cost\n            elif item.category == CostCategory.EQUIPMENT:\n                summary.equipment += cost\n            elif item.category == CostCategory.SUBCONTRACTOR:\n                summary.subcontractor += cost\n            else:\n                summary.other += cost\n        return summary\n\n    def calculate_total(self) -> Dict[str, Any]:\n        \"\"\"Calculate total estimate with markups.\"\"\"\n\n        summary = self.get_cost_summary()\n        direct_cost = summary.direct_cost\n\n        markups_detail = []\n        subtotal = direct_cost\n\n        for markup in self.markups:\n            if markup.base == \"direct\":\n                amount = direct_cost * markup.rate\n            else:\n                amount = subtotal * markup.rate\n\n            markups_detail.append({\n                'name': markup.name,\n                'rate': f\"{markup.rate * 100:.1f}%\",\n                'amount': round(amount, 2)\n            })\n            subtotal += amount\n\n        return {\n            'cost_summary': {\n                'labor': round(summary.labor, 2),\n                'material': round(summary.material, 2),\n                'equipment': round(summary.equipment, 2),\n                'subcontractor': round(summary.subcontractor, 2),\n                'other': round(summary.other, 2),\n                'direct_cost': round(direct_cost, 2)\n            },\n            'markups': markups_detail,\n            'total_markups': round(subtotal - direct_cost, 2),\n            'grand_total': round(subtotal, 2)\n        }\n\n    def get_items_by_wbs(self) -> Dict[str, List[EstimateLineItem]]:\n        \"\"\"Group items by WBS code prefix.\"\"\"\n\n        by_wbs = {}\n        for item in self.items:\n            prefix = item.wbs_code.split('.')[0] if '.' in item.wbs_code else item.wbs_code\n            if prefix not in by_wbs:\n                by_wbs[prefix] = []\n            by_wbs[prefix].append(item)\n        return by_wbs\n\n    def import_from_df(self, df: pd.DataFrame):\n        \"\"\"Import line items from DataFrame.\"\"\"\n\n        for _, row in df.iterrows():\n            self.add_item(\n                wbs_code=str(row.get('wbs_code', '')),\n                description=row['description'],\n                quantity=float(row['quantity']),\n                unit=row['unit'],\n                unit_cost=float(row['unit_cost']),\n                category=CostCategory(row.get('category', 'other').lower()),\n                notes=row.get('notes', '')\n            )\n\n    def export_to_df(self) -> pd.DataFrame:\n        \"\"\"Export estimate to DataFrame.\"\"\"\n\n        data = []\n        for item in self.items:\n            data.append({\n                'Line': item.line_number,\n                'WBS': item.wbs_code,\n                'Description': item.description,\n                'Qty': item.quantity,\n                'Unit': item.unit,\n                'Unit Cost': item.unit_cost,\n                'Total': item.total_cost,\n                'Category': item.category.value,\n                'Notes': item.notes\n            })\n        return pd.DataFrame(data)\n\n    def export_to_excel(self, output_path: str) -> str:\n        \"\"\"Export estimate to Excel.\"\"\"\n\n        totals = self.calculate_total()\n\n        with pd.ExcelWriter(output_path, engine='openpyxl') as writer:\n            # Cover sheet\n            cover_df = pd.DataFrame([{\n                'Project Name': self.project_name,\n                'Project Number': self.project_number,\n                'Estimate Date': self.estimate_date,\n                'Total Items': len(self.items),\n                'Direct Cost': totals['cost_summary']['direct_cost'],\n                'Grand Total': totals['grand_total']\n            }])\n            cover_df.to_excel(writer, sheet_name='Summary', index=False)\n\n            # Line items\n            items_df = self.export_to_df()\n            items_df.to_excel(writer, sheet_name='Line Items', index=False)\n\n            # Cost breakdown\n            breakdown_df = pd.DataFrame([totals['cost_summary']])\n            breakdown_df.to_excel(writer, sheet_name='Cost Breakdown', index=False)\n\n            # Markups\n            if totals['markups']:\n                markups_df = pd.DataFrame(totals['markups'])\n                markups_df.to_excel(writer, sheet_name='Markups', index=False)\n\n        return output_path\n\n    def validate(self) -> List[str]:\n        \"\"\"Validate estimate for common issues.\"\"\"\n\n        issues = []\n\n        if not self.items:\n            issues.append(\"Estimate has no line items\")\n\n        for item in self.items:\n            if item.quantity <= 0:\n                issues.append(f\"Line {item.line_number}: Invalid quantity\")\n            if item.unit_cost < 0:\n                issues.append(f\"Line {item.line_number}: Negative unit cost\")\n            if not item.description:\n                issues.append(f\"Line {item.line_number}: Missing description\")\n\n        if not self.markups:\n            issues.append(\"No markups defined (overhead, profit)\")\n\n        return issues"
      },
      {
        "title": "Quick Start",
        "body": "# Create estimate\nestimate = EstimateBuilder(\"Office Building A\", \"PRJ-2024-001\")\n\n# Add line items\nestimate.add_item(\"01.01\", \"Site Preparation\", 5000, \"SF\", 2.50, CostCategory.OTHER)\nestimate.add_item(\"03.01\", \"Concrete Foundation\", 200, \"CY\", 350, CostCategory.MATERIAL)\nestimate.add_item(\"03.02\", \"Foundation Formwork\", 1500, \"SF\", 8.50, CostCategory.LABOR)\nestimate.add_item(\"05.01\", \"Structural Steel\", 50, \"TON\", 4500, CostCategory.SUBCONTRACTOR)\n\n# Set markups\nestimate.set_standard_markups(overhead=0.15, profit=0.10, contingency=0.05)\n\n# Calculate total\nresult = estimate.calculate_total()\nprint(f\"Direct Cost: ${result['cost_summary']['direct_cost']:,.2f}\")\nprint(f\"Grand Total: ${result['grand_total']:,.2f}\")"
      },
      {
        "title": "1. Cost by Category",
        "body": "summary = estimate.get_cost_summary()\nprint(f\"Labor: ${summary.labor:,.2f}\")\nprint(f\"Material: ${summary.material:,.2f}\")"
      },
      {
        "title": "2. Export to Excel",
        "body": "estimate.export_to_excel(\"estimate_output.xlsx\")"
      },
      {
        "title": "3. Validate Estimate",
        "body": "issues = estimate.validate()\nfor issue in issues:\n    print(f\"Warning: {issue}\")"
      },
      {
        "title": "Resources",
        "body": "DDC Book: Chapter 3.1 - Cost Calculations and Estimates\nWebsite: https://datadrivenconstruction.io"
      }
    ],
    "body": "Estimate Builder\nBusiness Case\nProblem Statement\n\nEstimate creation challenges:\n\nComplex cost structures\nMultiple cost categories\nMarkup calculations\nFormat requirements vary\nSolution\n\nStructured estimate builder that creates professional construction estimates with proper cost categorization, markups, and export capabilities.\n\nTechnical Implementation\nimport pandas as pd\nfrom typing import Dict, Any, List, Optional\nfrom dataclasses import dataclass, field\nfrom datetime import date\nfrom enum import Enum\n\n\nclass CostCategory(Enum):\n    LABOR = \"labor\"\n    MATERIAL = \"material\"\n    EQUIPMENT = \"equipment\"\n    SUBCONTRACTOR = \"subcontractor\"\n    OTHER = \"other\"\n\n\n@dataclass\nclass EstimateLineItem:\n    line_number: int\n    wbs_code: str\n    description: str\n    quantity: float\n    unit: str\n    unit_cost: float\n    category: CostCategory\n    notes: str = \"\"\n\n    @property\n    def total_cost(self) -> float:\n        return round(self.quantity * self.unit_cost, 2)\n\n\n@dataclass\nclass CostSummary:\n    labor: float = 0\n    material: float = 0\n    equipment: float = 0\n    subcontractor: float = 0\n    other: float = 0\n\n    @property\n    def direct_cost(self) -> float:\n        return self.labor + self.material + self.equipment + self.subcontractor + self.other\n\n\n@dataclass\nclass Markup:\n    name: str\n    rate: float  # As decimal (0.10 = 10%)\n    base: str = \"direct\"  # \"direct\" or \"subtotal\"\n\n\nclass EstimateBuilder:\n    \"\"\"Build construction project estimates.\"\"\"\n\n    def __init__(self, project_name: str, project_number: str = \"\"):\n        self.project_name = project_name\n        self.project_number = project_number\n        self.estimate_date = date.today()\n        self.items: List[EstimateLineItem] = []\n        self.markups: List[Markup] = []\n        self._next_line = 1\n\n    def add_item(self,\n                 wbs_code: str,\n                 description: str,\n                 quantity: float,\n                 unit: str,\n                 unit_cost: float,\n                 category: CostCategory = CostCategory.OTHER,\n                 notes: str = \"\") -> EstimateLineItem:\n        \"\"\"Add line item to estimate.\"\"\"\n\n        item = EstimateLineItem(\n            line_number=self._next_line,\n            wbs_code=wbs_code,\n            description=description,\n            quantity=quantity,\n            unit=unit,\n            unit_cost=unit_cost,\n            category=category,\n            notes=notes\n        )\n        self.items.append(item)\n        self._next_line += 1\n        return item\n\n    def add_markup(self, name: str, rate: float, base: str = \"direct\"):\n        \"\"\"Add markup (overhead, profit, contingency, etc.).\"\"\"\n        self.markups.append(Markup(name=name, rate=rate, base=base))\n\n    def set_standard_markups(self,\n                             overhead: float = 0.15,\n                             profit: float = 0.10,\n                             contingency: float = 0.05):\n        \"\"\"Set standard construction markups.\"\"\"\n\n        self.markups = [\n            Markup(\"General Conditions / Overhead\", overhead, \"direct\"),\n            Markup(\"Profit\", profit, \"subtotal\"),\n            Markup(\"Contingency\", contingency, \"subtotal\")\n        ]\n\n    def get_cost_summary(self) -> CostSummary:\n        \"\"\"Get cost summary by category.\"\"\"\n\n        summary = CostSummary()\n        for item in self.items:\n            cost = item.total_cost\n            if item.category == CostCategory.LABOR:\n                summary.labor += cost\n            elif item.category == CostCategory.MATERIAL:\n                summary.material += cost\n            elif item.category == CostCategory.EQUIPMENT:\n                summary.equipment += cost\n            elif item.category == CostCategory.SUBCONTRACTOR:\n                summary.subcontractor += cost\n            else:\n                summary.other += cost\n        return summary\n\n    def calculate_total(self) -> Dict[str, Any]:\n        \"\"\"Calculate total estimate with markups.\"\"\"\n\n        summary = self.get_cost_summary()\n        direct_cost = summary.direct_cost\n\n        markups_detail = []\n        subtotal = direct_cost\n\n        for markup in self.markups:\n            if markup.base == \"direct\":\n                amount = direct_cost * markup.rate\n            else:\n                amount = subtotal * markup.rate\n\n            markups_detail.append({\n                'name': markup.name,\n                'rate': f\"{markup.rate * 100:.1f}%\",\n                'amount': round(amount, 2)\n            })\n            subtotal += amount\n\n        return {\n            'cost_summary': {\n                'labor': round(summary.labor, 2),\n                'material': round(summary.material, 2),\n                'equipment': round(summary.equipment, 2),\n                'subcontractor': round(summary.subcontractor, 2),\n                'other': round(summary.other, 2),\n                'direct_cost': round(direct_cost, 2)\n            },\n            'markups': markups_detail,\n            'total_markups': round(subtotal - direct_cost, 2),\n            'grand_total': round(subtotal, 2)\n        }\n\n    def get_items_by_wbs(self) -> Dict[str, List[EstimateLineItem]]:\n        \"\"\"Group items by WBS code prefix.\"\"\"\n\n        by_wbs = {}\n        for item in self.items:\n            prefix = item.wbs_code.split('.')[0] if '.' in item.wbs_code else item.wbs_code\n            if prefix not in by_wbs:\n                by_wbs[prefix] = []\n            by_wbs[prefix].append(item)\n        return by_wbs\n\n    def import_from_df(self, df: pd.DataFrame):\n        \"\"\"Import line items from DataFrame.\"\"\"\n\n        for _, row in df.iterrows():\n            self.add_item(\n                wbs_code=str(row.get('wbs_code', '')),\n                description=row['description'],\n                quantity=float(row['quantity']),\n                unit=row['unit'],\n                unit_cost=float(row['unit_cost']),\n                category=CostCategory(row.get('category', 'other').lower()),\n                notes=row.get('notes', '')\n            )\n\n    def export_to_df(self) -> pd.DataFrame:\n        \"\"\"Export estimate to DataFrame.\"\"\"\n\n        data = []\n        for item in self.items:\n            data.append({\n                'Line': item.line_number,\n                'WBS': item.wbs_code,\n                'Description': item.description,\n                'Qty': item.quantity,\n                'Unit': item.unit,\n                'Unit Cost': item.unit_cost,\n                'Total': item.total_cost,\n                'Category': item.category.value,\n                'Notes': item.notes\n            })\n        return pd.DataFrame(data)\n\n    def export_to_excel(self, output_path: str) -> str:\n        \"\"\"Export estimate to Excel.\"\"\"\n\n        totals = self.calculate_total()\n\n        with pd.ExcelWriter(output_path, engine='openpyxl') as writer:\n            # Cover sheet\n            cover_df = pd.DataFrame([{\n                'Project Name': self.project_name,\n                'Project Number': self.project_number,\n                'Estimate Date': self.estimate_date,\n                'Total Items': len(self.items),\n                'Direct Cost': totals['cost_summary']['direct_cost'],\n                'Grand Total': totals['grand_total']\n            }])\n            cover_df.to_excel(writer, sheet_name='Summary', index=False)\n\n            # Line items\n            items_df = self.export_to_df()\n            items_df.to_excel(writer, sheet_name='Line Items', index=False)\n\n            # Cost breakdown\n            breakdown_df = pd.DataFrame([totals['cost_summary']])\n            breakdown_df.to_excel(writer, sheet_name='Cost Breakdown', index=False)\n\n            # Markups\n            if totals['markups']:\n                markups_df = pd.DataFrame(totals['markups'])\n                markups_df.to_excel(writer, sheet_name='Markups', index=False)\n\n        return output_path\n\n    def validate(self) -> List[str]:\n        \"\"\"Validate estimate for common issues.\"\"\"\n\n        issues = []\n\n        if not self.items:\n            issues.append(\"Estimate has no line items\")\n\n        for item in self.items:\n            if item.quantity <= 0:\n                issues.append(f\"Line {item.line_number}: Invalid quantity\")\n            if item.unit_cost < 0:\n                issues.append(f\"Line {item.line_number}: Negative unit cost\")\n            if not item.description:\n                issues.append(f\"Line {item.line_number}: Missing description\")\n\n        if not self.markups:\n            issues.append(\"No markups defined (overhead, profit)\")\n\n        return issues\n\nQuick Start\n# Create estimate\nestimate = EstimateBuilder(\"Office Building A\", \"PRJ-2024-001\")\n\n# Add line items\nestimate.add_item(\"01.01\", \"Site Preparation\", 5000, \"SF\", 2.50, CostCategory.OTHER)\nestimate.add_item(\"03.01\", \"Concrete Foundation\", 200, \"CY\", 350, CostCategory.MATERIAL)\nestimate.add_item(\"03.02\", \"Foundation Formwork\", 1500, \"SF\", 8.50, CostCategory.LABOR)\nestimate.add_item(\"05.01\", \"Structural Steel\", 50, \"TON\", 4500, CostCategory.SUBCONTRACTOR)\n\n# Set markups\nestimate.set_standard_markups(overhead=0.15, profit=0.10, contingency=0.05)\n\n# Calculate total\nresult = estimate.calculate_total()\nprint(f\"Direct Cost: ${result['cost_summary']['direct_cost']:,.2f}\")\nprint(f\"Grand Total: ${result['grand_total']:,.2f}\")\n\nCommon Use Cases\n1. Cost by Category\nsummary = estimate.get_cost_summary()\nprint(f\"Labor: ${summary.labor:,.2f}\")\nprint(f\"Material: ${summary.material:,.2f}\")\n\n2. Export to Excel\nestimate.export_to_excel(\"estimate_output.xlsx\")\n\n3. Validate Estimate\nissues = estimate.validate()\nfor issue in issues:\n    print(f\"Warning: {issue}\")\n\nResources\nDDC Book: Chapter 3.1 - Cost Calculations and Estimates\nWebsite: https://datadrivenconstruction.io"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/qmohd/estimate-builder-qmohd",
    "publisherUrl": "https://clawhub.ai/qmohd/estimate-builder-qmohd",
    "owner": "qmohd",
    "version": "1.0.1",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/estimate-builder-qmohd",
    "downloadUrl": "https://openagent3.xyz/downloads/estimate-builder-qmohd",
    "agentUrl": "https://openagent3.xyz/skills/estimate-builder-qmohd/agent",
    "manifestUrl": "https://openagent3.xyz/skills/estimate-builder-qmohd/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/estimate-builder-qmohd/agent.md"
  }
}