Skip to content

Releases: MarcoPorcellato/logseq-matryca-parser

v1.6.0

Choose a tag to compare

@github-actions github-actions released this 02 Jul 06:23

[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 SSOTdocs/CLEAN_CODE_ARCHITECTURE.md maps Uncle Bob rings, SOLID, and module maps; quality index in docs/quality/ (backlog, GitHub roadmap, July 2026 triage).
  • kinetic_export.py — KINETIC format handlers extracted from kinetic.py (DEBT-005 / #80).
  • kinetic_commands.pyscan, visualize, demo, append, agent-read, and agent-write subcommands (SRP slice / #82).
  • synapse_embed.pyBlockEmbedExpander / PageEmbedExpander strategy pattern for embed expansion (DEBT-006 / #70).
  • LogseqGraph.iter_attached_nodes() — public ISP iterator skipping orphan ghost registry entries (#81).
  • Layer boundary CItests/test_layer_boundary.py forbids framework imports in entities/use cases, adapter→driver leaks, and Typer/Rich in kinetic_export.py.
  • make vendor-name-check — Ghost Tooling gate for vendor-free public documentation.
  • Maintainer local code audit runbookdocs/internal/LOCAL_CODE_STUDY.md.
  • GitHub issue template.github/ISSUE_TEMPLATE/clean_architecture.yml for Uncle Bob slices; bootstrap script .github/scripts/create_clean_arch_issues.sh.

Changed

  • kinetic.py — slim Typer app factory (~230 lines): export orchestration + shared CLI helpers; subcommands in kinetic_commands.py.
  • LogseqGraph.is_tracked_markdown_path() — public DIP surface for watcher path checks (#68).
  • KINETIC — removed dead _parse_graph helper (#67).
  • Ghost Tooling — vendor AST indexer names removed from public docs; unified on local code audit / graph-based code study terminology.
  • Contributor docsREADME.md, docs/ARCHITECTURE.md, docs/COOKBOOK.md, docs/GOOD_FIRST_ISSUES.md, and CONTRIBUTING.md updated for v1.6.0 and 456 pytest cases.

Meta (contributor tracking)

v1.4.2

Choose a tag to compare

@github-actions github-actions released this 29 Jun 17:27

[1.4.2] - 2026-06-29

Fixed

  • agent-writeappend_child_to_node normalizes 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 from to_context_enriched_chunks (#65, #75).
  • agent-writeSessionAliasRegistry.load_from_disk tolerates 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_changelog CLI, LogseqConfigReader timestamps, and KINETIC agent-write validation 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

v1.4.1

Choose a tag to compare

@github-actions github-actions released this 24 Jun 04:49

[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_paths fallbacks, exception hierarchy, extract_changelog release script, KINETIC per-command --help, agent-read --query, and direct ObsidianForgeVisitor tests. 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

v1.4.0

Choose a tag to compare

@github-actions github-actions released this 23 Jun 11:06

[1.4.0] - 2026-06-23

Added

  • Bug hunt reportdocs/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 onboardingdocs/GOOD_FIRST_ISSUES.md indexes 16 starter tasks (#19#34); docs/README.md distinguishes active vs historical documentation; GitHub labels (good first issue, help wanted, tests, documentation, cli, forge) and issue-template contact link; Your first PR section in CONTRIBUTING.md.
  • Integration cookbook & doc harmonizationdocs/COOKBOOK.md; docs/design-docs/README.md; draft docs/rfc/OLLAMA_RAG.md; cross-links across README, ARCHITECTURE, AST primer, RELEASE_PROCESS, CODEQL, SECURITY, and PR template; examples/run_demo.py English + 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.md and .cursorrules.
  • Repository metrics archivescripts/archive_repository_metrics.py partitions traffic into metrics/quarters/YYYY-QN.json with metrics/index.json manifest; legacy metrics/history.json is migrated once on first run.

Fixed

  • Daily metrics workflow.github/workflows/daily-metrics.yml syncs with main before archiving, uses pull --rebase with push retries, serializes runs via concurrency, and commits the quarterly metrics tree instead of a monolithic JSON file.
  • BUG-017StackMachineParser._refresh_node no 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-016append_child_to_node calls invalidate_and_reload_page so the in-memory graph matches disk after agent-write.
  • BUG-005invalidate_and_reload_page purges registry/backlinks when the markdown file was deleted instead of raising FileNotFoundError.
  • BUG-010 / BUG-013 / BUG-022load_directory rebuilds _node_registry from indexed pages only (no ghost nodes after title collision or duplicate title::); search_content, GraphQuery, and get_nodes_by_tag iterate attached nodes.
  • BUG-026 — Wikilink backlink index includes canonical title and alias:: keys so get_backlinks("Development") matches [[Dev]].
  • BUG-012get_node_by_embed_ref resolves block UUIDs case-insensitively.
  • BUG-014LogseqGraphWatcher handles on_deleted and on_moved filesystem events.
  • BUG-028get_namespace_children uses case-insensitive namespace prefix matching.
  • DEBT-001 / BUG-006iter_canonical_pages() deduplicates alias keys; KINETIC export paths use canonical pages (no duplicate Obsidian/langchain/json output).
  • BUG-011 / BUG-021 — Per-page tab_size detection at parse time; serialize_logseq_page and append_child_to_node preserve four-space vault indentation.
  • BUG-008 / BUG-015 / BUG-031search_content, get_nodes_by_tag, and GraphQuery.has_tag use case-insensitive matching with optional # prefix.
  • BUG-009SessionAliasRegistry.load_from_disk skips duplicate UUID mappings instead of corrupting reverse lookup.
  • BUG-018to_llamaindex_nodes assigns distinct SOURCE relationships per page when roots span multiple files.
  • BUG-023to_context_enriched_chunks skips orphan registry nodes.
  • BUG-019 / BUG-020 — LENS deduplicates alias pages and resolves wikilink refs to canonical titles when a LogseqGraph is provided.
  • BUG-029resolve_relative_page_link supports ../ and ./ path segments.
  • BUG-030resolve_asset_path rejects absolute paths and links that escape the graph root.
  • BUG-004 — Weekly agent log files use ISO 8601 week numbers (isocalendar) instead of strftime(%W).
  • BUG-007 / BUG-025get_namespace_children dedupes alias keys; LogseqGraph.load_directory(strict_refs=True) validates cross-page block refs via raise_if_broken_references().
  • LIM-001filename_to_page_title preserves literal dots in titles with spaces (e.g. Dr. Smith).
  • LIM-002 — Empty page titles map to stable untitled filename stem and untitled.md relative path.
  • DEBT-001 — Public LogseqGraph.page_for_node(); SYNAPSE and KINETIC scan use canonical page iteration; production assert removed from embed expansion.

v1.3.1

Choose a tag to compare

@github-actions github-actions released this 18 Jun 22:59

[1.3.1] - 2026-06-19

Changed

  • Documentationexamples/run_demo.py and claude-skill-logseq-read/SKILL.md recommend uv sync --all-extras / uv pip install instead of legacy pip install hints.

v1.3.0

Choose a tag to compare

@github-actions github-actions released this 18 Jun 22:57

[1.3.0] - 2026-06-19

Changed

  • Sprint 1 architectural quick winsdiscover_graph_files moved from kinetic.py to logseq_paths.py (decouples CLI from LogseqGraph); KINETIC optional-dependency errors now recommend uv sync --extra ai|viz; lens.py lazy-imports NetworkX/PyVis; SYNAPSE exports vector-store-safe metadata via SynapseMetadata / build_synapse_metadata (task_priority, temporal epochs, source_uuid, joined path/refs); explicit [tool.ruff] config in pyproject.toml.
  • Sprint 2 runtime robustnessLogseqGraphWatcher debounces filesystem events (~500ms) and ignores editor temp/swap files; StackMachineParser(strict_refs=True) raises BlockReferenceError for 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 architectureLogseqGraph uses validate_assignment=True (no frozen/object.__setattr__ hack); SYNAPSE LlamaIndexVisitor adds SOURCE, NEXT, and PREVIOUS relationships; package root __init__.py exports SynapseAdapter, SessionAliasRegistry, GraphVisualizer, and core LOGOS symbols via explicit __all__.
  • Optional AI stackllama-index-core bumped to 0.14.22 via 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, uv install).

Security

  • Transitive dependency hardeninguv constraints pin aiohttp>=3.14.1 (11 Dependabot alerts); nltk overridden to v3.10.0-rc1 from 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

Choose a tag to compare

@github-actions github-actions released this 18 Jun 17:39

[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). See docs/CODEQL.md.

Changed

  • README — CodeQL references updated to default setup; link to docs/CODEQL.md.
  • Documentationdocs/CODEQL.md added; CONTRIBUTING and SECURITY updated for 1.2.2.

v1.2.1

Choose a tag to compare

@github-actions github-actions released this 18 Jun 17:24

[1.2.1] - 2026-06-18

Added

  • Community health filesCODE_OF_CONDUCT.md (Contributor Covenant 2.1), .github/CODEOWNERS, and .github/ISSUE_TEMPLATE/config.yml for GitHub Community Standards compliance.
  • PyPI project URLsRepository, Source, Documentation, and Changelog links in pyproject.toml.
  • Coverage gatepytest-cov in the dev group; make test enforces --cov-fail-under=80 with [tool.coverage.*] in pyproject.toml.
  • CodeQL workflow.github/workflows/codeql.yml for Python SAST on push/PR to main.
  • PyPI pre-flightpypi_publish.yml runs make all via uv before building and publishing a tag.
  • CI Python matrix — GitHub Actions tests Python 3.12 and 3.13 in ci.yml and PyPI pre-flight.

Changed

  • CI toolchain.github/workflows/ci.yml uses astral-sh/setup-uv and runs uv sync --all-extras followed by make lint, make check, and make test (parity with local make all).
  • CONTRIBUTING.md — development setup documents uv sync --all-extras instead of pip install -e ..
  • Pre-commit — Ruff and Mypy hook versions aligned with the dev dependency group in pyproject.toml.
  • Mypy scope — unified to src/, tests/, and examples/ in the Makefile, CI, CONTRIBUTING, and pre-commit.
  • CI securitypip-audit on exported production requirements and concurrency cancel-in-progress on the same ref.
  • Version sync testtests/test_package_version.py asserts __version__ matches importlib.metadata.version(...).
  • Documentation layout — root ROADMAP_*.md files consolidated under docs/roadmaps/.
  • README badges — Python support badge updated to 3.12 | 3.13; CI badge links directly to the workflow.
  • PyPI classifiersProgramming Language :: Python :: 3.13 added in pyproject.toml.

v1.2.0

Choose a tag to compare

@github-actions github-actions released this 29 May 02:47

[1.2.0] - 2026-05-29

Added

  • Asset extractionLogseqNode.assets collects markdown images, {{pdf}} macros, and local [label](path) attachments; resolve_asset_path decodes percent-encoded paths (%20).
  • YAML frontmatter--- blocks at file start populate LogseqPage.properties like native Logseq page properties.
  • page-tags:: — block and page properties named page-tags inject implicit graph tokens like tags::.

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 bogus key:: lines; YAML frontmatter pages round-trip with --- fences and stable block UUIDs; title from YAML or title:: frontmatter overrides the graph page title for deterministic IDs.
  • Property comma-split in wikilinkstags:: / alias:: comma separation ignores commas inside [[...]] tokens.
  • Properties after code fenceskey:: lines immediately following a closing fence are parsed into block properties (Logseq contiguity exception).
  • Org warning periodsDEADLINE / SCHEDULED payloads 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 routingLogseqGraph.get_page and resolve_relative_page_link resolve 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 and key:: frontmatter) merge into page.refs.
  • Temporal ranges and repeatersSCHEDULED / DEADLINE markers with HH:MM - HH:MM ranges parse using the start time; repeater tokens (.+1w, ++1d) are stripped before datetime parsing.
  • Legacy namespace filenamesfilename_to_page_title decodes ___, %2F, and Dendron-style . separators.
  • BOM-prefixed graph filesparse_page_file reads with utf-8-sig so 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 failing BULLET_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

Choose a tag to compare

@github-actions github-actions released this 28 May 18:18

[1.1.1] - 2026-05-28

Added

  • Graph page aliasesLogseqGraph.load_directory honors title::, alias:: / aliases:: for pages lookup and backlinks; incremental reload re-applies enrichment after watcher edits.
  • LaTeX math shielding_shield_inline_code masks $$...$$ and $...$ spans so wikilinks/tags inside equations are not extracted.
  • Datalog query dead zones#+BEGIN_QUERY#+END_QUERY blocks are ignored for entity extraction (parse-loop state plus shielding).
  • Numbered list blockslogos_parser.py recognizes ordered-list markers (1. , 12. , etc.) as outliner bullets alongside - and *.
  • Markdown task checkboxes[ ], [-], and [x]/[X] on block text map to TODO, DOING, and DONE before 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-separated tags:: / alias:: / aliases:: inject implicit graph tokens; ~~~ fences share code-block immunity with ``` fences.
  • Property contiguity — block key:: value lines apply only while contiguous below the bullet; after a soft-break, later key:: lines stay in content / clean_text (Logseq-native behavior).
  • Property bullet lists — empty alias:: / tags:: followed by indented - bullets serialize as list[str] without orphan AST children.
  • Case-insensitive property keys — all property keys normalized to lowercase at parse time; TITLE:: frontmatter overrides graph page titles like title::.
  • Extended task markersDELEGATED, POSTPONED, IN-PROGRESS (longest-prefix matching) alongside existing Org-mode statuses.
  • Aliased block references[Visible](((uuid))) clean text retains visible alias only (no surrounding [ ]).