okf-parser 0.45.4__tar.gz → 0.45.6__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 (355) hide show
  1. okf_parser-0.45.6/.okfignore +4 -0
  2. {okf_parser-0.45.4 → okf_parser-0.45.6}/Cargo.lock +2 -2
  3. okf_parser-0.45.6/PKG-INFO +376 -0
  4. {okf_parser-0.45.4 → okf_parser-0.45.6}/README.md +1 -1
  5. okf_parser-0.45.4/PKG-INFO → okf_parser-0.45.6/README.pypi.md +2 -31
  6. okf_parser-0.45.6/changelog/0.45.5/scoped-npm-packages.md +9 -0
  7. okf_parser-0.45.6/changelog/0.45.6/pypi-project-page.md +10 -0
  8. {okf_parser-0.45.4 → okf_parser-0.45.6}/docs/native-engine.md +2 -2
  9. {okf_parser-0.45.4 → okf_parser-0.45.6}/docs/releasing.md +9 -7
  10. okf_parser-0.45.6/native-npm-linux-x64/README.md +15 -0
  11. {okf_parser-0.45.4 → okf_parser-0.45.6}/native-npm-linux-x64/package.json +2 -2
  12. {okf_parser-0.45.4 → okf_parser-0.45.6}/okf-engine/Cargo.toml +1 -1
  13. {okf_parser-0.45.4 → okf_parser-0.45.6}/pyproject.toml +35 -2
  14. {okf_parser-0.45.4 → okf_parser-0.45.6}/rfcs/0003-resumable-multi-registry-release.md +28 -7
  15. {okf_parser-0.45.4 → okf_parser-0.45.6}/rust-core/Cargo.toml +2 -2
  16. okf_parser-0.45.6/scripts/pypi_readme.py +72 -0
  17. {okf_parser-0.45.4 → okf_parser-0.45.6}/scripts/registry_state.py +10 -3
  18. {okf_parser-0.45.4 → okf_parser-0.45.6}/scripts/release_contract.py +14 -11
  19. okf_parser-0.45.6/tests/test_pypi_readme.py +58 -0
  20. {okf_parser-0.45.4 → okf_parser-0.45.6}/tests/test_release_contract.py +19 -12
  21. okf_parser-0.45.6/typescript/LICENSE +21 -0
  22. {okf_parser-0.45.4 → okf_parser-0.45.6}/typescript/README.md +8 -8
  23. {okf_parser-0.45.4 → okf_parser-0.45.6}/typescript/package-lock.json +11 -11
  24. {okf_parser-0.45.4 → okf_parser-0.45.6}/typescript/package.json +3 -3
  25. {okf_parser-0.45.4 → okf_parser-0.45.6}/typescript/src/rust-core.ts +1 -1
  26. okf_parser-0.45.6/typescript/src/version.ts +1 -0
  27. {okf_parser-0.45.4 → okf_parser-0.45.6}/typescript-duckdb/README.md +6 -6
  28. {okf_parser-0.45.4 → okf_parser-0.45.6}/typescript-duckdb/package-lock.json +13 -13
  29. {okf_parser-0.45.4 → okf_parser-0.45.6}/typescript-duckdb/package.json +4 -4
  30. {okf_parser-0.45.4 → okf_parser-0.45.6}/typescript-duckdb/src/declared.ts +1 -1
  31. {okf_parser-0.45.4 → okf_parser-0.45.6}/typescript-duckdb/src/normalized.ts +1 -1
  32. {okf_parser-0.45.4 → okf_parser-0.45.6}/typescript-duckdb/src/session.ts +1 -1
  33. {okf_parser-0.45.4 → okf_parser-0.45.6}/typescript-duckdb/src/typed.ts +1 -1
  34. {okf_parser-0.45.4 → okf_parser-0.45.6}/typescript-duckdb/test/duckdb.test.ts +2 -2
  35. {okf_parser-0.45.4 → okf_parser-0.45.6}/uv.lock +4 -4
  36. okf_parser-0.45.4/native-npm-linux-x64/README.md +0 -15
  37. okf_parser-0.45.4/typescript/src/version.ts +0 -1
  38. {okf_parser-0.45.4 → okf_parser-0.45.6}/.gitignore +0 -0
  39. {okf_parser-0.45.4 → okf_parser-0.45.6}/Cargo.toml +0 -0
  40. {okf_parser-0.45.4/typescript-duckdb → okf_parser-0.45.6}/LICENSE +0 -0
  41. {okf_parser-0.45.4 → okf_parser-0.45.6}/action.yml +0 -0
  42. {okf_parser-0.45.4 → okf_parser-0.45.6}/benchmarks/README.md +0 -0
  43. {okf_parser-0.45.4 → okf_parser-0.45.6}/benchmarks/__init__.py +0 -0
  44. {okf_parser-0.45.4 → okf_parser-0.45.6}/benchmarks/python_parser.py +0 -0
  45. {okf_parser-0.45.4 → okf_parser-0.45.6}/benchmarks/results/2026-08-08-rust-mvp.md +0 -0
  46. {okf_parser-0.45.4 → okf_parser-0.45.6}/benchmarks/results/2026-08-09-rust-e2e.md +0 -0
  47. {okf_parser-0.45.4 → okf_parser-0.45.6}/benchmarks/rust-facts.mjs +0 -0
  48. {okf_parser-0.45.4 → okf_parser-0.45.6}/benchmarks/rust_facts.py +0 -0
  49. {okf_parser-0.45.4 → okf_parser-0.45.6}/benchmarks/typescript-parser.mjs +0 -0
  50. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.1.0.md +0 -0
  51. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.10.0.md +0 -0
  52. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.11.0.md +0 -0
  53. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.11.1.md +0 -0
  54. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.12.0.md +0 -0
  55. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.13.0.md +0 -0
  56. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.14.0.md +0 -0
  57. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.14.1.md +0 -0
  58. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.14.2.md +0 -0
  59. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.15.0.md +0 -0
  60. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.15.1.md +0 -0
  61. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.15.2.md +0 -0
  62. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.15.3.md +0 -0
  63. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.15.4.md +0 -0
  64. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.16.0.md +0 -0
  65. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.17.0.md +0 -0
  66. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.18.0.md +0 -0
  67. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.18.1.md +0 -0
  68. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.19.0.md +0 -0
  69. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.19.1.md +0 -0
  70. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.2.0.md +0 -0
  71. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.20.0.md +0 -0
  72. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.20.1.md +0 -0
  73. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.21.0.md +0 -0
  74. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.22.0.md +0 -0
  75. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.23.0.md +0 -0
  76. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.24.0.md +0 -0
  77. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.25.0.md +0 -0
  78. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.26.0.md +0 -0
  79. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.27.0.md +0 -0
  80. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.28.0.md +0 -0
  81. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.29.0.md +0 -0
  82. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.3.0.md +0 -0
  83. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.30.0.md +0 -0
  84. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.31.0.md +0 -0
  85. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.32.0.md +0 -0
  86. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.32.1.md +0 -0
  87. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.33.0.md +0 -0
  88. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.34.0.md +0 -0
  89. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.35.0.md +0 -0
  90. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.36.0.md +0 -0
  91. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.37.0.md +0 -0
  92. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.38.0.md +0 -0
  93. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.39.0.md +0 -0
  94. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.39.1.md +0 -0
  95. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.4.0.md +0 -0
  96. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.40.0.md +0 -0
  97. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.41.0.md +0 -0
  98. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.41.1.md +0 -0
  99. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.41.2.md +0 -0
  100. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.41.3.md +0 -0
  101. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.42.0.md +0 -0
  102. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.42.1.md +0 -0
  103. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.42.2.md +0 -0
  104. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.42.3.md +0 -0
  105. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.42.4.md +0 -0
  106. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.42.5.md +0 -0
  107. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.42.6.md +0 -0
  108. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.42.7.md +0 -0
  109. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.42.8.md +0 -0
  110. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.43.0.md +0 -0
  111. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.43.1.md +0 -0
  112. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.44.0.md +0 -0
  113. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.45.0.md +0 -0
  114. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.45.1.md +0 -0
  115. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.45.2.md +0 -0
  116. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.45.3/correct-0-45-2-notes.md +0 -0
  117. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.45.3/pep723-workflow-python.md +0 -0
  118. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.45.3/uv-first-release-validation.md +0 -0
  119. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.45.3/version-belongs-to-the-release.md +0 -0
  120. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.45.4/agent-first-search-rfc.md +0 -0
  121. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.45.4/atomic-import-writes.md +0 -0
  122. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.45.4/codebase-to-okf-lexical-containment.md +0 -0
  123. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.45.4/codebase-to-okf-local-import-resolution.md +0 -0
  124. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.45.4/codebase-to-okf-one-shot.md +0 -0
  125. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.45.4/codebase-to-okf-project-manifest.md +0 -0
  126. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.45.4/codebase-to-okf-self-describing-types.md +0 -0
  127. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.45.4/codebase-to-okf-skill.md +0 -0
  128. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.45.4/duckdb-extension-concepts-slice.md +0 -0
  129. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.45.4/duckdb-extension-read-surface.md +0 -0
  130. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.45.4/git-commit-envelope.md +0 -0
  131. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.45.4/projection-documents.md +0 -0
  132. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.45.4/referential-schema-export-embed-mode.md +0 -0
  133. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.45.4/referential-schema-export-key-mode.md +0 -0
  134. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.45.4/referential-schema-export.md +0 -0
  135. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.45.4/refs-depth-and-composite-keys.md +0 -0
  136. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.45.4/rfc-0015-canonical-markdown-ir.md +0 -0
  137. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.45.4/rfc0009-git-commits.md +0 -0
  138. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.45.4/rfc0010-native-duckdb-extension.md +0 -0
  139. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.45.4/rfc0011-tracked-migrations.md +0 -0
  140. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.45.4/rfc0015-rust-markdown-ast.md +0 -0
  141. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.45.4/rfc0017-fact-profile.md +0 -0
  142. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.45.4/rfc0018-projection-export.md +0 -0
  143. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.45.4/type-specifications.md +0 -0
  144. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.5.0.md +0 -0
  145. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.5.1.md +0 -0
  146. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.6.0.md +0 -0
  147. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.7.0.md +0 -0
  148. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.8.0.md +0 -0
  149. {okf_parser-0.45.4 → okf_parser-0.45.6}/changelog/0.9.0.md +0 -0
  150. {okf_parser-0.45.4 → okf_parser-0.45.6}/conformance/content-digests.json +0 -0
  151. {okf_parser-0.45.4 → okf_parser-0.45.6}/conformance/exclusion.json +0 -0
  152. {okf_parser-0.45.4 → okf_parser-0.45.6}/conformance/formatting.json +0 -0
  153. {okf_parser-0.45.4 → okf_parser-0.45.6}/conformance/frontmatter.json +0 -0
  154. {okf_parser-0.45.4 → okf_parser-0.45.6}/conformance/git-commit-messages.json +0 -0
  155. {okf_parser-0.45.4 → okf_parser-0.45.6}/conformance/schema-inference.json +0 -0
  156. {okf_parser-0.45.4 → okf_parser-0.45.6}/conformance/schema-output.json +0 -0
  157. {okf_parser-0.45.4 → okf_parser-0.45.6}/conformance/type-spec-slugs.json +0 -0
  158. {okf_parser-0.45.4 → okf_parser-0.45.6}/docs/architecture.md +0 -0
  159. {okf_parser-0.45.4 → okf_parser-0.45.6}/docs/cli.md +0 -0
  160. {okf_parser-0.45.4 → okf_parser-0.45.6}/docs/graphql.md +0 -0
  161. {okf_parser-0.45.4 → okf_parser-0.45.6}/docs/types/architecture.md +0 -0
  162. {okf_parser-0.45.4 → okf_parser-0.45.6}/docs/types/benchmarkresult.md +0 -0
  163. {okf_parser-0.45.4 → okf_parser-0.45.6}/docs/types/documentation.md +0 -0
  164. {okf_parser-0.45.4 → okf_parser-0.45.6}/docs/types/procedure.md +0 -0
  165. {okf_parser-0.45.4 → okf_parser-0.45.6}/docs/types/project.md +0 -0
  166. {okf_parser-0.45.4 → okf_parser-0.45.6}/docs/types/release-note.md +0 -0
  167. {okf_parser-0.45.4 → okf_parser-0.45.6}/docs/types/release.md +0 -0
  168. {okf_parser-0.45.4 → okf_parser-0.45.6}/docs/types/rfc.md +0 -0
  169. {okf_parser-0.45.4 → okf_parser-0.45.6}/docs/types/skill.md +0 -0
  170. {okf_parser-0.45.4 → okf_parser-0.45.6}/docs/types/spec.md +0 -0
  171. {okf_parser-0.45.4 → okf_parser-0.45.6}/duckdb-extension/Cargo.toml +0 -0
  172. {okf_parser-0.45.4 → okf_parser-0.45.6}/duckdb-extension/Makefile +0 -0
  173. {okf_parser-0.45.4 → okf_parser-0.45.6}/duckdb-extension/README.md +0 -0
  174. {okf_parser-0.45.4 → okf_parser-0.45.6}/duckdb-extension/src/lib.rs +0 -0
  175. {okf_parser-0.45.4 → okf_parser-0.45.6}/duckdb-extension/test/knowledge/index.md +0 -0
  176. {okf_parser-0.45.4 → okf_parser-0.45.6}/duckdb-extension/test/knowledge/node.md +0 -0
  177. {okf_parser-0.45.4 → okf_parser-0.45.6}/examples/minimal/concepts/access-review.md +0 -0
  178. {okf_parser-0.45.4 → okf_parser-0.45.6}/examples/minimal/concepts/onboarding.md +0 -0
  179. {okf_parser-0.45.4 → okf_parser-0.45.6}/examples/minimal/index.md +0 -0
  180. {okf_parser-0.45.4 → okf_parser-0.45.6}/examples/minimal/log.md +0 -0
  181. {okf_parser-0.45.4 → okf_parser-0.45.6}/fastmcp.json +0 -0
  182. {okf_parser-0.45.4 → okf_parser-0.45.6}/okf-engine/src/engine.rs +0 -0
  183. {okf_parser-0.45.4 → okf_parser-0.45.6}/okf-engine/src/lib.rs +0 -0
  184. {okf_parser-0.45.4 → okf_parser-0.45.6}/okf-engine/src/yaml.rs +0 -0
  185. {okf_parser-0.45.4 → okf_parser-0.45.6}/rfcs/0001-python-model-codegen.md +0 -0
  186. {okf_parser-0.45.4 → okf_parser-0.45.6}/rfcs/0002-typescript-sibling-package.md +0 -0
  187. {okf_parser-0.45.4 → okf_parser-0.45.6}/rfcs/0004-gitignore-exclusion-semantics.md +0 -0
  188. {okf_parser-0.45.4 → okf_parser-0.45.6}/rfcs/0005-relational-frontmatter-writes.md +0 -0
  189. {okf_parser-0.45.4 → okf_parser-0.45.6}/rfcs/0006-declared-column-types.md +0 -0
  190. {okf_parser-0.45.4 → okf_parser-0.45.6}/rfcs/0007-declared-relational-constraints.md +0 -0
  191. {okf_parser-0.45.4 → okf_parser-0.45.6}/rfcs/0008-effect-aware-mcp-writes.md +0 -0
  192. {okf_parser-0.45.4 → okf_parser-0.45.6}/rfcs/0009-git-commits-as-okf.md +0 -0
  193. {okf_parser-0.45.4 → okf_parser-0.45.6}/rfcs/0010-native-duckdb-extension.md +0 -0
  194. {okf_parser-0.45.4 → okf_parser-0.45.6}/rfcs/0011-tracked-migrations.md +0 -0
  195. {okf_parser-0.45.4 → okf_parser-0.45.6}/rfcs/0015-canonical-rust-markdown-ast-and-typed-document-model.md +0 -0
  196. {okf_parser-0.45.4 → okf_parser-0.45.6}/rfcs/0016-agent-first-bundle-search-and-retrieval.md +0 -0
  197. {okf_parser-0.45.4 → okf_parser-0.45.6}/rfcs/0017-fact-profile.md +0 -0
  198. {okf_parser-0.45.4 → okf_parser-0.45.6}/rfcs/0018-referential-schema-export-and-projections.md +0 -0
  199. {okf_parser-0.45.4 → okf_parser-0.45.6}/rfcs/0019-self-contained-recipe-skills.md +0 -0
  200. {okf_parser-0.45.4 → okf_parser-0.45.6}/rust-core/.gitignore +0 -0
  201. {okf_parser-0.45.4 → okf_parser-0.45.6}/rust-core/src/engine.rs +0 -0
  202. {okf_parser-0.45.4 → okf_parser-0.45.6}/rust-core/src/main.rs +0 -0
  203. {okf_parser-0.45.4 → okf_parser-0.45.6}/scripts/__init__.py +0 -0
  204. {okf_parser-0.45.4 → okf_parser-0.45.6}/scripts/changelog_notes.py +0 -0
  205. {okf_parser-0.45.4 → okf_parser-0.45.6}/scripts/check_no_duckdb_link.py +0 -0
  206. {okf_parser-0.45.4 → okf_parser-0.45.6}/scripts/native_from_wheel.py +0 -0
  207. {okf_parser-0.45.4 → okf_parser-0.45.6}/scripts/project_version.py +0 -0
  208. {okf_parser-0.45.4 → okf_parser-0.45.6}/scripts/release_summary.py +0 -0
  209. {okf_parser-0.45.4 → okf_parser-0.45.6}/scripts/verify_wheel_scripts.py +0 -0
  210. {okf_parser-0.45.4 → okf_parser-0.45.6}/skills/codebase-to-okf/SKILL.md +0 -0
  211. {okf_parser-0.45.4 → okf_parser-0.45.6}/skills/codebase-to-okf/scripts/codebase_to_okf.py +0 -0
  212. {okf_parser-0.45.4 → okf_parser-0.45.6}/skills/codebase-to-okf/scripts/finalize_codebase_okf.py +0 -0
  213. {okf_parser-0.45.4 → okf_parser-0.45.6}/skills/codebase-to-okf/scripts/python_codebase_to_okf.py +0 -0
  214. {okf_parser-0.45.4 → okf_parser-0.45.6}/skills/codebase-to-okf/scripts/python_project_metadata_to_okf.py +0 -0
  215. {okf_parser-0.45.4 → okf_parser-0.45.6}/skills/codebase-to-okf/scripts/query_codebase_okf.py +0 -0
  216. {okf_parser-0.45.4 → okf_parser-0.45.6}/skills/codebase-to-okf/scripts/resolve_codebase_okf.py +0 -0
  217. {okf_parser-0.45.4 → okf_parser-0.45.6}/src/okf_parser/__init__.py +0 -0
  218. {okf_parser-0.45.4 → okf_parser-0.45.6}/src/okf_parser/apply.py +0 -0
  219. {okf_parser-0.45.4 → okf_parser-0.45.6}/src/okf_parser/bundle.py +0 -0
  220. {okf_parser-0.45.4 → okf_parser-0.45.6}/src/okf_parser/bundle_import.py +0 -0
  221. {okf_parser-0.45.4 → okf_parser-0.45.6}/src/okf_parser/classification.py +0 -0
  222. {okf_parser-0.45.4 → okf_parser-0.45.6}/src/okf_parser/cli.py +0 -0
  223. {okf_parser-0.45.4 → okf_parser-0.45.6}/src/okf_parser/concepts.py +0 -0
  224. {okf_parser-0.45.4 → okf_parser-0.45.6}/src/okf_parser/declared_schema.py +0 -0
  225. {okf_parser-0.45.4 → okf_parser-0.45.6}/src/okf_parser/digests.py +0 -0
  226. {okf_parser-0.45.4 → okf_parser-0.45.6}/src/okf_parser/discovery.py +0 -0
  227. {okf_parser-0.45.4 → okf_parser-0.45.6}/src/okf_parser/duckdb.py +0 -0
  228. {okf_parser-0.45.4 → okf_parser-0.45.6}/src/okf_parser/duckdb_types.py +0 -0
  229. {okf_parser-0.45.4 → okf_parser-0.45.6}/src/okf_parser/edit.py +0 -0
  230. {okf_parser-0.45.4 → okf_parser-0.45.6}/src/okf_parser/engine.py +0 -0
  231. {okf_parser-0.45.4 → okf_parser-0.45.6}/src/okf_parser/exclusion.py +0 -0
  232. {okf_parser-0.45.4 → okf_parser-0.45.6}/src/okf_parser/formatting.py +0 -0
  233. {okf_parser-0.45.4 → okf_parser-0.45.6}/src/okf_parser/git_commit.py +0 -0
  234. {okf_parser-0.45.4 → okf_parser-0.45.6}/src/okf_parser/git_commit_cli.py +0 -0
  235. {okf_parser-0.45.4 → okf_parser-0.45.6}/src/okf_parser/graphql_adapter.py +0 -0
  236. {okf_parser-0.45.4 → okf_parser-0.45.6}/src/okf_parser/ingestion.py +0 -0
  237. {okf_parser-0.45.4 → okf_parser-0.45.6}/src/okf_parser/markdown_style.py +0 -0
  238. {okf_parser-0.45.4 → okf_parser-0.45.6}/src/okf_parser/models.py +0 -0
  239. {okf_parser-0.45.4 → okf_parser-0.45.6}/src/okf_parser/parser.py +0 -0
  240. {okf_parser-0.45.4 → okf_parser-0.45.6}/src/okf_parser/projection_export.py +0 -0
  241. {okf_parser-0.45.4 → okf_parser-0.45.6}/src/okf_parser/projections.py +0 -0
  242. {okf_parser-0.45.4 → okf_parser-0.45.6}/src/okf_parser/pydantic_projection.py +0 -0
  243. {okf_parser-0.45.4 → okf_parser-0.45.6}/src/okf_parser/relational_schema.py +0 -0
  244. {okf_parser-0.45.4 → okf_parser-0.45.6}/src/okf_parser/rust_core.py +0 -0
  245. {okf_parser-0.45.4 → okf_parser-0.45.6}/src/okf_parser/schema_contract.py +0 -0
  246. {okf_parser-0.45.4 → okf_parser-0.45.6}/src/okf_parser/schema_export.py +0 -0
  247. {okf_parser-0.45.4 → okf_parser-0.45.6}/src/okf_parser/schema_lexemes.py +0 -0
  248. {okf_parser-0.45.4 → okf_parser-0.45.6}/src/okf_parser/schema_references.py +0 -0
  249. {okf_parser-0.45.4 → okf_parser-0.45.6}/src/okf_parser/service.py +0 -0
  250. {okf_parser-0.45.4 → okf_parser-0.45.6}/src/okf_parser/spec_scaffold.py +0 -0
  251. {okf_parser-0.45.4 → okf_parser-0.45.6}/src/okf_parser/type_specs.py +0 -0
  252. {okf_parser-0.45.4 → okf_parser-0.45.6}/src/okf_parser/typed_relations.py +0 -0
  253. {okf_parser-0.45.4 → okf_parser-0.45.6}/src/okf_parser/typed_tables.py +0 -0
  254. {okf_parser-0.45.4 → okf_parser-0.45.6}/src/okf_parser/write_support.py +0 -0
  255. {okf_parser-0.45.4 → okf_parser-0.45.6}/tests/__init__.py +0 -0
  256. {okf_parser-0.45.4 → okf_parser-0.45.6}/tests/fixtures/__init__.py +0 -0
  257. {okf_parser-0.45.4 → okf_parser-0.45.6}/tests/fixtures/declared_parity.expected.json +0 -0
  258. {okf_parser-0.45.4 → okf_parser-0.45.6}/tests/fixtures/declared_parity.schema.sql +0 -0
  259. {okf_parser-0.45.4 → okf_parser-0.45.6}/tests/fixtures/pydantic_adversarial_generated.py +0 -0
  260. {okf_parser-0.45.4 → okf_parser-0.45.6}/tests/fixtures/pydantic_generated.py +0 -0
  261. {okf_parser-0.45.4 → okf_parser-0.45.6}/tests/test_apply.py +0 -0
  262. {okf_parser-0.45.4 → okf_parser-0.45.6}/tests/test_apply_preview_token.py +0 -0
  263. {okf_parser-0.45.4 → okf_parser-0.45.6}/tests/test_apply_preview_token_noop.py +0 -0
  264. {okf_parser-0.45.4 → okf_parser-0.45.6}/tests/test_bundle.py +0 -0
  265. {okf_parser-0.45.4 → okf_parser-0.45.6}/tests/test_bundle_import.py +0 -0
  266. {okf_parser-0.45.4 → okf_parser-0.45.6}/tests/test_bundle_import_reserved.py +0 -0
  267. {okf_parser-0.45.4 → okf_parser-0.45.6}/tests/test_changelog_notes.py +0 -0
  268. {okf_parser-0.45.4 → okf_parser-0.45.6}/tests/test_classification.py +0 -0
  269. {okf_parser-0.45.4 → okf_parser-0.45.6}/tests/test_cli.py +0 -0
  270. {okf_parser-0.45.4 → okf_parser-0.45.6}/tests/test_codebase_to_okf_containment.py +0 -0
  271. {okf_parser-0.45.4 → okf_parser-0.45.6}/tests/test_codebase_to_okf_local_resolution.py +0 -0
  272. {okf_parser-0.45.4 → okf_parser-0.45.6}/tests/test_codebase_to_okf_one_shot.py +0 -0
  273. {okf_parser-0.45.4 → okf_parser-0.45.6}/tests/test_codebase_to_okf_project_manifest.py +0 -0
  274. {okf_parser-0.45.4 → okf_parser-0.45.6}/tests/test_codebase_to_okf_skill.py +0 -0
  275. {okf_parser-0.45.4 → okf_parser-0.45.6}/tests/test_codebase_to_okf_type_specs.py +0 -0
  276. {okf_parser-0.45.4 → okf_parser-0.45.6}/tests/test_concepts.py +0 -0
  277. {okf_parser-0.45.4 → okf_parser-0.45.6}/tests/test_conformance.py +0 -0
  278. {okf_parser-0.45.4 → okf_parser-0.45.6}/tests/test_content_digests.py +0 -0
  279. {okf_parser-0.45.4 → okf_parser-0.45.6}/tests/test_declared_schema.py +0 -0
  280. {okf_parser-0.45.4 → okf_parser-0.45.6}/tests/test_declared_schema_correctness.py +0 -0
  281. {okf_parser-0.45.4 → okf_parser-0.45.6}/tests/test_duckdb.py +0 -0
  282. {okf_parser-0.45.4 → okf_parser-0.45.6}/tests/test_duckdb_types.py +0 -0
  283. {okf_parser-0.45.4 → okf_parser-0.45.6}/tests/test_edit.py +0 -0
  284. {okf_parser-0.45.4 → okf_parser-0.45.6}/tests/test_engine_resolution.py +0 -0
  285. {okf_parser-0.45.4 → okf_parser-0.45.6}/tests/test_exclusion.py +0 -0
  286. {okf_parser-0.45.4 → okf_parser-0.45.6}/tests/test_exclusion_integration.py +0 -0
  287. {okf_parser-0.45.4 → okf_parser-0.45.6}/tests/test_formatting.py +0 -0
  288. {okf_parser-0.45.4 → okf_parser-0.45.6}/tests/test_formatting_conformance.py +0 -0
  289. {okf_parser-0.45.4 → okf_parser-0.45.6}/tests/test_git_commit.py +0 -0
  290. {okf_parser-0.45.4 → okf_parser-0.45.6}/tests/test_git_commit_cli.py +0 -0
  291. {okf_parser-0.45.4 → okf_parser-0.45.6}/tests/test_graphql_adapter.py +0 -0
  292. {okf_parser-0.45.4 → okf_parser-0.45.6}/tests/test_import_preview_token.py +0 -0
  293. {okf_parser-0.45.4 → okf_parser-0.45.6}/tests/test_ingestion.py +0 -0
  294. {okf_parser-0.45.4 → okf_parser-0.45.6}/tests/test_markdown_style.py +0 -0
  295. {okf_parser-0.45.4 → okf_parser-0.45.6}/tests/test_mcp.py +0 -0
  296. {okf_parser-0.45.4 → okf_parser-0.45.6}/tests/test_native_from_wheel.py +0 -0
  297. {okf_parser-0.45.4 → okf_parser-0.45.6}/tests/test_parser.py +0 -0
  298. {okf_parser-0.45.4 → okf_parser-0.45.6}/tests/test_project_version.py +0 -0
  299. {okf_parser-0.45.4 → okf_parser-0.45.6}/tests/test_projection_documents.py +0 -0
  300. {okf_parser-0.45.4 → okf_parser-0.45.6}/tests/test_projection_export.py +0 -0
  301. {okf_parser-0.45.4 → okf_parser-0.45.6}/tests/test_pydantic_source.py +0 -0
  302. {okf_parser-0.45.4 → okf_parser-0.45.6}/tests/test_reference_embed.py +0 -0
  303. {okf_parser-0.45.4 → okf_parser-0.45.6}/tests/test_reference_export.py +0 -0
  304. {okf_parser-0.45.4 → okf_parser-0.45.6}/tests/test_registry_state.py +0 -0
  305. {okf_parser-0.45.4 → okf_parser-0.45.6}/tests/test_registry_state_native_npm.py +0 -0
  306. {okf_parser-0.45.4 → okf_parser-0.45.6}/tests/test_relational_schema.py +0 -0
  307. {okf_parser-0.45.4 → okf_parser-0.45.6}/tests/test_release_summary.py +0 -0
  308. {okf_parser-0.45.4 → okf_parser-0.45.6}/tests/test_release_workflow_uv.py +0 -0
  309. {okf_parser-0.45.4 → okf_parser-0.45.6}/tests/test_rust_core.py +0 -0
  310. {okf_parser-0.45.4 → okf_parser-0.45.6}/tests/test_schema_export.py +0 -0
  311. {okf_parser-0.45.4 → okf_parser-0.45.6}/tests/test_schema_inference_conformance.py +0 -0
  312. {okf_parser-0.45.4 → okf_parser-0.45.6}/tests/test_schema_output_conformance.py +0 -0
  313. {okf_parser-0.45.4 → okf_parser-0.45.6}/tests/test_spec_scaffold.py +0 -0
  314. {okf_parser-0.45.4 → okf_parser-0.45.6}/tests/test_type_specs.py +0 -0
  315. {okf_parser-0.45.4 → okf_parser-0.45.6}/tests/test_typed_relations.py +0 -0
  316. {okf_parser-0.45.4 → okf_parser-0.45.6}/tests/test_verify_wheel_scripts.py +0 -0
  317. {okf_parser-0.45.4 → okf_parser-0.45.6}/typescript/.npmignore +0 -0
  318. {okf_parser-0.45.4 → okf_parser-0.45.6}/typescript/scripts/smoke-mcp-stdio.mjs +0 -0
  319. {okf_parser-0.45.4 → okf_parser-0.45.6}/typescript/src/cli.ts +0 -0
  320. {okf_parser-0.45.4 → okf_parser-0.45.6}/typescript/src/core.ts +0 -0
  321. {okf_parser-0.45.4 → okf_parser-0.45.6}/typescript/src/digests.ts +0 -0
  322. {okf_parser-0.45.4 → okf_parser-0.45.6}/typescript/src/engine.ts +0 -0
  323. {okf_parser-0.45.4 → okf_parser-0.45.6}/typescript/src/formatting.ts +0 -0
  324. {okf_parser-0.45.4 → okf_parser-0.45.6}/typescript/src/git-commit.ts +0 -0
  325. {okf_parser-0.45.4 → okf_parser-0.45.6}/typescript/src/index.ts +0 -0
  326. {okf_parser-0.45.4 → okf_parser-0.45.6}/typescript/src/ingestion.ts +0 -0
  327. {okf_parser-0.45.4 → okf_parser-0.45.6}/typescript/src/lexemes.ts +0 -0
  328. {okf_parser-0.45.4 → okf_parser-0.45.6}/typescript/src/mcp-cli.ts +0 -0
  329. {okf_parser-0.45.4 → okf_parser-0.45.6}/typescript/src/mcp.ts +0 -0
  330. {okf_parser-0.45.4 → okf_parser-0.45.6}/typescript/src/schema.ts +0 -0
  331. {okf_parser-0.45.4 → okf_parser-0.45.6}/typescript/src/type-specs.ts +0 -0
  332. {okf_parser-0.45.4 → okf_parser-0.45.6}/typescript/test/bundle.test.ts +0 -0
  333. {okf_parser-0.45.4 → okf_parser-0.45.6}/typescript/test/classification.test.ts +0 -0
  334. {okf_parser-0.45.4 → okf_parser-0.45.6}/typescript/test/content-digests.test.ts +0 -0
  335. {okf_parser-0.45.4 → okf_parser-0.45.6}/typescript/test/engine-resolution.test.ts +0 -0
  336. {okf_parser-0.45.4 → okf_parser-0.45.6}/typescript/test/exclusion.test.ts +0 -0
  337. {okf_parser-0.45.4 → okf_parser-0.45.6}/typescript/test/formatting.test.ts +0 -0
  338. {okf_parser-0.45.4 → okf_parser-0.45.6}/typescript/test/frontmatter.test.ts +0 -0
  339. {okf_parser-0.45.4 → okf_parser-0.45.6}/typescript/test/git-commit.test.ts +0 -0
  340. {okf_parser-0.45.4 → okf_parser-0.45.6}/typescript/test/ingestion.test.ts +0 -0
  341. {okf_parser-0.45.4 → okf_parser-0.45.6}/typescript/test/mcp.test.ts +0 -0
  342. {okf_parser-0.45.4 → okf_parser-0.45.6}/typescript/test/schema-inference-conformance.test.ts +0 -0
  343. {okf_parser-0.45.4 → okf_parser-0.45.6}/typescript/test/schema-output-conformance.test.ts +0 -0
  344. {okf_parser-0.45.4 → okf_parser-0.45.6}/typescript/test/schema.test.ts +0 -0
  345. {okf_parser-0.45.4 → okf_parser-0.45.6}/typescript/test/type-specs.test.ts +0 -0
  346. {okf_parser-0.45.4 → okf_parser-0.45.6}/typescript/tsconfig.build.json +0 -0
  347. {okf_parser-0.45.4 → okf_parser-0.45.6}/typescript/tsconfig.json +0 -0
  348. {okf_parser-0.45.4/typescript → okf_parser-0.45.6/typescript-duckdb}/LICENSE +0 -0
  349. {okf_parser-0.45.4 → okf_parser-0.45.6}/typescript-duckdb/src/cli.ts +0 -0
  350. {okf_parser-0.45.4 → okf_parser-0.45.6}/typescript-duckdb/src/index.ts +0 -0
  351. {okf_parser-0.45.4 → okf_parser-0.45.6}/typescript-duckdb/test/current-load-options.test.ts +0 -0
  352. {okf_parser-0.45.4 → okf_parser-0.45.6}/typescript-duckdb/test/digests.test.ts +0 -0
  353. {okf_parser-0.45.4 → okf_parser-0.45.6}/typescript-duckdb/test/typed.test.ts +0 -0
  354. {okf_parser-0.45.4 → okf_parser-0.45.6}/typescript-duckdb/tsconfig.build.json +0 -0
  355. {okf_parser-0.45.4 → okf_parser-0.45.6}/typescript-duckdb/tsconfig.json +0 -0
@@ -0,0 +1,4 @@
1
+ # README.pypi.md is derived from README.md by scripts/pypi_readme.py for the
2
+ # PyPI long description. It carries no frontmatter by design, because stripping
3
+ # it is the whole point, so it is a packaging artifact rather than a concept.
4
+ /README.pypi.md
@@ -447,7 +447,7 @@ dependencies = [
447
447
 
448
448
  [[package]]
449
449
  name = "okf-core"
450
- version = "0.45.4"
450
+ version = "0.45.6"
451
451
  dependencies = [
452
452
  "clap",
453
453
  "okf-engine",
@@ -457,7 +457,7 @@ dependencies = [
457
457
 
458
458
  [[package]]
459
459
  name = "okf-engine"
460
- version = "0.45.4"
460
+ version = "0.45.6"
461
461
  dependencies = [
462
462
  "chrono",
463
463
  "ignore",
@@ -0,0 +1,376 @@
1
+ Metadata-Version: 2.4
2
+ Name: okf-parser
3
+ Version: 0.45.6
4
+ Classifier: Development Status :: 4 - Beta
5
+ Classifier: Intended Audience :: Developers
6
+ Classifier: Programming Language :: Python :: 3
7
+ Classifier: Programming Language :: Python :: 3.12
8
+ Classifier: Programming Language :: Python :: 3.13
9
+ Classifier: Programming Language :: Rust
10
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
11
+ Classifier: Topic :: Text Processing :: Markup :: Markdown
12
+ Requires-Dist: cyclopts>=4.22,<5
13
+ Requires-Dist: duckdb>=1.4,<2
14
+ Requires-Dist: fastmcp>=3.4,<4
15
+ Requires-Dist: ibis-framework[duckdb]>=12,<13
16
+ Requires-Dist: markdown-it-py>=4,<5
17
+ Requires-Dist: mdformat>=1,<1.1
18
+ Requires-Dist: mdformat-frontmatter>=2,<3
19
+ Requires-Dist: mdformat-gfm>=1,<2
20
+ Requires-Dist: networkx>=3.4,<4
21
+ Requires-Dist: pyarrow>=18,<26
22
+ Requires-Dist: pydantic>=2.11,<3
23
+ Requires-Dist: pyyaml>=6,<7
24
+ Requires-Dist: ruamel-yaml>=0.18,<0.20
25
+ Requires-Dist: graphql-core>=3.2,<4 ; extra == 'graphql'
26
+ Provides-Extra: graphql
27
+ License-File: LICENSE
28
+ Summary: Relational inspection and validation for Open Knowledge Format bundles
29
+ Keywords: okf,open-knowledge-format,knowledge-graph,markdown,duckdb,ibis,validation,mcp
30
+ Author-email: Franklin Baldo <franklinbaldo@gmail.com>
31
+ License-Expression: MIT
32
+ Requires-Python: >=3.12
33
+ Description-Content-Type: text/markdown; charset=UTF-8; variant=GFM
34
+ Project-URL: Changelog, https://github.com/franklinbaldo/okf-parser/releases
35
+ Project-URL: Documentation, https://github.com/franklinbaldo/okf-parser/blob/main/docs/architecture.md
36
+ Project-URL: Homepage, https://github.com/franklinbaldo/okf-parser
37
+ Project-URL: Issues, https://github.com/franklinbaldo/okf-parser/issues
38
+ Project-URL: Repository, https://github.com/franklinbaldo/okf-parser
39
+
40
+ # okf-parser
41
+
42
+ Relational inspection and validation for
43
+ [Open Knowledge Format (OKF) v0.2](https://github.com/GoogleCloudPlatform/knowledge-catalog/blob/main/okf/SPEC.md)
44
+ bundles.
45
+
46
+ `okf-parser` reads an OKF bundle without imposing a domain taxonomy, preserves
47
+ unknown frontmatter fields, and exposes concepts and links as
48
+ [Ibis](https://ibis-project.org/) tables. This makes bundle-wide rules—identity,
49
+ lineage, cardinality, provenance, and profile-specific constraints—expressible
50
+ as deterministic relational checks.
51
+
52
+ ## Why another OKF tool?
53
+
54
+ The ecosystem already has good static linters and generators, including
55
+ `okflint`, `okf-cli`, and `google-okf`. This project focuses on a different
56
+ layer:
57
+
58
+ - compile a bundle into queryable relational tables;
59
+ - project those same relations into a NetworkX graph;
60
+ - validate OKF v0.2 conformance without rejecting extensions;
61
+ - distinguish normative errors from advisory diagnostics;
62
+ - let projects add cross-concept rules as Ibis expressions;
63
+ - produce stable human-readable and JSON reports for CI and agents.
64
+
65
+ The architectural boundary between strict authored OKF and source adapters is documented in
66
+ [`docs/architecture.md`](https://github.com/franklinbaldo/okf-parser/blob/main/docs/architecture.md).
67
+
68
+ The parser and validation model are inspired by
69
+ [`franklinbaldo/sisprev`](https://github.com/franklinbaldo/sisprev): parse
70
+ documents independently from semantic validation, aggregate violations instead
71
+ of failing at the first bad concept, preserve authored bodies, and test
72
+ filesystem identity explicitly. No Sisprev-specific legal types are copied into
73
+ the core.
74
+
75
+ [`mrorigo/rust-okf`](https://github.com/mrorigo/rust-okf) inspired the stable
76
+ logical key, conservative metadata preservation, BOM/CRLF handling, and clean
77
+ separation between bundle parsing and downstream query surfaces. Its BM25,
78
+ vector index, storage format, and HTTP server are intentionally outside this
79
+ project's scope.
80
+
81
+ ## Quick start
82
+
83
+ ```bash
84
+ uv sync
85
+ uv run okf-parser check path/to/bundle
86
+ uv run okf-parser check path/to/bundle --relational-schema okf.schema.sql
87
+ uv run okf-parser inventory path/to/bundle
88
+ uv run okf-parser graph path/to/bundle
89
+ uv run okf-parser format path/to/bundle
90
+ uv run okf-parser format path/to/bundle --write
91
+ uv run okf-parser duckdb path/to/bundle knowledge.duckdb
92
+ uv run okf-parser duckdb path/to/bundle knowledge.duckdb --overwrite
93
+ uv run okf-parser serve
94
+ uv run okf-parser serve --allow-write
95
+ ```
96
+
97
+ The command exits with status `1` only when normative errors exist. Broken
98
+ cross-links are warnings because OKF v0.2 explicitly says they do not make a
99
+ bundle non-conformant.
100
+
101
+ The MCP server is commit-disabled by default. `serve --allow-write` exposes explicit
102
+ commit tools for formatting, relational apply, spec scaffolding, import, and DuckDB
103
+ export; preview tools remain available without the flag. Effect annotations describe
104
+ maximum tool effects but are not authorization or sandboxing.
105
+
106
+ `format` is an opinionated canonicalizer, not a syntax-preserving rewriter. It
107
+ keeps [mdformat](https://mdformat.readthedocs.io/) as its base and replaces only
108
+ the numbering policy for ordered lists: markers are decided while rendering, so
109
+ they are consecutive (`1. 2. 3.`) and never zero-padded to an even width. A list
110
+ starting at `101` is written `101. 102. 103.`, appending an item does not rewrite
111
+ the lines above it, and a list whose markers would exceed CommonMark's nine-digit
112
+ limit keeps plain numbering.
113
+
114
+ Formatting will not write a file whose **protected block structure** the rewrite
115
+ would change; such a file is reported in `skipped_paths` and left on disk.
116
+ Protected means the sequence, nesting and tag of every block, block attributes
117
+ such as an ordered list's `start`, and the content of code blocks, raw HTML and
118
+ frontmatter. Inline content — link targets, emphasis, text inside a paragraph or
119
+ table cell — is deliberately outside this check, because canonical formatting
120
+ rewrites inline whitespace.
121
+
122
+ ## Excluding paths
123
+
124
+ A repository that keeps OKF knowledge next to code, a README and vendored
125
+ dependencies has no root that validates cleanly. Checking the repository root
126
+ reports `OKF001` for every unrelated Markdown file; checking each bundle
127
+ separately makes every link *between* bundles unresolvable, because the target
128
+ sits outside the checked root. Excluding subpaths is what lets one root cover
129
+ the whole tree, which is the only arrangement under which cross-bundle link
130
+ validation runs at all.
131
+
132
+ Put the patterns in an `.okfignore` beside the bundle, so the exclusions are
133
+ versioned with the content and CI needs no extra flags:
134
+
135
+ ```gitignore
136
+ # vendored dependencies
137
+ vendor
138
+ # the knowledge inside them is not noise
139
+ !vendor/knowledge
140
+ # project Markdown at the root, not knowledge
141
+ /*.md
142
+ ```
143
+
144
+ Or pass them for a single run — the option repeats, and adds to the file rather
145
+ than replacing it:
146
+
147
+ ```bash
148
+ uv run okf-parser check . --exclude vendor --exclude '/*.md'
149
+ ```
150
+
151
+ Every command that reads a bundle accepts `--exclude`: `check`, `inventory`,
152
+ `graph`, `format` and `duckdb`. Excluded files are never read and never
153
+ written, so `format --write` on a repository root leaves vendored documents
154
+ alone.
155
+
156
+ ### Pattern semantics
157
+
158
+ `.okfignore` uses **`.gitignore` pattern semantics**, matched against
159
+ POSIX-style paths relative to the bundle root:
160
+
161
+ | pattern | matches | does not match |
162
+ | -------------- | -------------------------------------------- | ----------------------- |
163
+ | `vendor` | `vendor/a.md`, `libs/vendor/a.md` | `equipe/a.md` |
164
+ | `/vendor` | `vendor/a.md` | `libs/vendor/a.md` |
165
+ | `vendor/` | `vendor/a.md` (directory only) | a *file* named `vendor` |
166
+ | `*.md` | `README.md`, `items/tarefa.md` | `items/tarefa.markdown` |
167
+ | `/*.md` | `README.md` | `items/tarefa.md` |
168
+ | `docs/**/x.md` | `docs/x.md`, `docs/a/b/x.md` | `other/x.md` |
169
+ | `!vendor/kb` | re-includes what an earlier pattern excluded | |
170
+
171
+ - a pattern without a separator matches its name **at any depth**; a separator
172
+ anchors it at the bundle root;
173
+ - `*` and `?` stay inside one segment, `[abc]` and `[!abc]` classes work, and
174
+ `**` spans segments;
175
+ - a trailing `/` matches directories only;
176
+ - `!` re-includes, and **the last pattern that matches a path decides**;
177
+ - `#` starts a comment, blank lines declare nothing, unescaped trailing spaces
178
+ are dropped, and `\#` or `\!` escape a literal first character.
179
+
180
+ One deviation from `.gitignore` is deliberate. Git cannot re-include a path
181
+ whose parent directory is excluded, because it prunes the walk and never looks
182
+ back, so `vendor` plus `!vendor/knowledge` does nothing there. Here it works:
183
+ discovery descends whenever a negation exists. A negation that silently does
184
+ nothing is exactly the surprise this feature exists to prevent. With no
185
+ negation in the rules the walk still prunes, so excluding a vendored dependency
186
+ of several hundred documents never walks it.
187
+
188
+ The same rules are shared with the TypeScript package through
189
+ `conformance/exclusion.json`.
190
+
191
+ ### Migrating from the pre-0.14 semantics
192
+
193
+ Before 0.14.0 every pattern was anchored at the bundle root and `!` was a
194
+ literal character. Two rewrites cover it:
195
+
196
+ | before | after | why |
197
+ | -------- | --------- | ------------------------------------------------- |
198
+ | `*.md` | `/*.md` | unanchored patterns now match at any depth |
199
+ | `vendor` | `/vendor` | keep it root-only; leave as-is to match any depth |
200
+
201
+ A pattern that begins with a literal `!` now needs `\!`.
202
+
203
+ ## Requiring a specification per type
204
+
205
+ OKF v0.2 only requires `type` to be non-empty, so a producer can invent a type,
206
+ emit concepts of it and keep a green `check` while that type's frontmatter
207
+ schema changes underneath its consumers.
208
+
209
+ The optional rule below closes that gap without inventing taxonomy: it derives a
210
+ document path from each type in use and reports the types whose document is
211
+ absent.
212
+
213
+ ```bash
214
+ uv run okf-parser check ./bundle --require-spec ".okf/specs/{slug}.md"
215
+ uv run okf-parser check ./bundle --require-spec ".okf/specs/{slug}.md" --normative-spec
216
+ ```
217
+
218
+ The template must contain `{slug}`. The slug is lowercase, with accents and
219
+ cedillas removed, whitespace and `/` turned into hyphens, and every remaining
220
+ non-alphanumeric character dropped:
221
+
222
+ | `type` | derived path |
223
+ | ----------------- | ------------------------------- |
224
+ | `Spec` | `.okf/specs/spec.md` |
225
+ | `Revisão Ciência` | `.okf/specs/revisao-ciencia.md` |
226
+ | `Peça Forense` | `.okf/specs/peca-forense.md` |
227
+
228
+ The path is **derived**, not declared. A `spec:` frontmatter field would be a
229
+ second fact free to disagree with the first, and putting the path in `type`
230
+ itself would tie identity to layout, so renaming a directory would invalidate
231
+ every concept of that type.
232
+
233
+ Missing documents are reported as `OKF010` warnings, because a bundle mid-
234
+ adoption legitimately has legacy types without a document and that is not an
235
+ OKF v0.2 defect. `--normative-spec` promotes them to errors for a bundle that
236
+ has completed the adoption. The rule is off unless `--require-spec` is given.
237
+
238
+ ## GitHub Actions
239
+
240
+ Add the repository as a CI check:
241
+
242
+ ```yaml
243
+ steps:
244
+ - uses: actions/checkout@v7
245
+ - uses: franklinbaldo/okf-parser@v0.45.6
246
+ with:
247
+ path: knowledge
248
+ ```
249
+
250
+ ### Rust end-to-end engine
251
+
252
+ The default Python and TypeScript implementations remain portable and require no Rust
253
+ binary. For large bundles, build the native engine and pass its path explicitly:
254
+
255
+ ```bash
256
+ cargo build --release --manifest-path rust-core/Cargo.toml
257
+ ```
258
+
259
+ Python accepts `load_bundle(root, rust_core=Path(".../okf-parser"))`; TypeScript accepts
260
+ `loadBundle(root, { rustCore: ".../okf-core" })`. The native process owns discovery,
261
+ bounded parallel reads, YAML/frontmatter, Markdown facts, validation, link resolution,
262
+ and content digests. The packaged `okf-parser` executable is the single Python command;
263
+ its ordinary subcommands dispatch to the Python CLI while private engine operations stay
264
+ inside the same executable. Omitting the option keeps the portable language-native fallback.
265
+
266
+ The composite action installs a pinned uv version and executes the same
267
+ `validate_path()` function used by the Python API, CLI, and MCP server.
268
+
269
+ Pin an exact version. There is no moving `@v1` ref: this repository's tags are
270
+ package versions, because `publish.yml` refuses to publish a release whose tag
271
+ does not equal the version in `pyproject.toml`. A `v1` tag would either break
272
+ that check or drift away from the version it claims to be. A major-version ref
273
+ becomes worth introducing when the package itself reaches `1.0.0`.
274
+
275
+ Releases are published to PyPI from GitHub Releases through OIDC Trusted
276
+ Publishing. No long-lived PyPI token is stored in the repository.
277
+
278
+ Every pull request must increase the SemVer version in `pyproject.toml` and add
279
+ exactly one matching `changelog/<version>.md` entry. CI compares both against
280
+ the target branch before allowing merge.
281
+
282
+ ## MCP
283
+
284
+ ```bash
285
+ uv run okf-parser serve
286
+ uv run fastmcp run
287
+ ```
288
+
289
+ Read-only tools: `check`, `inventory`, `graph`, and `format_check`.
290
+
291
+ ## DuckDB
292
+
293
+ `okf-parser` is a regular uv-managed Python app; the DuckDB integration is part
294
+ of the same package, not a native C++ subproject:
295
+
296
+ ```python
297
+ import duckdb
298
+
299
+ from okf_parser.duckdb import attach_okf
300
+
301
+ connection = duckdb.connect("knowledge.duckdb")
302
+ attach_okf(connection, "knowledge/")
303
+
304
+ connection.sql("""
305
+ SELECT concept_type, count(*)
306
+ FROM okf.concepts
307
+ GROUP BY concept_type
308
+ """).show()
309
+ ```
310
+
311
+ The call creates `okf.concepts`, `okf.links`, `okf.reserved`, and
312
+ `okf.diagnostics` as ordinary DuckDB tables. Materializing twice into the same
313
+ schema raises `BundleExportError` rather than clobbering an earlier export; pass
314
+ `overwrite=True` (or `--overwrite` on the command line) to replace the four
315
+ tables.
316
+
317
+ ## Python API
318
+
319
+ ```python
320
+ from pathlib import Path
321
+
322
+ from okf_parser import load_bundle, validate_path
323
+
324
+ bundle = load_bundle(Path("knowledge"))
325
+ print(bundle.concepts.execute())
326
+ print(bundle.links.execute())
327
+ print(bundle.to_networkx())
328
+ print(bundle.validate())
329
+
330
+ report = validate_path(Path("knowledge"))
331
+ assert report.markdown_count == report.concept_count + report.reserved_count
332
+ assert report.is_conformant
333
+ ```
334
+
335
+ Declared RFC 0006 types can be queried directly as Ibis relations without a CLI or database-file round trip:
336
+
337
+ ```python
338
+ bundle = load_bundle(Path("knowledge"))
339
+ with bundle.compile_types("docs/types/{slug}.md") as typed:
340
+ routines = typed["Rotina"]
341
+ print(routines.filter(routines.custo.notnull()).execute())
342
+ ```
343
+
344
+ `TypedRelations` owns an ephemeral DuckDB/Ibis backend; use it as a context manager or call `close()` explicitly. With no matching declarations, `tables` is empty rather than silently inventing an inferred physical schema.
345
+
346
+ `load_bundle`, `validate_path` and `format_path` read the bundle's `.okfignore`
347
+ on their own, and take an `exclude` sequence for patterns supplied per call:
348
+
349
+ ```python
350
+ report = validate_path(Path("."), exclude=["vendor", "*.md"])
351
+ ```
352
+
353
+ `validate_path` also takes the optional type-specification rule:
354
+
355
+ ```python
356
+ report = validate_path(Path("knowledge"), require_spec=".okf/specs/{slug}.md")
357
+ ```
358
+
359
+ ## Current scope
360
+
361
+ - UTF-8 Markdown discovery, matching `.md` case-insensitively, with
362
+ `.gitignore`-compatible exclusions from `.okfignore` or `--exclude`;
363
+ - reserved `index.md` and `log.md` handling;
364
+ - strict YAML-frontmatter parsing for concept documents, validated with Pydantic
365
+ at the parse boundary so one malformed document cannot abort a run;
366
+ - required non-empty `type`, optionally requiring a specification document per
367
+ type in use;
368
+ - stable concept IDs derived from paths;
369
+ - Markdown-link extraction and resolution;
370
+ - Ibis tables for concepts, reserved documents, and links;
371
+ - NetworkX graph projection for traversal, cycles, components, and impact;
372
+ - aggregated validation reports.
373
+
374
+ Profiles, lifecycle/provenance family validation, external resources, and
375
+ pluggable Ibis rules are the next milestones.
376
+
@@ -209,7 +209,7 @@ Add the repository as a CI check:
209
209
  ```yaml
210
210
  steps:
211
211
  - uses: actions/checkout@v7
212
- - uses: franklinbaldo/okf-parser@v0.45.4
212
+ - uses: franklinbaldo/okf-parser@v0.45.6
213
213
  with:
214
214
  path: knowledge
215
215
  ```
@@ -1,31 +1,3 @@
1
- Metadata-Version: 2.4
2
- Name: okf-parser
3
- Version: 0.45.4
4
- Requires-Dist: cyclopts>=4.22,<5
5
- Requires-Dist: duckdb>=1.4,<2
6
- Requires-Dist: fastmcp>=3.4,<4
7
- Requires-Dist: ibis-framework[duckdb]>=12,<13
8
- Requires-Dist: markdown-it-py>=4,<5
9
- Requires-Dist: mdformat>=1,<1.1
10
- Requires-Dist: mdformat-frontmatter>=2,<3
11
- Requires-Dist: mdformat-gfm>=1,<2
12
- Requires-Dist: networkx>=3.4,<4
13
- Requires-Dist: pyarrow>=18,<26
14
- Requires-Dist: pydantic>=2.11,<3
15
- Requires-Dist: pyyaml>=6,<7
16
- Requires-Dist: ruamel-yaml>=0.18,<0.20
17
- Requires-Dist: graphql-core>=3.2,<4 ; extra == 'graphql'
18
- Provides-Extra: graphql
19
- Summary: Relational inspection and validation for Open Knowledge Format bundles
20
- Requires-Python: >=3.12
21
- Description-Content-Type: text/markdown; charset=UTF-8; variant=GFM
22
-
23
- ---
24
- type: Project
25
- title: okf-parser
26
- description: Relational inspection and validation for Open Knowledge Format bundles
27
- ---
28
-
29
1
  # okf-parser
30
2
 
31
3
  Relational inspection and validation for
@@ -52,7 +24,7 @@ layer:
52
24
  - produce stable human-readable and JSON reports for CI and agents.
53
25
 
54
26
  The architectural boundary between strict authored OKF and source adapters is documented in
55
- [`docs/architecture.md`](docs/architecture.md).
27
+ [`docs/architecture.md`](https://github.com/franklinbaldo/okf-parser/blob/main/docs/architecture.md).
56
28
 
57
29
  The parser and validation model are inspired by
58
30
  [`franklinbaldo/sisprev`](https://github.com/franklinbaldo/sisprev): parse
@@ -231,7 +203,7 @@ Add the repository as a CI check:
231
203
  ```yaml
232
204
  steps:
233
205
  - uses: actions/checkout@v7
234
- - uses: franklinbaldo/okf-parser@v0.45.4
206
+ - uses: franklinbaldo/okf-parser@v0.45.6
235
207
  with:
236
208
  path: knowledge
237
209
  ```
@@ -362,4 +334,3 @@ report = validate_path(Path("knowledge"), require_spec=".okf/specs/{slug}.md")
362
334
 
363
335
  Profiles, lifecycle/provenance family validation, external resources, and
364
336
  pluggable Ibis rules are the next milestones.
365
-
@@ -0,0 +1,9 @@
1
+ ---
2
+ type: Release Note
3
+ title: publish the npm packages under the @franklinbaldo scope
4
+ ---
5
+
6
+ - Rename all three npm packages to `@franklinbaldo/okf-parser`, `@franklinbaldo/okf-parser-duckdb` and `@franklinbaldo/okf-parser-native-linux-x64`. npm refuses the unscoped name `okf-parser` because its similarity filter considers it too close to the existing `oxc-parser`; the refusal happens on upload, so name availability alone never proved the name was publishable.
7
+ - Keep the PyPI distribution unscoped as `okf-parser`. The Python and npm names are now deliberately different, because only npm imposes the similarity constraint.
8
+ - Update the source contract to expect the scoped names and the tarball file names `npm pack` derives from them, where the scope is flattened into the leading `franklinbaldo-` segment.
9
+ - Resolve the optional native package through its scoped name, so a Linux x64 consumer still finds the packaged engine.
@@ -0,0 +1,10 @@
1
+ ---
2
+ type: Release Note
3
+ title: give the PyPI project page metadata and a clean description
4
+ ---
5
+
6
+ - Stop publishing the README's OKF frontmatter as page content. `README.md` is a `type: Project` concept and must open with `---`, which PyPI rendered as a thematic break plus a setext heading, so every project page opened with `type: Project title: okf-parser description: ...` above the real title. `scripts/pypi_readme.py` now derives `README.pypi.md`, applying the same correction `changelog_notes.py` already applies to GitHub Release bodies.
7
+ - Rewrite repository-relative links in the derived description to absolute URLs. `docs/architecture.md` resolved on GitHub and pointed nowhere on PyPI.
8
+ - Declare `MIT` and ship a root `LICENSE`. The three npm packages already declared MIT and shipped the file, while the Python distribution carried no licence at all.
9
+ - Declare `authors`, `keywords`, `classifiers` and `project.urls`. The project page previously offered no link back to the repository, its issues or its releases.
10
+ - Verify the derived description in CI, so it cannot drift from `README.md`, and add the repository's first `.okfignore` to keep it out of the repository's own OKF validation. The repository is validated twice, by the Python CLI and by the TypeScript one, and `.okfignore` is read by both; per-command `--exclude` flags would have to be repeated at every call site and silently miss any that was forgotten.
@@ -15,7 +15,7 @@ bundle = load_bundle(root)
15
15
  ```
16
16
 
17
17
  ```ts
18
- import { loadBundle } from "okf-parser";
18
+ import { loadBundle } from "@franklinbaldo/okf-parser";
19
19
 
20
20
  const bundle = await loadBundle(root);
21
21
  ```
@@ -42,7 +42,7 @@ A source installation builds that same executable as part of building the `okf-p
42
42
 
43
43
  ## npm packaging
44
44
 
45
- `okf-parser` declares platform packages as optional dependencies. The first supported target is `okf-parser-native-linux-x64`, which contains the release-matched executable under `bin/okf-core`. The TypeScript resolver discovers that package directly from `node_modules` before consulting environment overrides.
45
+ `@franklinbaldo/okf-parser` declares platform packages as optional dependencies. The first supported target is `@franklinbaldo/okf-parser-native-linux-x64`, which contains the release-matched executable under `bin/okf-core`. The TypeScript resolver discovers that package directly from `node_modules` before consulting environment overrides.
46
46
 
47
47
  Installing with `--omit=optional`, or running on a platform for which no native companion is published, keeps the same `loadBundle()` API and uses the portable TypeScript implementation.
48
48
 
@@ -9,9 +9,11 @@ description: Build, verify and publish synchronized Python and TypeScript releas
9
9
  The repository publishes one synchronized protocol version across one Python project and three npm packages:
10
10
 
11
11
  - Python `okf-parser` on PyPI;
12
- - TypeScript `okf-parser` on npm;
13
- - TypeScript `okf-parser-duckdb` on npm;
14
- - platform npm companion `okf-parser-native-linux-x64` on npm.
12
+ - TypeScript `@franklinbaldo/okf-parser` on npm;
13
+ - TypeScript `@franklinbaldo/okf-parser-duckdb` on npm;
14
+ - platform npm companion `@franklinbaldo/okf-parser-native-linux-x64` on npm.
15
+
16
+ The npm packages are scoped and the PyPI distribution is not. npm refuses the unscoped name `okf-parser`, whose similarity filter considers it too close to the existing `oxc-parser`, and that refusal only happens on upload. The scope is therefore a constraint npm imposes, not a naming preference.
15
17
 
16
18
  There is no `okf-parser-native` PyPI project. The Rust engine is an implementation detail of the `okf-parser` Python distribution and is embedded directly in its single `okf-parser` executable.
17
19
 
@@ -27,10 +29,10 @@ release/
27
29
  │ ├── okf_parser-X.Y.Z-<platform>.whl
28
30
  │ └── okf_parser-X.Y.Z.tar.gz
29
31
  ├── npm/
30
- │ ├── okf-parser-X.Y.Z.tgz
31
- │ └── okf-parser-duckdb-X.Y.Z.tgz
32
+ │ ├── franklinbaldo-okf-parser-X.Y.Z.tgz
33
+ │ └── franklinbaldo-okf-parser-duckdb-X.Y.Z.tgz
32
34
  ├── native-npm/
33
- │ └── okf-parser-native-linux-x64-X.Y.Z.tgz
35
+ │ └── franklinbaldo-okf-parser-native-linux-x64-X.Y.Z.tgz
34
36
  ├── manifest.json
35
37
  ├── registry-state.json
36
38
  └── SHA256SUMS
@@ -52,7 +54,7 @@ Before building, `scripts/release_contract.py verify-source` requires all of the
52
54
  - the Rust crate version;
53
55
  - versions in the npm manifests;
54
56
  - `PROTOCOL_VERSION` in `typescript/src/version.ts`;
55
- - the `okf-parser` peer range in the DuckDB adapter;
57
+ - the `@franklinbaldo/okf-parser` peer range in the DuckDB adapter;
56
58
  - at least one release-note fragment in `changelog/X.Y.Z/`;
57
59
  - an optional stable tag, exactly `vX.Y.Z`.
58
60
 
@@ -0,0 +1,15 @@
1
+ ---
2
+ type: Documentation
3
+ title: okf-parser native Linux x64 package
4
+ description: Platform companion that ships the release-matched okf-core executable for npm consumers
5
+ ---
6
+
7
+ # @franklinbaldo/okf-parser-native-linux-x64
8
+
9
+ Platform companion for `@franklinbaldo/okf-parser` on Linux x64.
10
+
11
+ This package contains the release-matched `okf-core` executable. It is installed as an optional dependency of `@franklinbaldo/okf-parser`; applications should not depend on it directly or hard-code its path. `loadBundle()` discovers it automatically and falls back to the portable TypeScript engine when no compatible native package is installed.
12
+
13
+ The companion version always matches the `@franklinbaldo/okf-parser` release that consumes it, so the resolver never needs to negotiate protocol compatibility at runtime.
14
+
15
+ The executable is built during the release workflow. Rust is never compiled during application installation or startup.
@@ -1,6 +1,6 @@
1
1
  {
2
- "name": "okf-parser-native-linux-x64",
3
- "version": "0.45.4",
2
+ "name": "@franklinbaldo/okf-parser-native-linux-x64",
3
+ "version": "0.45.6",
4
4
  "description": "Linux x64 native okf-core engine for okf-parser",
5
5
  "license": "MIT",
6
6
  "os": ["linux"],
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "okf-engine"
3
- version = "0.45.4"
3
+ version = "0.45.6"
4
4
  edition = "2024"
5
5
  license = "MIT"
6
6
  description = "DuckDB-independent OKF semantic ingestion engine"
@@ -1,9 +1,35 @@
1
1
  [project]
2
2
  name = "okf-parser"
3
- version = "0.45.4"
3
+ version = "0.45.6"
4
4
  description = "Relational inspection and validation for Open Knowledge Format bundles"
5
- readme = "README.md"
5
+ # Derived from README.md by scripts/pypi_readme.py. README.md is an OKF concept
6
+ # and must open with frontmatter, which PyPI would otherwise render as a heading
7
+ # above the real title.
8
+ readme = "README.pypi.md"
6
9
  requires-python = ">=3.12"
10
+ license = "MIT"
11
+ license-files = ["LICENSE"]
12
+ authors = [{ name = "Franklin Baldo", email = "franklinbaldo@gmail.com" }]
13
+ keywords = [
14
+ "okf",
15
+ "open-knowledge-format",
16
+ "knowledge-graph",
17
+ "markdown",
18
+ "duckdb",
19
+ "ibis",
20
+ "validation",
21
+ "mcp",
22
+ ]
23
+ classifiers = [
24
+ "Development Status :: 4 - Beta",
25
+ "Intended Audience :: Developers",
26
+ "Programming Language :: Python :: 3",
27
+ "Programming Language :: Python :: 3.12",
28
+ "Programming Language :: Python :: 3.13",
29
+ "Programming Language :: Rust",
30
+ "Topic :: Software Development :: Libraries :: Python Modules",
31
+ "Topic :: Text Processing :: Markup :: Markdown",
32
+ ]
7
33
  dependencies = [
8
34
  "cyclopts>=4.22,<5",
9
35
  "duckdb>=1.4,<2",
@@ -23,6 +49,13 @@ dependencies = [
23
49
  "ruamel.yaml>=0.18,<0.20",
24
50
  ]
25
51
 
52
+ [project.urls]
53
+ Homepage = "https://github.com/franklinbaldo/okf-parser"
54
+ Repository = "https://github.com/franklinbaldo/okf-parser"
55
+ Issues = "https://github.com/franklinbaldo/okf-parser/issues"
56
+ Changelog = "https://github.com/franklinbaldo/okf-parser/releases"
57
+ Documentation = "https://github.com/franklinbaldo/okf-parser/blob/main/docs/architecture.md"
58
+
26
59
  [project.optional-dependencies]
27
60
  graphql = ["graphql-core>=3.2,<4"]
28
61