diff --git a/.github/workflows/pr-title.yml b/.github/workflows/pr-title.yml index b543f69..e4fbb61 100644 --- a/.github/workflows/pr-title.yml +++ b/.github/workflows/pr-title.yml @@ -29,5 +29,6 @@ jobs: ci chore requireScope: false - subjectPattern: ^[a-z].*$ - subjectPatternError: The subject must start with a lowercase letter. + # Lowercase, or a digit for `chore(release): 0.2.0`. + subjectPattern: ^[a-z0-9].*$ + subjectPatternError: The subject must start with a lowercase letter or a digit. diff --git a/CHANGELOG.md b/CHANGELOG.md index d6c6a27..232316f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ All notable changes to this project are documented here. The format follows ## [Unreleased] +## [0.2.0] - 2026-10-16 + ### Added - `dsearch demo` indexes a bundled public-domain sample (the Forethought and @@ -99,5 +101,6 @@ The one-day build, plus key terms and continuous integration. - A Streamlit web UI over the same functions. - GitHub Actions running ruff and pytest on pushes and pull requests. -[Unreleased]: https://github.com/73anthonyL/DeterministicSearch/compare/v0.1.0...HEAD +[Unreleased]: https://github.com/73anthonyL/DeterministicSearch/compare/v0.2.0...HEAD +[0.2.0]: https://github.com/73anthonyL/DeterministicSearch/compare/v0.1.0...v0.2.0 [0.1.0]: https://github.com/73anthonyL/DeterministicSearch/releases/tag/v0.1.0 diff --git a/CITATION.cff b/CITATION.cff index 0d28809..7527506 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -7,8 +7,8 @@ authors: given-names: Anthony repository-code: https://github.com/73anthonyL/DeterministicSearch license: MIT -version: 0.1.0 -date-released: "2026-10-05" +version: 0.2.0 +date-released: "2026-10-16" keywords: - semantic search - information retrieval diff --git a/README.md b/README.md index 4b9779d..809bdbf 100644 --- a/README.md +++ b/README.md @@ -32,8 +32,7 @@ pipx install "deterministic-search[ui]" # or: uv tool install "deterministic-s ``` `pip install "deterministic-search[ui]"` inside a virtual environment works -too. Until the first PyPI release lands, use the repository instead: -`pipx install "deterministic-search[ui] @ git+https://github.com/73anthonyL/DeterministicSearch"`. +too. The first `dsearch add` downloads the embedding model (about 90 MB for the default `fast` tier); everything after that is offline. diff --git a/docs/LEARNING.md b/docs/LEARNING.md index 918f244..60d99d5 100644 --- a/docs/LEARNING.md +++ b/docs/LEARNING.md @@ -11,7 +11,7 @@ the useful one. | [#5](https://github.com/73anthonyL/DeterministicSearch/pull/5) ci: matrix, pinned actions, pre-commit, pyright | CI/CD hygiene; static typing | "Split jobs so failures are legible, pin actions to SHAs, least-privilege tokens, cancel superseded runs, a 3×3 OS/Python matrix, pyright at zero errors, and a coverage floor just under the measured number." | Enabling pyright surfaced 27 errors, one of them a test assigning a nonexistent attribute; the ruff `S` family found a `try/except: pass`. | | [#6](https://github.com/73anthonyL/DeterministicSearch/pull/6) docs: community files | Open-source project hygiene | "Issue forms that ask for what makes a report fixable, a security policy with private reporting, CODEOWNERS, release-note categories keyed on labels, a citation file." | A YAML option starting with a quote broke the issue form; the `check-yaml` hook caught it before the push. | | [#7](https://github.com/73anthonyL/DeterministicSearch/pull/7) feat(cli): doctor, `--json`, logging | CLI design | "stdout is data and stderr is commentary, so `--json` pipes cleanly; validation happens in the option layer with exit code 2; failure modes are one line naming the cause; `doctor` prints everything a bug report needs." | A log test used `/dev/null` and failed on all three Windows cells. The matrix exists for exactly this. | -| [#10](https://github.com/73anthonyL/DeterministicSearch/pull/10) ci: release workflow with trusted publishing | Release engineering; supply-chain security | "A tag drives one workflow: build once, assert tag equals version, publish to TestPyPI and install from it, stop for a reviewer at the `pypi` environment, then PyPI and a GitHub Release with notes generated from conventional commits. OIDC trusted publishing means there is no API token to leak." | PyPI rejected `dsearch` as "too similar" to an existing `d-search`: its check strips separators. Found at the trusted-publisher form, before any code; the fix was renaming only the distribution, not the tool. | +| [#10](https://github.com/73anthonyL/DeterministicSearch/pull/10) ci: release workflow with trusted publishing | Release engineering; supply-chain security | "A tag drives one workflow: build once, assert tag equals version, publish to TestPyPI and install from it, stop for a reviewer at the `pypi` environment, then PyPI and a GitHub Release with notes generated from conventional commits. OIDC trusted publishing means there is no API token to leak." | PyPI rejected `dsearch` as "too similar" to an existing `d-search`: its check strips separators. Found at the trusted-publisher form, before any code; the fix was renaming only the distribution, not the tool. The PR-title rule then rejected `chore(release): 0.2.0rc1`, so a subject may now begin with a digit. | | [#8](https://github.com/73anthonyL/DeterministicSearch/pull/8) feat(demo): bundled sample | Test fixtures that look like production data | "A public-domain book typeset with real furniture (front matter, outline, running heads, folios, hyphenation), regenerated byte-for-byte so the script and the artifact cannot drift, is both the demo and the benchmark corpus." | The sample immediately exposed a running-head rule tuned on single-chapter files: per-chapter heads leaked into 10 of 259 chunks. Also, pymupdf's simple text API silently turned every em dash into a middle dot. | ## Themes worth being able to talk about diff --git a/pyproject.toml b/pyproject.toml index c306a75..408a3fd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -6,7 +6,7 @@ build-backend = "hatchling.build" # Published as deterministic-search (PyPI treats `dsearch` and the existing # `d-search` as the same name); the command and the import are still dsearch. name = "deterministic-search" -version = "0.2.0rc1" +version = "0.2.0" description = "Local-first semantic evidence search for academic PDFs. Retrieval only — it never generates text." readme = "README.md" license = { file = "LICENSE" } diff --git a/uv.lock b/uv.lock index da2012a..a0644a7 100644 --- a/uv.lock +++ b/uv.lock @@ -463,7 +463,7 @@ nvtx = [ [[package]] name = "deterministic-search" -version = "0.2.0rc1" +version = "0.2.0" source = { editable = "." } dependencies = [ { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" },