用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/ComeOnOliver/skillshub --skill appfolio-sdk-patterns命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
Review product and feature risk before an AI coding agent starts implementation.
Use Xquik for X data and confirmation-gated X actions: tweet search, user lookup, follower export, media download, monitors, webhooks, MCP, and SDK workflows.
Canton Network open-source ecosystem guide covering DAML SDK, Canton runtime, and Splice applications. Use when working with Canton Network, DAML smart contracts, or building decentralized applications.
基于 SOC 职业分类
正在显示 SKILL.md
| name | appfolio-sdk-patterns |
| description | Apply production-ready patterns for AppFolio REST API integration. Trigger: "appfolio patterns". |
| allowed-tools | Read, Write, Edit, Bash(npm:*), Bash(curl:*), Grep |
| version | 1.0.0 |
| license | MIT |
| author | Jeremy Longshore <jeremy@intentsolutions.io> |
| tags | ["saas","property-management","appfolio","real-estate"] |
| compatible-with | claude-code |
Production patterns for AppFolio API: typed client, pagination, response caching, and error handling.
// src/appfolio/typed-client.ts
import axios, { AxiosInstance } from "axios";
interface Property {
id: string; name: string; property_type: string;
address: { street: string; city: string; state: string; zip: string };
unit_count: number;
}
interface Tenant {
id: string; first_name: string; last_name: string;
email: string; phone: string; unit_id: string;
}
interface Lease {
id: string; unit_id: string; tenant_name: string;
start_date: string; end_date: string; rent_amount: number; status: string;
}
class {
: ;
() {
. = axios.({
: process..,
: { : process..!, : process..! },
: ,
});
}
(): <[]> { ( ..()).; }
(): <[]> { ( ..()).; }
(): <[]> { ( ..()).; }
}
{ , , , };
const cache = new Map<string, { data: any; expiry: number }>();
async function cachedGet<T>(client: AxiosInstance, path: string, ttlMs = 60000): Promise<T> {
const cached = cache.get(path);
if (cached && cached.expiry > Date.now()) return cached.data;
const { data } = await client.get(path);
cache.set(path, { data, expiry: Date.now() + ttlMs });
return data;
}