logseq-matryca-parser 1.4.1__tar.gz → 1.6.0__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.6.0/.github/ISSUE_TEMPLATE/clean_architecture.yml +61 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/.github/ISSUE_TEMPLATE/config.yml +3 -0
- logseq_matryca_parser-1.6.0/.github/clean_arch_issue_numbers.txt +7 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/.github/labels.yml +8 -0
- logseq_matryca_parser-1.6.0/.github/scripts/create_clean_arch_issues.sh +277 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/CHANGELOG.md +56 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/CONTRIBUTING.md +24 -2
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/Makefile +5 -2
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/PKG-INFO +43 -6
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/README.md +42 -5
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/SECURITY.md +2 -2
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/docs/ARCHITECTURE.md +33 -9
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/docs/BUG_HUNT_REPORT.md +4 -0
- logseq_matryca_parser-1.6.0/docs/CLEAN_CODE_ARCHITECTURE.md +301 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/docs/CODEQL.md +1 -1
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/docs/COOKBOOK.md +4 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/docs/GOOD_FIRST_ISSUES.md +57 -21
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/docs/README.md +4 -1
- logseq_matryca_parser-1.6.0/docs/design-docs/README.md +13 -0
- logseq_matryca_parser-1.6.0/docs/internal/LOCAL_CODE_STUDY.md +117 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/docs/internal/STATIC_ANALYSIS_POLICY.md +1 -0
- logseq_matryca_parser-1.6.0/docs/quality/CLEAN_ARCH_BACKLOG.md +67 -0
- logseq_matryca_parser-1.6.0/docs/quality/GITHUB_CLEAN_ARCH_ROADMAP.md +87 -0
- logseq_matryca_parser-1.6.0/docs/quality/ISSUE_TRIAGE_2026-07.md +94 -0
- logseq_matryca_parser-1.6.0/docs/quality/README.md +25 -0
- logseq_matryca_parser-1.6.0/metrics/index.json +10 -0
- logseq_matryca_parser-1.4.1/metrics/history.json → logseq_matryca_parser-1.6.0/metrics/quarters/2026-Q2.json +1915 -726
- logseq_matryca_parser-1.6.0/metrics/quarters/2026-Q3.json +185 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/pyproject.toml +3 -2
- logseq_matryca_parser-1.6.0/scripts/check_vendor_free_docs.sh +16 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/src/logseq_matryca_parser/__init__.py +1 -1
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/src/logseq_matryca_parser/agent_press.py +57 -4
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/src/logseq_matryca_parser/agent_writer.py +2 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/src/logseq_matryca_parser/exceptions.py +4 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/src/logseq_matryca_parser/graph.py +9 -1
- logseq_matryca_parser-1.6.0/src/logseq_matryca_parser/kinetic.py +230 -0
- logseq_matryca_parser-1.6.0/src/logseq_matryca_parser/kinetic_commands.py +364 -0
- logseq_matryca_parser-1.6.0/src/logseq_matryca_parser/kinetic_export.py +133 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/src/logseq_matryca_parser/synapse.py +20 -68
- logseq_matryca_parser-1.6.0/src/logseq_matryca_parser/synapse_embed.py +180 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/tests/test_agent_press.py +45 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/tests/test_agent_writer.py +51 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/tests/test_extract_changelog.py +43 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/tests/test_forge.py +93 -1
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/tests/test_graph.py +76 -1
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/tests/test_kinetic.py +122 -3
- logseq_matryca_parser-1.6.0/tests/test_layer_boundary.py +122 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/tests/test_lens.py +30 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/tests/test_logseq_markdown.py +39 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/tests/test_synapse.py +87 -1
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/uv.lock +1 -1
- logseq_matryca_parser-1.4.1/docs/design-docs/README.md +0 -11
- logseq_matryca_parser-1.4.1/src/logseq_matryca_parser/kinetic.py +0 -666
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/.cursorignore +0 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/.cursorrules +0 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/.github/CODEOWNERS +0 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/.github/FUNDING.yml +0 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/.github/dependabot.yml +0 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/.github/scripts/create_good_first_issues.sh +0 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/.github/workflows/ci.yml +0 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/.github/workflows/daily-metrics.yml +0 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/.github/workflows/github_release.yml +0 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/.github/workflows/pypi_publish.yml +0 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/.gitignore +0 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/.pre-commit-config.yaml +0 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/.repomixignore +0 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/CODE_OF_CONDUCT.md +0 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/LICENSE +0 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/NOTICE +0 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/claude-skill-logseq-read/SKILL.md +0 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/claude-skill-logseq-read/scripts/parse_logseq.py +0 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/docs/RELEASE_PROCESS.md +0 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/docs/design-docs/ARCHITECTURE_BLUEPRINT.md +0 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/docs/design-docs/CODE_SCAFFOLD.md +0 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/docs/design-docs/LOGSEQ_ASSET_RESOLUTION_SPEC.md +0 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/docs/design-docs/LOGSEQ_DATASCRIPT_MAPPING.md +0 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/docs/design-docs/LOGSEQ_TEMPORAL_ONTOLOGY.md +0 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/docs/design-docs/OFFICIAL_MLDOC_SPECS.md +0 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/docs/design-docs/REFERENCE_SPEC.md +0 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/docs/error_log.md +0 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/docs/logseq_ast_primer.md +0 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/docs/rfc/OLLAMA_RAG.md +0 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/docs/roadmaps/ROADMAP_AGENT_NATIVE_XRAY.md +0 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/docs/roadmaps/ROADMAP_CLI_HYDRATION_AND_ENRICHMENT.md +0 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/docs/roadmaps/ROADMAP_CONTEXT_SYNTHESIS_AND_SCOPING.md +0 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/docs/roadmaps/ROADMAP_EMBED_EXPANSION_AND_FLUENT_QUERIES.md +0 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/docs/roadmaps/ROADMAP_GRAPH_RAG_SEMANTICS.md +0 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/docs/roadmaps/ROADMAP_HEADLESS_WRITER.md +0 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/docs/roadmaps/ROADMAP_INCREMENTAL_WATCHER.md +0 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/docs/roadmaps/ROADMAP_INLINE_SHIELD_AND_NAMESPACES.md +0 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/docs/roadmaps/ROADMAP_OBSIDIAN_ADAPTER.md +0 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/docs/roadmaps/ROADMAP_ROBUSTNESS_AND_SOFT_BREAKS.md +0 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/docs/roadmaps/ROADMAP_TOML_FIX_AND_PYPI_DISTRIBUTION.md +0 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/docs/roadmaps/ROADMAP_UUID_AND_GRAPH_SUPERPOWERS.md +0 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/examples/demo_logseq_journal.md +0 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/examples/run_demo.py +0 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/legacy/local_digestor.py +0 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/lib/bindings/utils.js +0 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/lib/tom-select/tom-select.complete.min.js +0 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/lib/tom-select/tom-select.css +0 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/lib/vis-9.1.2/vis-network.css +0 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/lib/vis-9.1.2/vis-network.min.js +0 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/repomix-output-parser.xml +0 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/scripts/__init__.py +0 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/scripts/archive_repository_metrics.py +0 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/scripts/debug_pre_release.py +0 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/scripts/extract_changelog.py +0 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/src/logseq_matryca_parser/.gitignore +0 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/src/logseq_matryca_parser/NOTICE +0 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/src/logseq_matryca_parser/__main__.py +0 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/src/logseq_matryca_parser/forge.py +0 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/src/logseq_matryca_parser/lens.py +0 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/src/logseq_matryca_parser/logos_core.py +0 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/src/logseq_matryca_parser/logos_parser.py +0 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/src/logseq_matryca_parser/logseq_markdown.py +0 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/src/logseq_matryca_parser/logseq_paths.py +0 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/src/logseq_matryca_parser/pyproject.toml +0 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/tests/test_archive_repository_metrics.py +0 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/tests/test_exceptions.py +0 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/tests/test_logos_parser.py +0 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/tests/test_logseq_paths.py +0 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/tests/test_package_version.py +0 -0
- {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/tests/test_pre_release_roundtrip.py +0 -0
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
name: Clean Architecture slice
|
|
2
|
+
description: Structural refactor or layer-boundary work (Uncle Bob contract)
|
|
3
|
+
title: "refactor: "
|
|
4
|
+
labels:
|
|
5
|
+
- architecture
|
|
6
|
+
- clean-code
|
|
7
|
+
body:
|
|
8
|
+
- type: markdown
|
|
9
|
+
attributes:
|
|
10
|
+
value: |
|
|
11
|
+
Use this template for SRP/OCP/ISP/DIP slices. SSOT: [CLEAN_CODE_ARCHITECTURE.md](https://github.com/MarcoPorcellato/logseq-matryca-parser/blob/main/docs/CLEAN_CODE_ARCHITECTURE.md)
|
|
12
|
+
- type: textarea
|
|
13
|
+
id: problem
|
|
14
|
+
attributes:
|
|
15
|
+
label: Problem
|
|
16
|
+
description: Operator- or maintainer-visible issue in one paragraph
|
|
17
|
+
validations:
|
|
18
|
+
required: true
|
|
19
|
+
- type: textarea
|
|
20
|
+
id: lens
|
|
21
|
+
attributes:
|
|
22
|
+
label: Clean Architecture lens
|
|
23
|
+
description: "Table: Ring | SOLID violation | dependency-rule note"
|
|
24
|
+
value: |
|
|
25
|
+
| Ring | SOLID | Dependency rule |
|
|
26
|
+
|------|-------|-----------------|
|
|
27
|
+
| | | |
|
|
28
|
+
validations:
|
|
29
|
+
required: true
|
|
30
|
+
- type: textarea
|
|
31
|
+
id: reproduction
|
|
32
|
+
attributes:
|
|
33
|
+
label: Reproduction
|
|
34
|
+
description: Minimal markdown fixture, Python probe, or import-graph note
|
|
35
|
+
validations:
|
|
36
|
+
required: true
|
|
37
|
+
- type: textarea
|
|
38
|
+
id: expected
|
|
39
|
+
attributes:
|
|
40
|
+
label: Expected vs actual
|
|
41
|
+
description: Precise strings, counts, or module boundaries
|
|
42
|
+
validations:
|
|
43
|
+
required: true
|
|
44
|
+
- type: textarea
|
|
45
|
+
id: fix
|
|
46
|
+
attributes:
|
|
47
|
+
label: Suggested fix
|
|
48
|
+
description: Stay inside the correct ring; no drive-by refactors
|
|
49
|
+
validations:
|
|
50
|
+
required: true
|
|
51
|
+
- type: textarea
|
|
52
|
+
id: dod
|
|
53
|
+
attributes:
|
|
54
|
+
label: Definition of Done
|
|
55
|
+
value: |
|
|
56
|
+
- [ ] `make all` passes (Ruff, Mypy, pytest ≥80% coverage)
|
|
57
|
+
- [ ] `make vendor-name-check` passes
|
|
58
|
+
- [ ] `CHANGELOG.md` updated if operator-visible
|
|
59
|
+
- [ ] `docs/quality/CLEAN_ARCH_BACKLOG.md` updated if DEBT item closed
|
|
60
|
+
validations:
|
|
61
|
+
required: true
|
{logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/.github/ISSUE_TEMPLATE/config.yml
RENAMED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
blank_issues_enabled: false
|
|
2
2
|
contact_links:
|
|
3
|
+
- name: Clean Architecture epic (v1.6)
|
|
4
|
+
url: https://github.com/MarcoPorcellato/logseq-matryca-parser/blob/main/docs/quality/GITHUB_CLEAN_ARCH_ROADMAP.md
|
|
5
|
+
about: Milestone, project board, and phase issues for Uncle Bob v1.6 work
|
|
3
6
|
- name: Security vulnerability
|
|
4
7
|
url: https://github.com/MarcoPorcellato/logseq-matryca-parser/security/policy
|
|
5
8
|
about: Report a security issue privately — do not open a public issue
|
|
@@ -36,3 +36,11 @@
|
|
|
36
36
|
- name: forge
|
|
37
37
|
color: bfd4f2
|
|
38
38
|
description: FORGE exporters and visitors
|
|
39
|
+
|
|
40
|
+
- name: clean-code
|
|
41
|
+
color: "0e8a16"
|
|
42
|
+
description: Clean Architecture / SOLID slice — Uncle Bob contract
|
|
43
|
+
|
|
44
|
+
- name: architecture
|
|
45
|
+
color: "5319e7"
|
|
46
|
+
description: Layer boundaries, dependency rule, structural refactor
|
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Bootstrap Clean Architecture v1.6 milestone, epic, and phase issues.
|
|
3
|
+
# Run from repo root: bash .github/scripts/create_clean_arch_issues.sh
|
|
4
|
+
set -euo pipefail
|
|
5
|
+
ROOT="$(cd "$(dirname "$0")/../.." && pwd)"
|
|
6
|
+
cd "$ROOT"
|
|
7
|
+
|
|
8
|
+
REPO="${GITHUB_REPOSITORY:-MarcoPorcellato/logseq-matryca-parser}"
|
|
9
|
+
MILESTONE_TITLE="v1.6 — Clean Architecture & Code Quality"
|
|
10
|
+
OUT="$ROOT/.github/clean_arch_issue_numbers.txt"
|
|
11
|
+
: > "$OUT"
|
|
12
|
+
|
|
13
|
+
milestone_number() {
|
|
14
|
+
gh api "repos/${REPO}/milestones" --paginate \
|
|
15
|
+
--jq ".[] | select(.title==\"${MILESTONE_TITLE}\") | .number" | head -1
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
ensure_milestone() {
|
|
19
|
+
local num
|
|
20
|
+
num=$(milestone_number || true)
|
|
21
|
+
if [[ -n "${num}" ]]; then
|
|
22
|
+
echo "Milestone exists: #${num} (${MILESTONE_TITLE})"
|
|
23
|
+
echo "milestone=${num}" >> "$OUT"
|
|
24
|
+
return
|
|
25
|
+
fi
|
|
26
|
+
num=$(gh api "repos/${REPO}/milestones" -f title="${MILESTONE_TITLE}" \
|
|
27
|
+
-f description="Uncle Bob rings, layer CI, KINETIC/SYNAPSE SRP-OCP slices. SSOT: docs/CLEAN_CODE_ARCHITECTURE.md. Target: v1.6.0." \
|
|
28
|
+
--jq '.number')
|
|
29
|
+
echo "Created milestone #${num}: ${MILESTONE_TITLE}"
|
|
30
|
+
echo "milestone=${num}" >> "$OUT"
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
create_issue() {
|
|
34
|
+
local id="$1"
|
|
35
|
+
local title="$2"
|
|
36
|
+
local labels="$3"
|
|
37
|
+
local body_file="$4"
|
|
38
|
+
local url
|
|
39
|
+
url=$(gh issue create --title "$title" --label "$labels" --body-file "$body_file")
|
|
40
|
+
local num="${url##*/}"
|
|
41
|
+
local ms
|
|
42
|
+
ms=$(milestone_number)
|
|
43
|
+
if [[ -n "${ms}" ]]; then
|
|
44
|
+
gh api -X PATCH "repos/${REPO}/issues/${num}" -f milestone="${ms}" >/dev/null
|
|
45
|
+
fi
|
|
46
|
+
echo "$id=${num}" >> "$OUT"
|
|
47
|
+
echo "Created ${id} -> #${num}"
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
BODY_DIR=$(mktemp -d)
|
|
51
|
+
trap 'rm -rf "$BODY_DIR"' EXIT
|
|
52
|
+
|
|
53
|
+
ensure_milestone
|
|
54
|
+
|
|
55
|
+
# Epic
|
|
56
|
+
cat > "$BODY_DIR/epic.md" <<'EOF'
|
|
57
|
+
## Goal
|
|
58
|
+
|
|
59
|
+
Ship the v1.6 Clean Architecture contract: SSOT documentation, import-boundary CI, KINETIC export extraction, SYNAPSE embed OCP, graph ISP public API, and a KINETIC command slice.
|
|
60
|
+
|
|
61
|
+
## Clean Architecture lens
|
|
62
|
+
|
|
63
|
+
| Ring | Modules touched |
|
|
64
|
+
|------|-----------------|
|
|
65
|
+
| Entities | `logos_core` (unchanged in v1) |
|
|
66
|
+
| Use cases | `graph`, `logos_parser` (no FSM refactor) |
|
|
67
|
+
| Adapters | `synapse`, `forge`, `kinetic_export` |
|
|
68
|
+
| Drivers | `kinetic`, `kinetic_commands` |
|
|
69
|
+
|
|
70
|
+
## Phases (child issues)
|
|
71
|
+
|
|
72
|
+
Update checkboxes when each phase merges:
|
|
73
|
+
|
|
74
|
+
- [ ] Phase 0 — docs SSOT + layer CI + vendor-name-check
|
|
75
|
+
- [ ] Phase 1 — `kinetic_export.py` (DEBT-005)
|
|
76
|
+
- [ ] Phase 2 — SYNAPSE embed OCP (DEBT-006) — #70
|
|
77
|
+
- [ ] Phase 3 — `iter_attached_nodes()` + `kinetic_commands.py`
|
|
78
|
+
- [ ] Phase 4 — hardening + v1 closure
|
|
79
|
+
|
|
80
|
+
## SSOT
|
|
81
|
+
|
|
82
|
+
- [`docs/CLEAN_CODE_ARCHITECTURE.md`](https://github.com/MarcoPorcellato/logseq-matryca-parser/blob/main/docs/CLEAN_CODE_ARCHITECTURE.md)
|
|
83
|
+
- [`docs/quality/CLEAN_ARCH_BACKLOG.md`](https://github.com/MarcoPorcellato/logseq-matryca-parser/blob/main/docs/quality/CLEAN_ARCH_BACKLOG.md)
|
|
84
|
+
- [`docs/quality/GITHUB_CLEAN_ARCH_ROADMAP.md`](https://github.com/MarcoPorcellato/logseq-matryca-parser/blob/main/docs/quality/GITHUB_CLEAN_ARCH_ROADMAP.md)
|
|
85
|
+
|
|
86
|
+
## Out of scope (v2 epic)
|
|
87
|
+
|
|
88
|
+
- `logos_parser.py` split (1439 lines, CRITICAL hub — do not refactor in v1.6)
|
|
89
|
+
- Hexagonal `domain/ports.py`
|
|
90
|
+
- Vendor AST indexer in CI (Ghost Tooling policy)
|
|
91
|
+
|
|
92
|
+
## Definition of Done
|
|
93
|
+
|
|
94
|
+
- [ ] All phase issues closed
|
|
95
|
+
- [ ] `make all` green on `main`
|
|
96
|
+
- [ ] `CHANGELOG.md` ready for v1.6.0
|
|
97
|
+
- [ ] Milestone closed after tag `v1.6.0`
|
|
98
|
+
EOF
|
|
99
|
+
create_issue "EPIC" "Epic: Clean Architecture v1.6 — documentation, layer CI, and SRP/OCP slices" "architecture,enhancement" "$BODY_DIR/epic.md"
|
|
100
|
+
|
|
101
|
+
# Phase 0
|
|
102
|
+
cat > "$BODY_DIR/phase0.md" <<'EOF'
|
|
103
|
+
## Problem
|
|
104
|
+
|
|
105
|
+
Contributors lack a single Uncle Bob SSOT, automated layer-boundary tests, and a vendor-free code-audit runbook. Two small DIP/SRP slices are already implemented locally but not tracked on `main`.
|
|
106
|
+
|
|
107
|
+
## Clean Architecture lens
|
|
108
|
+
|
|
109
|
+
| Ring | SOLID | Dependency rule |
|
|
110
|
+
|------|-------|-----------------|
|
|
111
|
+
| Drivers / use cases | SRP, DIP | Public graph API for watcher; remove dead kinetic helper |
|
|
112
|
+
| CI (tests) | — | Inner rings must not import frameworks |
|
|
113
|
+
|
|
114
|
+
## Deliverables
|
|
115
|
+
|
|
116
|
+
- [ ] `docs/CLEAN_CODE_ARCHITECTURE.md` — rings, SOLID, module map
|
|
117
|
+
- [ ] `tests/test_layer_boundary.py` — import-boundary gate
|
|
118
|
+
- [ ] `scripts/check_vendor_free_docs.sh` + `make vendor-name-check`
|
|
119
|
+
- [ ] `docs/internal/LOCAL_CODE_STUDY.md` — maintainer runbook (generic terminology)
|
|
120
|
+
- [ ] Public `LogseqGraph.is_tracked_markdown_path()` (closes #68)
|
|
121
|
+
- [ ] Remove dead `_parse_graph` from `kinetic.py` (closes #67)
|
|
122
|
+
|
|
123
|
+
## Reproduction
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
uv run pytest tests/test_layer_boundary.py -q
|
|
127
|
+
make vendor-name-check
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
## Expected vs actual
|
|
131
|
+
|
|
132
|
+
- **Expected:** `make all` passes; zero vendor tool names in public docs.
|
|
133
|
+
- **Actual (pre-merge):** slices exist only in working tree.
|
|
134
|
+
|
|
135
|
+
## Definition of Done
|
|
136
|
+
|
|
137
|
+
- [ ] `make all` passes
|
|
138
|
+
- [ ] `CHANGELOG.md` updated under `[Unreleased]`
|
|
139
|
+
- [ ] PR body: `Fixes #67`, `Fixes #68`, links epic
|
|
140
|
+
EOF
|
|
141
|
+
create_issue "PHASE0" "docs: Clean Architecture SSOT, layer CI, and code-audit runbook" "architecture,clean-code,documentation" "$BODY_DIR/phase0.md"
|
|
142
|
+
|
|
143
|
+
# Phase 1
|
|
144
|
+
cat > "$BODY_DIR/phase1.md" <<'EOF'
|
|
145
|
+
## Problem
|
|
146
|
+
|
|
147
|
+
`kinetic.py` mixes Typer wiring with five `_export_*` handlers (~700 lines). Export formats cannot be extended without editing the driver module (SRP / OCP violation).
|
|
148
|
+
|
|
149
|
+
## Clean Architecture lens
|
|
150
|
+
|
|
151
|
+
| Ring | SOLID | Dependency rule |
|
|
152
|
+
|------|-------|-----------------|
|
|
153
|
+
| Drivers | SRP, OCP | `kinetic.py` orchestrates; `kinetic_export.py` owns format handlers |
|
|
154
|
+
| Adapters | — | Handlers may call `forge`, `synapse` via public APIs |
|
|
155
|
+
|
|
156
|
+
## Suggested fix
|
|
157
|
+
|
|
158
|
+
1. Create `src/logseq_matryca_parser/kinetic_export.py`
|
|
159
|
+
2. Move `_export_json`, `_export_markdown`, `_export_obsidian`, `_export_langchain`, etc.
|
|
160
|
+
3. Registry or dispatcher in `kinetic.export()` — no behavior change
|
|
161
|
+
4. Extend `tests/test_layer_boundary.py` for the new module
|
|
162
|
+
|
|
163
|
+
## Reproduction
|
|
164
|
+
|
|
165
|
+
```bash
|
|
166
|
+
uv run matryca-parse export --help
|
|
167
|
+
make check
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
## Expected vs actual
|
|
171
|
+
|
|
172
|
+
- **Expected:** identical CLI output and exit codes; `kinetic.py` shrinks materially.
|
|
173
|
+
- **Actual:** all export logic inline in `kinetic.py`.
|
|
174
|
+
|
|
175
|
+
## Definition of Done
|
|
176
|
+
|
|
177
|
+
- [ ] `make all` passes
|
|
178
|
+
- [ ] `tests/test_kinetic.py` unchanged behavior
|
|
179
|
+
- [ ] `docs/quality/CLEAN_ARCH_BACKLOG.md` — DEBT-005 closed
|
|
180
|
+
- [ ] `CHANGELOG.md` if operator-visible
|
|
181
|
+
|
|
182
|
+
**Tracking:** DEBT-005
|
|
183
|
+
EOF
|
|
184
|
+
create_issue "PHASE1" "refactor(kinetic): extract export handlers to kinetic_export.py (SRP)" "architecture,clean-code,cli,enhancement" "$BODY_DIR/phase1.md"
|
|
185
|
+
|
|
186
|
+
# Phase 3a — iter_attached_nodes
|
|
187
|
+
cat > "$BODY_DIR/phase3a.md" <<'EOF'
|
|
188
|
+
## Problem
|
|
189
|
+
|
|
190
|
+
`LogseqGraph._iter_attached_nodes()` is private but is the correct ISP surface for consumers that must skip orphan ghost nodes. Callers risk using `graph.pages` or `_node_registry` directly.
|
|
191
|
+
|
|
192
|
+
## Clean Architecture lens
|
|
193
|
+
|
|
194
|
+
| Ring | SOLID | Dependency rule |
|
|
195
|
+
|------|-------|-----------------|
|
|
196
|
+
| Use cases | ISP | Public iterator; private implementation unchanged |
|
|
197
|
+
| Adapters | DIP | `agent_read`, LENS, SYNAPSE should prefer public API |
|
|
198
|
+
|
|
199
|
+
## Suggested fix
|
|
200
|
+
|
|
201
|
+
- Add `LogseqGraph.iter_attached_nodes() -> Iterator[LogseqNode]` (public)
|
|
202
|
+
- Delegate from existing private method
|
|
203
|
+
- Deprecation comment on leaky patterns in docstring only
|
|
204
|
+
|
|
205
|
+
## Reproduction
|
|
206
|
+
|
|
207
|
+
```python
|
|
208
|
+
from logseq_matryca_parser.graph import LogseqGraph
|
|
209
|
+
g = LogseqGraph.load_directory("path/to/vault")
|
|
210
|
+
list(g.iter_attached_nodes())
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
## Definition of Done
|
|
214
|
+
|
|
215
|
+
- [ ] Public method documented in `CLEAN_CODE_ARCHITECTURE.md` module map
|
|
216
|
+
- [ ] `make all` passes
|
|
217
|
+
- [ ] No new `graph.pages` iteration in drivers without `iter_canonical_pages()`
|
|
218
|
+
EOF
|
|
219
|
+
create_issue "PHASE3A" "refactor(graph): public iter_attached_nodes() (ISP)" "architecture,clean-code,enhancement" "$BODY_DIR/phase3a.md"
|
|
220
|
+
|
|
221
|
+
# Phase 3b — kinetic_commands
|
|
222
|
+
cat > "$BODY_DIR/phase3b.md" <<'EOF'
|
|
223
|
+
## Problem
|
|
224
|
+
|
|
225
|
+
After Phase 1 export extraction, `kinetic.py` still hosts many Typer subcommands (scan, visualize, agent-write, demo). The driver module remains above the ~550-line SRP threshold.
|
|
226
|
+
|
|
227
|
+
## Clean Architecture lens
|
|
228
|
+
|
|
229
|
+
| Ring | SOLID | Dependency rule |
|
|
230
|
+
|------|-------|-----------------|
|
|
231
|
+
| Drivers | SRP | `kinetic.py` = app factory + shared helpers; `kinetic_commands.py` = command handlers |
|
|
232
|
+
|
|
233
|
+
## Suggested fix
|
|
234
|
+
|
|
235
|
+
- Extract command groups to `kinetic_commands.py`
|
|
236
|
+
- `kinetic.py` registers commands via imports
|
|
237
|
+
- Extend `tests/test_layer_boundary.py` if needed
|
|
238
|
+
|
|
239
|
+
## Related
|
|
240
|
+
|
|
241
|
+
- #61 — replace production `assert` in `agent_write` (include in same PR if still present)
|
|
242
|
+
|
|
243
|
+
## Definition of Done
|
|
244
|
+
|
|
245
|
+
- [ ] `make all` passes
|
|
246
|
+
- [ ] `tests/test_kinetic.py` green
|
|
247
|
+
- [ ] `kinetic.py` line count ≤ 550 post-extraction
|
|
248
|
+
EOF
|
|
249
|
+
create_issue "PHASE3B" "refactor(kinetic): extract subcommands to kinetic_commands.py (SRP)" "architecture,clean-code,cli,enhancement" "$BODY_DIR/phase3b.md"
|
|
250
|
+
|
|
251
|
+
# Phase 4
|
|
252
|
+
cat > "$BODY_DIR/phase4.md" <<'EOF'
|
|
253
|
+
## Problem
|
|
254
|
+
|
|
255
|
+
v1.6 documentation and backlog need final cross-links; epic checklist must close; README/COOKBOOK should point to the Uncle Bob SSOT.
|
|
256
|
+
|
|
257
|
+
## Deliverables
|
|
258
|
+
|
|
259
|
+
- [ ] README + COOKBOOK links to `docs/CLEAN_CODE_ARCHITECTURE.md`
|
|
260
|
+
- [ ] `docs/quality/CLEAN_ARCH_BACKLOG.md` — v1 structural items marked complete
|
|
261
|
+
- [ ] Close epic issue
|
|
262
|
+
- [ ] `CHANGELOG.md` release notes draft for v1.6.0 (no autonomous tag)
|
|
263
|
+
|
|
264
|
+
## Definition of Done
|
|
265
|
+
|
|
266
|
+
- [ ] `make all` passes
|
|
267
|
+
- [ ] Epic checklist complete
|
|
268
|
+
- [ ] Milestone ready to close after release tag
|
|
269
|
+
EOF
|
|
270
|
+
create_issue "PHASE4" "chore: Clean Architecture v1 hardening + README/COOKBOOK links" "architecture,clean-code,documentation" "$BODY_DIR/phase4.md"
|
|
271
|
+
|
|
272
|
+
echo ""
|
|
273
|
+
echo "=== Issue numbers written to ${OUT} ==="
|
|
274
|
+
cat "$OUT"
|
|
275
|
+
echo ""
|
|
276
|
+
echo "Next: assign milestone to existing #70, #71, #61 via gh issue edit"
|
|
277
|
+
echo "Create GitHub Project: gh project create --title 'Logseq Parser — Clean Architecture v1.6' --owner MarcoPorcellato"
|
|
@@ -7,6 +7,62 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [1.6.0] - 2026-07-02
|
|
11
|
+
|
|
12
|
+
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.
|
|
13
|
+
|
|
14
|
+
### Added
|
|
15
|
+
|
|
16
|
+
- **Clean Architecture SSOT** — [`docs/CLEAN_CODE_ARCHITECTURE.md`](docs/CLEAN_CODE_ARCHITECTURE.md) maps Uncle Bob rings, SOLID, and module maps; quality index in [`docs/quality/`](docs/quality/) (backlog, GitHub roadmap, July 2026 triage).
|
|
17
|
+
- **`kinetic_export.py`** — KINETIC format handlers extracted from `kinetic.py` (DEBT-005 / [#80](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/80)).
|
|
18
|
+
- **`kinetic_commands.py`** — `scan`, `visualize`, `demo`, `append`, `agent-read`, and `agent-write` subcommands (SRP slice / [#82](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/82)).
|
|
19
|
+
- **`synapse_embed.py`** — `BlockEmbedExpander` / `PageEmbedExpander` strategy pattern for embed expansion (DEBT-006 / [#70](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/70)).
|
|
20
|
+
- **`LogseqGraph.iter_attached_nodes()`** — public ISP iterator skipping orphan ghost registry entries ([#81](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/81)).
|
|
21
|
+
- **Layer boundary CI** — `tests/test_layer_boundary.py` forbids framework imports in entities/use cases, adapter→driver leaks, and Typer/Rich in `kinetic_export.py`.
|
|
22
|
+
- **`make vendor-name-check`** — Ghost Tooling gate for vendor-free public documentation.
|
|
23
|
+
- **Maintainer local code audit runbook** — [`docs/internal/LOCAL_CODE_STUDY.md`](docs/internal/LOCAL_CODE_STUDY.md).
|
|
24
|
+
- **GitHub issue template** — `.github/ISSUE_TEMPLATE/clean_architecture.yml` for Uncle Bob slices; bootstrap script `.github/scripts/create_clean_arch_issues.sh`.
|
|
25
|
+
|
|
26
|
+
### Changed
|
|
27
|
+
|
|
28
|
+
- **`kinetic.py`** — slim Typer app factory (~230 lines): `export` orchestration + shared CLI helpers; subcommands in `kinetic_commands.py`.
|
|
29
|
+
- **`LogseqGraph.is_tracked_markdown_path()`** — public DIP surface for watcher path checks ([#68](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/68)).
|
|
30
|
+
- **KINETIC** — removed dead `_parse_graph` helper ([#67](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/67)).
|
|
31
|
+
- **Ghost Tooling** — vendor AST indexer names removed from public docs; unified on **local code audit** / **graph-based code study** terminology.
|
|
32
|
+
- **Contributor docs** — [`README.md`](README.md), [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md), [`docs/COOKBOOK.md`](docs/COOKBOOK.md), [`docs/GOOD_FIRST_ISSUES.md`](docs/GOOD_FIRST_ISSUES.md), and [`CONTRIBUTING.md`](CONTRIBUTING.md) updated for v1.6.0 and **456** pytest cases.
|
|
33
|
+
|
|
34
|
+
### Meta (contributor tracking)
|
|
35
|
+
|
|
36
|
+
- **Clean Architecture epic** — [#78](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/78) (phases [#79](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/79)–[#83](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/83)).
|
|
37
|
+
- **Contributor waves 3–5** — issues [#59](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/59)–[#73](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/73) filed from local code study; agent rule [`.cursor/rules/07-clean-architecture-audit.mdc`](.cursor/rules/07-clean-architecture-audit.mdc).
|
|
38
|
+
|
|
39
|
+
## [1.5.0] - 2026-06-29
|
|
40
|
+
|
|
41
|
+
### Added
|
|
42
|
+
|
|
43
|
+
- **CLI** — `matryca-parse scan --broken-refs` reports unresolved `((uuid))` block references in a Rich table and exits with status 1 when any are found ([#29](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/29), [#77](https://github.com/MarcoPorcellato/logseq-matryca-parser/pull/77)).
|
|
44
|
+
|
|
45
|
+
### Changed
|
|
46
|
+
|
|
47
|
+
- **Contributor docs** — [`README.md`](README.md), [`docs/COOKBOOK.md`](docs/COOKBOOK.md), [`docs/GOOD_FIRST_ISSUES.md`](docs/GOOD_FIRST_ISSUES.md), and [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md) document the new scan flag and **451** pytest cases.
|
|
48
|
+
|
|
49
|
+
## [1.4.2] - 2026-06-29
|
|
50
|
+
|
|
51
|
+
### Fixed
|
|
52
|
+
|
|
53
|
+
- **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)).
|
|
54
|
+
- **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)).
|
|
55
|
+
- **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)).
|
|
56
|
+
|
|
57
|
+
### Added
|
|
58
|
+
|
|
59
|
+
- **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).
|
|
60
|
+
- **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.
|
|
61
|
+
|
|
62
|
+
### Changed
|
|
63
|
+
|
|
64
|
+
- **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).
|
|
65
|
+
|
|
10
66
|
## [1.4.1] - 2026-06-24
|
|
11
67
|
|
|
12
68
|
### Added
|
|
@@ -13,15 +13,18 @@ To maintain the architectural integrity of the project, please follow the guidel
|
|
|
13
13
|
User-facing behavior is documented in:
|
|
14
14
|
|
|
15
15
|
- [`README.md`](README.md) — overview, quickstart, and feature matrix
|
|
16
|
+
- [`docs/CLEAN_CODE_ARCHITECTURE.md`](docs/CLEAN_CODE_ARCHITECTURE.md) — Clean Code & Clean Architecture (rings, SOLID, layer boundaries)
|
|
16
17
|
- [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md) — LOGOS, SYNAPSE, `LogseqGraph`, agents, and data flow
|
|
18
|
+
- [`docs/internal/LOCAL_CODE_STUDY.md`](docs/internal/LOCAL_CODE_STUDY.md) — maintainer local code audit runbook (not for public issues/CHANGELOG)
|
|
17
19
|
- [`docs/logseq_ast_primer.md`](docs/logseq_ast_primer.md) — Logseq Spatial Markdown domain rules
|
|
18
|
-
- [`CHANGELOG.md`](CHANGELOG.md) — shipped releases (current: **1.
|
|
20
|
+
- [`CHANGELOG.md`](CHANGELOG.md) — shipped releases (current: **1.6.0**) and **Unreleased** changes (Keep a Changelog)
|
|
19
21
|
- [`docs/RELEASE_PROCESS.md`](docs/RELEASE_PROCESS.md) — version bump, tag, and PyPI publish checklist
|
|
20
22
|
- [`docs/CODEQL.md`](docs/CODEQL.md) — CodeQL default setup (no custom `codeql.yml`)
|
|
21
23
|
- [`docs/GOOD_FIRST_ISSUES.md`](docs/GOOD_FIRST_ISSUES.md) — curated starter tasks for new contributors
|
|
22
24
|
- [`docs/COOKBOOK.md`](docs/COOKBOOK.md) — integration recipes (Synapse, graph query, watcher)
|
|
23
25
|
- [`docs/README.md`](docs/README.md) — documentation index (active vs historical)
|
|
24
26
|
- [`docs/rfc/OLLAMA_RAG.md`](docs/rfc/OLLAMA_RAG.md) — draft RFC for Ollama local RAG ([#34](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/34))
|
|
27
|
+
- [`docs/quality/`](docs/quality/) — architecture backlog, GitHub roadmap (v1.6), triage
|
|
25
28
|
- [`docs/internal/STATIC_ANALYSIS_POLICY.md`](docs/internal/STATIC_ANALYSIS_POLICY.md) — Ghost Tooling policy (vendor-agnostic CI and public docs)
|
|
26
29
|
|
|
27
30
|
When you add or change observable parser or graph behavior, update the relevant doc sections and add a bullet under **`## [Unreleased]`** in `CHANGELOG.md` (see [`.cursor/rules/05-auto-changelog.mdc`](.cursor/rules/05-auto-changelog.mdc)).
|
|
@@ -52,6 +55,25 @@ Tier 1 tasks are **test-only** — no parser changes, ideal for learning `CliRun
|
|
|
52
55
|
|
|
53
56
|
---
|
|
54
57
|
|
|
58
|
+
## Code quality (Clean Code & Clean Architecture)
|
|
59
|
+
|
|
60
|
+
The project applies **Robert C. Martin's** *Clean Architecture* (dependency rule, inward dependencies) and *Clean Code* (SRP, meaningful names, tests as specification) across `src/logseq_matryca_parser/`.
|
|
61
|
+
|
|
62
|
+
| Practice | Where it shows up |
|
|
63
|
+
|----------|-------------------|
|
|
64
|
+
| **Dependency Rule** | Entities + use cases must not import Typer, Rich, or optional AI/viz frameworks — `tests/test_layer_boundary.py` |
|
|
65
|
+
| **Fat modules, thin edges** | Parse/index in `graph` / `logos_parser`; KINETIC and adapters delegate |
|
|
66
|
+
| **Public graph API** | `iter_canonical_pages()`, `page_for_node()`, `iter_attached_nodes()`, `is_tracked_markdown_path()` |
|
|
67
|
+
| **Tests as spec** | pytest + `tmp_path` vaults; `make all` gate |
|
|
68
|
+
|
|
69
|
+
**SSOT:** [`docs/CLEAN_CODE_ARCHITECTURE.md`](docs/CLEAN_CODE_ARCHITECTURE.md) · audit backlog: [`docs/quality/CLEAN_ARCH_BACKLOG.md`](docs/quality/CLEAN_ARCH_BACKLOG.md) · Cursor rule: [`.cursor/rules/08-clean-code-architecture.mdc`](.cursor/rules/08-clean-code-architecture.mdc).
|
|
70
|
+
|
|
71
|
+
**Good first issues (Clean Architecture — Tier 4):** [`docs/GOOD_FIRST_ISSUES.md`](docs/GOOD_FIRST_ISSUES.md) § Tier 4 (label `clean-code`).
|
|
72
|
+
|
|
73
|
+
**Ghost Tooling:** do not name vendor AST indexers in issues or PRs; maintainers may use local graph-based code audit per [`docs/internal/LOCAL_CODE_STUDY.md`](docs/internal/LOCAL_CODE_STUDY.md). Run `make vendor-name-check` before docs PRs.
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
55
77
|
## 🏛️ Architectural Philosophy
|
|
56
78
|
|
|
57
79
|
Before writing any code, please understand our core principles:
|
|
@@ -124,7 +146,7 @@ CI runs the same commands as your local environment: `uv sync --all-extras`, the
|
|
|
124
146
|
make all
|
|
125
147
|
```
|
|
126
148
|
|
|
127
|
-
As of **v1.
|
|
149
|
+
As of **v1.6.0**, `make all` runs **456** pytest cases with **≥80%** line coverage on `src/logseq_matryca_parser` (currently ~**91%**), plus `make vendor-name-check`. 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
150
|
|
|
129
151
|
Or run each step individually:
|
|
130
152
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
.PHONY: all lint check test build
|
|
1
|
+
.PHONY: all lint check test build vendor-name-check
|
|
2
2
|
|
|
3
|
-
all: lint check test
|
|
3
|
+
all: lint check vendor-name-check test
|
|
4
4
|
|
|
5
5
|
lint:
|
|
6
6
|
uv run ruff check . --fix
|
|
@@ -8,6 +8,9 @@ lint:
|
|
|
8
8
|
check:
|
|
9
9
|
uv run mypy src/ tests/ examples/
|
|
10
10
|
|
|
11
|
+
vendor-name-check:
|
|
12
|
+
bash scripts/check_vendor_free_docs.sh
|
|
13
|
+
|
|
11
14
|
test:
|
|
12
15
|
uv run pytest --cov=src/logseq_matryca_parser --cov-report=term-missing --cov-fail-under=80 -v tests/
|
|
13
16
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: logseq-matryca-parser
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.6.0
|
|
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.
|
|
56
|
+
**v1.6.0** — Clean Architecture slices (`kinetic_export`, `synapse_embed`, layer CI), public `iter_attached_nodes()` / `is_tracked_markdown_path()`. **456 tests**. See [CHANGELOG](CHANGELOG.md).
|
|
57
57
|
|
|
58
58
|
> *Turning a forest of local plain-text files into a unified semantic powerhouse.*
|
|
59
59
|
|
|
@@ -63,7 +63,7 @@ Description-Content-Type: text/markdown
|
|
|
63
63
|
|
|
64
64
|
[👉 **TRY THE LIVE INTERACTIVE DEMO**](https://MarcoPorcellato.github.io/logseq-matryca-parser/)
|
|
65
65
|
|
|
66
|
-
[📘 **ARCHITECTURE**](docs/ARCHITECTURE.md) · [AST Primer](docs/logseq_ast_primer.md) · [Cookbook](docs/COOKBOOK.md) · [Good first issues](docs/GOOD_FIRST_ISSUES.md) · [Docs index](docs/README.md) · [CodeQL](docs/CODEQL.md) · [Changelog](CHANGELOG.md) · [Release process](docs/RELEASE_PROCESS.md)
|
|
66
|
+
[📘 **ARCHITECTURE**](docs/ARCHITECTURE.md) · [Clean Architecture SSOT](docs/CLEAN_CODE_ARCHITECTURE.md) · [AST Primer](docs/logseq_ast_primer.md) · [Cookbook](docs/COOKBOOK.md) · [Good first issues](docs/GOOD_FIRST_ISSUES.md) · [Docs index](docs/README.md) · [CodeQL](docs/CODEQL.md) · [Changelog](CHANGELOG.md) · [Release process](docs/RELEASE_PROCESS.md)
|
|
67
67
|
|
|
68
68
|
</div>
|
|
69
69
|
|
|
@@ -147,6 +147,43 @@ Logseq Matryca Parser is a deterministic **Stack-Machine engine** that acts as t
|
|
|
147
147
|
|
|
148
148
|
---
|
|
149
149
|
|
|
150
|
+
## ⚡ Release highlights (v1.6.0)
|
|
151
|
+
|
|
152
|
+
Minor release — Clean Architecture v1 structural slices and documentation SSOT. **No intentional breaking changes** to default CLI behavior or stable package exports.
|
|
153
|
+
|
|
154
|
+
| Area | Change |
|
|
155
|
+
| :--- | :--- |
|
|
156
|
+
| **KINETIC (SRP)** | `kinetic_export.py` (format handlers) + `kinetic_commands.py` (subcommands); `kinetic.py` is a ~230-line app factory ([#80](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/80), [#82](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/82)). |
|
|
157
|
+
| **SYNAPSE (OCP)** | `synapse_embed.py` — `BlockEmbedExpander` / `PageEmbedExpander` strategy ([#70](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/70)). |
|
|
158
|
+
| **Graph (ISP/DIP)** | Public `iter_attached_nodes()` and `is_tracked_markdown_path()` ([#81](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/81), [#68](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/68)). |
|
|
159
|
+
| **Quality gates** | `tests/test_layer_boundary.py` + `make vendor-name-check`; SSOT [`docs/CLEAN_CODE_ARCHITECTURE.md`](docs/CLEAN_CODE_ARCHITECTURE.md). |
|
|
160
|
+
| **Test suite** | **456** pytest cases (**+5** vs v1.5.0). |
|
|
161
|
+
|
|
162
|
+
---
|
|
163
|
+
|
|
164
|
+
## ⚡ Release highlights (v1.5.0)
|
|
165
|
+
|
|
166
|
+
Minor release — CLI vault hygiene for broken block references. **No intentional breaking changes** to default `scan` behavior (`--broken-refs` is opt-in).
|
|
167
|
+
|
|
168
|
+
| Area | Change |
|
|
169
|
+
| :--- | :--- |
|
|
170
|
+
| **KINETIC `scan`** | New `--broken-refs` flag prints unresolved `((uuid))` refs in a Rich table and exits `1` for CI pipelines ([#77](https://github.com/MarcoPorcellato/logseq-matryca-parser/pull/77)). |
|
|
171
|
+
| **Test suite** | **451** pytest cases (**+1** vs v1.4.2). |
|
|
172
|
+
|
|
173
|
+
---
|
|
174
|
+
|
|
175
|
+
## ⚡ Release highlights (v1.4.2)
|
|
176
|
+
|
|
177
|
+
Patch release — agent-write and SYNAPSE correctness fixes. **No intentional breaking changes** to public APIs.
|
|
178
|
+
|
|
179
|
+
| Area | Change |
|
|
180
|
+
| :--- | :--- |
|
|
181
|
+
| **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)). |
|
|
182
|
+
| **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)). |
|
|
183
|
+
| **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. |
|
|
184
|
+
|
|
185
|
+
---
|
|
186
|
+
|
|
150
187
|
## ⚡ Release highlights (v1.4.1)
|
|
151
188
|
|
|
152
189
|
Patch release — contributor test coverage and onboarding refresh. **No intentional changes** to parser, graph, or CLI runtime behavior.
|
|
@@ -330,7 +367,7 @@ matryca-parse agent-read /path/to/graph --tag idea
|
|
|
330
367
|
matryca-parse agent-write /path/to/graph --alias 0 --content "Follow-up from the agent"
|
|
331
368
|
```
|
|
332
369
|
|
|
333
|
-
For graph hygiene, **`LogseqGraph.get_broken_references()`** flags nodes whose `((uuid))` block refs point at missing registry targets—structural linting, not regex guessing.
|
|
370
|
+
For graph hygiene, **`LogseqGraph.get_broken_references()`** flags nodes whose `((uuid))` block refs point at missing registry targets—structural linting, not regex guessing. From the CLI: `matryca-parse scan /path/to/graph --broken-refs` (exit `1` when broken refs exist).
|
|
334
371
|
|
|
335
372
|
---
|
|
336
373
|
|
|
@@ -348,7 +385,7 @@ For graph hygiene, **`LogseqGraph.get_broken_references()`** flags nodes whose `
|
|
|
348
385
|
| **Agent-Native Printing Press** | [`agent_press.py`](src/logseq_matryca_parser/agent_press.py): **`SessionAliasRegistry`** maps session aliases ↔ block UUIDs; **`to_xray_markdown`** emits token-minimal outline text for autonomous agents (`matryca-parse agent-read`). |
|
|
349
386
|
| **Native Markdown Serialization** | [`logseq_markdown.py`](src/logseq_matryca_parser/logseq_markdown.py) + [`logseq_paths.py`](src/logseq_matryca_parser/logseq_paths.py): rebuild and write Logseq-compliant markdown from an AST—page header preserves **YAML `---` or native `key::`** by source format, block properties at **parent whitespace + 2 spaces** (including bullet-list `tags::`), `:LOGBOOK:` drawers, and namespace titles via **`___`** pathing rules. |
|
|
350
387
|
| **Headless Write Engine** | [`agent_writer.py`](src/logseq_matryca_parser/agent_writer.py): **`append_child_to_node`** splices child bullets into on-disk Markdown from AST topology; **`serialize_logseq_page`** / **`write_logseq_page`** emit full pages; **`matryca-parse agent-write`** resolves aliases via **`.matryca_xray_state.json`**. |
|
|
351
|
-
| **AST Linters** | **`LogseqGraph.get_broken_references()`** returns originating nodes when `block_refs` target UUIDs absent from the global registry. |
|
|
388
|
+
| **AST Linters** | **`LogseqGraph.get_broken_references()`** returns originating nodes when `block_refs` target UUIDs absent from the global registry; **`matryca-parse scan --broken-refs`** exposes the same check from KINETIC (v1.5.0). |
|
|
352
389
|
| **Sovereign AI** | 100% Local. Zero telemetry. Private by design. |
|
|
353
390
|
|
|
354
391
|
### Data model — `LogseqNode` task fields
|
|
@@ -373,7 +410,7 @@ Marker syntax (`[#A]`, `SCHEDULED: <...>`, `DEADLINE: <...>`) is stripped from `
|
|
|
373
410
|
## 🛠️ Quickstart
|
|
374
411
|
|
|
375
412
|
```bash
|
|
376
|
-
# Install from PyPI (latest: v1.
|
|
413
|
+
# Install from PyPI (latest: v1.6.0)
|
|
377
414
|
uv pip install logseq-matryca-parser
|
|
378
415
|
|
|
379
416
|
# Optional: filesystem watcher for live incremental graph updates
|