Thanks for your interest. This document covers what the project expects from a change, how to run the same gates CI runs, and where the deeper design records live.
Report a suspected vulnerability privately instead of opening an issue. See SECURITY.md.
Search existing issues first. For anything beyond a small fix, open an issue describing the observed behavior and the outcome you want before writing code; changes that alter public behavior are reviewed against recorded product contracts and are easier to land when the contract question is settled first.
State what you measured. A concrete report names the exact command, the exact
output, the provider and version involved, and the file and line you are talking
about. Never paste a real transcript into an issue: it is someone's session
content. tests/aise-demo/ holds synthetic fixtures with obviously fake session
identifiers and paths, and the Rust tests build corpora in temporary
directories.
The Rust workspace is canonical. rust/ai-session-search-core owns parsing,
indexing, querying, migration, and filesystem publication, and produces the
aise executable including aise mcp serve.
rust/ai-session-search-python is a typed PyO3 adapter, and the Python package
is the compatibility API over it. The CLI, MCP server, Rust library, and Python
API are adapters over the same typed requests and responses: they translate
syntax, not product semantics. A behavior change belongs in the shared service,
not in one surface.
Requires Rust 1.88 or newer, CPython 3.12 through 3.14 with the standard GIL, and uv.
git clone https://github.com/ahundt/ai-session-search
cd ai-session-search
uv sync --locked --all-extras
uv run maturin develop --uv # build the native extension into the venvFocused checks while iterating:
cargo test -p ai-session-search <test name>
uv run pytest tests/<file>.py -k <test name>
cargo clippy --workspace --all-targets --all-features --locked -- -D warnings
uv run ruff check . && uv run mypy ai_session_search tests./run_ci_local.shRun it exactly like that. It inherits whatever compiler wrapper Cargo is
configured to use, and prints which one it resolved before the first step. Do not
prefix AI_SESSION_SEARCH_RUSTC_WRAPPER= unless an inherited wrapper is broken
on your machine: that exports an empty RUSTC_WRAPPER and disables caching, which
on this workspace is the difference between minutes and tens of minutes.
AGENTS.md covers build caching and reclaiming target/ disk.
This is the locally reproducible subset of .github/workflows/ci.yml. It
creates isolated configuration, cache, and database state with every provider
disabled, so it never reads or writes your real session index. It quarantines
any native extension already in the source tree and restores it by checksum on
exit.
It checks both lockfiles, builds the current abi3 extension, then runs Ruff,
mypy, native/stub parity, the Python tests, Rust formatting, check, Clippy,
tests, and public-API doctests, the release executable and its MCP schema, the
exact wheel and source distribution install pathways, and workflow syntax when
actionlint is installed.
The hosted operating-system and Python matrices stay CI-owned: CI additionally
runs the Rust portability suite on macOS and Windows, the MSRV check, the Cargo
registry/path/Git install pathways, cargo deny check advisories licenses sources bans, and an offline zizmor workflow-security audit. CI also runs
actionlint at a pinned version, so a workflow syntax error blocks the merge
even when the local run skipped it.
- Reproduce first. Add the smallest failing test at the shared layer before implementing, then cover every adapter the change reaches: Rust, PyO3, Python, CLI, MCP, schemas, docs, examples, provider fixtures, and packaging.
- One implementation per contract. Look for duplicated meaning, not just duplicated text. Prefer improving an existing seam over adding a parallel one.
- Keep surfaces honest. Presentation windows and character budgets may shorten what is displayed; they must never change which results match, their order, their paging, or their next-page identity.
- No silent cutoffs. Do not add unannounced row, byte, or time limits. Intentional bounds are named parameters whose origin is reportable.
- Change docs with code. Source comments, CLI help, MCP schemas, Python
docstrings, type stubs, examples, and the guides under
docs/move together. - State bounds you rely on. For work that touches scale, latency, memory, concurrency, indexing, or output volume, record a comparable baseline and rerun it.
The complete, numbered contract catalogue with its verification map is docs/development/maintainer-requirements-and-design-decisions.md. Read the entries that touch your change before altering public behavior.
Use dashes for product slugs, repositories, package-manager names, skills, and MCP server identities. Use underscores only where a programming language or an environment variable requires them.
| Surface | Canonical name |
|---|---|
| Product name | AI Session Search |
| GitHub repository, PyPI distribution, crates.io package | ai-session-search |
| Python import and Rust crate path | ai_session_search |
| MCP server key and protocol name | ai-session-search |
| MCP protocol title | AI Session Search |
| Primary executable | aise |
| Descriptive executable aliases | aisearch, ai_session_search |
Reinstalling migrates the historical ai_session_search and aise MCP keys to
ai-session-search without leaving duplicate servers behind.
Write commit subjects that name the files or components and the behavior, for
example mcp_server.rs: return next_offset when evidence is truncated. Say what
changed, why, and how you verified it. Avoid vague verbs and internal shorthand;
someone reading the log a year from now should not need this conversation.
Open the pull request against main. All required CI checks must pass, and the
branch must be current with main before merge. Keep unrelated changes in
separate commits so a single concern can be reverted on its own.
| Topic | Document |
|---|---|
| Product capabilities and quick start | README.md |
| Install, verify, update, uninstall | docs/development/installation.md |
| Settings resolution across CLI, env, TOML, MCP | docs/development/configuration.md |
| Python and Rust library APIs | docs/development/library-api.md |
| Building and publishing artifacts | docs/development/releasing.md |
| Release operator checklist | RELEASING.md |
| Cumulative product contracts | docs/development/maintainer-requirements-and-design-decisions.md |
Contributions are accepted under the Apache License 2.0, matching the project license. Existing commit authorship is preserved in Git history; see docs/migration/provenance.md.