Releases: MarcoPorcellato/logseq-matryca-parser
Releases · MarcoPorcellato/logseq-matryca-parser
Release list
v1.6.0
[1.6.0] - 2026-07-02
Minor release — Clean Architecture v1 structural slices (SRP/OCP), new public graph APIs, layer-boundary CI, and documentation SSOT. No intentional breaking changes to existing matryca-parse CLI behavior or stable package exports.
Added
- Clean Architecture SSOT —
docs/CLEAN_CODE_ARCHITECTURE.mdmaps Uncle Bob rings, SOLID, and module maps; quality index indocs/quality/(backlog, GitHub roadmap, July 2026 triage). kinetic_export.py— KINETIC format handlers extracted fromkinetic.py(DEBT-005 / #80).kinetic_commands.py—scan,visualize,demo,append,agent-read, andagent-writesubcommands (SRP slice / #82).synapse_embed.py—BlockEmbedExpander/PageEmbedExpanderstrategy pattern for embed expansion (DEBT-006 / #70).LogseqGraph.iter_attached_nodes()— public ISP iterator skipping orphan ghost registry entries (#81).- Layer boundary CI —
tests/test_layer_boundary.pyforbids framework imports in entities/use cases, adapter→driver leaks, and Typer/Rich inkinetic_export.py. make vendor-name-check— Ghost Tooling gate for vendor-free public documentation.- Maintainer local code audit runbook —
docs/internal/LOCAL_CODE_STUDY.md. - GitHub issue template —
.github/ISSUE_TEMPLATE/clean_architecture.ymlfor Uncle Bob slices; bootstrap script.github/scripts/create_clean_arch_issues.sh.
Changed
kinetic.py— slim Typer app factory (~230 lines):exportorchestration + shared CLI helpers; subcommands inkinetic_commands.py.LogseqGraph.is_tracked_markdown_path()— public DIP surface for watcher path checks (#68).- KINETIC — removed dead
_parse_graphhelper (#67). - Ghost Tooling — vendor AST indexer names removed from public docs; unified on local code audit / graph-based code study terminology.
- Contributor docs —
README.md,docs/ARCHITECTURE.md,docs/COOKBOOK.md,docs/GOOD_FIRST_ISSUES.md, andCONTRIBUTING.mdupdated for v1.6.0 and 456 pytest cases.
Meta (contributor tracking)
v1.4.2
[1.4.2] - 2026-06-29
Fixed
- agent-write —
append_child_to_nodenormalizes source files missing a trailing newline before line splice, preventing new bullets from being appended onto the last line (#72, #74). - SYNAPSE — cyclic
{{embed [[Page]]}}chains no longer duplicate parent literal text; page embed expansion tracks an immutable host-page chain seeded fromto_context_enriched_chunks(#65, #75). - agent-write —
SessionAliasRegistry.load_from_disktolerates empty, malformed, or legacy-wrapped X-Ray JSON; KINETIC exits with a clear message instead of a traceback (#60, #76).
Added
- Test coverage (wave 2) — Community contribution (#58, maintainer #43): 65 new pytest cases for
detect_tab_size_from_markdown, graph link/backlink helpers, SYNAPSE embedding strip + metadata schema, FORGE Markdown/JSON visitors, LENS node classification,extract_changelogCLI,LogseqConfigReadertimestamps, and KINETICagent-writevalidation errors. Closes #20, #43–#52. - Regression tests — Seven new cases for newline splice, cyclic page embed, and malformed X-Ray state (issues #73, #65, #60); suite total 450 pytest.
Changed
- Contributor docs —
README.md,docs/README.md,CONTRIBUTING.md,SECURITY.md, anddocs/ARCHITECTURE.mdharmonized for v1.4.2 (test count, supported versions, agent-write / SYNAPSE behavior notes).
v1.4.1
[1.4.1] - 2026-06-24
Added
- Test coverage (wave 1) — Community contribution (#42): 107 new pytest cases (378 total) across parser helpers (
normalize_logseq_timestamp,clean_node_content),logseq_pathsfallbacks, exception hierarchy,extract_changelogrelease script, KINETIC per-command--help,agent-read --query, and directObsidianForgeVisitortests. New modules:tests/test_exceptions.py,tests/test_extract_changelog.py. Closes #21–#24, #27, #30–#32. - Good first issues (wave 2) — Ten new contributor tasks (#43–#52) indexed as GFI-17–GFI-26 in
docs/GOOD_FIRST_ISSUES.md; wave-1 GFI items marked complete.
Changed
- Contributor docs —
README.md,docs/README.md,CONTRIBUTING.md,SECURITY.md, anddocs/ARCHITECTURE.mdharmonized for v1.4.1 (test count, issue index range, supported versions).
v1.4.0
[1.4.0] - 2026-06-23
Added
- Bug hunt report —
docs/BUG_HUNT_REPORT.md: local static analysis audit waves 1–8 complete (31 bug IDs, module inventory §10): parser crash, ghost registry, export dupes, API case/alias inconsistencies, SYNAPSE hang. - Contributor onboarding —
docs/GOOD_FIRST_ISSUES.mdindexes 16 starter tasks (#19–#34);docs/README.mddistinguishes active vs historical documentation; GitHub labels (good first issue,help wanted,tests,documentation,cli,forge) and issue-template contact link; Your first PR section inCONTRIBUTING.md. - Integration cookbook & doc harmonization —
docs/COOKBOOK.md;docs/design-docs/README.md; draftdocs/rfc/OLLAMA_RAG.md; cross-links across README, ARCHITECTURE, AST primer, RELEASE_PROCESS, CODEQL, SECURITY, and PR template;examples/run_demo.pyEnglish + package imports.
Changed
- Ghost Tooling policy — Matryca.ai vendor-agnostic compliance: local static analysis tools excluded from CI, Makefile, and public documentation; see
docs/internal/STATIC_ANALYSIS_POLICY.mdand.cursorrules. - Repository metrics archive —
scripts/archive_repository_metrics.pypartitions traffic intometrics/quarters/YYYY-QN.jsonwithmetrics/index.jsonmanifest; legacymetrics/history.jsonis migrated once on first run.
Fixed
- Daily metrics workflow —
.github/workflows/daily-metrics.ymlsyncs withmainbefore archiving, usespull --rebasewith push retries, serializes runs viaconcurrency, and commits the quarterly metrics tree instead of a monolithic JSON file. - BUG-017 —
StackMachineParser._refresh_nodeno longer crashes on empty bullets with block properties (IndexError). - BUG-001 / BUG-003 — SYNAPSE page/block embed expansion uses
get_page(case-insensitive) and fail-safe empty replacement instead of infinite loops on unresolved embeds. - BUG-016 —
append_child_to_nodecallsinvalidate_and_reload_pageso the in-memory graph matches disk after agent-write. - BUG-005 —
invalidate_and_reload_pagepurges registry/backlinks when the markdown file was deleted instead of raisingFileNotFoundError. - BUG-010 / BUG-013 / BUG-022 —
load_directoryrebuilds_node_registryfrom indexed pages only (no ghost nodes after title collision or duplicatetitle::);search_content,GraphQuery, andget_nodes_by_tagiterate attached nodes. - BUG-026 — Wikilink backlink index includes canonical title and
alias::keys soget_backlinks("Development")matches[[Dev]]. - BUG-012 —
get_node_by_embed_refresolves block UUIDs case-insensitively. - BUG-014 —
LogseqGraphWatcherhandleson_deletedandon_movedfilesystem events. - BUG-028 —
get_namespace_childrenuses case-insensitive namespace prefix matching. - DEBT-001 / BUG-006 —
iter_canonical_pages()deduplicates alias keys; KINETIC export paths use canonical pages (no duplicate Obsidian/langchain/json output). - BUG-011 / BUG-021 — Per-page
tab_sizedetection at parse time;serialize_logseq_pageandappend_child_to_nodepreserve four-space vault indentation. - BUG-008 / BUG-015 / BUG-031 —
search_content,get_nodes_by_tag, andGraphQuery.has_taguse case-insensitive matching with optional#prefix. - BUG-009 —
SessionAliasRegistry.load_from_diskskips duplicate UUID mappings instead of corrupting reverse lookup. - BUG-018 —
to_llamaindex_nodesassigns distinctSOURCErelationships per page when roots span multiple files. - BUG-023 —
to_context_enriched_chunksskips orphan registry nodes. - BUG-019 / BUG-020 — LENS deduplicates alias pages and resolves wikilink refs to canonical titles when a
LogseqGraphis provided. - BUG-029 —
resolve_relative_page_linksupports../and./path segments. - BUG-030 —
resolve_asset_pathrejects absolute paths and links that escape the graph root. - BUG-004 — Weekly agent log files use ISO 8601 week numbers (
isocalendar) instead ofstrftime(%W). - BUG-007 / BUG-025 —
get_namespace_childrendedupes alias keys;LogseqGraph.load_directory(strict_refs=True)validates cross-page block refs viaraise_if_broken_references(). - LIM-001 —
filename_to_page_titlepreserves literal dots in titles with spaces (e.g.Dr. Smith). - LIM-002 — Empty page titles map to stable
untitledfilename stem anduntitled.mdrelative path. - DEBT-001 — Public
LogseqGraph.page_for_node(); SYNAPSE and KINETICscanuse canonical page iteration; productionassertremoved from embed expansion.
v1.3.1
[1.3.1] - 2026-06-19
Changed
- Documentation —
examples/run_demo.pyandclaude-skill-logseq-read/SKILL.mdrecommenduv sync --all-extras/uv pip installinstead of legacypip installhints.
v1.3.0
[1.3.0] - 2026-06-19
Changed
- Sprint 1 architectural quick wins —
discover_graph_filesmoved fromkinetic.pytologseq_paths.py(decouples CLI fromLogseqGraph); KINETIC optional-dependency errors now recommenduv sync --extra ai|viz;lens.pylazy-imports NetworkX/PyVis; SYNAPSE exports vector-store-safe metadata viaSynapseMetadata/build_synapse_metadata(task_priority, temporal epochs,source_uuid, joinedpath/refs); explicit[tool.ruff]config inpyproject.toml. - Sprint 2 runtime robustness —
LogseqGraphWatcherdebounces filesystem events (~500ms) and ignores editor temp/swap files;StackMachineParser(strict_refs=True)raisesBlockReferenceErrorfor unresolved same-page((uuid))refs (default off); KINETIC adds@app.callback()with--verbose/--graph,rich_markup_mode="rich", and shared graph-path resolution. - Sprint 3 architecture —
LogseqGraphusesvalidate_assignment=True(no frozen/object.__setattr__hack); SYNAPSELlamaIndexVisitoraddsSOURCE,NEXT, andPREVIOUSrelationships; package root__init__.pyexportsSynapseAdapter,SessionAliasRegistry,GraphVisualizer, and core LOGOS symbols via explicit__all__. - Optional AI stack —
llama-index-corebumped to0.14.22via lock refresh. - Documentation — README, ARCHITECTURE, CONTRIBUTING, SECURITY, CODEQL, AST primer, and roadmaps updated for 1.3.0 (public API, watcher debounce,
strict_refs, LlamaIndex spatial edges,uvinstall).
Security
- Transitive dependency hardening —
uvconstraints pinaiohttp>=3.14.1(11 Dependabot alerts);nltkoverridden tov3.10.0-rc1from upstream Git until NLTK 3.10.0 ships on PyPI (GHSA-p4gq-832x-fm9v). Affects optional[ai]/[all]extras only; core install unchanged.
v1.2.2
[1.2.2] - 2026-06-18
Fixed
- CodeQL CI conflict — removed
.github/workflows/codeql.yml; SAST runs via GitHub CodeQL default setup only (advanced workflow + default setup cannot coexist). Seedocs/CODEQL.md.
Changed
- README — CodeQL references updated to default setup; link to
docs/CODEQL.md. - Documentation —
docs/CODEQL.mdadded; CONTRIBUTING and SECURITY updated for 1.2.2.
v1.2.1
[1.2.1] - 2026-06-18
Added
- Community health files —
CODE_OF_CONDUCT.md(Contributor Covenant 2.1),.github/CODEOWNERS, and.github/ISSUE_TEMPLATE/config.ymlfor GitHub Community Standards compliance. - PyPI project URLs —
Repository,Source,Documentation, andChangeloglinks inpyproject.toml. - Coverage gate —
pytest-covin the dev group;make testenforces--cov-fail-under=80with[tool.coverage.*]inpyproject.toml. - CodeQL workflow —
.github/workflows/codeql.ymlfor Python SAST on push/PR tomain. - PyPI pre-flight —
pypi_publish.ymlrunsmake allviauvbefore building and publishing a tag. - CI Python matrix — GitHub Actions tests Python 3.12 and 3.13 in
ci.ymland PyPI pre-flight.
Changed
- CI toolchain —
.github/workflows/ci.ymlusesastral-sh/setup-uvand runsuv sync --all-extrasfollowed bymake lint,make check, andmake test(parity with localmake all). - CONTRIBUTING.md — development setup documents
uv sync --all-extrasinstead ofpip install -e .. - Pre-commit — Ruff and Mypy hook versions aligned with the
devdependency group inpyproject.toml. - Mypy scope — unified to
src/,tests/, andexamples/in the Makefile, CI, CONTRIBUTING, and pre-commit. - CI security —
pip-auditon exported production requirements andconcurrencycancel-in-progress on the same ref. - Version sync test —
tests/test_package_version.pyasserts__version__matchesimportlib.metadata.version(...). - Documentation layout — root
ROADMAP_*.mdfiles consolidated underdocs/roadmaps/. - README badges — Python support badge updated to 3.12 | 3.13; CI badge links directly to the workflow.
- PyPI classifiers —
Programming Language :: Python :: 3.13added inpyproject.toml.
v1.2.0
[1.2.0] - 2026-05-29
Added
- Asset extraction —
LogseqNode.assetscollects markdown images,{{pdf}}macros, and local[label](path)attachments;resolve_asset_pathdecodes percent-encoded paths (%20). - YAML frontmatter —
---blocks at file start populateLogseqPage.propertieslike native Logseq page properties. page-tags::— block and page properties namedpage-tagsinject implicit graph tokens liketags::.
Fixed
- Round-trip serialization — soft-break continuations no longer double-indent; list-shaped block properties (
tags::+ bullets) serialize as Logseq bullet lists instead of Python repr;:LOGBOOK:drawers and derived temporal fields (scheduled::,repeater::, …) are not emitted as boguskey::lines; YAML frontmatter pages round-trip with---fences and stable block UUIDs;titlefrom YAML ortitle::frontmatter overrides the graph page title for deterministic IDs. - Property comma-split in wikilinks —
tags::/alias::comma separation ignores commas inside[[...]]tokens. - Properties after code fences —
key::lines immediately following a closing fence are parsed into block properties (Logseq contiguity exception). - Org warning periods —
DEADLINE/SCHEDULEDpayloads with-3d-style warning periods parse without datetime failures. - Quoted property values — outer
"/'are stripped from block property values in the AST. - Query macro shielding —
{{query}}/{{advancedquery}}inline macros do not emit false wikilink graph tokens (embed macros still do). - Case-insensitive page routing —
LogseqGraph.get_pageandresolve_relative_page_linkresolve titles via a lowercase index (Datomic / Logseq parity). - HTML comment shielding — wikilinks and tags inside
<!-- ... -->are masked before entity extraction (no ghost graph links). - Graph token parity — list-shaped block properties (
tags::with bullets) feed wikilinks/tags into the AST; page-level properties (YAML andkey::frontmatter) merge intopage.refs. - Temporal ranges and repeaters —
SCHEDULED/DEADLINEmarkers withHH:MM - HH:MMranges parse using the start time; repeater tokens (.+1w,++1d) are stripped before datetime parsing. - Legacy namespace filenames —
filename_to_page_titledecodes___,%2F, and Dendron-style.separators. - BOM-prefixed graph files —
parse_page_filereads withutf-8-sigso Windows-synced BOM bytes do not break the first bullet. - Markdown escape shielding —
\#and\[\[no longer yield tags or wikilinks in graph metadata. - Empty bullets — bare
-/*lines parse as empty blocks instead of failingBULLET_PATTERN. - Wikilink header anchors —
[[Page#Section]]resolves to the page name only for graph routing. - Hybrid alias links —
[Alias]([[Page]])is no longer treated as a file asset.
v1.1.1
[1.1.1] - 2026-05-28
Added
- Graph page aliases —
LogseqGraph.load_directoryhonorstitle::,alias::/aliases::forpageslookup and backlinks; incremental reload re-applies enrichment after watcher edits. - LaTeX math shielding —
_shield_inline_codemasks$$...$$and$...$spans so wikilinks/tags inside equations are not extracted. - Datalog query dead zones —
#+BEGIN_QUERY…#+END_QUERYblocks are ignored for entity extraction (parse-loop state plus shielding). - Numbered list blocks —
logos_parser.pyrecognizes ordered-list markers (1.,12., etc.) as outliner bullets alongside-and*. - Markdown task checkboxes —
[ ],[-], and[x]/[X]on block text map toTODO,DOING, andDONEbefore Org-mode prefix fallback.
Fixed
- Logseq OG parity (parser) —
{{embed [[Page]]}}and similar macros expose nested wikilinks; Unicode tags and markdown boundaries (**#tag**,==#tag==); comma-separatedtags::/alias::/aliases::inject implicit graph tokens;~~~fences share code-block immunity with```fences. - Property contiguity — block
key:: valuelines apply only while contiguous below the bullet; after a soft-break, laterkey::lines stay incontent/clean_text(Logseq-native behavior). - Property bullet lists — empty
alias::/tags::followed by indented-bullets serialize aslist[str]without orphan AST children. - Case-insensitive property keys — all property keys normalized to lowercase at parse time;
TITLE::frontmatter overrides graph page titles liketitle::. - Extended task markers —
DELEGATED,POSTPONED,IN-PROGRESS(longest-prefix matching) alongside existing Org-mode statuses. - Aliased block references —
[Visible](((uuid)))clean text retains visible alias only (no surrounding[]).