Skip to content

Add eidetic remember/recall memory skills#11

Merged
OriNachum merged 1 commit into
mainfrom
rollout/eidetic-memory
Jun 23, 2026
Merged

Add eidetic remember/recall memory skills#11
OriNachum merged 1 commit into
mainfrom
rollout/eidetic-memory

Conversation

@OriNachum

Copy link
Copy Markdown
Contributor

Vendors eidetic-cli's first-party remember + recall memory skills into this repo's .claude/skills/ kit (cite-don't-import), giving this agent a shared, persistent memory surface (~/.eidetic/memory) that Claude and the colleague backend both read and write.

  • remembereidetic remember: idempotent upsert of one JSON record or an NDJSON batch on stdin (dedup by id + content hash).
  • recalleidetic recall: four search modes (exact / approximate / keyword / hybrid), each hit carrying text, full provenance metadata, a relevance score, and a freshness signal.

The .sh wrappers are byte-verbatim from eidetic-cli (their first-party origin); this repo's SKILL.md scope examples are localized to its own nick. Version bumped + CHANGELOG updated per the AgentCulture rule. Runtime dep: the eidetic CLI on PATH (else a local eidetic-cli checkout + uv).

Propagated by rollout-cli's eidetic-memory recipe (origin: agentculture/eidetic-cli). Squash-merge at your discretion.

🤖 Generated with Claude Code

  • rollout-cli (Claude)

- **Vendored the `remember` + `recall` memory skills from eidetic-cli**
  (cite-don't-import) — the write/read halves of eidetic's shared
  `~/.eidetic/memory` surface, so this agent (Claude and its colleague backend)
  can persist facts across sessions and recall them later, sharing one store.
  `remember` drives `eidetic remember` (idempotent upsert of one JSON record or
  an NDJSON batch on stdin, dedup by id + content hash); `recall` drives
  `eidetic recall` with four search modes — exact / approximate / keyword /
  hybrid — each hit carrying text, full provenance metadata, a relevance score,
  and a freshness signal. The `.sh` wrappers are byte-verbatim from eidetic-cli
  (their first-party origin); each `SKILL.md` is localized only in the
  illustrative `--scope <nick>` examples (Provenance keeps "First-party to
  eidetic-cli"). Both default to this agent's PRIVATE scope, reading the suffix
  from `culture.yaml`. Runtime dep: the `eidetic` CLI on PATH (else a local
  eidetic-cli checkout with `uv`). Propagated by rollout-cli's `eidetic-memory`
  recipe.
@qodo-code-review

Copy link
Copy Markdown

PR Summary by Qodo

Vendor eidetic remember/recall skills for shared persistent memory
✨ Enhancement 📝 Documentation ⚙️ Configuration changes 🕐 10-20 Minutes

Grey Divider

Description

• Vendor first-party remember/recall skills to write/read ~/.eidetic/memory via eidetic CLI.
• Add portable shell wrappers that resolve eidetic (PATH or uv) and default scope from
 culture.yaml.
• Bump package version to 0.2.0 and document the feature in CHANGELOG.
Diagram

graph TD
  A["Claude + colleague"] --> B["remember.sh"] --> E["eidetic CLI"] --> F[("~/.eidetic/memory")]
  A --> C["recall.sh"] --> E --> F
  B --> D["culture.yaml (suffix)"]
  C --> D
Loading
High-Level Assessment

The following are alternative approaches to this PR:

1. Depend on `eidetic-cli` as a Python library (import, don’t vendor)
  • ➕ Centralizes updates: no duplicated scripts/docs across repos
  • ➕ Can enforce versions via packaging/lockfile
  • ➖ Violates the stated cite-don’t-import convention for skills
  • ➖ Couples this repo’s runtime to Python packaging and eidetic-cli internals rather than a stable CLI surface
2. Git submodule/symlink to `eidetic-cli` skills
  • ➕ Keeps scripts byte-identical to upstream with easy pulls
  • ➕ Avoids manual vendoring churn
  • ➖ Symlinks break portability; submodules add operational friction for contributors and CI
  • ➖ Still leaves the repo dependent on external checkout state rather than self-contained skill kit
3. Native `ghafi` memory implementation
  • ➕ No external CLI dependency; full control over storage and UX
  • ➖ Large scope increase: storage/search/ranking/provenance becomes this repo’s responsibility
  • ➖ High risk and maintenance burden compared to delegating to eidetic

Recommendation: The current approach (vendored wrappers + docs, delegating behavior to the eidetic CLI) is the best fit for a cite-don’t-import skills kit and keeps maintenance bounded.

Two review callouts to consider before merge: (1) both SKILL.md files link to docs/skill-sources.md, but that file is not present in this repo (broken reference unless added elsewhere); (2) the default private-scope behavior only activates when a repo-local culture.yaml exists—if this repo does not ship one, users will silently fall back to eidetic defaults (default/public), so ensure that’s intended/documented for this project.

Files changed (6) +599 / -1

Enhancement (2) +279 / -0
recall.shAdd portable 'eidetic recall' wrapper with scope injection +141/-0

Add portable 'eidetic recall' wrapper with scope injection

• Adds a Bash wrapper that resolves the 'eidetic' CLI (PATH first, otherwise 'uv run' inside an 'eidetic-cli' checkout) and forwards all flags verbatim. If '--scope' is not provided, it attempts to derive a scope suffix from the nearest 'culture.yaml' and defaults visibility to private unless overridden; also sets default embed endpoint/model via environment variables.

.claude/skills/recall/scripts/recall.sh

remember.shAdd portable 'eidetic remember' wrapper with scope injection +138/-0

Add portable 'eidetic remember' wrapper with scope injection

• Adds a Bash wrapper that resolves the 'eidetic' CLI (PATH or 'uv run') and forwards all arguments verbatim to 'eidetic remember'. Injects a default '--scope <suffix>' and '--visibility private' when 'culture.yaml' is found and the caller did not provide '--scope'/'--visibility'; exports default embed endpoint/model variables.

.claude/skills/remember/scripts/remember.sh

Documentation (3) +319 / -0
SKILL.mdAdd /recall skill documentation and usage guidance +181/-0

Add /recall skill documentation and usage guidance

• Introduces the recall skill spec and detailed documentation for 'eidetic recall', including the four search modes, output fields (score/signal/provenance), lifecycle flags, and examples. Documents defaulting to a per-repo private scope derived from 'culture.yaml' and the shared '~/.eidetic/memory' store.

.claude/skills/recall/SKILL.md

SKILL.mdAdd /remember skill documentation and record shape +118/-0

Add /remember skill documentation and record shape

• Introduces the remember skill spec and documentation for ingesting one JSON record or NDJSON batches into eidetic memory. Explains idempotent upsert/dedup semantics, recommended provenance metadata, lifecycle via 'supersedes' + 'eidetic sweep', and default private per-repo scoping behavior.

.claude/skills/remember/SKILL.md

CHANGELOG.mdDocument 0.2.0 release with eidetic memory skills +20/-0

Document 0.2.0 release with eidetic memory skills

• Prepends a 0.2.0 entry describing the addition of vendored 'remember'/'recall' skills, their behavior, default scoping via 'culture.yaml', and the runtime dependency on the 'eidetic' CLI.

CHANGELOG.md

Other (1) +1 / -1
pyproject.tomlBump project version to 0.2.0 +1/-1

Bump project version to 0.2.0

• Updates the package version from 0.1.0 to 0.2.0 to match the new feature release documented in the changelog.

pyproject.toml

@qodo-code-review

Copy link
Copy Markdown

Code Review by Qodo

🐞 Bugs (1) 📘 Rule violations (1) 📜 Skill insights (0)

Context used
✅ Compliance rules (platform): 10 rules

Grey Divider


Action required

1. Skill references home-dir store 📘 Rule violation ✧ Quality
Description
The new skill documentation and scripts include the literal home-directory path ~/.eidetic/memory,
which points outside the repository and is non-portable across environments. Skill artifacts must
avoid external filesystem path literals (including ~/home paths) and instead use repo-local paths
or describe external defaults via environment variables or generic wording to prevent compliance and
CI lint failures.
Code

.claude/skills/recall/scripts/recall.sh[R9-12]

+# The store is the files backend at ~/.eidetic/memory by default — a home-dir
+# path OUTSIDE any git worktree, so Claude and the colleague backend (which runs
+# in throwaway worktrees) read the SAME memories. Set EIDETIC_DATA_DIR to opt out
+# of sharing; set EIDETIC_MONGO_URI / NEO4J_URI + --backend for a server store.
Evidence
PR Compliance IDs 423932 and 423844 require that skill directories and committed
documentation/config artifacts avoid filesystem path literals that reference outside the repository,
including tilde-prefixed home-directory paths. The added/updated skill Markdown (and related
artifacts) explicitly contains ~/.eidetic/memory, and CI’s portability lint
(.claude/skills/pr-review/scripts/portability-lint.sh --all) greps committed
.md/.yaml/.toml/.json for patterns like ~/\.[A-Za-z]; since ~/.eidetic/memory matches that
pattern and is not in the allowed carve-outs, it will be flagged and fail the lint job.

Rule 423932: Validate Claude skill structure and local-only references
Rule 423844: Reject absolute home-directory paths and tilde-dotfile references in docs/configs
.claude/skills/recall/SKILL.md[12-14]
.claude/skills/remember/SKILL.md[11-13]
.claude/skills/recall/scripts/recall.sh[9-12]
.claude/skills/remember/scripts/remember.sh[15-19]
CHANGELOG.md[12-15]
.claude/skills/pr-review/scripts/portability-lint.sh[23-35]
.github/workflows/tests.yml[54-61]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
Remove the literal tilde home-directory path `~/.eidetic/memory` from newly added/updated skill artifacts (docs and scripts), because it references outside the repository and is non-portable, and it also triggers the portability-lint CI rule.

## Issue Context
Skill compliance (PR Compliance IDs 423932 and 423844) disallows absolute paths, `~`, and other outside-repo filesystem path literals in skill directories and committed documentation/config artifacts. CI runs `bash .claude/skills/pr-review/scripts/portability-lint.sh --all`, which flags `~/\.[A-Za-z]` patterns in committed `.md/.yaml/.toml/.json`, and `~/.eidetic/...` is not an exempt carve-out. If the skill needs to mention a default location, describe it without a literal path (e.g., “in the user’s home directory”) and/or refer to an environment variable such as `EIDETIC_DATA_DIR`.

## Fix Focus Areas
- .claude/skills/recall/SKILL.md[12-16]
- .claude/skills/recall/SKILL.md[32-35]
- .claude/skills/recall/SKILL.md[171-175]
- .claude/skills/remember/SKILL.md[11-16]
- .claude/skills/remember/SKILL.md[25-29]
- .claude/skills/recall/scripts/recall.sh[9-12]
- .claude/skills/remember/scripts/remember.sh[15-19]
- CHANGELOG.md[12-26]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools



Remediation recommended

2. Scope default not guaranteed 🐞 Bug ⛨ Security
Description
remember.sh/recall.sh only inject --scope <suffix> --visibility private when they find a
culture.yaml containing suffix:, but this repo’s documented configuration pattern is
.claude/skills.local.yaml and does not provide that suffix, so the wrappers can run without the
intended private-scope defaults.
Code

.claude/skills/remember/scripts/remember.sh[R94-132]

+resolve_scope() {
+    local dir suffix=""
+    dir=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
+    while [ -n "$dir" ] && [ "$dir" != "/" ]; do
+        if [ -f "$dir/culture.yaml" ]; then
+            # Capture only the first non-space token after `suffix:` (so an
+            # inline `# comment` or trailing space can't bleed into the scope),
+            # then strip surrounding quotes only — matching the canonical parser
+            # in .claude/skills/cicd/scripts/_resolve-nick.sh.
+            suffix=$(sed -n \
+                's/^[[:space:]]*-\{0,1\}[[:space:]]*suffix:[[:space:]]*\([^[:space:]]*\).*/\1/p' \
+                "$dir/culture.yaml" | head -n1 | tr -d "\"'")
+            break
+        fi
+        dir=$(dirname "$dir")
+    done
+    printf '%s' "$suffix"
+}
+
+has_flag() {
+    local needle=$1
+    shift
+    local a
+    for a in "$@"; do
+        case "$a" in
+            "$needle" | "$needle"=*) return 0 ;;
+        esac
+    done
+    return 1
+}
+
+SCOPE_ARGS=()
+if ! has_flag --scope "$@"; then
+    EIDETIC_SCOPE=$(resolve_scope)
+    if [ -n "$EIDETIC_SCOPE" ]; then
+        SCOPE_ARGS+=(--scope "$EIDETIC_SCOPE")
+        has_flag --visibility "$@" || SCOPE_ARGS+=(--visibility private)
+    fi
+fi
Evidence
The wrappers only apply the private-scope defaults when resolve_scope() finds culture.yaml and
returns a non-empty suffix; the repo’s own docs/config convention points users to
.claude/skills.local.yaml, and the provided example has no suffix field that these scripts could
consume.

.claude/skills/remember/scripts/remember.sh[94-132]
.claude/skills/recall/scripts/recall.sh[94-132]
CLAUDE.md[117-126]
.claude/skills.local.yaml.example[1-11]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The wrappers’ privacy/scoping behavior depends on resolving `suffix` from a repo-ancestor `culture.yaml`. If that file/value isn’t present, the scripts do not add `--scope ...` and do not add the default `--visibility private`, contradicting the documented “defaults to personal private scope” behavior.

## Issue Context
This repo documents per-machine config in `.claude/skills.local.yaml` (git-ignored) and provides an `.example` schema; neither supplies a `suffix` value. The scripts currently ignore `.claude/skills.local.yaml` entirely.

## Fix Focus Areas
Choose one:
- Add and document a repo-local `culture.yaml` containing `suffix: ghafi` (or equivalent), OR
- Teach `resolve_scope()` to read a suffix/nick from `.claude/skills.local.yaml` (or an env var like `EIDETIC_SCOPE_SUFFIX`) as a fallback when `culture.yaml` is absent.

Then update SKILL.md/CHANGELOG wording to match the actual resolution behavior.

- file/path references:
 - .claude/skills/remember/scripts/remember.sh[77-132]
 - .claude/skills/recall/scripts/recall.sh[76-132]
 - CLAUDE.md[117-126]
 - .claude/skills.local.yaml.example[1-11]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Grey Divider

Qodo Logo

Comment on lines +9 to +12
# The store is the files backend at ~/.eidetic/memory by default — a home-dir
# path OUTSIDE any git worktree, so Claude and the colleague backend (which runs
# in throwaway worktrees) read the SAME memories. Set EIDETIC_DATA_DIR to opt out
# of sharing; set EIDETIC_MONGO_URI / NEO4J_URI + --backend for a server store.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Action required

1. Skill references home-dir store 📘 Rule violation ✧ Quality

The new skill documentation and scripts include the literal home-directory path ~/.eidetic/memory,
which points outside the repository and is non-portable across environments. Skill artifacts must
avoid external filesystem path literals (including ~/home paths) and instead use repo-local paths
or describe external defaults via environment variables or generic wording to prevent compliance and
CI lint failures.
Agent Prompt
## Issue description
Remove the literal tilde home-directory path `~/.eidetic/memory` from newly added/updated skill artifacts (docs and scripts), because it references outside the repository and is non-portable, and it also triggers the portability-lint CI rule.

## Issue Context
Skill compliance (PR Compliance IDs 423932 and 423844) disallows absolute paths, `~`, and other outside-repo filesystem path literals in skill directories and committed documentation/config artifacts. CI runs `bash .claude/skills/pr-review/scripts/portability-lint.sh --all`, which flags `~/\.[A-Za-z]` patterns in committed `.md/.yaml/.toml/.json`, and `~/.eidetic/...` is not an exempt carve-out. If the skill needs to mention a default location, describe it without a literal path (e.g., “in the user’s home directory”) and/or refer to an environment variable such as `EIDETIC_DATA_DIR`.

## Fix Focus Areas
- .claude/skills/recall/SKILL.md[12-16]
- .claude/skills/recall/SKILL.md[32-35]
- .claude/skills/recall/SKILL.md[171-175]
- .claude/skills/remember/SKILL.md[11-16]
- .claude/skills/remember/SKILL.md[25-29]
- .claude/skills/recall/scripts/recall.sh[9-12]
- .claude/skills/remember/scripts/remember.sh[15-19]
- CHANGELOG.md[12-26]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

@OriNachum OriNachum merged commit 44aa42e into main Jun 23, 2026
6 of 7 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant