sidegraph 0.11.1__tar.gz → 0.13.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.
- sidegraph-0.13.0/.github/workflows/ci.yml +339 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/AGENTS.md +2 -1
- {sidegraph-0.11.1 → sidegraph-0.13.0}/CHANGELOG.md +175 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/CLAUDE.md +4 -1
- {sidegraph-0.11.1 → sidegraph-0.13.0}/CONTRIBUTING.md +17 -6
- sidegraph-0.13.0/PKG-INFO +310 -0
- sidegraph-0.13.0/README.md +280 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/SECURITY.md +17 -8
- {sidegraph-0.11.1 → sidegraph-0.13.0}/docs/concepts/data-model.md +13 -4
- sidegraph-0.13.0/docs/concepts/decision-memory.md +76 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/docs/concepts/retrieval.md +9 -4
- {sidegraph-0.11.1 → sidegraph-0.13.0}/docs/getting-started/bootstrap.md +12 -11
- {sidegraph-0.11.1 → sidegraph-0.13.0}/docs/getting-started/claude-code-setup.md +21 -7
- {sidegraph-0.11.1 → sidegraph-0.13.0}/docs/getting-started/codex-setup.md +19 -8
- {sidegraph-0.11.1 → sidegraph-0.13.0}/docs/getting-started/installation.md +134 -10
- {sidegraph-0.11.1 → sidegraph-0.13.0}/docs/getting-started/quickstart.md +40 -16
- {sidegraph-0.11.1 → sidegraph-0.13.0}/docs/guides/capturing-decisions.md +7 -5
- {sidegraph-0.11.1 → sidegraph-0.13.0}/docs/guides/naming-your-domains.md +13 -13
- {sidegraph-0.11.1 → sidegraph-0.13.0}/docs/guides/retrieval-in-sessions.md +4 -4
- {sidegraph-0.11.1 → sidegraph-0.13.0}/docs/guides/semantic-docs.md +9 -13
- {sidegraph-0.11.1 → sidegraph-0.13.0}/docs/guides/surviving-refactors.md +2 -2
- {sidegraph-0.11.1 → sidegraph-0.13.0}/docs/guides/team-workflow.md +12 -15
- {sidegraph-0.11.1 → sidegraph-0.13.0}/docs/guides/troubleshooting.md +76 -4
- {sidegraph-0.11.1 → sidegraph-0.13.0}/docs/guides/verifying-your-setup.md +9 -3
- {sidegraph-0.11.1 → sidegraph-0.13.0}/docs/integrations/claude-code.md +18 -16
- {sidegraph-0.11.1 → sidegraph-0.13.0}/docs/integrations/codex.md +30 -10
- {sidegraph-0.11.1 → sidegraph-0.13.0}/docs/integrations/graphify.md +8 -9
- sidegraph-0.13.0/docs/llms.txt +66 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/docs/reference/cli.md +58 -18
- {sidegraph-0.11.1 → sidegraph-0.13.0}/docs/reference/configuration.md +9 -5
- {sidegraph-0.11.1 → sidegraph-0.13.0}/docs/reference/git-bindings.md +2 -2
- {sidegraph-0.11.1 → sidegraph-0.13.0}/docs/reference/hooks.md +60 -4
- {sidegraph-0.11.1 → sidegraph-0.13.0}/docs/reference/mcp-tools.md +250 -52
- {sidegraph-0.11.1 → sidegraph-0.13.0}/docs/reference/operations.md +7 -4
- {sidegraph-0.11.1 → sidegraph-0.13.0}/docs/reference/releasing.md +7 -6
- {sidegraph-0.11.1 → sidegraph-0.13.0}/docs/reference/stability.md +6 -6
- {sidegraph-0.11.1 → sidegraph-0.13.0}/docs/reference/store-format.md +38 -18
- {sidegraph-0.11.1 → sidegraph-0.13.0}/plugin/sidegraph/.claude-plugin/plugin.json +1 -1
- {sidegraph-0.11.1 → sidegraph-0.13.0}/plugin/sidegraph/.codex-plugin/plugin.json +1 -1
- sidegraph-0.13.0/plugin/sidegraph/.mcp.json +17 -0
- sidegraph-0.13.0/plugin/sidegraph/codex/hooks.json +37 -0
- sidegraph-0.13.0/plugin/sidegraph/codex/mcp.json +15 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/plugin/sidegraph/hooks/hooks.json +1 -1
- {sidegraph-0.11.1 → sidegraph-0.13.0}/plugin/sidegraph/skills/check-plan/SKILL.md +2 -1
- {sidegraph-0.11.1 → sidegraph-0.13.0}/plugin/sidegraph/skills/explain-why/SKILL.md +6 -2
- {sidegraph-0.11.1 → sidegraph-0.13.0}/plugin/sidegraph/skills/heal-anchors/SKILL.md +6 -6
- {sidegraph-0.11.1 → sidegraph-0.13.0}/plugin/sidegraph/skills/import-adrs/SKILL.md +7 -7
- {sidegraph-0.11.1 → sidegraph-0.13.0}/plugin/sidegraph/skills/manage-domains/SKILL.md +9 -6
- {sidegraph-0.11.1 → sidegraph-0.13.0}/plugin/sidegraph/skills/name-domains/SKILL.md +10 -6
- {sidegraph-0.11.1 → sidegraph-0.13.0}/plugin/sidegraph/skills/ratify-decisions/SKILL.md +10 -9
- {sidegraph-0.11.1 → sidegraph-0.13.0}/plugin/sidegraph/skills/record-decision/SKILL.md +3 -2
- {sidegraph-0.11.1 → sidegraph-0.13.0}/plugin/sidegraph/skills/record-fact/SKILL.md +2 -1
- {sidegraph-0.11.1 → sidegraph-0.13.0}/plugin/sidegraph/skills/setup/SKILL.md +12 -7
- {sidegraph-0.11.1 → sidegraph-0.13.0}/plugin/sidegraph/skills/stats/SKILL.md +4 -5
- {sidegraph-0.11.1 → sidegraph-0.13.0}/plugin/sidegraph/skills/triage-drift/SKILL.md +5 -2
- {sidegraph-0.11.1 → sidegraph-0.13.0}/pyproject.toml +4 -4
- {sidegraph-0.11.1 → sidegraph-0.13.0}/src/sidegraph/__init__.py +1 -1
- {sidegraph-0.11.1 → sidegraph-0.13.0}/src/sidegraph/bash_paths.py +2 -1
- {sidegraph-0.11.1 → sidegraph-0.13.0}/src/sidegraph/bootstrap/review.py +9 -2
- {sidegraph-0.11.1 → sidegraph-0.13.0}/src/sidegraph/capture.py +63 -36
- {sidegraph-0.11.1 → sidegraph-0.13.0}/src/sidegraph/cli.py +20 -3
- {sidegraph-0.11.1 → sidegraph-0.13.0}/src/sidegraph/config.py +37 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/src/sidegraph/doc_import.py +35 -12
- {sidegraph-0.11.1 → sidegraph-0.13.0}/src/sidegraph/doctor.py +22 -5
- {sidegraph-0.11.1 → sidegraph-0.13.0}/src/sidegraph/engine/reader.py +24 -9
- {sidegraph-0.11.1 → sidegraph-0.13.0}/src/sidegraph/githooks.py +2 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/src/sidegraph/gitio.py +23 -6
- {sidegraph-0.11.1 → sidegraph-0.13.0}/src/sidegraph/host/claude_settings.py +17 -4
- {sidegraph-0.11.1 → sidegraph-0.13.0}/src/sidegraph/host/hooks.py +241 -45
- sidegraph-0.13.0/src/sidegraph/host/mcp_entry.py +131 -0
- sidegraph-0.13.0/src/sidegraph/host/session_identity.py +69 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/src/sidegraph/hot_index.py +84 -14
- {sidegraph-0.11.1 → sidegraph-0.13.0}/src/sidegraph/integrity.py +7 -1
- {sidegraph-0.11.1 → sidegraph-0.13.0}/src/sidegraph/nearest_anchored.py +88 -22
- {sidegraph-0.11.1 → sidegraph-0.13.0}/src/sidegraph/retrieval.py +34 -13
- {sidegraph-0.11.1 → sidegraph-0.13.0}/src/sidegraph/seed_ladder.py +105 -21
- {sidegraph-0.11.1 → sidegraph-0.13.0}/src/sidegraph/server.py +1479 -337
- {sidegraph-0.11.1 → sidegraph-0.13.0}/src/sidegraph/stats/model.py +46 -10
- {sidegraph-0.11.1 → sidegraph-0.13.0}/src/sidegraph/stats/render.py +28 -5
- {sidegraph-0.11.1 → sidegraph-0.13.0}/src/sidegraph/store.py +72 -71
- {sidegraph-0.11.1 → sidegraph-0.13.0}/src/sidegraph/text_paths.py +3 -1
- sidegraph-0.13.0/src/sidegraph/tool_rate_limit.py +50 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/src/sidegraph/verify.py +10 -4
- sidegraph-0.13.0/src/sidegraph/worktree_seeds.py +140 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/src/sidegraph/write_boundary.py +6 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/conftest.py +57 -1
- sidegraph-0.13.0/tests/test_batch_panel_fixes.py +621 -0
- sidegraph-0.13.0/tests/test_bootstrap_descriptor_cleanup.py +79 -0
- sidegraph-0.13.0/tests/test_bounded_listings.py +1058 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_capture_facts.py +10 -5
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_capture_propose.py +24 -12
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_cli_doctor.py +39 -2
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_codex_plugin.py +26 -9
- sidegraph-0.13.0/tests/test_command_windows.py +408 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_coverage_telemetry_e2e.py +6 -2
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_doc_import.py +2 -1
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_docs_claims.py +130 -4
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_doctor.py +65 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_doctor_integrity.py +8 -2
- sidegraph-0.13.0/tests/test_git_output_utf8.py +222 -0
- sidegraph-0.13.0/tests/test_hook_payload_encoding.py +99 -0
- sidegraph-0.13.0/tests/test_hook_showings.py +324 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_host_pretool_records.py +2 -2
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_host_wiring_checks.py +231 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_hot_index.py +8 -2
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_hot_index_hook.py +2 -2
- sidegraph-0.13.0/tests/test_installed_wheel_smoke.py +487 -0
- sidegraph-0.13.0/tests/test_mcp_entry_ratify_policy.py +104 -0
- sidegraph-0.13.0/tests/test_mcp_entry_repo_root.py +148 -0
- sidegraph-0.13.0/tests/test_portable_json.py +112 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_public_hook_launch.py +146 -0
- sidegraph-0.13.0/tests/test_repo_relative_paths_portable.py +325 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_retrieval_drilldown.py +2 -2
- sidegraph-0.13.0/tests/test_seed_paths_portable.py +163 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_server_argument_names.py +5 -5
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_server_borrowed_graph.py +1 -1
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_server_capture.py +12 -5
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_server_coverage_events.py +46 -29
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_server_decision_listing.py +16 -12
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_server_facts.py +22 -10
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_server_graph_freshness.py +8 -12
- sidegraph-0.13.0/tests/test_server_invocation_policy.py +138 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_server_mcp_smoke.py +46 -34
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_server_render_events.py +8 -7
- sidegraph-0.13.0/tests/test_server_result_contract.py +139 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_server_supersede.py +8 -4
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_server_telemetry.py +8 -5
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_server_tolerant_seeds.py +3 -1
- sidegraph-0.13.0/tests/test_session_attribution.py +626 -0
- sidegraph-0.13.0/tests/test_skill_frontmatter.py +39 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_stats_model.py +149 -4
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_stats_render.py +47 -1
- sidegraph-0.13.0/tests/test_store_cross_process_mutations.py +275 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_store_mutation_immediate.py +4 -4
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_subagent_start_manifests.py +6 -0
- sidegraph-0.13.0/tests/test_subprocess_text_encoding.py +111 -0
- sidegraph-0.13.0/tests/test_verify_git_stdin.py +89 -0
- sidegraph-0.13.0/tests/test_worktree_seeds.py +651 -0
- sidegraph-0.13.0/tests/wheel_server_trace.py +114 -0
- sidegraph-0.13.0/tests/wheel_smoke.py +419 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/uv.lock +3 -3
- sidegraph-0.11.1/.github/workflows/ci.yml +0 -165
- sidegraph-0.11.1/PKG-INFO +0 -307
- sidegraph-0.11.1/README.md +0 -277
- sidegraph-0.11.1/docs/concepts/decision-memory.md +0 -79
- sidegraph-0.11.1/docs/llms.txt +0 -64
- sidegraph-0.11.1/plugin/sidegraph/.mcp.json +0 -16
- sidegraph-0.11.1/plugin/sidegraph/codex/hooks.json +0 -34
- sidegraph-0.11.1/plugin/sidegraph/codex/mcp.json +0 -9
- {sidegraph-0.11.1 → sidegraph-0.13.0}/.agents/plugins/marketplace.json +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/.claude-plugin/marketplace.json +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/.github/CODEOWNERS +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/.github/secret_scanning.yml +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/.github/workflows/publish.yml +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/.github/workflows/scorecard.yml +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/.github/workflows/session-link-gate.yml +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/.gitignore +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/.gitleaks.toml +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/.pre-commit-config.yaml +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/.python-version +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/CODE_OF_CONDUCT.md +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/LICENSE +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/docs/README.md +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/docs/concepts/anchoring.md +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/docs/concepts/mind-model.md +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/docs/guides/ci-cd-maintenance.md +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/docs/pilot-kit/README.md +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/docs/pilot-kit/corpus_fit.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/docs/pilot-kit/judge-prompt.md +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/docs/pilot-kit/questions-prompt.md +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/docs/pilot-kit/rubric-template.md +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/docs/whitepaper/index.md +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/plugin/sidegraph/skills/check-plan/agents/openai.yaml +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/plugin/sidegraph/skills/explain-why/agents/openai.yaml +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/plugin/sidegraph/skills/heal-anchors/agents/openai.yaml +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/plugin/sidegraph/skills/import-adrs/agents/openai.yaml +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/plugin/sidegraph/skills/manage-domains/agents/openai.yaml +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/plugin/sidegraph/skills/name-domains/agents/openai.yaml +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/plugin/sidegraph/skills/ratify-decisions/agents/openai.yaml +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/plugin/sidegraph/skills/record-decision/agents/openai.yaml +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/plugin/sidegraph/skills/record-fact/agents/openai.yaml +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/plugin/sidegraph/skills/setup/agents/openai.yaml +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/plugin/sidegraph/skills/stats/agents/openai.yaml +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/plugin/sidegraph/skills/triage-drift/agents/openai.yaml +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/src/sidegraph/anchoring.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/src/sidegraph/bootstrap/__init__.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/src/sidegraph/bootstrap/apply.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/src/sidegraph/bootstrap/catalog.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/src/sidegraph/bootstrap/cli.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/src/sidegraph/bootstrap/integrations.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/src/sidegraph/bootstrap/model.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/src/sidegraph/bootstrap/planner.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/src/sidegraph/bootstrap/proof.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/src/sidegraph/bootstrap/scan.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/src/sidegraph/domains.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/src/sidegraph/engine/__init__.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/src/sidegraph/freshness.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/src/sidegraph/gitenv.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/src/sidegraph/host/__init__.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/src/sidegraph/host/launch.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/src/sidegraph/host/subagent.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/src/sidegraph/importer.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/src/sidegraph/input_limits.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/src/sidegraph/okf.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/src/sidegraph/profiles.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/src/sidegraph/redaction_scan.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/src/sidegraph/redaction_tokens.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/src/sidegraph/schema.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/src/sidegraph/stats/__init__.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/src/sidegraph/store_layout.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/src/sidegraph/sync.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/src/sidegraph/validation_errors.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/src/sidegraph/viz/__init__.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/src/sidegraph/viz/assets/vis-network.min.js +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/src/sidegraph/viz/model.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/src/sidegraph/viz/render.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/src/sidegraph/viz/template.html +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/__init__.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/fixtures/auto_policy/parity_goldens.json +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/fixtures/bitfinex_slice.json +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/fixtures/bootstrap/flows/bmad/_bmad-output/planning-artifacts/architecture/cache/ARCHITECTURE-SPINE.md +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/fixtures/bootstrap/flows/generic-adr/docs/adr/001-retry.md +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/fixtures/bootstrap/flows/genkovich-sdd/docs/features/cache/adr/001.md +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/fixtures/bootstrap/flows/spec-kit/specs/cache/plan.md +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/fixtures/bootstrap/flows/superpowers/docs/superpowers/specs/2026-07-01-cache-design.md +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/fixtures/bootstrap/graph.json +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/fixtures/bootstrap/hosts/claude/.claude/settings.json +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/fixtures/bootstrap/hosts/claude/.mcp.json +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/fixtures/bootstrap/hosts/codex/.codex/config.toml +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/fixtures/bootstrap/hosts/codex/.codex/hooks/hooks.json +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/fixtures/bootstrap/scan/docs/adr/001-safe.md +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/fixtures/corpus/PUBLIC_CORPORA.txt +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/fixtures/corpus/openspec/_provenance.json +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/fixtures/corpus/openspec/graph.json +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/fixtures/corpus/self-corpus/_provenance.json +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/fixtures/corpus/self-corpus/expected/retrieval-engine-reader.md +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/fixtures/corpus/self-corpus/graph.json +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/fixtures/flows/adr/0001-use-sessions.md +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/fixtures/flows/bmad/ARCHITECTURE-SPINE.md +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/fixtures/flows/bmad/tree/_bmad-output/planning-artifacts/architecture/architecture-payments-2026-07-30/.memlog.md +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/fixtures/flows/bmad/tree/_bmad-output/planning-artifacts/architecture/architecture-payments-2026-07-30/ARCHITECTURE-SPINE.md +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/fixtures/flows/bmad/tree/_bmad-output/planning-artifacts/prds/prd-payments-2026-07-30/prd.md +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/fixtures/flows/genkovich/0001-queue-backpressure.md +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/fixtures/flows/genkovich/sad.md +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/fixtures/flows/genkovich/tree/docs/features/payments/adr/0001-queue-backpressure.md +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/fixtures/flows/genkovich/tree/docs/features/payments/sad.md +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/fixtures/flows/genkovich/tree/docs/features/payments/spec.md +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/fixtures/flows/openspec/design-empty.md +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/fixtures/flows/openspec/design-h3-split.md +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/fixtures/flows/openspec/design-with-summary.md +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/fixtures/flows/openspec/design.md +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/fixtures/flows/openspec/proposal-alternatives.md +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/fixtures/flows/openspec/proposal.md +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/design.md +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/proposal.md +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/specs/cap/spec.md +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/tasks.md +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/fixtures/flows/openspec/tree/openspec/changes/archive/2026-01-01-add-thing/design.md +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/fixtures/flows/openspec/tree/openspec/changes/archive/2026-01-01-add-thing/proposal.md +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/fixtures/flows/openspec/tree/openspec/config.yaml +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/fixtures/flows/openspec/tree/openspec/specs/cap/spec.md +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/fixtures/flows/spec-kit/plan.md +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/fixtures/flows/spec-kit/tree/specs/003-payment-retries/plan.md +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/fixtures/flows/spec-kit/tree/specs/003-payment-retries/spec.md +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/fixtures/flows/superpowers/2026-07-01-example-design.md +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/fixtures/flows/superpowers/2026-07-01-thin-design.md +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/fixtures/member_names_python_graph.json +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/fixtures/member_names_swift_graph.json +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/fixtures/mini_graph.json +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/githooks_support.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_agent_brief_manifests.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_anchoring.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_anchoring_mapping_refresh.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_bash_paths.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_bootstrap_apply.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_bootstrap_catalog.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_bootstrap_cli.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_bootstrap_integrations.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_bootstrap_model.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_bootstrap_planner.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_bootstrap_proof.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_bootstrap_review.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_bootstrap_scan.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_bootstrap_scan_regular.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_bootstrap_unanchored.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_capture_auto_accept.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_capture_initiative.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_capture_integration.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_capture_neighbors.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_capture_redact.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_cli_compact.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_cli_domains.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_cli_graph_paths.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_cli_import.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_cli_init.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_cli_init_hooks.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_cli_okf.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_cli_ratify.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_cli_ratify_facts.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_cli_stats.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_cli_sync.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_cli_sync_check.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_cli_unreadable_paths.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_cli_viz.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_community_baseline.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_config.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_config_ancestor_lookup.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_config_borrowed_graph.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_corpus_expected_renders.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_corpus_self_corpus.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_digest_integrity.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_doc_corpus_integration.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_doctor_auto_share.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_doctor_code_drift.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_doctor_dangling_supports.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_doctor_duplicate_entity.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_doctor_graph_root_mismatch.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_doctor_graph_stale.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_doctor_never_surfaced.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_doctor_scan.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_doctor_stale_instructions.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_doctor_unhashable_payload.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_doctor_unratified_accept.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_domains.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_entity_duplicate_resolution.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_entity_get_or_create_race.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_entry_point_arguments.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_env_isolation.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_fact_reachability_gate.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_flow_profile.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_git_bindings_blame.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_git_bindings_hook.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_git_bindings_provenance.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_git_config_isolation.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_git_env.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_githooks.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_graph_freshness.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_hook_spawn_guard.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_host_agent_brief.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_host_agent_state.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_host_borrowed_graph.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_host_claude_settings.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_host_drift_nudge.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_host_integrity.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_host_launch.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_host_pretool.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_host_session_key.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_host_session_start.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_host_session_start_concurrent.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_host_stop.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_host_subagent_start.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_host_subdirectory_launch.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_host_touch_events.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_hot_path_imports.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_import_dry_run_preview.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_importer.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_index_journal_mode.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_integrity.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_integrity_refresh_hook.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_integrity_replay.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_integrity_stranded.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_lazy_root.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_member_anchor_wiring.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_mind_model_additive_fields.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_nearest_anchored.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_okf.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_openspec_profile.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_pathless_descriptor_adoption.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_pilot_kit_corpus_fit.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_proposal_lifecycle.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_ratify_listing_gone_dark.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_ratify_policy.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_reader_community_labels.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_reader_doc_nodes.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_reader_graph.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_reader_integration.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_reader_member_name_lookup.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_reader_member_names.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_reader_nodes_in_file.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_reader_perf.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_reader_rationale.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_reader_read.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_reader_resolve.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_reader_subdir_mismatch.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_reader_version.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_redaction_scan.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_redaction_seeded.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_redaction_tokens.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_repoint_integration.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_retrieval_budget_counters.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_retrieval_context.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_retrieval_drift_marker.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_retrieval_facts.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_retrieval_guessed.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_retrieval_ids.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_retrieval_integration.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_retrieval_rank.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_retrieval_seeds.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_retrieval_shown_ids.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_retrieval_terminal_evidence.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_retrieval_thin_tools.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_retrieval_toc.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_retrieval_toptier.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_retrieval_unratified.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_sandbox_hygiene.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_schema_descriptor.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_schema_domain.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_schema_fact.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_secret_scan_gate.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_security_binary_limits.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_security_capture_diagnostics.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_security_capture_limits.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_security_cli_diagnostics.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_security_doc_limits.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_security_input_limits.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_security_mcp_write_diagnostics.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_security_numeric_enums.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_security_python_shapes.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_security_redaction_cursor.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_security_redaction_scaling.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_security_validation_errors.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_security_write_boundary.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_seed_ladder.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_server_add_anchors.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_server_anchoring.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_server_annotations.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_server_commit_hint.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_server_domains.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_server_drilldown.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_server_find_entity.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_server_get_store.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_server_get_task_context.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_server_graph_path.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_server_import.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_server_nearest_anchored.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_server_prewrite_anchor_validation.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_server_ratify_facts.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_server_record_types.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_server_redaction.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_server_refresh.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_server_sync_anchors.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_server_thin_tools.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_server_verify.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_stats_graph.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_stats_health.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_stats_skill.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_stats_snapshot.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_stop_hot_path.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_stop_rearm.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_store.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_store_agent_state.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_store_atomic_write_tmp_names.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_store_bad_file.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_store_binding_index.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_store_canonical_stat.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_store_compact.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_store_compact_review.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_store_concurrent_open.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_store_coverage_telemetry.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_store_derived_community.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_store_domains.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_store_entities.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_store_fact_cascade.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_store_facts.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_store_git_root_symlink.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_store_meta.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_store_migration.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_store_mutation_guard.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_store_non_file_entries.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_store_opens_with_merged_duplicate.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_store_persistence.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_store_ratification.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_store_rebuild_atomicity.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_store_record_identity.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_store_record_types.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_store_render_events.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_store_retrieval.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_store_slug_conflicts.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_store_stamping_marker.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_store_symlinks.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_store_telemetry.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_store_threading.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_store_tmp_sweep_age.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_store_update_meta_if.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_sync_canonical_writes.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_sync_clean.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_sync_domains.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_sync_drift_cache.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_sync_fresh_clone.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_sync_integration.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_sync_moved_adoption.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_sync_rebind.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_sync_repoint.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_sync_report_has_findings.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_sync_run.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_sync_toc_cache.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_sync_volatile_heal.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_sync_wiring.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_telemetry_retention.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_text_paths.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_verify_git_framing.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_verify_git_revisions.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_verify_snapshot.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_verify_transitions.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_viz_asset_packaged.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_viz_model.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_viz_render_html.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tests/test_viz_render_json.py +0 -0
- {sidegraph-0.11.1 → sidegraph-0.13.0}/tools/check_no_session_links.py +0 -0
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
# Project lint+type+test gate. `lint` runs the SAME .pre-commit-config.yaml a developer
|
|
2
|
+
# runs locally, so there is one definition of lint rather than a CI copy that drifts.
|
|
3
|
+
# Mostly distinct from the sidegraph-recipe workflows in docs/guides/ci-cd-maintenance.md
|
|
4
|
+
# (recipes for USER repos consuming Sidegraph) — except `store-lint`, which is Recipe 2
|
|
5
|
+
# self-applied to this repo's own dogfood store (2026-08-09 maintenance retrospective,
|
|
6
|
+
# cadence lever): the store rides every PR, so its transition rules should gate every PR.
|
|
7
|
+
#
|
|
8
|
+
# Actions are pinned to commit SHAs (the tag comment records the version): a mutable tag
|
|
9
|
+
# is a supply-chain hole, and this workflow ships to the public repo by snapshot.
|
|
10
|
+
name: ci
|
|
11
|
+
|
|
12
|
+
on:
|
|
13
|
+
push:
|
|
14
|
+
branches: [main]
|
|
15
|
+
pull_request:
|
|
16
|
+
workflow_call: # reused as the pre-publish gate by publish.yml (tag builds)
|
|
17
|
+
|
|
18
|
+
permissions:
|
|
19
|
+
contents: read
|
|
20
|
+
|
|
21
|
+
jobs:
|
|
22
|
+
lint:
|
|
23
|
+
runs-on: ubuntu-latest
|
|
24
|
+
timeout-minutes: 15
|
|
25
|
+
steps:
|
|
26
|
+
# zizmor artipacked: this job never pushes, so the checkout's git credentials should not
|
|
27
|
+
# persist into the runner's git config where a later step (or an uploaded artifact) could
|
|
28
|
+
# leak them.
|
|
29
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
|
30
|
+
with:
|
|
31
|
+
fetch-depth: 0 # committed-history secret scan needs every reachable commit
|
|
32
|
+
persist-credentials: false
|
|
33
|
+
|
|
34
|
+
- name: Install uv
|
|
35
|
+
uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
|
|
36
|
+
with:
|
|
37
|
+
python-version: "3.13"
|
|
38
|
+
enable-cache: true
|
|
39
|
+
cache-dependency-glob: "uv.lock"
|
|
40
|
+
|
|
41
|
+
- name: Cache pre-commit hooks
|
|
42
|
+
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6
|
|
43
|
+
with:
|
|
44
|
+
path: ~/.cache/pre-commit
|
|
45
|
+
key: pre-commit-${{ hashFiles('.pre-commit-config.yaml') }}
|
|
46
|
+
|
|
47
|
+
- name: Install dependencies
|
|
48
|
+
run: uv sync --locked
|
|
49
|
+
|
|
50
|
+
- name: Run pre-commit checks
|
|
51
|
+
run: uv run pre-commit run --all-files
|
|
52
|
+
|
|
53
|
+
- name: Scan committed history for secrets
|
|
54
|
+
run: |
|
|
55
|
+
test "$(git rev-parse --is-shallow-repository)" = false
|
|
56
|
+
uv run pre-commit run gitleaks-history --hook-stage manual --all-files
|
|
57
|
+
|
|
58
|
+
- name: Exercise secret scanner integration
|
|
59
|
+
env:
|
|
60
|
+
SIDEGRAPH_SECRET_SCAN_INTEGRATION: "1"
|
|
61
|
+
run: |
|
|
62
|
+
uv run pytest tests/test_secret_scan_gate.py -q --junitxml="$RUNNER_TEMP/secret-scan.xml"
|
|
63
|
+
python3 - <<'PY'
|
|
64
|
+
import os
|
|
65
|
+
from pathlib import Path
|
|
66
|
+
from xml.etree import ElementTree
|
|
67
|
+
|
|
68
|
+
report = Path(os.environ["RUNNER_TEMP"]) / "secret-scan.xml"
|
|
69
|
+
suites = list(ElementTree.parse(report).getroot().iter("testsuite"))
|
|
70
|
+
assert sum(int(s.attrib["tests"]) for s in suites) > 0, "no scanner tests ran"
|
|
71
|
+
assert sum(int(s.attrib["skipped"]) for s in suites) == 0, "scanner tests skipped"
|
|
72
|
+
PY
|
|
73
|
+
|
|
74
|
+
test:
|
|
75
|
+
runs-on: ubuntu-latest
|
|
76
|
+
timeout-minutes: 30
|
|
77
|
+
strategy:
|
|
78
|
+
fail-fast: false
|
|
79
|
+
matrix:
|
|
80
|
+
python-version: ["3.13", "3.14"]
|
|
81
|
+
steps:
|
|
82
|
+
# zizmor artipacked: this job never pushes; do not persist git credentials past checkout.
|
|
83
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
|
84
|
+
with:
|
|
85
|
+
persist-credentials: false
|
|
86
|
+
|
|
87
|
+
- name: Install uv
|
|
88
|
+
uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
|
|
89
|
+
with:
|
|
90
|
+
python-version: ${{ matrix.python-version }}
|
|
91
|
+
enable-cache: true
|
|
92
|
+
cache-dependency-glob: "uv.lock"
|
|
93
|
+
|
|
94
|
+
- name: Install dependencies
|
|
95
|
+
run: uv sync --locked
|
|
96
|
+
|
|
97
|
+
- name: Run tests
|
|
98
|
+
run: uv run pytest -q
|
|
99
|
+
|
|
100
|
+
sdk-compatibility:
|
|
101
|
+
runs-on: ubuntu-latest
|
|
102
|
+
timeout-minutes: 15
|
|
103
|
+
strategy:
|
|
104
|
+
fail-fast: false
|
|
105
|
+
matrix:
|
|
106
|
+
sdk: [minimum, latest]
|
|
107
|
+
steps:
|
|
108
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
|
109
|
+
with:
|
|
110
|
+
persist-credentials: false
|
|
111
|
+
|
|
112
|
+
- name: Install uv
|
|
113
|
+
uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
|
|
114
|
+
with:
|
|
115
|
+
python-version: "3.13"
|
|
116
|
+
enable-cache: true
|
|
117
|
+
cache-dependency-glob: "uv.lock"
|
|
118
|
+
|
|
119
|
+
- name: Validate supported SDK bounds against installed wheel
|
|
120
|
+
env:
|
|
121
|
+
SDK_PAIR: ${{ matrix.sdk }}
|
|
122
|
+
run: |
|
|
123
|
+
uv build
|
|
124
|
+
wheels=(dist/sidegraph-*.whl)
|
|
125
|
+
test "${#wheels[@]}" -eq 1
|
|
126
|
+
wheel="$(realpath "${wheels[0]}")"
|
|
127
|
+
probe="$(realpath tests/wheel_smoke.py)"
|
|
128
|
+
environment="$RUNNER_TEMP/sidegraph-sdk-env"
|
|
129
|
+
uv venv --python 3.13 "$environment"
|
|
130
|
+
interpreter="$environment/bin/python"
|
|
131
|
+
constraints=()
|
|
132
|
+
if [ "$SDK_PAIR" = minimum ]; then
|
|
133
|
+
constraints=(fastmcp==3.4.2 mcp==1.24.0)
|
|
134
|
+
fi
|
|
135
|
+
uv pip install --python "$interpreter" "$wheel" pytest "${constraints[@]}"
|
|
136
|
+
mkdir -p "$RUNNER_TEMP/sdk-check"
|
|
137
|
+
cp -R tests "$RUNNER_TEMP/sdk-check/tests"
|
|
138
|
+
cd "$RUNNER_TEMP/sdk-check"
|
|
139
|
+
"$interpreter" -I "$probe" --wheel "$wheel" --python "$interpreter"
|
|
140
|
+
"$interpreter" -I -m pytest -q tests/test_server_result_contract.py \
|
|
141
|
+
tests/test_server_argument_names.py tests/test_security_write_boundary.py \
|
|
142
|
+
tests/test_security_mcp_write_diagnostics.py tests/test_server_invocation_policy.py
|
|
143
|
+
"$interpreter" -I -m pytest -q tests/test_session_attribution.py \
|
|
144
|
+
-k "not t9 and not t14_every and not t14_the_manual and not console_script_is_the_host_entry"
|
|
145
|
+
|
|
146
|
+
windows-core:
|
|
147
|
+
runs-on: windows-2022
|
|
148
|
+
timeout-minutes: 30
|
|
149
|
+
strategy:
|
|
150
|
+
fail-fast: false
|
|
151
|
+
matrix:
|
|
152
|
+
python-version: ["3.13", "3.14"]
|
|
153
|
+
steps:
|
|
154
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
|
155
|
+
with:
|
|
156
|
+
persist-credentials: false
|
|
157
|
+
|
|
158
|
+
- name: Install uv
|
|
159
|
+
uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
|
|
160
|
+
with:
|
|
161
|
+
python-version: ${{ matrix.python-version }}
|
|
162
|
+
enable-cache: true
|
|
163
|
+
cache-dependency-glob: "uv.lock"
|
|
164
|
+
|
|
165
|
+
- name: Install dependencies
|
|
166
|
+
run: uv sync --locked
|
|
167
|
+
|
|
168
|
+
# Native core selection; Unix host/editor integrations remain covered on Linux.
|
|
169
|
+
- name: Record native environment
|
|
170
|
+
shell: pwsh
|
|
171
|
+
run: |
|
|
172
|
+
uv run python -c "import json,platform,importlib.metadata as m; print(json.dumps({'os':platform.system(),'python':platform.python_version(),'fastmcp':m.version('fastmcp'),'mcp':m.version('mcp')}))" > "$env:RUNNER_TEMP/windows-environment.json"
|
|
173
|
+
exit $LASTEXITCODE
|
|
174
|
+
|
|
175
|
+
- name: Test portable core and MCP contracts
|
|
176
|
+
shell: pwsh
|
|
177
|
+
run: |
|
|
178
|
+
$privateTests = @()
|
|
179
|
+
if (Test-Path "tools/desktop_e2e_probe.py") {
|
|
180
|
+
$privateTests = @("tests/test_desktop_e2e_probe.py", "tests/test_desktop_e2e_session.py")
|
|
181
|
+
# Later modules' tests join only when present; the snapshot excludes all of them.
|
|
182
|
+
foreach ($name in "appserver", "lifecycle", "preflight", "aggregate", "codex", "receipt") {
|
|
183
|
+
if (Test-Path "tests/test_desktop_e2e_$name.py") {
|
|
184
|
+
$privateTests += "tests/test_desktop_e2e_$name.py"
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
uv run pytest -q --junitxml="$env:RUNNER_TEMP/windows-core.xml" `
|
|
189
|
+
tests/test_store_mutation_guard.py `
|
|
190
|
+
tests/test_store_mutation_immediate.py tests/test_store_cross_process_mutations.py `
|
|
191
|
+
tests/test_portable_json.py tests/test_bootstrap_descriptor_cleanup.py `
|
|
192
|
+
tests/test_server_result_contract.py tests/test_server_invocation_policy.py `
|
|
193
|
+
tests/test_verify_git_stdin.py tests/test_seed_paths_portable.py `
|
|
194
|
+
tests/test_repo_relative_paths_portable.py `
|
|
195
|
+
tests/test_command_windows.py `
|
|
196
|
+
tests/test_hook_payload_encoding.py `
|
|
197
|
+
tests/test_git_output_utf8.py `
|
|
198
|
+
$privateTests `
|
|
199
|
+
tests/test_installed_wheel_smoke.py
|
|
200
|
+
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
|
|
201
|
+
|
|
202
|
+
- name: Validate installed wheel over native stdio
|
|
203
|
+
id: windows-wheel
|
|
204
|
+
shell: pwsh
|
|
205
|
+
env:
|
|
206
|
+
WHEEL_PYTHON_VERSION: ${{ matrix.python-version }}
|
|
207
|
+
run: |
|
|
208
|
+
uv build
|
|
209
|
+
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
|
|
210
|
+
$wheels = @(Get-ChildItem dist/sidegraph-*.whl)
|
|
211
|
+
if ($wheels.Count -ne 1) { throw "Expected one wheel artifact" }
|
|
212
|
+
$wheel = $wheels[0].FullName
|
|
213
|
+
$probe = (Resolve-Path tests/wheel_smoke.py).Path
|
|
214
|
+
$environment = Join-Path $env:RUNNER_TEMP "sidegraph-wheel-env"
|
|
215
|
+
uv venv --python "$env:WHEEL_PYTHON_VERSION" "$environment"
|
|
216
|
+
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
|
|
217
|
+
$interpreter = Join-Path $environment "Scripts/python.exe"
|
|
218
|
+
uv pip install --python "$interpreter" "$wheel"
|
|
219
|
+
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
|
|
220
|
+
Set-Location "$env:RUNNER_TEMP"
|
|
221
|
+
& "$interpreter" -I "$probe" --wheel "$wheel" --python "$interpreter" |
|
|
222
|
+
Tee-Object -FilePath "$env:RUNNER_TEMP/windows-wheel.json"
|
|
223
|
+
exit $LASTEXITCODE
|
|
224
|
+
|
|
225
|
+
# Preserve the primary failure. Instrumentation uses new no-graph/no-repo scratch.
|
|
226
|
+
- name: Diagnose first installed-wheel write
|
|
227
|
+
if: ${{ !cancelled() && steps.windows-wheel.outcome == 'failure' }}
|
|
228
|
+
timeout-minutes: 2
|
|
229
|
+
shell: pwsh
|
|
230
|
+
run: |
|
|
231
|
+
$wheels = @(Get-ChildItem dist/sidegraph-*.whl)
|
|
232
|
+
if ($wheels.Count -ne 1) { throw "Expected one wheel artifact" }
|
|
233
|
+
$wheel = $wheels[0].FullName
|
|
234
|
+
$probe = (Resolve-Path tests/wheel_smoke.py).Path
|
|
235
|
+
$interpreter = Join-Path $env:RUNNER_TEMP "sidegraph-wheel-env/Scripts/python.exe"
|
|
236
|
+
Set-Location "$env:RUNNER_TEMP"
|
|
237
|
+
& "$interpreter" -I "$probe" --wheel "$wheel" --python "$interpreter" `
|
|
238
|
+
--diagnose-first-write
|
|
239
|
+
exit $LASTEXITCODE
|
|
240
|
+
|
|
241
|
+
- name: Sanitize test report
|
|
242
|
+
if: ${{ !cancelled() }}
|
|
243
|
+
shell: pwsh
|
|
244
|
+
run: |
|
|
245
|
+
@'
|
|
246
|
+
import os
|
|
247
|
+
from pathlib import Path
|
|
248
|
+
from xml.etree import ElementTree as ET
|
|
249
|
+
report = Path(os.environ['RUNNER_TEMP']) / 'windows-core.xml'
|
|
250
|
+
if report.exists():
|
|
251
|
+
tree = ET.parse(report)
|
|
252
|
+
for element in tree.getroot().iter():
|
|
253
|
+
if element.tag in {'failure', 'error', 'skipped', 'system-out', 'system-err'}:
|
|
254
|
+
element.attrib.clear()
|
|
255
|
+
element.text = 'Details omitted; see the CI step output.'
|
|
256
|
+
element.attrib.pop('file', None)
|
|
257
|
+
element.attrib.pop('hostname', None)
|
|
258
|
+
tree.write(report, encoding='utf-8', xml_declaration=True)
|
|
259
|
+
'@ | uv run python -
|
|
260
|
+
exit $LASTEXITCODE
|
|
261
|
+
|
|
262
|
+
- name: Upload bounded Windows evidence
|
|
263
|
+
if: ${{ !cancelled() }}
|
|
264
|
+
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
|
|
265
|
+
with:
|
|
266
|
+
name: windows-core-${{ matrix.python-version }}
|
|
267
|
+
path: |
|
|
268
|
+
${{ runner.temp }}/windows-core.xml
|
|
269
|
+
${{ runner.temp }}/windows-environment.json
|
|
270
|
+
${{ runner.temp }}/windows-wheel.json
|
|
271
|
+
if-no-files-found: warn
|
|
272
|
+
retention-days: 7
|
|
273
|
+
|
|
274
|
+
# Recipe 2 (docs/guides/ci-cd-maintenance.md) on our own store: catch a hand-edited or
|
|
275
|
+
# history-rewritten record no MCP tool would produce. Diffs against the PR's merge base
|
|
276
|
+
# (never a moving branch name — see the recipe for why). Skips cleanly when the checkout
|
|
277
|
+
# carries no store: the public snapshot ships .sidegraph only on the demo branch, and
|
|
278
|
+
# this workflow ships to the public repo.
|
|
279
|
+
store-lint:
|
|
280
|
+
if: github.event_name == 'pull_request'
|
|
281
|
+
runs-on: ubuntu-latest
|
|
282
|
+
timeout-minutes: 10
|
|
283
|
+
steps:
|
|
284
|
+
# zizmor artipacked: this job never pushes; do not persist git credentials past checkout.
|
|
285
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
|
286
|
+
with:
|
|
287
|
+
fetch-depth: 0 # full history — merge-base needs it
|
|
288
|
+
persist-credentials: false
|
|
289
|
+
|
|
290
|
+
- name: Install uv
|
|
291
|
+
uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
|
|
292
|
+
with:
|
|
293
|
+
python-version: "3.13"
|
|
294
|
+
enable-cache: true
|
|
295
|
+
cache-dependency-glob: "uv.lock"
|
|
296
|
+
|
|
297
|
+
- name: sidegraph-verify --against merge-base
|
|
298
|
+
run: |
|
|
299
|
+
if [ ! -d .sidegraph ]; then
|
|
300
|
+
echo "no .sidegraph in this checkout — store lint not applicable"
|
|
301
|
+
exit 0
|
|
302
|
+
fi
|
|
303
|
+
uv sync --locked
|
|
304
|
+
base="$(git merge-base "origin/$GITHUB_BASE_REF" HEAD)"
|
|
305
|
+
uv run sidegraph-verify --against "$base" --json
|
|
306
|
+
|
|
307
|
+
# Recipe 1 self-applied: rebuild the graph from scratch and fail on attention findings
|
|
308
|
+
# (stale decisions, empty/overbroad domains, slug conflicts, refresh failures). A
|
|
309
|
+
# cache-less rebuild was verified label-identical to the local cached graph and the
|
|
310
|
+
# check green on it (2026-08-09 retrospective, cadence lever) — so a red here is a real
|
|
311
|
+
# finding, not CI-environment noise. Lone orphaned/ambiguous entities do NOT fail the
|
|
312
|
+
# check: multi-anchor tolerates them by design. The engine is version-pinned (engine-
|
|
313
|
+
# seam invariant); the sync writes only to the ephemeral checkout's .sidegraph/.
|
|
314
|
+
anchor-health:
|
|
315
|
+
if: github.event_name == 'pull_request'
|
|
316
|
+
runs-on: ubuntu-latest
|
|
317
|
+
timeout-minutes: 15
|
|
318
|
+
steps:
|
|
319
|
+
# zizmor artipacked: this job never pushes; do not persist git credentials past checkout.
|
|
320
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
|
321
|
+
with:
|
|
322
|
+
persist-credentials: false
|
|
323
|
+
|
|
324
|
+
- name: Install uv
|
|
325
|
+
uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
|
|
326
|
+
with:
|
|
327
|
+
python-version: "3.13"
|
|
328
|
+
enable-cache: true
|
|
329
|
+
cache-dependency-glob: "uv.lock"
|
|
330
|
+
|
|
331
|
+
- name: Rebuild graph and run sidegraph-sync --check
|
|
332
|
+
run: |
|
|
333
|
+
if [ ! -d .sidegraph ]; then
|
|
334
|
+
echo "no .sidegraph in this checkout — anchor health not applicable"
|
|
335
|
+
exit 0
|
|
336
|
+
fi
|
|
337
|
+
uvx --from graphifyy==0.9.6 graphify update .
|
|
338
|
+
uv sync --locked
|
|
339
|
+
uv run sidegraph-sync --json --check
|
|
@@ -37,7 +37,8 @@ Python 3.13+; `uv`:
|
|
|
37
37
|
- `uv run pre-commit run --all-files`: shared lint/format/type/secret-scanning gate (also
|
|
38
38
|
runs `gitleaks`, `detect-private-key`, `zizmor`, `actionlint`, `check-toml`, and a
|
|
39
39
|
`uv.lock`-in-sync check).
|
|
40
|
-
- `uv run sidegraph-mcp`: stdio server; `uv build`: distributions.
|
|
40
|
+
- `uv run sidegraph-mcp`: stdio server; `uv build`: distributions. `python -m sidegraph.server`
|
|
41
|
+
runs the same server without host identity (session ids on writes stay null).
|
|
41
42
|
|
|
42
43
|
Use four spaces, type hints, docstrings, snake_case functions/modules, PascalCase classes,
|
|
43
44
|
and Ruff's 100-character limit. End text files with a newline.
|
|
@@ -7,6 +7,181 @@ interfaces, exactly, and what each one promises: [`docs/reference/stability.md`]
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.13.0] — 2026-10-14
|
|
11
|
+
|
|
12
|
+
### Fixed
|
|
13
|
+
|
|
14
|
+
- On Windows, hooks misread the payload the host sends when a path in it has a non-ASCII
|
|
15
|
+
character (an accented or Cyrillic user name or project folder). The Stop capture reminder
|
|
16
|
+
never fired, PreToolUse delivered no records, and for some names SessionStart and
|
|
17
|
+
SubagentStart printed nothing.
|
|
18
|
+
- On Windows, a non-ASCII git user name, branch name or repository path was read back garbled:
|
|
19
|
+
a ratified record could carry a garbled name in its provenance, and `sidegraph-verify
|
|
20
|
+
--against` failed or reported false changes for records containing non-ASCII text.
|
|
21
|
+
- A change to a file whose name has non-ASCII characters, spaces or quotes was missed by the
|
|
22
|
+
drift check and the commit-trailer candidates, because git escaped the name.
|
|
23
|
+
- On Windows, a Codex hook started from a subdirectory of a repository whose path has non-ASCII
|
|
24
|
+
characters now runs from the repository root.
|
|
25
|
+
- A default Git for Windows install no longer breaks the MCP server. Its installer puts only
|
|
26
|
+
`Git\cmd` on PATH, which has no `sh`, so the server, which started with `sh`, did not start.
|
|
27
|
+
The Codex hooks have a Windows command for the same reason (see Changed).
|
|
28
|
+
- The project's ratify policy now applies under Codex. `sidegraph-init` commits it to
|
|
29
|
+
`.claude/settings.json`, which Codex does not read, so under Codex every agent proposal
|
|
30
|
+
waited for review whatever the team chose. The plugin's MCP server now reads the committed
|
|
31
|
+
value when its environment sets none; an explicit `SIDEGRAPH_RATIFY_POLICY` still wins.
|
|
32
|
+
|
|
33
|
+
### Changed
|
|
34
|
+
|
|
35
|
+
- The plugins launch without `sh` on PATH. Both MCP launchers start `uvx` (`uv` in the
|
|
36
|
+
development manifest) directly, and `sidegraph-mcp --repo-root` anchors the server to the
|
|
37
|
+
project: `CLAUDE_PROJECT_DIR`, else the git top-level, else the working directory. The Codex
|
|
38
|
+
hooks gain a PowerShell `commandWindows` that Windows PowerShell 5.1 parses. On native Windows
|
|
39
|
+
you need no PATH change and no PowerShell 7; Git for Windows at its default options is
|
|
40
|
+
enough. The Codex hooks need a Codex release that supports `commandWindows` (verified with
|
|
41
|
+
0.162.1). The Windows hook definition changes, so approve the changed hooks once in `/hooks`
|
|
42
|
+
on Windows; other platforms are unaffected.
|
|
43
|
+
- The optional terminal CLI now installs from the same place as the plugin, the public
|
|
44
|
+
repository's `main` branch: `uv tool install git+https://github.com/SantyagoSeaman/sidegraph.git@main`,
|
|
45
|
+
updated after each release with `uv tool upgrade sidegraph`. The docs no longer send you to
|
|
46
|
+
PyPI for it; PyPI still carries every release for pinning an exact version. The `path-skew`
|
|
47
|
+
SessionStart line now offers `uv tool install --reinstall git+https://github.com/SantyagoSeaman/sidegraph.git@main`,
|
|
48
|
+
which moves an older install from PyPI, pinned or not, to the latest release.
|
|
49
|
+
- README: the Quickstart is one numbered sequence with the plugin commands inline, a teammate
|
|
50
|
+
path, and the rarer options below it; "How it works" is a numbered list instead of a diagram.
|
|
51
|
+
|
|
52
|
+
## [0.12.0] — 2026-10-12
|
|
53
|
+
|
|
54
|
+
### Fixed
|
|
55
|
+
|
|
56
|
+
- The Codex plugin's `SessionStart` hook now starts on native Windows. Its command used POSIX
|
|
57
|
+
syntax (`VAR=value command`, `$(...)`) that the PowerShell Codex runs hooks in cannot parse, so
|
|
58
|
+
Windows sessions showed "the SessionStart hook could not start" although the entry point itself
|
|
59
|
+
worked when run directly. It is now wrapped in `sh -c`, like the `Stop` and `SubagentStart`
|
|
60
|
+
hooks, and keeps the same message if the launch fails. Codex records trust per hook definition,
|
|
61
|
+
so approve the changed `SessionStart` hook once in `/hooks`. On Windows the Codex hooks need
|
|
62
|
+
PowerShell 7: Codex runs hooks in PowerShell, and Windows PowerShell 5.1 cannot run them.
|
|
63
|
+
- On native Windows, `sidegraph-import` now imports the documents a profile covers: their
|
|
64
|
+
repo-relative paths were built with backslashes, so every in-repo document was counted as
|
|
65
|
+
outside the profile and nothing was imported. Record keys, anchor lookups and `provenance.ref`
|
|
66
|
+
now use the POSIX path Graphify's `source_file` carries, so a later re-import on another
|
|
67
|
+
platform does not duplicate records going forward, and a symlink that resolves outside the
|
|
68
|
+
repository is refused there as on other platforms. A document on another drive than the
|
|
69
|
+
repository no longer crashes the import. A store that already holds backslash-keyed records
|
|
70
|
+
from an earlier Windows `--any-doc` import gets a second, POSIX-keyed record for the same
|
|
71
|
+
document on re-import; supersede the old ones.
|
|
72
|
+
- On native Windows, records are now delivered before a Read, Edit, Write or Grep, and before a
|
|
73
|
+
Bash `cat`, `sed`, `grep` or `rg`, and a subagent brief's files find their records. These paths
|
|
74
|
+
were built with backslashes (`src\sample.py`) and never matched the POSIX paths anchors use.
|
|
75
|
+
Touch events and the usage statistics now record POSIX paths, and `query_decisions(files=…)`
|
|
76
|
+
without a graph finds the file's records. A root-level file whose name starts with `..` is no
|
|
77
|
+
longer mistaken for a path outside the repository. Hooks now key a Windows session by its
|
|
78
|
+
transcript file name, as on other platforms, instead of the whole `C:\…` path, so hook showings,
|
|
79
|
+
touch events and capture state join the session the MCP server attributes calls to.
|
|
80
|
+
- The 40,000-character hard cap on `get_task_context` and `query_decisions` now keeps its advice
|
|
81
|
+
blocks (how the seeds were read, what is not in the graph, the supersede hint) when a record's
|
|
82
|
+
text contains a `## ` line or a seed path is absurdly long, and the closing note names what was
|
|
83
|
+
cut. Seed paths echoed in those blocks are clipped to their head and file name. The usage
|
|
84
|
+
statistics count only the records left in the text after the cap, nearest-anchored records
|
|
85
|
+
included, and a worktree seed written as an absolute or nested path is journaled as the
|
|
86
|
+
repo-relative path the answer shows. A record spanning several lines is cut whole, never
|
|
87
|
+
without its id line, and `degraded` and `chars_used` describe the delivered text too. The
|
|
88
|
+
bound-record count of the nearest-anchored block reads "at least N" for a path whose bound
|
|
89
|
+
records include some of the nearest records shown.
|
|
90
|
+
- `drill_down` bounds the whole answer, not only the decisions: a domain summary, titles and member
|
|
91
|
+
lines too long for `budget_chars` (measured as serialized JSON, a slug included) are clipped with a
|
|
92
|
+
marker, and subdomains or members that do not fit are left out with `subdomains_omitted` /
|
|
93
|
+
`members_omitted` counts and a `hint`.
|
|
94
|
+
- `sidegraph-doctor` no longer crashes on an `index.db` that has `anchor_bindings` but no `meta`
|
|
95
|
+
table: such an index counts as having its binding statuses computed, so the checks run. Only an
|
|
96
|
+
unreadable index is reported as skipped.
|
|
97
|
+
- `sidegraph-doctor` no longer reports zero `degraded-binding`/`orphaned-binding` findings while
|
|
98
|
+
binding statuses are not computed for the current graph (after an index reload and before the
|
|
99
|
+
next `sidegraph-sync`). It lists `binding-status` among the skipped checks, and the text
|
|
100
|
+
line for it and `orphaned-records` no longer blames a missing `index.db`.
|
|
101
|
+
- `get_task_context` no longer calls a real file of a sibling linked worktree "not a
|
|
102
|
+
repo-relative path", guesses it to be a same-named graph file, or reads a nested worktree path
|
|
103
|
+
as the main checkout's file. It names the worktree and branch; a well-formed path that is a file in no checkout is "not a
|
|
104
|
+
file in this checkout", and only malformed paths keep the old sentence. A path with records
|
|
105
|
+
bound to a file the graph lacks and not shown elsewhere in the answer says so in the
|
|
106
|
+
nearest-anchored block, and
|
|
107
|
+
`retrieve_decisions(files=[...])` reads such a path exactly.
|
|
108
|
+
- Attribute each MCP call to its own session instead of the last `SessionStart` of any host
|
|
109
|
+
in the repository. A write that omits `session_id` and a retrieval-journal row now carry the
|
|
110
|
+
calling host's session: `CLAUDE_CODE_SESSION_ID` for Claude Code (2.1.154 or later for exact
|
|
111
|
+
attribution, 2.1.163 or later to keep one id across `--resume`) and the request `threadId`
|
|
112
|
+
for Codex. A client that names its host but no session falls back to the one fresh stamp of
|
|
113
|
+
the same host family, else to nothing; a retrieval that cannot be attributed is journaled as
|
|
114
|
+
`unattributed` and `sidegraph-stats` reports those calls instead of counting their sessions
|
|
115
|
+
as silent. The `sidegraph-mcp` console script moves to `sidegraph.host.mcp_entry:main`
|
|
116
|
+
(the command name is unchanged; `python -m sidegraph.server` still starts the server, without
|
|
117
|
+
host identity). Hook commands set the new `SIDEGRAPH_HOST` variable. Hand-written
|
|
118
|
+
SessionStart wiring should add `SIDEGRAPH_HOST=claude` or `SIDEGRAPH_HOST=codex`.
|
|
119
|
+
- Serialize Store state checks and publication behind a SQLite writer reservation,
|
|
120
|
+
including pending verdicts and server-side domain/fact preconditions. Busy admission
|
|
121
|
+
reports conservative inspect-before-retry guidance; file and index commits remain
|
|
122
|
+
separate operations.
|
|
123
|
+
- Read graph/label JSON and Claude settings as UTF-8 independently of the default locale;
|
|
124
|
+
retry incomplete graph encodings and close temporary descriptors on setup failures.
|
|
125
|
+
- Isolate noninteractive Git subprocess stdin from the MCP protocol pipe, resolving
|
|
126
|
+
native Windows first-write stalls in the installed-wheel stdio checks.
|
|
127
|
+
- Set MCP `isError` for complete anchor-operation failures while retaining structured
|
|
128
|
+
payloads and partial-batch outcomes. Unknown tool names receive bounded discovery advice.
|
|
129
|
+
|
|
130
|
+
### Changed
|
|
131
|
+
|
|
132
|
+
- The Quickstart no longer installs the CLI for plugin users: its commands run through `uvx`,
|
|
133
|
+
as the plugin does. `uv tool install sidegraph` is documented as optional beside a plugin
|
|
134
|
+
and the usual setup without one, and its install now includes a mandatory update after every
|
|
135
|
+
release, `uv tool install sidegraph@latest`. The plugin's skills run every
|
|
136
|
+
`sidegraph-*` command at the session's version through `uvx` and never the copy on `PATH`.
|
|
137
|
+
- The PreToolUse hook records what it hands over as showings: each record printed in a
|
|
138
|
+
file-read block (`inject`) or appended to a subagent's brief (`inject_brief`) is journaled
|
|
139
|
+
and bumps `retrieval_shows`. `sidegraph-stats` gains a `record showings delivered by hooks`
|
|
140
|
+
line (`activation.hook_showings` in `--json`), and `no recorded showing` and the doctor's
|
|
141
|
+
`never-surfaced` check count a record the hook printed as shown. Upgrade `sidegraph-stats`
|
|
142
|
+
together with the plugin: an older CLI reads the new journal rows as memory lookups.
|
|
143
|
+
The Agent-brief path, read-only until now, writes one transaction (up to the one-second busy
|
|
144
|
+
timeout under a held lock; a failed write never costs the brief).
|
|
145
|
+
- Bound the output of five listing tools. `list_facts`, `get_entity_history`, `drill_down`,
|
|
146
|
+
`list_domain_candidates` and `list_proposed` now take `budget_chars` (default 24000,
|
|
147
|
+
maximum 40000) and say what was left out and how to narrow; `list_facts` gains `status`,
|
|
148
|
+
`files`, `query`, `ids` and `limit`, and `get_entity_history` gains `status` and `limit`.
|
|
149
|
+
Before, a store with a few hundred facts or a long-lived entity produced answers (up to
|
|
150
|
+
170,000 characters) that Claude Code replaced with an "exceeds maximum allowed tokens"
|
|
151
|
+
notice. **Return shapes change:** `list_facts` and `get_entity_history` return a JSON
|
|
152
|
+
object instead of a list; `drill_down` and `list_domain_candidates` add
|
|
153
|
+
`hint`/`truncated`-style fields (`omitted_ids`, `omitted_by_budget`); the first four are sent
|
|
154
|
+
once, as text, with no `structuredContent` copy. `list_domain_candidates` shows fewer
|
|
155
|
+
candidates by default (the budget cuts first; narrow with `paths`; `limit=0` still lifts the
|
|
156
|
+
count limit). `retrieve_decisions`'s maximum `budget_chars` falls from 60000 to 40000, below
|
|
157
|
+
Claude Code's 50,000-character limit, and `get_task_context`, `query_structure`,
|
|
158
|
+
`query_decisions` and `list_proposed` never return more than 40,000 characters (a cut says
|
|
159
|
+
so in a closing note and keeps the advice blocks).
|
|
160
|
+
- Text-only MCP tools `get_task_context`, `query_structure`, `query_decisions`, and
|
|
161
|
+
`list_proposed` no longer advertise an output schema or duplicate text in
|
|
162
|
+
`structuredContent`. Machine-oriented dictionary results retain their schemas.
|
|
163
|
+
- Bound supported dependency majors to FastMCP 3 (`>=3.4.2`) and MCP Python SDK 1 (`>=1.24`).
|
|
164
|
+
|
|
165
|
+
### Added
|
|
166
|
+
|
|
167
|
+
- A SessionStart advisory, `path-skew`, on macOS and Linux, when a `sidegraph-*` command on
|
|
168
|
+
`PATH` (outside the session's own environment) is a different version than the session, such
|
|
169
|
+
as a forgotten `uv tool install sidegraph`. It reads the install's dist-info and runs nothing.
|
|
170
|
+
- Per-process MCP tool admission: burst 200, refill 100 calls/second, immediate refusal
|
|
171
|
+
before tool work; initialization, ping, and discovery remain available.
|
|
172
|
+
- Native Windows x64 CI for Python 3.13/3.14, covering selected core/MCP contracts and
|
|
173
|
+
an exact installed-wheel CLI/stdio probe outside the checkout.
|
|
174
|
+
|
|
175
|
+
### Documentation
|
|
176
|
+
|
|
177
|
+
- Reorganize the README around setup, usage, limits, and contribution paths; remove
|
|
178
|
+
unsupported comparisons and clarify the runtime versus host data boundary.
|
|
179
|
+
- Document tested platform coverage, the locked MCP protocol range, result error
|
|
180
|
+
handling, and recovery after a cancelled write. Align guides and reference pages
|
|
181
|
+
with the current release and stability policies.
|
|
182
|
+
- Explain Windows plugin shell/PATH requirements, WSL setup, native MCP-only limits,
|
|
183
|
+
and the distinction between core/wheel CI and full agent-plugin validation.
|
|
184
|
+
|
|
10
185
|
## [0.11.1] — 2026-10-10
|
|
11
186
|
|
|
12
187
|
### Fixed
|
|
@@ -13,7 +13,7 @@ task-aware retrieval + decision memory riding on the engine's entity graph.
|
|
|
13
13
|
continuing participant in the project. A core feature must preserve, organize, or deliver
|
|
14
14
|
accumulated project understanding. Document search by itself is not the product.
|
|
15
15
|
|
|
16
|
-
Sidegraph is pre-1.0 (v0.
|
|
16
|
+
Sidegraph is pre-1.0 (v0.13.0) — the full loop (capture, ratification, mistakes-first
|
|
17
17
|
retrieval, refactor-surviving re-anchoring, semantic docs layer, mind-model domains, and the
|
|
18
18
|
facts evidence layer) ships and is exercised end-to-end, but interfaces may still move before
|
|
19
19
|
a stable release. See
|
|
@@ -60,6 +60,8 @@ src/sidegraph/
|
|
|
60
60
|
│ └── reader.py # GraphifyReader: reads graph.json (read-only input; no MCP)
|
|
61
61
|
└── host/ # ── HOST SEAM ── Claude Code integration (SessionStart/Stop/PreToolUse/SubagentStart)
|
|
62
62
|
├── hooks.py # host-specific; portable core never reaches in here
|
|
63
|
+
├── mcp_entry.py # `sidegraph-mcp` entry: server + session-binding middleware
|
|
64
|
+
├── session_identity.py # Claude/Codex session id from clientInfo, env, _meta
|
|
63
65
|
└── subagent.py # SubagentStart: the memory brief for a starting subagent
|
|
64
66
|
```
|
|
65
67
|
|
|
@@ -103,6 +105,7 @@ uv run pytest -m "not slow" # broader pre-push check: skips subprocess-h
|
|
|
103
105
|
uv run pytest # full suite: once before a commit or PR (CI runs it again)
|
|
104
106
|
uv run pre-commit run --all-files # lint + format + types, exactly what CI runs
|
|
105
107
|
uv run sidegraph-mcp # run the decision MCP server (stdio)
|
|
108
|
+
# (`python -m sidegraph.server`: same server, no host identity)
|
|
106
109
|
```
|
|
107
110
|
|
|
108
111
|
## Working agreements
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Contributing
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
Contributions are welcome: bug reports, documentation improvements, tests, and code
|
|
4
|
+
changes. For substantial changes, open an issue first to discuss the problem and scope.
|
|
5
5
|
|
|
6
6
|
## How this repository works
|
|
7
7
|
|
|
@@ -10,15 +10,15 @@ replaces its tree wholesale from the upstream working repo. That has one practic
|
|
|
10
10
|
consequence for you:
|
|
11
11
|
|
|
12
12
|
- **Issues are the best channel** — bug reports, feature requests and questions are read here.
|
|
13
|
-
- **Pull requests are ported upstream, not merged here.** A
|
|
14
|
-
|
|
13
|
+
- **Pull requests are ported upstream, not merged here.** A change applied only to this snapshot would not be
|
|
14
|
+
included in the next release tree. Open the PR anyway if you have a patch: it will be reviewed here,
|
|
15
15
|
applied upstream with attribution, and it will arrive back in this repo with the next release.
|
|
16
16
|
|
|
17
17
|
## Development setup
|
|
18
18
|
|
|
19
19
|
```bash
|
|
20
20
|
git clone https://github.com/SantyagoSeaman/sidegraph.git && cd sidegraph
|
|
21
|
-
uv sync
|
|
21
|
+
uv sync --locked # runtime + dev dependencies (Python 3.13+)
|
|
22
22
|
uv run pre-commit install # once per clone — the lint gate runs before each commit
|
|
23
23
|
uv run pytest tests/test_store.py -q -x --lf # while editing: the touched file
|
|
24
24
|
uv run pytest -m "not slow" # broader pre-push check: skips subprocess-heavy tests, still takes minutes
|
|
@@ -26,7 +26,6 @@ uv run pytest -q # full suite: run before a commit or PR, must be
|
|
|
26
26
|
uv run pre-commit run --all-files # lint + format + types + staged secrets
|
|
27
27
|
```
|
|
28
28
|
|
|
29
|
-
|
|
30
29
|
The Gitleaks commit hook scans staged content even when all changed paths are excluded from
|
|
31
30
|
formatting, including `.sidegraph/`. `--all-files` does not turn it into a committed scan.
|
|
32
31
|
CI additionally scans all history reachable from HEAD with the same pinned scanner:
|
|
@@ -56,6 +55,18 @@ That gate also runs secret detection (`gitleaks`, `detect-private-key`), GitHub
|
|
|
56
55
|
security/correctness checks (`zizmor`, `actionlint`), and `check-toml`/a `uv.lock`-in-sync
|
|
57
56
|
check, alongside the usual formatting and type checks.
|
|
58
57
|
|
|
58
|
+
## Preparing a pull request
|
|
59
|
+
|
|
60
|
+
Describe the problem, the resulting behavior, and the checks you ran. Link the related
|
|
61
|
+
issue when there is one, keep the patch focused, and update affected documentation.
|
|
62
|
+
Use an area-prefixed imperative commit subject, for example `store: preserve history`,
|
|
63
|
+
and sign off each commit as described below.
|
|
64
|
+
|
|
65
|
+
CI runs the full suite on Linux/Python 3.13 and 3.14 and a selected native Windows
|
|
66
|
+
core/MCP suite on both versions; see [platform coverage](docs/getting-started/installation.md#platform-coverage).
|
|
67
|
+
If your change touches paths, permissions,
|
|
68
|
+
subprocesses, or shell commands, describe any additional platform checks you performed.
|
|
69
|
+
|
|
59
70
|
## Ground rules
|
|
60
71
|
|
|
61
72
|
- **Tests first for behavior changes.** Schema invariants and store write-path rules are
|