logseq-matryca-parser 1.4.0__tar.gz → 1.4.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/CHANGELOG.md +34 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/CONTRIBUTING.md +6 -4
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/PKG-INFO +28 -4
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/README.md +27 -3
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/SECURITY.md +2 -2
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/docs/ARCHITECTURE.md +10 -6
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/docs/BUG_HUNT_REPORT.md +13 -7
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/docs/CODEQL.md +1 -1
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/docs/COOKBOOK.md +22 -1
- logseq_matryca_parser-1.4.2/docs/GOOD_FIRST_ISSUES.md +130 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/docs/README.md +2 -2
- logseq_matryca_parser-1.4.2/docs/design-docs/README.md +13 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/docs/logseq_ast_primer.md +1 -1
- logseq_matryca_parser-1.4.2/metrics/index.json +9 -0
- logseq_matryca_parser-1.4.0/metrics/history.json → logseq_matryca_parser-1.4.2/metrics/quarters/2026-Q2.json +1625 -634
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/pyproject.toml +1 -1
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/src/logseq_matryca_parser/__init__.py +1 -1
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/src/logseq_matryca_parser/agent_press.py +57 -4
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/src/logseq_matryca_parser/agent_writer.py +2 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/src/logseq_matryca_parser/exceptions.py +4 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/src/logseq_matryca_parser/kinetic.py +10 -2
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/src/logseq_matryca_parser/synapse.py +30 -21
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/tests/test_agent_press.py +102 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/tests/test_agent_writer.py +51 -0
- logseq_matryca_parser-1.4.2/tests/test_exceptions.py +62 -0
- logseq_matryca_parser-1.4.2/tests/test_extract_changelog.py +172 -0
- logseq_matryca_parser-1.4.2/tests/test_forge.py +342 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/tests/test_graph.py +76 -1
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/tests/test_kinetic.py +113 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/tests/test_lens.py +30 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/tests/test_logos_parser.py +229 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/tests/test_logseq_markdown.py +39 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/tests/test_logseq_paths.py +47 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/tests/test_synapse.py +87 -1
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/uv.lock +1 -1
- logseq_matryca_parser-1.4.0/docs/GOOD_FIRST_ISSUES.md +0 -77
- logseq_matryca_parser-1.4.0/docs/design-docs/README.md +0 -11
- logseq_matryca_parser-1.4.0/tests/test_forge.py +0 -93
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/.cursorignore +0 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/.cursorrules +0 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/.github/CODEOWNERS +0 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/.github/FUNDING.yml +0 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/.github/dependabot.yml +0 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/.github/labels.yml +0 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/.github/scripts/create_good_first_issues.sh +0 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/.github/workflows/ci.yml +0 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/.github/workflows/daily-metrics.yml +0 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/.github/workflows/github_release.yml +0 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/.github/workflows/pypi_publish.yml +0 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/.gitignore +0 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/.pre-commit-config.yaml +0 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/.repomixignore +0 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/CODE_OF_CONDUCT.md +0 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/LICENSE +0 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/Makefile +0 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/NOTICE +0 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/claude-skill-logseq-read/SKILL.md +0 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/claude-skill-logseq-read/scripts/parse_logseq.py +0 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/docs/RELEASE_PROCESS.md +0 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/docs/design-docs/ARCHITECTURE_BLUEPRINT.md +0 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/docs/design-docs/CODE_SCAFFOLD.md +0 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/docs/design-docs/LOGSEQ_ASSET_RESOLUTION_SPEC.md +0 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/docs/design-docs/LOGSEQ_DATASCRIPT_MAPPING.md +0 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/docs/design-docs/LOGSEQ_TEMPORAL_ONTOLOGY.md +0 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/docs/design-docs/OFFICIAL_MLDOC_SPECS.md +0 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/docs/design-docs/REFERENCE_SPEC.md +0 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/docs/error_log.md +0 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/docs/internal/STATIC_ANALYSIS_POLICY.md +0 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/docs/rfc/OLLAMA_RAG.md +0 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/docs/roadmaps/ROADMAP_AGENT_NATIVE_XRAY.md +0 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/docs/roadmaps/ROADMAP_CLI_HYDRATION_AND_ENRICHMENT.md +0 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/docs/roadmaps/ROADMAP_CONTEXT_SYNTHESIS_AND_SCOPING.md +0 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/docs/roadmaps/ROADMAP_EMBED_EXPANSION_AND_FLUENT_QUERIES.md +0 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/docs/roadmaps/ROADMAP_GRAPH_RAG_SEMANTICS.md +0 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/docs/roadmaps/ROADMAP_HEADLESS_WRITER.md +0 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/docs/roadmaps/ROADMAP_INCREMENTAL_WATCHER.md +0 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/docs/roadmaps/ROADMAP_INLINE_SHIELD_AND_NAMESPACES.md +0 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/docs/roadmaps/ROADMAP_OBSIDIAN_ADAPTER.md +0 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/docs/roadmaps/ROADMAP_ROBUSTNESS_AND_SOFT_BREAKS.md +0 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/docs/roadmaps/ROADMAP_TOML_FIX_AND_PYPI_DISTRIBUTION.md +0 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/docs/roadmaps/ROADMAP_UUID_AND_GRAPH_SUPERPOWERS.md +0 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/examples/demo_logseq_journal.md +0 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/examples/run_demo.py +0 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/legacy/local_digestor.py +0 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/lib/bindings/utils.js +0 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/lib/tom-select/tom-select.complete.min.js +0 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/lib/tom-select/tom-select.css +0 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/lib/vis-9.1.2/vis-network.css +0 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/lib/vis-9.1.2/vis-network.min.js +0 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/repomix-output-parser.xml +0 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/scripts/__init__.py +0 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/scripts/archive_repository_metrics.py +0 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/scripts/debug_pre_release.py +0 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/scripts/extract_changelog.py +0 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/src/logseq_matryca_parser/.gitignore +0 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/src/logseq_matryca_parser/NOTICE +0 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/src/logseq_matryca_parser/__main__.py +0 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/src/logseq_matryca_parser/forge.py +0 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/src/logseq_matryca_parser/graph.py +0 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/src/logseq_matryca_parser/lens.py +0 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/src/logseq_matryca_parser/logos_core.py +0 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/src/logseq_matryca_parser/logos_parser.py +0 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/src/logseq_matryca_parser/logseq_markdown.py +0 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/src/logseq_matryca_parser/logseq_paths.py +0 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/src/logseq_matryca_parser/pyproject.toml +0 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/tests/test_archive_repository_metrics.py +0 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/tests/test_package_version.py +0 -0
- {logseq_matryca_parser-1.4.0 → logseq_matryca_parser-1.4.2}/tests/test_pre_release_roundtrip.py +0 -0
|
@@ -7,6 +7,40 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- **Contributor issues (wave 3)** — Six new issues from local code study ([#59](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/59)–[#64](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/64)): LENS ghost wikilink nodes, corrupt X-Ray state handling, `agent_write` assert guard, and paired good-first tests.
|
|
13
|
+
- **Contributor issues (wave 4)** — Seven issues from Clean Architecture code study ([#65](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/65)–[#71](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/71)): SYNAPSE cyclic embed duplication, unresolved embed semantics, kinetic dead code, graph watcher DIP, English DX messages, OCP embed refactor, and parametrized SYNAPSE tests. Agent rule: [`.cursor/rules/07-clean-architecture-audit.mdc`](.cursor/rules/07-clean-architecture-audit.mdc).
|
|
14
|
+
- **Contributor issues (wave 5)** — [#72](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/72) / [#73](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/73): `append_child_to_node` corrupts Markdown when the source file lacks a trailing newline (agent-write data loss).
|
|
15
|
+
|
|
16
|
+
## [1.4.2] - 2026-06-29
|
|
17
|
+
|
|
18
|
+
### Fixed
|
|
19
|
+
|
|
20
|
+
- **agent-write** — `append_child_to_node` normalizes source files missing a trailing newline before line splice, preventing new bullets from being appended onto the last line ([#72](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/72), [#74](https://github.com/MarcoPorcellato/logseq-matryca-parser/pull/74)).
|
|
21
|
+
- **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](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/65), [#75](https://github.com/MarcoPorcellato/logseq-matryca-parser/pull/75)).
|
|
22
|
+
- **agent-write** — `SessionAliasRegistry.load_from_disk` tolerates empty, malformed, or legacy-wrapped X-Ray JSON; KINETIC exits with a clear message instead of a traceback ([#60](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/60), [#76](https://github.com/MarcoPorcellato/logseq-matryca-parser/pull/76)).
|
|
23
|
+
|
|
24
|
+
### Added
|
|
25
|
+
|
|
26
|
+
- **Test coverage (wave 2)** — Community contribution ([#58](https://github.com/MarcoPorcellato/logseq-matryca-parser/pull/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](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/20), [#43](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/43)–[#52](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/52).
|
|
27
|
+
- **Regression tests** — Seven new cases for newline splice, cyclic page embed, and malformed X-Ray state (issues [#73](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/73), [#65](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/65), [#60](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/60)); suite total **450** pytest.
|
|
28
|
+
|
|
29
|
+
### Changed
|
|
30
|
+
|
|
31
|
+
- **Contributor docs** — [`README.md`](README.md), [`docs/README.md`](docs/README.md), [`CONTRIBUTING.md`](CONTRIBUTING.md), [`SECURITY.md`](SECURITY.md), and [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md) harmonized for **v1.4.2** (test count, supported versions, agent-write / SYNAPSE behavior notes).
|
|
32
|
+
|
|
33
|
+
## [1.4.1] - 2026-06-24
|
|
34
|
+
|
|
35
|
+
### Added
|
|
36
|
+
|
|
37
|
+
- **Test coverage (wave 1)** — Community contribution ([#42](https://github.com/MarcoPorcellato/logseq-matryca-parser/pull/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](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/21)–[#24](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/24), [#27](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/27), [#30](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/30)–[#32](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/32).
|
|
38
|
+
- **Good first issues (wave 2)** — Ten new contributor tasks ([#43](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/43)–[#52](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/52)) indexed as GFI-17–GFI-26 in [`docs/GOOD_FIRST_ISSUES.md`](docs/GOOD_FIRST_ISSUES.md); wave-1 GFI items marked complete.
|
|
39
|
+
|
|
40
|
+
### Changed
|
|
41
|
+
|
|
42
|
+
- **Contributor docs** — [`README.md`](README.md), [`docs/README.md`](docs/README.md), [`CONTRIBUTING.md`](CONTRIBUTING.md), [`SECURITY.md`](SECURITY.md), and [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md) harmonized for **v1.4.1** (test count, issue index range, supported versions).
|
|
43
|
+
|
|
10
44
|
## [1.4.0] - 2026-06-23
|
|
11
45
|
|
|
12
46
|
### Added
|
|
@@ -15,7 +15,7 @@ User-facing behavior is documented in:
|
|
|
15
15
|
- [`README.md`](README.md) — overview, quickstart, and feature matrix
|
|
16
16
|
- [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md) — LOGOS, SYNAPSE, `LogseqGraph`, agents, and data flow
|
|
17
17
|
- [`docs/logseq_ast_primer.md`](docs/logseq_ast_primer.md) — Logseq Spatial Markdown domain rules
|
|
18
|
-
- [`CHANGELOG.md`](CHANGELOG.md) — shipped releases (current: **1.4.
|
|
18
|
+
- [`CHANGELOG.md`](CHANGELOG.md) — shipped releases (current: **1.4.2**) and **Unreleased** changes (Keep a Changelog)
|
|
19
19
|
- [`docs/RELEASE_PROCESS.md`](docs/RELEASE_PROCESS.md) — version bump, tag, and PyPI publish checklist
|
|
20
20
|
- [`docs/CODEQL.md`](docs/CODEQL.md) — CodeQL default setup (no custom `codeql.yml`)
|
|
21
21
|
- [`docs/GOOD_FIRST_ISSUES.md`](docs/GOOD_FIRST_ISSUES.md) — curated starter tasks for new contributors
|
|
@@ -44,7 +44,7 @@ New to the codebase? Start here:
|
|
|
44
44
|
2. **Comment on the issue** so others know you are working on it.
|
|
45
45
|
3. **Set up** with `uv sync --all-extras` and confirm `make all` is green on `main`.
|
|
46
46
|
4. **Branch** using `feat/…`, `test/…`, or `docs/…` naming (see workflow below).
|
|
47
|
-
5. **Submit**
|
|
47
|
+
5. **Submit** one PR per issue, branched from `main` (`Fixes #123`).
|
|
48
48
|
|
|
49
49
|
Tier 1 tasks are **test-only** — no parser changes, ideal for learning `CliRunner` and pytest patterns in `tests/`. Tier 2 is documentation. Tier 3 adds small CLI or FORGE features with explicit acceptance criteria.
|
|
50
50
|
|
|
@@ -124,6 +124,8 @@ CI runs the same commands as your local environment: `uv sync --all-extras`, the
|
|
|
124
124
|
make all
|
|
125
125
|
```
|
|
126
126
|
|
|
127
|
+
As of **v1.4.2**, `make test` runs **450** pytest cases with **≥80%** line coverage on `src/logseq_matryca_parser` (currently ~**91%**). New contributors should mirror patterns in [`docs/GOOD_FIRST_ISSUES.md`](docs/GOOD_FIRST_ISSUES.md) and the module map in that file’s **Test suite** section.
|
|
128
|
+
|
|
127
129
|
Or run each step individually:
|
|
128
130
|
|
|
129
131
|
```bash
|
|
@@ -150,9 +152,9 @@ We follow [Conventional Commits](https://www.conventionalcommits.org/). Your com
|
|
|
150
152
|
|
|
151
153
|
### 6. Submit a Pull Request (PR)
|
|
152
154
|
|
|
153
|
-
- Push your branch and open a PR against the `main` branch.
|
|
155
|
+
- Push your branch and open a PR against the `main` branch (**one issue per PR**).
|
|
154
156
|
- Describe why the change is needed.
|
|
155
|
-
- Link the relevant Issue (e.g., `Fixes #123`).
|
|
157
|
+
- Link the relevant Issue (e.g., `Fixes #123`). **One issue per PR** — do not stack multiple issues on a single branch.
|
|
156
158
|
- Ensure all GitHub Actions (CI) checks pass.
|
|
157
159
|
|
|
158
160
|
---
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: logseq-matryca-parser
|
|
3
|
-
Version: 1.4.
|
|
3
|
+
Version: 1.4.2
|
|
4
4
|
Summary: The Logos Protocol: Deterministic Logseq AST parsing for Matryca.ai.
|
|
5
5
|
Project-URL: Homepage, https://github.com/MarcoPorcellato/logseq-matryca-parser
|
|
6
6
|
Project-URL: Repository, https://github.com/MarcoPorcellato/logseq-matryca-parser
|
|
@@ -53,7 +53,7 @@ Description-Content-Type: text/markdown
|
|
|
53
53
|
[](#)
|
|
54
54
|

|
|
55
55
|
|
|
56
|
-
**v1.4.
|
|
56
|
+
**v1.4.2** — Bugfix patch: agent-write splice safety, SYNAPSE cyclic embed truncation, resilient X-Ray state reload ([#72](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/72), [#65](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/65), [#60](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/60)). **450 tests** (wave 1 + wave 2 + regression suite). See [CHANGELOG](CHANGELOG.md).
|
|
57
57
|
|
|
58
58
|
> *Turning a forest of local plain-text files into a unified semantic powerhouse.*
|
|
59
59
|
|
|
@@ -147,6 +147,30 @@ Logseq Matryca Parser is a deterministic **Stack-Machine engine** that acts as t
|
|
|
147
147
|
|
|
148
148
|
---
|
|
149
149
|
|
|
150
|
+
## ⚡ Release highlights (v1.4.2)
|
|
151
|
+
|
|
152
|
+
Patch release — agent-write and SYNAPSE correctness fixes. **No intentional breaking changes** to public APIs.
|
|
153
|
+
|
|
154
|
+
| Area | Change |
|
|
155
|
+
| :--- | :--- |
|
|
156
|
+
| **agent-write** | Headless splice normalizes files missing a final newline; corrupt `.matryca_xray_state.json` yields a controlled CLI exit ([#72](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/72), [#60](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/60)). |
|
|
157
|
+
| **SYNAPSE RAG** | Cyclic `{{embed [[Page]]}}` chains truncate at the re-entrant edge without duplicating parent literal text ([#65](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/65)). |
|
|
158
|
+
| **Test suite** | **450** pytest cases (**+72** vs v1.4.1): wave 2 community coverage ([#58](https://github.com/MarcoPorcellato/logseq-matryca-parser/pull/58)) plus regression tests for the three fixes. |
|
|
159
|
+
|
|
160
|
+
---
|
|
161
|
+
|
|
162
|
+
## ⚡ Release highlights (v1.4.1)
|
|
163
|
+
|
|
164
|
+
Patch release — contributor test coverage and onboarding refresh. **No intentional changes** to parser, graph, or CLI runtime behavior.
|
|
165
|
+
|
|
166
|
+
| Area | Change |
|
|
167
|
+
| :--- | :--- |
|
|
168
|
+
| **Test suite** | **378** pytest cases (**+107** vs v1.4.0): `normalize_logseq_timestamp`, `clean_node_content`, `logseq_paths` fallbacks, exception hierarchy, `extract_changelog` script, KINETIC `--help`, `agent-read --query`, direct `ObsidianForgeVisitor` tests ([#42](https://github.com/MarcoPorcellato/logseq-matryca-parser/pull/42)). |
|
|
169
|
+
| **New test modules** | `tests/test_exceptions.py`, `tests/test_extract_changelog.py`. |
|
|
170
|
+
| **Contributor index** | [`docs/GOOD_FIRST_ISSUES.md`](docs/GOOD_FIRST_ISSUES.md) wave 2 ([#43](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/43)–[#52](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/52)); wave-1 items marked complete. |
|
|
171
|
+
|
|
172
|
+
---
|
|
173
|
+
|
|
150
174
|
## ⚡ Release highlights (v1.4.0)
|
|
151
175
|
|
|
152
176
|
Minor release — graph integrity, export hygiene, and parser hardening from the local static-analysis bug hunt (waves 1–8). No intentional breaking changes to default parse behavior.
|
|
@@ -361,7 +385,7 @@ Marker syntax (`[#A]`, `SCHEDULED: <...>`, `DEADLINE: <...>`) is stripped from `
|
|
|
361
385
|
## 🛠️ Quickstart
|
|
362
386
|
|
|
363
387
|
```bash
|
|
364
|
-
# Install from PyPI (latest: v1.4.
|
|
388
|
+
# Install from PyPI (latest: v1.4.2)
|
|
365
389
|
uv pip install logseq-matryca-parser
|
|
366
390
|
|
|
367
391
|
# Optional: filesystem watcher for live incremental graph updates
|
|
@@ -458,7 +482,7 @@ We welcome issues, pull requests, and constructive feedback.
|
|
|
458
482
|
|
|
459
483
|
| Resource | Link |
|
|
460
484
|
| :--- | :--- |
|
|
461
|
-
| **Good first issues** | [docs/GOOD_FIRST_ISSUES.md](docs/GOOD_FIRST_ISSUES.md) — starter tasks ([#19](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/19)–[#
|
|
485
|
+
| **Good first issues** | [docs/GOOD_FIRST_ISSUES.md](docs/GOOD_FIRST_ISSUES.md) — starter tasks ([#19](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/19)–[#52](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/52)) |
|
|
462
486
|
| **Contributing** | [CONTRIBUTING.md](CONTRIBUTING.md) — setup, tests, PR workflow |
|
|
463
487
|
| **Cookbook** | [docs/COOKBOOK.md](docs/COOKBOOK.md) — integration recipes (Synapse, graph query, watcher) |
|
|
464
488
|
| **Documentation index** | [docs/README.md](docs/README.md) — active vs historical docs |
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
[](#)
|
|
13
13
|

|
|
14
14
|
|
|
15
|
-
**v1.4.
|
|
15
|
+
**v1.4.2** — Bugfix patch: agent-write splice safety, SYNAPSE cyclic embed truncation, resilient X-Ray state reload ([#72](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/72), [#65](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/65), [#60](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/60)). **450 tests** (wave 1 + wave 2 + regression suite). See [CHANGELOG](CHANGELOG.md).
|
|
16
16
|
|
|
17
17
|
> *Turning a forest of local plain-text files into a unified semantic powerhouse.*
|
|
18
18
|
|
|
@@ -106,6 +106,30 @@ Logseq Matryca Parser is a deterministic **Stack-Machine engine** that acts as t
|
|
|
106
106
|
|
|
107
107
|
---
|
|
108
108
|
|
|
109
|
+
## ⚡ Release highlights (v1.4.2)
|
|
110
|
+
|
|
111
|
+
Patch release — agent-write and SYNAPSE correctness fixes. **No intentional breaking changes** to public APIs.
|
|
112
|
+
|
|
113
|
+
| Area | Change |
|
|
114
|
+
| :--- | :--- |
|
|
115
|
+
| **agent-write** | Headless splice normalizes files missing a final newline; corrupt `.matryca_xray_state.json` yields a controlled CLI exit ([#72](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/72), [#60](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/60)). |
|
|
116
|
+
| **SYNAPSE RAG** | Cyclic `{{embed [[Page]]}}` chains truncate at the re-entrant edge without duplicating parent literal text ([#65](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/65)). |
|
|
117
|
+
| **Test suite** | **450** pytest cases (**+72** vs v1.4.1): wave 2 community coverage ([#58](https://github.com/MarcoPorcellato/logseq-matryca-parser/pull/58)) plus regression tests for the three fixes. |
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## ⚡ Release highlights (v1.4.1)
|
|
122
|
+
|
|
123
|
+
Patch release — contributor test coverage and onboarding refresh. **No intentional changes** to parser, graph, or CLI runtime behavior.
|
|
124
|
+
|
|
125
|
+
| Area | Change |
|
|
126
|
+
| :--- | :--- |
|
|
127
|
+
| **Test suite** | **378** pytest cases (**+107** vs v1.4.0): `normalize_logseq_timestamp`, `clean_node_content`, `logseq_paths` fallbacks, exception hierarchy, `extract_changelog` script, KINETIC `--help`, `agent-read --query`, direct `ObsidianForgeVisitor` tests ([#42](https://github.com/MarcoPorcellato/logseq-matryca-parser/pull/42)). |
|
|
128
|
+
| **New test modules** | `tests/test_exceptions.py`, `tests/test_extract_changelog.py`. |
|
|
129
|
+
| **Contributor index** | [`docs/GOOD_FIRST_ISSUES.md`](docs/GOOD_FIRST_ISSUES.md) wave 2 ([#43](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/43)–[#52](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/52)); wave-1 items marked complete. |
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
109
133
|
## ⚡ Release highlights (v1.4.0)
|
|
110
134
|
|
|
111
135
|
Minor release — graph integrity, export hygiene, and parser hardening from the local static-analysis bug hunt (waves 1–8). No intentional breaking changes to default parse behavior.
|
|
@@ -320,7 +344,7 @@ Marker syntax (`[#A]`, `SCHEDULED: <...>`, `DEADLINE: <...>`) is stripped from `
|
|
|
320
344
|
## 🛠️ Quickstart
|
|
321
345
|
|
|
322
346
|
```bash
|
|
323
|
-
# Install from PyPI (latest: v1.4.
|
|
347
|
+
# Install from PyPI (latest: v1.4.2)
|
|
324
348
|
uv pip install logseq-matryca-parser
|
|
325
349
|
|
|
326
350
|
# Optional: filesystem watcher for live incremental graph updates
|
|
@@ -417,7 +441,7 @@ We welcome issues, pull requests, and constructive feedback.
|
|
|
417
441
|
|
|
418
442
|
| Resource | Link |
|
|
419
443
|
| :--- | :--- |
|
|
420
|
-
| **Good first issues** | [docs/GOOD_FIRST_ISSUES.md](docs/GOOD_FIRST_ISSUES.md) — starter tasks ([#19](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/19)–[#
|
|
444
|
+
| **Good first issues** | [docs/GOOD_FIRST_ISSUES.md](docs/GOOD_FIRST_ISSUES.md) — starter tasks ([#19](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/19)–[#52](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/52)) |
|
|
421
445
|
| **Contributing** | [CONTRIBUTING.md](CONTRIBUTING.md) — setup, tests, PR workflow |
|
|
422
446
|
| **Cookbook** | [docs/COOKBOOK.md](docs/COOKBOOK.md) — integration recipes (Synapse, graph query, watcher) |
|
|
423
447
|
| **Documentation index** | [docs/README.md](docs/README.md) — active vs historical docs |
|
|
@@ -6,8 +6,8 @@ Security fixes are provided **only for the latest released version** on [PyPI](h
|
|
|
6
6
|
|
|
7
7
|
| Version | Supported |
|
|
8
8
|
| ------- | --------- |
|
|
9
|
-
| **1.4.
|
|
10
|
-
|
|
|
9
|
+
| **1.4.2** (latest) | Yes |
|
|
10
|
+
| 1.4.1 and older | No |
|
|
11
11
|
|
|
12
12
|
We recommend always running the current release and upgrading promptly when a security advisory is published.
|
|
13
13
|
|
|
@@ -270,7 +270,7 @@ Beyond flat `Document` emission, **`to_context_enriched_chunks`** targets **vect
|
|
|
270
270
|
|
|
271
271
|
1. **Breadcrumbs.** [`_build_breadcrumbs`](../src/logseq_matryca_parser/synapse.py) walks the owning `LogseqPage` and the node’s UUID `path` so the chunk’s visible text carries **human-readable lineage** (page title + ancestor outline), not just an opaque `parent_id`.
|
|
272
272
|
|
|
273
|
-
2. **Recursive macro / embed expansion.** [`_expand_macros_and_embeds`](../src/logseq_matryca_parser/synapse.py) operates on **`node.content`** (not `clean_text`) so tokens hidden from embeddings—such as `((uuid))` inside `{{embed ((uuid))}}`—remain visible to the scanner. It expands **`{{embed ((uuid))}}`** by inlining the target block’s content (with **per-UUID cycle detection**) and **`{{embed [[Page]]}}`** by inlining page bodies via **`LogseqGraph.get_page`** (case-insensitive, with **per-title
|
|
273
|
+
2. **Recursive macro / embed expansion.** [`_expand_macros_and_embeds`](../src/logseq_matryca_parser/synapse.py) operates on **`node.content`** (not `clean_text`) so tokens hidden from embeddings—such as `((uuid))` inside `{{embed ((uuid))}}`—remain visible to the scanner. It expands **`{{embed ((uuid))}}`** by inlining the target block’s content (with **per-UUID cycle detection**) and **`{{embed [[Page]]}}`** by inlining page bodies via **`LogseqGraph.get_page`** (case-insensitive, with **per-title embed-chain detection** — the host page title seeds an immutable chain so inter-page cycles truncate at the re-entrant edge instead of re-inlining parent literals). Unresolved embed targets yield **empty replacement** instead of hanging the export pipeline (v1.4.0).
|
|
274
274
|
|
|
275
275
|
3. **Org-mode-style property inheritance.** Metadata includes **`effective_properties`**: the merge produced by [`LogseqGraph.get_effective_properties`](../src/logseq_matryca_parser/graph.py) — **page frontmatter first**, then each ancestor on `node.path` **top-down**, with deeper `LogseqNode.properties` **overriding** shallower keys. Downstream filters can therefore key off inherited `type::`, `status::`, etc., without re-walking the outline at query time.
|
|
276
276
|
|
|
@@ -288,7 +288,7 @@ In the **LLM OS** metaphor, **LOGOS** is the **read path** into the hierarchical
|
|
|
288
288
|
|
|
289
289
|
1. **Weekly append sandbox (`logseq_agent_write`).** A **deterministic**, **configuration-aware** channel that **dynamically reads `config.edn`** (for example **`:journal/page-title-format`**) so filenames and titles align with the vault’s own conventions. Writes use **`open(..., mode="a")`** **append-only** I/O — agents **append** new block material **after** existing bytes; they do **not** rewrite, merge, or re-indent prior content. Surfaced through the **`append`** command in **KINETIC**.
|
|
290
290
|
|
|
291
|
-
2. **Headless Markdown splicer (`append_child_to_node`).** For **in-place graph mutation** under an existing parent block, the engine resolves `target_uuid` via `LogseqGraph.get_node_by_uuid`, walks to the **deepest last descendant** to obtain a **1-based `line_end` insertion index**, and computes child indentation as **`(target_node.indent_level + 1) × graph.tab_size`** spaces before the `- {content}` bullet prefix. The raw file is split into lines, the new row is inserted at that index, and the result is flushed through a **same-directory `tempfile.mkstemp` + `os.replace`** — an atomic swap that avoids torn reads during concurrent tooling. **KINETIC** exposes this as **`matryca-parse agent-write`**, resolving parent blocks by **`--alias`** (from the X-Ray state file) or **`--target-uuid`**.
|
|
291
|
+
2. **Headless Markdown splicer (`append_child_to_node`).** For **in-place graph mutation** under an existing parent block, the engine resolves `target_uuid` via `LogseqGraph.get_node_by_uuid`, walks to the **deepest last descendant** to obtain a **1-based `line_end` insertion index**, and computes child indentation as **`(target_node.indent_level + 1) × graph.tab_size`** spaces before the `- {content}` bullet prefix. The raw file is split into lines (normalizing a missing final newline first so the last logical row is not concatenated with the splice), the new row is inserted at that index, and the result is flushed through a **same-directory `tempfile.mkstemp` + `os.replace`** — an atomic swap that avoids torn reads during concurrent tooling. **KINETIC** exposes this as **`matryca-parse agent-write`**, resolving parent blocks by **`--alias`** (from the X-Ray state file) or **`--target-uuid`**.
|
|
292
292
|
|
|
293
293
|
Both paths keep **existing topology intact** relative to their contract: append-only journaling never truncates prior bytes; the splicer only inserts one new child line at an AST-derived coordinate so a subsequent **LOGOS** parse remains deterministic.
|
|
294
294
|
|
|
@@ -374,7 +374,7 @@ Human-facing RAG (SYNAPSE enriched chunks, breadcrumbs, inherited properties) op
|
|
|
374
374
|
|
|
375
375
|
#### Stateful session registry (`.matryca_xray_state.json`)
|
|
376
376
|
|
|
377
|
-
X-Ray is designed for **stateless LLM toolchains**: each `agent-read` invocation is a fresh process, yet agents must still **write back** to blocks they only saw as `[n]` tokens. After **`generate_aliases`**, **KINETIC** persists the alias map to **`<graph_root>/.matryca_xray_state.json`** via **`SessionAliasRegistry.save_to_disk`**. A later **`matryca-parse agent-write --alias N`** loads that JSON with **`load_from_disk`**, resolves `N → uuid`, and hands off to **`append_child_to_node`**. The read/write pair therefore composes as **two independent CLI exits** without stuffing UUIDs into the model context — the filesystem holds session continuity.
|
|
377
|
+
X-Ray is designed for **stateless LLM toolchains**: each `agent-read` invocation is a fresh process, yet agents must still **write back** to blocks they only saw as `[n]` tokens. After **`generate_aliases`**, **KINETIC** persists the alias map to **`<graph_root>/.matryca_xray_state.json`** via **`SessionAliasRegistry.save_to_disk`**. A later **`matryca-parse agent-write --alias N`** loads that JSON with **`load_from_disk`**, resolves `N → uuid`, and hands off to **`append_child_to_node`**. Malformed or empty state files yield a controlled CLI exit (empty registry for whitespace-only files; **`SessionAliasRegistryError`** for invalid JSON) rather than an uncaught traceback. The read/write pair therefore composes as **two independent CLI exits** without stuffing UUIDs into the model context — the filesystem holds session continuity.
|
|
378
378
|
|
|
379
379
|
#### Session alias mechanics (`SessionAliasRegistry`)
|
|
380
380
|
|
|
@@ -557,7 +557,11 @@ Recursive and character-budget chunkers assume **approximately flat prose**. Log
|
|
|
557
557
|
| :--- | :--- |
|
|
558
558
|
| [`logseq_ast_primer.md`](logseq_ast_primer.md) | Before touching parser or serialization behavior |
|
|
559
559
|
| [`COOKBOOK.md`](COOKBOOK.md) | Integration examples (Synapse, `LogseqGraph`, watcher) |
|
|
560
|
-
| [`GOOD_FIRST_ISSUES.md`](GOOD_FIRST_ISSUES.md) | Picking a first PR ([#19](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/19)–[#
|
|
561
|
-
| [`README.md`](README.md) |
|
|
562
|
-
| [`../CONTRIBUTING.md`](../CONTRIBUTING.md) | `uv` setup, `make all
|
|
560
|
+
| [`GOOD_FIRST_ISSUES.md`](GOOD_FIRST_ISSUES.md) | Picking a first PR ([#19](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/19)–[#52](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/52)); wave 1 tests landed in **v1.4.1**, wave 2 + bugfix regressions in **v1.4.2** |
|
|
561
|
+
| [`README.md`](README.md) | Project overview and quickstart |
|
|
562
|
+
| [`../CONTRIBUTING.md`](../CONTRIBUTING.md) | `uv` setup, `make all` (**450** pytest, ~**91%** coverage), PR checklist |
|
|
563
563
|
| [`design-docs/README.md`](design-docs/README.md) | Warning before using historical DDD blueprints |
|
|
564
|
+
|
|
565
|
+
### Quality gate (v1.4.2)
|
|
566
|
+
|
|
567
|
+
Local and CI parity: `uv sync --all-extras` → `make lint` → `make check` → `make test`. The test gate enforces **≥80%** coverage on `src/logseq_matryca_parser` with **450** pytest cases as of **v1.4.2** (community wave 2 via [#58](https://github.com/MarcoPorcellato/logseq-matryca-parser/pull/58) plus agent-write / SYNAPSE regression tests). Dedicated modules: `tests/test_exceptions.py`, `tests/test_extract_changelog.py` — see [`GOOD_FIRST_ISSUES.md`](GOOD_FIRST_ISSUES.md) § Test suite.
|
|
@@ -5,7 +5,9 @@
|
|
|
5
5
|
**Strumenti:** analisi statica locale (graph-based), `make all`, `scripts/debug_pre_release.py`, probe Python ad hoc
|
|
6
6
|
**Riferimenti architetturali:** [Clean Architecture](https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html) (R. C. Martin), [`ARCHITECTURE.md`](ARCHITECTURE.md)
|
|
7
7
|
|
|
8
|
-
> **Stato risoluzione (2026-06-23):** tutti i **BUG-001…031** e le limitazioni **LIM-001/002** sono stati affrontati nel codice (vedi `CHANGELOG.md`
|
|
8
|
+
> **Stato risoluzione (2026-06-23):** tutti i **BUG-001…031** e le limitazioni **LIM-001/002** sono stati affrontati nel codice (vedi `CHANGELOG.md` **v1.4.0**). **DEBT-001** (`iter_canonical_pages`, `page_for_node`) è implementato; debito architetturale residuo (SRP su `kinetic.py`, OCP embed strategy) resta backlog non bloccante.
|
|
9
|
+
>
|
|
10
|
+
> **Aggiornamento test (2026-06-24, v1.4.1):** GFI-04 (`logseq_paths` fallback), GFI-14 (`normalize_logseq_timestamp`), GFI-03/05/06/09/12/13 e suite totale **378** pytest — vedi `CHANGELOG.md` **v1.4.1**.
|
|
9
11
|
|
|
10
12
|
---
|
|
11
13
|
|
|
@@ -13,8 +15,8 @@
|
|
|
13
15
|
|
|
14
16
|
| Metrica | Esito |
|
|
15
17
|
| :--- | :--- |
|
|
16
|
-
| `make all` (Ruff + Mypy +
|
|
17
|
-
| Coverage | **
|
|
18
|
+
| `make all` (Ruff + Mypy + 378 pytest) | **PASS** |
|
|
19
|
+
| Coverage | **90.18%** (soglia 80%; **378** pytest, v1.4.1) |
|
|
18
20
|
| Round-trip corpus (`debug_pre_release.py`) | **19/19 OK** |
|
|
19
21
|
| analisi statica `check` (cicli IMPORTS) | **0 cicli** |
|
|
20
22
|
| analisi statica index | `logseq-matryca-parser` — 1074 embeddings, commit `7d3f77b` |
|
|
@@ -35,6 +37,10 @@ Nonostante la suite verde, l’analisi guidata da analisi statica e da probe run
|
|
|
35
37
|
|
|
36
38
|
**Wave 8 (2026-06-23):** +6 bug via analisi statica `query(resolve_relative_page_link)`, `query(agent_press)`, probe backlink/namespace/tag case, `_export_json`, `resolve_asset_path` — chiusura mappatura moduli core.
|
|
37
39
|
|
|
40
|
+
**Wave 9–10 (2026-06-29):** issue GitHub [#59](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/59)–[#71](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/71) — LENS ghost wikilinks, X-Ray state corrupto, SYNAPSE cyclic embed / unresolved semantics, kinetic dead code, watcher DIP, DX inglese, OCP embed refactor. Vedi `CHANGELOG.md` [Unreleased].
|
|
41
|
+
|
|
42
|
+
**Wave 11 (2026-06-29):** [#72](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/72) — `append_child_to_node` corrompe il Markdown quando l'ultima riga del file sorgente **non** termina con `\n` (splice sulla stessa riga → outline corrotto dopo `agent-write`). Probe: `impact(append_child_to_node)` → CLI `agent_write`. Paired test issue [#73](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/73).
|
|
43
|
+
|
|
38
44
|
---
|
|
39
45
|
|
|
40
46
|
## 2. Metodologia (Clean Architecture lens)
|
|
@@ -855,7 +861,7 @@ page_title_to_relative_path('') → PosixPath('untitled.md')
|
|
|
855
861
|
write_logseq_page(page, dest) → scrive su pages/untitled.md (non crash)
|
|
856
862
|
```
|
|
857
863
|
|
|
858
|
-
Comportamento diverso dalla nota precedente (non più `Errno 21` su path vuoto grazie al fallback `untitled.md`). Resta ambiguo per vault reali. Copertura
|
|
864
|
+
Comportamento diverso dalla nota precedente (non più `Errno 21` su path vuoto grazie al fallback `untitled.md`). Resta ambiguo per vault reali. **Copertura:** GFI-04 chiuso in **v1.4.1** (`tests/test_logseq_paths.py`).
|
|
859
865
|
|
|
860
866
|
---
|
|
861
867
|
|
|
@@ -871,7 +877,7 @@ Valutazione secondo i principi di R. C. Martin, senza implicare che il codice si
|
|
|
871
877
|
| **ISP** | Adapter SYNAPSE accede a `graph._page_for_node` (privato) | `synapse.py` L222 | Esporre `graph.page_for_node()` pubblico o protocol `GraphLookup`. |
|
|
872
878
|
| **DIP** | Import lazy `logseq_paths` dentro metodo entity | `logos_core.py` L144 | Accettabile per evitare cicli; alternativa: spostare `resolve_asset_path` in use case layer. |
|
|
873
879
|
| **Boundaries** | `assert bm is not None` in produzione | `synapse.py` L171, L190 | Sostituire con guard espliciti (Clean Code: fail fast leggibile, no assert in `-O`). |
|
|
874
|
-
| **Error handling** | `except ValueError: pass` in normalizzazione timestamp | `logos_parser.py` L500 | Accettabile come fallback chain;
|
|
880
|
+
| **Error handling** | `except ValueError: pass` in normalizzazione timestamp | `logos_parser.py` L500 | Accettabile come fallback chain; **GFI-14 chiuso in v1.4.1** (`tests/test_logos_parser.py`). |
|
|
875
881
|
| **ISP / encapsulation** | Consumer iterano `graph.pages.values()` raw | `kinetic.py`, `graph.py` | `iter_canonical_pages()` — DEBT-001; radice di BUG-002/006/007. |
|
|
876
882
|
| **Use case completeness** | Nessun ramo *delete* in invalidazione incrementale | `graph.py` L641 | BUG-005; watcher senza delete/move — BUG-014 |
|
|
877
883
|
|
|
@@ -895,7 +901,7 @@ Linee non coperte con **alto rischio funzionale** (non solo numeri):
|
|
|
895
901
|
| `logseq_markdown.py` | round-trip 4-space indent | **Alto** — BUG-021 |
|
|
896
902
|
| `graph.py` | ghost nodes in search/query/agent-read | **Alto** — BUG-022 (con BUG-010) |
|
|
897
903
|
| `kinetic.py` | `_export_langchain_enriched` alias dupes | **Alto** — BUG-006 |
|
|
898
|
-
| `logseq_paths.py` | titolo vuoto, fallback graph root | **
|
|
904
|
+
| `logseq_paths.py` | titolo vuoto, fallback graph root | **Risolto (v1.4.1)** — GFI-04 |
|
|
899
905
|
|
|
900
906
|
---
|
|
901
907
|
|
|
@@ -919,7 +925,7 @@ Linee non coperte con **alto rischio funzionale** (non solo numeri):
|
|
|
919
925
|
| P3 | BUG-004 | Decisione ISO vs `%W` + doc/test | 1 h |
|
|
920
926
|
| P4 | BUG-008, BUG-009, BUG-015, BUG-018–020, BUG-024–025, BUG-028–031 | case/`#`/namespace; export dup; asset path | backlog |
|
|
921
927
|
| P5 | Debito | `graph.page_for_node` pubblico; rimuovere `assert` | 2 h |
|
|
922
|
-
| P6 | Coverage | Chiudere GFI-01, GFI-02
|
|
928
|
+
| P6 | Coverage | Chiudere GFI-01, GFI-02; wave 2 ([#43](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/43)–[#52](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/52)) | backlog |
|
|
923
929
|
|
|
924
930
|
Dopo ogni fix: `make all` + `refresh dell'indice locale` + `impact` sul simbolo modificato.
|
|
925
931
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# CodeQL code scanning
|
|
2
2
|
|
|
3
|
-
**Logseq Matryca Parser** (v1.4.
|
|
3
|
+
**Logseq Matryca Parser** (v1.4.2+) uses **GitHub CodeQL default setup** for static analysis (SAST) on Python.
|
|
4
4
|
|
|
5
5
|
## Why there is no `codeql.yml` workflow
|
|
6
6
|
|
|
@@ -127,7 +127,28 @@ if broken:
|
|
|
127
127
|
print("broken ref in", node.clean_text)
|
|
128
128
|
```
|
|
129
129
|
|
|
130
|
-
**CLI tip:** run `matryca-parse export` after `load_directory` — KINETIC scans canonical pages internally (v1.4.0).
|
|
130
|
+
**CLI tip:** run `matryca-parse export` after `load_directory` — KINETIC scans canonical pages internally (since v1.4.0).
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
## Recipe 6 — Contributor test patterns
|
|
135
|
+
|
|
136
|
+
Pick a scoped task from [`GOOD_FIRST_ISSUES.md`](GOOD_FIRST_ISSUES.md) (wave 2: [#43](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/43)–[#52](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/52)), then mirror nearby tests:
|
|
137
|
+
|
|
138
|
+
```bash
|
|
139
|
+
uv sync --all-extras
|
|
140
|
+
make all # 378 pytest cases, ≥80% coverage gate
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
| Pattern | Example module | Test file |
|
|
144
|
+
| :--- | :--- | :--- |
|
|
145
|
+
| Pure helper | `normalize_logseq_timestamp` | `tests/test_logos_parser.py` |
|
|
146
|
+
| CLI `--help` / errors | `kinetic.py` | `tests/test_kinetic.py` |
|
|
147
|
+
| FORGE visitor | `ObsidianForgeVisitor` | `tests/test_forge.py` |
|
|
148
|
+
| Release script | `scripts/extract_changelog.py` | `tests/test_extract_changelog.py` |
|
|
149
|
+
| Exception hierarchy | `exceptions.py` | `tests/test_exceptions.py` |
|
|
150
|
+
|
|
151
|
+
Test-only PRs should not change runtime behavior — update `CHANGELOG.md` under `[Unreleased]` only when user-visible behavior changes.
|
|
131
152
|
|
|
132
153
|
---
|
|
133
154
|
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
# Good First Issues
|
|
2
|
+
|
|
3
|
+
Welcome! These tasks are scoped for a **first pull request** — mostly tests and documentation, with a few small CLI/FORGE features. Each has clear acceptance criteria and avoids changes to `logos_core.py` without prior design discussion.
|
|
4
|
+
|
|
5
|
+
**Before you start:**
|
|
6
|
+
|
|
7
|
+
1. Read [`CONTRIBUTING.md`](../CONTRIBUTING.md), [`ARCHITECTURE.md`](ARCHITECTURE.md) (skim the module map), and [`logseq_ast_primer.md`](logseq_ast_primer.md) if you touch parsing.
|
|
8
|
+
2. Run `uv sync --all-extras` then `make all` to confirm a green baseline.
|
|
9
|
+
3. Comment on the GitHub issue you want to claim so we avoid duplicate work.
|
|
10
|
+
4. Open **one PR per issue**, branched from `main` (`Fixes #NNN`).
|
|
11
|
+
|
|
12
|
+
Integrators may prefer [`COOKBOOK.md`](COOKBOOK.md) for copy-paste recipes before picking a code task.
|
|
13
|
+
|
|
14
|
+
Filter open good-first issues on GitHub: [good first issue label](https://github.com/MarcoPorcellato/logseq-matryca-parser/labels/good%20first%20issue).
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## Tier 1 — Tests only (~1–3 hours)
|
|
19
|
+
|
|
20
|
+
Ideal first PR: no production code changes, copy patterns from nearby tests.
|
|
21
|
+
|
|
22
|
+
| ID | Title | Skills | Issue |
|
|
23
|
+
| :--- | :--- | :--- | :--- |
|
|
24
|
+
| GFI-01 | `test(kinetic): add CLI error-path coverage for missing graph and optional deps` | pytest, Typer | [#19](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/19) |
|
|
25
|
+
| GFI-02 | `test(kinetic): cover agent-write validation errors` | pytest, CLI | [#20](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/20) ✅ |
|
|
26
|
+
| GFI-03 | `test: add dedicated tests for exception hierarchy` | pytest | [#21](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/21) ✅ |
|
|
27
|
+
| GFI-04 | `test(logseq_paths): cover empty title and fallback graph-root derivation` | pytest | [#22](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/22) ✅ |
|
|
28
|
+
| GFI-05 | `test: add unit tests for extract_changelog release helper` | pytest | [#23](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/23) ✅ |
|
|
29
|
+
| GFI-06 | `test(agent): add CLI test for agent-read --query filter` | pytest, CLI | [#24](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/24) ✅ |
|
|
30
|
+
| GFI-17 | `test(logseq_markdown): unit tests for detect_tab_size_from_markdown` | pytest | [#43](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/43) ✅ |
|
|
31
|
+
| GFI-18 | `test(synapse): table-driven tests for _strip_markdown_for_embedding` | pytest | [#44](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/44) ✅ |
|
|
32
|
+
| GFI-19 | `test(graph): unit tests for _normalize_relative_link_target helper` | pytest | [#45](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/45) ✅ |
|
|
33
|
+
| GFI-20 | `test(extract_changelog): cover main() CLI exit codes and stdout` | pytest | [#47](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/47) ✅ |
|
|
34
|
+
| GFI-21 | `test(agent_writer): cover LogseqConfigReader format_timestamp and config fallback` | pytest, CLI | [#48](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/48) ✅ |
|
|
35
|
+
| GFI-22 | `test(lens): classify journal and project nodes in GraphVisualizer` | pytest | [#49](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/49) ✅ |
|
|
36
|
+
| GFI-23 | `test(graph): unit tests for backlink alias token helpers` | pytest | [#50](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/50) ✅ |
|
|
37
|
+
| GFI-24 | `test(synapse): direct build_synapse_metadata schema coverage` | pytest | [#51](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/51) ✅ |
|
|
38
|
+
| GFI-27 | `test(lens): regression test for unresolved wikilink ghost nodes` | pytest | [#62](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/62) |
|
|
39
|
+
| GFI-28 | `test(agent_press): cover malformed SessionAliasRegistry JSON on load` | pytest, CLI | [#63](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/63) |
|
|
40
|
+
| GFI-31 | `test(synapse): table-driven embed expansion edge cases` | pytest | [#71](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/71) |
|
|
41
|
+
| GFI-34 | `test(agent_writer): append_child without trailing source newline` | pytest, CLI | [#73](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/73) |
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## Tier 2 — Documentation & DX (~2–4 hours)
|
|
46
|
+
|
|
47
|
+
| ID | Title | Skills | Issue |
|
|
48
|
+
| :--- | :--- | :--- | :--- |
|
|
49
|
+
| GFI-07 | `docs: add examples cookbook for common integration recipes` | Markdown, Python snippets | [#25](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/25) *(initial [`COOKBOOK.md`](COOKBOOK.md) landed — extend or polish)* |
|
|
50
|
+
| GFI-08 | `docs: add docs/README.md index warning about historical design-docs` | Markdown | [#26](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/26) *(index exists — verify links and `design-docs/README.md`)* |
|
|
51
|
+
| GFI-09 | `test(kinetic): assert per-command --help renders without error` | pytest, Typer | [#27](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/27) ✅ |
|
|
52
|
+
| GFI-10 | `docs(examples): translate run_demo.py comments to English and align with package imports` | Python, docs | [#28](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/28) *(done in repo — close if satisfied)* |
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## Tier 3 — Small bounded features (~3–6 hours)
|
|
57
|
+
|
|
58
|
+
| ID | Title | Skills | Issue |
|
|
59
|
+
| :--- | :--- | :--- | :--- |
|
|
60
|
+
| GFI-11 | `feat(cli): add scan --broken-refs flag using LogseqGraph.get_broken_references()` | Typer, graph API | [#29](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/29) |
|
|
61
|
+
| GFI-12 | `test(forge): add direct ObsidianForgeVisitor visitor tests` | pytest, FORGE | [#30](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/30) ✅ |
|
|
62
|
+
| GFI-13 | `test(parser): table-driven tests for clean_node_content helper` | pytest | [#31](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/31) ✅ |
|
|
63
|
+
| GFI-14 | `test(parser): unit tests for normalize_logseq_timestamp edge inputs` | pytest | [#32](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/32) ✅ |
|
|
64
|
+
| GFI-25 | `test(forge): direct MarkdownForgeVisitor property and id filtering` | pytest, FORGE | [#46](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/46) ✅ |
|
|
65
|
+
| GFI-26 | `test(forge): direct JSONForgeVisitor nested stack behavior` | pytest, FORGE | [#52](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/52) ✅ |
|
|
66
|
+
| GFI-29 | `fix(lens): skip ghost page nodes for unresolved wikilinks` | pytest, LENS | [#59](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/59) |
|
|
67
|
+
| GFI-30 | `fix(agent): handle corrupt X-Ray state files without crashing agent-write` | pytest, CLI | [#60](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/60) |
|
|
68
|
+
| GFI-32 | `chore(synapse): replace Italian ImportError strings with English DX messages` | docs, SYNAPSE | [#69](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/69) |
|
|
69
|
+
| GFI-35 | `fix(agent_writer): append_child corrupts files missing trailing newline` | pytest, CLI | [#72](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/72) |
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## Mentor issues (slightly larger)
|
|
74
|
+
|
|
75
|
+
| ID | Title | Note | Issue |
|
|
76
|
+
| :--- | :--- | :--- | :--- |
|
|
77
|
+
| GFI-15 | `feat(forge): add minimal CSV exporter` | Follow existing JSON visitor pattern in `forge.py` | [#33](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/33) |
|
|
78
|
+
| GFI-16 | `docs: RFC Ollama one-click local RAG` | Design-only RFC; implementation in follow-up issues | [#34](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/34) *(draft at [`rfc/OLLAMA_RAG.md`](rfc/OLLAMA_RAG.md))* |
|
|
79
|
+
| GFI-33 | `refactor(synapse): extract embed-expansion strategy (OCP)` | Mentor — strategy pattern | [#70](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/70) |
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## Recommended starter pack (wave 3)
|
|
84
|
+
|
|
85
|
+
From local code study (waves 9–10) — tests and small fixes with clear repros:
|
|
86
|
+
|
|
87
|
+
| Priority | ID | Why |
|
|
88
|
+
| :---: | :--- | :--- |
|
|
89
|
+
| 1 | GFI-31 ([#71](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/71)) | SYNAPSE embed table tests — pairs with #65/#66 |
|
|
90
|
+
| 2 | GFI-28 ([#63](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/63)) | JSON fixtures for agent session state |
|
|
91
|
+
| 3 | GFI-27 ([#62](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/62)) | Single-file LENS regression |
|
|
92
|
+
| 4 | GFI-32 ([#69](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/69)) | Small English DX fix in `synapse.py` |
|
|
93
|
+
| 5 | GFI-01 ([#19](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/19)) | CLI error-path coverage still open |
|
|
94
|
+
|
|
95
|
+
**Bugs (maintainer / mentor):** [#65](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/65) cyclic embed duplication, [#59](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/59) LENS ghosts, [#60](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/60) corrupt X-Ray state, [#72](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/72) agent-write newline splice.
|
|
96
|
+
|
|
97
|
+
Wave 2 (GFI-17–GFI-26, GFI-02) is **complete** ([#58](https://github.com/MarcoPorcellato/logseq-matryca-parser/pull/58)).
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
## Test suite (v1.4.2+)
|
|
102
|
+
|
|
103
|
+
| Module | Test file |
|
|
104
|
+
| :--- | :--- |
|
|
105
|
+
| Parser (LOGOS) | `tests/test_logos_parser.py` |
|
|
106
|
+
| Graph & watcher | `tests/test_graph.py` |
|
|
107
|
+
| SYNAPSE adapters | `tests/test_synapse.py` |
|
|
108
|
+
| FORGE exporters | `tests/test_forge.py` |
|
|
109
|
+
| KINETIC CLI | `tests/test_kinetic.py` |
|
|
110
|
+
| Agent read/write | `tests/test_agent_press.py`, `tests/test_agent_writer.py` |
|
|
111
|
+
| Paths & markdown | `tests/test_logseq_paths.py`, `tests/test_logseq_markdown.py` |
|
|
112
|
+
| Release helpers | `tests/test_extract_changelog.py`, `tests/test_package_version.py` |
|
|
113
|
+
| Exceptions | `tests/test_exceptions.py` |
|
|
114
|
+
|
|
115
|
+
Run the full gate: `make all` (**450** pytest cases after wave 2 + bugfix regressions).
|
|
116
|
+
|
|
117
|
+
## Out of scope for a first PR
|
|
118
|
+
|
|
119
|
+
- Changes to Pydantic models in `logos_core.py` (open a design issue first).
|
|
120
|
+
- Desktop GUI ([#3](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/3)) — multi-sprint epic.
|
|
121
|
+
- Bulk mldoc parity work in `logos_parser.py` — high regression risk.
|
|
122
|
+
- Obsidian namespace path alignment — cross-tool behavior, needs design.
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
## Definition of Done (all tiers)
|
|
127
|
+
|
|
128
|
+
- [ ] `make all` passes locally (Ruff, Mypy, Pytest ≥80% coverage).
|
|
129
|
+
- [ ] PR links the GitHub issue and describes the change briefly.
|
|
130
|
+
- [ ] `CHANGELOG.md` updated under `[Unreleased]` **only** for user-visible behavior changes.
|
|
@@ -8,8 +8,8 @@ Use this page to find **active** documentation. Files under [`design-docs/`](des
|
|
|
8
8
|
| :--- | :--- | :--- |
|
|
9
9
|
| [`ARCHITECTURE.md`](ARCHITECTURE.md) | Contributors, integrators | LOGOS, SYNAPSE, `LogseqGraph`, agents, data flow |
|
|
10
10
|
| [`logseq_ast_primer.md`](logseq_ast_primer.md) | Parser contributors | Logseq Spatial Markdown domain rules |
|
|
11
|
-
| [`GOOD_FIRST_ISSUES.md`](GOOD_FIRST_ISSUES.md) | New contributors | Curated starter tasks ([#19](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/19)–[#
|
|
12
|
-
| [`COOKBOOK.md`](COOKBOOK.md) | Integrators | Copy-paste recipes (Synapse, graph query, watcher, agents) |
|
|
11
|
+
| [`GOOD_FIRST_ISSUES.md`](GOOD_FIRST_ISSUES.md) | New contributors | Curated starter tasks ([#19](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/19)–[#52](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/52); wave 1 in **v1.4.1**, wave 2 + bugfix tests in **v1.4.2**) |
|
|
12
|
+
| [`COOKBOOK.md`](COOKBOOK.md) | Integrators | Copy-paste recipes (Synapse, graph query, watcher, agents, contributor test patterns) |
|
|
13
13
|
| [`RELEASE_PROCESS.md`](RELEASE_PROCESS.md) | Maintainers | Semver, tag, and PyPI publish checklist |
|
|
14
14
|
| [`CODEQL.md`](CODEQL.md) | Maintainers | CodeQL default setup notes |
|
|
15
15
|
| [`BUG_HUNT_REPORT.md`](BUG_HUNT_REPORT.md) | Maintainers, contributors | Local static analysis bug audit (Clean Architecture lens, runtime evidence) |
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
> ⚠️ **Notice:** For the active documentation index, please refer to the main [README.md](../../README.md).
|
|
2
|
+
|
|
3
|
+
# Historical design documents
|
|
4
|
+
|
|
5
|
+
For contributors: These files are Document-Driven Development blueprints from the initial Logos Protocol scaffolding. They explain design intent and mldoc parity research — they are not the live implementation contract.
|
|
6
|
+
|
|
7
|
+
For current architecture and APIs, use:
|
|
8
|
+
|
|
9
|
+
* [ARCHITECTURE.md](../ARCHITECTURE.md) — active system design
|
|
10
|
+
* [logseq_ast_primer.md](../logseq_ast_primer.md) — Logseq Spatial Markdown domain rules
|
|
11
|
+
* [README.md](../../README.md) — documentation index
|
|
12
|
+
|
|
13
|
+
Each file in this folder includes the same historical banner at the top. When implementing parser behavior, prefer tests in tests/test_logos_parser.py and OFFICIAL_MLDOC_SPECS.md as reference, then confirm against the running code in src/logseq_matryca_parser/.
|
|
@@ -215,7 +215,7 @@ If you feed Logseq Markdown into `RecursiveCharacterTextSplitter` (LangChain) or
|
|
|
215
215
|
|
|
216
216
|
The **Logos Protocol** solves this by walking the AST deterministically, isolating properties, shielding dead-zone literals, and using the `SYNAPSE` adapter to export native LangChain `Document` or LlamaIndex `TextNode` objects. Every generated object retains its exact hierarchical lineage in the metadata, feeding your local LLM perfectly structured data.
|
|
217
217
|
|
|
218
|
-
For vault-wide navigation (aliases, backlinks, namespace shadowing, assets), load the graph with **`LogseqGraph`** — see the [README](../README.md) and [CHANGELOG](../CHANGELOG.md) (graph parity from **v1.2.0**; **v1.3.0** adds watcher debounce, `strict_refs`, public API exports, and LlamaIndex spatial relationships; **v1.4.0** adds canonical page iteration, case-insensitive tag/search, watcher delete/move handling, and SYNAPSE embed safety).
|
|
218
|
+
For vault-wide navigation (aliases, backlinks, namespace shadowing, assets), load the graph with **`LogseqGraph`** — see the [README](../README.md) and [CHANGELOG](../CHANGELOG.md) (graph parity from **v1.2.0**; **v1.3.0** adds watcher debounce, `strict_refs`, public API exports, and LlamaIndex spatial relationships; **v1.4.0** adds canonical page iteration, case-insensitive tag/search, watcher delete/move handling, and SYNAPSE embed safety; **v1.4.1** adds community test coverage for parser helpers, CLI agents, and FORGE visitors — **378** pytest cases, no runtime API changes).
|
|
219
219
|
|
|
220
220
|
---
|
|
221
221
|
|