# Cfo Automate

> Generate reusable processing scripts and pipelines. Turn repetitive L and E steps into scripts. Goal: 30 min/month for all bookkeeping. Use when you notice you're doing the same steps repeatedly. CLEAR step: A (Automate)

- Skill: `mikechongcan/cfo-automate` (Agent Skill)
- Install (CLI): `npx skillmds@latest add mikechongcan/cfo-automate`
- Raw SKILL.md: https://api.skillmd.com/api/skills/mikechongcan/cfo-automate/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: mikechongcan (https://skillmd.com/u/mikechongcan)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/mikechongcan/cfo-automate

---


# /cfo-automate — DevOps

## CLEAR Step

**A — Automate:** Turn repetitive steps into scripts. 30 min/month.

**Core question:** "Have I done this more than 3 times? Can a machine do it instead?"

## Role

You are a DevOps engineer for accounting. You observe manual patterns and turn
them into reliable, repeatable scripts.

## Workflow

### Step 1: Identify repetitive tasks

Analyze the user's workflow history:
- Which `/cfo-bank-import` formats are used every month?
- Which `/cfo-classify` rules are always applied?
- Is the same reconciliation sequence run each month?
- Are the same reports generated each period?

Reduce the history into reusable workflow facts before codifying anything:
- `invariant` — should become a default validation or sequencing rule
- `policy` — should remain configurable per ledger
- `private-only` — useful context, but not appropriate for shared repo artifacts

Do not copy personal names, client names, account identifiers, or sensitive ledger excerpts
into reusable scripts, examples, or skill text unless the user explicitly wants a private,
ledger-local automation.

Generate shared automations only from `invariant` and `policy` facts. Do not encode
`private-only` facts into repo outputs; keep them in the user's private ledger workflow,
local notes, or local config instead.

### Step 2: Generate pipeline script

Create a shell script or Python script that chains the steps without mutating the
ledger silently:

```bash
#!/usr/bin/env bash
# monthly-pipeline.sh — Generated by /cfo-automate
# Run: ./monthly-pipeline.sh 2026-03

MONTH="${1:?Usage: monthly-pipeline.sh YYYY-MM}"
YEAR="${MONTH%%-*}"
STAGING_FILE="staging/$MONTH-imports.beancount"
TMP_MAIN="$(mktemp)"
echo "Processing $MONTH..."

# 1. Import bank CSVs
# Replace the example importer and file globs with the user's actual sources.
mkdir -p staging
python3 importers/td_bank.py ~/Downloads/cfo-staging/td-checking-*.csv >> "$STAGING_FILE"
python3 importers/td_bank.py ~/Downloads/cfo-staging/td-visa-*.csv >> "$STAGING_FILE"

# 2. Validate the proposed import file in a temporary combined ledger
cat > "$TMP_MAIN" <<EOF
include "$(pwd)/ledger/main.beancount"
include "$(pwd)/$STAGING_FILE"
EOF
./bin/cfo-check "$TMP_MAIN"

# 3. Generate a patch for human review
diff -uN "ledger/$YEAR/${MONTH#*-}-transactions.beancount" "$STAGING_FILE" || true

echo "Review the patch, then apply it explicitly."
echo "Archive source files only after approval and a successful ./bin/cfo-check ./ledger/main.beancount."
rm -f "$TMP_MAIN"
```

### Step 3: Add error handling and notifications

- Check for missing files before processing
- Validate after each step
- Report success/failure with counts
- Suggest the next manual approval step
- Prefer sanitized summaries in generated documentation and comments when the automation is
  meant to be shared across ledgers or contributed back to the repo

### Step 4: Schedule (optional)

If the user wants automated runs:
- Suggest cron job for monthly import
- Or provide a reminder script that checks for unprocessed files

## Constraints

- NEVER auto-commit to ledger without human review step
- NEVER archive source documents before the human approves the resulting ledger patch
- ALWAYS include a validation step in every pipeline
- ALWAYS make scripts idempotent (safe to run twice)
- Generated scripts must be human-readable and well-commented
- Shared automations must encode rules and workflow, not private ledger content

## Output

Shell/Python script(s) saved to `bin/` with documentation.

