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.
Files changed (126) hide show
  1. logseq_matryca_parser-1.6.0/.github/ISSUE_TEMPLATE/clean_architecture.yml +61 -0
  2. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/.github/ISSUE_TEMPLATE/config.yml +3 -0
  3. logseq_matryca_parser-1.6.0/.github/clean_arch_issue_numbers.txt +7 -0
  4. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/.github/labels.yml +8 -0
  5. logseq_matryca_parser-1.6.0/.github/scripts/create_clean_arch_issues.sh +277 -0
  6. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/CHANGELOG.md +56 -0
  7. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/CONTRIBUTING.md +24 -2
  8. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/Makefile +5 -2
  9. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/PKG-INFO +43 -6
  10. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/README.md +42 -5
  11. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/SECURITY.md +2 -2
  12. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/docs/ARCHITECTURE.md +33 -9
  13. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/docs/BUG_HUNT_REPORT.md +4 -0
  14. logseq_matryca_parser-1.6.0/docs/CLEAN_CODE_ARCHITECTURE.md +301 -0
  15. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/docs/CODEQL.md +1 -1
  16. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/docs/COOKBOOK.md +4 -0
  17. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/docs/GOOD_FIRST_ISSUES.md +57 -21
  18. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/docs/README.md +4 -1
  19. logseq_matryca_parser-1.6.0/docs/design-docs/README.md +13 -0
  20. logseq_matryca_parser-1.6.0/docs/internal/LOCAL_CODE_STUDY.md +117 -0
  21. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/docs/internal/STATIC_ANALYSIS_POLICY.md +1 -0
  22. logseq_matryca_parser-1.6.0/docs/quality/CLEAN_ARCH_BACKLOG.md +67 -0
  23. logseq_matryca_parser-1.6.0/docs/quality/GITHUB_CLEAN_ARCH_ROADMAP.md +87 -0
  24. logseq_matryca_parser-1.6.0/docs/quality/ISSUE_TRIAGE_2026-07.md +94 -0
  25. logseq_matryca_parser-1.6.0/docs/quality/README.md +25 -0
  26. logseq_matryca_parser-1.6.0/metrics/index.json +10 -0
  27. logseq_matryca_parser-1.4.1/metrics/history.json → logseq_matryca_parser-1.6.0/metrics/quarters/2026-Q2.json +1915 -726
  28. logseq_matryca_parser-1.6.0/metrics/quarters/2026-Q3.json +185 -0
  29. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/pyproject.toml +3 -2
  30. logseq_matryca_parser-1.6.0/scripts/check_vendor_free_docs.sh +16 -0
  31. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/src/logseq_matryca_parser/__init__.py +1 -1
  32. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/src/logseq_matryca_parser/agent_press.py +57 -4
  33. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/src/logseq_matryca_parser/agent_writer.py +2 -0
  34. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/src/logseq_matryca_parser/exceptions.py +4 -0
  35. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/src/logseq_matryca_parser/graph.py +9 -1
  36. logseq_matryca_parser-1.6.0/src/logseq_matryca_parser/kinetic.py +230 -0
  37. logseq_matryca_parser-1.6.0/src/logseq_matryca_parser/kinetic_commands.py +364 -0
  38. logseq_matryca_parser-1.6.0/src/logseq_matryca_parser/kinetic_export.py +133 -0
  39. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/src/logseq_matryca_parser/synapse.py +20 -68
  40. logseq_matryca_parser-1.6.0/src/logseq_matryca_parser/synapse_embed.py +180 -0
  41. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/tests/test_agent_press.py +45 -0
  42. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/tests/test_agent_writer.py +51 -0
  43. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/tests/test_extract_changelog.py +43 -0
  44. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/tests/test_forge.py +93 -1
  45. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/tests/test_graph.py +76 -1
  46. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/tests/test_kinetic.py +122 -3
  47. logseq_matryca_parser-1.6.0/tests/test_layer_boundary.py +122 -0
  48. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/tests/test_lens.py +30 -0
  49. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/tests/test_logseq_markdown.py +39 -0
  50. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/tests/test_synapse.py +87 -1
  51. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/uv.lock +1 -1
  52. logseq_matryca_parser-1.4.1/docs/design-docs/README.md +0 -11
  53. logseq_matryca_parser-1.4.1/src/logseq_matryca_parser/kinetic.py +0 -666
  54. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/.cursorignore +0 -0
  55. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/.cursorrules +0 -0
  56. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/.github/CODEOWNERS +0 -0
  57. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/.github/FUNDING.yml +0 -0
  58. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  59. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  60. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  61. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/.github/dependabot.yml +0 -0
  62. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/.github/scripts/create_good_first_issues.sh +0 -0
  63. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/.github/workflows/ci.yml +0 -0
  64. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/.github/workflows/daily-metrics.yml +0 -0
  65. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/.github/workflows/github_release.yml +0 -0
  66. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/.github/workflows/pypi_publish.yml +0 -0
  67. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/.gitignore +0 -0
  68. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/.pre-commit-config.yaml +0 -0
  69. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/.repomixignore +0 -0
  70. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/CODE_OF_CONDUCT.md +0 -0
  71. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/LICENSE +0 -0
  72. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/NOTICE +0 -0
  73. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/claude-skill-logseq-read/SKILL.md +0 -0
  74. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/claude-skill-logseq-read/scripts/parse_logseq.py +0 -0
  75. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/docs/RELEASE_PROCESS.md +0 -0
  76. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/docs/design-docs/ARCHITECTURE_BLUEPRINT.md +0 -0
  77. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/docs/design-docs/CODE_SCAFFOLD.md +0 -0
  78. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/docs/design-docs/LOGSEQ_ASSET_RESOLUTION_SPEC.md +0 -0
  79. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/docs/design-docs/LOGSEQ_DATASCRIPT_MAPPING.md +0 -0
  80. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/docs/design-docs/LOGSEQ_TEMPORAL_ONTOLOGY.md +0 -0
  81. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/docs/design-docs/OFFICIAL_MLDOC_SPECS.md +0 -0
  82. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/docs/design-docs/REFERENCE_SPEC.md +0 -0
  83. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/docs/error_log.md +0 -0
  84. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/docs/logseq_ast_primer.md +0 -0
  85. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/docs/rfc/OLLAMA_RAG.md +0 -0
  86. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/docs/roadmaps/ROADMAP_AGENT_NATIVE_XRAY.md +0 -0
  87. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/docs/roadmaps/ROADMAP_CLI_HYDRATION_AND_ENRICHMENT.md +0 -0
  88. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/docs/roadmaps/ROADMAP_CONTEXT_SYNTHESIS_AND_SCOPING.md +0 -0
  89. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/docs/roadmaps/ROADMAP_EMBED_EXPANSION_AND_FLUENT_QUERIES.md +0 -0
  90. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/docs/roadmaps/ROADMAP_GRAPH_RAG_SEMANTICS.md +0 -0
  91. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/docs/roadmaps/ROADMAP_HEADLESS_WRITER.md +0 -0
  92. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/docs/roadmaps/ROADMAP_INCREMENTAL_WATCHER.md +0 -0
  93. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/docs/roadmaps/ROADMAP_INLINE_SHIELD_AND_NAMESPACES.md +0 -0
  94. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/docs/roadmaps/ROADMAP_OBSIDIAN_ADAPTER.md +0 -0
  95. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/docs/roadmaps/ROADMAP_ROBUSTNESS_AND_SOFT_BREAKS.md +0 -0
  96. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/docs/roadmaps/ROADMAP_TOML_FIX_AND_PYPI_DISTRIBUTION.md +0 -0
  97. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/docs/roadmaps/ROADMAP_UUID_AND_GRAPH_SUPERPOWERS.md +0 -0
  98. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/examples/demo_logseq_journal.md +0 -0
  99. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/examples/run_demo.py +0 -0
  100. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/legacy/local_digestor.py +0 -0
  101. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/lib/bindings/utils.js +0 -0
  102. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/lib/tom-select/tom-select.complete.min.js +0 -0
  103. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/lib/tom-select/tom-select.css +0 -0
  104. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/lib/vis-9.1.2/vis-network.css +0 -0
  105. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/lib/vis-9.1.2/vis-network.min.js +0 -0
  106. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/repomix-output-parser.xml +0 -0
  107. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/scripts/__init__.py +0 -0
  108. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/scripts/archive_repository_metrics.py +0 -0
  109. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/scripts/debug_pre_release.py +0 -0
  110. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/scripts/extract_changelog.py +0 -0
  111. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/src/logseq_matryca_parser/.gitignore +0 -0
  112. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/src/logseq_matryca_parser/NOTICE +0 -0
  113. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/src/logseq_matryca_parser/__main__.py +0 -0
  114. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/src/logseq_matryca_parser/forge.py +0 -0
  115. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/src/logseq_matryca_parser/lens.py +0 -0
  116. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/src/logseq_matryca_parser/logos_core.py +0 -0
  117. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/src/logseq_matryca_parser/logos_parser.py +0 -0
  118. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/src/logseq_matryca_parser/logseq_markdown.py +0 -0
  119. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/src/logseq_matryca_parser/logseq_paths.py +0 -0
  120. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/src/logseq_matryca_parser/pyproject.toml +0 -0
  121. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/tests/test_archive_repository_metrics.py +0 -0
  122. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/tests/test_exceptions.py +0 -0
  123. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/tests/test_logos_parser.py +0 -0
  124. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/tests/test_logseq_paths.py +0 -0
  125. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.6.0}/tests/test_package_version.py +0 -0
  126. {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
@@ -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
@@ -0,0 +1,7 @@
1
+ milestone=2
2
+ EPIC=78
3
+ PHASE0=79
4
+ PHASE1=80
5
+ PHASE3A=81
6
+ PHASE3B=82
7
+ PHASE4=83
@@ -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.4.1**) and **Unreleased** changes (Keep a Changelog)
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.4.1**, `make test` runs **378** pytest cases with **≥80%** line coverage on `src/logseq_matryca_parser` (currently ~**90%**). 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.
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.4.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
  [![Status: Stable](https://img.shields.io/badge/Status-Stable-22c55e.svg?style=flat-square)](#)
54
54
  ![Origin: Matryca.ai](https://img.shields.io/badge/Origin-Matryca.ai-gold?style=for-the-badge)
55
55
 
56
- **v1.4.1** — Test-hardening patch: **378 tests** (+107), community coverage for parser helpers, CLI agents, FORGE visitors, and wave-2 good-first issues ([#43](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/43)–[#52](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/52)) — no production API changes (see [CHANGELOG](CHANGELOG.md)).
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.4.1)
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