From invest
Backs up and restores openInvest local state (holdings, strategy, trade ledger, credentials) that is gitignored and unrecoverable via git. Run before migrations or when data appears lost.
How this skill is triggered — by the user, by Claude, or both
Slash command
/invest:invest-backupThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
openInvest's real data (holdings/strategy/user profile/committee records under `memory/`, trade ledger/job history under `db/`) is **entirely `.gitignore`d** — deliberately (privacy: it contains real assets/salary/trades), but the price is that git can't help at all. There was an incident on 2026-07-08: a one-off migration script named `migrate_profile.py` (with no safety guard whatsoever) was ...
openInvest's real data (holdings/strategy/user profile/committee records under memory/, trade ledger/job history under db/) is entirely .gitignored — deliberately (privacy: it contains real assets/salary/trades), but the price is that git can't help at all. There was an incident on 2026-07-08: a one-off migration script named migrate_profile.py (with no safety guard whatsoever) was run directly once, overwriting user.md / strategy.md / portfolio.md with hard-coded demo defaults; daily_report then exited early every day because target_assets had become empty, emails stopped entirely from that point on, and the user had no idea until they noticed the missing emails and traced it back.
In any of the following scenarios, proactively use this skill:
memory/ or db/ → backup firstbackup first (even if the current state is already broken, save the "broken state" — otherwise you lose even the diagnostic material), then investigatebackup to package, restore on the new machineplugin/skills/invest-backup/scripts/run.sh backup [output_dir] # defaults to $INVEST_ROOT/.backups/
plugin/skills/invest-backup/scripts/run.sh restore <zip_path> [--force]
plugin/skills/invest-backup/scripts/run.sh list
memory/, db/*.sqlite, db/*.db, .env, user_profile.json* into a single UTC-timestamped zip. The data directory is resolved via openinvest.paths.INVEST_ROOT (same precedence order as the rest of the backend: INVEST_HOME env → repo-marker detection → cwd) instead of re-guessing paths in shell.portfolio.md that already contains real holdings/cash (same criterion as the 2026-05-10 incident defense in lifecycle_cmds.py:_write_v2_portfolio: cash > 0 in any currency, or non-empty holdings, counts as real data) — to confirm the overwrite you must explicitly pass --force. With or without --force, the current state is automatically backed up before restoring, so the operation itself is reversible.memory/.backtest* family of directories (historical backtest caches, tens of MB, regenerable with scripts like scripts/backtest_committee.py — not irreplaceable data) — this skill currently does not exclude them, because the size is still acceptable and backup semantically means "the entire data directory"; if memory/ ever grows too large to package comfortably, exclude them separately then.db/*.sqlite-journal, *.db-shm, *.db-wal: SQLite runtime temp files — they are rebuilt automatically after a restore, and carrying them along could actually capture a half-committed state.*.lock: fcntl file locks, cleared automatically on process restart, no need to keep.This skill only solves "can it be recovered once lost" — it does not solve "why did it get overwritten". If you see a script in this repo like migrate_profile.py that calls store.write(...) directly with no safety guard, follow the pattern of _write_v2_portfolio in src/openinvest/skill_cmds/lifecycle_cmds.py (check for existing real data before overwriting; on refusal require explicit force=True; auto-backup before overwriting) and retrofit the same guard — that is the real fix; this skill is only the last safety net.
npx claudepluginhub longsizhuo/openinvest --plugin investSets up a fresh openInvest deployment via a 5-question interactive flow or connects to an existing hub. Wraps `run.sh init` for first-time onboarding.
Implements backup strategies for databases, filesystems, and cloud resources using tar, rsync, pg_dump, AWS S3. Automates scheduling, retention, encryption, verification, and disaster recovery.
Creates a timestamped zip backup of a project: git bundle, database schema/data, Vercel env vars, Cloudflare R2 content, and configs. Useful before deletion, refactor, or as archive.