coherence-cli 0.2.0__tar.gz → 0.3.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- coherence_cli-0.3.0/.claude/skills/recall/SKILL.md +181 -0
- coherence_cli-0.3.0/.claude/skills/recall/scripts/recall.sh +141 -0
- coherence_cli-0.3.0/.claude/skills/remember/SKILL.md +118 -0
- coherence_cli-0.3.0/.claude/skills/remember/scripts/remember.sh +138 -0
- {coherence_cli-0.2.0 → coherence_cli-0.3.0}/CHANGELOG.md +26 -0
- coherence_cli-0.3.0/LICENSE +201 -0
- {coherence_cli-0.2.0 → coherence_cli-0.3.0}/PKG-INFO +5 -5
- {coherence_cli-0.2.0 → coherence_cli-0.3.0}/README.md +1 -1
- {coherence_cli-0.2.0 → coherence_cli-0.3.0}/coherence/explain/catalog.py +1 -0
- {coherence_cli-0.2.0 → coherence_cli-0.3.0}/pyproject.toml +4 -4
- {coherence_cli-0.2.0 → coherence_cli-0.3.0}/uv.lock +31 -31
- coherence_cli-0.2.0/LICENSE +0 -21
- {coherence_cli-0.2.0 → coherence_cli-0.3.0}/.claude/skills/agent-config/SKILL.md +0 -0
- {coherence_cli-0.2.0 → coherence_cli-0.3.0}/.claude/skills/agent-config/data/backend-fingerprints.yaml +0 -0
- {coherence_cli-0.2.0 → coherence_cli-0.3.0}/.claude/skills/agent-config/scripts/show.sh +0 -0
- {coherence_cli-0.2.0 → coherence_cli-0.3.0}/.claude/skills/ask-colleague/SKILL.md +0 -0
- {coherence_cli-0.2.0 → coherence_cli-0.3.0}/.claude/skills/ask-colleague/prompts/explore.md +0 -0
- {coherence_cli-0.2.0 → coherence_cli-0.3.0}/.claude/skills/ask-colleague/prompts/review.md +0 -0
- {coherence_cli-0.2.0 → coherence_cli-0.3.0}/.claude/skills/ask-colleague/prompts/write.md +0 -0
- {coherence_cli-0.2.0 → coherence_cli-0.3.0}/.claude/skills/ask-colleague/scripts/ask-colleague.sh +0 -0
- {coherence_cli-0.2.0 → coherence_cli-0.3.0}/.claude/skills/assign-to-workforce/SKILL.md +0 -0
- {coherence_cli-0.2.0 → coherence_cli-0.3.0}/.claude/skills/assign-to-workforce/scripts/assign-to-workforce.sh +0 -0
- {coherence_cli-0.2.0 → coherence_cli-0.3.0}/.claude/skills/cicd/SKILL.md +0 -0
- {coherence_cli-0.2.0 → coherence_cli-0.3.0}/.claude/skills/cicd/scripts/_resolve-nick.sh +0 -0
- {coherence_cli-0.2.0 → coherence_cli-0.3.0}/.claude/skills/cicd/scripts/portability-lint.sh +0 -0
- {coherence_cli-0.2.0 → coherence_cli-0.3.0}/.claude/skills/cicd/scripts/pr-reply.sh +0 -0
- {coherence_cli-0.2.0 → coherence_cli-0.3.0}/.claude/skills/cicd/scripts/pr-status.sh +0 -0
- {coherence_cli-0.2.0 → coherence_cli-0.3.0}/.claude/skills/cicd/scripts/workflow.sh +0 -0
- {coherence_cli-0.2.0 → coherence_cli-0.3.0}/.claude/skills/communicate/SKILL.md +0 -0
- {coherence_cli-0.2.0 → coherence_cli-0.3.0}/.claude/skills/communicate/scripts/fetch-issues.sh +0 -0
- {coherence_cli-0.2.0 → coherence_cli-0.3.0}/.claude/skills/communicate/scripts/mesh-message.sh +0 -0
- {coherence_cli-0.2.0 → coherence_cli-0.3.0}/.claude/skills/communicate/scripts/post-comment.sh +0 -0
- {coherence_cli-0.2.0 → coherence_cli-0.3.0}/.claude/skills/communicate/scripts/post-issue.sh +0 -0
- {coherence_cli-0.2.0 → coherence_cli-0.3.0}/.claude/skills/communicate/scripts/templates/skill-new-brief.md +0 -0
- {coherence_cli-0.2.0 → coherence_cli-0.3.0}/.claude/skills/communicate/scripts/templates/skill-update-brief.md +0 -0
- {coherence_cli-0.2.0 → coherence_cli-0.3.0}/.claude/skills/doc-test-alignment/SKILL.md +0 -0
- {coherence_cli-0.2.0 → coherence_cli-0.3.0}/.claude/skills/doc-test-alignment/scripts/check.sh +0 -0
- {coherence_cli-0.2.0 → coherence_cli-0.3.0}/.claude/skills/pypi-maintainer/SKILL.md +0 -0
- {coherence_cli-0.2.0 → coherence_cli-0.3.0}/.claude/skills/pypi-maintainer/scripts/switch-source.sh +0 -0
- {coherence_cli-0.2.0 → coherence_cli-0.3.0}/.claude/skills/run-tests/SKILL.md +0 -0
- {coherence_cli-0.2.0 → coherence_cli-0.3.0}/.claude/skills/run-tests/scripts/test.sh +0 -0
- {coherence_cli-0.2.0 → coherence_cli-0.3.0}/.claude/skills/sonarclaude/SKILL.md +0 -0
- {coherence_cli-0.2.0 → coherence_cli-0.3.0}/.claude/skills/sonarclaude/scripts/sonar.sh +0 -0
- {coherence_cli-0.2.0 → coherence_cli-0.3.0}/.claude/skills/spec-to-plan/SKILL.md +0 -0
- {coherence_cli-0.2.0 → coherence_cli-0.3.0}/.claude/skills/spec-to-plan/scripts/spec-to-plan.sh +0 -0
- {coherence_cli-0.2.0 → coherence_cli-0.3.0}/.claude/skills/think/SKILL.md +0 -0
- {coherence_cli-0.2.0 → coherence_cli-0.3.0}/.claude/skills/think/scripts/think.sh +0 -0
- {coherence_cli-0.2.0 → coherence_cli-0.3.0}/.claude/skills/version-bump/SKILL.md +0 -0
- {coherence_cli-0.2.0 → coherence_cli-0.3.0}/.claude/skills/version-bump/scripts/bump.py +0 -0
- {coherence_cli-0.2.0 → coherence_cli-0.3.0}/.claude/skills.local.yaml.example +0 -0
- {coherence_cli-0.2.0 → coherence_cli-0.3.0}/.flake8 +0 -0
- {coherence_cli-0.2.0 → coherence_cli-0.3.0}/.github/workflows/publish.yml +0 -0
- {coherence_cli-0.2.0 → coherence_cli-0.3.0}/.github/workflows/tests.yml +0 -0
- {coherence_cli-0.2.0 → coherence_cli-0.3.0}/.gitignore +0 -0
- {coherence_cli-0.2.0 → coherence_cli-0.3.0}/.markdownlint-cli2.yaml +0 -0
- {coherence_cli-0.2.0 → coherence_cli-0.3.0}/CLAUDE.md +0 -0
- {coherence_cli-0.2.0 → coherence_cli-0.3.0}/coherence/__init__.py +0 -0
- {coherence_cli-0.2.0 → coherence_cli-0.3.0}/coherence/__main__.py +0 -0
- {coherence_cli-0.2.0 → coherence_cli-0.3.0}/coherence/cli/__init__.py +0 -0
- {coherence_cli-0.2.0 → coherence_cli-0.3.0}/coherence/cli/_commands/__init__.py +0 -0
- {coherence_cli-0.2.0 → coherence_cli-0.3.0}/coherence/cli/_commands/cli.py +0 -0
- {coherence_cli-0.2.0 → coherence_cli-0.3.0}/coherence/cli/_commands/doctor.py +0 -0
- {coherence_cli-0.2.0 → coherence_cli-0.3.0}/coherence/cli/_commands/explain.py +0 -0
- {coherence_cli-0.2.0 → coherence_cli-0.3.0}/coherence/cli/_commands/learn.py +0 -0
- {coherence_cli-0.2.0 → coherence_cli-0.3.0}/coherence/cli/_commands/overview.py +0 -0
- {coherence_cli-0.2.0 → coherence_cli-0.3.0}/coherence/cli/_commands/whoami.py +0 -0
- {coherence_cli-0.2.0 → coherence_cli-0.3.0}/coherence/cli/_errors.py +0 -0
- {coherence_cli-0.2.0 → coherence_cli-0.3.0}/coherence/cli/_output.py +0 -0
- {coherence_cli-0.2.0 → coherence_cli-0.3.0}/coherence/explain/__init__.py +0 -0
- {coherence_cli-0.2.0 → coherence_cli-0.3.0}/culture.yaml +0 -0
- {coherence_cli-0.2.0 → coherence_cli-0.3.0}/docs/skill-sources.md +0 -0
- {coherence_cli-0.2.0 → coherence_cli-0.3.0}/sonar-project.properties +0 -0
- {coherence_cli-0.2.0 → coherence_cli-0.3.0}/tests/__init__.py +0 -0
- {coherence_cli-0.2.0 → coherence_cli-0.3.0}/tests/test_cli.py +0 -0
- {coherence_cli-0.2.0 → coherence_cli-0.3.0}/tests/test_cli_introspection.py +0 -0
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: recall
|
|
3
|
+
type: command
|
|
4
|
+
description: >
|
|
5
|
+
Search the shared eidetic memory store and get back ranked, provenanced
|
|
6
|
+
records. Drives `eidetic recall` with four search modes — exact (verbatim
|
|
7
|
+
substring), approximate (vector/semantic), keyword (BM25 lexical), and hybrid
|
|
8
|
+
(a weighted blend of vector+keyword, the default) — each hit carrying its
|
|
9
|
+
text, full metadata, a relevance `score`, and a freshness `signal`. Recall
|
|
10
|
+
passively reinforces matched records (bumps last_recall + recall_count).
|
|
11
|
+
Shadowed and archived records are excluded by default; use
|
|
12
|
+
--include-shadowed / --include-archived to retrieve them. The store lives at
|
|
13
|
+
~/.eidetic/memory (a home-dir path outside any git worktree); the wrapper
|
|
14
|
+
defaults queries to this agent's PERSONAL, PRIVATE scope (`--scope coherence-cli
|
|
15
|
+
--visibility private`, suffix read from culture.yaml) — matching where
|
|
16
|
+
/remember writes — so a no-flag recall returns this agent's own private records
|
|
17
|
+
plus the shared public pool, and Claude and the colleague backend recall each
|
|
18
|
+
other's memories because both resolve the same suffix via this skill. Use
|
|
19
|
+
when the user says "recall", "what do we know about X", "search memory",
|
|
20
|
+
"have we seen X before", "look it up in memory", "eidetic recall", or before
|
|
21
|
+
answering from scratch when prior context may already be stored. Pairs with
|
|
22
|
+
the sibling /remember skill.
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
# recall — search the shared eidetic memory
|
|
26
|
+
|
|
27
|
+
`recall` drives **`eidetic recall`**: given a query, it returns the top-k stored
|
|
28
|
+
records ranked by relevance, each with its `text`, full `metadata` (provenance),
|
|
29
|
+
a numeric `score`, and a freshness `signal`. It is the read half of the memory
|
|
30
|
+
surface; the write half is the sibling **/remember** skill.
|
|
31
|
+
|
|
32
|
+
The point of a *shared* store is that memory is a **team faculty**, not a
|
|
33
|
+
per-agent silo: a record Claude wrote is recallable by the colleague backend
|
|
34
|
+
(and vice versa), because both resolve the same `~/.eidetic/memory` path.
|
|
35
|
+
|
|
36
|
+
## How to run
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
bash .claude/skills/recall/scripts/recall.sh "<query>" [flags...]
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
The wrapper resolves the CLI portably (installed `eidetic` on `PATH`, else
|
|
43
|
+
`uv run eidetic` from the checkout) and forwards every flag verbatim, so it is
|
|
44
|
+
exactly `eidetic recall …`. Run it from anywhere; the store is the same.
|
|
45
|
+
|
|
46
|
+
## Search modes (`--mode`, default `hybrid`)
|
|
47
|
+
|
|
48
|
+
| Mode | What it matches | Needs embed server? |
|
|
49
|
+
|------|-----------------|---------------------|
|
|
50
|
+
| `exact` | case-insensitive verbatim substring (`--case-sensitive` to tighten) | no — offline-safe |
|
|
51
|
+
| `approximate` | vector cosine / semantic similarity | yes (falls back offline) |
|
|
52
|
+
| `keyword` | BM25 lexical; only records sharing a query term | no — offline-safe |
|
|
53
|
+
| `hybrid` | `alpha*approximate + (1-alpha)*keyword` (`--alpha`, default 0.5) | uses it when up |
|
|
54
|
+
|
|
55
|
+
`hybrid` is the default because the two signals cover each other's blind spots:
|
|
56
|
+
vector catches paraphrases, keyword catches exact ids/quotes. When the embed
|
|
57
|
+
server is unreachable, `hybrid` collapses to keyword-only (it never fuses
|
|
58
|
+
meaningless offline-fallback cosine).
|
|
59
|
+
|
|
60
|
+
## Output fields
|
|
61
|
+
|
|
62
|
+
Each hit in `--json` output includes:
|
|
63
|
+
|
|
64
|
+
| Field | Notes |
|
|
65
|
+
|-------|-------|
|
|
66
|
+
| `id` | stable record identity |
|
|
67
|
+
| `text` | the stored chunk |
|
|
68
|
+
| `type` | record type |
|
|
69
|
+
| `metadata` | full provenance, round-tripped verbatim from ingest |
|
|
70
|
+
| `score` | relevance score from the chosen search mode (freshness-blended) |
|
|
71
|
+
| `signal` | freshness strength in [0, 1]; computed at recall time from age, recall frequency, and staleness |
|
|
72
|
+
| `created` | ISO-8601 ingest date (may be DATE_UNKNOWN for legacy records) |
|
|
73
|
+
| `last_recall` | ISO-8601 timestamp of the most recent recall hit (null if never recalled) |
|
|
74
|
+
| `recall_count` | number of times this record has been recalled (passive reinforcement counter) |
|
|
75
|
+
| `lifecycle` | `active`, `shadowed`, or `archived` |
|
|
76
|
+
| `links` | list of related-memory ids |
|
|
77
|
+
|
|
78
|
+
## Freshness signal
|
|
79
|
+
|
|
80
|
+
Every `recall` hit carries a `signal` field (float in `[0, 1]`). The signal
|
|
81
|
+
blends **multiplicatively** into the lexical/vector score so recently-created
|
|
82
|
+
and frequently-recalled records surface ahead of stale ones. The formula:
|
|
83
|
+
|
|
84
|
+
```
|
|
85
|
+
access_bonus = min(0.5, recall_count * 0.05)
|
|
86
|
+
age_factor = 1 / (1 + days_since_creation * 0.01)
|
|
87
|
+
staleness = days_since_last_recall * 0.01
|
|
88
|
+
signal = clamp((0.5 - staleness + access_bonus) * age_factor, 0, 1)
|
|
89
|
+
blended_score = score * (1 + 0.25 * (signal - 0.5))
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
Records with no temporal data (legacy, undated) are an exact no-op — the blend
|
|
93
|
+
is skipped for them so pre-existing fixture scores are unchanged.
|
|
94
|
+
|
|
95
|
+
Each `recall` call is also **passive reinforcement**: it bumps `last_recall` and
|
|
96
|
+
`recall_count` on every matched record, so frequently-recalled memories organically
|
|
97
|
+
gain signal strength over time.
|
|
98
|
+
|
|
99
|
+
## Lifecycle flags
|
|
100
|
+
|
|
101
|
+
By default, `recall` returns only `active` records. Use these flags to retrieve
|
|
102
|
+
non-active records:
|
|
103
|
+
|
|
104
|
+
- `--include-shadowed` — include records whose `lifecycle == "shadowed"` (records
|
|
105
|
+
superseded within their scope by a newer record). Shadowed records are preserved
|
|
106
|
+
and still searchable; they are just hidden from the default result set.
|
|
107
|
+
- `--include-archived` — include records whose `lifecycle == "archived"` (records
|
|
108
|
+
older than ~1 year or below the signal threshold). Archived records are fully
|
|
109
|
+
preserved; the flag makes them retrievable again.
|
|
110
|
+
|
|
111
|
+
Both flags can be combined. Neither affects ranking — shadowed/archived records
|
|
112
|
+
compete on score/signal just like active ones when included.
|
|
113
|
+
|
|
114
|
+
## Common flags (forwarded to `eidetic recall`)
|
|
115
|
+
|
|
116
|
+
- `--mode exact|approximate|keyword|hybrid` — default `hybrid`.
|
|
117
|
+
- `--top-k N` — max results (default 5).
|
|
118
|
+
- `--alpha F` — hybrid blend weight in `[0,1]` (default 0.5).
|
|
119
|
+
- `--case-sensitive` — for `--mode exact`.
|
|
120
|
+
- `--filter KEY=VALUE` — metadata facet filter (repeatable): e.g. `--filter source=docs`.
|
|
121
|
+
- `--scope NAME` / `--visibility public|private` — scope isolation (no private
|
|
122
|
+
leak). **The wrapper defaults this to the agent's PERSONAL, PRIVATE scope**
|
|
123
|
+
(`--scope coherence-cli --visibility private`, suffix read from `culture.yaml`),
|
|
124
|
+
matching where `/remember` writes — so a no-flag recall returns this agent's
|
|
125
|
+
own private records **plus** the shared public pool, while those private records
|
|
126
|
+
stay invisible to a `default`/other-scope recall. Pass `--scope`/`--visibility`
|
|
127
|
+
to query elsewhere; a wheel install with no `culture.yaml` falls back to the
|
|
128
|
+
CLI default `default`/`public`.
|
|
129
|
+
- `--backend files|mongo|neo4j` — default `files` (the shared home-dir store).
|
|
130
|
+
- `--include-shadowed` — include shadowed records in results (excluded by default).
|
|
131
|
+
- `--include-archived` — include archived records in results (excluded by default).
|
|
132
|
+
- `--json` — structured list to stdout (use this when an agent parses the result).
|
|
133
|
+
|
|
134
|
+
## Examples
|
|
135
|
+
|
|
136
|
+
```bash
|
|
137
|
+
# Default hybrid recall, JSON for an agent to parse:
|
|
138
|
+
bash .claude/skills/recall/scripts/recall.sh "jetson nano power draw" --json
|
|
139
|
+
|
|
140
|
+
# Find the exact message that mentions a phrase:
|
|
141
|
+
bash .claude/skills/recall/scripts/recall.sh "Orin Nano" --mode exact
|
|
142
|
+
|
|
143
|
+
# Keyword search, offline-safe, narrowed to a source:
|
|
144
|
+
bash .claude/skills/recall/scripts/recall.sh "thermal throttle" --mode keyword \
|
|
145
|
+
--filter source=discord --top-k 10
|
|
146
|
+
|
|
147
|
+
# Retrieve a record that was recently shadowed (its superseding record is now active):
|
|
148
|
+
bash .claude/skills/recall/scripts/recall.sh "old topic" --include-shadowed --json
|
|
149
|
+
|
|
150
|
+
# Retrieve all records including archived (to audit stale memories):
|
|
151
|
+
bash .claude/skills/recall/scripts/recall.sh "power" --include-archived --include-shadowed --json
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
## Notes
|
|
155
|
+
|
|
156
|
+
- **Provenance is mandatory** on every hit — recall is for *cited* answers.
|
|
157
|
+
- The embed endpoint defaults to the local model-gear embed gear
|
|
158
|
+
(`http://localhost:8002/v1`, model `Qwen/Qwen3-Embedding-0.6B`); override with
|
|
159
|
+
`EIDETIC_EMBED_URL` / `EIDETIC_EMBED_MODEL`. `exact`/`keyword` ignore it.
|
|
160
|
+
- **Use the wrapper, not a bare `eidetic`.** The console script may not be on
|
|
161
|
+
`PATH` (in a dev checkout it isn't) — the wrapper resolves it for you (`PATH`
|
|
162
|
+
first, else `uv run eidetic`). For the docs, run `eidetic explain recall` if
|
|
163
|
+
installed, otherwise `uv run --project <eidetic-cli checkout> eidetic explain
|
|
164
|
+
recall`. (`explain` is an **`eidetic`** verb — a sibling tool like `devex`
|
|
165
|
+
won't know it.)
|
|
166
|
+
- **Reading scores:** `exact`, `keyword`, and `hybrid` drop non-matching records
|
|
167
|
+
(hybrid drops any record with a `0.0` blended score), so their hits are real
|
|
168
|
+
matches. `approximate` keeps every candidate ranked by raw cosine, so it can
|
|
169
|
+
return low/near-zero scores when the store is small — lower `--top-k` to trim.
|
|
170
|
+
A `--min-score` threshold is a tracked follow-up.
|
|
171
|
+
- **Sharing scope = one OS user.** The default store is `~/.eidetic/memory`, so
|
|
172
|
+
every agent/process running as the *same* OS user shares it (that is the point —
|
|
173
|
+
Claude + colleague). It is not isolated between OS users by anything but file
|
|
174
|
+
permissions; keep genuinely private data in a `--visibility private` scope and
|
|
175
|
+
treat the host as the trust boundary.
|
|
176
|
+
|
|
177
|
+
## Provenance
|
|
178
|
+
|
|
179
|
+
First-party to **eidetic-cli** — eidetic owns its memory surface. Cite, don't
|
|
180
|
+
import: downstream repos copy this skill, they don't symlink it. See
|
|
181
|
+
[`docs/skill-sources.md`](../../../docs/skill-sources.md).
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# recall.sh — search the shared eidetic memory store (the /recall skill).
|
|
3
|
+
#
|
|
4
|
+
# Thin, portable wrapper around `eidetic recall`. It resolves the CLI, points
|
|
5
|
+
# the embedding modes at the local model-gear embed gear (overridable), and
|
|
6
|
+
# forwards every flag verbatim — so `recall.sh "<query>" --mode hybrid --json`
|
|
7
|
+
# is exactly `eidetic recall "<query>" --mode hybrid --json`.
|
|
8
|
+
#
|
|
9
|
+
# The store is the files backend at ~/.eidetic/memory by default — a home-dir
|
|
10
|
+
# path OUTSIDE any git worktree, so Claude and the colleague backend (which runs
|
|
11
|
+
# in throwaway worktrees) read the SAME memories. Set EIDETIC_DATA_DIR to opt out
|
|
12
|
+
# of sharing; set EIDETIC_MONGO_URI / NEO4J_URI + --backend for a server store.
|
|
13
|
+
|
|
14
|
+
set -euo pipefail
|
|
15
|
+
|
|
16
|
+
# ── resolve the eidetic CLI (installed tool first, then dev checkout) ────────
|
|
17
|
+
EIDETIC=()
|
|
18
|
+
resolve_eidetic() {
|
|
19
|
+
if command -v eidetic >/dev/null 2>&1; then
|
|
20
|
+
EIDETIC=(eidetic) # installed console script — the normal case
|
|
21
|
+
return 0
|
|
22
|
+
fi
|
|
23
|
+
# Dev fallback: inside the eidetic-cli checkout, run via uv.
|
|
24
|
+
local dir
|
|
25
|
+
dir=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
|
|
26
|
+
while [ -n "$dir" ] && [ "$dir" != "/" ]; do
|
|
27
|
+
if [ -f "$dir/pyproject.toml" ] \
|
|
28
|
+
&& grep -q '^name = "eidetic-cli"' "$dir/pyproject.toml" 2>/dev/null; then
|
|
29
|
+
if command -v uv >/dev/null 2>&1; then
|
|
30
|
+
EIDETIC=(uv run --project "$dir" eidetic)
|
|
31
|
+
return 0
|
|
32
|
+
fi
|
|
33
|
+
break
|
|
34
|
+
fi
|
|
35
|
+
dir=$(dirname "$dir")
|
|
36
|
+
done
|
|
37
|
+
cat >&2 <<'EOF'
|
|
38
|
+
error: eidetic CLI not found.
|
|
39
|
+
hint: install it with `uv tool install eidetic-cli` (or `pipx install eidetic-cli`),
|
|
40
|
+
or run from inside the eidetic-cli checkout with `uv` available.
|
|
41
|
+
The console script is `eidetic` (dist name: eidetic-cli).
|
|
42
|
+
EOF
|
|
43
|
+
return 1
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
usage() {
|
|
47
|
+
cat <<'EOF'
|
|
48
|
+
recall.sh — search the shared eidetic memory store (the /recall skill).
|
|
49
|
+
|
|
50
|
+
Usage:
|
|
51
|
+
recall.sh "<query>" [--mode exact|approximate|keyword|hybrid] [--top-k N] \
|
|
52
|
+
[--alpha F] [--case-sensitive] [--filter KEY=VALUE]... \
|
|
53
|
+
[--backend files|mongo|neo4j] [--scope NAME] [--visibility public|private] \
|
|
54
|
+
[--json]
|
|
55
|
+
|
|
56
|
+
Modes (default: hybrid):
|
|
57
|
+
exact case-insensitive verbatim substring (--case-sensitive to tighten); offline-safe
|
|
58
|
+
approximate vector cosine / semantic similarity (uses the embed server)
|
|
59
|
+
keyword BM25 lexical; only records sharing a query term; offline-safe
|
|
60
|
+
hybrid alpha*approximate + (1-alpha)*keyword (--alpha, default 0.5);
|
|
61
|
+
degrades to keyword-only when the embed server is offline
|
|
62
|
+
|
|
63
|
+
Every flag is forwarded verbatim to `eidetic recall`. See `eidetic explain recall`.
|
|
64
|
+
EOF
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
case "${1:-}" in
|
|
68
|
+
-h | --help | help | "")
|
|
69
|
+
usage
|
|
70
|
+
exit 0
|
|
71
|
+
;;
|
|
72
|
+
esac
|
|
73
|
+
|
|
74
|
+
resolve_eidetic || exit 2
|
|
75
|
+
|
|
76
|
+
# ── default to this agent's PERSONAL, PRIVATE scope (culture.yaml `suffix`) ──
|
|
77
|
+
# Query this agent's OWN personal scope by default, matching where /remember
|
|
78
|
+
# writes, instead of the global `default` scope shared by every project on this
|
|
79
|
+
# host. We read the `suffix` from the nearest culture.yaml (walking up from this
|
|
80
|
+
# script), so the scope follows the repo identity rather than being hard-coded —
|
|
81
|
+
# a downstream cite-don't-import copy adapts to its own suffix, and the colleague
|
|
82
|
+
# backend (running in a worktree of this same repo) resolves the same suffix,
|
|
83
|
+
# keeping the Claude↔colleague shared-memory story intact.
|
|
84
|
+
#
|
|
85
|
+
# The personal scope is PRIVATE by default to match /remember: in eidetic's model
|
|
86
|
+
# a private record is served only to a recall in the SAME scope (`can_serve`), so
|
|
87
|
+
# querying with --scope <suffix> --visibility private is what retrieves those
|
|
88
|
+
# isolated records (a public/default recall can't see them). Scope and visibility
|
|
89
|
+
# are paired — the private default applies only when we inject the resolved scope,
|
|
90
|
+
# and only if the caller didn't pass --visibility (so an explicit
|
|
91
|
+
# `--visibility public` still wins). An explicit --scope on the command line takes
|
|
92
|
+
# over steering entirely; a wheel install with no culture.yaml falls back to the
|
|
93
|
+
# plain CLI default (`default`/`public`).
|
|
94
|
+
resolve_scope() {
|
|
95
|
+
local dir suffix=""
|
|
96
|
+
dir=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
|
|
97
|
+
while [ -n "$dir" ] && [ "$dir" != "/" ]; do
|
|
98
|
+
if [ -f "$dir/culture.yaml" ]; then
|
|
99
|
+
# Capture only the first non-space token after `suffix:` (so an
|
|
100
|
+
# inline `# comment` or trailing space can't bleed into the scope),
|
|
101
|
+
# then strip surrounding quotes only — matching the canonical parser
|
|
102
|
+
# in .claude/skills/cicd/scripts/_resolve-nick.sh.
|
|
103
|
+
suffix=$(sed -n \
|
|
104
|
+
's/^[[:space:]]*-\{0,1\}[[:space:]]*suffix:[[:space:]]*\([^[:space:]]*\).*/\1/p' \
|
|
105
|
+
"$dir/culture.yaml" | head -n1 | tr -d "\"'")
|
|
106
|
+
break
|
|
107
|
+
fi
|
|
108
|
+
dir=$(dirname "$dir")
|
|
109
|
+
done
|
|
110
|
+
printf '%s' "$suffix"
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
has_flag() {
|
|
114
|
+
local needle=$1
|
|
115
|
+
shift
|
|
116
|
+
local a
|
|
117
|
+
for a in "$@"; do
|
|
118
|
+
case "$a" in
|
|
119
|
+
"$needle" | "$needle"=*) return 0 ;;
|
|
120
|
+
esac
|
|
121
|
+
done
|
|
122
|
+
return 1
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
SCOPE_ARGS=()
|
|
126
|
+
if ! has_flag --scope "$@"; then
|
|
127
|
+
EIDETIC_SCOPE=$(resolve_scope)
|
|
128
|
+
if [ -n "$EIDETIC_SCOPE" ]; then
|
|
129
|
+
SCOPE_ARGS+=(--scope "$EIDETIC_SCOPE")
|
|
130
|
+
has_flag --visibility "$@" || SCOPE_ARGS+=(--visibility private)
|
|
131
|
+
fi
|
|
132
|
+
fi
|
|
133
|
+
|
|
134
|
+
# Default the embedding endpoint to the local model-gear embed gear. eidetic
|
|
135
|
+
# falls back to a deterministic offline embedding if it's unreachable, so this
|
|
136
|
+
# is safe even when the gear is down. Override by exporting these yourself.
|
|
137
|
+
: "${EIDETIC_EMBED_URL:=http://localhost:8002/v1}"
|
|
138
|
+
: "${EIDETIC_EMBED_MODEL:=Qwen/Qwen3-Embedding-0.6B}"
|
|
139
|
+
export EIDETIC_EMBED_URL EIDETIC_EMBED_MODEL
|
|
140
|
+
|
|
141
|
+
exec "${EIDETIC[@]}" recall "${SCOPE_ARGS[@]}" "$@"
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: remember
|
|
3
|
+
type: command
|
|
4
|
+
description: >
|
|
5
|
+
Ingest records into the shared eidetic memory store so they can be recalled
|
|
6
|
+
later. Drives `eidetic remember`: accepts one record as a JSON object, or a
|
|
7
|
+
batch as NDJSON on stdin for bulk ingest. Upsert is idempotent by id (and
|
|
8
|
+
dedups by content hash) — re-remembering updates in place, never duplicates.
|
|
9
|
+
Stamps a `created` date on every record at ingest time. Accepts `supersedes`
|
|
10
|
+
(id of the record this one replaces, for within-scope shadowing via `sweep`)
|
|
11
|
+
and `links` (list of related-memory ids). The store lives at
|
|
12
|
+
~/.eidetic/memory (a home-dir path outside any git worktree), and the wrapper
|
|
13
|
+
defaults records to this agent's PERSONAL, PRIVATE scope (`--scope coherence-cli
|
|
14
|
+
--visibility private`, suffix read from culture.yaml) so they don't leak to a
|
|
15
|
+
default/other-scope recall — Claude and the colleague backend still share them
|
|
16
|
+
because both resolve the same suffix via this skill. Pass `--visibility public`
|
|
17
|
+
to contribute to the shared public pool instead. Use when the user says
|
|
18
|
+
"remember this", "store this", "save to memory", "index these", "eidetic
|
|
19
|
+
remember", or when something learned this session should outlive it. Pairs with
|
|
20
|
+
the sibling /recall skill.
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
# remember — write to the shared eidetic memory
|
|
24
|
+
|
|
25
|
+
`remember` drives **`eidetic remember`**, the write half of the memory surface
|
|
26
|
+
(the read half is the sibling **/recall** skill). Records you store here are
|
|
27
|
+
recallable later by *any* agent on this machine — Claude or the colleague
|
|
28
|
+
backend — because the default store is one shared `~/.eidetic/memory` path.
|
|
29
|
+
|
|
30
|
+
## How to run
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
# One record (JSON object as the argument):
|
|
34
|
+
bash .claude/skills/remember/scripts/remember.sh \
|
|
35
|
+
'{"id":"d1","text":"Orin Nano draws 7-15W","type":"docs","metadata":{"source":"docs","permalink":"https://..."}}' --json
|
|
36
|
+
|
|
37
|
+
# Batch (NDJSON on stdin, one record per line) — for bulk re-index:
|
|
38
|
+
cat records.ndjson | bash .claude/skills/remember/scripts/remember.sh --json
|
|
39
|
+
|
|
40
|
+
# Record that supersedes an older one (same scope required for sweep to shadow):
|
|
41
|
+
bash .claude/skills/remember/scripts/remember.sh \
|
|
42
|
+
'{"id":"r2","text":"Updated Orin Nano draw: 10-20W","type":"note","supersedes":"r1","links":["r3"]}' --json
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
The wrapper resolves the CLI portably (installed `eidetic` on `PATH`, else
|
|
46
|
+
`uv run eidetic` from the checkout) and forwards every flag verbatim.
|
|
47
|
+
|
|
48
|
+
## Record shape
|
|
49
|
+
|
|
50
|
+
| Field | Required? | Notes |
|
|
51
|
+
|-------|-----------|-------|
|
|
52
|
+
| `id` | yes | stable identity; the upsert key |
|
|
53
|
+
| `text` | yes | the chunk being remembered |
|
|
54
|
+
| `type` | yes | e.g. `note`, `docs`, `discord`, a research object type |
|
|
55
|
+
| `hash` | optional | content hash for dedup; derived from `text` when omitted |
|
|
56
|
+
| `metadata` | recommended | provenance + facets; **round-trips verbatim** on recall |
|
|
57
|
+
| `created` | auto-stamped | ISO-8601 UTC date; stamped at ingest if absent; drives freshness signal age-decay |
|
|
58
|
+
| `supersedes` | optional | id of an earlier same-scope record this one replaces; `sweep` auto-shadows the target |
|
|
59
|
+
| `links` | optional | list of related-memory ids; persisted for future corroboration scoring |
|
|
60
|
+
|
|
61
|
+
`score` and `signal` are recall-only and are ignored on ingest. **Mind the
|
|
62
|
+
scope:** the default personal scope is **private** (`--scope coherence-cli
|
|
63
|
+
--visibility private`), so personal/role-gated notes stay isolated to this
|
|
64
|
+
agent's recall and are safe to store. Only when you deliberately write to a
|
|
65
|
+
**public** scope (`--visibility public`) does the record enter the shared pool
|
|
66
|
+
visible to every scope — keep public-scope records to public data only.
|
|
67
|
+
|
|
68
|
+
## Idempotency
|
|
69
|
+
|
|
70
|
+
Re-submitting a record with the same `id` overwrites the previous value; a record
|
|
71
|
+
with a matching content `hash` is de-duplicated. So re-running an ingest (e.g. a
|
|
72
|
+
periodic re-scan) is safe and will not create duplicates.
|
|
73
|
+
|
|
74
|
+
## Lifecycle — supersedes and sweep
|
|
75
|
+
|
|
76
|
+
Setting `supersedes` on a record declares that this record replaces an earlier one
|
|
77
|
+
**within the same scope**. The actual lifecycle transition (marking the older record
|
|
78
|
+
as `shadowed`) is applied by `eidetic sweep`, not by `remember` itself. Cross-scope
|
|
79
|
+
`supersedes` links are recorded but never auto-shadow (preserving the
|
|
80
|
+
public/private no-leak invariant).
|
|
81
|
+
|
|
82
|
+
To apply pending transitions after ingesting superseding records:
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
eidetic sweep --dry-run # preview what would change
|
|
86
|
+
eidetic sweep # apply transitions
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
## Flags (forwarded to `eidetic remember`)
|
|
90
|
+
|
|
91
|
+
- `--json` — structured result (`{"upserted": N, "ids": [...]}`) to stdout.
|
|
92
|
+
- `--scope NAME` / `--visibility public|private` — record scope. **The wrapper
|
|
93
|
+
defaults this to the agent's PERSONAL, PRIVATE scope** — `--scope <suffix>
|
|
94
|
+
--visibility private`, where `<suffix>` is read from the nearest `culture.yaml`
|
|
95
|
+
(here, `coherence-cli`). Private records are served only to a recall in the same
|
|
96
|
+
scope, so they don't leak to a `default`/other-scope query. Pass `--scope` to
|
|
97
|
+
steer to a different scope (which then uses the plain CLI default visibility),
|
|
98
|
+
or `--visibility public` to keep the personal scope but make it shared. A wheel
|
|
99
|
+
install with no `culture.yaml` falls back to the CLI default `default`/`public`.
|
|
100
|
+
- `--backend files|mongo|neo4j` — default `files` (the shared home-dir store);
|
|
101
|
+
use `mongo`/`neo4j` (with `EIDETIC_MONGO_URI` / `NEO4J_URI`) for a server store.
|
|
102
|
+
|
|
103
|
+
## Notes
|
|
104
|
+
|
|
105
|
+
- The embed endpoint defaults to the local model-gear embed gear
|
|
106
|
+
(`http://localhost:8002/v1`); override with `EIDETIC_EMBED_URL` /
|
|
107
|
+
`EIDETIC_EMBED_MODEL`. Ingest still works offline (embeddings are recomputed at
|
|
108
|
+
recall time).
|
|
109
|
+
- **Use the wrapper, not a bare `eidetic`.** The console script may not be on
|
|
110
|
+
`PATH` (in a dev checkout it isn't); the wrapper resolves it (`PATH` first, else
|
|
111
|
+
`uv run eidetic`). For the docs, run `eidetic explain remember` if installed,
|
|
112
|
+
otherwise `uv run --project <eidetic-cli checkout> eidetic explain remember`.
|
|
113
|
+
|
|
114
|
+
## Provenance
|
|
115
|
+
|
|
116
|
+
First-party to **eidetic-cli** — eidetic owns its memory surface. Cite, don't
|
|
117
|
+
import: downstream repos copy this skill, they don't symlink it. See
|
|
118
|
+
[`docs/skill-sources.md`](../../../docs/skill-sources.md).
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# remember.sh — ingest records into the shared eidetic memory store (the /remember skill).
|
|
3
|
+
#
|
|
4
|
+
# Thin, portable wrapper around `eidetic remember`. It resolves the CLI, points
|
|
5
|
+
# the embedding endpoint at the local model-gear embed gear (overridable), and
|
|
6
|
+
# forwards every argument verbatim. Accepts ONE record as a JSON object argument,
|
|
7
|
+
# or a BATCH as NDJSON on stdin (one JSON object per line) for bulk ingest.
|
|
8
|
+
#
|
|
9
|
+
# remember.sh '{"id":"d1","text":"...","type":"docs","metadata":{...}}' --json
|
|
10
|
+
# cat records.ndjson | remember.sh --json
|
|
11
|
+
#
|
|
12
|
+
# Upsert is idempotent by id (and dedups by content hash): re-remembering the
|
|
13
|
+
# same record updates it in place, never duplicates.
|
|
14
|
+
#
|
|
15
|
+
# The store is the files backend at ~/.eidetic/memory by default — a home-dir
|
|
16
|
+
# path OUTSIDE any git worktree, so a record Claude remembers is recallable by
|
|
17
|
+
# the colleague backend (which runs in throwaway worktrees), and vice versa.
|
|
18
|
+
# Set EIDETIC_DATA_DIR to opt out of sharing; use --backend mongo|neo4j (with
|
|
19
|
+
# EIDETIC_MONGO_URI / NEO4J_URI) for a server-backed shared store.
|
|
20
|
+
|
|
21
|
+
set -euo pipefail
|
|
22
|
+
|
|
23
|
+
# ── resolve the eidetic CLI (installed tool first, then dev checkout) ────────
|
|
24
|
+
EIDETIC=()
|
|
25
|
+
resolve_eidetic() {
|
|
26
|
+
if command -v eidetic >/dev/null 2>&1; then
|
|
27
|
+
EIDETIC=(eidetic)
|
|
28
|
+
return 0
|
|
29
|
+
fi
|
|
30
|
+
local dir
|
|
31
|
+
dir=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
|
|
32
|
+
while [ -n "$dir" ] && [ "$dir" != "/" ]; do
|
|
33
|
+
if [ -f "$dir/pyproject.toml" ] \
|
|
34
|
+
&& grep -q '^name = "eidetic-cli"' "$dir/pyproject.toml" 2>/dev/null; then
|
|
35
|
+
if command -v uv >/dev/null 2>&1; then
|
|
36
|
+
EIDETIC=(uv run --project "$dir" eidetic)
|
|
37
|
+
return 0
|
|
38
|
+
fi
|
|
39
|
+
break
|
|
40
|
+
fi
|
|
41
|
+
dir=$(dirname "$dir")
|
|
42
|
+
done
|
|
43
|
+
cat >&2 <<'EOF'
|
|
44
|
+
error: eidetic CLI not found.
|
|
45
|
+
hint: install it with `uv tool install eidetic-cli` (or `pipx install eidetic-cli`),
|
|
46
|
+
or run from inside the eidetic-cli checkout with `uv` available.
|
|
47
|
+
The console script is `eidetic` (dist name: eidetic-cli).
|
|
48
|
+
EOF
|
|
49
|
+
return 1
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
usage() {
|
|
53
|
+
cat <<'EOF'
|
|
54
|
+
remember.sh — ingest records into the shared eidetic memory store (the /remember skill).
|
|
55
|
+
|
|
56
|
+
Usage:
|
|
57
|
+
remember.sh '<json-object>' [--json] [--backend files|mongo|neo4j] \
|
|
58
|
+
[--scope NAME] [--visibility public|private]
|
|
59
|
+
cat records.ndjson | remember.sh [--json] ...
|
|
60
|
+
|
|
61
|
+
A record needs `id`, `text`, and `type`; `hash` and `metadata` are recommended
|
|
62
|
+
(hash is derived from text when omitted). Upsert is idempotent by id.
|
|
63
|
+
Public data only. Every flag is forwarded verbatim to `eidetic remember`.
|
|
64
|
+
See `eidetic explain remember`.
|
|
65
|
+
EOF
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
case "${1:-}" in
|
|
69
|
+
-h | --help | help)
|
|
70
|
+
usage
|
|
71
|
+
exit 0
|
|
72
|
+
;;
|
|
73
|
+
esac
|
|
74
|
+
|
|
75
|
+
resolve_eidetic || exit 2
|
|
76
|
+
|
|
77
|
+
# ── default to this agent's PERSONAL, PRIVATE scope (culture.yaml `suffix`) ──
|
|
78
|
+
# A record this agent remembers should land in its OWN personal scope, not the
|
|
79
|
+
# global `default` scope shared by every project on this host. We read the
|
|
80
|
+
# `suffix` from the nearest culture.yaml (walking up from this script), so the
|
|
81
|
+
# scope follows the repo identity rather than being hard-coded — a downstream
|
|
82
|
+
# cite-don't-import copy adapts to its own suffix, and the colleague backend
|
|
83
|
+
# (running in a worktree of this same repo) resolves the same suffix, keeping
|
|
84
|
+
# the Claude↔colleague shared-memory story intact.
|
|
85
|
+
#
|
|
86
|
+
# The personal scope is PRIVATE by default: in eidetic's model only a private
|
|
87
|
+
# record is isolated to its scope (`can_serve`), so private is what actually
|
|
88
|
+
# keeps these records from leaking to a default/other-scope recall. Scope and
|
|
89
|
+
# visibility are paired — the private default applies only when we inject the
|
|
90
|
+
# resolved scope, and only if the caller didn't pass --visibility (so an
|
|
91
|
+
# explicit `--visibility public` still wins). An explicit --scope on the command
|
|
92
|
+
# line takes over steering entirely; a wheel install with no culture.yaml falls
|
|
93
|
+
# back to the plain CLI default (`default`/`public`).
|
|
94
|
+
resolve_scope() {
|
|
95
|
+
local dir suffix=""
|
|
96
|
+
dir=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
|
|
97
|
+
while [ -n "$dir" ] && [ "$dir" != "/" ]; do
|
|
98
|
+
if [ -f "$dir/culture.yaml" ]; then
|
|
99
|
+
# Capture only the first non-space token after `suffix:` (so an
|
|
100
|
+
# inline `# comment` or trailing space can't bleed into the scope),
|
|
101
|
+
# then strip surrounding quotes only — matching the canonical parser
|
|
102
|
+
# in .claude/skills/cicd/scripts/_resolve-nick.sh.
|
|
103
|
+
suffix=$(sed -n \
|
|
104
|
+
's/^[[:space:]]*-\{0,1\}[[:space:]]*suffix:[[:space:]]*\([^[:space:]]*\).*/\1/p' \
|
|
105
|
+
"$dir/culture.yaml" | head -n1 | tr -d "\"'")
|
|
106
|
+
break
|
|
107
|
+
fi
|
|
108
|
+
dir=$(dirname "$dir")
|
|
109
|
+
done
|
|
110
|
+
printf '%s' "$suffix"
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
has_flag() {
|
|
114
|
+
local needle=$1
|
|
115
|
+
shift
|
|
116
|
+
local a
|
|
117
|
+
for a in "$@"; do
|
|
118
|
+
case "$a" in
|
|
119
|
+
"$needle" | "$needle"=*) return 0 ;;
|
|
120
|
+
esac
|
|
121
|
+
done
|
|
122
|
+
return 1
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
SCOPE_ARGS=()
|
|
126
|
+
if ! has_flag --scope "$@"; then
|
|
127
|
+
EIDETIC_SCOPE=$(resolve_scope)
|
|
128
|
+
if [ -n "$EIDETIC_SCOPE" ]; then
|
|
129
|
+
SCOPE_ARGS+=(--scope "$EIDETIC_SCOPE")
|
|
130
|
+
has_flag --visibility "$@" || SCOPE_ARGS+=(--visibility private)
|
|
131
|
+
fi
|
|
132
|
+
fi
|
|
133
|
+
|
|
134
|
+
: "${EIDETIC_EMBED_URL:=http://localhost:8002/v1}"
|
|
135
|
+
: "${EIDETIC_EMBED_MODEL:=Qwen/Qwen3-Embedding-0.6B}"
|
|
136
|
+
export EIDETIC_EMBED_URL EIDETIC_EMBED_MODEL
|
|
137
|
+
|
|
138
|
+
exec "${EIDETIC[@]}" remember "${SCOPE_ARGS[@]}" "$@"
|
|
@@ -5,6 +5,32 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
Format follows [Keep a Changelog](https://keepachangelog.com/). This project
|
|
6
6
|
adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [0.3.0] - 2026-06-23
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- **Vendored the `remember` + `recall` memory skills from eidetic-cli**
|
|
13
|
+
(cite-don't-import) — the write/read halves of eidetic's shared
|
|
14
|
+
`~/.eidetic/memory` surface, so this agent (Claude and its colleague backend)
|
|
15
|
+
can persist facts across sessions and recall them later, sharing one store.
|
|
16
|
+
`remember` drives `eidetic remember` (idempotent upsert of one JSON record or
|
|
17
|
+
an NDJSON batch on stdin, dedup by id + content hash); `recall` drives
|
|
18
|
+
`eidetic recall` with four search modes — exact / approximate / keyword /
|
|
19
|
+
hybrid — each hit carrying text, full provenance metadata, a relevance score,
|
|
20
|
+
and a freshness signal. The `.sh` wrappers are byte-verbatim from eidetic-cli
|
|
21
|
+
(their first-party origin); each `SKILL.md` is localized only in the
|
|
22
|
+
illustrative `--scope <nick>` examples (Provenance keeps "First-party to
|
|
23
|
+
eidetic-cli"). Both default to this agent's PRIVATE scope, reading the suffix
|
|
24
|
+
from `culture.yaml`. Runtime dep: the `eidetic` CLI on PATH (else a local
|
|
25
|
+
eidetic-cli checkout with `uv`). Propagated by rollout-cli's `eidetic-memory`
|
|
26
|
+
recipe.
|
|
27
|
+
|
|
28
|
+
## [0.2.1] - 2026-06-06
|
|
29
|
+
|
|
30
|
+
### Changed
|
|
31
|
+
|
|
32
|
+
- Relicensed from MIT to Apache 2.0.
|
|
33
|
+
|
|
8
34
|
## [0.2.0] - 2026-06-06
|
|
9
35
|
|
|
10
36
|
### Added
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
Apache License
|
|
2
|
+
Version 2.0, January 2004
|
|
3
|
+
http://www.apache.org/licenses/
|
|
4
|
+
|
|
5
|
+
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
|
6
|
+
|
|
7
|
+
1. Definitions.
|
|
8
|
+
|
|
9
|
+
"License" shall mean the terms and conditions for use, reproduction,
|
|
10
|
+
and distribution as defined by Sections 1 through 9 of this document.
|
|
11
|
+
|
|
12
|
+
"Licensor" shall mean the copyright owner or entity authorized by
|
|
13
|
+
the copyright owner that is granting the License.
|
|
14
|
+
|
|
15
|
+
"Legal Entity" shall mean the union of the acting entity and all
|
|
16
|
+
other entities that control, are controlled by, or are under common
|
|
17
|
+
control with that entity. For the purposes of this definition,
|
|
18
|
+
"control" means (i) the power, direct or indirect, to cause the
|
|
19
|
+
direction or management of such entity, whether by contract or
|
|
20
|
+
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
|
21
|
+
outstanding shares, or (iii) beneficial ownership of such entity.
|
|
22
|
+
|
|
23
|
+
"You" (or "Your") shall mean an individual or Legal Entity
|
|
24
|
+
exercising permissions granted by this License.
|
|
25
|
+
|
|
26
|
+
"Source" form shall mean the preferred form for making modifications,
|
|
27
|
+
including but not limited to software source code, documentation
|
|
28
|
+
source, and configuration files.
|
|
29
|
+
|
|
30
|
+
"Object" form shall mean any form resulting from mechanical
|
|
31
|
+
transformation or translation of a Source form, including but
|
|
32
|
+
not limited to compiled object code, generated documentation,
|
|
33
|
+
and conversions to other media types.
|
|
34
|
+
|
|
35
|
+
"Work" shall mean the work of authorship, whether in Source or
|
|
36
|
+
Object form, made available under the License, as indicated by a
|
|
37
|
+
copyright notice that is included in or attached to the work
|
|
38
|
+
(an example is provided in the Appendix below).
|
|
39
|
+
|
|
40
|
+
"Derivative Works" shall mean any work, whether in Source or Object
|
|
41
|
+
form, that is based on (or derived from) the Work and for which the
|
|
42
|
+
editorial revisions, annotations, elaborations, or other modifications
|
|
43
|
+
represent, as a whole, an original work of authorship. For the purposes
|
|
44
|
+
of this License, Derivative Works shall not include works that remain
|
|
45
|
+
separable from, or merely link (or bind by name) to the interfaces of,
|
|
46
|
+
the Work and Derivative Works thereof.
|
|
47
|
+
|
|
48
|
+
"Contribution" shall mean any work of authorship, including
|
|
49
|
+
the original version of the Work and any modifications or additions
|
|
50
|
+
to that Work or Derivative Works thereof, that is intentionally
|
|
51
|
+
submitted to Licensor for inclusion in the Work by the copyright owner
|
|
52
|
+
or by an individual or Legal Entity authorized to submit on behalf of
|
|
53
|
+
the copyright owner. For the purposes of this definition, "submitted"
|
|
54
|
+
means any form of electronic, verbal, or written communication sent
|
|
55
|
+
to the Licensor or its representatives, including but not limited to
|
|
56
|
+
communication on electronic mailing lists, source code control systems,
|
|
57
|
+
and issue tracking systems that are managed by, or on behalf of, the
|
|
58
|
+
Licensor for the purpose of discussing and improving the Work, but
|
|
59
|
+
excluding communication that is conspicuously marked or otherwise
|
|
60
|
+
designated in writing by the copyright owner as "Not a Contribution."
|
|
61
|
+
|
|
62
|
+
"Contributor" shall mean Licensor and any individual or Legal Entity
|
|
63
|
+
on behalf of whom a Contribution has been received by Licensor and
|
|
64
|
+
subsequently incorporated within the Work.
|
|
65
|
+
|
|
66
|
+
2. Grant of Copyright License. Subject to the terms and conditions of
|
|
67
|
+
this License, each Contributor hereby grants to You a perpetual,
|
|
68
|
+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
69
|
+
copyright license to reproduce, prepare Derivative Works of,
|
|
70
|
+
publicly display, publicly perform, sublicense, and distribute the
|
|
71
|
+
Work and such Derivative Works in Source or Object form.
|
|
72
|
+
|
|
73
|
+
3. Grant of Patent License. Subject to the terms and conditions of
|
|
74
|
+
this License, each Contributor hereby grants to You a perpetual,
|
|
75
|
+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
76
|
+
(except as stated in this section) patent license to make, have made,
|
|
77
|
+
use, offer to sell, sell, import, and otherwise transfer the Work,
|
|
78
|
+
where such license applies only to those patent claims licensable
|
|
79
|
+
by such Contributor that are necessarily infringed by their
|
|
80
|
+
Contribution(s) alone or by combination of their Contribution(s)
|
|
81
|
+
with the Work to which such Contribution(s) was submitted. If You
|
|
82
|
+
institute patent litigation against any entity (including a
|
|
83
|
+
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
|
84
|
+
or a Contribution incorporated within the Work constitutes direct
|
|
85
|
+
or contributory patent infringement, then any patent licenses
|
|
86
|
+
granted to You under this License for that Work shall terminate
|
|
87
|
+
as of the date such litigation is filed.
|
|
88
|
+
|
|
89
|
+
4. Redistribution. You may reproduce and distribute copies of the
|
|
90
|
+
Work or Derivative Works thereof in any medium, with or without
|
|
91
|
+
modifications, and in Source or Object form, provided that You
|
|
92
|
+
meet the following conditions:
|
|
93
|
+
|
|
94
|
+
(a) You must give any other recipients of the Work or
|
|
95
|
+
Derivative Works a copy of this License; and
|
|
96
|
+
|
|
97
|
+
(b) You must cause any modified files to carry prominent notices
|
|
98
|
+
stating that You changed the files; and
|
|
99
|
+
|
|
100
|
+
(c) You must retain, in the Source form of any Derivative Works
|
|
101
|
+
that You distribute, all copyright, patent, trademark, and
|
|
102
|
+
attribution notices from the Source form of the Work,
|
|
103
|
+
excluding those notices that do not pertain to any part of
|
|
104
|
+
the Derivative Works; and
|
|
105
|
+
|
|
106
|
+
(d) If the Work includes a "NOTICE" text file as part of its
|
|
107
|
+
distribution, then any Derivative Works that You distribute must
|
|
108
|
+
include a readable copy of the attribution notices contained
|
|
109
|
+
within such NOTICE file, excluding those notices that do not
|
|
110
|
+
pertain to any part of the Derivative Works, in at least one
|
|
111
|
+
of the following places: within a NOTICE text file distributed
|
|
112
|
+
as part of the Derivative Works; within the Source form or
|
|
113
|
+
documentation, if provided along with the Derivative Works; or,
|
|
114
|
+
within a display generated by the Derivative Works, if and
|
|
115
|
+
wherever such third-party notices normally appear. The contents
|
|
116
|
+
of the NOTICE file are for informational purposes only and
|
|
117
|
+
do not modify the License. You may add Your own attribution
|
|
118
|
+
notices within Derivative Works that You distribute, alongside
|
|
119
|
+
or as an addendum to the NOTICE text from the Work, provided
|
|
120
|
+
that such additional attribution notices cannot be construed
|
|
121
|
+
as modifying the License.
|
|
122
|
+
|
|
123
|
+
You may add Your own copyright statement to Your modifications and
|
|
124
|
+
may provide additional or different license terms and conditions
|
|
125
|
+
for use, reproduction, or distribution of Your modifications, or
|
|
126
|
+
for any such Derivative Works as a whole, provided Your use,
|
|
127
|
+
reproduction, and distribution of the Work otherwise complies with
|
|
128
|
+
the conditions stated in this License.
|
|
129
|
+
|
|
130
|
+
5. Submission of Contributions. Unless You explicitly state otherwise,
|
|
131
|
+
any Contribution intentionally submitted for inclusion in the Work
|
|
132
|
+
by You to the Licensor shall be under the terms and conditions of
|
|
133
|
+
this License, without any additional terms or conditions.
|
|
134
|
+
Notwithstanding the above, nothing herein shall supersede or modify
|
|
135
|
+
the terms of any separate license agreement you may have executed
|
|
136
|
+
with Licensor regarding such Contributions.
|
|
137
|
+
|
|
138
|
+
6. Trademarks. This License does not grant permission to use the trade
|
|
139
|
+
names, trademarks, service marks, or product names of the Licensor,
|
|
140
|
+
except as required for reasonable and customary use in describing the
|
|
141
|
+
origin of the Work and reproducing the content of the NOTICE file.
|
|
142
|
+
|
|
143
|
+
7. Disclaimer of Warranty. Unless required by applicable law or
|
|
144
|
+
agreed to in writing, Licensor provides the Work (and each
|
|
145
|
+
Contributor provides its Contributions) on an "AS IS" BASIS,
|
|
146
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
147
|
+
implied, including, without limitation, any warranties or conditions
|
|
148
|
+
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
|
149
|
+
PARTICULAR PURPOSE. You are solely responsible for determining the
|
|
150
|
+
appropriateness of using or redistributing the Work and assume any
|
|
151
|
+
risks associated with Your exercise of permissions under this License.
|
|
152
|
+
|
|
153
|
+
8. Limitation of Liability. In no event and under no legal theory,
|
|
154
|
+
whether in tort (including negligence), contract, or otherwise,
|
|
155
|
+
unless required by applicable law (such as deliberate and grossly
|
|
156
|
+
negligent acts) or agreed to in writing, shall any Contributor be
|
|
157
|
+
liable to You for damages, including any direct, indirect, special,
|
|
158
|
+
incidental, or consequential damages of any character arising as a
|
|
159
|
+
result of this License or out of the use or inability to use the
|
|
160
|
+
Work (including but not limited to damages for loss of goodwill,
|
|
161
|
+
work stoppage, computer failure or malfunction, or any and all
|
|
162
|
+
other commercial damages or losses), even if such Contributor
|
|
163
|
+
has been advised of the possibility of such damages.
|
|
164
|
+
|
|
165
|
+
9. Accepting Warranty or Additional Liability. While redistributing
|
|
166
|
+
the Work or Derivative Works thereof, You may choose to offer,
|
|
167
|
+
and charge a fee for, acceptance of support, warranty, indemnity,
|
|
168
|
+
or other liability obligations and/or rights consistent with this
|
|
169
|
+
License. However, in accepting such obligations, You may act only
|
|
170
|
+
on Your own behalf and on Your sole responsibility, not on behalf
|
|
171
|
+
of any other Contributor, and only if You agree to indemnify,
|
|
172
|
+
defend, and hold each Contributor harmless for any liability
|
|
173
|
+
incurred by, or claims asserted against, such Contributor by reason
|
|
174
|
+
of your accepting any such warranty or additional liability.
|
|
175
|
+
|
|
176
|
+
END OF TERMS AND CONDITIONS
|
|
177
|
+
|
|
178
|
+
APPENDIX: How to apply the Apache License to your work.
|
|
179
|
+
|
|
180
|
+
To apply the Apache License to your work, attach the following
|
|
181
|
+
boilerplate notice, with the fields enclosed by brackets "[]"
|
|
182
|
+
replaced with your own identifying information. (Don't include
|
|
183
|
+
the brackets!) The text should be enclosed in the appropriate
|
|
184
|
+
comment syntax for the file format. We also recommend that a
|
|
185
|
+
file or class name and description of purpose be included on the
|
|
186
|
+
same "printed page" as the copyright notice for easier
|
|
187
|
+
identification within third-party archives.
|
|
188
|
+
|
|
189
|
+
Copyright 2026 Ori Nachum
|
|
190
|
+
|
|
191
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
192
|
+
you may not use this file except in compliance with the License.
|
|
193
|
+
You may obtain a copy of the License at
|
|
194
|
+
|
|
195
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
196
|
+
|
|
197
|
+
Unless required by applicable law or agreed to in writing, software
|
|
198
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
199
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
200
|
+
See the License for the specific language governing permissions and
|
|
201
|
+
limitations under the License.
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: coherence-cli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.3.0
|
|
4
4
|
Summary: Maintains information quality for agentic workflows — assesses the freshness, provenance, fidelity, and task-specific validity of claims, then refreshes or repairs degraded ones before agents consume them.
|
|
5
5
|
Project-URL: Homepage, https://github.com/agentculture/coherence-cli
|
|
6
6
|
Project-URL: Issues, https://github.com/agentculture/coherence-cli/issues
|
|
7
|
-
Author:
|
|
8
|
-
License-Expression:
|
|
7
|
+
Author: Ori Nachum
|
|
8
|
+
License-Expression: Apache-2.0
|
|
9
9
|
License-File: LICENSE
|
|
10
10
|
Classifier: Development Status :: 3 - Alpha
|
|
11
11
|
Classifier: Intended Audience :: Developers
|
|
12
|
-
Classifier: License :: OSI Approved ::
|
|
12
|
+
Classifier: License :: OSI Approved :: Apache Software License
|
|
13
13
|
Classifier: Programming Language :: Python :: 3.12
|
|
14
14
|
Classifier: Topic :: Software Development
|
|
15
15
|
Requires-Python: >=3.12
|
|
@@ -72,4 +72,4 @@ the `cicd` PR lane, deploy setup).
|
|
|
72
72
|
|
|
73
73
|
## License
|
|
74
74
|
|
|
75
|
-
|
|
75
|
+
Apache 2.0 — see [`LICENSE`](LICENSE).
|
|
@@ -119,6 +119,7 @@ itself (distinct from the global `overview`, which describes the agent).
|
|
|
119
119
|
ENTRIES: dict[tuple[str, ...], str] = {
|
|
120
120
|
(): _ROOT,
|
|
121
121
|
("coherence-cli",): _ROOT,
|
|
122
|
+
("coherence",): _ROOT,
|
|
122
123
|
("whoami",): _WHOAMI,
|
|
123
124
|
("learn",): _LEARN,
|
|
124
125
|
("explain",): _EXPLAIN,
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "coherence-cli"
|
|
3
|
-
version = "0.
|
|
3
|
+
version = "0.3.0"
|
|
4
4
|
description = "Maintains information quality for agentic workflows — assesses the freshness, provenance, fidelity, and task-specific validity of claims, then refreshes or repairs degraded ones before agents consume them."
|
|
5
5
|
readme = "README.md"
|
|
6
|
-
license = "
|
|
6
|
+
license = "Apache-2.0"
|
|
7
7
|
requires-python = ">=3.12"
|
|
8
|
-
authors = [{name = "
|
|
8
|
+
authors = [{name = "Ori Nachum"}]
|
|
9
9
|
classifiers = [
|
|
10
10
|
"Development Status :: 3 - Alpha",
|
|
11
11
|
"Programming Language :: Python :: 3.12",
|
|
12
|
-
"License :: OSI Approved ::
|
|
12
|
+
"License :: OSI Approved :: Apache Software License",
|
|
13
13
|
"Topic :: Software Development",
|
|
14
14
|
"Intended Audience :: Developers",
|
|
15
15
|
]
|
|
@@ -61,6 +61,37 @@ wheels = [
|
|
|
61
61
|
{ url = "https://files.pythonhosted.org/packages/c7/0d/67e5b4109ea4a837e80daa87c2c696711955e40449a97e8926672534def2/click-8.4.1-py3-none-any.whl", hash = "sha256:482be17c6991b8c19c5429a1e995d9b0efdbb63172824c41f99965dc0ade8ec2", size = 116639, upload-time = "2026-05-22T04:08:35.26Z" },
|
|
62
62
|
]
|
|
63
63
|
|
|
64
|
+
[[package]]
|
|
65
|
+
name = "coherence-cli"
|
|
66
|
+
version = "0.3.0"
|
|
67
|
+
source = { editable = "." }
|
|
68
|
+
|
|
69
|
+
[package.dev-dependencies]
|
|
70
|
+
dev = [
|
|
71
|
+
{ name = "bandit" },
|
|
72
|
+
{ name = "black" },
|
|
73
|
+
{ name = "flake8" },
|
|
74
|
+
{ name = "isort" },
|
|
75
|
+
{ name = "pytest" },
|
|
76
|
+
{ name = "pytest-cov" },
|
|
77
|
+
{ name = "pytest-xdist" },
|
|
78
|
+
{ name = "teken" },
|
|
79
|
+
]
|
|
80
|
+
|
|
81
|
+
[package.metadata]
|
|
82
|
+
|
|
83
|
+
[package.metadata.requires-dev]
|
|
84
|
+
dev = [
|
|
85
|
+
{ name = "bandit", specifier = ">=1.7.5" },
|
|
86
|
+
{ name = "black", specifier = ">=23.7.0" },
|
|
87
|
+
{ name = "flake8", specifier = ">=6.1" },
|
|
88
|
+
{ name = "isort", specifier = ">=5.12.0" },
|
|
89
|
+
{ name = "pytest", specifier = ">=8.0" },
|
|
90
|
+
{ name = "pytest-cov", specifier = ">=4.1" },
|
|
91
|
+
{ name = "pytest-xdist", specifier = ">=3.0" },
|
|
92
|
+
{ name = "teken", specifier = ">=0.8" },
|
|
93
|
+
]
|
|
94
|
+
|
|
64
95
|
[[package]]
|
|
65
96
|
name = "colorama"
|
|
66
97
|
version = "0.4.6"
|
|
@@ -154,37 +185,6 @@ wheels = [
|
|
|
154
185
|
{ url = "https://files.pythonhosted.org/packages/61/e8/cb8e80d6f9f55b99588625062822bf946cf03ed06315df4bd8397f5632a1/coverage-7.14.0-py3-none-any.whl", hash = "sha256:8de5b61163aee3d05c8a2beab6f47913df7981dad1baf82c414d99158c286ab1", size = 211764, upload-time = "2026-05-10T18:02:29.538Z" },
|
|
155
186
|
]
|
|
156
187
|
|
|
157
|
-
[[package]]
|
|
158
|
-
name = "coherence-cli"
|
|
159
|
-
version = "0.2.0"
|
|
160
|
-
source = { editable = "." }
|
|
161
|
-
|
|
162
|
-
[package.dev-dependencies]
|
|
163
|
-
dev = [
|
|
164
|
-
{ name = "bandit" },
|
|
165
|
-
{ name = "black" },
|
|
166
|
-
{ name = "flake8" },
|
|
167
|
-
{ name = "isort" },
|
|
168
|
-
{ name = "pytest" },
|
|
169
|
-
{ name = "pytest-cov" },
|
|
170
|
-
{ name = "pytest-xdist" },
|
|
171
|
-
{ name = "teken" },
|
|
172
|
-
]
|
|
173
|
-
|
|
174
|
-
[package.metadata]
|
|
175
|
-
|
|
176
|
-
[package.metadata.requires-dev]
|
|
177
|
-
dev = [
|
|
178
|
-
{ name = "bandit", specifier = ">=1.7.5" },
|
|
179
|
-
{ name = "black", specifier = ">=23.7.0" },
|
|
180
|
-
{ name = "flake8", specifier = ">=6.1" },
|
|
181
|
-
{ name = "isort", specifier = ">=5.12.0" },
|
|
182
|
-
{ name = "pytest", specifier = ">=8.0" },
|
|
183
|
-
{ name = "pytest-cov", specifier = ">=4.1" },
|
|
184
|
-
{ name = "pytest-xdist", specifier = ">=3.0" },
|
|
185
|
-
{ name = "teken", specifier = ">=0.8" },
|
|
186
|
-
]
|
|
187
|
-
|
|
188
188
|
[[package]]
|
|
189
189
|
name = "execnet"
|
|
190
190
|
version = "2.1.2"
|
coherence_cli-0.2.0/LICENSE
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
MIT License
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2026 AgentCulture
|
|
4
|
-
|
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
-
in the Software without restriction, including without limitation the rights
|
|
8
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
-
furnished to do so, subject to the following conditions:
|
|
11
|
-
|
|
12
|
-
The above copyright notice and this permission notice shall be included in all
|
|
13
|
-
copies or substantial portions of the Software.
|
|
14
|
-
|
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
-
SOFTWARE.
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{coherence_cli-0.2.0 → coherence_cli-0.3.0}/.claude/skills/ask-colleague/scripts/ask-colleague.sh
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{coherence_cli-0.2.0 → coherence_cli-0.3.0}/.claude/skills/communicate/scripts/fetch-issues.sh
RENAMED
|
File without changes
|
{coherence_cli-0.2.0 → coherence_cli-0.3.0}/.claude/skills/communicate/scripts/mesh-message.sh
RENAMED
|
File without changes
|
{coherence_cli-0.2.0 → coherence_cli-0.3.0}/.claude/skills/communicate/scripts/post-comment.sh
RENAMED
|
File without changes
|
{coherence_cli-0.2.0 → coherence_cli-0.3.0}/.claude/skills/communicate/scripts/post-issue.sh
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{coherence_cli-0.2.0 → coherence_cli-0.3.0}/.claude/skills/doc-test-alignment/scripts/check.sh
RENAMED
|
File without changes
|
|
File without changes
|
{coherence_cli-0.2.0 → coherence_cli-0.3.0}/.claude/skills/pypi-maintainer/scripts/switch-source.sh
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{coherence_cli-0.2.0 → coherence_cli-0.3.0}/.claude/skills/spec-to-plan/scripts/spec-to-plan.sh
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|