Skip to content

Commit 335d7ab

Browse files
dzmitrys-devclaude
andcommitted
chore(80.6-13): v0.1.0 release artifacts (CHANGELOG, MIGRATION, release workflow)
Plan 80.6-13 — release prep + wheel build + local smoke. Files: - CHANGELOG.md (NEW): v0.1.0 release notes — full 10-command CLI surface, bundled artifacts (share/, goldens), locked Phase 80.1 architecture, install command per D-44, plugin entry-points contract per D-48. - MIGRATION.md: extended v0.1.0 section with the plugin entry-point contract (D-48) — built-in registrations + the v0 unstable-contract caveat. Pin against supamem==0.1.* for plugin compat. - .github/workflows/release.yml (NEW): tag-triggered release workflow. On tag push 'v*' it builds wheel + sdist via python -m build and uploads to a GitHub release with auto-generated notes via softprops/action-gh-release@v2. - pyproject.toml: replaced [tool.hatch.build.targets.wheel.force-include] with explicit include= patterns for non-Python data files (.md, .mdc, .sh, .jsonl, .toml). force-include was duplicating files in the wheel because the share/ and eval/goldens/ trees are inside src/supamem/ which is already covered by packages= ["src/supamem"]. Single include= list ships the data files exactly once. Verification: python -m build -> dist/supamem-0.1.0-py3-none-any.whl + .tar.gz Fresh /tmp venv install via pip: supamem --version -> 'supamem v0.1.0' + credit line supamem --help -> all 10 subcommands listed importlib.resources finds share/rules/dual-memory.md AND eval/goldens/phase_80_1_tuned_hybrid.jsonl in the installed wheel 148/148 pytest pass. ruff clean. Next (Task 3, blocked on user approval per autonomous: false): git tag -a v0.1.0 -m "supamem v0.1.0 — initial release" git push origin main v0.1.0 release.yml fires on tag push -> GitHub release v0.1.0 with artifacts. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent a54fc76 commit 335d7ab

4 files changed

Lines changed: 139 additions & 4 deletions

File tree

.github/workflows/release.yml

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
name: release
2+
3+
on:
4+
push:
5+
tags: ['v*']
6+
7+
jobs:
8+
release:
9+
runs-on: ubuntu-latest
10+
permissions:
11+
contents: write
12+
steps:
13+
- uses: actions/checkout@v4
14+
with:
15+
fetch-depth: 0
16+
17+
- name: Set up Python
18+
uses: actions/setup-python@v5
19+
with:
20+
python-version: "3.12"
21+
22+
- name: Install build
23+
run: pip install build
24+
25+
- name: Build wheel + sdist
26+
run: python -m build
27+
28+
- name: List artifacts
29+
run: ls -lh dist/
30+
31+
- name: Create GitHub release
32+
uses: softprops/action-gh-release@v2
33+
with:
34+
files: dist/*
35+
generate_release_notes: true
36+
fail_on_unmatched_files: true

CHANGELOG.md

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
# Changelog
2+
3+
All notable changes to `supamem` will be documented in this file.
4+
5+
## v0.1.0 — 2026-04-29
6+
7+
The initial public release. Extracted from the SoftChat dual-memory stack
8+
(Phases 80.1–80.5) and shipped as a project-agnostic Python package under MIT.
9+
10+
### CLI surface (10 commands)
11+
12+
- `supamem init` — greenfield bootstrap (probes Qdrant, creates per-project
13+
hybrid collection, writes `.supamem/config.toml`).
14+
- `supamem install --client {claude-code|cursor|opencode}` — patches the
15+
client config atomically; idempotent; `--dry-run` supported.
16+
- `supamem uninstall --client X` — reverses install cleanly.
17+
- `supamem index [--target tuned] [--force] [--snapshot cursor]` — embeds
18+
Markdown sources into Qdrant or refreshes the Cursor `.mdc` snapshot.
19+
- `supamem mcp-server [--transport stdio|http] [--port N] [--host H]`
20+
runs the MCP server. Streamable HTTP per Nov 2025 MCP spec (D-45).
21+
- `supamem hook {claude-code|opencode} [--file-path X]` — per-client
22+
PreToolUse hook delegate. Fail-soft: never blocks the calling tool.
23+
- `supamem doctor [--show-secrets]` — health probe + resolved config chain
24+
+ version-drift advisory across detected clients.
25+
- `supamem stats [--show today|week|all] [--format table|json]` — Welford
26+
schema-v2 usage counters from `~/.cache/supamem/audit.jsonl`.
27+
- `supamem migrate --source X --target Y --path {coexist|migrate|adopt-as-is}`
28+
— brownfield migration with snapshot-before-destructive guard.
29+
- `supamem eval [--regress] [--goldens path]` — recall@5 + p95 latency +
30+
total tokens against the bundled 33-query corpus. Phase 80.1 baselines:
31+
`mean_recall_at_5 >= 0.60`, `total_tokens <= 4000`, `p95_latency_ms <= 500`.
32+
33+
### Bundled
34+
35+
- `~/.supamem/share/{rules,skills,commands,hooks,cursor-rules}/` — canonical
36+
artifacts referenced by every client config (SC-3 reference-not-copy
37+
contract; Cursor `.mdc` is the documented copy exception).
38+
- 33-query golden corpus at `supamem.eval.goldens.phase_80_1_tuned_hybrid`
39+
for `--regress` (per D-46).
40+
- Plugin entry-point groups for retrieval, embedder, and chunker so
41+
third-party packages can extend supamem without forking (per D-48).
42+
43+
### Locked architecture (Phase 80.1 D-19 / D-25)
44+
45+
- Hybrid retrieval: BM25 (`Qdrant/bm25`) + dense (`sentence-transformers/
46+
all-MiniLM-L6-v2`) with Qdrant native `FusionQuery(RRF)`, prefetch=20.
47+
- T-1 markdown header chunker, soft-max 250 tokens, fallback 200/20.
48+
- T-4 recency boost, T-5 cosine dedup (threshold 0.97), T-8 token-budget
49+
truncation (1500).
50+
51+
### Install
52+
53+
```bash
54+
uv tool install git+https://github.com/dzmitrys-dev/supamem@v0.1.0
55+
```
56+
57+
PyPI publish is deferred to v0.2 per D-44. v0.1.0 is git-tag-only so
58+
SoftChat's rip-out commit (Plan 80.6-14) can pin a verifiable artifact
59+
before the broader package distribution surface lands.
60+
61+
### Notes
62+
63+
- Forward-compat: tool `title` field set on every MCP tool registration;
64+
Cursor / Claude.ai web honor it today; Claude Code TUI ignores but will
65+
pick up automatically when the upstream lands.
66+
- Stylish `rich`-powered CLI output (banner, panels, spinners, status
67+
tables) on every long-running command.
68+
- Made with care by [SoftChat](https://app.softchat.ru) and
69+
[SoftSkillz](https://softskillz.ai).

MIGRATION.md

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,33 @@ First public release. No upgrade path required — install via:
88
uv tool install git+https://github.com/dzmitrys-dev/supamem@v0.1.0
99
```
1010

11+
### Plugin entry-point contract (D-48)
12+
13+
`supamem` exposes three plugin groups via `pyproject.toml`
14+
`[project.entry-points]`. Third-party packages can register additional
15+
backends without forking:
16+
17+
```toml
18+
[project.entry-points."supamem.retrieval"]
19+
my_backend = "my_pkg.backend:MyBackend"
20+
21+
[project.entry-points."supamem.embedder"]
22+
my_dense = "my_pkg.embedders:MyDenseEmbedder"
23+
24+
[project.entry-points."supamem.chunker"]
25+
my_chunker = "my_pkg.chunker:my_chunk_fn"
26+
```
27+
28+
**Compatibility caveat (v0):** the plugin contract is _unstable_ until v1.
29+
A `0.x.y` minor bump may break plugins. Pin against `supamem==0.1.*` in
30+
your plugin's `requirements`. The shape of `RetrievedChunk`, the
31+
`Backend.query(text, k)` signature, and entry-point group names are the
32+
load-bearing surface; everything else may move.
33+
34+
The built-in registrations (`tuned_hybrid`, `dense`, `bm25` for retrieval;
35+
`minilm`, `bm25` for embedder; `markdown_header` for chunker) are part of
36+
the wheel and resolve automatically via `importlib.metadata.entry_points`.
37+
1138
## SoftChat -> supamem migration
1239

1340
_(Filled in by Phase 80.6 plan 14: SoftChat rip-out.)_

pyproject.toml

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,13 @@ markdown_header = "supamem.indexer.chunker:chunk_markdown"
4747

4848
[tool.hatch.build.targets.wheel]
4949
packages = ["src/supamem"]
50-
51-
[tool.hatch.build.targets.wheel.force-include]
52-
"src/supamem/share" = "supamem/share"
53-
"src/supamem/eval/goldens" = "supamem/eval/goldens"
50+
include = [
51+
"src/supamem/**/*.md",
52+
"src/supamem/**/*.mdc",
53+
"src/supamem/**/*.sh",
54+
"src/supamem/**/*.jsonl",
55+
"src/supamem/**/*.toml",
56+
]
5457

5558
[tool.ruff]
5659
line-length = 100

0 commit comments

Comments
 (0)