graphite-code 0.5.3__tar.gz → 1.0.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (273) hide show
  1. {graphite_code-0.5.3 → graphite_code-1.0.0}/CHANGELOG.md +86 -1
  2. {graphite_code-0.5.3 → graphite_code-1.0.0}/CONTRIBUTING.md +9 -0
  3. {graphite_code-0.5.3 → graphite_code-1.0.0}/PKG-INFO +31 -2
  4. {graphite_code-0.5.3 → graphite_code-1.0.0}/README.md +726 -701
  5. {graphite_code-0.5.3 → graphite_code-1.0.0}/RELEASING.md +439 -379
  6. {graphite_code-0.5.3 → graphite_code-1.0.0}/pyproject.toml +232 -218
  7. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/__init__.py +41 -41
  8. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/_cleanup_worker.py +31 -14
  9. graphite_code-1.0.0/src/graphite/_win32_ctypes.py +36 -0
  10. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/agent_settings.py +226 -226
  11. graphite_code-1.0.0/src/graphite/analyze.py +234 -0
  12. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/answer_contract.py +2 -2
  13. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/cli.py +244 -10
  14. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/config.py +209 -209
  15. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/daemon.py +9 -2
  16. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/daemon_health.py +39 -9
  17. graphite_code-1.0.0/src/graphite/daemon_launch.py +75 -0
  18. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/dependency_install.py +15 -12
  19. graphite_code-1.0.0/src/graphite/detach.py +37 -0
  20. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/doctor.py +687 -678
  21. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/doctor_probes.py +2147 -2134
  22. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/export/json.py +1 -1
  23. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/extract/ast.py +4 -2
  24. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/git.py +6 -1
  25. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/hook_entry.py +68 -68
  26. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/hookshim.py +86 -86
  27. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/init.py +2 -2
  28. graphite_code-1.0.0/src/graphite/launchd_agent.py +139 -0
  29. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/mcp_server.py +463 -450
  30. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/probe_process.py +938 -879
  31. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/probe_workspace.py +31 -26
  32. graphite_code-1.0.0/src/graphite/py.typed +0 -0
  33. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/query.py +1 -1
  34. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/resolve.py +663 -660
  35. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/routing/approval.py +362 -362
  36. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/routing/claude_executor.py +7 -2
  37. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/routing/contracts.py +2 -0
  38. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/routing/edit_apply.py +5 -2
  39. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/routing/lifecycle.py +2 -0
  40. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/routing/lifecycle_service.py +6 -2
  41. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/routing/lifecycle_storage.py +992 -991
  42. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/routing/openrouter_probe.py +5 -1
  43. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/routing/policy.py +3 -3
  44. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/routing/probe_runner.py +572 -543
  45. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/routing/process_runner.py +17 -1
  46. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/routing/profiles.py +1 -1
  47. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/routing/route_pool.py +8 -5
  48. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/routing/schema_validation.py +2 -1
  49. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/routing/service.py +28 -12
  50. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/routing/storage.py +4025 -4019
  51. graphite_code-1.0.0/src/graphite/systemd_unit.py +129 -0
  52. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/ts_bridge.py +5 -2
  53. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/ts_resolver.mjs +4 -4
  54. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/typescript_activation.py +18 -6
  55. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/validation.py +1 -1
  56. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/windows_job.py +27 -9
  57. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/windows_task.py +27 -37
  58. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_agent_settings.py +276 -276
  59. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_answer_contract.py +487 -487
  60. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_arrow_and_constructor_binding.py +172 -172
  61. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_bootstrap.py +304 -304
  62. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_cache_file_set.py +110 -110
  63. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_class_field_arrow_binding.py +130 -130
  64. graphite_code-1.0.0/tests/test_cli_reference.py +66 -0
  65. graphite_code-1.0.0/tests/test_compare_dist.py +75 -0
  66. graphite_code-1.0.0/tests/test_configuration_reference.py +100 -0
  67. graphite_code-1.0.0/tests/test_cycle_search.py +128 -0
  68. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_daemon_health.py +1040 -1040
  69. graphite_code-1.0.0/tests/test_daemon_launch.py +42 -0
  70. graphite_code-1.0.0/tests/test_daemon_service_cli.py +102 -0
  71. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_destructured_binding.py +183 -183
  72. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_dispatch_evidence.py +277 -277
  73. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_documentation.py +44 -0
  74. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_engine_identity.py +262 -262
  75. graphite_code-1.0.0/tests/test_exit_codes_reference.py +36 -0
  76. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_external_calls.py +548 -548
  77. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_init.py +446 -446
  78. graphite_code-1.0.0/tests/test_launchd_agent.py +122 -0
  79. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_lifecycle_operator.py +253 -253
  80. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_mcp.py +3 -3
  81. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_method_dispatch_scope.py +294 -294
  82. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_monorepo.py +199 -199
  83. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_probe_workspace.py +443 -443
  84. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_provider_lifecycle_storage.py +576 -542
  85. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_reliability.py +153 -153
  86. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_routing_cli_recovery.py +283 -283
  87. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_routing_contracts.py +246 -246
  88. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_routing_profiles.py +685 -685
  89. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_routing_service.py +469 -469
  90. graphite_code-1.0.0/tests/test_synthetic_repo.py +60 -0
  91. graphite_code-1.0.0/tests/test_systemd_unit.py +156 -0
  92. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_typescript_resolver.py +274 -274
  93. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_verify_artifact.py +13 -0
  94. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_verify_published_release.py +55 -3
  95. graphite_code-0.5.3/src/graphite/analyze.py +0 -146
  96. graphite_code-0.5.3/src/graphite/detach.py +0 -33
  97. {graphite_code-0.5.3 → graphite_code-1.0.0}/.gitignore +0 -0
  98. {graphite_code-0.5.3 → graphite_code-1.0.0}/ARCHITECTURE.md +0 -0
  99. {graphite_code-0.5.3 → graphite_code-1.0.0}/LICENSE +0 -0
  100. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/__main__.py +0 -0
  101. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/activation.py +0 -0
  102. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/agent_hooks.py +0 -0
  103. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/bootstrap.py +0 -0
  104. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/buildlock.py +0 -0
  105. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/cache.py +0 -0
  106. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/channel.py +0 -0
  107. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/cluster.py +0 -0
  108. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/context.py +0 -0
  109. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/debt.py +0 -0
  110. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/engine_identity.py +0 -0
  111. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/export/__init__.py +0 -0
  112. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/export/html.py +0 -0
  113. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/export/md.py +0 -0
  114. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/extract/__init__.py +0 -0
  115. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/freshness.py +0 -0
  116. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/graph.py +0 -0
  117. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/graph_io.py +0 -0
  118. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/health.py +0 -0
  119. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/hookinstall.py +0 -0
  120. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/incident_ledger.py +0 -0
  121. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/ingest.py +0 -0
  122. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/io.py +0 -0
  123. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/listing.py +0 -0
  124. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/llm.py +0 -0
  125. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/llm_probe.py +0 -0
  126. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/mcp.py +0 -0
  127. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/natural_query.py +0 -0
  128. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/overlays.py +0 -0
  129. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/process_contracts.py +0 -0
  130. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/provider_observer.py +0 -0
  131. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/query_plan.py +0 -0
  132. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/replacement_audit.py +0 -0
  133. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/review.py +0 -0
  134. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/routing/__init__.py +0 -0
  135. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/routing/classifier.py +0 -0
  136. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/routing/claude_probe.py +0 -0
  137. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/routing/cli_identity.py +0 -0
  138. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/routing/codex_executor.py +0 -0
  139. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/routing/codex_probe.py +0 -0
  140. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/routing/context_builder.py +0 -0
  141. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/routing/diff_policy.py +0 -0
  142. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/routing/effort.py +0 -0
  143. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/routing/lifecycle_operator.py +0 -0
  144. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/routing/ollama_executor.py +0 -0
  145. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/routing/ollama_probe.py +0 -0
  146. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/routing/openrouter_executor.py +0 -0
  147. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/routing/prompt.py +0 -0
  148. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/routing/registry.py +0 -0
  149. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/routing/route_pool_execution.py +0 -0
  150. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/routing/settings.py +0 -0
  151. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/routing/shadow.py +0 -0
  152. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/routing/telemetry.py +0 -0
  153. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/routing/worktree.py +0 -0
  154. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/routing/zai_edit.py +0 -0
  155. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/routing/zai_executor.py +0 -0
  156. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/routing/zai_probe.py +0 -0
  157. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/savings.py +0 -0
  158. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/usage_ledger.py +0 -0
  159. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/watch.py +0 -0
  160. {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/windows_startup.py +0 -0
  161. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/conftest.py +0 -0
  162. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/data/sqloracle/blindspots.py.txt +0 -0
  163. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/data/sqloracle/round69.py.txt +0 -0
  164. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/fake_clis/fake_cli.py +0 -0
  165. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/fixtures/provider_lifecycle_schema_v1.sql +0 -0
  166. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/fixtures/routing_schema_v2_ca77600.sql +0 -0
  167. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/fixtures/routing_schema_v3_94eb333.sql +0 -0
  168. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/fixtures/routing_schema_v4_lifecycle_migration.sql +0 -0
  169. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_activation.py +0 -0
  170. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_activation_backstop.py +0 -0
  171. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_agent_hook_activation.py +0 -0
  172. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_agent_hooks.py +0 -0
  173. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_atomic_write.py +0 -0
  174. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_build_detach.py +0 -0
  175. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_buildlock.py +0 -0
  176. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_cache_engine_identity.py +0 -0
  177. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_cache_pruning.py +0 -0
  178. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_call_graph.py +0 -0
  179. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_channel_cli.py +0 -0
  180. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_channel_core.py +0 -0
  181. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_channel_lock.py +0 -0
  182. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_channel_mcp.py +0 -0
  183. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_channel_register.py +0 -0
  184. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_channel_report.py +0 -0
  185. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_channel_status.py +0 -0
  186. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_cli_channel.py +0 -0
  187. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_cli_version.py +0 -0
  188. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_context.py +0 -0
  189. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_cwd_relative_config.py +0 -0
  190. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_daemon.py +0 -0
  191. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_daemon_activation.py +0 -0
  192. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_daemon_build_lock.py +0 -0
  193. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_daemon_child_lock.py +0 -0
  194. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_daemon_engine_staleness.py +0 -0
  195. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_daemon_health_activation.py +0 -0
  196. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_debt.py +0 -0
  197. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_determinism.py +0 -0
  198. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_doctor.py +0 -0
  199. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_doctor_agent_hooks.py +0 -0
  200. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_doctor_hooks.py +0 -0
  201. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_doctor_managed_docs.py +0 -0
  202. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_edit_apply.py +0 -0
  203. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_git_security.py +0 -0
  204. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_go_rust.py +0 -0
  205. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_graph_io.py +0 -0
  206. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_graph_provider_isolation.py +0 -0
  207. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_hardening.py +0 -0
  208. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_health.py +0 -0
  209. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_hook_entry.py +0 -0
  210. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_hook_template.py +0 -0
  211. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_hookinstall.py +0 -0
  212. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_hookshim.py +0 -0
  213. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_html_security.py +0 -0
  214. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_incident_ledger.py +0 -0
  215. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_init_activation_doctrine.py +0 -0
  216. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_init_hooks.py +0 -0
  217. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_init_validation_exit.py +0 -0
  218. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_listing.py +0 -0
  219. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_listing_surfaces.py +0 -0
  220. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_llm.py +0 -0
  221. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_natural_query.py +0 -0
  222. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_node_identity.py +0 -0
  223. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_overlays.py +0 -0
  224. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_path_leak_fixture.py +0 -0
  225. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_probe_diagnostics.py +0 -0
  226. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_provider_claude_probe.py +0 -0
  227. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_provider_codex_probe.py +0 -0
  228. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_provider_lifecycle.py +0 -0
  229. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_provider_lifecycle_service.py +0 -0
  230. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_provider_observer.py +0 -0
  231. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_provider_ollama_probe.py +0 -0
  232. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_provider_openrouter_probe.py +0 -0
  233. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_provider_probe_runner.py +0 -0
  234. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_public_surface.py +0 -0
  235. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_published_schemas.py +0 -0
  236. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_python_resolver.py +0 -0
  237. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_query_plan.py +0 -0
  238. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_replacement_audit.py +0 -0
  239. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_resolve.py +0 -0
  240. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_review.py +0 -0
  241. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_route_pool.py +0 -0
  242. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_routing_approval.py +0 -0
  243. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_routing_benchmark.py +0 -0
  244. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_routing_classifier.py +0 -0
  245. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_routing_claude_executor.py +0 -0
  246. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_routing_cli.py +0 -0
  247. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_routing_cli_contracts.py +0 -0
  248. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_routing_codex_executor.py +0 -0
  249. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_routing_context.py +0 -0
  250. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_routing_diff_policy.py +0 -0
  251. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_routing_executor.py +0 -0
  252. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_routing_openrouter_executor.py +0 -0
  253. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_routing_policy.py +0 -0
  254. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_routing_process_runner.py +0 -0
  255. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_routing_registry.py +0 -0
  256. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_routing_schema_validation.py +0 -0
  257. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_routing_security.py +0 -0
  258. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_routing_shadow.py +0 -0
  259. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_routing_storage.py +0 -0
  260. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_routing_telemetry.py +0 -0
  261. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_routing_worktree.py +0 -0
  262. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_routing_zai_executor.py +0 -0
  263. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_routing_zai_probe.py +0 -0
  264. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_savings.py +0 -0
  265. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_search.py +0 -0
  266. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_smoke.py +0 -0
  267. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_sqloracle.py +0 -0
  268. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_typescript_activation.py +0 -0
  269. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_usage_ledger.py +0 -0
  270. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_watch.py +0 -0
  271. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_windows_startup.py +0 -0
  272. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_windows_task.py +0 -0
  273. {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_zai_edit.py +0 -0
@@ -1,7 +1,8 @@
1
1
  # Changelog
2
2
 
3
3
  Notable changes to graphite. Format follows [Keep a Changelog]; versioning is
4
- semver, pre-1.0 (minor versions may break things).
4
+ semantic. From 1.0.0 the surfaces listed in `docs/compatibility.md` are
5
+ stable: a breaking change to any of them is a major release.
5
6
 
6
7
  **A version number here is a coarse release label, not a fix marker.** Several
7
8
  behavioural fixes have shipped with no version change at all — the `-P`
@@ -12,6 +13,90 @@ machine-checkable identity; the version is for humans.
12
13
 
13
14
  [Keep a Changelog]: https://keepachangelog.com/en/1.1.0/
14
15
 
16
+ ## [1.0.0] — 2026-08-29
17
+
18
+ The production-grade release. Nothing here is a claim CI cannot turn red:
19
+ each item names the gate or test that enforces it. The declaration criteria
20
+ and their evidence are in `docs/superpowers/specs/2026-08-29-production-grade-design.md`.
21
+
22
+ ### Fixed
23
+
24
+ **The cycle report could not finish on a repository with dense import
25
+ cycles** (#64). `analyze()` enumerated every simple cycle of the project
26
+ graph before sorting and keeping twenty; on Django 5.2 (2 930 source files,
27
+ `tests/` and `django/` importing each other) that is exponential — 13 GB and
28
+ unfinished after thirty minutes, while each half alone reported cycles in
29
+ seconds. The search is now bounded: cycles are enumerated inside strongly
30
+ connected components one length level at a time up to length 8, under a
31
+ 10 000-cycle budget, and stop once a completed level holds the twenty
32
+ shortest — exact whenever it stops that way, and deterministic across
33
+ processes even when the budget bites. `analysis.cycle_search` records
34
+ `length_bound`, `budget`, `examined`, `budget_exhausted`,
35
+ `complete_through_length`, `cyclic_components` and `largest_component`, so a
36
+ truncated answer says so. Django 5.2 now builds in 82 s (45 620 nodes,
37
+ 109 373 edges, 53 MB). Found by the real-repository benchmark; the synthetic
38
+ corpus alone would never have shown it.
39
+
40
+ **A lifecycle event claiming "no prior observation" over an UNAVAILABLE row
41
+ raised `AttributeError`** instead of `lifecycle_transition_stale`
42
+ (`routing/lifecycle_storage.py`); found while making the type gate clean.
43
+
44
+ ### Added
45
+
46
+ - **Every supported cell gates merges.** The CI matrix is windows/ubuntu/macos
47
+ × CPython 3.11–3.14, all twelve cells blocking; the advisory `portability`
48
+ job is gone. Ubuntu and macOS 3.13 ran for the first time and pass.
49
+ - **A type gate.** `python -m mypy` over `src/graphite` runs in the lint
50
+ job; 142 findings were fixed with zero `type: ignore` comments added, and
51
+ the gate is clean under `--platform` win32, linux and darwin.
52
+ `graphite/py.typed` ships (the artifact verifier refuses a wheel without
53
+ it) and the distribution carries `Typing :: Typed`.
54
+ - **A coverage floor.** Branch coverage is collected on the 3.12 leg of each
55
+ OS, combined (83.04 % on the first measurement), and enforced at
56
+ `COVERAGE_FLOOR = 83`; a `workflow_dispatch` input overrides the floor for
57
+ one run as the negative control (floor 84 turns the job red).
58
+ - **The security gates run in CI, unmodified.** A `security` job creates the
59
+ dev venv `aramid.toml` names and runs `aramid check --gate pre-commit|pre-push
60
+ --all --strict` against the committed configuration, asserting the tools
61
+ that ran (gitleaks, ruff, shadow; gitleaks, mypy, the suite, semgrep,
62
+ shadow) and refusing any degraded tool. A planted repo-root `graphite.py`
63
+ fails it at the pre-commit gate — and, under `python -m pytest`, every test
64
+ leg with it, which is the hazard the `-P` launch shape exists for.
65
+ - `SECURITY.md` (GitHub private vulnerability reporting), `CODEOWNERS`, issue
66
+ templates, dependabot for actions and pip, `authors` metadata.
67
+ - `daemon-install-linux` (systemd user unit), `daemon-install-macos`
68
+ (launchd agent), `daemon-uninstall-*` and `daemon-service-status`; all
69
+ three supervisors build their launch argv from one place, so `-P` is
70
+ present by construction. `daemon-health` reports the platform's supervisor.
71
+ - `benchmarks/`: a deterministic synthetic corpus and a build benchmark; a CI
72
+ `benchmark` job records a 3 000-file build as an artifact and fails only
73
+ past a catastrophic budget. `capabilities` declares
74
+ `supported_repo_files: 7000` with its basis; `docs/benchmarks.md` holds the
75
+ measurements, including Django 5.2.
76
+ - Reference documentation that cannot drift: `docs/reference/cli.md`
77
+ (generated from the parser; a test fails when stale),
78
+ `docs/reference/configuration.md` (every `Config` field and every
79
+ `GRAPHITE_*` variable the code reads, both directions tested),
80
+ `docs/reference/exit-codes.md` (every subcommand has a row),
81
+ `docs/compatibility.md` (what 1.x promises, the deprecation policy, the
82
+ support matrix).
83
+ - Releases are built in CI from the approved tag with pinned tools
84
+ (`release-build-constraints.txt`), refused unless both digests equal the
85
+ reviewed ones, attached to the GitHub Release, and published with PEP 740
86
+ attestations that are true because this workflow built the bytes.
87
+
88
+ ### Changed
89
+
90
+ - `Development Status :: 5 - Production/Stable`. From 1.0.0 the surfaces in
91
+ `docs/compatibility.md` are stable; a breaking change to any of them is a
92
+ major release.
93
+ - The CI security job pins aramid 0.6.0 (the version the maintainer's
94
+ machine runs). mypy's configuration lives in `setup.cfg` for now: aramid
95
+ 0.6.0's typecheck runner arms on `[tool.mypy]` and hands non-Python files
96
+ to mypy (accepted in channel round 140, fixed in aramid 0.6.1); both
97
+ files say when to move it back. Two reasoned entries in
98
+ `.aramid-suppressions.toml` from the same defect retire themselves.
99
+
15
100
  ## [0.5.3] — 2026-08-28
16
101
 
17
102
  ### Fixed
@@ -101,6 +101,15 @@ Doctor changes require focused tests for stable doctor JSON, deterministic order
101
101
 
102
102
  No live provider calls in automated tests are permitted. Exercise network and subprocess behavior through a fake worker, fake provider, and fake process boundary with controlled time, output, failures, and descendants. Tests must remain offline, deterministic, and safe to run without credentials.
103
103
 
104
+ ### Coverage floor
105
+
106
+ CI collects branch coverage on the 3.12 leg of every OS, combines the three
107
+ data files in the `coverage` job, and fails under `COVERAGE_FLOOR` in
108
+ `.github/workflows/ci.yml`. The floor is the integer part of the measured
109
+ total: raise it when a release measures higher, and never lower it without a
110
+ CHANGELOG entry saying what was removed and why. No single leg's figure is
111
+ the measurement -- platform-only code is covered on one OS each.
112
+
104
113
  ## Security expectations
105
114
 
106
115
  Treat repository files, file names, symlinks, Git metadata, generated graph data, and model output as untrusted input. Pass subprocess arguments as an argument vector and never interpolate untrusted values into a shell command. Preserve path containment, bounded I/O, explicit timeouts, atomic writes, output encoding, and safe error redaction at every relevant boundary.
@@ -1,24 +1,27 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: graphite-code
3
- Version: 0.5.3
3
+ Version: 1.0.0
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
7
7
  Project-URL: Changelog, https://github.com/jared0565/graphite/blob/main/CHANGELOG.md
8
8
  Project-URL: Issues, https://github.com/jared0565/graphite/issues
9
+ Author-email: jared0565 <jared0565@gmail.com>
9
10
  License-Expression: MIT
10
11
  License-File: LICENSE
11
- Classifier: Development Status :: 4 - Beta
12
+ Classifier: Development Status :: 5 - Production/Stable
12
13
  Classifier: Environment :: Console
13
14
  Classifier: Intended Audience :: Developers
14
15
  Classifier: Operating System :: MacOS :: MacOS X
15
16
  Classifier: Operating System :: Microsoft :: Windows
16
17
  Classifier: Operating System :: POSIX :: Linux
18
+ Classifier: Programming Language :: Python :: 3 :: Only
17
19
  Classifier: Programming Language :: Python :: 3.11
18
20
  Classifier: Programming Language :: Python :: 3.12
19
21
  Classifier: Programming Language :: Python :: 3.13
20
22
  Classifier: Programming Language :: Python :: 3.14
21
23
  Classifier: Topic :: Software Development :: Quality Assurance
24
+ Classifier: Typing :: Typed
22
25
  Requires-Python: >=3.11
23
26
  Requires-Dist: networkx>=3.3
24
27
  Requires-Dist: pydantic>=2.0
@@ -31,6 +34,7 @@ Requires-Dist: tree-sitter-rust>=0.23
31
34
  Requires-Dist: tree-sitter-typescript>=0.23
32
35
  Requires-Dist: tree-sitter>=0.23
33
36
  Provides-Extra: dev
37
+ Requires-Dist: mypy>=1.14; extra == 'dev'
34
38
  Requires-Dist: pytest-cov>=5.0; extra == 'dev'
35
39
  Requires-Dist: pytest-timeout>=2.3; extra == 'dev'
36
40
  Requires-Dist: pytest>=8.0; extra == 'dev'
@@ -175,6 +179,13 @@ After upgrading graphite itself, restart the daemon: a long-running daemon keeps
175
179
 
176
180
  ## Usage
177
181
 
182
+ Reference pages, each kept in lockstep with the code by a test:
183
+ [CLI](docs/reference/cli.md) (generated from the parser),
184
+ [configuration](docs/reference/configuration.md) (every `GRAPHITE_*` variable),
185
+ [exit codes](docs/reference/exit-codes.md),
186
+ [compatibility and support](docs/compatibility.md) (what 1.x promises), and
187
+ [benchmarks](docs/benchmarks.md) (what `supported_repo_files` rests on).
188
+
178
189
  ```bash
179
190
  # Scan a repo (zero tokens)
180
191
  graphite scan .
@@ -508,6 +519,24 @@ graphite daemon-uninstall-startup-windows C:\Projects
508
519
 
509
520
  The fallback writes a hidden VBS launcher in the current user's Startup folder and an idempotent PowerShell launcher in `C:\Projects\.graphite-daemon`.
510
521
 
522
+ Linux and macOS supervision, same daemon, same bounded defaults:
523
+
524
+ ```bash
525
+ # Linux: a systemd USER unit (~/.config/systemd/user/graphite-daemon.service),
526
+ # reloaded, enabled and started; no privilege needed
527
+ graphite daemon-install-linux ~/Projects
528
+ graphite daemon-service-status
529
+ graphite daemon-uninstall-linux
530
+
531
+ # macOS: a launchd agent (~/Library/LaunchAgents/com.graphite.daemon.plist),
532
+ # bootstrapped into the user's GUI domain; logs under ~/Library/Logs/graphite
533
+ graphite daemon-install-macos ~/Projects
534
+ graphite daemon-service-status
535
+ graphite daemon-uninstall-macos
536
+ ```
537
+
538
+ `daemon-service-status` answers for whichever supervisor the platform uses (on Windows it reports the scheduled task and the startup launcher), and `daemon-health` reports the same fact as `startup installed`. Every generated launcher runs the interpreter with `-P` -- the systemd unit and the plist are built from the same argument vector as the Windows task. A systemd user unit runs only while you have a login session unless you enable lingering (`loginctl enable-linger $USER`); that is a policy choice graphite does not make for you.
539
+
511
540
  ## Canonical graph and enrichment isolation
512
541
 
513
542
  `scan`, `build`, `report`, `check`, `validate`, `query`, `context`, `impact`, `watch`, and `daemon` are canonical operations. They force an internal no-inference configuration, ignore ambient `GRAPHITE_LLM*` values, exclude provider data from graph artifacts, and reject legacy non-`none` `--llm` or provider flags. `--llm none` remains a temporary compatibility no-op.