Agent skill

Appfolio CI Integration

by jeremylongshore in jeremylongshore/tons-of-skills-marketplace

Configure CI/CD pipeline for AppFolio property management integrations.

MITAuto-check passedDevOps & Cloud

Install Appfolio CI Integration

skills CLI
$ npx skills add jeremylongshore/tons-of-skills-marketplace --skill appfolio-ci-integration -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install jeremylongshore/tons-of-skills-marketplace appfolio-ci-integration --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/jeremylongshore/tons-of-skills-marketplace.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/.curated/appfolio-ci-integration .claude/skills/appfolio-ci-integration && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
appfolio-ci-integration
GitHub stars
2.8k
Token cost
~1.8k tokens
SKILL.md length
465 words
Files
1
Skills in repo
3,342
Repo updated
First seen
Licence
MIT

At a glance

Configure CI/CD pipeline for AppFolio property management integrations.

  • Works in 4 steps: Keep pull-request checks mock-only; do… → Gate the live sandbox job to protected… → Limit the integration run to a known… → …
  • Tasks that involve Real estate
  • SKILL.md covers Overview, Prerequisites, Instructions and GitHub Actions Workflow, plus 8 more sections
  • Needs APPFOLIO_CLIENT_SECRET

What it does

Appfolio CI Integration is an agent skill from jeremylongshore/tons-of-skills-marketplace. Configure CI/CD pipeline for AppFolio property management integrations. Trigger: "appfolio CI".

Its SKILL.md is about 1.8k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts. Compatibility notes: Designed for Claude Code

It sits in DevOps & Cloud, covering Real estate and CI/CD. The repository describes itself as: Model-agnostic agent-skills platform with a harness-free canonical layer, verified adapters, and the ccpi package manager. Explore at tonsofskills.com. The licence is MIT.

When your agent uses it

  • Tasks that involve Real estate
  • Tasks that involve CI/CD

Example prompts

  • “appfolio CI”
  • “/appfolio-ci-integration”

Requirements

  • A credential in APPFOLIO_CLIENT_SECRET
  • Compatibility (from SKILL.md): Designed for Claude Code
  • Pre-approved tools (allowed-tools): Read, Write, Edit, Bash(npm:*), Bash(curl:*), Grep

Workflow steps

4 steps, taken from the first numbered list in SKILL.md.

  1. Keep pull-request checks mock-only; do not expose AppFolio credentials to
  2. Gate the live sandbox job to protected main pushes after lint, type, and
  3. Limit the integration run to a known read-only fixture, one worker, and the
  4. Treat failed authentication, rate limits, or missing fixtures as a blocked

What it can do on your machine

Read from SKILL.md and the folder at commit cfae287. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves these tools, so the agent can use them without asking each time:

    • Read
    • Write
    • Edit
    • Bash(npm:*)
    • Bash(curl:*)
    • Grep

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    No scripts in the folder and no shell commands in SKILL.md (its code samples are typescript and yaml).

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Links to these hosts (documentation or services it may open):

    • appfolio.com
    • docs.github.com

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names these keys or tokens, usually read from environment variables:

    • APPFOLIO_CLIENT_SECRET

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

  • Compatibility

    Designed for Claude Code

    From compatibility in the SKILL.md frontmatter.

Context cost

Appfolio CI Integration loads about 1.8k tokens when it runs. Until then it costs about 30 tokens; SKILL.md has 465 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~30
When it runs · the whole SKILL.md, loaded when a task matches
~1.8k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from jeremylongshore/tons-of-skills-marketplace at commit cfae287, republished under its MIT licence (© jeremylongshore). 465 words, ~1,770 tokens.

Download SKILL.mdSave it as .claude/skills/appfolio-ci-integration/SKILL.md (or your agent's skills folder).
name
appfolio-ci-integration
description
Configure CI/CD pipeline for AppFolio property management integrations. Trigger: "appfolio CI".
allowed-tools
Read, Write, Edit, Bash(npm:*), Bash(curl:*), Grep
compatibility
Designed for Claude Code
version
1.5.0
license
MIT
author
Jeremy Longshore <jeremy@intentsolutions.io>
tags
saas, property-management, appfolio, real-estate

AppFolio CI Integration

Overview

Configure CI pipelines that validate AppFolio property management API integrations using a two-tier strategy. Unit tests mock the AppFolio REST client to verify tenant lookup, work order creation, and property listing logic without consuming API quota. Integration tests run against the AppFolio sandbox environment on main-branch merges only, using Basic Auth credentials stored as GitHub secrets. This keeps PR feedback fast and free while catching real API contract drift before production deploys.

Prerequisites

  • A repository with Actions enabled, a locked dependency install, and unit tests that use only synthetic tenant, property, and work-order fixtures.
  • A separately managed AppFolio sandbox credential and a pre-provisioned, non-production fixture record that the integration owner is allowed to read.
  • Defined CI ownership, a fixed request budget, and an incident path for credential rotation, provider outage, or sandbox data reset.

Instructions

  1. Keep pull-request checks mock-only; do not expose AppFolio credentials to untrusted code or forked pull requests.
  2. Gate the live sandbox job to protected main pushes after lint, type, and unit checks pass, and inject credentials only through repository secrets.
  3. Limit the integration run to a known read-only fixture, one worker, and the stated request budget; record only redacted status and count evidence.
  4. Treat failed authentication, rate limits, or missing fixtures as a blocked release condition rather than creating shared sandbox data from CI.

GitHub Actions Workflow

yaml
# .github/workflows/appfolio-tests.yml
name: AppFolio API Tests
on: [push, pull_request]

jobs:
  unit-tests:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with: { node-version: '20' }
      - run: npm ci
      - run: npm run lint && npm run typecheck
      - run: npm test -- --testPathPattern=unit  # No API credentials needed

  integration-tests:
    runs-on: ubuntu-latest
    if: github.event_name == 'push' && github.ref == 'refs/heads/main'
    needs: unit-tests
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with: { node-version: '20' }
      - run: npm ci
      - run: npm test -- --testPathPattern=integration
        env:
          APPFOLIO_CLIENT_ID: ${{ secrets.APPFOLIO_CLIENT_ID }}
          APPFOLIO_CLIENT_SECRET: ${{ secrets.APPFOLIO_CLIENT_SECRET }}
          APPFOLIO_BASE_URL: ${{ secrets.APPFOLIO_SANDBOX_URL }}

Mock-Based Unit Tests

typescript
// tests/unit/work-order-service.test.ts
import { describe, it, expect, vi } from 'vitest';
import { createWorkOrder } from '../../src/services/work-order-service';
import * as appfolioClient from '../../src/lib/appfolio-client';

vi.mock('../../src/lib/appfolio-client');

describe('WorkOrderService', () => {
  it('creates a maintenance work order for a property', async () => {
    vi.mocked(appfolioClient.post).mockResolvedValue({
      id: 'wo-4821',
      property_id: 'prop-100',
      category: 'Plumbing',
      status: 'Open',
    });

    const result = await createWorkOrder('prop-100', 'Plumbing', 'Leaking faucet unit 3B');
    expect(result.status).toBe('Open');
    expect(appfolioClient.post).toHaveBeenCalledWith('/work_orders', {
      property_id: 'prop-100',
      category: 'Plumbing',
      description: 'Leaking faucet unit 3B',
    });
  });
});

Integration Tests

typescript
// tests/integration/tenant-lookup.test.ts
import { describe, it, expect } from 'vitest';
import { AppFolioClient } from '../../src/lib/appfolio-client';

const canRun = process.env.APPFOLIO_CLIENT_ID && process.env.APPFOLIO_CLIENT_SECRET;

describe.skipIf(!canRun)('AppFolio Tenant Lookup (live sandbox)', () => {
  const client = new AppFolioClient({
    clientId: process.env.APPFOLIO_CLIENT_ID!,
    clientSecret: process.env.APPFOLIO_CLIENT_SECRET!,
    baseUrl: process.env.APPFOLIO_BASE_URL!,
  });

  it('lists tenants for a known property', async () => {
    const tenants = await client.get('/tenants', { property_id: 'prop-100' });
    expect(Array.isArray(tenants)).toBe(true);
    expect(tenants[0]).toHaveProperty('lease_status');
  });
});

CI Cost Management

typescript
// tests/helpers/api-budget.ts
let callCount = 0;
const MAX_CALLS_PER_RUN = 25; // AppFolio sandbox has 100 req/min rate limit

export function trackApiCall(): void {
  callCount++;
  if (callCount > MAX_CALLS_PER_RUN) {
    throw new Error(
      `CI API budget exceeded: ${callCount}/${MAX_CALLS_PER_RUN} calls. ` +
      'Reduce integration test scope or split across jobs.'
    );
  }
}

export function getCallCount(): number { return callCount; }
Show full SKILL.md (228 more words)Show less

Error Handling

CI IssueCauseFix
401 Unauthorized in integration jobExpired or rotated sandbox credentialsRegenerate APPFOLIO_CLIENT_ID and APPFOLIO_CLIENT_SECRET in GitHub Secrets
429 Too Many RequestsSandbox rate limit (100 req/min) hit by parallel testsRun integration tests with --maxWorkers=1
Tenant list emptySandbox data periodically reset by AppFolioStop the job and restore the pre-provisioned fixture outside CI
Typecheck fails on API responseAppFolio schema updated without noticeRegenerate types from OpenAPI spec, update interfaces
Integration job skippedBranch protection rule not matching refs/heads/mainVerify workflow if condition matches your default branch name

Output

  • Pull-request results from mock-only lint, type, and unit checks
  • A protected-branch sandbox receipt with the redacted provider status, fixture identity, request count, and integration test outcome
  • A bounded release decision that blocks on unavailable credentials, provider errors, fixture drift, or request-budget exhaustion

Examples

For a work-order mapping change, add a synthetic mock response and verify the new field in the PR suite. After merge, the protected main workflow reads one pre-provisioned sandbox work order and confirms the normalized shape without creating tenants, properties, or work orders. If the fixture is unavailable, the credential fails, or the request budget is exceeded, mark the release blocked and have the sandbox owner restore the fixture or credential before rerunning the live lane.

Resources

Next Steps

See appfolio-deploy-integration.

© jeremylongshore, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in skills/.curated/appfolio-ci-integration of jeremylongshore/tons-of-skills-marketplace.

Open the folder on GitHubat commit cfae287

Compare with similar skills

Appfolio CI Integration next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Appfolio CI Integration compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Appfolio CI Integration this skilljeremylongshore/tons-of-skills-marketplace2.8k—~1.8kAutomated safety check: PassMIT
Azure Pipelines Log Downloaderansible/ansible71k—~825Automated safety check: PassGPL-3.0
CI Failure Triage and RepairChachamaru127/claude-code-harness3.2k1 repos~1.1kAutomated safety check: NotesMIT
CI Watchdoglatitude-dev/latitude-llm4.7k—~1.6kAutomated safety check: PassMIT
Megatron-LM CI Failure TriageNVIDIA/Megatron-LM18k—~1.6kAutomated safety check: PassApache-2.0
CI CD And Automationdzhalaevd/Donatello1357 repos~2.7kAutomated safety check: NotesApache-2.0

Similar skills

  • Downloads Azure Pipelines CI logs for an Ansible pull request or build so the agent can analyze test failures, after asking you first.

    71k GitHub stars~825 tokensUpdated yesterday
    DevOps & CloudAuto-check passed
  • CI Failure Triage and Repair

    Chachamaru127/claude-code-harness

    Diagnoses failing CI pipelines and tests, deciding first whether the test or the implementation is at fault, and hands hard cases to a dedicated fixer subagent.

    3.2k GitHub starsUsed in 1 repo~1.1k tokens
    DevOps & CloudAuto-check: notes
  • CI Watchdog

    latitude-dev/latitude-llm

    Continuously monitor GitHub PR CI checks and automatically fix failures until all checks pass.

    4.7k GitHub stars~1.6k tokensUpdated 2 days ago
    DevOps & CloudAuto-check passed
  • Official

    Investigates a failing GitHub Actions run or job for Megatron-LM, finds the root cause plus the PR and test author involved, and files a structured bug issue.

    18k GitHub stars~1.6k tokensUpdated today
    DevOps & CloudAuto-check passed
  • CI CD And Automation

    dzhalaevd/Donatello

    Automates CI/CD pipeline setup. An agent skill from dzhalaevd/Donatello.

    135 GitHub starsUsed in 7 repos~2.7k tokens
    DevOps & CloudAuto-check: notes
  • CI Triage

    fair-acc/gnuradio4

    Fetch and classify a failed GitHub Actions job for this repo — distinguish out-of-memory kills, six-hour timeouts, configure errors and genuine test failures, and identify what was in flight.

    115 GitHub stars~548 tokensUpdated today
    DevOps & CloudAuto-check passed

More from jeremylongshore/tons-of-skills-marketplace

All 3,342 skills in this repo
  • Performing Security Code Review

    jeremylongshore/tons-of-skills-marketplace

    Execute this skill enables AI assistant to conduct a security-focused code review using the security-agent plugin.

    2.8k GitHub starsUsed in 2 repos~1.3k tokens
    Auto-check: notes
  • Adapting Transfer Learning Models

    jeremylongshore/tons-of-skills-marketplace

    Build this skill automates the adaptation of pre-trained machine learning models using transfer learning techniques.

    2.8k GitHub stars~1.1k tokensUpdated today
    Auto-check passed
  • Agent Context Loader

    jeremylongshore/tons-of-skills-marketplace

    Execute proactive auto-loading: automatically detects and loads agents.md files.

    2.8k GitHub stars~1.1k tokensUpdated today
    Auto-check passed
  • Aggregating Performance Metrics

    jeremylongshore/tons-of-skills-marketplace

    Aggregate and centralize performance metrics from applications, systems, databases, caches, and services.

    2.8k GitHub stars~1.2k tokensUpdated today
    Auto-check passed
  • Analyzing Capacity Planning

    jeremylongshore/tons-of-skills-marketplace

    Execute this skill enables AI assistant to analyze capacity requirements and plan for future growth.

    2.8k GitHub stars~947 tokensUpdated today
    Auto-check passed
  • Analyzing Database Indexes

    jeremylongshore/tons-of-skills-marketplace

    Process use when you need to work with database indexing. An agent skill from jeremylongshore/tons-of-skills-marketplace.

    2.8k GitHub stars~2k tokensUpdated today
    Auto-check passed

Questions about Appfolio CI Integration

What does Appfolio CI Integration do?

Configure CI/CD pipeline for AppFolio property management integrations. Appfolio CI Integration is an agent skill from jeremylongshore/tons-of-skills-marketplace. Configure CI/CD pipeline for AppFolio property management integrations.

When should I use Appfolio CI Integration?

Appfolio CI Integration fits situations like: tasks that involve Real estate; tasks that involve CI/CD.

How do I install Appfolio CI Integration in Claude Code?

Run `npx skills add jeremylongshore/tons-of-skills-marketplace --skill appfolio-ci-integration -a claude-code`. Or copy the skill folder (skills/.curated/appfolio-ci-integration in jeremylongshore/tons-of-skills-marketplace) into .claude/skills/appfolio-ci-integration in your project. Claude Code loads it when a task matches its description.

How do I install Appfolio CI Integration in Codex?

Run `npx skills add jeremylongshore/tons-of-skills-marketplace --skill appfolio-ci-integration -a codex`. Or copy the skill folder (skills/.curated/appfolio-ci-integration in jeremylongshore/tons-of-skills-marketplace) into .agents/skills/appfolio-ci-integration in your project. Codex loads it when a task matches its description.

Can I use Appfolio CI Integration in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add jeremylongshore/tons-of-skills-marketplace --skill appfolio-ci-integration -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/appfolio-ci-integration, .gemini/skills/appfolio-ci-integration, .github/skills/appfolio-ci-integration and .opencode/skills/appfolio-ci-integration in your project.

What does Appfolio CI Integration need to run?

Going by SKILL.md and its folder, Appfolio CI Integration needs credentials named APPFOLIO_CLIENT_SECRET. Our summary lists: A credential in APPFOLIO_CLIENT_SECRET. Its frontmatter pre-approves these tools: Read, Write, Edit, Bash(npm:*), Bash(curl:*), Grep. Compatibility (from SKILL.md): Designed for Claude Code.

Does Appfolio CI Integration access the network?

SKILL.md names 2 domains. As links in the text: appfolio.com and docs.github.com. This is read from the text; nothing was executed.

Is Appfolio CI Integration safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Appfolio CI Integration use?

Appfolio CI Integration is published under the MIT licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Appfolio CI Integration use?

About 1.8k tokens (SKILL.md is roughly 7.1k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Appfolio CI Integration?

Skills that share tags, products or a category with Appfolio CI Integration: Azure Pipelines Log Downloader (ansible/ansible, 71k stars), CI Failure Triage and Repair (Chachamaru127/claude-code-harness, 3.2k stars), CI Watchdog (latitude-dev/latitude-llm, 4.7k stars) and Megatron-LM CI Failure Triage (NVIDIA/Megatron-LM, 18k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Appfolio CI Integration?

jeremylongshore (a GitHub user) maintains it in jeremylongshore/tons-of-skills-marketplace, which has 2,827 GitHub stars. The repository holds 3,342 skills in this directory. The repository was last updated on October 10, 2026.

Source: jeremylongshore/tons-of-skills-marketplace on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.