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.
- {graphite_code-1.0.1 → graphite_code-1.1.1}/CHANGELOG.md +235 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/PKG-INFO +2 -2
- {graphite_code-1.0.1 → graphite_code-1.1.1}/README.md +1 -1
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/__init__.py +1 -1
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/channel.py +379 -39
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/cli.py +25 -1
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/daemon_health.py +4 -1
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/doctor.py +6 -22
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/doctor_probes.py +37 -3
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/git.py +8 -29
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/hookinstall.py +6 -1
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/init.py +4 -1
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/mcp_server.py +41 -13
- graphite_code-1.1.1/src/graphite/programs.py +190 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/routing/process_runner.py +6 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/routing/service.py +24 -12
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/ts_bridge.py +16 -1
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/windows_startup.py +6 -1
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/windows_task.py +12 -4
- graphite_code-1.1.1/tests/test__win32_ctypes.py +38 -0
- graphite_code-1.1.1/tests/test_channel_attribution.py +254 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_channel_core.py +224 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_channel_lock.py +55 -1
- graphite_code-1.1.1/tests/test_channel_log_integrity.py +260 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_channel_mcp.py +26 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_channel_register.py +26 -0
- graphite_code-1.1.1/tests/test_cli_channel_attribution.py +84 -0
- graphite_code-1.1.1/tests/test_cluster.py +123 -0
- graphite_code-1.1.1/tests/test_context_builder.py +312 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_daemon_health.py +31 -0
- graphite_code-1.1.1/tests/test_dependency_install.py +242 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_doctor.py +72 -3
- graphite_code-1.1.1/tests/test_doctor_probes.py +390 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_hookinstall.py +32 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_init.py +32 -0
- graphite_code-1.1.1/tests/test_llm_probe.py +261 -0
- graphite_code-1.1.1/tests/test_mcp_server.py +205 -0
- graphite_code-1.1.1/tests/test_mcp_server_channel_attribution.py +191 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_mutation_tests.py +135 -2
- graphite_code-1.1.1/tests/test_ollama_executor.py +272 -0
- graphite_code-1.1.1/tests/test_probe_process.py +207 -0
- graphite_code-1.1.1/tests/test_process_contracts.py +74 -0
- graphite_code-1.1.1/tests/test_programs.py +403 -0
- graphite_code-1.1.1/tests/test_route_pool_execution.py +363 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_routing_process_runner.py +21 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_routing_service.py +111 -0
- graphite_code-1.1.1/tests/test_ts_bridge.py +299 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_typescript_activation.py +38 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_windows_startup.py +21 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_windows_task.py +42 -2
- {graphite_code-1.0.1 → graphite_code-1.1.1}/.gitignore +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/ARCHITECTURE.md +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/CONTRIBUTING.md +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/LICENSE +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/RELEASING.md +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/pyproject.toml +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/__main__.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/_cleanup_worker.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/_win32_ctypes.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/activation.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/agent_hooks.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/agent_settings.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/analyze.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/answer_contract.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/bootstrap.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/buildlock.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/cache.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/cluster.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/config.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/context.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/daemon.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/daemon_launch.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/debt.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/dependency_install.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/detach.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/engine_identity.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/export/__init__.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/export/html.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/export/json.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/export/md.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/extract/__init__.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/extract/ast.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/freshness.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/graph.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/graph_io.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/health.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/hook_entry.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/hookshim.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/incident_ledger.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/ingest.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/io.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/launchd_agent.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/listing.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/llm.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/llm_probe.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/mcp.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/natural_query.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/overlays.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/probe_process.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/probe_workspace.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/process_contracts.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/provider_observer.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/py.typed +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/query.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/query_plan.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/replacement_audit.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/resolve.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/review.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/routing/__init__.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/routing/approval.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/routing/classifier.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/routing/claude_executor.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/routing/claude_probe.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/routing/cli_identity.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/routing/codex_executor.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/routing/codex_probe.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/routing/context_builder.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/routing/contracts.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/routing/diff_policy.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/routing/edit_apply.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/routing/effort.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/routing/lifecycle.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/routing/lifecycle_operator.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/routing/lifecycle_service.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/routing/lifecycle_storage.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/routing/ollama_executor.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/routing/ollama_probe.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/routing/openrouter_executor.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/routing/openrouter_probe.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/routing/policy.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/routing/probe_runner.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/routing/profiles.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/routing/prompt.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/routing/registry.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/routing/route_pool.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/routing/route_pool_execution.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/routing/schema_validation.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/routing/settings.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/routing/shadow.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/routing/storage.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/routing/telemetry.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/routing/worktree.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/routing/zai_edit.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/routing/zai_executor.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/routing/zai_probe.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/savings.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/systemd_unit.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/ts_resolver.mjs +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/typescript_activation.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/usage_ledger.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/validation.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/watch.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/src/graphite/windows_job.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/conftest.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/data/sqloracle/blindspots.py.txt +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/data/sqloracle/round69.py.txt +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/fake_clis/fake_cli.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/fixtures/provider_lifecycle_schema_v1.sql +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/fixtures/routing_schema_v2_ca77600.sql +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/fixtures/routing_schema_v3_94eb333.sql +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/fixtures/routing_schema_v4_lifecycle_migration.sql +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_activation.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_activation_backstop.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_agent_hook_activation.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_agent_hooks.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_agent_settings.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_answer_contract.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_arrow_and_constructor_binding.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_atomic_write.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_bootstrap.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_build_detach.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_buildlock.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_cache_engine_identity.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_cache_entry_pruning.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_cache_file_set.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_cache_pruning.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_call_graph.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_channel_cli.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_channel_report.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_channel_status.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_class_field_arrow_binding.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_cli_channel.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_cli_reference.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_cli_version.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_compare_dist.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_configuration_reference.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_context.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_cwd_relative_config.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_cycle_search.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_daemon.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_daemon_activation.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_daemon_build_lock.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_daemon_child_lock.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_daemon_engine_staleness.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_daemon_health_activation.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_daemon_launch.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_daemon_service_cli.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_debt.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_destructured_binding.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_determinism.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_dispatch_evidence.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_doctor_agent_hooks.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_doctor_hooks.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_doctor_managed_docs.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_documentation.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_edit_apply.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_engine_identity.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_exit_codes_reference.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_external_calls.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_git_security.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_go_rust.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_graph_io.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_graph_provider_isolation.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_hardening.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_health.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_hook_entry.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_hook_template.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_hookshim.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_html_security.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_incident_ledger.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_init_activation_doctrine.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_init_hooks.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_init_validation_exit.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_launchd_agent.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_lifecycle_operator.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_listing.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_listing_surfaces.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_llm.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_mcp.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_method_dispatch_scope.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_monorepo.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_natural_query.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_node_identity.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_overlays.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_path_leak_fixture.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_probe_diagnostics.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_probe_workspace.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_provider_claude_probe.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_provider_codex_probe.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_provider_lifecycle.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_provider_lifecycle_service.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_provider_lifecycle_storage.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_provider_observer.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_provider_ollama_probe.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_provider_openrouter_probe.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_provider_probe_runner.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_public_surface.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_published_schemas.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_python_resolver.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_query_plan.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_reliability.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_replacement_audit.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_resolve.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_review.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_route_pool.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_routing_approval.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_routing_benchmark.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_routing_classifier.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_routing_claude_executor.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_routing_cli.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_routing_cli_contracts.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_routing_cli_recovery.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_routing_codex_executor.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_routing_context.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_routing_contracts.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_routing_diff_policy.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_routing_executor.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_routing_openrouter_executor.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_routing_policy.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_routing_profiles.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_routing_registry.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_routing_schema_validation.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_routing_security.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_routing_shadow.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_routing_storage.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_routing_telemetry.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_routing_worktree.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_routing_zai_executor.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_routing_zai_probe.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_savings.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_search.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_smoke.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_sqloracle.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_synthetic_repo.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_systemd_unit.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_typescript_resolver.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_usage_ledger.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_verify_artifact.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_verify_published_release.py +0 -0
- {graphite_code-1.0.1 → graphite_code-1.1.1}/tests/test_watch.py +0 -0
- {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.
|
|
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.
|
|
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.
|
|
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.
|
|
41
|
+
__version__ = "1.1.1"
|