Skip to content

Add eidetic remember/recall memory skills#10

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

Add eidetic remember/recall memory skills#10
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.
@sonarqubecloud

Copy link
Copy Markdown

@qodo-code-review

Copy link
Copy Markdown

PR Summary by Qodo

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

Grey Divider

Description

• Vendor /remember and /recall skills that wrap eidetic remember/recall.
• Default to repo-specific private scope by reading suffix from culture.yaml.
• Bump version to 0.7.0 and record the addition in CHANGELOG.
Diagram

graph TD
  AG["Claude + colleague"] --> REM["remember.sh"] --> EID["eidetic CLI"] --> MEM[("~/.eidetic/memory")]
  AG --> REC["recall.sh"] --> EID
  REM --> CULT["culture.yaml suffix"]
  REC --> CULT
  EID --> EMB["Embed endpoint"]
  subgraph Legend
    direction LR
    _svc(["Service"]) ~~~ _file["File"] ~~~ _db[("Database")] ~~~ _ext{{"External"}}
  end
Loading
High-Level Assessment

The following are alternative approaches to this PR:

1. Make eidetic-cli a Python dependency (import instead of subprocess)
  • ➕ Richer programmatic API and error handling
  • ➕ Avoids shell portability issues
  • ➖ Violates the repo’s stated cite-don’t-import boundary
  • ➖ Increases coupling and dependency surface
2. Track skills via submodule/symlink to eidetic-cli
  • ➕ Simplifies upstream syncing and provenance management
  • ➖ More brittle across environments; submodules/symlinks often break packaging and tooling
  • ➖ Conflicts with the current vendoring model used in docs/skill-sources.md
3. Require explicit --scope/--visibility and do not auto-default from culture.yaml
  • ➕ More explicit behavior; avoids YAML parsing in bash
  • ➖ Worse ergonomics and more accidental use of global default scope
  • ➖ Undermines the Claude↔colleague shared-memory-by-suffix guarantee

Recommendation: The PR’s approach is the best fit for this repo: vendored wrappers preserve cite-don’t-import provenance while providing correct, safe defaults (repo-specific private scope) and portability (PATH eidetic or uv run fallback). Main review focus should be on the scope-resolution behavior and runtime dependency messaging, since those are the highest-impact operational concerns.

Files changed (6) +599 / -1

Enhancement (2) +279 / -0
recall.shAdd recall.sh wrapper resolving eidetic and defaulting repo-private scope +141/-0

Add recall.sh wrapper resolving eidetic and defaulting repo-private scope

• Adds a portable bash wrapper around 'eidetic recall' with CLI resolution (PATH first, else 'uv run' in an eidetic-cli checkout). Injects '--scope <suffix>' and default '--visibility private' by parsing the nearest 'culture.yaml', and sets default embedding env vars.

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

remember.shAdd remember.sh wrapper resolving eidetic and defaulting repo-private scope +138/-0

Add remember.sh wrapper resolving eidetic and defaulting repo-private scope

• Adds a portable bash wrapper around 'eidetic remember' with CLI resolution (PATH first, else 'uv run' fallback). Defaults ingest into repo-specific private scope using 'culture.yaml' suffix unless '--scope'/'--visibility' are explicitly provided; sets default embedding env vars.

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

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

Add /recall skill documentation and usage contract

• Introduces the '/recall' skill frontmatter and extensive docs: search modes (exact/approximate/keyword/hybrid), output fields, freshness signal, lifecycle inclusion flags, and wrapper defaults for scope/visibility.

.claude/skills/recall/SKILL.md

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

Add /remember skill documentation and record schema

• Introduces the '/remember' skill frontmatter and docs describing record shape, idempotent upsert/dedup behavior, scope/visibility semantics (private-by-default), and lifecycle supersedes/sweep behavior.

.claude/skills/remember/SKILL.md

CHANGELOG.mdAdd 0.7.0 changelog entry for eidetic memory skills +20/-0

Add 0.7.0 changelog entry for eidetic memory skills

• Documents the vendored remember/recall skills, shared '~/.eidetic/memory' store semantics, scope defaulting from 'culture.yaml', and the runtime dependency on the 'eidetic' CLI.

CHANGELOG.md

Other (1) +1 / -1
pyproject.tomlBump package version to 0.7.0 +1/-1

Bump package version to 0.7.0

• Updates the project version from 0.6.0 to 0.7.0 to match the changelog release entry.

pyproject.toml

@qodo-code-review

Copy link
Copy Markdown

Code Review by Qodo

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

Context used
✅ Compliance rules (platform): 20 rules

Grey Divider


Action required

1. Eidetic fallback never resolves 🐞 Bug ☼ Reliability
Description
Both wrappers’ resolve_eidetic() only falls back to uv run when a parent directory contains a
pyproject.toml named exactly eidetic-cli, but this repo’s pyproject.toml is
data-refinery-cli, so the fallback path cannot trigger from this checkout. This makes /remember
and /recall unusable unless an eidetic executable is already on PATH, contradicting the documented
“local eidetic-cli checkout + uv” fallback.
Code

.claude/skills/recall/scripts/recall.sh[R18-36]

+resolve_eidetic() {
+    if command -v eidetic >/dev/null 2>&1; then
+        EIDETIC=(eidetic)            # installed console script — the normal case
+        return 0
+    fi
+    # Dev fallback: inside the eidetic-cli checkout, run via uv.
+    local dir
+    dir=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
+    while [ -n "$dir" ] && [ "$dir" != "/" ]; do
+        if [ -f "$dir/pyproject.toml" ] \
+            && grep -q '^name = "eidetic-cli"' "$dir/pyproject.toml" 2>/dev/null; then
+            if command -v uv >/dev/null 2>&1; then
+                EIDETIC=(uv run --project "$dir" eidetic)
+                return 0
+            fi
+            break
+        fi
+        dir=$(dirname "$dir")
+    done
Relevance

⭐⭐ Medium

Team accepts reliability fixes, but PR claims wrappers are “byte-verbatim” from upstream; could
resist changes.

PR-#6
PR-#7

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The wrappers’ uv fallback is gated on finding a parent pyproject.toml with name = "eidetic-cli",
but this repository’s pyproject.toml declares name = "data-refinery-cli", so walking upward from
.claude/skills/*/scripts will never match within this repo. The CHANGELOG explicitly claims the uv
fallback exists, and another vendored wrapper (ask-colleague.sh) demonstrates a more robust
uv-resolution approach.

.claude/skills/recall/scripts/recall.sh[16-44]
.claude/skills/remember/scripts/remember.sh[23-50]
pyproject.toml[1-4]
CHANGELOG.md[20-26]
.claude/skills/ask-colleague/scripts/ask-colleague.sh[43-74]

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 new skill wrappers claim to resolve `eidetic` from PATH or via `uv run` from a local `eidetic-cli` checkout, but the current implementation only searches upward from the wrapper’s own directory for a `pyproject.toml` whose `name` is exactly `eidetic-cli`. In this repo, the nearest `pyproject.toml` is `data-refinery-cli`, so the `uv` fallback never activates and the scripts error unless `eidetic` is installed globally.

### Issue Context
This repo already has a proven pattern for “installed tool OR uv-run local checkout” resolution in `ask-colleague.sh`, which searches from `$PWD` and the resolved repo root.

### Fix Focus Areas
- .claude/skills/recall/scripts/recall.sh[16-44]
- .claude/skills/remember/scripts/remember.sh[23-50]
- CHANGELOG.md[20-26]

### Suggested changes
- Refactor `resolve_eidetic()` to mirror the working pattern in `.claude/skills/ask-colleague/scripts/ask-colleague.sh`:
 - Attempt `command -v eidetic` first.
 - Then attempt an `uv run --project <dir> eidetic` fallback by searching from `$PWD` and (if available) the git repo root (or an explicit env var like `EIDETIC_CLI_PROJECT`).
 - Optionally: if `EIDETIC` is set, treat it as an override command.
- If you intentionally *don’t* want to support arbitrary local checkouts, update the CHANGELOG/docs to remove the claim that a local checkout + `uv` is sufficient (or clarify that it only works when these scripts live inside the `eidetic-cli` checkout).

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



Remediation recommended

2. Empty recall exits success 🐞 Bug ☼ Reliability
Description
recall.sh treats a missing query (no args) as help and exits 0, so automation can silently
“succeed” without actually recalling anything. This can mask upstream bugs (e.g., agent/tooling
forgetting to pass the query) compared to other wrappers in this repo that exit non-zero when
required arguments are missing.
Code

.claude/skills/recall/scripts/recall.sh[R67-72]

+case "${1:-}" in
+    -h | --help | help | "")
+        usage
+        exit 0
+        ;;
+esac
Relevance

⭐⭐ Medium

History shows preference for non-silent failures (workflow early-exit fix), but “byte-verbatim”
wrapper policy may block change.

PR-#7
PR-#6

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The wrapper explicitly handles an empty first argument by printing usage and exiting 0, while its
own usage string indicates a <query> is required. In contrast, an existing wrapper in this repo
(ask-colleague.sh) validates required arguments and exits 1 when missing.

.claude/skills/recall/scripts/recall.sh[46-55]
.claude/skills/recall/scripts/recall.sh[67-72]
.claude/skills/ask-colleague/scripts/ask-colleague.sh[231-237]

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

### Issue description
`recall.sh` exits 0 when invoked without a query, which makes missing-argument failures hard to detect in scripts/agents.

### Issue Context
The usage text indicates a query is required (`recall.sh "<query>" ...`). Other wrappers (e.g. `ask-colleague`) treat missing required arguments as user-input errors and exit non-zero.

### Fix Focus Areas
- .claude/skills/recall/scripts/recall.sh[67-72]
- .claude/skills/recall/scripts/recall.sh[46-55]

### Suggested changes
- Split the help and empty-args cases:
 - `-h|--help|help` => print usage, `exit 0`
 - empty (`$# -eq 0`) => print usage to stderr and `exit 1` (user error)

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


3. Skill ledger not updated 🐞 Bug ⚙ Maintainability
Description
The repo’s docs/skill-sources.md describes itself as the provenance tracker for vendored
.claude/skills, but it has no entries for the newly added remember/recall skills. This
undermines the documented “re-sync stays deterministic” workflow for tracking upstream skill
sources.
Code

CHANGELOG.md[R12-26]

+- **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.
Relevance

⭐⭐ Medium

No historical evidence: docs/skill-sources.md not present on default branch; unclear if team
maintains such a ledger.

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The CHANGELOG documents the addition of the two new vendored skills, while docs/skill-sources.md’s
skill table lists existing vendored skills but does not include remember or recall, despite
describing itself as the provenance tracker for .claude/skills/.

CHANGELOG.md[12-26]
docs/skill-sources.md[23-37]

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

### Issue description
Two new vendored skills were added (`remember`, `recall`), but the canonical provenance ledger (`docs/skill-sources.md`) was not updated to include them.

### Issue Context
`docs/skill-sources.md` exists specifically to record upstream/origin/notes/last-synced for every vendored skill so future refreshes are reproducible.

### Fix Focus Areas
- docs/skill-sources.md[23-37]
- CHANGELOG.md[12-26]

### Suggested changes
- Add rows for `remember` and `recall` to the table in `docs/skill-sources.md`, including upstream location (eidetic-cli), origin, runtime dependency note (`eidetic` on PATH), and last synced date/version (per your rollout recipe).
- Keep the “cite-don’t-import” provenance language consistent with the new SKILL.md provenance sections.

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


Grey Divider

Qodo Logo

Comment on lines +18 to +36
resolve_eidetic() {
if command -v eidetic >/dev/null 2>&1; then
EIDETIC=(eidetic) # installed console script — the normal case
return 0
fi
# Dev fallback: inside the eidetic-cli checkout, run via uv.
local dir
dir=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
while [ -n "$dir" ] && [ "$dir" != "/" ]; do
if [ -f "$dir/pyproject.toml" ] \
&& grep -q '^name = "eidetic-cli"' "$dir/pyproject.toml" 2>/dev/null; then
if command -v uv >/dev/null 2>&1; then
EIDETIC=(uv run --project "$dir" eidetic)
return 0
fi
break
fi
dir=$(dirname "$dir")
done

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. Eidetic fallback never resolves 🐞 Bug ☼ Reliability

Both wrappers’ resolve_eidetic() only falls back to uv run when a parent directory contains a
pyproject.toml named exactly eidetic-cli, but this repo’s pyproject.toml is
data-refinery-cli, so the fallback path cannot trigger from this checkout. This makes /remember
and /recall unusable unless an eidetic executable is already on PATH, contradicting the documented
“local eidetic-cli checkout + uv” fallback.
Agent Prompt
### Issue description
The new skill wrappers claim to resolve `eidetic` from PATH or via `uv run` from a local `eidetic-cli` checkout, but the current implementation only searches upward from the wrapper’s own directory for a `pyproject.toml` whose `name` is exactly `eidetic-cli`. In this repo, the nearest `pyproject.toml` is `data-refinery-cli`, so the `uv` fallback never activates and the scripts error unless `eidetic` is installed globally.

### Issue Context
This repo already has a proven pattern for “installed tool OR uv-run local checkout” resolution in `ask-colleague.sh`, which searches from `$PWD` and the resolved repo root.

### Fix Focus Areas
- .claude/skills/recall/scripts/recall.sh[16-44]
- .claude/skills/remember/scripts/remember.sh[23-50]
- CHANGELOG.md[20-26]

### Suggested changes
- Refactor `resolve_eidetic()` to mirror the working pattern in `.claude/skills/ask-colleague/scripts/ask-colleague.sh`:
  - Attempt `command -v eidetic` first.
  - Then attempt an `uv run --project <dir> eidetic` fallback by searching from `$PWD` and (if available) the git repo root (or an explicit env var like `EIDETIC_CLI_PROJECT`).
  - Optionally: if `EIDETIC` is set, treat it as an override command.
- If you intentionally *don’t* want to support arbitrary local checkouts, update the CHANGELOG/docs to remove the claim that a local checkout + `uv` is sufficient (or clarify that it only works when these scripts live inside the `eidetic-cli` checkout).

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

@OriNachum OriNachum merged commit 01d9a95 into main Jun 23, 2026
8 checks passed
@OriNachum OriNachum deleted the rollout/eidetic-memory branch June 23, 2026 17:26
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