前端测试
- 作者仓库星标 27
- 作者更新于 实时读取
- 作者仓库 pcl
- 领域
- 通用 · hospitality · hotel · reservation
- 兼容 Agent
-
- Claude Code
- Cursor
- Cline
- Codex
- Windsurf
- Gemini CLI
- +20
- 信任分
- 98 / 100 · 已通过审计
- 作者 / 版本 / 许可
- @personamanagmentlayer · v1.0.0 · 未声明 license
- Token 消耗评级
- 较高消耗
- 接入复杂程度
- 需简单配置
- 是否需要外部 API Key
- 不需要
- 兼容的系统
- 未声明(默认跨平台)
- 底层运行要求
- Python
- 文件与系统权限
-
- 只读
- 允许写入 / 修改
- Shell 执行
- 网络行为
- 仅限本地
- 安装命令数
- 26 条
档案由构建时根据 SKILL.md 与安装命令自动衍生,可能与作者实际意图存在差异。
---
name: hospitality-expert
description: Expert-level hotel management, reservation systems, guest services, revenue management, and hosp…
category: 通用
runtime: Python
---
# hospitality-expert 输出预览
## PART A: 任务判断
- 适用问题:通用任务拆解、检查和交付。
- 输入要求:目标材料、限制条件、期望输出和验收方式。
- 证据边界:围绕“Core Concepts / Hotel Management Systems / Technologies”读取原文规则,不把推断写成作者承诺。
## PART B: 执行结果
- **01** 任务判断:确认你的需求是否属于通用任务拆解、检查和交付,并标出输入、限制和预期结果。
- **02** 执行计划:优先按“Core Concepts / Hotel Management Systems / Technologies”拆成步骤,说明每一步会读取什么、修改什么、产出什么。
- **03** 交付结果:给出可复制的命令、文件改动、检查清单或内容草稿,并说明如何继续迭代。
- **04** 风险边界:结合 读取文件、写入/修改文件、执行终端命令、主要在本地完成、通常不需要额外 API Key 给出执行前确认项。
## Running Rules
- 读取文件、写入/修改文件、执行终端命令;主要在本地完成;通常不需要额外 API Key。
- 先小样例验证,再放大到真实任务。
- 交付时同时给结果、检查口径和下一步迭代建议。 原文没有稳定的斜杠命令要求。安装验证后通常全局生效,直接在对话里点名这个 Skill 并描述任务即可。
告诉 Agent 目标文件或材料、期望结果、不可改范围、是否允许联网或执行命令。本 Skill 的权限画像是:读取文件、写入/修改文件、执行终端命令。
先用一个小任务确认它会围绕“Core Concepts / Hotel Management Systems / Technologies”工作;涉及文件或命令时,先看 diff、日志、预览或测试结果。
检查最终产物是否包含明确结果、必要证据和下一步动作;如果输出泛泛而谈,就补充输入、边界和验收标准后重跑。
---
name: hospitality-expert
description: Expert-level hotel management, reservation systems, guest services, revenue management, and hosp…
category: 通用
source: personamanagmentlayer/pcl
---
# hospitality-expert
## 什么时候使用
- hospitality-expert 是一个通用扩展技能,按 SKILL 适合处理通用任务拆解、检查、交付和复盘,核心价值是把输入、判断、执行、验证和交付边界固定下来,避免 Agent 泛泛回答。 围绕 hospitality、hote…
- 面向通用任务拆解、检查和交付,优先处理能明确输入、步骤和验收标准的工作。
## 需要提供什么
- 目标材料、目录范围、期望结果和不可改动内容。
- 是否允许联网、执行命令、读写文件或调用外部服务。
## 执行规则
- 围绕「Core Concepts / Hotel Management Systems / Technologies」组织步骤,不把推断写成作者事实。
- 读取文件、写入/修改文件、执行终端命令;主要在本地完成;通常不需要额外 API Key。
- 先跑小样例,确认结果可检查后再扩大任务范围。
## 输出要求
- 给出最终产物、关键证据、验证方式和下一步动作。
- 信息不足时标记 unknown,不编造命令、平台或依赖。 作者原文负责流程事实;仓库文件负责来源和命令;流狐只补充适用场景、限制和质量判断。
skill "hospitality-expert" {
输入层 -> 用户目标 + 目标文件 + 禁止范围 + 验收标准
上下文层 -> Core Concepts / Hotel Management Systems / Technologies
规则层 -> SKILL.md 触发条件 / 执行顺序 / 输出格式
运行层 -> Python | 读取文件、写入/修改文件、执行终端命令 | 主要在本地完成
安全层 -> 通常不需要额外 API Key + 小任务验证 + diff / 日志复核
输出层 -> 可复制结果 + 检查清单 + 下一步迭代
} Hospitality Expert
Expert guidance for hotel management, reservation systems, property management systems (PMS), guest services, revenue management, and hospitality technology solutions.
Core Concepts
Hotel Management Systems
- Property Management System (PMS)
- Central Reservation System (CRS)
- Revenue Management System (RMS)
- Channel Manager
- Point of Sale (POS)
- Guest Relationship Management (GRM)
- Housekeeping management
Technologies
- Mobile check-in/check-out
- Digital key systems
- Guest messaging platforms
- IoT for room automation
- AI chatbots for customer service
- Contactless payments
- Energy management systems
Standards and Protocols
- HTNG (Hotel Technology Next Generation)
- OpenTravel Alliance standards
- PCI-DSS for payment security
- ADA compliance for accessibility
- Brand standards (if franchise)
- OTA integrations (Booking.com, Expedia)
Property Management System
from dataclasses import dataclass
from datetime import datetime, timedelta, date
from typing import List, Optional, Dict
from decimal import Decimal
from enum import Enum
class RoomType(Enum):
STANDARD = "standard"
DELUXE = "deluxe"
SUITE = "suite"
EXECUTIVE = "executive"
class RoomStatus(Enum):
VACANT_CLEAN = "vacant_clean"
VACANT_DIRTY = "vacant_dirty"
OCCUPIED_CLEAN = "occupied_clean"
OCCUPIED_DIRTY = "occupied_dirty"
OUT_OF_ORDER = "out_of_order"
OUT_OF_SERVICE = "out_of_service"
class ReservationStatus(Enum):
CONFIRMED = "confirmed"
CHECKED_IN = "checked_in"
CHECKED_OUT = "checked_out"
CANCELLED = "cancelled"
NO_SHOW = "no_show"
@dataclass
class Room:
"""Hotel room information"""
room_number: str
room_type: RoomType
floor: int
status: RoomStatus
base_rate: Decimal
features: List[str]
bed_type: str
max_occupancy: int
square_feet: int
is_smoking: bool
@dataclass
class Reservation:
"""Guest reservation"""
reservation_id: str
guest_name: str
guest_email: str
guest_phone: str
room_type: RoomType
check_in_date: date
check_out_date: date
num_adults: int
num_children: int
status: ReservationStatus
rate_per_night: Decimal
total_amount: Decimal
special_requests: str
created_at: datetime
booking_source: str # 'direct', 'ota', 'phone', etc.
assigned_room: Optional[str]
@dataclass
class Folio:
"""Guest folio (bill)"""
folio_id: str
reservation_id: str
room_number: str
guest_name: str
charges: List[Dict]
total_charges: Decimal
payments: List[Dict]
balance: Decimal
class PropertyManagementSystem:
"""Hotel property management system"""
def __init__(self):
self.rooms = {}
self.reservations = {}
self.folios = {}
self.guests = {}
def create_reservation(self, reservation_data: dict) -> Reservation:
"""Create new reservation"""
reservation_id = self._generate_reservation_id()
# Calculate total amount
check_in = reservation_data['check_in_date']
check_out = reservation_data['check_out_date']
num_nights = (check_out - check_in).days
rate_per_night = Decimal(str(reservation_data['rate_per_night']))
total_amount = rate_per_night * num_nights
reservation = Reservation(
reservation_id=reservation_id,
guest_name=reservation_data['guest_name'],
guest_email=reservation_data['guest_email'],
guest_phone=reservation_data['guest_phone'],
room_type=RoomType(reservation_data['room_type']),
check_in_date=check_in,
check_out_date=check_out,
num_adults=reservation_data['num_adults'],
num_children=reservation_data.get('num_children', 0),
status=ReservationStatus.CONFIRMED,
rate_per_night=rate_per_night,
total_amount=total_amount,
special_requests=reservation_data.get('special_requests', ''),
created_at=datetime.now(),
booking_source=reservation_data.get('booking_source', 'direct'),
assigned_room=None
)
self.reservations[reservation_id] = reservation
return reservation
def check_in_guest(self, reservation_id: str) -> dict:
"""Process guest check-in"""
reservation = self.reservations.get(reservation_id)
if not reservation:
return {'error': 'Reservation not found'}
# Find available room of requested type
available_room = self._find_available_room(
reservation.room_type,
reservation.check_in_date,
reservation.check_out_date
)
if not available_room:
return {'error': 'No rooms available of requested type'}
# Assign room
reservation.assigned_room = available_room.room_number
reservation.status = ReservationStatus.CHECKED_IN
# Update room status
available_room.status = RoomStatus.OCCUPIED_CLEAN
# Create folio
folio = self._create_folio(reservation, available_room)
return {
'reservation_id': reservation_id,
'room_number': available_room.room_number,
'guest_name': reservation.guest_name,
'check_in_time': datetime.now().isoformat(),
'check_out_date': reservation.check_out_date.isoformat(),
'folio_id': folio.folio_id
}
def check_out_guest(self, reservation_id: str) -> dict:
"""Process guest check-out"""
reservation = self.reservations.get(reservation_id)
if not reservation:
return {'error': 'Reservation not found'}
# Get folio
folio = next(
(f for f in self.folios.values() if f.reservation_id == reservation_id),
None
)
if not folio:
return {'error': 'Folio not found'}
# Check for outstanding balance
if folio.balance > 0:
return {
'error': 'Outstanding balance',
'balance_due': float(folio.balance)
}
# Update reservation status
reservation.status = ReservationStatus.CHECKED_OUT
# Update room status
if reservation.assigned_room:
room = self.rooms.get(reservation.assigned_room)
if room:
room.status = RoomStatus.VACANT_DIRTY
return {
'reservation_id': reservation_id,
'guest_name': reservation.guest_name,
'check_out_time': datetime.now().isoformat(),
'total_charges': float(folio.total_charges),
'folio_summary': {
'room_charges': float(folio.total_charges),
'payments_received': float(folio.total_charges - folio.balance)
}
}
def _find_available_room(self,
room_type: RoomType,
check_in: date,
check_out: date) -> Optional[Room]:
"""Find available room of specified type"""
for room in self.rooms.values():
if room.room_type != room_type:
continue
if room.status not in [RoomStatus.VACANT_CLEAN, RoomStatus.VACANT_DIRTY]:
continue
# Check if room is available for date range
if self._is_room_available(room.room_number, check_in, check_out):
return room
return None
def _is_room_available(self, room_number: str, check_in: date, check_out: date) -> bool:
"""Check if room is available for date range"""
for reservation in self.reservations.values():
if reservation.assigned_room != room_number:
continue
if reservation.status in [ReservationStatus.CANCELLED, ReservationStatus.NO_SHOW]:
continue
# Check for date overlap
if not (check_out <= reservation.check_in_date or check_in >= reservation.check_out_date):
return False
return True
def _create_folio(self, reservation: Reservation, room: Room) -> Folio:
"""Create guest folio"""
folio_id = self._generate_folio_id()
# Calculate room charges
num_nights = (reservation.check_out_date - reservation.check_in_date).days
room_charge = reservation.rate_per_night * num_nights
charges = [{
'date': datetime.now(),
'description': f'Room {room.room_number} - {num_nights} nights',
'amount': float(room_charge)
}]
folio = Folio(
folio_id=folio_id,
reservation_id=reservation.reservation_id,
room_number=room.room_number,
guest_name=reservation.guest_name,
charges=charges,
total_charges=room_charge,
payments=[],
balance=room_charge
)
self.folios[folio_id] = folio
return folio
def post_charge(self, folio_id: str, charge_data: dict) -> dict:
"""Post charge to guest folio"""
folio = self.folios.get(folio_id)
if not folio:
return {'error': 'Folio not found'}
charge = {
'date': datetime.now(),
'description': charge_data['description'],
'amount': float(Decimal(str(charge_data['amount'])))
}
folio.charges.append(charge)
folio.total_charges += Decimal(str(charge_data['amount']))
folio.balance += Decimal(str(charge_data['amount']))
return {
'folio_id': folio_id,
'charge_posted': charge,
'new_balance': float(folio.balance)
}
def process_payment(self, folio_id: str, payment_data: dict) -> dict:
"""Process payment for folio"""
folio = self.folios.get(folio_id)
if not folio:
return {'error': 'Folio not found'}
payment_amount = Decimal(str(payment_data['amount']))
if payment_amount > folio.balance:
return {'error': 'Payment exceeds balance'}
payment = {
'date': datetime.now(),
'payment_method': payment_data['payment_method'],
'amount': float(payment_amount)
}
folio.payments.append(payment)
folio.balance -= payment_amount
return {
'folio_id': folio_id,
'payment_processed': payment,
'remaining_balance': float(folio.balance)
}
def get_room_availability(self, check_in: date, check_out: date) -> dict:
"""Get room availability for date range"""
availability = {}
for room_type in RoomType:
available_count = 0
for room in self.rooms.values():
if room.room_type == room_type:
if self._is_room_available(room.room_number, check_in, check_out):
available_count += 1
availability[room_type.value] = available_count
return {
'check_in_date': check_in.isoformat(),
'check_out_date': check_out.isoformat(),
'availability': availability
}
def _generate_reservation_id(self) -> str:
import uuid
return f"RES-{uuid.uuid4().hex[:10].upper()}"
def _generate_folio_id(self) -> str:
import uuid
return f"FOL-{uuid.uuid4().hex[:8].upper()}"
Revenue Management System
import numpy as np
class RevenueManagementSystem:
"""Hotel revenue management and dynamic pricing"""
def __init__(self):
self.pricing_rules = []
self.demand_forecast = {}
def calculate_dynamic_rate(self,
room_type: RoomType,
check_in_date: date,
days_until_arrival: int,
current_occupancy: float,
historical_data: dict) -> Decimal:
"""Calculate dynamic room rate"""
# Base rate
base_rates = {
RoomType.STANDARD: Decimal('150'),
RoomType.DELUXE: Decimal('200'),
RoomType.SUITE: Decimal('350'),
RoomType.EXECUTIVE: Decimal('450')
}
base_rate = base_rates.get(room_type, Decimal('150'))
# Demand multiplier based on occupancy
if current_occupancy > 0.85:
demand_multiplier = Decimal('1.30') # High demand
elif current_occupancy > 0.70:
demand_multiplier = Decimal('1.15') # Moderate demand
elif current_occupancy > 0.50:
demand_multiplier = Decimal('1.00') # Normal
else:
demand_multiplier = Decimal('0.85') # Low demand
# Booking window multiplier
if days_until_arrival < 7:
window_multiplier = Decimal('1.20') # Last minute
elif days_until_arrival < 14:
window_multiplier = Decimal('1.10')
elif days_until_arrival > 60:
window_multiplier = Decimal('0.90') # Early bird
else:
window_multiplier = Decimal('1.00')
# Day of week adjustment
if check_in_date.weekday() in [4, 5]: # Friday, Saturday
day_multiplier = Decimal('1.25')
elif check_in_date.weekday() == 6: # Sunday
day_multiplier = Decimal('0.95')
else:
day_multiplier = Decimal('1.00')
# Calculate final rate
dynamic_rate = base_rate * demand_multiplier * window_multiplier * day_multiplier
# Round to nearest dollar
dynamic_rate = dynamic_rate.quantize(Decimal('1'))
return dynamic_rate
def forecast_demand(self, start_date: date, days: int) -> dict:
"""Forecast demand for upcoming period"""
forecast = {}
for i in range(days):
forecast_date = start_date + timedelta(days=i)
# Simplified demand forecast
# In production, would use ML models
base_demand = 70.0 # 70% base occupancy
# Day of week factor
if forecast_date.weekday() in [4, 5]: # Weekend
day_factor = 15
elif forecast_date.weekday() == 6:
day_factor = -10
else:
day_factor = 0
# Seasonality factor (simplified)
month = forecast_date.month
if month in [6, 7, 8]: # Summer
season_factor = 10
elif month in [12, 1]: # Holiday season
season_factor = 15
else:
season_factor = 0
forecasted_occupancy = base_demand + day_factor + season_factor
forecasted_occupancy = min(100, max(0, forecasted_occupancy))
forecast[forecast_date.isoformat()] = {
'date': forecast_date.isoformat(),
'forecasted_occupancy': forecasted_occupancy,
'confidence': 'high' if i < 14 else 'medium' if i < 30 else 'low'
}
return forecast
def optimize_inventory(self, total_rooms: int, date_range: tuple) -> dict:
"""Optimize room inventory allocation"""
# Allocate rooms across different channels
# Direct bookings, OTAs, corporate contracts, etc.
allocation = {
'direct': int(total_rooms * 0.40), # 40% direct
'ota': int(total_rooms * 0.35), # 35% OTAs
'corporate': int(total_rooms * 0.15), # 15% corporate
'walk_in': int(total_rooms * 0.10) # 10% walk-ins
}
return {
'total_rooms': total_rooms,
'allocation': allocation,
'date_range': {
'start': date_range[0].isoformat(),
'end': date_range[1].isoformat()
}
}
def calculate_revpar(self, revenue: Decimal, available_rooms: int) -> Decimal:
"""Calculate Revenue Per Available Room"""
if available_rooms == 0:
return Decimal('0')
revpar = revenue / available_rooms
return revpar.quantize(Decimal('0.01'))
def calculate_adr(self, revenue: Decimal, rooms_sold: int) -> Decimal:
"""Calculate Average Daily Rate"""
if rooms_sold == 0:
return Decimal('0')
adr = revenue / rooms_sold
return adr.quantize(Decimal('0.01'))
Guest Services Management
@dataclass
class GuestRequest:
"""Guest service request"""
request_id: str
reservation_id: str
room_number: str
guest_name: str
request_type: str # 'housekeeping', 'maintenance', 'concierge', 'amenity'
description: str
priority: str # 'low', 'medium', 'high'
status: str # 'open', 'in_progress', 'completed'
created_at: datetime
assigned_to: Optional[str]
completed_at: Optional[datetime]
class GuestServicesSystem:
"""Guest services and experience management"""
def __init__(self):
self.requests = []
self.guest_preferences = {}
self.loyalty_members = {}
def submit_guest_request(self, request_data: dict) -> GuestRequest:
"""Submit guest service request"""
request = GuestRequest(
request_id=self._generate_request_id(),
reservation_id=request_data['reservation_id'],
room_number=request_data['room_number'],
guest_name=request_data['guest_name'],
request_type=request_data['request_type'],
description=request_data['description'],
priority=request_data.get('priority', 'medium'),
status='open',
created_at=datetime.now(),
assigned_to=None,
completed_at=None
)
self.requests.append(request)
# Auto-assign based on request type
self._auto_assign_request(request)
return request
def track_guest_preferences(self, guest_id: str, preferences: dict):
"""Track guest preferences for personalization"""
self.guest_preferences[guest_id] = {
'room_preferences': {
'floor': preferences.get('preferred_floor'),
'bed_type': preferences.get('bed_type'),
'view': preferences.get('view_preference')
},
'amenities': preferences.get('amenities', []),
'dietary_restrictions': preferences.get('dietary_restrictions', []),
'special_occasions': preferences.get('special_occasions', {}),
'communication_preference': preferences.get('communication', 'email')
}
def calculate_guest_satisfaction_score(self, reservation_id: str) -> dict:
"""Calculate guest satisfaction metrics"""
# Simulate guest satisfaction score
# In production, would be based on surveys and feedback
metrics = {
'overall_satisfaction': 4.5, # Out of 5
'check_in_experience': 4.7,
'room_quality': 4.3,
'staff_friendliness': 4.8,
'cleanliness': 4.6,
'value_for_money': 4.2,
'likelihood_to_recommend': 9.0 # NPS score (0-10)
}
return {
'reservation_id': reservation_id,
'satisfaction_metrics': metrics,
'nps_category': 'promoter' if metrics['likelihood_to_recommend'] >= 9 else
'passive' if metrics['likelihood_to_recommend'] >= 7 else
'detractor'
}
def _auto_assign_request(self, request: GuestRequest):
"""Auto-assign request to staff"""
# Would implement smart assignment logic
assignments = {
'housekeeping': 'housekeeping_team',
'maintenance': 'maintenance_team',
'concierge': 'concierge_team',
'amenity': 'front_desk'
}
request.assigned_to = assignments.get(request.request_type, 'front_desk')
def _generate_request_id(self) -> str:
import uuid
return f"REQ-{uuid.uuid4().hex[:8].upper()}"
Best Practices
Reservations Management
- Implement real-time availability
- Use channel manager for distribution
- Enable mobile booking
- Implement flexible cancellation policies
- Send automated confirmations
- Track booking sources
- Enable group bookings
Revenue Management
- Implement dynamic pricing
- Monitor competitor rates
- Forecast demand accurately
- Optimize inventory allocation
- Track RevPAR and ADR
- Use yield management strategies
- Analyze booking patterns
Guest Experience
- Personalize guest interactions
- Enable mobile check-in/out
- Provide digital concierge services
- Track guest preferences
- Respond promptly to requests
- Implement loyalty programs
- Gather feedback systematically
Operations
- Maintain housekeeping efficiency
- Implement preventive maintenance
- Use automated messaging
- Monitor room status in real-time
- Optimize staff scheduling
- Track operational metrics
- Ensure PCI-DSS compliance
Anti-Patterns
❌ Manual reservation management ❌ Static pricing year-round ❌ No guest preference tracking ❌ Poor channel management ❌ Slow response to guest requests ❌ No mobile capabilities ❌ Inadequate staff training ❌ Poor data security ❌ No revenue analytics
Resources
- HTNG (Hotel Technology Next Generation): https://htng.org/
- HSMAI (Hospitality Sales and Marketing Association): https://www.hsmai.org/
- AHLA (American Hotel & Lodging Association): https://www.ahla.com/
- STR (Hotel data and analytics): https://str.com/
- OpenTravel Alliance: https://opentravel.org/
- Hospitality Technology: https://www.hospitalitytech.com/
- Revenue Management Best Practices: https://www.revparguru.com/
先判断是否适合
作者设计意图
作者的方法与取舍
边界和复核