Attach a code repo's ψ vault to a caretaker oracle — check, link, heal, unlink.

MITAuto-check passedProduct & Project Management

Install Psi

skills CLI
$ npx skills add Soul-Brews-Studio/arra-oracle-skills-cli --skill psi -a claude-code

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

GitHub CLI
$ gh skill install Soul-Brews-Studio/arra-oracle-skills-cli psi --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/Soul-Brews-Studio/arra-oracle-skills-cli.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/psi .claude/skills/psi && 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
psi
GitHub stars
123
Token cost
~4.9k tokens
SKILL.md length
1,507 words
Files
1
Skills in repo
31
Repo updated
First seen
Licence
MIT

At a glance

Attach a code repo's ψ vault to a caretaker oracle — check, link, heal, unlink.

  • Works in 6 steps: 6 · Survey — refuse bad ground → 6 · Caretaker — GATE → 6 · Preview — GATE → …
  • A plain code repo (open-source
  • SKILL.md covers The model, Pick the caretaker — show,…, check and link — a six-phase ritual, plus 3 more sections
  • Calls git, rg and rsync

What it does

Psi is an agent skill from Soul-Brews-Studio/arra-oracle-skills-cli. Attach a code repo's ψ vault to a caretaker oracle — check, link, heal, unlink. Use when a plain code repo (open-source, not an oracle) should keep memory in another oracle's vault, when the user says "psi check", "psi link", "share the vault", "symlink ψ to neo", "who takes care of this repo's memory", or when a ψ symlink went missing after a checkout. Do NOT trigger for creating an oracle (use /awaken), cloning repos for development (use /incubate), or writing a retrospective (use /rrr).

Its SKILL.md is about 4.9k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Product & Project Management, covering Retrospectives. The repository describes itself as: Install Oracle skills to Claude Code, OpenCode, Cursor, and 12+ AI coding agents. The licence is MIT.

When your agent uses it

  • A plain code repo (open-source
  • Not an oracle) should keep memory in another oracles vault
  • The user says psi check
  • Share the vault

Example prompts

  • “s vault, when the user says”
  • “psi link”
  • “share the vault”
  • “/psi”

Workflow steps

6 steps, taken from the step headings in SKILL.md.

  1. 6 · Survey — refuse bad ground
  2. 6 · Caretaker — GATE
  3. 6 · Preview — GATE
  4. 6 · Absorb — dry run first, always
  5. 6 · Link — copy, verify, park, link, verify again
  6. 6 · Seal — ignore it, prove it, record the caretaker

What it can do on your machine

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

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • git
    • rg
    • rsync
    • python3

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

  • Network

    No URLs in SKILL.md. Its commands use git and rsync, which can reach the network depending on how they are called.

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

  • Credentials

    Names no API keys, tokens, secrets or passwords.

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

Context cost

Psi loads about 4.9k tokens when it runs. Until then it costs about 125 tokens; SKILL.md has 1,507 words of instructions outside code blocks.

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

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 Soul-Brews-Studio/arra-oracle-skills-cli at commit 9feea09, republished under its MIT licence (© Soul-Brews-Studio). 1,507 words, ~4,949 tokens.

Download SKILL.mdSave it as .claude/skills/psi/SKILL.md (or your agent's skills folder).
name
psi
description
Attach a code repo's ψ vault to a caretaker oracle — check, link, heal, unlink. Use when a plain code repo (open-source, not an oracle) should keep memory in another oracle's vault, when the user says "psi check", "psi link", "share the vault", "symlink ψ to neo", "who takes care of this repo's memory", or when a ψ symlink went missing after a checkout. Do NOT trigger for creating an oracle (use /awaken), cloning repos for development (use /incubate), or writing a retrospective (use /rrr).
argument-hint
[check | link | heal | unlink]

/psi

"A code repo does not need to be an oracle to have a memory."

Point a plain code repo's ψ at a caretaker oracle's vault, so the repo keeps a brain without becoming an oracle and without committing vault content into public source history.

text
/psi          # same as check
/psi check    # what is ψ here, who takes care of it, is it safe
/psi link     # ask which oracle, then absorb → symlink → ignore → verify
/psi heal     # symlink vanished after a checkout, or ignore rules incomplete
/psi unlink   # go back to a standalone real ψ

The model

code repo/ψ  ──symlink──▶  caretaker oracle/ψ
   (ignored, never committed)     (tracked — it IS the brain)
Repo kindψgit
code repo — software someone else could clone and buildsymlink to caretakerignored, never tracked
oracle repo — has an oracle identityreal directorytracked

Pick the caretaker — show, don't guess

Never assume which oracle takes care of a repo. Show the fleet and let the human name it. Linking to the wrong vault mixes two oracles' memory.

bash
maw ls

Ask: "Which oracle should take care of this repo's memory?" The human answers with a name (neo, pulse, beta). Resolve it — the short name works:

bash
maw locate "$ORACLE_NAME"   # prints: repo: /path/to/<name>-oracle  and  ψ/: present

Take the repo: line as CARETAKER. If maw locate finds nothing, or its ψ/ is not present, stop and say so — do not fall back to a guess.

Do not loop over repos or scan the filesystem looking for candidates. One repo, one question, one answer.

check

Report what you verified, never what you assume. Every line is the output of a command — readlink -f for the real target, ls-files -s for the mode bits, check-ignore -v for the rule that actually matched. Close with one FOCUS line: the single next action.

bash
REPO=$(git rev-parse --show-toplevel) || exit 1
GI="$REPO/.gitignore"

# ── ψ: type, size, staleness ─────────────────────────────────────────────
if [ -L "$REPO/ψ" ]; then
  TARGET=$(readlink "$REPO/ψ"); REAL=$(readlink -f "$REPO/ψ")
  [ -e "$REPO/ψ/" ] && ALIVE=alive || ALIVE='DANGLING'
  case "$TARGET" in /*) ABS=' ⚠️ absolute';; *) ABS='';; esac
  PSI="symlink → $TARGET$ABS"; PSI2="resolves  $REAL ($ALIVE)"
elif [ -d "$REPO/ψ" ]; then
  N=$(find "$REPO/ψ" -type f ! -name '.DS_Store' | wc -l | tr -d ' ')
  NEW=$(find "$REPO/ψ" -type f ! -name '.DS_Store' -exec stat -f '%m' {} \; 2>/dev/null | sort -rn | head -1)
  AGE=$(( ( $(date +%s) - ${NEW:-$(date +%s)} ) / 86400 ))
  PSI="real dir · $N files · newest $(date -r "${NEW:-0}" +%F 2>/dev/null) (${AGE}d old)"; PSI2=""
else
  PSI="absent"; PSI2=""
fi

# ── git: is any of it tracked? is the LINK itself committed? ─────────────
TRACKED=$(git -C "$REPO" ls-files ψ | wc -l | tr -d ' ')
git -C "$REPO" ls-files -s ψ | rg -q '^120000' && BLOB='⚠️ SYMLINK COMMITTED' || BLOB=no

# ── ignore: both forms, and the rule git actually matched ───────────────
rg -qx 'ψ'  "$GI" 2>/dev/null && BARE=yes || BARE='NO ⚠️'
rg -qx 'ψ/' "$GI" 2>/dev/null && SLASH=yes || SLASH=NO
# cut -f1, NOT an awk positional field ref — see "Never use positional parameters"
# below. check-ignore -v separates source from pathname with a TAB, so field 1 is
# the matching rule.
RULE=$(git -C "$REPO" check-ignore -v ψ 2>/dev/null | cut -f1)
[ -n "$RULE" ] || RULE='NOT IGNORED ⚠️'

# ── kind + caretaker ────────────────────────────────────────────────────
[ "$TRACKED" -gt 0 ] && KIND='oracle repo (ψ is tracked — it IS the brain)' \
                     || KIND='code repo (ψ must stay ignored)'
# NOTE: no \K — this rg build rejects it, and the error would silently read as "none".
CARE=$(sed -n 's/^oracle: *//p' "$REPO/.claude/PSI_CARETAKER" 2>/dev/null)
[ -n "$CARE" ] || CARE='none recorded'

# ── render: no borders. two-space margin, aligned columns, grouped by blank
#    lines. identity block first, then the checks, then one FOCUS line.
#    Each check names the command that proved it — the report is its own audit.
#    NOTE: printf inline per row — no row()/fact() helpers, because a helper
#    would need positional parameters and the host rewrites those. See below.
F='  %-14s%s\n'          # identity line
R='  %-14s%-42s%-3s %s\n'  # check line

echo
printf "$F" repo "$(basename "$REPO")"
printf "$F" kind "$KIND"
printf "$F" ψ    "$PSI"
[ -n "$PSI2" ] && printf "$F" '' "$PSI2"
echo
printf "$R" tracked      "$TRACKED entries" "$([ "$TRACKED" -eq 0 ] && echo ✓ || echo ⚠)" 'git ls-files ψ'
printf "$R" symlink-blob "$BLOB"            "$([ "$BLOB" = no ] && echo ✓ || echo ⚠)"     'ls-files -s ψ → 120000'
printf "$R" bare-ψ       "$BARE"            "$([ "$BARE" = yes ] && echo ✓ || echo ⚠)"    'rg -qx ψ .gitignore'
printf "$R" 'ψ/'         "$SLASH"           "$([ "$SLASH" = yes ] && echo ✓ || echo ·)"   'rg -qx ψ/ .gitignore'
printf "$R" ignore-rule  "$RULE"            "$(case $RULE in *NOT*) echo ⚠;; *) echo ✓;; esac)" 'git check-ignore -v ψ'
printf "$R" caretaker    "$CARE"            "$([ "$CARE" = 'none recorded' ] && echo · || echo ✓)" '.claude/PSI_CARETAKER'
echo

Keep the two-space margin and the blank-line grouping — the whitespace is what makes it readable without rules. Widen a column only if a value would otherwise wrap; never add borders back.

Never use positional parameters (dollar-digit) in this skill's shell

The host substitutes the invocation's positional arguments into the skill body before the model ever sees it. Running /psi link to neo but … rewrote an awk program that referenced field one into awk '{print to}', and a four-parameter printf helper into printf … "to" "neo" "but" "when" — silent corruption, no error.

So: no shell functions taking positional parameters, and no dollar-digit inside awk/sed programs. Use cut -f1, a named variable, or a printf format string held in a variable — all three are immune.

Deciding FOCUS

Emit exactly one, first match wins — most dangerous first:

ConditionFOCUS
symlink-blob committedleaking a machine path in git history → /psi heal, then decide on a history rewrite
symlink DANGLINGbrain unreachable → /psi heal
symlink target absolutebreaks on every other machine → /psi heal (rewrites relative)
code repo & bare-ψ=NOψ will leak the moment it is linked → add the bare rule
code repo & NOT IGNOREDdo not commit → fix .gitignore first
code repo, real dir, no caretakerorphaned vault — no oracle reads these N files → /psi link
oracle repo, ψ tracked✅ correct — the vault belongs here, nothing to do
symlink alive, relative, ignored✅ linked and safe

A stale newest date is worth naming even on a ✅ — a vault whose newest file is weeks old is why a later /recap will hand back a stale handoff as if it were current.

Run it step by step, not as one script. Announce each phase as you enter it, do that phase's work, show the result, then continue. Two phases are hard gates: stop and wait for a human answer. After the phases, run the checklist, then print the report.

text
  Phase 1/6 · Survey            what ψ is now
  Phase 2/6 · Caretaker         ← GATE: the human names the oracle
  Phase 3/6 · Preview           ← GATE: the human approves the dry run
  Phase 4/6 · Absorb            copy + count both sides
  Phase 5/6 · Link              park → symlink → verify through it
  Phase 6/6 · Seal              ignore rules + caretaker record

Never run a later phase's commands while announcing an earlier one. A gate that is "announced and then passed in the same breath" is not a gate.

Phase 1/6 · Survey — refuse bad ground

Run check first and show it. Then stop, with the reason, when:

  • the repo is itself an oracle (ψ tracked with real content),
  • ψ already points at that same caretaker → say already linked, exit 0,
  • there is no origin remote (the vault path cannot be derived).
Phase 2/6 · Caretaker — GATE

Show maw ls, then ask which oracle should take care of this repo's memory and wait for the answer. Resolve it with maw locate, and confirm the caretaker's ψ/: present plus that it is not behind its remote. Never pick a name yourself, never carry one over from a previous run.

Phase 3/6 · Preview — GATE

Show the itemized dry run and the counts, then wait for approval. Dry-run output is not consent. If the human says nothing, nothing happens.

Phase 4/6 · Absorb — dry run first, always

Replacing a populated ψ with a symlink orphans everything inside it. Fetch the caretaker first so a stale vault is not merged over newer content.

Every linked repo lives under ψ/family/<host>/<owner>/<repo>, always lowercased. Below family/ the path is the ghq tree exactly, so it reads the same in both places:

text
/opt/Code/github.com/soul-brews-studio/arra-oracle-skills-cli             ← the code (ghq)
neo-oracle/ψ/family/github.com/soul-brews-studio/arra-oracle-skills-cli   ← its memory
             └ family ┘└─ host ──┘└─ owner ───────┘└─ repo ────────────┘

family/ keeps the oracle's kin clear of its own organs. Without it an owner directory lands beside memory/, inbox/, teams/ — and an org literally named teams collides with the oracle's own. One directory to list to see everything an oracle tends.

The host is derived, never assumed. gitlab.com, codeberg.org, or a self-hosted git.example.com each get their own subtree, so two repos sharing an owner/name on different hosts never collide.

Lowercase is not cosmetic either: Soul-Brews-Studio and soul-brews-studio are the same repo, but on a case-sensitive volume they become two vaults, and the split is invisible until memory goes missing.

bash
git -C "$CARETAKER" fetch --quiet 2>/dev/null

# host/owner/repo from the origin remote, lowercased — never from the directory
# name, which may have been renamed locally. Handles https, ssh, scp-style,
# git://, an embedded user, a custom port, and gitlab subgroups.
URL=$(git -C "$REPO" remote get-url origin 2>/dev/null)
[ -n "$URL" ] || { echo "✗ no origin remote — cannot derive the vault path"; exit 1; }
SLUG=$(printf '%s' "$URL" | sed -E \
        -e 's#^(ssh|git\+ssh|https?|git)://##' \
        -e 's#^[^@/]+@##'      \
        -e 's#:[0-9]+/#/#'     \
        -e 's#:#/#'            \
        -e 's#\.git$##'        \
        -e 's#/+$##'           \
       | tr '[:upper:]' '[:lower:]')

NS="$CARETAKER/ψ/family/$SLUG"   # ψ/family/<host>/<owner>/<repo>, lowercase
rsync -a --dry-run --itemize-changes "$REPO/ψ/" "$NS/"

Verified against every remote shape:

remoteslug
https://github.com/Soul-Brews-Studio/arra-oracle-skills-cligithub.com/soul-brews-studio/arra-oracle-skills-cli
git@github.com:laris-co/Neo-Oracle.gitgithub.com/laris-co/neo-oracle
git@gitlab.com:MyGroup/sub/proj.gitgitlab.com/mygroup/sub/proj
ssh://git@git.example.com:2222/team/thing.gitgit.example.com/team/thing
git://codeberg.org/Owner/Proj.gitcodeberg.org/owner/proj

Print the itemized list and the file count, then wait for approval. Only then re-run without --dry-run. Never --delete.

The absorb and the removal are never the same command, and never the same step. Step 3 sequences them: copy → count both sides → park the original → link → verify through the link, with an automatic rollback if the last check fails.

Show full SKILL.md (573 more words)Show less

Order is the safety. The source is never removed; it is parked outside the repo and only after the copy has been counted. If the link fails to resolve, roll back automatically. Never rm -rf the vault — see "nothing deleted".

bash
mkdir -p "$NS"

# 3a. copy for real (same command as the dry run, minus --dry-run)
rsync -a --exclude '.DS_Store' "$REPO/ψ/" "$NS/"

# 3b. VERIFY before anything moves. Counts must match exactly, or stop —
#     the source is still untouched at this point, so aborting costs nothing.
SRC_N=$(find "$REPO/ψ" -type f ! -name '.DS_Store' | wc -l | tr -d ' ')
DST_N=$(find "$NS"     -type f ! -name '.DS_Store' | wc -l | tr -d ' ')
if [ "$SRC_N" -ne "$DST_N" ]; then
  echo "✗ ABORT — copied $DST_N of $SRC_N files. Source untouched; nothing removed."
  exit 1
fi
echo "✓ verified $DST_N/$SRC_N files copied"

# 3c. PARK the original outside the repo (never delete, never leave it in git's way)
PARK="${TMPDIR:-/tmp}/psi-replaced-$(echo "$SLUG" | tr / -)-$(date +%Y%m%d-%H%M%S)"
mv "$REPO/ψ" "$PARK"

# 3d. link, relative
REL=$(python3 -c 'import os,sys;print(os.path.relpath(sys.argv[1],sys.argv[2]))' "$NS" "$REPO")
ln -sfn "$REL" "$REPO/ψ"      # -n: do not descend into an existing symlink

# 3e. verify the link RESOLVES and the content is reachable THROUGH it.
#     Any failure restores the parked original and exits.
restore() { rm -f "$REPO/ψ"; mv "$PARK" "$REPO/ψ"; echo "↩ restored original ψ"; }
[ -e "$REPO/ψ/" ] || { echo "✗ link does not resolve"; restore; exit 1; }
THRU=$(find "$REPO/ψ/" -type f ! -name '.DS_Store' | wc -l | tr -d ' ')
[ "$THRU" -ge "$SRC_N" ] || { echo "✗ only $THRU/$SRC_N reachable through the link"; restore; exit 1; }

readlink -f "$REPO/ψ"
echo "✓ $THRU files reachable through the link"
echo "  original parked: $PARK   (delete it yourself once satisfied)"

ln -sfn, never ln -sf — with a pre-existing symlinked directory -f alone creates the link inside the target instead of replacing it.

Why park instead of delete: at 3c the content exists in two places and has been counted in both, so parking looks redundant — until 3d writes a link that silently resolves somewhere unexpected. Parking makes 3e's rollback possible. Announce the park path; let the human delete it. Nothing deleted.

Phase 6/6 · Seal — ignore it, prove it, record the caretaker
bash
for pat in 'ψ' 'ψ/'; do
  rg -qx "$pat" "$REPO/.gitignore" 2>/dev/null || echo "$pat" >> "$REPO/.gitignore"
done

if git -C "$REPO" ls-files --error-unmatch ψ >/dev/null 2>&1; then
  git -C "$REPO" rm --cached -r --quiet ψ
  echo "✓ untracked previously-committed ψ (history still holds it — rewrite separately)"
fi

git -C "$REPO" check-ignore -v ψ || echo "⚠️  ψ is NOT ignored — do not commit"

Verification is part of the step. If check-ignore prints nothing, the link is not safe — report that instead of declaring success.

Record the caretaker
bash
mkdir -p "$REPO/.claude"
printf 'oracle: %s\nrepo: %s\nvault: %s\ndate: %s\n' \
  "$ORACLE_NAME" "$CARETAKER" "$NS" "$(date +%F)" > "$REPO/.claude/PSI_CARETAKER"
rg -qx '.claude/PSI_CARETAKER' "$REPO/.gitignore" 2>/dev/null \
  || echo '.claude/PSI_CARETAKER' >> "$REPO/.gitignore"

Machine-local, ignored like the link. check reads it to name the caretaker without asking again.

Checklist — run it, show it, and let it fail loudly

After phase 6, verify the outcome. Every line re-runs a real command; nothing is asserted from memory of what the phases intended to do. Print it. Unlike the retro checklist in /rrr, this one is shown — it is the evidence that a data move succeeded.

bash
C='  %-2s %-34s%s\n'   # format in a variable — no helper, no positional params

# 1 counts match on both sides
SRC_OK=$([ "${SRC_N:-0}" -eq "$DST_N" ] && echo ✓ || echo ✗)
printf "$C" "$SRC_OK" "files copied"        "$DST_N/$SRC_N"
# 2 reachable THROUGH the link, not just present in the vault
printf "$C" "$([ "${THRU:-0}" -ge "${SRC_N:-0}" ] && echo ✓ || echo ✗)" "reachable through ψ" "$THRU"
# 3 the link resolves
printf "$C" "$([ -e "$REPO/ψ/" ] && echo ✓ || echo ✗)" "link resolves"     "$(readlink -f "$REPO/ψ")"
# 4 relative, not absolute
case "$(readlink "$REPO/ψ")" in /*) A=✗;; *) A=✓;; esac
printf "$C" "$A" "relative target"          "$(readlink "$REPO/ψ")"
# 5 lowercase, nested owner/repo
printf "$C" "$([ "$SLUG" = "$(echo "$SLUG" | tr '[:upper:]' '[:lower:]')" ] && echo ✓ || echo ✗)" "vault path lowercase" "ψ/$SLUG"
# 6 git cannot see it
printf "$C" "$(git -C "$REPO" check-ignore -q ψ && echo ✓ || echo ✗)" "ignored by git" "$(git -C "$REPO" check-ignore -v ψ | cut -f1)"
# 7 the link itself is not committed
printf "$C" "$(git -C "$REPO" ls-files -s ψ | rg -q '^120000' && echo ✗ || echo ✓)" "symlink not committed" "$(git -C "$REPO" ls-files ψ | wc -l | tr -d ' ') tracked"
# 8 the original still exists somewhere
printf "$C" "$([ -d "$PARK" ] && echo ✓ || echo ✗)" "original parked"      "$PARK"

Any ✗ means stop and say so — do not print a success report over a failed checklist. Items 2 and 8 are the ones that matter most: 2 proves the brain is actually reachable, 8 proves nothing was destroyed.

Report

Close with a short report in the same borderless style as check. State what moved, where it went, and what the human still owns.

text
  ψ linked · arra-oracle-skills-cli → neo

  moved         17 files → neo-oracle/ψ/family/github.com/soul-brews-studio/arra-oracle-skills-cli
  symlink       ../../laris-co/neo-oracle/ψ/family/github.com/soul-brews-studio/arra-oracle-skills-cli
  ignored       .gitignore:9:ψ  (bare rule — ψ/ no longer matches a symlink)
  caretaker     neo
  parked        /var/.../psi-replaced-…-20260820-181051

  yours to do   delete the parked copy once satisfied
                commit the .gitignore change

Report only what the checklist verified. If an item failed, the report says what failed and what state the repo is in — never a clean summary over a broken outcome.

heal

git checkout and git merge silently delete an ignored symlink when they remove the last tracked sibling at that path — no error is printed. Repair, reporting each fix:

  1. PSI_CARETAKER exists but ψ is missing → recreate the relative symlink.
  2. ψ is a symlink that readlink -f cannot resolve → report the dangling target; do not invent a replacement.
  3. An ignore form is missing → add it.
  4. ψ is tracked → git rm --cached -r ψ.

Print ✓ nothing to heal when clean.

Copy the namespaced subtree back into a real ψ, replace the symlink, and leave the caretaker's copy alone — never delete the vault side. Keep the ignore lines unless asked.

Rules

  • Show maw ls and let the human name the caretaker. Never guess, never scan for one.
  • Ask before the first destructive step; dry-run output is not consent.
  • Nothing deleted. Never rm -rf a vault. Copy → count both sides → park the original outside the repo → link → verify through the link, rolling back on any failure. The human deletes the parked copy, not the skill.
  • Both ψ and ψ/ in .gitignore, every time — a trailing slash matches directories only, so a ψ/-only rule stops matching the moment ψ becomes a symlink.
  • Relative symlink targets only — machines disagree on the ghq root.
  • Never commit ψ or the symlink in a code repo; never un-track ψ in an oracle repo.
  • A shared vault is shared: give each repo its own subtree, and say so when linking.
  • Report what you verified (readlink -f, check-ignore), not what you intended.

© Soul-Brews-Studio, 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/psi of Soul-Brews-Studio/arra-oracle-skills-cli.

Open the folder on GitHubat commit 9feea09

Compare with similar skills

Psi 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.

Psi compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Psi this skillSoul-Brews-Studio/arra-oracle-skills-cli123—~4.9kAutomated safety check: PassMIT
Weekly Engineering Retrogarrytan/gstack136k—~2.4kAutomated safety check: PassMIT
Dough Execute Planterryyin/lizard2.5k—~4.3kAutomated safety check: PassCustom licence
Oral Paper SkillAdkid-Zephyr/oral-paper-skill357—~1.9kAutomated safety check: PassNone
Deck Retroasheshgoplani/agent-deck1.1k—~1.8kAutomated safety check: PassMIT
Dough Execution Retrospectiveterryyin/lizard2.5k—~4kAutomated safety check: PassCustom licence

Similar skills

  • Builds a weekly engineering retrospective from git history: commit counts, per-person contributions, work patterns and code quality numbers over a chosen window.

    136k GitHub stars~2.4k tokensUpdated yesterday
    Product & Project ManagementAuto-check passed
  • Dough Execute Plan

    terryyin/lizard

    Executes one selected story or bounded retrospective correction through an executable plan, or one authorized planless slice from a selected simple story or a contextual instruction, with…

    2.5k GitHub stars~4.3k tokensUpdated 4 days ago
    Product & Project ManagementAuto-check passed
  • Oral Paper Skill

    Adkid-Zephyr/oral-paper-skill

    Help authors learn from exemplary ICLR, ICML, and NeurIPS papers through source-linked manuscript comparisons, concrete writing and experiment suggestions, and guided reflection.

    357 GitHub stars~1.9k tokensUpdated 23 days ago
    Product & Project ManagementAuto-check passed
  • Deck Retro

    asheshgoplani/agent-deck

    Run a fully local agent-deck retrospective over the user's own transcripts, Recall index and logs.

    1.1k GitHub stars~1.8k tokensUpdated today
    Product & Project ManagementAuto-check passed
  • Reviews planned, completed planless quick, or quick-to-planned execution against original intent, aggregate commits, current whole-product architecture, and tests, including after cleanup.

    2.5k GitHub stars~4k tokensUpdated 4 days ago
    Product & Project ManagementAuto-check passed
  • Criticism Self Criticism

    HughYau/qiushi-skill

    批评与自我批评:在工作完成、阶段验收、收到批评或同类错误反复出现时,对成果和过程做诚实、具体、基于事实的审视,输出可执行的改进项,并处理外来批评而不辩解。触发信号包括 review、复盘、审查、"帮我看看有没有问题"、"你确定吗";任务刚开始或只是单步查询时不触发。

    3.8k GitHub stars~423 tokensUpdated 9 days ago
    Product & Project ManagementAuto-check passed

More from Soul-Brews-Studio/arra-oracle-skills-cli

All 31 skills in this repo
  • Dig

    Soul-Brews-Studio/arra-oracle-skills-cli

    Mine Claude Code sessions — timeline, gaps, repo attribution, session history.

    123 GitHub stars~1.8k tokensUpdated 7 days ago
    Auto-check passed
  • Forward

    Soul-Brews-Studio/arra-oracle-skills-cli

    Hand off the current session to the next one. An agent skill from Soul-Brews-Studio/arra-oracle-skills-cli.

    123 GitHub stars~2.9k tokensUpdated 7 days ago
    Auto-check passed
  • Project

    Soul-Brews-Studio/arra-oracle-skills-cli

    Clone and track external repos. An agent skill from Soul-Brews-Studio/arra-oracle-skills-cli.

    123 GitHub stars~1.4k tokensUpdated 7 days ago
    Auto-check passed
  • Round Table

    Soul-Brews-Studio/arra-oracle-skills-cli

    Convene a Round Table (โต๊ะกลม): 3–8 souls — persona files, Oracles, or real people's DNA — debate ONE stakes-bearing decision over exactly 4 rounds (OPEN, DEEPEN, CONVERGE, VOTE), one subagent per…

    123 GitHub stars~2.1k tokensUpdated 7 days ago
    Auto-check passed
  • Soul

    Soul-Brews-Studio/arra-oracle-skills-cli

    Bring an Oracle into the current repo — its soul, ALL its skills and its expertise — by link, never by copy.

    123 GitHub stars~1.3k tokensUpdated 7 days ago
    Auto-check passed
  • Trace

    Soul-Brews-Studio/arra-oracle-skills-cli

    Find projects, code, and knowledge across git history, repos, docs, and Oracle.

    123 GitHub stars~2.9k tokensUpdated 7 days ago
    Auto-check passed

Questions about Psi

What does Psi do?

Attach a code repo's ψ vault to a caretaker oracle — check, link, heal, unlink. Psi is an agent skill from Soul-Brews-Studio/arra-oracle-skills-cli. Attach a code repo's ψ vault to a caretaker oracle — check, link, heal, unlink.

When should I use Psi?

Psi fits situations like: A plain code repo (open-source; not an oracle) should keep memory in another oracles vault; the user says psi check; share the vault.

How do I install Psi in Claude Code?

Run `npx skills add Soul-Brews-Studio/arra-oracle-skills-cli --skill psi -a claude-code`. Or copy the skill folder (skills/psi in Soul-Brews-Studio/arra-oracle-skills-cli) into .claude/skills/psi in your project. Claude Code loads it when a task matches its description.

How do I install Psi in Codex?

Run `npx skills add Soul-Brews-Studio/arra-oracle-skills-cli --skill psi -a codex`. Or copy the skill folder (skills/psi in Soul-Brews-Studio/arra-oracle-skills-cli) into .agents/skills/psi in your project. Codex loads it when a task matches its description.

Can I use Psi 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 Soul-Brews-Studio/arra-oracle-skills-cli --skill psi -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/psi, .gemini/skills/psi, .github/skills/psi and .opencode/skills/psi in your project.

What does Psi need to run?

Going by SKILL.md and its folder, Psi needs the command-line tools its instructions call (git, rg, rsync and python3).

Does Psi access the network?

SKILL.md contains no URLs. Its commands use git, which can reach the network depending on how they are called. This is read from the text; nothing was executed.

Is Psi 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 Psi use?

Psi is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Psi use?

About 4.9k tokens (SKILL.md is roughly 20k 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 Psi?

Skills that share tags, products or a category with Psi: Weekly Engineering Retro (garrytan/gstack, 136k stars), Dough Execute Plan (terryyin/lizard, 2.5k stars), Oral Paper Skill (Adkid-Zephyr/oral-paper-skill, 357 stars) and Deck Retro (asheshgoplani/agent-deck, 1.1k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Psi?

Soul-Brews-Studio (a GitHub organization) maintains it in Soul-Brews-Studio/arra-oracle-skills-cli, which has 123 GitHub stars. The repository holds 31 skills in this directory. The repository was last updated on October 3, 2026.

Source: Soul-Brews-Studio/arra-oracle-skills-cli on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.