Repo Memory Shared Test Conventions
Purpose
This document captures shared assumptions used by multiple repo-memory
test-plan documents so command and workflow files can stay focused on behavior
instead of repeating setup boilerplate.
Recommended Fixture Shape
Use an isolated temp workspace per case:
- database path:
TMPDIR/repo-memory.db - repository path:
TMPDIR/repo - optional second repository path:
TMPDIR/repo-b - default ingest path:
TMPDIR/repo/docs/ai - optional evidence file:
TMPDIR/repo/path/to/file
Recommended bootstrap command:
repo-memory init --db TMPDIR/repo-memory.db
Recommended repo bootstrap for Git-aware cases:
git -C TMPDIR/repo init
git -C TMPDIR/repo config user.email test@example.com
git -C TMPDIR/repo config user.name Tester
git -C TMPDIR/repo add .
git -C TMPDIR/repo commit -m "init"
Flag Model
repo-memory uses one subcommand-specific flag set per command. There is no
root --json mode and no shared global flag parser.
Common flags across multiple commands:
--db: SQLite database path--repo: repository root or repo-path substring filter depending on command--limit: result limit on read commands
Case files should call out whether --repo is:
- a required absolute repo root for
addandingest - an optional substring filter for
searchandlist - an optional absolute repo root selector for
verify
Text Output Contract
Successful output is plain text written to stdout.
Shared assertion guidance:
- assert stable prefixes or phrases, not timestamp values
- prefer checking identifiers, kinds, keys, statuses, and count summaries
- when output contains absolute repo paths, compare against the concrete fixture path used by the case
Representative success phrases:
initialized TMPDIR/repo-memory.dbupserted entry 1 (term:AITask)ingested 1 docs from ABS_REPOlinked #1 -[related_to]-> #2ABS_REPO: verified 1 entries, 1 downgraded, 0 staleno resultsno entriesno repos
Exit Code Contract
The current CLI contract uses these exit codes:
| Exit Code | Meaning | Typical Trigger |
|---|---|---|
0 |
success | command completed normally, including empty-result text such as no results |
1 |
command failure | invalid flags, missing required values, missing repo docs, unresolved entry, or store/runtime error |
2 |
top-level usage failure | missing subcommand or unknown subcommand |
When a case expects failure, assert both the non-zero exit code and the human-readable stderr message.
Schema Bootstrap Rules
Current command behavior is intentionally uneven and should be documented:
initcreates schema explicitlyaddandingestcallInitinternally and can succeed on a fresh DB pathsearch,list,events,link,verify, andreposassume schema already exists
If a case relies on automatic schema bootstrap in add or ingest, state that explicitly in 前置条件 and 断言结论.
Repo Fixture Rules
Cases covering add, ingest, or verify should state:
- whether the target repo is a real Git repo
- whether a HEAD commit already exists
- which file path is being used as evidence or dependency
verify behavior depends on Git state:
- if a repo has a readable HEAD commit, verification updates repo metadata and evaluates dependencies
- if a repo is missing Git state or has no HEAD, the command prints
skipped (not a git repo or no HEAD)for that repo
Markdown Ingest Rules
ingest scans markdown recursively under docs/ai by default.
Shared assertions for ingest cases:
.mdfiles are discovered recursively- file base name influences imported key prefixes
- heading text influences imported
kindclassification and key slug - an empty
docs/aitree fails withno markdown files found under ...
Direct DB Inspection
Most cases should stay at the CLI contract level.
One exception is link: the CLI currently writes the relation but does not have
an inspection command for links. Link cases may use a read-only sqlite3 query
to confirm persistence after the CLI call.
Typical example:
sqlite3 TMPDIR/repo-memory.db "SELECT relation FROM knowledge_links WHERE from_entry_id = 1 AND to_entry_id = 2;"
Workflow Authoring Rule
If a case spans multiple commands, place the end-to-end narrative in
workflows/README.md first, then add narrower command-level cases only when
they are easier to reason about in isolation.