mcpField
P
project-closeout-checklist

project-closeout-checklist

github.com/datadrivenconstruction生産性375107 回インストール1 週間前に更新
リポジトリ

project-closeout-checklist について

建設プロジェクトの完了時に必要な項目を追跡するチェックリストスキルです。項目のステータス更新と全体の完了率の算出に対応し、クローズアウトの進捗管理に役立ちます。

主な機能

  1. 01完了チェックリスト項目の追跡
  2. 02メモ付きの項目ステータス更新
  3. 03全体の完了率の算出

活用シーン

  1. 01クローズアウト作業の完了状況の管理
  2. 02完了時提出物の受領記録

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/datadrivenconstruction/ddc_skills_for_ai_agents_in_construction --skill project-closeout-checklist

インストール後、Claude Code で/project-closeout-checklistを入力して読み込まれたか確認します。

同梱ファイルclaw.jsoninstructions.md

README(原文)English

プロジェクトの README より

この README の日本語訳はまだありません。以下は英語の原文です。日本語の紹介はページ上部をご覧ください。

Project Closeout Checklist

Technical Implementation

import pandas as pd
from datetime import date
from typing import Dict, Any, List, Optional
from dataclasses import dataclass, field
from enum import Enum


class ChecklistCategory(Enum):
    DOCUMENTATION = "documentation"
    FINANCIAL = "financial"
    INSPECTIONS = "inspections"
    TRAINING = "training"
    WARRANTIES = "warranties"
    PUNCHLIST = "punchlist"
    TURNOVER = "turnover"


class ItemStatus(Enum):
    NOT_STARTED = "not_started"
    IN_PROGRESS = "in_progress"
    COMPLETE = "complete"
    NOT_APPLICABLE = "not_applicable"


@dataclass
class CloseoutItem:
    item_id: str
    description: str
    category: ChecklistCategory
    responsible_party: str
    due_date: date
    status: ItemStatus
    completed_date: Optional[date] = None
    notes: str = ""
    attachments: List[str] = field(default_factory=list)


class ProjectCloseoutChecklist:
    def __init__(self, project_name: str, substantial_completion: date):
        self.project_name = project_name
        self.substantial_completion = substantial_completion
        self.items: Dict[str, CloseoutItem] = {}
        self._load_standard_items()

    def _load_standard_items(self):
        standard = [
            ("Documentation", ChecklistCategory.DOCUMENTATION, [
                "As-built drawings", "O&M manuals", "Attic stock",
                "Keying schedule", "Equipment list"
            ]),
            ("Financial", ChecklistCategory.FINANCIAL, [
                "Final payment application", "Release of liens",
                "Consent of surety", "Final change orders"
            ]),
            ("Inspections", ChecklistCategory.INSPECTIONS, [
                "Final building inspection", "Fire marshal inspection",
                "Elevator inspection", "Certificate of Occupancy"
            ]),
            ("Training", ChecklistCategory.TRAINING, [
                "HVAC system training", "Fire alarm training",
                "Security system training", "BAS training"
            ]),
            ("Warranties", ChecklistCategory.WARRANTIES, [
                "Roofing warranty", "HVAC warranty", "Elevator warranty",
                "General contractor warranty"
            ])
        ]

        counter = 0
        for category_name, category, items in standard:
            for desc in items:
                counter += 1
                item_id = f"CLO-{counter:03d}"
                self.items[item_id] = CloseoutItem(
                    item_id=item_id,
                    description=desc,
                    category=category,
                    responsible_party="Contractor",
                    due_date=self.substantial_completion,
                    status=ItemStatus.NOT_STARTED
                )

    def add_item(self, description: str, category: ChecklistCategory,
                responsible_party: str, due_date: date) -> CloseoutItem:
        item_id = f"CLO-{len(self.items) + 1:03d}"
        item = CloseoutItem(
            item_id=item_id,
            description=description,
            category=category,
            responsible_party=responsible_party,
            due_date=due_date,
            status=ItemStatus.NOT_STARTED
        )
        self.items[item_id] = item
        return item

    def update_status(self, item_id: str, status: ItemStatus, notes: str = ""):
        if item_id in self.items:
            self.items[item_id].status = status
            if status == ItemStatus.COMPLETE:
                self.items[item_id].completed_date = date.today()
            if notes:
                self.items[item_id].notes = notes

    def get_completion_percentage(self) -> float:
        applicable = [i for i in self.items.values()
                     if i.status != ItemStatus.NOT_APPLICABLE]
        complete = [i for i in applicable if i.status == ItemStatus.COMPLETE]
        return (len(complete) / len(applicable) * 100) if applicable else 0

    def get_outstanding_items(self) -> List[CloseoutItem]:
        return [i for i in self.items.values()
                if i.status in [ItemStatus.NOT_STARTED, ItemStatus.IN_PROGRESS]]

    def get_summary_by_category(self) -> Dict[str, Dict[str, int]]:
        summary = {}
        for item in self.items.values():
            cat = item.category.value
            if cat not in summary:
                summary[cat] = {'total': 0, 'complete': 0, 'outstanding': 0}
            summary[cat]['total'] += 1
            if item.status == ItemStatus.COMPLETE:
                summary[cat]['complete'] += 1
            elif item.status != ItemStatus.NOT_APPLICABLE:
                summary[cat]['outstanding'] += 1
        return summary

    def export_checklist(self, output_path: str):
        data = [{
            'ID': i.item_id,
            'Description': i.description,
            'Category': i.category.value,
            'Responsible': i.responsible_party,
            'Due': i.due_date,
            'Status': i.status.value,
            'Completed': i.completed_date,
            'Notes': i.notes
        } for i in self.items.values()]
        pd.DataFrame(data).to_excel(output_path, index=False)

Quick Start

checklist = ProjectCloseoutChecklist("Office Tower", date(2024, 12, 1))

# Update item status
checklist.update_status("CLO-001", ItemStatus.COMPLETE, "Received from architect")

# Check progress
print(f"Completion: {checklist.get_completion_percentage():.1f}%")

outstanding = checklist.get_outstanding_items()
print(f"Outstanding items: {len(outstanding)}")

Resources

  • DDC Book: Chapter 5 - Project Closeout

コメント