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.
- {graphite_code-0.5.3 → graphite_code-1.0.0}/CHANGELOG.md +86 -1
- {graphite_code-0.5.3 → graphite_code-1.0.0}/CONTRIBUTING.md +9 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/PKG-INFO +31 -2
- {graphite_code-0.5.3 → graphite_code-1.0.0}/README.md +726 -701
- {graphite_code-0.5.3 → graphite_code-1.0.0}/RELEASING.md +439 -379
- {graphite_code-0.5.3 → graphite_code-1.0.0}/pyproject.toml +232 -218
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/__init__.py +41 -41
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/_cleanup_worker.py +31 -14
- graphite_code-1.0.0/src/graphite/_win32_ctypes.py +36 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/agent_settings.py +226 -226
- graphite_code-1.0.0/src/graphite/analyze.py +234 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/answer_contract.py +2 -2
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/cli.py +244 -10
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/config.py +209 -209
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/daemon.py +9 -2
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/daemon_health.py +39 -9
- graphite_code-1.0.0/src/graphite/daemon_launch.py +75 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/dependency_install.py +15 -12
- graphite_code-1.0.0/src/graphite/detach.py +37 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/doctor.py +687 -678
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/doctor_probes.py +2147 -2134
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/export/json.py +1 -1
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/extract/ast.py +4 -2
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/git.py +6 -1
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/hook_entry.py +68 -68
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/hookshim.py +86 -86
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/init.py +2 -2
- graphite_code-1.0.0/src/graphite/launchd_agent.py +139 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/mcp_server.py +463 -450
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/probe_process.py +938 -879
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/probe_workspace.py +31 -26
- graphite_code-1.0.0/src/graphite/py.typed +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/query.py +1 -1
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/resolve.py +663 -660
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/routing/approval.py +362 -362
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/routing/claude_executor.py +7 -2
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/routing/contracts.py +2 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/routing/edit_apply.py +5 -2
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/routing/lifecycle.py +2 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/routing/lifecycle_service.py +6 -2
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/routing/lifecycle_storage.py +992 -991
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/routing/openrouter_probe.py +5 -1
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/routing/policy.py +3 -3
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/routing/probe_runner.py +572 -543
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/routing/process_runner.py +17 -1
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/routing/profiles.py +1 -1
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/routing/route_pool.py +8 -5
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/routing/schema_validation.py +2 -1
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/routing/service.py +28 -12
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/routing/storage.py +4025 -4019
- graphite_code-1.0.0/src/graphite/systemd_unit.py +129 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/ts_bridge.py +5 -2
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/ts_resolver.mjs +4 -4
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/typescript_activation.py +18 -6
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/validation.py +1 -1
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/windows_job.py +27 -9
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/windows_task.py +27 -37
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_agent_settings.py +276 -276
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_answer_contract.py +487 -487
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_arrow_and_constructor_binding.py +172 -172
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_bootstrap.py +304 -304
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_cache_file_set.py +110 -110
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_class_field_arrow_binding.py +130 -130
- graphite_code-1.0.0/tests/test_cli_reference.py +66 -0
- graphite_code-1.0.0/tests/test_compare_dist.py +75 -0
- graphite_code-1.0.0/tests/test_configuration_reference.py +100 -0
- graphite_code-1.0.0/tests/test_cycle_search.py +128 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_daemon_health.py +1040 -1040
- graphite_code-1.0.0/tests/test_daemon_launch.py +42 -0
- graphite_code-1.0.0/tests/test_daemon_service_cli.py +102 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_destructured_binding.py +183 -183
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_dispatch_evidence.py +277 -277
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_documentation.py +44 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_engine_identity.py +262 -262
- graphite_code-1.0.0/tests/test_exit_codes_reference.py +36 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_external_calls.py +548 -548
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_init.py +446 -446
- graphite_code-1.0.0/tests/test_launchd_agent.py +122 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_lifecycle_operator.py +253 -253
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_mcp.py +3 -3
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_method_dispatch_scope.py +294 -294
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_monorepo.py +199 -199
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_probe_workspace.py +443 -443
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_provider_lifecycle_storage.py +576 -542
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_reliability.py +153 -153
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_routing_cli_recovery.py +283 -283
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_routing_contracts.py +246 -246
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_routing_profiles.py +685 -685
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_routing_service.py +469 -469
- graphite_code-1.0.0/tests/test_synthetic_repo.py +60 -0
- graphite_code-1.0.0/tests/test_systemd_unit.py +156 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_typescript_resolver.py +274 -274
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_verify_artifact.py +13 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_verify_published_release.py +55 -3
- graphite_code-0.5.3/src/graphite/analyze.py +0 -146
- graphite_code-0.5.3/src/graphite/detach.py +0 -33
- {graphite_code-0.5.3 → graphite_code-1.0.0}/.gitignore +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/ARCHITECTURE.md +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/LICENSE +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/__main__.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/activation.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/agent_hooks.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/bootstrap.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/buildlock.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/cache.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/channel.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/cluster.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/context.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/debt.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/engine_identity.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/export/__init__.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/export/html.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/export/md.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/extract/__init__.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/freshness.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/graph.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/graph_io.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/health.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/hookinstall.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/incident_ledger.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/ingest.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/io.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/listing.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/llm.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/llm_probe.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/mcp.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/natural_query.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/overlays.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/process_contracts.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/provider_observer.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/query_plan.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/replacement_audit.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/review.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/routing/__init__.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/routing/classifier.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/routing/claude_probe.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/routing/cli_identity.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/routing/codex_executor.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/routing/codex_probe.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/routing/context_builder.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/routing/diff_policy.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/routing/effort.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/routing/lifecycle_operator.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/routing/ollama_executor.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/routing/ollama_probe.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/routing/openrouter_executor.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/routing/prompt.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/routing/registry.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/routing/route_pool_execution.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/routing/settings.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/routing/shadow.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/routing/telemetry.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/routing/worktree.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/routing/zai_edit.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/routing/zai_executor.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/routing/zai_probe.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/savings.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/usage_ledger.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/watch.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/src/graphite/windows_startup.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/conftest.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/data/sqloracle/blindspots.py.txt +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/data/sqloracle/round69.py.txt +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/fake_clis/fake_cli.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/fixtures/provider_lifecycle_schema_v1.sql +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/fixtures/routing_schema_v2_ca77600.sql +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/fixtures/routing_schema_v3_94eb333.sql +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/fixtures/routing_schema_v4_lifecycle_migration.sql +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_activation.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_activation_backstop.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_agent_hook_activation.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_agent_hooks.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_atomic_write.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_build_detach.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_buildlock.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_cache_engine_identity.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_cache_pruning.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_call_graph.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_channel_cli.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_channel_core.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_channel_lock.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_channel_mcp.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_channel_register.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_channel_report.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_channel_status.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_cli_channel.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_cli_version.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_context.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_cwd_relative_config.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_daemon.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_daemon_activation.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_daemon_build_lock.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_daemon_child_lock.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_daemon_engine_staleness.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_daemon_health_activation.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_debt.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_determinism.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_doctor.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_doctor_agent_hooks.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_doctor_hooks.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_doctor_managed_docs.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_edit_apply.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_git_security.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_go_rust.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_graph_io.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_graph_provider_isolation.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_hardening.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_health.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_hook_entry.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_hook_template.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_hookinstall.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_hookshim.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_html_security.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_incident_ledger.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_init_activation_doctrine.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_init_hooks.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_init_validation_exit.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_listing.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_listing_surfaces.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_llm.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_natural_query.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_node_identity.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_overlays.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_path_leak_fixture.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_probe_diagnostics.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_provider_claude_probe.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_provider_codex_probe.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_provider_lifecycle.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_provider_lifecycle_service.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_provider_observer.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_provider_ollama_probe.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_provider_openrouter_probe.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_provider_probe_runner.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_public_surface.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_published_schemas.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_python_resolver.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_query_plan.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_replacement_audit.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_resolve.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_review.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_route_pool.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_routing_approval.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_routing_benchmark.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_routing_classifier.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_routing_claude_executor.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_routing_cli.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_routing_cli_contracts.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_routing_codex_executor.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_routing_context.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_routing_diff_policy.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_routing_executor.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_routing_openrouter_executor.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_routing_policy.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_routing_process_runner.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_routing_registry.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_routing_schema_validation.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_routing_security.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_routing_shadow.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_routing_storage.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_routing_telemetry.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_routing_worktree.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_routing_zai_executor.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_routing_zai_probe.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_savings.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_search.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_smoke.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_sqloracle.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_typescript_activation.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_usage_ledger.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_watch.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_windows_startup.py +0 -0
- {graphite_code-0.5.3 → graphite_code-1.0.0}/tests/test_windows_task.py +0 -0
- {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
|
-
|
|
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.
|
|
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 ::
|
|
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.
|