graphite-code 1.0.1__tar.gz → 1.1.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 (291) hide show
  1. {graphite_code-1.0.1 → graphite_code-1.1.1}/CHANGELOG.md +235 -0
  2. {graphite_code-1.0.1 → graphite_code-1.1.1}/PKG-INFO +2 -2
  3. {graphite_code-1.0.1 → graphite_code-1.1.1}/README.md +1 -1
  4. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/__init__.py +1 -1
  5. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/channel.py +379 -39
  6. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/cli.py +25 -1
  7. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/daemon_health.py +4 -1
  8. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/doctor.py +6 -22
  9. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/doctor_probes.py +37 -3
  10. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/git.py +8 -29
  11. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/hookinstall.py +6 -1
  12. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/init.py +4 -1
  13. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/mcp_server.py +41 -13
  14. graphite_code-1.1.1/src/graphite/programs.py +190 -0
  15. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/routing/process_runner.py +6 -0
  16. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/routing/service.py +24 -12
  17. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/ts_bridge.py +16 -1
  18. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/windows_startup.py +6 -1
  19. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/windows_task.py +12 -4
  20. graphite_code-1.1.1/tests/test__win32_ctypes.py +38 -0
  21. graphite_code-1.1.1/tests/test_channel_attribution.py +254 -0
  22. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_channel_core.py +224 -0
  23. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_channel_lock.py +55 -1
  24. graphite_code-1.1.1/tests/test_channel_log_integrity.py +260 -0
  25. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_channel_mcp.py +26 -0
  26. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_channel_register.py +26 -0
  27. graphite_code-1.1.1/tests/test_cli_channel_attribution.py +84 -0
  28. graphite_code-1.1.1/tests/test_cluster.py +123 -0
  29. graphite_code-1.1.1/tests/test_context_builder.py +312 -0
  30. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_daemon_health.py +31 -0
  31. graphite_code-1.1.1/tests/test_dependency_install.py +242 -0
  32. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_doctor.py +72 -3
  33. graphite_code-1.1.1/tests/test_doctor_probes.py +390 -0
  34. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_hookinstall.py +32 -0
  35. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_init.py +32 -0
  36. graphite_code-1.1.1/tests/test_llm_probe.py +261 -0
  37. graphite_code-1.1.1/tests/test_mcp_server.py +205 -0
  38. graphite_code-1.1.1/tests/test_mcp_server_channel_attribution.py +191 -0
  39. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_mutation_tests.py +135 -2
  40. graphite_code-1.1.1/tests/test_ollama_executor.py +272 -0
  41. graphite_code-1.1.1/tests/test_probe_process.py +207 -0
  42. graphite_code-1.1.1/tests/test_process_contracts.py +74 -0
  43. graphite_code-1.1.1/tests/test_programs.py +403 -0
  44. graphite_code-1.1.1/tests/test_route_pool_execution.py +363 -0
  45. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_routing_process_runner.py +21 -0
  46. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_routing_service.py +111 -0
  47. graphite_code-1.1.1/tests/test_ts_bridge.py +299 -0
  48. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_typescript_activation.py +38 -0
  49. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_windows_startup.py +21 -0
  50. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_windows_task.py +42 -2
  51. {graphite_code-1.0.1 → graphite_code-1.1.1}/.gitignore +0 -0
  52. {graphite_code-1.0.1 → graphite_code-1.1.1}/ARCHITECTURE.md +0 -0
  53. {graphite_code-1.0.1 → graphite_code-1.1.1}/CONTRIBUTING.md +0 -0
  54. {graphite_code-1.0.1 → graphite_code-1.1.1}/LICENSE +0 -0
  55. {graphite_code-1.0.1 → graphite_code-1.1.1}/RELEASING.md +0 -0
  56. {graphite_code-1.0.1 → graphite_code-1.1.1}/pyproject.toml +0 -0
  57. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/__main__.py +0 -0
  58. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/_cleanup_worker.py +0 -0
  59. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/_win32_ctypes.py +0 -0
  60. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/activation.py +0 -0
  61. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/agent_hooks.py +0 -0
  62. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/agent_settings.py +0 -0
  63. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/analyze.py +0 -0
  64. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/answer_contract.py +0 -0
  65. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/bootstrap.py +0 -0
  66. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/buildlock.py +0 -0
  67. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/cache.py +0 -0
  68. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/cluster.py +0 -0
  69. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/config.py +0 -0
  70. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/context.py +0 -0
  71. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/daemon.py +0 -0
  72. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/daemon_launch.py +0 -0
  73. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/debt.py +0 -0
  74. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/dependency_install.py +0 -0
  75. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/detach.py +0 -0
  76. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/engine_identity.py +0 -0
  77. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/export/__init__.py +0 -0
  78. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/export/html.py +0 -0
  79. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/export/json.py +0 -0
  80. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/export/md.py +0 -0
  81. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/extract/__init__.py +0 -0
  82. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/extract/ast.py +0 -0
  83. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/freshness.py +0 -0
  84. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/graph.py +0 -0
  85. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/graph_io.py +0 -0
  86. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/health.py +0 -0
  87. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/hook_entry.py +0 -0
  88. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/hookshim.py +0 -0
  89. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/incident_ledger.py +0 -0
  90. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/ingest.py +0 -0
  91. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/io.py +0 -0
  92. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/launchd_agent.py +0 -0
  93. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/listing.py +0 -0
  94. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/llm.py +0 -0
  95. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/llm_probe.py +0 -0
  96. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/mcp.py +0 -0
  97. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/natural_query.py +0 -0
  98. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/overlays.py +0 -0
  99. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/probe_process.py +0 -0
  100. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/probe_workspace.py +0 -0
  101. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/process_contracts.py +0 -0
  102. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/provider_observer.py +0 -0
  103. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/py.typed +0 -0
  104. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/query.py +0 -0
  105. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/query_plan.py +0 -0
  106. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/replacement_audit.py +0 -0
  107. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/resolve.py +0 -0
  108. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/review.py +0 -0
  109. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/routing/__init__.py +0 -0
  110. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/routing/approval.py +0 -0
  111. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/routing/classifier.py +0 -0
  112. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/routing/claude_executor.py +0 -0
  113. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/routing/claude_probe.py +0 -0
  114. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/routing/cli_identity.py +0 -0
  115. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/routing/codex_executor.py +0 -0
  116. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/routing/codex_probe.py +0 -0
  117. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/routing/context_builder.py +0 -0
  118. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/routing/contracts.py +0 -0
  119. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/routing/diff_policy.py +0 -0
  120. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/routing/edit_apply.py +0 -0
  121. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/routing/effort.py +0 -0
  122. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/routing/lifecycle.py +0 -0
  123. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/routing/lifecycle_operator.py +0 -0
  124. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/routing/lifecycle_service.py +0 -0
  125. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/routing/lifecycle_storage.py +0 -0
  126. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/routing/ollama_executor.py +0 -0
  127. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/routing/ollama_probe.py +0 -0
  128. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/routing/openrouter_executor.py +0 -0
  129. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/routing/openrouter_probe.py +0 -0
  130. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/routing/policy.py +0 -0
  131. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/routing/probe_runner.py +0 -0
  132. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/routing/profiles.py +0 -0
  133. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/routing/prompt.py +0 -0
  134. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/routing/registry.py +0 -0
  135. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/routing/route_pool.py +0 -0
  136. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/routing/route_pool_execution.py +0 -0
  137. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/routing/schema_validation.py +0 -0
  138. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/routing/settings.py +0 -0
  139. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/routing/shadow.py +0 -0
  140. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/routing/storage.py +0 -0
  141. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/routing/telemetry.py +0 -0
  142. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/routing/worktree.py +0 -0
  143. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/routing/zai_edit.py +0 -0
  144. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/routing/zai_executor.py +0 -0
  145. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/routing/zai_probe.py +0 -0
  146. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/savings.py +0 -0
  147. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/systemd_unit.py +0 -0
  148. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/ts_resolver.mjs +0 -0
  149. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/typescript_activation.py +0 -0
  150. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/usage_ledger.py +0 -0
  151. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/validation.py +0 -0
  152. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/watch.py +0 -0
  153. {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/windows_job.py +0 -0
  154. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/conftest.py +0 -0
  155. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/data/sqloracle/blindspots.py.txt +0 -0
  156. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/data/sqloracle/round69.py.txt +0 -0
  157. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/fake_clis/fake_cli.py +0 -0
  158. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/fixtures/provider_lifecycle_schema_v1.sql +0 -0
  159. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/fixtures/routing_schema_v2_ca77600.sql +0 -0
  160. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/fixtures/routing_schema_v3_94eb333.sql +0 -0
  161. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/fixtures/routing_schema_v4_lifecycle_migration.sql +0 -0
  162. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_activation.py +0 -0
  163. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_activation_backstop.py +0 -0
  164. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_agent_hook_activation.py +0 -0
  165. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_agent_hooks.py +0 -0
  166. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_agent_settings.py +0 -0
  167. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_answer_contract.py +0 -0
  168. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_arrow_and_constructor_binding.py +0 -0
  169. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_atomic_write.py +0 -0
  170. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_bootstrap.py +0 -0
  171. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_build_detach.py +0 -0
  172. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_buildlock.py +0 -0
  173. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_cache_engine_identity.py +0 -0
  174. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_cache_entry_pruning.py +0 -0
  175. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_cache_file_set.py +0 -0
  176. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_cache_pruning.py +0 -0
  177. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_call_graph.py +0 -0
  178. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_channel_cli.py +0 -0
  179. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_channel_report.py +0 -0
  180. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_channel_status.py +0 -0
  181. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_class_field_arrow_binding.py +0 -0
  182. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_cli_channel.py +0 -0
  183. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_cli_reference.py +0 -0
  184. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_cli_version.py +0 -0
  185. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_compare_dist.py +0 -0
  186. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_configuration_reference.py +0 -0
  187. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_context.py +0 -0
  188. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_cwd_relative_config.py +0 -0
  189. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_cycle_search.py +0 -0
  190. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_daemon.py +0 -0
  191. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_daemon_activation.py +0 -0
  192. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_daemon_build_lock.py +0 -0
  193. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_daemon_child_lock.py +0 -0
  194. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_daemon_engine_staleness.py +0 -0
  195. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_daemon_health_activation.py +0 -0
  196. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_daemon_launch.py +0 -0
  197. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_daemon_service_cli.py +0 -0
  198. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_debt.py +0 -0
  199. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_destructured_binding.py +0 -0
  200. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_determinism.py +0 -0
  201. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_dispatch_evidence.py +0 -0
  202. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_doctor_agent_hooks.py +0 -0
  203. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_doctor_hooks.py +0 -0
  204. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_doctor_managed_docs.py +0 -0
  205. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_documentation.py +0 -0
  206. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_edit_apply.py +0 -0
  207. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_engine_identity.py +0 -0
  208. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_exit_codes_reference.py +0 -0
  209. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_external_calls.py +0 -0
  210. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_git_security.py +0 -0
  211. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_go_rust.py +0 -0
  212. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_graph_io.py +0 -0
  213. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_graph_provider_isolation.py +0 -0
  214. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_hardening.py +0 -0
  215. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_health.py +0 -0
  216. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_hook_entry.py +0 -0
  217. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_hook_template.py +0 -0
  218. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_hookshim.py +0 -0
  219. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_html_security.py +0 -0
  220. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_incident_ledger.py +0 -0
  221. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_init_activation_doctrine.py +0 -0
  222. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_init_hooks.py +0 -0
  223. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_init_validation_exit.py +0 -0
  224. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_launchd_agent.py +0 -0
  225. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_lifecycle_operator.py +0 -0
  226. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_listing.py +0 -0
  227. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_listing_surfaces.py +0 -0
  228. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_llm.py +0 -0
  229. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_mcp.py +0 -0
  230. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_method_dispatch_scope.py +0 -0
  231. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_monorepo.py +0 -0
  232. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_natural_query.py +0 -0
  233. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_node_identity.py +0 -0
  234. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_overlays.py +0 -0
  235. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_path_leak_fixture.py +0 -0
  236. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_probe_diagnostics.py +0 -0
  237. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_probe_workspace.py +0 -0
  238. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_provider_claude_probe.py +0 -0
  239. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_provider_codex_probe.py +0 -0
  240. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_provider_lifecycle.py +0 -0
  241. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_provider_lifecycle_service.py +0 -0
  242. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_provider_lifecycle_storage.py +0 -0
  243. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_provider_observer.py +0 -0
  244. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_provider_ollama_probe.py +0 -0
  245. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_provider_openrouter_probe.py +0 -0
  246. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_provider_probe_runner.py +0 -0
  247. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_public_surface.py +0 -0
  248. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_published_schemas.py +0 -0
  249. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_python_resolver.py +0 -0
  250. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_query_plan.py +0 -0
  251. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_reliability.py +0 -0
  252. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_replacement_audit.py +0 -0
  253. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_resolve.py +0 -0
  254. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_review.py +0 -0
  255. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_route_pool.py +0 -0
  256. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_routing_approval.py +0 -0
  257. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_routing_benchmark.py +0 -0
  258. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_routing_classifier.py +0 -0
  259. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_routing_claude_executor.py +0 -0
  260. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_routing_cli.py +0 -0
  261. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_routing_cli_contracts.py +0 -0
  262. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_routing_cli_recovery.py +0 -0
  263. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_routing_codex_executor.py +0 -0
  264. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_routing_context.py +0 -0
  265. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_routing_contracts.py +0 -0
  266. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_routing_diff_policy.py +0 -0
  267. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_routing_executor.py +0 -0
  268. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_routing_openrouter_executor.py +0 -0
  269. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_routing_policy.py +0 -0
  270. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_routing_profiles.py +0 -0
  271. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_routing_registry.py +0 -0
  272. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_routing_schema_validation.py +0 -0
  273. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_routing_security.py +0 -0
  274. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_routing_shadow.py +0 -0
  275. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_routing_storage.py +0 -0
  276. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_routing_telemetry.py +0 -0
  277. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_routing_worktree.py +0 -0
  278. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_routing_zai_executor.py +0 -0
  279. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_routing_zai_probe.py +0 -0
  280. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_savings.py +0 -0
  281. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_search.py +0 -0
  282. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_smoke.py +0 -0
  283. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_sqloracle.py +0 -0
  284. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_synthetic_repo.py +0 -0
  285. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_systemd_unit.py +0 -0
  286. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_typescript_resolver.py +0 -0
  287. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_usage_ledger.py +0 -0
  288. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_verify_artifact.py +0 -0
  289. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_verify_published_release.py +0 -0
  290. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_watch.py +0 -0
  291. {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_zai_edit.py +0 -0
@@ -13,6 +13,241 @@ machine-checkable identity; the version is for humans.
13
13
 
14
14
  [Keep a Changelog]: https://keepachangelog.com/en/1.1.0/
15
15
 
16
+ ## [Unreleased]
17
+
18
+ ## [1.1.1] — 2026-10-03
19
+
20
+ A patch release. Security fixes ship in the next patch release of the current
21
+ minor (`docs/compatibility.md`, `SECURITY.md`). The graph itself does not
22
+ change: on this repository, measured against the deployed 1.1.0 engine,
23
+ 7797 of 7797 node ids survive, 22154 of 22154 edge triples are
24
+ unchanged, every relation count is equal, and `analysis.cycles` is identical.
25
+ Only the engine fingerprint moves, because graphite's own bytes did.
26
+
27
+ ### Security
28
+
29
+ **graphite no longer launches a program by bare name, so a program sitting in
30
+ a repository root cannot run in place of the real one.** On Windows a bare
31
+ name is looked up in the launching process's current directory before PATH.
32
+ That covers a list-form `subprocess.run(["git", ...])`, cmd.exe and
33
+ `shutil.which`, unless `NoDefaultCurrentDirectoryInExePath` is set. Claude
34
+ Code sets that variable, but the daemon at login and a commit from a terminal
35
+ do not.
36
+
37
+ graphite's builds, hooks and channel broker run with a repository root as
38
+ their current directory. A `node.exe` committed to a TypeScript repo's root
39
+ ran on every build, and the build still exited 0. This was measured against
40
+ the released 1.1.0 wheel; channel round 304 reported it.
41
+
42
+ Every launch now goes through `graphite.programs.resolve_program`, which:
43
+
44
+ - reads only absolute PATH entries;
45
+ - skips a PATH directory inside the target repository, or one that IS the
46
+ current directory, judged both as written and as resolved, so a committed
47
+ symlink cannot choose which outside binary runs (aramid llm-review
48
+ `1d8d8cf`);
49
+ - refuses any candidate that resolves into one of those;
50
+ - on Windows, tries `.exe` as CreateProcess does, unless the caller asks for
51
+ more.
52
+
53
+ Windows' own tools come from the system directory the OS reports. The
54
+ sites changed are:
55
+
56
+ - the TypeScript bridge's `node` (every build);
57
+ - the channel broker's `git`;
58
+ - the channel's commit-msg hook, which fails closed when no git is found;
59
+ - the `git` calls in `init` and `hookinstall`;
60
+ - `daemon-health`'s `powershell.exe`;
61
+ - the four `schtasks.exe` calls;
62
+ - the Startup launcher's `powershell.exe`;
63
+ - routing's `claude`/`codex` lookup, which keeps `.cmd` shims, excludes the
64
+ repository and the task worktree whatever the current directory (aramid
65
+ llm-review `30e2473`), and sets the CLI's environment (see below);
66
+ - `doctor`'s `graphite-mcp` check;
67
+ - the mutation-test launcher's `git`.
68
+
69
+ Resolving the first program is not enough when that program is a `.cmd` shim.
70
+ An npm-installed CLI with no `node.exe` beside it runs bare `node` through
71
+ cmd.exe, which searches the task worktree first. A `node.exe` committed to the
72
+ repo would then run before the CLI's own sandbox. Routing now sets
73
+ `NoDefaultCurrentDirectoryInExePath=1` in every CLI's environment, which turns
74
+ that search off for the whole chain. The commit-msg hook also has its own status
75
+ when it cannot find git. It used to fall through to "this commit names no agent".
76
+
77
+ Two older private copies of the same PATH walk, in `git` and `doctor`, now
78
+ delegate to the shared resolver. A test walks every launch call in `src/`,
79
+ `scripts/` and the hook's embedded program, and fails on a program named by a
80
+ literal or on `shell=True`.
81
+
82
+ The current directory is refused itself, not its subtree, because that is
83
+ what Windows searches. Refusing everything beneath it would refuse every tool
84
+ on drive C for a run started from `C:\`, and `~/.local/bin` or an
85
+ nvm-installed `node` for a run started from `$HOME`. A pre-release build
86
+ measured exactly that. The repository's own subtree is refused through the
87
+ repository each caller passes.
88
+
89
+ Artifacts already installed keep the old command until they are regenerated:
90
+ - the Startup `.vbs` (`graphite daemon-install-startup-windows`);
91
+ - the channel's commit-msg hook (rewritten by `graphite channel register`).
92
+
93
+ ### Fixed
94
+
95
+ **`doctor --deep`'s LLM probe no longer spends the provider's timeout on
96
+ starting its worker.** One number was both the provider timeout and the worker
97
+ process's whole budget. The interpreter's start was therefore paid from the
98
+ provider's time, and a loaded machine reported `timeout` for a provider that
99
+ was only misconfigured: 2 s read `timeout` 7 times in 10 under 36 CPU burners.
100
+
101
+ The worker already enforces the provider timeout itself. Its process budget is
102
+ now that timeout plus `_LLM_WORKER_START_ALLOWANCE_SECONDS` (30 s), which only
103
+ bounds a worker that never answers. A 0.1 s provider timeout, below any
104
+ interpreter's start, now reaches `configuration`.
105
+
106
+ **The channel reports an abandoned lock on every path that can break one.**
107
+ These come from aramid llm-review findings:
108
+ - **`1810f9e`:** `inbox()`, the path every agent takes at session start, was
109
+ the one writer that dropped the recovery. `graphite_channel_inbox` now
110
+ carries `lock_recovered` when a delivery had to break a lock, and stays
111
+ silent otherwise.
112
+ - **`9751aab`:** a residue scan that failed read as `[]`, the same as a clean
113
+ one. It now reads `null`, meaning "we could not look". A wedged git, the
114
+ likeliest cause of an abandoned lock, is also what makes the scan fail.
115
+ - **`9a23b84`:** the recovery report no longer returns the dead holder's host
116
+ name. Nothing decides on it: identity is pid + start time, and staleness is
117
+ the clock.
118
+
119
+ **The channel's commit-msg hook is installed with exactly `0o755`, pinned on
120
+ every platform.** aramid's mutation drain found `0o755 -> 0o756`, a
121
+ world-writable audit hook on POSIX, surviving (`e37afd86`). On Windows,
122
+ `os.chmod` honours only the write bit, so no on-disk check there could see it.
123
+ A test now pins the argument, which kills the mutant on Windows too. A
124
+ POSIX-only test checks the on-disk property: executable, and not group- or
125
+ world-writable.
126
+
127
+ ## [1.1.0] — 2026-09-27
128
+
129
+ A minor release. The agent channel's read surfaces gain fields, which is an
130
+ addition under `docs/compatibility.md`. The channel's audit trail also
131
+ closes three holes: status events taken on trust, deletions nobody saw, and
132
+ an audit gate that could fail open. The graph itself does not change. On
133
+ this repository, measured against the deployed 1.0.1 engine, 7659 of
134
+ 7659 node ids survive, 21788 of 21788 edge triples are unchanged, every
135
+ relation count is equal, and `analysis.cycles` is identical. Only the
136
+ engine fingerprint moves, because graphite's own bytes did.
137
+
138
+ ### Added
139
+
140
+ **Every channel status now says who recorded it, and where each recipient
141
+ stands.** `graphite_channel_list`, `graphite_channel_read` and `graphite
142
+ channel list --json` carry `status_actor`, `status_at` and
143
+ `status_verification` beside `status`, plus `recipients` (each recipient's
144
+ own latest status and its verification, or `null`) and `unreceipted`
145
+ (recipients with no event of any kind). `status` keeps its
146
+ meaning: the newest event by any agent. `graphite_channel_read` also returns
147
+ `history`, where every event carries its actor, time, commit and
148
+ verification grade. `graphite channel show N` prints the same history after
149
+ the body. Measured on the live channel on 2026-09-25: the one folded word
150
+ misstated at least one recipient in 39 of the 212 rounds that carry events.
151
+ Round 256 read `acknowledged` while one of its two recipients had recorded
152
+ nothing. The read tool's description now says that reading records nothing,
153
+ and that `graphite_channel_inbox` registers receipt.
154
+
155
+ ### Fixed
156
+
157
+ **The channel report now verifies status events against their commits, as it
158
+ already did for rounds.** A status event's `actor` was taken on trust. An
159
+ event written by hand under another agent's trailer, rewritten after its
160
+ commit, or edited and left uncommitted was invisible, because the forged
161
+ actor was a participant and the file was tracked. Each event is now graded
162
+ from one `git log` over `status/`. It is `verified` only when it has exactly
163
+ one commit, a clean working copy, and a trailer naming its actor.
164
+ `status_modified`, `status_discrepancy` and `status_uncommitted` are
165
+ anomalies and fail `ok`. On the live channel all 408 events verified, with
166
+ a planted-forgery control flagged. A comment had claimed this check existed.
167
+ The read surfaces carry the same grade, so an actor is never shown bare:
168
+ `status_verification` sits beside `status_actor`, each recipient's entry has
169
+ its own `verification`, and the human report marks a failing attribution
170
+ `UNVERIFIED`. This closes aramid llm-review finding `53368ee`.
171
+ One trust limit remains, and it is stated here because it bounds what
172
+ "verified" means. Every agent commits under the operator's git identity, so
173
+ a trailer proves which agent label was attached, not which process
174
+ committed. A hand-made commit under the claimed actor's own trailer still
175
+ grades `verified`. Closing that needs signed commits.
176
+
177
+ **The channel report now sees deletions, and a status event's number is
178
+ never reused.** The report graded only the events and rounds still on disk,
179
+ and a new event took `len(files) + 1`. An agent could therefore delete its
180
+ own `blocked` event, commit the deletion, write a `done` into the same slot,
181
+ and the report still read OK. A round file removed the same way vanished
182
+ from the audit view entirely. The next number is now one past the highest
183
+ the round has ever used, on disk or in history, and a history git cannot
184
+ read refuses the write instead of passing for an empty one. Any status file
185
+ or round that history or the index knows but the working tree lacks is
186
+ reported as `status_deleted` or `round_deleted`, and a hole in a round's
187
+ 1..N sequence is reported as `status_seq_gap`. All three fail `ok`. The live channel's history
188
+ holds no deletions or renames, so none fire there. This closes aramid
189
+ llm-review finding `5db5889`.
190
+
191
+ **Installing the channel's audit gate now fails closed.**
192
+ `ensure_channel_hook` set `core.hooksPath` with `check=False` and always
193
+ reported `changed: True`. A gate git never armed (a locked `.git/config`, or a
194
+ higher-precedence override) was therefore reported as in place, and later
195
+ commits would have passed with no agent trailer. The write now raises on
196
+ failure. The value git will actually use is read back, and anything other
197
+ than `.githooks` raises `hook_not_armed`. `changed` reports the observed
198
+ before-and-after state. This closes aramid llm-review finding `0e87805`.
199
+
200
+ **Stalling is judged per recipient.** A co-recipient's `done` no longer
201
+ hides a recipient that was handed the round and never followed up. A
202
+ withdrawn or superseded round never stalls. Rows gain `stalled_recipients`.
203
+ The report lists recipients with no receipt per agent under `unreceipted`.
204
+ They are visible but do not fail `ok`, because several registered agents
205
+ have never called inbox, and a check that is always red is one nobody
206
+ reads.
207
+
208
+ **Reading the channel no longer rewrites its git index.** The report's
209
+ `git status` refreshed stale stat data by rewriting `.git/index` under
210
+ `index.lock`, the lock a concurrent broker `git add` needs. Channel git now
211
+ runs with `GIT_OPTIONAL_LOCKS=0`. A test pins the index bytes across a
212
+ report and a read with stale stat data.
213
+
214
+ **A PEP 508 marker of the shape `(A) or (B)` was mis-parsed by the doctor's
215
+ MCP distribution walk.** The marker evaluator unwrapped outer parentheses by
216
+ checking only that the text started with `(` and ended with `)`, so
217
+ `(extra == "a") or (python_version == "3.14")` was stripped to
218
+ `extra == "a") or (python_version == "3.14"`. An `extra` marker of that shape
219
+ then failed closed to "does not apply"; a plain marker of that shape raised
220
+ and aborted the whole distribution walk, which is `probe_mcp`'s manifest
221
+ source. Outer parentheses are now unwrapped only when the first `(` is closed
222
+ by the last character, counting depth outside quoted values. Found by the
223
+ new `tests/test_doctor_probes.py`; no installed distribution on the reference
224
+ machine carried the shape, which is why the walk had never failed.
225
+
226
+ ### Changed
227
+
228
+ **`scripts/mutation_tests.py` targets `scripts/` changes too.** The
229
+ certifying launcher for aramid's mutation gate diffed `src/` only, so a
230
+ mutant in the launcher itself skipped the targeted stage and its confirm ran
231
+ the whole suite (465 s on the gate's first live drain, 2026-09-04, where the
232
+ targeted stage kills in seconds). A changed `scripts/<stem>.py` now targets
233
+ `tests/test_<stem>.py` and `tests/test_<stem>_*.py` like a changed source
234
+ module.
235
+
236
+ **Twelve modules gained a `tests/test_<stem>.py`.** aramid's mutation stage 1
237
+ runs `tests/test_<module>.py` when it exists and otherwise `pytest -k
238
+ <module>`; a run that selects nothing is booked a stage-1 survivor and every
239
+ such mutant goes to a full-suite confirm, of which an item gets three. Nine
240
+ modules had a `-k` fallback that collected zero tests (`doctor_probes`,
241
+ `dependency_install`, `probe_process`, `ts_bridge`, `_win32_ctypes`,
242
+ `process_contracts`, `routing/ollama_executor`, `routing/context_builder`,
243
+ `routing/route_pool_execution`) and three collected one (`mcp_server`,
244
+ `llm_probe`, `cluster`). Each now has a stage-1 file that pins its pure
245
+ helpers directly; every file was proven able to fail by a hand mutant of its
246
+ module. Three quirks were pinned as-is rather than changed: a cluster's
247
+ kind label is `f"{kind}s"` verbatim (`classs`), a blank path in a TypeScript
248
+ bridge edge normalises to `.` instead of being dropped, and an empty MCP
249
+ `node_id` fuzzy-matches the first node.
250
+
16
251
  ## [1.0.1] — 2026-09-05
17
252
 
18
253
  A patch release. Measured against the deployed 1.0.0 engine on this repository,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: graphite-code
3
- Version: 1.0.1
3
+ Version: 1.1.1
4
4
  Summary: Local-first, zero-LLM knowledge graph extraction for codebases.
5
5
  Project-URL: Homepage, https://github.com/jared0565/graphite
6
6
  Project-URL: Repository, https://github.com/jared0565/graphite
@@ -48,7 +48,7 @@ Description-Content-Type: text/markdown
48
48
 
49
49
  Local-first, deterministic knowledge graph extraction for codebases — zero-LLM, daemon-maintained, agent-agnostic.
50
50
 
51
- **Status: 1.0.1, production/stable.** Published on PyPI as
51
+ **Status: 1.1.1, production/stable.** Published on PyPI as
52
52
  [`graphite-code`](https://pypi.org/project/graphite-code/) with PEP 740
53
53
  attestations; supported on Windows, Linux and macOS with Python 3.11–3.14
54
54
  (every cell gates CI). What 1.x promises — CLI, JSON outputs, `graph.json`,
@@ -2,7 +2,7 @@
2
2
 
3
3
  Local-first, deterministic knowledge graph extraction for codebases — zero-LLM, daemon-maintained, agent-agnostic.
4
4
 
5
- **Status: 1.0.1, production/stable.** Published on PyPI as
5
+ **Status: 1.1.1, production/stable.** Published on PyPI as
6
6
  [`graphite-code`](https://pypi.org/project/graphite-code/) with PEP 740
7
7
  attestations; supported on Windows, Linux and macOS with Python 3.11–3.14
8
8
  (every cell gates CI). What 1.x promises — CLI, JSON outputs, `graph.json`,
@@ -38,4 +38,4 @@ __all__ = ["__version__"]
38
38
  #: Coarse and hand-maintained by construction. It is a release label, not
39
39
  #: evidence that a given fix is present -- to answer that, survey for the marker
40
40
  #: the fix introduced, or compare `graphite --version` fingerprints.
41
- __version__ = "1.0.1"
41
+ __version__ = "1.1.1"