bantamkit 0.34.0__tar.gz → 0.34.1__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 (222) hide show
  1. bantamkit-0.34.1/PKG-INFO +389 -0
  2. bantamkit-0.34.1/README.md +361 -0
  3. {bantamkit-0.34.0 → bantamkit-0.34.1}/pyproject.toml +34 -1
  4. {bantamkit-0.34.0 → bantamkit-0.34.1}/src/bantamkit/__init__.py +1 -1
  5. bantamkit-0.34.0/PKG-INFO +0 -296
  6. bantamkit-0.34.0/README.md +0 -279
  7. bantamkit-0.34.0/dist-0.33.0/bantamkit-0.33.0-py3-none-any.whl +0 -0
  8. bantamkit-0.34.0/dist-0.33.0/bantamkit-0.33.0.tar.gz +0 -0
  9. {bantamkit-0.34.0 → bantamkit-0.34.1}/.gitignore +0 -0
  10. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/contracts/default.yaml +0 -0
  11. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/evals/devteam/manifest.yaml +0 -0
  12. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/evals/devteam/repo/HISTORY.md +0 -0
  13. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/evals/devteam/repo/README.md +0 -0
  14. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/evals/devteam/repo/docs/architecture.md +0 -0
  15. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/evals/devteam/repo/docs/runbook.md +0 -0
  16. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/evals/devteam/repo/issues/142-settlement-timeout.md +0 -0
  17. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/evals/devteam/repo/patches/0009-retry-budget.patch +0 -0
  18. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/evals/devteam/repo/src/ledger/__init__.py +0 -0
  19. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/evals/devteam/repo/src/ledger/config.py +0 -0
  20. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/evals/devteam/repo/src/ledger/errors.py +0 -0
  21. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/evals/devteam/repo/src/ledger/posting.py +0 -0
  22. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/evals/devteam/repo/src/ledger/registry.py +0 -0
  23. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/evals/devteam/repo/src/ledger/report.py +0 -0
  24. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/evals/devteam/repo/src/ledger/retry.py +0 -0
  25. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/evals/devteam/repo/src/ledger/settle.py +0 -0
  26. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/evals/devteam/repo/src/ledger/validate.py +0 -0
  27. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/evals/devteam/repo/tests/test_posting.py +0 -0
  28. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/evals/devteam/repo/tests/test_settle.py +0 -0
  29. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/evals/devteam/tasks/dt-error-contract.yaml +0 -0
  30. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/evals/devteam/tasks/dt-handler-map.yaml +0 -0
  31. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/evals/devteam/tasks/dt-patch-before-after.yaml +0 -0
  32. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/evals/devteam/tasks/dt-retry-attempts.yaml +0 -0
  33. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/evals/devteam/tasks/dt-settlement-config.yaml +0 -0
  34. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/evals/devteam/tasks/dt-symbol-home.yaml +0 -0
  35. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/evals/devteam/tasks/dt-trace-blame.yaml +0 -0
  36. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/evals/devteam/tasks/dt-unread-key.yaml +0 -0
  37. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/evals/document/tasks/doc-large-in-137.yaml +0 -0
  38. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/evals/document/tasks/doc-large-in-359.yaml +0 -0
  39. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/evals/document/tasks/doc-large-in-372.yaml +0 -0
  40. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/evals/document/tasks/doc-large-out-11764.yaml +0 -0
  41. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/evals/document/tasks/doc-large-out-4137.yaml +0 -0
  42. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/evals/document/tasks/doc-large-out-8022.yaml +0 -0
  43. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/evals/document/tasks/doc-small-137.yaml +0 -0
  44. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/evals/document/tasks/doc-small-261.yaml +0 -0
  45. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/evals/document/tasks/doc-small-388.yaml +0 -0
  46. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/evals/fixtures/.gitkeep +0 -0
  47. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/evals/fixtures/catalog.json +0 -0
  48. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/evals/perturbations/task-completion.yaml +0 -0
  49. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/evals/tasks/.gitkeep +0 -0
  50. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/evals/tasks/extract-contact.yaml +0 -0
  51. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/evals/tasks/extract-invoice.yaml +0 -0
  52. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/evals/tasks/extract-order.yaml +0 -0
  53. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/evals/tasks/extract-schedule.yaml +0 -0
  54. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/evals/tasks/extract-versions.yaml +0 -0
  55. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/evals/tasks/nav-prod-port.yaml +0 -0
  56. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/evals/tasks/nav-release-bundle.yaml +0 -0
  57. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/evals/tasks/recall-audit-retention.yaml +0 -0
  58. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/evals/tasks/recall-cache-ttl.yaml +0 -0
  59. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/evals/tasks/recall-db-port.yaml +0 -0
  60. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/evals/tasks/recall-deploy.yaml +0 -0
  61. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/evals/tasks/recall-env-endpoint.yaml +0 -0
  62. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/evals/tasks/recall-oncall-rotation.yaml +0 -0
  63. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/evals/tasks/recall-oncall.yaml +0 -0
  64. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/evals/tasks/recall-org-quota.yaml +0 -0
  65. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/evals/tasks/recall-owner.yaml +0 -0
  66. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/evals/tasks/shop-basket-total.yaml +0 -0
  67. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/evals/tasks/shop-cheapest.yaml +0 -0
  68. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/evals/tasks/shop-compare.yaml +0 -0
  69. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/evals/tasks/shop-gadget-value.yaml +0 -0
  70. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/evals/tasks/shop-stock-total.yaml +0 -0
  71. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/evals/tasks/shop-total.yaml +0 -0
  72. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/pricing/default.json +0 -0
  73. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/profiles/default.yaml +0 -0
  74. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/profiles/patient.yaml +0 -0
  75. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/rubrics/.gitkeep +0 -0
  76. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/rubrics/code-quality.yaml +0 -0
  77. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/rubrics/grounded-completion.yaml +0 -0
  78. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/rubrics/task-completion.yaml +0 -0
  79. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/schemas/shiftwork-checkpoint.json +0 -0
  80. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/skills/.gitkeep +0 -0
  81. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/skills/file-graph.md +0 -0
  82. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/skills/memory.md +0 -0
  83. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/tools/.gitkeep +0 -0
  84. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/tools/bantamkit_read.json +0 -0
  85. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/tools/bantamkit_status.json +0 -0
  86. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/tools/build_identity.json +0 -0
  87. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/tools/document_list.json +0 -0
  88. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/tools/document_read.json +0 -0
  89. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/tools/file_graph.json +0 -0
  90. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/tools/memory_compact.json +0 -0
  91. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/tools/memory_dream.json +0 -0
  92. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/tools/memory_recall.json +0 -0
  93. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/tools/memory_save.json +0 -0
  94. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/tools/repo_map.json +0 -0
  95. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/tools/shiftwork_clock_in.json +0 -0
  96. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/tools/shiftwork_clock_out.json +0 -0
  97. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/tools/shiftwork_status.json +0 -0
  98. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/tools/skill_audit.json +0 -0
  99. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/tools/token_ledger.json +0 -0
  100. {bantamkit-0.34.0 → bantamkit-0.34.1}/_assets/tools/validate_json.json +0 -0
  101. {bantamkit-0.34.0 → bantamkit-0.34.1}/hatch_build.py +0 -0
  102. {bantamkit-0.34.0 → bantamkit-0.34.1}/src/bantamkit/agent.py +0 -0
  103. {bantamkit-0.34.0 → bantamkit-0.34.1}/src/bantamkit/assets.py +0 -0
  104. {bantamkit-0.34.0 → bantamkit-0.34.1}/src/bantamkit/budget.py +0 -0
  105. {bantamkit-0.34.0 → bantamkit-0.34.1}/src/bantamkit/client.py +0 -0
  106. {bantamkit-0.34.0 → bantamkit-0.34.1}/src/bantamkit/contract.py +0 -0
  107. {bantamkit-0.34.0 → bantamkit-0.34.1}/src/bantamkit/criticreplay.py +0 -0
  108. {bantamkit-0.34.0 → bantamkit-0.34.1}/src/bantamkit/critique.py +0 -0
  109. {bantamkit-0.34.0 → bantamkit-0.34.1}/src/bantamkit/docmanifest.py +0 -0
  110. {bantamkit-0.34.0 → bantamkit-0.34.1}/src/bantamkit/docread.py +0 -0
  111. {bantamkit-0.34.0 → bantamkit-0.34.1}/src/bantamkit/evalrun.py +0 -0
  112. {bantamkit-0.34.0 → bantamkit-0.34.1}/src/bantamkit/eventlog.py +0 -0
  113. {bantamkit-0.34.0 → bantamkit-0.34.1}/src/bantamkit/filegraph.py +0 -0
  114. {bantamkit-0.34.0 → bantamkit-0.34.1}/src/bantamkit/hostinstall.py +0 -0
  115. {bantamkit-0.34.0 → bantamkit-0.34.1}/src/bantamkit/loopguard.py +0 -0
  116. {bantamkit-0.34.0 → bantamkit-0.34.1}/src/bantamkit/mcpreport.py +0 -0
  117. {bantamkit-0.34.0 → bantamkit-0.34.1}/src/bantamkit/mcpserver.py +0 -0
  118. {bantamkit-0.34.0 → bantamkit-0.34.1}/src/bantamkit/memory/__init__.py +0 -0
  119. {bantamkit-0.34.0 → bantamkit-0.34.1}/src/bantamkit/memory/__main__.py +0 -0
  120. {bantamkit-0.34.0 → bantamkit-0.34.1}/src/bantamkit/memory/component.py +0 -0
  121. {bantamkit-0.34.0 → bantamkit-0.34.1}/src/bantamkit/memory/divergence.py +0 -0
  122. {bantamkit-0.34.0 → bantamkit-0.34.1}/src/bantamkit/memory/dream.py +0 -0
  123. {bantamkit-0.34.0 → bantamkit-0.34.1}/src/bantamkit/memory/layers.py +0 -0
  124. {bantamkit-0.34.0 → bantamkit-0.34.1}/src/bantamkit/memory/store.py +0 -0
  125. {bantamkit-0.34.0 → bantamkit-0.34.1}/src/bantamkit/pdfread.py +0 -0
  126. {bantamkit-0.34.0 → bantamkit-0.34.1}/src/bantamkit/pricing.py +0 -0
  127. {bantamkit-0.34.0 → bantamkit-0.34.1}/src/bantamkit/profile.py +0 -0
  128. {bantamkit-0.34.0 → bantamkit-0.34.1}/src/bantamkit/repomap.py +0 -0
  129. {bantamkit-0.34.0 → bantamkit-0.34.1}/src/bantamkit/selfupdate.py +0 -0
  130. {bantamkit-0.34.0 → bantamkit-0.34.1}/src/bantamkit/shiftwork.py +0 -0
  131. {bantamkit-0.34.0 → bantamkit-0.34.1}/src/bantamkit/skillaudit.py +0 -0
  132. {bantamkit-0.34.0 → bantamkit-0.34.1}/src/bantamkit/statusline.py +0 -0
  133. {bantamkit-0.34.0 → bantamkit-0.34.1}/src/bantamkit/structured.py +0 -0
  134. {bantamkit-0.34.0 → bantamkit-0.34.1}/src/bantamkit/textutil.py +0 -0
  135. {bantamkit-0.34.0 → bantamkit-0.34.1}/src/bantamkit/tokenledger.py +0 -0
  136. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/cli_exit_status_probe.py +0 -0
  137. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/conftest.py +0 -0
  138. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/data/docread/bad-crc.docx +0 -0
  139. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/data/docread/charref-4301-digits.html +0 -0
  140. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/data/docread/charset-table.json +0 -0
  141. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/data/docread/compression-method-9.docx +0 -0
  142. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/data/docread/corrupt-deflate.docx +0 -0
  143. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/data/docread/encrypted-member.docx +0 -0
  144. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/data/docread/encrypted-mimetype.odt +0 -0
  145. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/data/docread/eszett-cell-ref.xlsx +0 -0
  146. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/data/docread/internal-dtd-entity.docx +0 -0
  147. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/data/docread/rfc2231-charset.eml +0 -0
  148. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/data/docread/rfc822-nested-twice.eml +0 -0
  149. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/data/docread/unicode-digit-shared-string.xlsx +0 -0
  150. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/data/docread/x-uuencode.eml +0 -0
  151. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/data/f8404ab-perturbation-baseline.json +0 -0
  152. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/data/platform-assumption-baseline.json +0 -0
  153. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/data/served-tool-surface.json +0 -0
  154. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/docread_fixtures.py +0 -0
  155. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/perturbation_baseline_harness.py +0 -0
  156. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/rbp16_effect_probe.py +0 -0
  157. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/rbp18_payload_probe.py +0 -0
  158. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/test_adapter.py +0 -0
  159. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/test_agent.py +0 -0
  160. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/test_amendguard.py +0 -0
  161. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/test_bantamkit_gitignore.py +0 -0
  162. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/test_bantamkit_read_tool.py +0 -0
  163. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/test_budget.py +0 -0
  164. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/test_build_identity.py +0 -0
  165. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/test_client.py +0 -0
  166. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/test_compaction_corpus_survey.py +0 -0
  167. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/test_conformance.py +0 -0
  168. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/test_conformance_harness_resilience.py +0 -0
  169. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/test_conformance_suite_table_gate.py +0 -0
  170. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/test_contract_fanout.py +0 -0
  171. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/test_criticreplay.py +0 -0
  172. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/test_critique.py +0 -0
  173. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/test_doc_commands_gate.py +0 -0
  174. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/test_docread.py +0 -0
  175. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/test_docread_ceilings.py +0 -0
  176. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/test_document_manifest_parity.py +0 -0
  177. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/test_document_setup.py +0 -0
  178. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/test_document_tasks.py +0 -0
  179. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/test_document_tools.py +0 -0
  180. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/test_encoding_gate.py +0 -0
  181. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/test_evalrun.py +0 -0
  182. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/test_eventlog.py +0 -0
  183. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/test_field_program_gates.py +0 -0
  184. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/test_field_programs.py +0 -0
  185. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/test_filegraph.py +0 -0
  186. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/test_hostinstall.py +0 -0
  187. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/test_install_shape.py +0 -0
  188. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/test_ladder_statistics.py +0 -0
  189. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/test_launcher_which.py +0 -0
  190. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/test_layers.py +0 -0
  191. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/test_loopguard.py +0 -0
  192. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/test_mcp_endpoint.py +0 -0
  193. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/test_mcpdrift.py +0 -0
  194. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/test_mcpreport.py +0 -0
  195. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/test_mcpserver.py +0 -0
  196. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/test_memory.py +0 -0
  197. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/test_memory_compact_tool.py +0 -0
  198. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/test_memory_component.py +0 -0
  199. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/test_memory_divergence.py +0 -0
  200. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/test_memory_dream.py +0 -0
  201. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/test_memory_layers.py +0 -0
  202. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/test_memory_store_tripwire.py +0 -0
  203. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/test_mutmatrix.py +0 -0
  204. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/test_newline_gate.py +0 -0
  205. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/test_packaging.py +0 -0
  206. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/test_pdfread.py +0 -0
  207. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/test_pinharness_ledger.py +0 -0
  208. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/test_platform_assumption_gate.py +0 -0
  209. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/test_pricing.py +0 -0
  210. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/test_repo_map_tool.py +0 -0
  211. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/test_repomap.py +0 -0
  212. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/test_selfupdate.py +0 -0
  213. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/test_served_tool_count_records.py +0 -0
  214. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/test_shiftwork.py +0 -0
  215. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/test_skillaudit.py +0 -0
  216. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/test_status_surface.py +0 -0
  217. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/test_statusline.py +0 -0
  218. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/test_structured.py +0 -0
  219. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/test_thread_exception_gate.py +0 -0
  220. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/test_tokenledger.py +0 -0
  221. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/test_tool_manifest.py +0 -0
  222. {bantamkit-0.34.0 → bantamkit-0.34.1}/tests/test_version_agreement.py +0 -0
@@ -0,0 +1,389 @@
1
+ Metadata-Version: 2.5
2
+ Name: bantamkit
3
+ Version: 0.34.1
4
+ Summary: Memory MCP server for Claude Code, Cursor, VS Code Copilot and Claude Desktop, plus a Python library that lifts small-model agents. Install once, run offline.
5
+ Project-URL: Homepage, https://github.com/Ink01101011/bantamkit
6
+ Project-URL: Repository, https://github.com/Ink01101011/bantamkit
7
+ Project-URL: Issues, https://github.com/Ink01101011/bantamkit/issues
8
+ Project-URL: Documentation, https://github.com/Ink01101011/bantamkit/tree/main/docs
9
+ License-Expression: MIT
10
+ Keywords: agent,claude,claude-code,claude-desktop,copilot,cursor,json-schema,llm,mcp,mcp-server,memory,model-context-protocol,vscode
11
+ Classifier: Intended Audience :: Developers
12
+ Classifier: Programming Language :: Python :: 3 :: Only
13
+ Classifier: Programming Language :: Python :: 3.11
14
+ Classifier: Programming Language :: Python :: 3.12
15
+ Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
16
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
17
+ Requires-Python: >=3.11
18
+ Requires-Dist: httpx>=0.27
19
+ Requires-Dist: jsonschema>=4.21
20
+ Requires-Dist: pyyaml>=6.0
21
+ Provides-Extra: dev
22
+ Requires-Dist: hatchling>=1.24; extra == 'dev'
23
+ Requires-Dist: pytest>=8.0; extra == 'dev'
24
+ Requires-Dist: ruff>=0.4; extra == 'dev'
25
+ Provides-Extra: mcp
26
+ Requires-Dist: mcp<3,>=2.0; extra == 'mcp'
27
+ Description-Content-Type: text/markdown
28
+
29
+ # bantamkit — memory MCP server for Claude Code, Cursor, VS Code Copilot and Claude Desktop (Python)
30
+
31
+ **bantamkit** is a Python **MCP server** on **PyPI** that gives coding agents a per-person
32
+ **memory** store, JSON Schema validation, shift-work accounting, a token ledger and a
33
+ skill-catalogue auditor. It works with **Claude Code**, **Claude Desktop**, **Cursor**, **GitHub
34
+ Copilot in VS Code** and any stdio MCP client. Install it with `pip install "bantamkit[mcp]"`;
35
+ after one install it starts **offline**.
36
+
37
+ The same server in pure Node is on **npm** as
38
+ [`bantamkit-mcp`](https://www.npmjs.com/package/bantamkit-mcp). The two share a memory store on
39
+ disk and a conformance suite holds them to the same answers, so install whichever your host makes
40
+ easy.
41
+
42
+ ## Contents
43
+
44
+ | Topic | What you'll find |
45
+ |---|---|
46
+ | [Install the MCP server](#install-the-mcp-server) | Try it with `pipx run`; the `[mcp]` extra |
47
+ | [Install once, run offline](#install-once-run-offline) | A venv you keep, and a wheelhouse for machines with no network |
48
+ | [Run with pipx at every launch](#run-with-pipx-at-every-launch) | The online form, and when it fails offline |
49
+ | [Connect it to a host](#connect-it-to-a-host) | The same five steps for every host |
50
+ | [Connect to Claude Code](#connect-to-claude-code) | `--install claude`, `claude mcp remove` |
51
+ | [Connect to Claude Desktop](#connect-to-claude-desktop) | `claude_desktop_config.json` per OS |
52
+ | [Connect to Cursor](#connect-to-cursor) | `~/.cursor/mcp.json` |
53
+ | [Connect to VS Code (GitHub Copilot)](#connect-to-vs-code-github-copilot) | `mcp.json` with the `servers` key |
54
+ | [Connect other MCP clients](#connect-other-mcp-clients) | Any stdio host |
55
+ | [Configuration](#configuration) | Every flag and environment variable, with its default |
56
+ | [Update](#update) | `--update`, pipx and uv, then restart |
57
+ | [Troubleshooting](#troubleshooting) | Timeouts, refusals, the wrong store |
58
+ | [What it serves](#what-it-serves) | The 12 tools, one prompt, two resource templates |
59
+ | [Requirements](#requirements) | Python and dependencies |
60
+ | [The asset pack](#the-asset-pack) | `--assets-root` and `BANTAMKIT_ASSETS` |
61
+ | [The operator CLI: `python -m bantamkit.memory`](#the-operator-cli-python--m-bantamkitmemory) | status, lint, compact, archived, archive, restore |
62
+ | [Share a store with the Node server](#share-a-store-with-the-node-server) | One on-disk format, two servers |
63
+ | [Where the Python and Node servers differ](#where-the-python-and-node-servers-differ) | pdf/.doc/.rtf, the CLI name, `build_id` |
64
+ | [Development](#development) | Clone, test, lint, conformance |
65
+ | [Documentation](#documentation) | Links to the full docs on GitHub |
66
+
67
+ ## Install the MCP server
68
+
69
+ To try it:
70
+
71
+ ```bash
72
+ pipx run --spec "bantamkit[mcp]" bantamkit-mcp --assets-root
73
+ ```
74
+
75
+ The `[mcp]` extra pulls the MCP SDK. Without it you still get the library, but the server exits
76
+ with `bantamkit-mcp needs the MCP extra: pip install "bantamkit[mcp]"`. The uv equivalent,
77
+ `uvx --from "bantamkit[mcp]" bantamkit-mcp`, is documented but was not measured here.
78
+
79
+ A host launches the server every session, so what matters is whether each launch needs the
80
+ network. For a host, use **install once**.
81
+
82
+ ### Install once, run offline
83
+
84
+ **Recommended.**
85
+
86
+ ```bash
87
+ python -m venv <env>
88
+ <env>/bin/pip install "bantamkit[mcp]"
89
+ <env>/bin/bantamkit-mcp --install cursor # or claude, claude-desktop, copilot
90
+ ```
91
+
92
+ `--install` records the venv's console script by absolute path with `"args": []`, so no launch
93
+ needs the network or your shell's PATH. Measured on macOS arm64: that command served 12 tools
94
+ under a GUI app's PATH, `/usr/bin:/bin:/usr/sbin:/sbin`. The Windows layout (`<env>\Scripts\`)
95
+ was not measured.
96
+
97
+ **No network on the target machine? Carry a wheelhouse.** Download on a connected machine with
98
+ the **same OS, CPU architecture and Python minor version** (some wheels, such as
99
+ `pydantic_core`, are built for one platform only), copy `wheels/` across, then install from it:
100
+
101
+ ```bash
102
+ python -m pip download "bantamkit[mcp]==0.34.0" -d wheels
103
+ python -m venv <env>
104
+ <env>/bin/pip install --no-index --find-links wheels "bantamkit[mcp]==0.34.0"
105
+ <env>/bin/bantamkit-mcp --install cursor
106
+ ```
107
+
108
+ To move to a newer version, repeat both steps with the new version number. Measurements:
109
+ [docs/install.md → Python package: measured detail](https://github.com/Ink01101011/bantamkit/blob/main/docs/install.md#python-package-measured-detail).
110
+
111
+ ### Run with pipx at every launch
112
+
113
+ ```json
114
+ {"mcpServers": {"bantamkit": {"command": "pipx", "args": ["run", "--spec", "bantamkit[mcp]", "bantamkit-mcp"]}}}
115
+ ```
116
+
117
+ One config line and no venv to keep, but it works offline **only while pipx's cache lasts**.
118
+ Measured with the network cut: on a pipx home that had never run it, it exited 1 in 1.33 s; after
119
+ one online run, it exited 0 in 0.47 s. It needs the package index on a new machine, after the
120
+ cache is cleared, and whenever pipx decides its cached environment is stale (pipx's policy, not
121
+ measured). For Claude Code:
122
+ `claude mcp add bantamkit -s user -- pipx run --spec "bantamkit[mcp]" bantamkit-mcp`.
123
+
124
+ ## Connect it to a host
125
+
126
+ `bantamkit-mcp --install <host>` (`claude`, `claude-desktop`, `copilot`, `cursor`) writes the
127
+ entry, pointing at the console script you ran. It never prompts, so it behaves the same in a
128
+ terminal, in CI and inside another agent. For the three JSON hosts it backs the file up first as
129
+ `<name>.backup-<date>`, keeps the file's permissions, refuses a file that does not parse, and
130
+ refuses an entry that differs unless you pass `--force`.
131
+
132
+ Each host below has the same steps: **1** command, **2** file, **3** entry, **4** confirm,
133
+ **5** undo or re-run. The entry's `command` and `args` depend on the install route:
134
+
135
+ | Route | `command` | `args` |
136
+ |---|---|---|
137
+ | Python venv, install once | `/absolute/path/to/env/bin/bantamkit-mcp` | `[]` |
138
+ | pipx at every launch | `pipx` | `["run", "--spec", "bantamkit[mcp]", "bantamkit-mcp"]` |
139
+ | npm, install once | see the [npm package](https://www.npmjs.com/package/bantamkit-mcp) | |
140
+
141
+ To check a recorded command, run it in a terminal: with nothing on stdin it prints
142
+ `usage: bantamkit-mcp …`.
143
+
144
+ ### Connect to Claude Code
145
+
146
+ 1. **Command:** `<env>/bin/bantamkit-mcp --install claude`
147
+ 2. **File:** none edited directly. It runs `claude mcp add bantamkit -s user -- <command>`
148
+ (user scope, every project), because `~/.claude.json` is the host's file and holds state that
149
+ is not MCP configuration.
150
+ 3. **Entry:** printed as `ran : claude mcp add bantamkit -s user -- <env>/bin/bantamkit-mcp`.
151
+ 4. **Confirm:** `claude mcp list` lists `bantamkit`. In a session, ask the agent to call
152
+ `bantamkit_status`.
153
+ 5. **Undo / re-run:** `--force` does not reach Claude Code, and a second add fails with
154
+ `MCP server bantamkit already exists in user config`. Remove first:
155
+
156
+ ```bash
157
+ claude mcp remove bantamkit -s user
158
+ <env>/bin/bantamkit-mcp --install claude
159
+ ```
160
+
161
+ ### Connect to Claude Desktop
162
+
163
+ 1. **Command:** `<env>/bin/bantamkit-mcp --install claude-desktop`
164
+ 2. **File:** macOS `~/Library/Application Support/Claude/claude_desktop_config.json` ·
165
+ Windows `%APPDATA%\Claude\claude_desktop_config.json` ·
166
+ Linux `~/.config/Claude/claude_desktop_config.json`
167
+ 3. **Entry** (key `mcpServers`; each entry takes `command`, `args` and an optional `env`):
168
+
169
+ ```json
170
+ {"mcpServers": {"bantamkit": {"command": "/absolute/path/to/env/bin/bantamkit-mcp", "args": []}}}
171
+ ```
172
+
173
+ 4. **Confirm:** it prints `installed bantamkit into claude-desktop` with file, key and command.
174
+ Fully quit and reopen Claude Desktop, then ask it to call `bantamkit_status`.
175
+ 5. **Undo / re-run:** there is no uninstall flag. Delete the `bantamkit` entry or restore
176
+ `claude_desktop_config.json.backup-<date>`. A matching re-run prints
177
+ `bantamkit is already installed in claude-desktop and matches`; a differing entry needs `--force`.
178
+
179
+ ### Connect to Cursor
180
+
181
+ 1. **Command:** `<env>/bin/bantamkit-mcp --install cursor`
182
+ 2. **File:** `~/.cursor/mcp.json` on every OS (`%USERPROFILE%\.cursor\mcp.json` on Windows);
183
+ `.cursor/mcp.json` for one project, by hand.
184
+ 3. **Entry** (key `mcpServers`):
185
+
186
+ ```json
187
+ {"mcpServers": {"bantamkit": {"command": "/absolute/path/to/env/bin/bantamkit-mcp", "args": []}}}
188
+ ```
189
+
190
+ 4. **Confirm:** it prints `installed bantamkit into cursor` and `key : mcpServers`. Restart
191
+ Cursor and ask the agent to call `bantamkit_status`.
192
+ 5. **Undo / re-run:** delete the entry or restore `mcp.json.backup-<date>`. A differing entry,
193
+ such as an old `pipx run` one, is refused and printed beside the one it would write; replace
194
+ it with `<env>/bin/bantamkit-mcp --install cursor --force`.
195
+
196
+ ### Connect to VS Code (GitHub Copilot)
197
+
198
+ 1. **Command:** `<env>/bin/bantamkit-mcp --install copilot`
199
+ 2. **File:** macOS `~/Library/Application Support/Code/User/mcp.json` ·
200
+ Windows `%APPDATA%\Code\User\mcp.json` · Linux `~/.config/Code/User/mcp.json`;
201
+ `.vscode/mcp.json` for one workspace, or **MCP: Open User Configuration**, by hand.
202
+ 3. **Entry:** the key is **`servers`**, not `mcpServers`, plus `"type": "stdio"`. This is the
203
+ detail that catches people out:
204
+
205
+ ```json
206
+ {"servers": {"bantamkit": {"type": "stdio", "command": "/absolute/path/to/env/bin/bantamkit-mcp", "args": []}}}
207
+ ```
208
+
209
+ 4. **Confirm:** it prints `installed bantamkit into copilot` and `key : servers`. Restart
210
+ VS Code and ask Copilot to call `bantamkit_status`.
211
+ 5. **Undo / re-run:** delete the entry or restore `mcp.json.backup-<date>`; `--force` replaces
212
+ a differing entry.
213
+
214
+ ### Connect other MCP clients
215
+
216
+ Anything that speaks MCP over stdio runs the same `command`/`args` and talks JSON-RPC on stdin
217
+ and stdout; nothing in this package is host-specific. Codex and a generic JSON config:
218
+ [docs/mcp.md → Client setup](https://github.com/Ink01101011/bantamkit/blob/main/docs/mcp.md#client-setup).
219
+
220
+ ## Configuration
221
+
222
+ Flags go in the entry's `args`; environment variables in its `env` block (or
223
+ `claude mcp add -e NAME=value`). Both runtimes print the same `--help`.
224
+
225
+ | Setting | What it does | Default | Example |
226
+ |---|---|---|---|
227
+ | `BANTAMKIT_MEMORY_DIR` | Pins the store to one absolute path; a relative or unreachable path refuses at startup | unset: nearest existing `.bantamkit/memory` at or above the start directory | `"env": {"BANTAMKIT_MEMORY_DIR": "/abs/project/.bantamkit/memory"}` |
228
+ | `--store STORE` | One store, layering off; outranks `BANTAMKIT_MEMORY_DIR` | off (layered) | `"--store", "/abs/store"` |
229
+ | `--start START` | Where project-store discovery starts; not with `--store` | cwd | `"--start", "/abs/project"` |
230
+ | Layered memory | Recall reads the project store, stores granted in `.bantamkit/config.yaml`, and `~/.bantamkit/memory`; saves go to the project store | on | [docs/memory.md → Layers](https://github.com/Ink01101011/bantamkit/blob/main/docs/memory.md#layers) |
231
+ | `--k K` | Default recall budget | `3` | `"--k", "5"` |
232
+ | `--index-budget BYTES` | Memory index byte budget | `24000` | `"--index-budget", "32000"` |
233
+ | `BANTAMKIT_EVENT_LOG` | Logs tool outcomes as JSONL | off; `on` → `<store>/events/mcp.jsonl`; other values are a path | `"env": {"BANTAMKIT_EVENT_LOG": "on"}` |
234
+ | `BANTAMKIT_ASSETS` | Your own asset pack (skills, rubrics, schemas) | the pack inside the package | `"env": {"BANTAMKIT_ASSETS": "/abs/my-assets"}` |
235
+ | `BANTAMKIT_HOST_LOG_ROOT` | Where `--mcp-report` finds the host's MCP logs | macOS `~/Library/Caches/claude-cli-nodejs`; elsewhere unset | `BANTAMKIT_HOST_LOG_ROOT=/abs/logs bantamkit-mcp --mcp-report` |
236
+ | `BANTAMKIT_PRICES` | Price table for the token ledger | `pricing/default.json` in the asset pack | `"env": {"BANTAMKIT_PRICES": "/abs/prices.json"}` |
237
+
238
+ Don't add `--store` by reflex: the default is layered, and the layering is most of the value.
239
+ One-shot commands that print and exit: `--install {claude,claude-desktop,copilot,cursor}` (with
240
+ `--force`), `--update`, `--assets-root`, `--mcp-report`, `--statusline`, `-h`. More:
241
+ [store binding](https://github.com/Ink01101011/bantamkit/blob/main/docs/mcp.md#which-memory-store-the-server-binds) ·
242
+ [pinning](https://github.com/Ink01101011/bantamkit/blob/main/docs/memory.md#pinning-the-store-bantamkit_memory_dir) ·
243
+ [event log](https://github.com/Ink01101011/bantamkit/blob/main/docs/eventlog.md#the-switch) ·
244
+ [prices](https://github.com/Ink01101011/bantamkit/blob/main/docs/ledger.md).
245
+
246
+ ## Update
247
+
248
+ ```bash
249
+ <env>/bin/bantamkit-mcp --update # a pip install from PyPI: runs pip install --upgrade bantamkit
250
+ pip install -U "bantamkit[mcp]" # the same, by hand
251
+ pipx upgrade bantamkit # pipx
252
+ uv tool upgrade bantamkit # uv
253
+ ```
254
+
255
+ `--update` (`check the package index and update this install if it differs, then exit`) upgrades
256
+ an install from PyPI with this interpreter's pip. An editable install, a local file or a source
257
+ tree is refused with exit 1 and a sentence naming the manual route (for a clone, `git pull`). It
258
+ is the only network access here, and only when you type it. For a wheelhouse, repeat the
259
+ download and install with the new version.
260
+
261
+ **Then restart the server in the host** (`/mcp` → reconnect in Claude Code; a full restart of
262
+ Claude Desktop): a running server keeps the code it started with. `bantamkit_status` prints the
263
+ version **and the `build_id` of the code answering you**; a new version with an old `build_id`
264
+ means an old process.
265
+
266
+ ## Troubleshooting
267
+
268
+ | Symptom | Fix |
269
+ |---|---|
270
+ | The host times out; the server never answers | The entry uses `pipx run` and pipx's cache is cold with no network. Use [Install once, run offline](#install-once-run-offline) |
271
+ | `ENOENT` from the host | A GUI host does not read your shell rc, so `pipx` is not on its PATH. `--install` records an absolute path |
272
+ | `bantamkit-mcp needs the MCP extra: pip install "bantamkit[mcp]"` | Install with the `[mcp]` extra |
273
+ | `already has a bantamkit entry with different settings … re-run with --force to replace it` | Re-run with `--force`; the old file is kept as `.backup-<date>` |
274
+ | `… is not valid JSON, so this refuses to touch it` | Fix the host's file by hand, then re-run |
275
+ | `MCP server bantamkit already exists in user config` | `claude mcp remove bantamkit -s user`, then install again |
276
+ | `pinned memory store must be an absolute path` or `pinned memory store is unreachable` | Give `BANTAMKIT_MEMORY_DIR` an absolute path that exists |
277
+ | Recall finds nothing, or the wrong store | Set `BANTAMKIT_MEMORY_DIR`; the reply names the store it searched ([the three states](https://github.com/Ink01101011/bantamkit/blob/main/docs/mcp.md#the-three-states-and-what-memory_recall-tells-the-model)) |
278
+ | `AssetNotFound: no assets directory found; set BANTAMKIT_ASSETS` | See [The asset pack](#the-asset-pack) |
279
+
280
+ ## What it serves
281
+
282
+ The server serves 12 tools, the `bantamkit_status` prompt and two resource templates
283
+ (`bantamkit://skills/{name}`, `bantamkit://rubrics/{name}`):
284
+
285
+ | Tool | What it does |
286
+ |---|---|
287
+ | `memory_save` | store one durable fact, deduped and budgeted |
288
+ | `memory_recall` | retrieve facts matching a query |
289
+ | `memory_compact` | archive the stalest facts to fit the index budget |
290
+ | `memory_dream` | consolidate facts the project and profile layers hold under the same name |
291
+ | `validate_json` | validate a document against a JSON Schema |
292
+ | `skill_audit` | audit a skill catalogue for findings |
293
+ | `shiftwork_clock_in` | open a unit of work and get its brief |
294
+ | `shiftwork_clock_out` | close a unit with status and accounting |
295
+ | `shiftwork_status` | report the open cursor |
296
+ | `token_ledger` | what a session cost, read off the host's transcripts |
297
+ | `bantamkit_status` | report store health against its budget |
298
+ | `build_identity` | report the fingerprint of the source on disk |
299
+
300
+ `build_identity` describes the tree on disk, not the code currently executing — useful precisely
301
+ when a machine carries two installs under one name. `bantamkit_read`, the document reader, left
302
+ the served tools in job50 (2026-09-12); the reader itself stays in the library as
303
+ `bantamkit.docread`.
304
+
305
+ ## Requirements
306
+
307
+ Python 3.11 or newer. Three runtime dependencies — `httpx`, `jsonschema`, `pyyaml` — plus `mcp`
308
+ under the `[mcp]` extra.
309
+
310
+ ## The asset pack
311
+
312
+ Contracts, schemas, eval tasks, rubrics and tool manifests ship inside the package and are
313
+ located at import time:
314
+
315
+ ```bash
316
+ bantamkit-mcp --assets-root
317
+ ```
318
+
319
+ It prints the resolved directory and its file count. A build that cannot find the pack fails
320
+ rather than producing an artifact without it — deliberately, because the silent version shipped
321
+ once. `BANTAMKIT_ASSETS` overrides the location.
322
+
323
+ ## The operator CLI: `python -m bantamkit.memory`
324
+
325
+ Memory-store maintenance is separate from the agent-facing tools and is not served over MCP:
326
+
327
+ ```bash
328
+ python -m bantamkit.memory status # index size, budget, headroom, archive count
329
+ python -m bantamkit.memory lint # exit 1 if the store is malformed or over budget
330
+ python -m bantamkit.memory compact # archive the stalest facts
331
+ python -m bantamkit.memory archived # list what compaction has moved out
332
+ python -m bantamkit.memory archive <name>
333
+ python -m bantamkit.memory restore <name>
334
+ ```
335
+
336
+ `archive` moves a fact out of the store without deleting it; `restore` brings it back by name.
337
+ Full reference: [docs/memory.md → The operator CLI](https://github.com/Ink01101011/bantamkit/blob/main/docs/memory.md#the-operator-cli).
338
+
339
+ ## Share a store with the Node server
340
+
341
+ Both servers read and write the same on-disk format, so either can serve one store. A surface in
342
+ one and not the other would be a way for two servers to disagree about one person's data, so
343
+ every feature lands in both in the same change, and a conformance case compares the two answers
344
+ before it counts as ported.
345
+
346
+ ## Where the Python and Node servers differ
347
+
348
+ - **This side's document reader (`bantamkit.docread`) reads pdf, `.doc` and `.rtf`; the Node
349
+ side refuses them by name.** PDF is read by a stdlib reader written for this project; real OLE2 `.doc` and `.rtf` go through
350
+ `/usr/bin/textutil`, a macOS built-in that is probed at every call and refused by name where it
351
+ is absent.
352
+ - **The operator CLI is spelled differently**, and it shows in help text and error messages:
353
+ `python -m bantamkit.memory` here, `bantamkit-memory` there. There is no third spelling — a
354
+ pure-npm install has no Python in it, and CPython does not install that console script.
355
+ - **`build_id` hashes the executing tree**, and the two runtimes are two trees, so it differs by
356
+ construction. `assets_digest` is identical, and that is the one that carries meaning.
357
+
358
+ Each is recorded in the
359
+ [divergence table](https://github.com/Ink01101011/bantamkit/blob/main/docs/porting.md#where-the-two-runtimes-deliberately-differ)
360
+ with a conformance case pinning the wording, so the difference cannot drift unnoticed.
361
+
362
+ ## Development
363
+
364
+ ```bash
365
+ git clone https://github.com/Ink01101011/bantamkit
366
+ cd bantamkit
367
+ python -m venv .venv && .venv/bin/pip install -e "runtime-py[dev,mcp]"
368
+ .venv/bin/python -m pytest runtime-py/tests -q
369
+ .venv/bin/ruff check runtime-py
370
+ ```
371
+
372
+ The cross-runtime gate needs Node:
373
+
374
+ ```bash
375
+ node tools/conformance/run.mjs --all
376
+ ```
377
+
378
+ ## Documentation
379
+
380
+ | Page | Covers |
381
+ |---|---|
382
+ | [Source on GitHub](https://github.com/Ink01101011/bantamkit) | The repository and its README |
383
+ | [npm package `bantamkit-mcp`](https://www.npmjs.com/package/bantamkit-mcp) | The pure-Node server |
384
+ | [Install](https://github.com/Ink01101011/bantamkit/blob/main/docs/install.md) | Requirements, editable install, measured MCP install detail |
385
+ | [MCP](https://github.com/Ink01101011/bantamkit/blob/main/docs/mcp.md) | Client setup and which memory store the server binds |
386
+ | [Memory](https://github.com/Ink01101011/bantamkit/blob/main/docs/memory.md) | Store layout, layers, pinning, the operator CLI |
387
+ | [Porting](https://github.com/Ink01101011/bantamkit/blob/main/docs/porting.md) | What the two runtimes disagree about |
388
+
389
+ MIT.