Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
91 commits
Select commit Hold shift + click to select a range
d12c96e
fix: filtered search fallback and diary_write content alias
lucian-the-traveler Apr 27, 2026
f51ecc1
docs(readme): move CAUTION/IMPORTANT alerts below header, soften tone
igorls May 24, 2026
5fe54df
perf(miner,palace): hoist COCA filter imports out of per-drawer hot p…
milla-jovovich May 24, 2026
653e977
feat(entity): known-systems lexicon keeps multi-word product names at…
milla-jovovich May 24, 2026
cbd1567
fix(entity): precompile known-systems regex once in cached loader
milla-jovovich May 24, 2026
be819da
Merge pull request #1608 from MemPalace/chore/readme-move-scam-alert-…
igorls May 24, 2026
c9d8a40
Merge pull request #1612 from MemPalace/chore/hoist-coca-filter-imports
igorls May 24, 2026
dbbf4c5
Merge develop into feat/known-systems-lexicon-compound-matcher
igorls May 24, 2026
d0d011e
Merge pull request #1613 from MemPalace/feat/known-systems-lexicon-co…
igorls May 24, 2026
753df20
Merge main back into develop after v3.3.6 release
igorls May 24, 2026
d88597c
fix(backends): repair missing _type in collection config (#1611)
mvalentsev May 25, 2026
c4d8804
fix(backends): close sqlite connection before PersistentClient
mvalentsev May 25, 2026
6957c7e
Merge pull request #1615 from MemPalace/chore/sync-3.3.6-back-to-develop
igorls May 27, 2026
15ac430
fix(embedding): add embed_query/embed_documents to EmbeddinggemmaONNX…
May 27, 2026
2d4fae1
fix(mcp): retry stale-index transient in tool_search
trek-e May 27, 2026
a0508cb
build(deps-dev): bump ruff from 0.15.14 to 0.15.15
dependabot[bot] May 29, 2026
13c38ac
fix(palace): file_already_mined iterates all groups when source_file …
milla-jovovich May 29, 2026
55d4e37
Merge pull request #1652 from MemPalace/fix/file-already-mined-multi-…
igorls May 29, 2026
387d50d
Merge pull request #1647 from MemPalace/dependabot/pip/ruff-0.15.15
igorls May 29, 2026
9b7cfc9
Merge pull request #1617 from mvalentsev/fix/1611-config-json-str-type
igorls May 30, 2026
48f4eb6
test(embedding): expect 3 hf_hub_download calls (model + .onnx_data w…
igorls May 30, 2026
818e4f3
fix(normalize): use utf-8-sig to handle BOM-prefixed transcript files
arnoldwender Apr 22, 2026
29db125
fix(closet_llm): replace non-ASCII symbols in progress output (#1034)
arnoldwender Apr 22, 2026
038a7e0
fix(convo_miner): preserve blank lines and indentation in AI responses
arnoldwender Apr 23, 2026
10d1ce6
fix(backends): lower HNSW bloat-guard thresholds to fix sub-50k persi…
mvalentsev May 25, 2026
b11f414
style(test): use _HNSW_MISSING_METADATA_DATA_FLOOR constant instead o…
mvalentsev May 25, 2026
7b1f624
fix(backends): detect sub-threshold segments by link_lists state, not…
mvalentsev May 27, 2026
c19d894
fix(backends): re-arm HNSW quarantine gate on mtime change and explic…
mvalentsev May 24, 2026
22804b8
fix(backends): guard mtime_appeared discard behind _freshness membership
mvalentsev May 24, 2026
206cfbb
fix(ids): delimit hash inputs to prevent drawer_id collisions (#80)
milla-jovovich May 30, 2026
6dd99ec
fix(backends): strip lone surrogates from documents at the ChromaDB c…
terrizoaguimor Jun 1, 2026
e548966
fix(backends): keep single-string documents whole in surrogate sanitiser
terrizoaguimor Jun 1, 2026
b5f3915
fix(config): strip leading/trailing separators in normalize_wing_name
M8SON Jun 2, 2026
0dd0ade
fix(mcp): defer WAL setup so import no longer recreates ~/.mempalace …
mvalentsev Jun 2, 2026
6aa8e93
feat: add pluggable vector backends
igorls Jun 3, 2026
30b82ba
fix: avoid qdrant lexical full scan on empty text hits
igorls Jun 3, 2026
4d3daf9
fix(hallways): paginate drawer fetch to avoid SQLite variable overflo…
milla-jovovich Jun 3, 2026
526d58a
Update tests/test_hallways_pagination.py
milla-jovovich Jun 3, 2026
af2bd0e
style(tests): format test_hallways_pagination.py with ruff (#1680)
milla-jovovich Jun 3, 2026
300e824
docs(hallways): correct col contract in compute_hallways_for_wing doc…
milla-jovovich Jun 3, 2026
02b8753
Merge pull request #1680 from MemPalace/fix/1619-hallway-pagination
milla-jovovich Jun 3, 2026
ce46747
fix(status): count drawers from sqlite instead of cold-loading the HN…
potterdigital Jun 3, 2026
5ba8399
Fix crash when tool_use input is a list instead of dict
robertcprice Jun 4, 2026
4e0fce0
fix(hooks): file stop-hook diary checkpoints under the harness agent …
mvalentsev Jun 5, 2026
717a57f
feat(docker): add container image for MCP server and CLI
sebaplaza Jun 5, 2026
8757ba2
fix(docker): address gemini review on MR #1696
plaza-s-mgdis Jun 5, 2026
ec5d1eb
feat: add pgvector backend + namespace-isolation conformance contract
igorls Jun 6, 2026
1dadd33
ci: add PyPI trusted-publishing workflow
igorls Jun 6, 2026
0225eb4
docs: bump version on develop, not directly on main
igorls Jun 6, 2026
eb3ff2e
ci(docker): fix latest/main publishing, add arm64 + GPU build check
igorls Jun 6, 2026
15852ed
Merge pull request #1696 from sebaplaza/feat/docker-image
igorls Jun 6, 2026
dc7d0be
docs: clarify publish.yml trigger comment
igorls Jun 6, 2026
4bc1ea8
fix: address Copilot second-pass review on the pluggable-backend PR
igorls Jun 6, 2026
f88951e
Merge remote-tracking branch 'origin/develop' into codex/pluggable-ve…
igorls Jun 6, 2026
37e34f6
docs: correct pgvector table_dimension comment after real-Postgres te…
igorls Jun 6, 2026
723e45b
Merge pull request #1679 from MemPalace/codex/pluggable-vector-backen…
igorls Jun 6, 2026
694289c
Merge pull request #1698 from MemPalace/ci/pypi-trusted-publishing
igorls Jun 6, 2026
5289bdf
Merge pull request #1631 from YuRiNjjot/fix-embeddinggemma-chromadb
igorls Jun 6, 2026
82af1ff
Merge pull request #1678 from mvalentsev/fix/1676-mcp-wal-import-side…
igorls Jun 6, 2026
6434370
Merge pull request #1666 from MemPalace/fix/80-drawer-id-collision-de…
igorls Jun 6, 2026
593cfeb
Merge pull request #1682 from potterdigital/fix/status-sqlite-count
igorls Jun 6, 2026
e00bc66
Merge pull request #1102 from arnoldwender/fix/normalize-utf8-bom
igorls Jun 6, 2026
04af6a4
Merge pull request #1100 from arnoldwender/fix/closet-llm-gbk-symbols
igorls Jun 6, 2026
cace223
Merge pull request #1618 from mvalentsev/fix/1579-hnsw-flush-at-mine-end
igorls Jun 6, 2026
e1fce46
Merge pull request #1602 from mvalentsev/fix/1573-quarantine-rearm-mtime
igorls Jun 6, 2026
b1df41b
Merge pull request #1137 from arnoldwender/fix/convo-miner-preserve-r…
igorls Jun 6, 2026
bbe6ff9
Merge pull request #1245 from lucian-the-traveler/fix/filtered-search…
igorls Jun 6, 2026
46e3b22
Merge pull request #1694 from mvalentsev/fix/1693-hook-diary-agent
igorls Jun 6, 2026
097687c
Merge pull request #1687 from robertcprice/fix/tool-use-input-list-guard
igorls Jun 6, 2026
1ed7f49
Merge pull request #1635 from trek-e/fix/mcp-search-stale-index-retry
igorls Jun 6, 2026
334fc6d
Merge pull request #1673 from terrizoaguimor/fix/sanitize-documents-c…
igorls Jun 6, 2026
ad9874f
fix(mcp): repair diary_write content alias + restore -32602 diagnostic
igorls Jun 6, 2026
b130301
fix(mcp): address bot review on #1700
igorls Jun 6, 2026
ab669fd
test(miner): compare default wing to normalized dirname, not raw name
igorls Jun 6, 2026
6ac2de8
Merge pull request #1700 from MemPalace/fix/1245-diary-write-and-lint
igorls Jun 6, 2026
e46374d
feat(migrate): mempalace migrate-wings — normalize legacy wing names
igorls Jun 6, 2026
8ec438e
docs(recovery): add wing-name migration guide for migrate-wings
igorls Jun 6, 2026
708ef4a
Merge pull request #1702 from MemPalace/feat/migrate-wing-normalize
igorls Jun 6, 2026
ed772a0
Merge remote-tracking branch 'origin/develop' into fix/wing-normalize…
igorls Jun 6, 2026
ab716d0
Merge pull request #1675 from M8SON/fix/wing-normalize-strip-sep
igorls Jun 6, 2026
e66cfff
chore(release): 3.4.0
igorls Jun 6, 2026
73d4e43
chore(release): bump README version badge to 3.4.0
igorls Jun 6, 2026
9694e2c
Merge pull request #1705 from MemPalace/chore/bump-3.4.0
igorls Jun 6, 2026
ce929a8
fix(backends): wrap bare-str OneOrMany inputs before embedding
igorls Jun 6, 2026
15833ab
ci(publish): add workflow_dispatch manual trigger
igorls Jun 6, 2026
d51e943
ci(publish): qualify checkout ref to refs/tags + tighten tag regex
igorls Jun 6, 2026
d464c28
Merge pull request #1708 from MemPalace/ci/publish-workflow-dispatch
igorls Jun 6, 2026
051f0cc
fix(backends): normalize all OneOrMany inputs in EmbeddingCollection
igorls Jun 6, 2026
72a69e2
Merge pull request #1707 from MemPalace/fix/embedding-wrapper-oneormany
igorls Jun 6, 2026
19d2f92
ci(publish): build + publish in one job to avoid cross-job artifact h…
igorls Jun 6, 2026
939a076
Merge pull request #1709 from MemPalace/ci/publish-single-job
igorls Jun 6, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
"name": "mempalace",
"source": "./.claude-plugin",
"description": "AI memory system — mine projects and conversations into a searchable palace. 19 MCP tools, auto-save hooks, guided setup.",
"version": "3.3.6",
"version": "3.4.0",
"author": {
"name": "milla-jovovich"
}
Expand Down
2 changes: 1 addition & 1 deletion .claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "mempalace",
"version": "3.3.6",
"version": "3.4.0",
"description": "Give your AI a memory — mine projects and conversations into a searchable palace. 19 MCP tools, auto-save hooks, and guided setup.",
"author": {
"name": "milla-jovovich"
Expand Down
2 changes: 1 addition & 1 deletion .codex-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "mempalace",
"version": "3.3.6",
"version": "3.4.0",
"description": "Give your AI a memory — mine projects and conversations into a searchable palace. 19 MCP tools, auto-save hooks, and guided setup.",
"author": {
"name": "milla-jovovich"
Expand Down
55 changes: 55 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
# Keep the build context lean — only what `uv sync` + the package need.

# VCS
.git/
.gitignore

# Python build artifacts / caches
*.egg-info/
dist/
build/
__pycache__/
*.pyc
.pytest_cache/
.mypy_cache/
.ruff_cache/
htmlcov/
.coverage
coverage.xml

# Virtual environments (rebuilt inside the image)
.venv/
venv/

# Local config / secrets
.env
.env.*
.envrc
mempal.yaml

# Editor / OS cruft
.idea/
.vscode/
*.swp
*.swo
*~
.DS_Store
Thumbs.db

# Repo material not needed at runtime
.devcontainer/
.github/
.agents/
.claude/
.codex/
.codex-plugin/
.claude-plugin/
benchmarks/
docs/
website/
landing/
assets/
examples/
tests/
*.md
!README.md
95 changes: 95 additions & 0 deletions .github/workflows/docker-publish.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
name: Docker

on:
push:
# `main` is the release branch: pushes here publish the released image and
# update `latest`; `v*` tags publish versioned images. develop does not
# publish — it is validated via the pull_request trigger below.
branches: [main]
tags: ["v*"]
pull_request:
branches: [main, develop]
workflow_dispatch:

env:
REGISTRY: ghcr.io
IMAGE_NAME: ${{ github.repository }}

jobs:
build:
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
steps:
- uses: actions/checkout@v6

# Needed for the emulated linux/arm64 build on real pushes.
- name: Set up QEMU
uses: docker/setup-qemu-action@v3

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3

# Only authenticate + push for in-repo events. Fork PRs lack the
# packages:write token, so they build (to validate the Dockerfile) but
# do not push.
- name: Log in to GHCR
if: github.event_name != 'pull_request'
uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Extract metadata
id: meta
uses: docker/metadata-action@v5
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
# latest -> main (the latest release); semver tags -> released versions.
tags: |
type=ref,event=branch
type=ref,event=pr
type=semver,pattern={{version}}
type=semver,pattern={{major}}.{{minor}}
type=raw,value=latest,enable=${{ github.ref == 'refs/heads/main' }}

- name: Build and push
uses: docker/build-push-action@v6
with:
context: .
file: ./Dockerfile
# Publish multi-arch (amd64 + arm64 for Apple Silicon / ARM hosts) on
# real pushes; keep PRs amd64-only so the emulated arm64 build does not
# slow the PR check.
platforms: ${{ github.event_name != 'pull_request' && 'linux/amd64,linux/arm64' || 'linux/amd64' }}
push: ${{ github.event_name != 'pull_request' }}
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
cache-from: type=gha
# Fork PRs get a read-only Actions cache, so writing it just emits 403
# noise — only export cache on in-repo events.
cache-to: ${{ github.event_name != 'pull_request' && 'type=gha,mode=max' || '' }}

# Build-only validation for the CUDA image so it cannot silently rot (CUDA base
# tag drift, cross-stage interpreter/venv copy paths, the `gpu` extra). The
# runner has no GPU, so this only proves the image *compiles*; it is never
# published (users build it themselves, per the README).
build-gpu:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3

- name: Build GPU image (validation only — not published)
uses: docker/build-push-action@v6
with:
context: .
file: ./Dockerfile.gpu
platforms: linux/amd64
push: false
cache-from: type=gha,scope=gpu
cache-to: ${{ github.event_name != 'pull_request' && 'type=gha,mode=max,scope=gpu' || '' }}
124 changes: 124 additions & 0 deletions .github/workflows/publish.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
name: Publish to PyPI

# Publishes mempalace to PyPI via Trusted Publishing (OIDC — no stored token).
#
# Triggers:
# * release: published — the normal path (drafting + publishing a GitHub
# Release fires this).
# * workflow_dispatch — a manual escape hatch. GitHub does not reliably emit
# a `release` event when a *draft* tied to a pre-existing tag is published,
# so this lets a maintainer run the publish for any existing tag from the
# Actions tab ("Run workflow" → enter the tag, e.g. v3.4.0).
#
# Build + publish run in ONE job on purpose: a two-job split hands the wheel
# between jobs via upload/download-artifact, which failed repeatedly with
# `BlobNotFound` on the same-run download. Building and publishing in the same
# job removes that handoff entirely. The job is gated by the `pypi` environment
# (manual approval), and the checks below keep it self-contained — it never
# uploads a tag that isn't on main or doesn't match the version manifest.
#
# One-time setup required before the first run (see docs/RELEASING.md):
# 1. PyPI → Manage project `mempalace` → Publishing → Add a trusted publisher:
# Owner: MemPalace Repository: mempalace
# Workflow: publish.yml Environment: pypi
# 2. GitHub → repo Settings → Environments → New environment `pypi`,
# add yourself as a Required reviewer (this is the manual approval gate).

on:
release:
types: [published]
workflow_dispatch:
inputs:
tag:
description: "Existing tag to build and publish (e.g. v3.4.0). Used when the release event didn't fire."
required: true
type: string

permissions:
contents: read

jobs:
publish:
name: Build + publish to PyPI
runs-on: ubuntu-latest
# The `pypi` environment gate (required reviewer) pauses the whole job until
# approved, and scopes the OIDC trust on the PyPI side.
environment:
name: pypi
url: https://pypi.org/p/mempalace
permissions:
contents: read # checkout
id-token: write # mint the short-lived OIDC token for Trusted Publishing
steps:
- name: Resolve the release tag
id: tag
env:
RELEASE_TAG: ${{ github.event.release.tag_name }}
INPUT_TAG: ${{ github.event.inputs.tag }}
run: |
set -euo pipefail
tag="${RELEASE_TAG:-${INPUT_TAG:-}}"
if [[ -z "$tag" ]]; then
echo "::error::no tag to publish — neither a release tag nor a workflow_dispatch input was provided"
exit 1
fi
# Validate the shape before it is ever used as a git ref (ref-injection
# guard): require vMAJOR.MINOR.PATCH with an optional -/+ suffix, so
# loose values like 'v3' or 'v3foo' are rejected.
re='^v[0-9]+\.[0-9]+\.[0-9]+([-+][0-9A-Za-z.-]+)?$'
if [[ ! "$tag" =~ $re ]]; then
echo "::error::tag '$tag' is not a valid release tag (expected vMAJOR.MINOR.PATCH[-suffix])"
exit 1
fi
echo "tag=$tag" >> "$GITHUB_OUTPUT"
echo "Resolved tag: $tag"

- uses: actions/checkout@v6
with:
# Fully-qualified refs/tags/ so an unqualified name can't resolve to a
# same-named *branch* instead of the tag (checkout prefers branches).
# steps.tag.outputs.tag is format-validated above (ref-injection guard).
ref: refs/tags/${{ steps.tag.outputs.tag }}
fetch-depth: 0 # full history for the ancestry check

- name: Verify the tag is on main
env:
TAG: ${{ steps.tag.outputs.tag }}
run: |
set -euo pipefail
git fetch --no-tags origin main
tag_sha=$(git rev-parse HEAD) # the checked-out tag commit
main_sha=$(git rev-parse FETCH_HEAD)
if git merge-base --is-ancestor "$tag_sha" "$main_sha"; then
echo "Tag $TAG ($tag_sha) is reachable from main — OK."
else
echo "::error::tag $TAG is not an ancestor of main. Releases must be cut from main."
exit 1
fi

- name: Verify the tag matches the version manifest
env:
TAG: ${{ steps.tag.outputs.tag }}
run: |
set -euo pipefail
# version.py is the source of truth (per CLAUDE.md); version-guard.yml
# separately enforces that pyproject + the three plugin manifests agree.
py_version=$(grep -E '^__version__' mempalace/version.py | cut -d'"' -f2)
tag_version="${TAG#v}"
if [[ "$tag_version" != "$py_version" ]]; then
echo "::error::tag $TAG does not match mempalace/version.py ($py_version). Bump the version files before releasing."
exit 1
fi
echo "Tag $TAG matches manifest version $py_version — OK."

- uses: actions/setup-python@v6
with:
python-version: "3.13"

- name: Build sdist + wheel
run: |
python -m pip install --upgrade build
python -m build

- name: Publish to PyPI
uses: pypa/gh-action-pypi-publish@release/v1
Loading
Loading