sidegraph 0.8.0__tar.gz → 0.9.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.8.0 → sidegraph-0.9.0}/CHANGELOG.md +220 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/CLAUDE.md +6 -3
- {sidegraph-0.8.0 → sidegraph-0.9.0}/PKG-INFO +5 -3
- {sidegraph-0.8.0 → sidegraph-0.9.0}/README.md +2 -2
- {sidegraph-0.8.0 → sidegraph-0.9.0}/docs/concepts/data-model.md +1 -1
- {sidegraph-0.8.0 → sidegraph-0.9.0}/docs/getting-started/bootstrap.md +1 -1
- {sidegraph-0.8.0 → sidegraph-0.9.0}/docs/getting-started/claude-code-setup.md +89 -14
- {sidegraph-0.8.0 → sidegraph-0.9.0}/docs/getting-started/codex-setup.md +25 -9
- {sidegraph-0.8.0 → sidegraph-0.9.0}/docs/getting-started/installation.md +19 -8
- {sidegraph-0.8.0 → sidegraph-0.9.0}/docs/getting-started/quickstart.md +9 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/docs/guides/retrieval-in-sessions.md +4 -3
- {sidegraph-0.8.0 → sidegraph-0.9.0}/docs/guides/troubleshooting.md +118 -12
- {sidegraph-0.8.0 → sidegraph-0.9.0}/docs/integrations/claude-code.md +87 -30
- {sidegraph-0.8.0 → sidegraph-0.9.0}/docs/integrations/codex.md +46 -14
- {sidegraph-0.8.0 → sidegraph-0.9.0}/docs/integrations/graphify.md +20 -10
- {sidegraph-0.8.0 → sidegraph-0.9.0}/docs/llms.txt +2 -2
- {sidegraph-0.8.0 → sidegraph-0.9.0}/docs/reference/cli.md +15 -9
- {sidegraph-0.8.0 → sidegraph-0.9.0}/docs/reference/configuration.md +10 -8
- sidegraph-0.9.0/docs/reference/hooks.md +928 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/docs/reference/mcp-tools.md +12 -4
- {sidegraph-0.8.0 → sidegraph-0.9.0}/docs/reference/operations.md +15 -8
- {sidegraph-0.8.0 → sidegraph-0.9.0}/docs/reference/releasing.md +5 -3
- {sidegraph-0.8.0 → sidegraph-0.9.0}/docs/reference/stability.md +3 -3
- {sidegraph-0.8.0 → sidegraph-0.9.0}/docs/reference/store-format.md +34 -10
- {sidegraph-0.8.0 → sidegraph-0.9.0}/plugin/sidegraph/.claude-plugin/plugin.json +1 -1
- {sidegraph-0.8.0 → sidegraph-0.9.0}/plugin/sidegraph/.codex-plugin/plugin.json +1 -1
- sidegraph-0.9.0/plugin/sidegraph/codex/hooks.json +34 -0
- sidegraph-0.9.0/plugin/sidegraph/hooks/hooks.json +79 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/plugin/sidegraph/skills/record-decision/SKILL.md +1 -1
- {sidegraph-0.8.0 → sidegraph-0.9.0}/plugin/sidegraph/skills/record-fact/SKILL.md +4 -3
- {sidegraph-0.8.0 → sidegraph-0.9.0}/plugin/sidegraph/skills/setup/SKILL.md +14 -3
- {sidegraph-0.8.0 → sidegraph-0.9.0}/pyproject.toml +6 -1
- sidegraph-0.9.0/src/sidegraph/__init__.py +76 -0
- sidegraph-0.9.0/src/sidegraph/bash_paths.py +553 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/bootstrap/integrations.py +11 -2
- {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/capture.py +1 -1
- {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/cli.py +24 -4
- {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/config.py +2 -2
- {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/doctor.py +59 -7
- {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/host/claude_settings.py +137 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/host/hooks.py +841 -277
- sidegraph-0.9.0/src/sidegraph/host/launch.py +106 -0
- sidegraph-0.9.0/src/sidegraph/host/subagent.py +100 -0
- sidegraph-0.9.0/src/sidegraph/hot_index.py +321 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/integrity.py +23 -15
- {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/retrieval.py +12 -65
- {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/schema.py +4 -29
- {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/server.py +79 -6
- {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/store.py +307 -144
- sidegraph-0.9.0/src/sidegraph/store_layout.py +191 -0
- sidegraph-0.9.0/src/sidegraph/text_paths.py +176 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/verify.py +39 -14
- sidegraph-0.9.0/tests/test_agent_brief_manifests.py +79 -0
- sidegraph-0.9.0/tests/test_bash_paths.py +336 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_bootstrap_integrations.py +64 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_cli_compact.py +32 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_cli_doctor.py +17 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_codex_plugin.py +3 -3
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_doctor.py +33 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_hook_spawn_guard.py +15 -12
- sidegraph-0.9.0/tests/test_host_agent_brief.py +490 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_host_agent_state.py +48 -42
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_host_integrity.py +48 -9
- sidegraph-0.9.0/tests/test_host_launch.py +331 -0
- sidegraph-0.9.0/tests/test_host_pretool.py +372 -0
- sidegraph-0.9.0/tests/test_host_pretool_records.py +771 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_host_stop.py +141 -2
- sidegraph-0.9.0/tests/test_host_subagent_start.py +304 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_host_subdirectory_launch.py +4 -2
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_host_touch_events.py +16 -2
- sidegraph-0.9.0/tests/test_host_wiring_checks.py +719 -0
- sidegraph-0.9.0/tests/test_hot_index.py +642 -0
- sidegraph-0.9.0/tests/test_hot_index_hook.py +173 -0
- sidegraph-0.9.0/tests/test_hot_path_imports.py +319 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_integrity.py +35 -0
- sidegraph-0.9.0/tests/test_lazy_root.py +49 -0
- sidegraph-0.9.0/tests/test_public_hook_launch.py +445 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_ratify_policy.py +21 -13
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_server_add_anchors.py +27 -0
- sidegraph-0.9.0/tests/test_server_refresh.py +208 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_server_supersede.py +82 -1
- sidegraph-0.9.0/tests/test_stop_hot_path.py +80 -0
- sidegraph-0.9.0/tests/test_stop_rearm.py +505 -0
- sidegraph-0.9.0/tests/test_store_bad_file.py +590 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_store_compact_review.py +5 -2
- sidegraph-0.9.0/tests/test_subagent_start_manifests.py +62 -0
- sidegraph-0.9.0/tests/test_text_paths.py +414 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_verify_snapshot.py +166 -1
- {sidegraph-0.8.0 → sidegraph-0.9.0}/uv.lock +5 -1
- sidegraph-0.8.0/docs/reference/hooks.md +0 -566
- sidegraph-0.8.0/plugin/sidegraph/codex/hooks.json +0 -24
- sidegraph-0.8.0/plugin/sidegraph/hooks/hooks.json +0 -35
- sidegraph-0.8.0/src/sidegraph/__init__.py +0 -37
- sidegraph-0.8.0/tests/test_host_pretool.py +0 -379
- {sidegraph-0.8.0 → sidegraph-0.9.0}/.agents/plugins/marketplace.json +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/.claude-plugin/marketplace.json +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/.github/CODEOWNERS +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/.github/secret_scanning.yml +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/.github/workflows/ci.yml +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/.github/workflows/publish.yml +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/.github/workflows/scorecard.yml +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/.github/workflows/session-link-gate.yml +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/.gitignore +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/.gitleaks.toml +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/.pre-commit-config.yaml +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/.python-version +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/AGENTS.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/CODE_OF_CONDUCT.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/CONTRIBUTING.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/LICENSE +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/SECURITY.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/docs/README.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/docs/concepts/anchoring.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/docs/concepts/decision-memory.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/docs/concepts/mind-model.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/docs/concepts/retrieval.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/docs/guides/capturing-decisions.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/docs/guides/ci-cd-maintenance.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/docs/guides/naming-your-domains.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/docs/guides/semantic-docs.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/docs/guides/surviving-refactors.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/docs/guides/team-workflow.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/docs/guides/verifying-your-setup.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/docs/pilot-kit/README.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/docs/pilot-kit/corpus_fit.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/docs/pilot-kit/judge-prompt.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/docs/pilot-kit/questions-prompt.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/docs/pilot-kit/rubric-template.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/docs/reference/git-bindings.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/docs/whitepaper/index.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/plugin/sidegraph/.mcp.json +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/plugin/sidegraph/codex/mcp.json +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/plugin/sidegraph/skills/check-plan/SKILL.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/plugin/sidegraph/skills/check-plan/agents/openai.yaml +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/plugin/sidegraph/skills/explain-why/SKILL.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/plugin/sidegraph/skills/explain-why/agents/openai.yaml +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/plugin/sidegraph/skills/heal-anchors/SKILL.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/plugin/sidegraph/skills/heal-anchors/agents/openai.yaml +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/plugin/sidegraph/skills/import-adrs/SKILL.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/plugin/sidegraph/skills/import-adrs/agents/openai.yaml +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/plugin/sidegraph/skills/manage-domains/SKILL.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/plugin/sidegraph/skills/manage-domains/agents/openai.yaml +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/plugin/sidegraph/skills/name-domains/SKILL.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/plugin/sidegraph/skills/name-domains/agents/openai.yaml +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/plugin/sidegraph/skills/ratify-decisions/SKILL.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/plugin/sidegraph/skills/ratify-decisions/agents/openai.yaml +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/plugin/sidegraph/skills/record-decision/agents/openai.yaml +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/plugin/sidegraph/skills/record-fact/agents/openai.yaml +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/plugin/sidegraph/skills/setup/agents/openai.yaml +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/plugin/sidegraph/skills/stats/SKILL.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/plugin/sidegraph/skills/stats/agents/openai.yaml +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/plugin/sidegraph/skills/triage-drift/SKILL.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/plugin/sidegraph/skills/triage-drift/agents/openai.yaml +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/anchoring.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/bootstrap/__init__.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/bootstrap/apply.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/bootstrap/catalog.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/bootstrap/cli.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/bootstrap/model.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/bootstrap/planner.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/bootstrap/proof.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/bootstrap/review.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/bootstrap/scan.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/doc_import.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/domains.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/engine/__init__.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/engine/reader.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/freshness.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/gitenv.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/githooks.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/gitio.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/host/__init__.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/importer.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/nearest_anchored.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/okf.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/profiles.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/seed_ladder.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/stats/__init__.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/stats/model.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/stats/render.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/sync.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/viz/__init__.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/viz/assets/vis-network.min.js +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/viz/model.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/viz/render.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/viz/template.html +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/__init__.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/conftest.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/auto_policy/parity_goldens.json +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/bitfinex_slice.json +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/bootstrap/flows/bmad/_bmad-output/planning-artifacts/architecture/cache/ARCHITECTURE-SPINE.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/bootstrap/flows/generic-adr/docs/adr/001-retry.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/bootstrap/flows/genkovich-sdd/docs/features/cache/adr/001.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/bootstrap/flows/spec-kit/specs/cache/plan.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/bootstrap/flows/superpowers/docs/superpowers/specs/2026-07-01-cache-design.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/bootstrap/graph.json +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/bootstrap/hosts/claude/.claude/settings.json +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/bootstrap/hosts/claude/.mcp.json +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/bootstrap/hosts/codex/.codex/config.toml +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/bootstrap/hosts/codex/.codex/hooks/hooks.json +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/bootstrap/scan/docs/adr/001-safe.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/corpus/PUBLIC_CORPORA.txt +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/corpus/openspec/_provenance.json +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/corpus/openspec/graph.json +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/corpus/self-corpus/_provenance.json +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/corpus/self-corpus/expected/retrieval-engine-reader.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/corpus/self-corpus/graph.json +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/flows/adr/0001-use-sessions.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/flows/bmad/ARCHITECTURE-SPINE.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/flows/bmad/tree/_bmad-output/planning-artifacts/architecture/architecture-payments-2026-07-30/.memlog.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/flows/bmad/tree/_bmad-output/planning-artifacts/architecture/architecture-payments-2026-07-30/ARCHITECTURE-SPINE.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/flows/bmad/tree/_bmad-output/planning-artifacts/prds/prd-payments-2026-07-30/prd.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/flows/genkovich/0001-queue-backpressure.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/flows/genkovich/sad.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/flows/genkovich/tree/docs/features/payments/adr/0001-queue-backpressure.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/flows/genkovich/tree/docs/features/payments/sad.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/flows/genkovich/tree/docs/features/payments/spec.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/flows/openspec/design-empty.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/flows/openspec/design-h3-split.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/flows/openspec/design-with-summary.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/flows/openspec/design.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/flows/openspec/proposal-alternatives.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/flows/openspec/proposal.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/design.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/proposal.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/specs/cap/spec.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/tasks.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/flows/openspec/tree/openspec/changes/archive/2026-01-01-add-thing/design.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/flows/openspec/tree/openspec/changes/archive/2026-01-01-add-thing/proposal.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/flows/openspec/tree/openspec/config.yaml +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/flows/openspec/tree/openspec/specs/cap/spec.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/flows/spec-kit/plan.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/flows/spec-kit/tree/specs/003-payment-retries/plan.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/flows/spec-kit/tree/specs/003-payment-retries/spec.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/flows/superpowers/2026-07-01-example-design.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/flows/superpowers/2026-07-01-thin-design.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/member_names_python_graph.json +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/member_names_swift_graph.json +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/mini_graph.json +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/githooks_support.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_anchoring.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_anchoring_mapping_refresh.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_bootstrap_apply.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_bootstrap_catalog.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_bootstrap_cli.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_bootstrap_model.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_bootstrap_planner.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_bootstrap_proof.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_bootstrap_review.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_bootstrap_scan.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_capture_auto_accept.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_capture_facts.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_capture_initiative.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_capture_integration.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_capture_neighbors.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_capture_propose.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_capture_redact.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_cli_domains.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_cli_graph_paths.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_cli_import.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_cli_init.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_cli_init_hooks.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_cli_okf.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_cli_ratify.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_cli_ratify_facts.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_cli_stats.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_cli_sync.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_cli_sync_check.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_cli_unreadable_paths.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_cli_viz.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_community_baseline.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_config.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_config_ancestor_lookup.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_config_borrowed_graph.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_corpus_expected_renders.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_corpus_self_corpus.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_coverage_telemetry_e2e.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_digest_integrity.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_doc_corpus_integration.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_doc_import.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_docs_claims.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_doctor_auto_share.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_doctor_code_drift.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_doctor_dangling_supports.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_doctor_duplicate_entity.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_doctor_graph_root_mismatch.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_doctor_graph_stale.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_doctor_integrity.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_doctor_never_surfaced.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_doctor_scan.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_doctor_stale_instructions.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_doctor_unratified_accept.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_domains.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_entity_duplicate_resolution.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_entity_get_or_create_race.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_env_isolation.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_fact_reachability_gate.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_flow_profile.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_git_bindings_blame.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_git_bindings_hook.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_git_bindings_provenance.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_git_config_isolation.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_git_env.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_githooks.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_graph_freshness.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_host_borrowed_graph.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_host_claude_settings.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_host_drift_nudge.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_host_session_key.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_host_session_start.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_host_session_start_concurrent.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_importer.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_integrity_refresh_hook.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_integrity_replay.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_integrity_stranded.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_member_anchor_wiring.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_mind_model_additive_fields.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_nearest_anchored.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_okf.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_openspec_profile.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_pathless_descriptor_adoption.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_pilot_kit_corpus_fit.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_proposal_lifecycle.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_ratify_listing_gone_dark.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_reader_community_labels.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_reader_doc_nodes.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_reader_graph.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_reader_integration.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_reader_member_name_lookup.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_reader_member_names.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_reader_nodes_in_file.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_reader_perf.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_reader_rationale.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_reader_read.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_reader_resolve.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_reader_subdir_mismatch.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_reader_version.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_redaction_seeded.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_repoint_integration.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_retrieval_budget_counters.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_retrieval_context.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_retrieval_drift_marker.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_retrieval_drilldown.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_retrieval_facts.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_retrieval_guessed.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_retrieval_ids.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_retrieval_integration.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_retrieval_rank.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_retrieval_seeds.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_retrieval_shown_ids.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_retrieval_terminal_evidence.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_retrieval_thin_tools.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_retrieval_toc.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_retrieval_toptier.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_retrieval_unratified.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_sandbox_hygiene.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_schema_descriptor.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_schema_domain.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_schema_fact.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_seed_ladder.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_server_anchoring.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_server_borrowed_graph.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_server_capture.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_server_commit_hint.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_server_coverage_events.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_server_domains.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_server_drilldown.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_server_facts.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_server_find_entity.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_server_get_store.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_server_get_task_context.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_server_graph_freshness.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_server_graph_path.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_server_import.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_server_mcp_smoke.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_server_nearest_anchored.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_server_prewrite_anchor_validation.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_server_ratify_facts.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_server_redaction.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_server_render_events.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_server_sync_anchors.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_server_telemetry.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_server_thin_tools.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_server_tolerant_seeds.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_server_verify.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_stats_graph.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_stats_health.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_stats_model.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_stats_render.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_stats_skill.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_stats_snapshot.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_store.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_store_agent_state.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_store_atomic_write_tmp_names.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_store_binding_index.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_store_canonical_stat.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_store_compact.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_store_concurrent_open.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_store_coverage_telemetry.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_store_derived_community.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_store_domains.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_store_entities.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_store_fact_cascade.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_store_facts.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_store_git_root_symlink.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_store_meta.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_store_migration.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_store_mutation_guard.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_store_mutation_immediate.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_store_opens_with_merged_duplicate.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_store_persistence.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_store_ratification.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_store_rebuild_atomicity.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_store_record_identity.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_store_render_events.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_store_retrieval.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_store_slug_conflicts.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_store_stamping_marker.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_store_symlinks.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_store_telemetry.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_store_threading.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_store_tmp_sweep_age.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_store_update_meta_if.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_sync_canonical_writes.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_sync_clean.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_sync_domains.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_sync_drift_cache.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_sync_fresh_clone.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_sync_integration.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_sync_moved_adoption.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_sync_rebind.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_sync_repoint.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_sync_report_has_findings.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_sync_run.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_sync_toc_cache.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_sync_volatile_heal.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_sync_wiring.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_telemetry_retention.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_verify_transitions.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_viz_asset_packaged.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_viz_model.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_viz_render_html.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_viz_render_json.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.9.0}/tools/check_no_session_links.py +0 -0
|
@@ -7,6 +7,226 @@ interfaces, exactly, and what each one promises: [`docs/reference/stability.md`]
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.9.0] — 2026-10-04
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- **Host wiring that silently switched memory off is now visible.** Two field failures went
|
|
15
|
+
unnoticed for weeks: hooks that ran an old install under a newer plugin, and sessions started in
|
|
16
|
+
a subdirectory where the plugin was off. `SessionStart` now prints `Sidegraph <version>` right
|
|
17
|
+
after the standing instruction, and two advisory checks report the wiring, each with a notice
|
|
18
|
+
at most once a day (`plugin-off-in-subdirectories` only when a nested directory's own settings
|
|
19
|
+
leave the plugin off).
|
|
20
|
+
- `version-skew` compares the running package with the plugin manifest under
|
|
21
|
+
`$CLAUDE_PLUGIN_ROOT` (or else `$PLUGIN_ROOT`, which Codex sets) by numeric parts, and says
|
|
22
|
+
which side is stale. It does not run without a plugin root, a manifest named `sidegraph`, or a
|
|
23
|
+
version.
|
|
24
|
+
- `plugin-off-in-subdirectories` applies Claude Code's settings model (a launch directory's own
|
|
25
|
+
project settings only, the repository root's `.claude/settings.local.json` for every launch,
|
|
26
|
+
`enabledPlugins` merged key by key over user settings) to the directories of the repository.
|
|
27
|
+
It reports a plugin enabled only in the root's `.claude/settings.json`, and nested directories
|
|
28
|
+
whose own `enabledPlugins` leave it off. User settings are read from
|
|
29
|
+
`$CLAUDE_CONFIG_DIR/settings.json` when that variable is set, else from `~/.claude/settings.json`. It also lists in `sidegraph-doctor` under the finding code
|
|
30
|
+
`plugin-off-in-subdirectories`, and **`--check` exits `2` on it** like any finding.
|
|
31
|
+
The getting-started pages now say that enabling the plugin at user scope, or in the root's
|
|
32
|
+
`.claude/settings.local.json`, covers every subdirectory, and the setup skill reads the doctor
|
|
33
|
+
finding. See [troubleshooting](docs/guides/troubleshooting.md#version-skew).
|
|
34
|
+
|
|
35
|
+
- **A subagent's brief carries the records for the files it names.** The task a subagent works
|
|
36
|
+
on is in the brief its parent wrote, which the `SubagentStart` brief cannot see. The
|
|
37
|
+
`sidegraph-pre-tool-use` entry point now also handles `Agent` (and `Task`, the older name): it
|
|
38
|
+
reads the files the brief names, and the files named in a `.md`, `.txt` or `.rst` document the
|
|
39
|
+
brief names (one hop, the first 64 KB), finds the records anchored to them, and returns the
|
|
40
|
+
call's own input with a block appended to `prompt` (`updatedInput`; no `permissionDecision`).
|
|
41
|
+
The subagent finds the block at the end of its first message. **The parent's view of its own
|
|
42
|
+
call does not show it**: its transcript keeps the prompt it wrote. A path resolves exactly when
|
|
43
|
+
it is an existing regular file inside the project root, and otherwise by a unique suffix among
|
|
44
|
+
the anchored files (`sub/x.py` for `pkg/sub/x.py`; an ambiguous suffix names nothing), tried
|
|
45
|
+
from the directory the agent was launched in before the root. A document is followed only when
|
|
46
|
+
it is a regular file inside the root, and **no hop goes through a project-instruction file**
|
|
47
|
+
(`CLAUDE.md`, `AGENTS.md` and their `.public` twins): they are still shown when records are
|
|
48
|
+
anchored to them, but the files they list are not followed. The block is grouped by file, two
|
|
49
|
+
records each, at most six record lines and 3,000 characters, and it ends with a
|
|
50
|
+
`More: get_task_context(files=[…])` line for the files shown; a file that misses the sixth
|
|
51
|
+
line by one still gets its first record there. It is **on by default**;
|
|
52
|
+
`SIDEGRAPH_AGENT_BRIEF=off` disables it. The plugin manifests (Claude Code only, the Codex ones
|
|
53
|
+
are unchanged) and the manual recipe gain a third `PreToolUse` group, matcher `Agent|Task`, on
|
|
54
|
+
the same command; a hand-wired setup needs that group added. Not tested: agent-team teammates
|
|
55
|
+
and `fork` spawns. See the
|
|
56
|
+
[hooks reference](docs/reference/hooks.md#subagent-briefs).
|
|
57
|
+
|
|
58
|
+
- **Every subagent starts knowing that memory exists and how to ask it.** A subagent gets no
|
|
59
|
+
`SessionStart` context, and Explore and Plan agents load no `CLAUDE.md` either, so nothing
|
|
60
|
+
standing told one that decision memory exists. The new `sidegraph-subagent-start` hook, wired
|
|
61
|
+
to `SubagentStart` in the Claude Code and Codex plugins, answers with a short brief: the same
|
|
62
|
+
standing `get_task_context(files=[…])` call `SessionStart` gives the main agent, and one
|
|
63
|
+
sentence of what memory holds ("N records anchored to code in M files, K of them recorded
|
|
64
|
+
mistakes"). The counts are what `get_task_context` could return: live records that may surface,
|
|
65
|
+
with a live or degraded binding to an entity that names a file. It carries no records, prints
|
|
66
|
+
`{}` where there is nothing anchored to code, and, like `PreToolUse`, reads the index directly
|
|
67
|
+
and builds no `Store`. `SIDEGRAPH_SUBAGENT_BRIEF=off` disables it. Codex records trust per hook
|
|
68
|
+
definition, so approve the new hook once in `/hooks`; manual recipes for both hosts gain the
|
|
69
|
+
entry. See the [hooks reference](docs/reference/hooks.md#sidegraph-subagent-start).
|
|
70
|
+
|
|
71
|
+
### Changed
|
|
72
|
+
|
|
73
|
+
- **The capture nudge comes back after more work, instead of firing once per session.** A session
|
|
74
|
+
that runs for a day and spawns subagents used to get one chance to record what it decided, at
|
|
75
|
+
its first substantial `Stop`, often before the work worth recording. A session that was already
|
|
76
|
+
nudged is now nudged again when at least 30 minutes have passed since its last nudge and at
|
|
77
|
+
least 10 commits authored since then are reachable from a local branch or `HEAD`; the text of
|
|
78
|
+
that nudge ends with `Since the last capture prompt: N commits.`, and the first nudge is
|
|
79
|
+
unchanged. The count is one `git log --branches HEAD`, run in the project the store belongs to
|
|
80
|
+
with a 2-second timeout, and it goes by author dates, so a rebase or cherry-pick of old commits
|
|
81
|
+
is not new work. A git failure means no re-arm. The last nudge is the meta key
|
|
82
|
+
`capture_rearm:<session>`, which the first nudge writes too and SessionStart expires after 30
|
|
83
|
+
days; a session captured by an older version has no key and counts from the `captured_at` of its
|
|
84
|
+
`capture_sessions` row. The new stamp is written with a compare-and-swap, so two parallel `Stop`
|
|
85
|
+
hooks cannot both nudge. A `Stop` inside the 30 minutes still exits on the read-only peek and
|
|
86
|
+
runs no git: a subprocess measured on a copy of this repository's store with a 1,000-commit
|
|
87
|
+
repository takes about 39 ms inside the gap and about 47 ms past it with too few commits. The
|
|
88
|
+
nudge's length bound is 850 characters, up from 800, for the added sentence. The count includes
|
|
89
|
+
commits that other sessions or people make on the same machine's branches.
|
|
90
|
+
`SIDEGRAPH_CAPTURE_NUDGE=off` silences re-armed nudges too. See the
|
|
91
|
+
[hooks reference](docs/reference/hooks.md#re-arm-after-more-work).
|
|
92
|
+
|
|
93
|
+
- **`PreToolUse` hands the agent the records of a file when it reads or edits it, instead of
|
|
94
|
+
asking it to fetch them.** The hook used to print a one-line nudge (a count, or the titles of
|
|
95
|
+
two records) and ask the agent to call `get_task_context`, which for a tool the host lists only
|
|
96
|
+
by name means loading it first. In the field study the one nudge that named a record worked and
|
|
97
|
+
the five that named counts did not, Edit and Write never nudged, and Bash, which is how current
|
|
98
|
+
Claude Code reads and searches, was never wired. The hook now prints the records themselves: the
|
|
99
|
+
guard line, then for each file a header and its top two records (three when the first two are
|
|
100
|
+
mistakes), each as `- [kind] title — first sentence of the choice (id …)`, accepted mistakes
|
|
101
|
+
first, proposals last and marked `[unratified]`, and a `More: get_task_context(files=[…])` line
|
|
102
|
+
when records were left out. It covers `Read`, `Grep`, `Edit` and `Write`, and four Bash read
|
|
103
|
+
commands, `sed`, `grep`, `rg` and `cat`, wired as four `if` entries on one command (`if` needs
|
|
104
|
+
Claude Code 2.1.89 for correct matching; an older host runs the hook on every Bash call, which
|
|
105
|
+
exits early with no output). A Bash line delivers the first three files it reads that have
|
|
106
|
+
records. Each file arrives once per agent, and an agent receives at most ten files: one SQL
|
|
107
|
+
statement counts and inserts a `pretool_file:<session>:<agent>:<path>` key, where `<agent>` is
|
|
108
|
+
`-` for the session's own agent, so concurrent hooks cannot exceed the cap. The counting form
|
|
109
|
+
(`this project has a decision memory … N domains, M decisions`) is gone, the `pretool_nudge:`
|
|
110
|
+
and `pretool_nudge_path:` keys are no longer written (SessionStart still prunes them, and the
|
|
111
|
+
new keys after 30 days), and a Bash read is still not a touch event. **`SIDEGRAPH_GREP_NUDGE=off`
|
|
112
|
+
keeps its name and now turns off all of this**, on every tool that reads (not the `Agent`
|
|
113
|
+
brief below, which has its own switch); it stops neither the hook from
|
|
114
|
+
launching on a Bash call nor touch recording. A subprocess median of nine on this repository's
|
|
115
|
+
store: about 26 ms when nothing is delivered, about 35 ms for a `Read` of the file with the most
|
|
116
|
+
records, about 38 ms for a Bash line naming three anchored files. A hand-wired
|
|
117
|
+
`.claude/settings.json` gains the Bash group (see the
|
|
118
|
+
[setup guide](docs/getting-started/claude-code-setup.md#2-add-the-hooks)). The `PreToolUse`
|
|
119
|
+
commands, in the plugin and in that snippet, no longer set `SIDEGRAPH_GRAPH`, which the hook
|
|
120
|
+
never read: Graphify's `graphify claude install` and `uninstall` remove a `Bash` entry whose
|
|
121
|
+
text mentions `graphify`, and would otherwise have removed the hand-wired group. See the
|
|
122
|
+
[hooks reference](docs/reference/hooks.md#sidegraph-pre-tool-use).
|
|
123
|
+
|
|
124
|
+
- **The plugin's hot hooks start from the commit `SessionStart` resolved, not from `@main`.**
|
|
125
|
+
`uv` re-resolves a branch reference on every call, about 0.8 s on a warm cache, and `Stop` and
|
|
126
|
+
`PreToolUse` run many times a session. `SessionStart` now records the commit `uv` resolved for
|
|
127
|
+
an `@main` install in `${XDG_CACHE_HOME:-$HOME/.cache}/sidegraph/launch-commit`: 40 hex bytes,
|
|
128
|
+
one file per machine, never written by an install pinned to a tag or SHA, an editable install
|
|
129
|
+
or a PyPI install. The public `Stop` and `PreToolUse` commands (Claude Code) and `Stop` (Codex)
|
|
130
|
+
launch `uvx --from` that commit, which `uv` serves from its cache in about 0.2 s, and fall back
|
|
131
|
+
to `@main` when there is no valid file, as before. A plugin pinned to a tag or commit ignores
|
|
132
|
+
the file and launches its own ref. `SessionStart` and the MCP server still run `@main`. A release therefore reaches a running session at the next `SessionStart` on the
|
|
133
|
+
machine, in any project and either host, not at its next hook call. The Codex `Stop` command is
|
|
134
|
+
wrapped in `sh -c '…'` so a fish login shell parses one literal. Codex records trust per hook
|
|
135
|
+
definition, so approve the changed `Stop` hook once in `/hooks`; the command no longer changes
|
|
136
|
+
between releases. `sidegraph-bootstrap`'s verification finds an entry point inside such a
|
|
137
|
+
`sh -c` script. See [troubleshooting](docs/guides/troubleshooting.md#the-launch-commit-file).
|
|
138
|
+
|
|
139
|
+
- **`PreToolUse` and `Stop` start about three times faster, and a tool call no longer creates a
|
|
140
|
+
store.** `import sidegraph.<anything>` used to load pydantic, ulid and every model, and
|
|
141
|
+
`PreToolUse` constructed a `Store`, which walks every record file, once for the touch row and
|
|
142
|
+
once for the nudge. The package root now resolves its re-exports on first access;
|
|
143
|
+
`PreToolUse` reads and writes `index.db` through one raw SQLite handle, with the same nudge
|
|
144
|
+
text, the same one-shot claim and the same touch row; and `Stop` imports `Store` only past its
|
|
145
|
+
early exits. On this repository's own store (about 1,500 record files), a subprocess median of
|
|
146
|
+
nine: a hook call that does nothing falls from about 83 ms to about 25 ms, an `Edit` from about
|
|
147
|
+
96 ms to about 30 ms, a `Read` from about 127 ms to about 35 ms, and the two `Stop` early exits
|
|
148
|
+
from about 87 ms to about 34 ms. The handle trusts the index as the last full open left it and
|
|
149
|
+
does nothing, printing `{}`, when the index is missing, a store-owned entry is a symlink, the
|
|
150
|
+
`schema_version` is not this version's, `retrieval_events` has no `agent` column, or opening it
|
|
151
|
+
fails. A `Store` open (a `SessionStart`, a command, a started MCP server) repairs a missing, empty or
|
|
152
|
+
older-layout index and refuses a symlinked entry or an unknown `schema_version`, as before; a
|
|
153
|
+
running server does not recreate a deleted index. A write that waits out the one-second lock timeout is not
|
|
154
|
+
retried in that run. **Behaviour change:** a `Read` or
|
|
155
|
+
`Edit` in a project without a store no longer creates `.sidegraph/`, and the nudge path no
|
|
156
|
+
longer prints "creating new store"; `SessionStart` and the MCP server still create the store.
|
|
157
|
+
A record that arrives mid-session can be missing from the nudge's titles until the next MCP
|
|
158
|
+
call. See the [hooks reference](docs/reference/hooks.md#sidegraph-pre-tool-use).
|
|
159
|
+
|
|
160
|
+
### Fixed
|
|
161
|
+
|
|
162
|
+
- **A finished background agent, an agent-team message or a `!` command's output no longer counts
|
|
163
|
+
as a typed prompt.** Claude Code writes each of these into the transcript as a `type: "user"`
|
|
164
|
+
line without the `isMeta` flag, so the `Stop` gate counted it: a session with one request and two
|
|
165
|
+
background agents passed the two-prompt gate at its first stop, and the capture nudge, which fires
|
|
166
|
+
once per session, was spent before there was anything to record. The gate now skips content that
|
|
167
|
+
starts `<task-notification>`, `<teammate-message` (the tag carries attributes, and is how a
|
|
168
|
+
teammate's own session receives a message), `Another Claude session sent a message` (how the
|
|
169
|
+
lead's session receives one) or `<bash-stdout>`, next to the three slash-command wrappers it
|
|
170
|
+
already skipped. It also skips a line that newer Claude Code marks with
|
|
171
|
+
`origin.kind: "task-notification"` or `promptSource: "system"`, which catches task
|
|
172
|
+
notifications written in plain prose. A slash command the
|
|
173
|
+
person typed, which starts `<command-message>`, and a `!` command's own `<bash-input>` still
|
|
174
|
+
count. Codex rollouts share the prefixes. See the
|
|
175
|
+
[hooks reference](docs/reference/hooks.md#sidegraph-stop).
|
|
176
|
+
- **A running MCP server sees a record that arrives mid-session.** The server keeps one `Store`,
|
|
177
|
+
and a `Store` checks the record files only when it is opened, so after a `git pull`
|
|
178
|
+
`get_task_context` and `retrieve_decisions` kept answering from the index as it stood until the
|
|
179
|
+
server restarted. The `PreToolUse` hook, which opened a `Store` on every call, was what
|
|
180
|
+
refreshed it, by accident. Every tool call now first re-checks the record files: a digest walk
|
|
181
|
+
(about 8 ms on 1,500 files), and a rebuild only when something changed. A filesystem error during
|
|
182
|
+
that check, such as a checkout deleting a record file mid-walk, does not fail the call: the tool
|
|
183
|
+
answers from the previous index and one line goes to stderr.
|
|
184
|
+
- **One record file that does not parse no longer switches memory off.** A merge that left
|
|
185
|
+
conflict markers in a decision, entity, fact or bindings file made the index rebuild raise, so
|
|
186
|
+
the store could not be opened: every hook fell back to "cannot open its store", and the MCP
|
|
187
|
+
server served nothing. The rebuild now skips such a file, whether it is invalid JSON, invalid
|
|
188
|
+
UTF-8, a wrong shape, rejected by its model or impossible to serialise, lists it as
|
|
189
|
+
`parse-error`, and loads the rest. The usual notice names the first such file, and
|
|
190
|
+
`sidegraph-verify` reports each of them; a file that fails validation no longer hides its
|
|
191
|
+
archived copy. A bindings file is skipped whole, so a half-valid file never leaves half of its
|
|
192
|
+
anchors in the index, and its record stays retrievable without them. A file that cannot be
|
|
193
|
+
opened at all (a permission or I/O error) still fails the open.
|
|
194
|
+
- **An archive line that cannot be read costs that line, not the store.** A line of an archive
|
|
195
|
+
segment that is not valid UTF-8 or JSON, or whose decision or domain fails its model, is skipped
|
|
196
|
+
with a warning in the rebuild, the rest of the segment loads, and the segment is listed as
|
|
197
|
+
`bad-archive-segment`. `sidegraph-verify` reports each such line with its segment and line
|
|
198
|
+
number. `sidegraph-compact` keeps the strict rule: it refuses to run over a segment it cannot
|
|
199
|
+
fully read and names the segment and the line (`--dry-run` included, with exit code 1 and no
|
|
200
|
+
traceback), and a hot file the rebuild left out no longer makes `--dry-run` fail with a bare
|
|
201
|
+
`JSONDecodeError`.
|
|
202
|
+
- **A file the rebuild left out is never overwritten.** With the store open again, a write that
|
|
203
|
+
recomputes a record's bindings from the index (`add_anchors`, `add_binding`) would have replaced
|
|
204
|
+
a conflicted bindings file with only the new anchor. All six canonical writers now refuse to
|
|
205
|
+
replace a listed file, with an error that names it. `add_anchors` checks first, so its refusal
|
|
206
|
+
leaves no orphan entity file behind. `supersede_decision` and `supersede_fact` refuse to inherit
|
|
207
|
+
anchors from a predecessor whose bindings file is skipped, since the successor would silently
|
|
208
|
+
start with none. `sidegraph-doctor` now says a skipped bindings file is skipped (unreadable),
|
|
209
|
+
not absent or empty. While an entity file is skipped, an anchor to the
|
|
210
|
+
same name mints a second entity, which `sidegraph-doctor`'s `duplicate-entity` check shows once
|
|
211
|
+
the file is fixed.
|
|
212
|
+
- **The skip warning no longer says "remove".** Removing a record file breaks the append-only
|
|
213
|
+
store, and removing an archive segment destroys every archived record in it. The warning now
|
|
214
|
+
says to restore the file with git or fix it by hand, and never to delete a segment. The
|
|
215
|
+
`store-files-skipped` notice says the same when the first listed file is an archive segment:
|
|
216
|
+
its lines that could not be read are left out, restore it with git, never delete it.
|
|
217
|
+
- **`sidegraph-verify` and `sidegraph-doctor` report what the rebuild leaves out.** They read an
|
|
218
|
+
archive segment as one string, so a line of invalid UTF-8 made them exit 1 with "store not
|
|
219
|
+
readable" and no file, and a line whose decision or domain fails its model was not reported at
|
|
220
|
+
all. They now split a segment into lines as bytes and report each bad line as
|
|
221
|
+
`bad-archive-segment`, with its segment and line number. A record file of invalid UTF-8, one
|
|
222
|
+
nested past the recursion limit and one that validates but cannot be serialised (a lone
|
|
223
|
+
surrogate) are `parse-error`s naming the file, where the first two exited 1 and the third
|
|
224
|
+
reported clean. A title holding U+2028 or U+0085 no longer gives a false `bad-archive-segment`.
|
|
225
|
+
- **Compacting a decision whose title holds U+2028 or U+0085 no longer leaves a store that will
|
|
226
|
+
not open.** The archive reader split a segment with `str.splitlines`, which breaks a line at
|
|
227
|
+
those characters (the segment holds them raw), so the next rebuild raised "corrupt archive
|
|
228
|
+
segment". A segment is now split as bytes, at `\n` and `\r` only.
|
|
229
|
+
|
|
10
230
|
## [0.8.0] — 2026-10-03
|
|
11
231
|
|
|
12
232
|
### Added
|
|
@@ -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.9.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
|
|
@@ -53,11 +53,14 @@ src/sidegraph/
|
|
|
53
53
|
├── schema.py # Pydantic models: Entity, Decision, Fact, AnchorBinding, Domain, Initiative
|
|
54
54
|
├── store.py # owned append-only store (file-per-record JSON); enforces invariants on write
|
|
55
55
|
├── retrieval.py # multi-altitude, budget-bounded, task-aware read path (mistakes first)
|
|
56
|
+
├── hot_index.py # raw-sqlite handle on index.db for the hook hot path (no Store, no pydantic)
|
|
57
|
+
├── store_layout.py # store constants and rules shared with the hot path (pydantic-free)
|
|
56
58
|
├── server.py # FastMCP decision MCP — the tools agents call
|
|
57
59
|
├── engine/ # ── ENGINE SEAM ── the ONLY place Graphify specifics may live
|
|
58
60
|
│ └── reader.py # GraphifyReader: reads graph.json (read-only input; no MCP)
|
|
59
|
-
└── host/ # ── HOST SEAM ── Claude Code integration (SessionStart/Stop/PreToolUse)
|
|
60
|
-
|
|
61
|
+
└── host/ # ── HOST SEAM ── Claude Code integration (SessionStart/Stop/PreToolUse/SubagentStart)
|
|
62
|
+
├── hooks.py # host-specific; portable core never reaches in here
|
|
63
|
+
└── subagent.py # SubagentStart: the memory brief for a starting subagent
|
|
61
64
|
```
|
|
62
65
|
|
|
63
66
|
- **Portable core** (`schema`, `store`, `retrieval`, `server`) knows nothing about Graphify
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: sidegraph
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.9.0
|
|
4
4
|
Summary: Own the memory, rent the graph — a durable decision/lessons layer as a sidecar over a code-graph engine.
|
|
5
5
|
Project-URL: Homepage, https://github.com/SantyagoSeaman/sidegraph
|
|
6
6
|
Project-URL: Repository, https://github.com/SantyagoSeaman/sidegraph
|
|
@@ -21,7 +21,9 @@ Classifier: Programming Language :: Python :: 3.14
|
|
|
21
21
|
Classifier: Topic :: Software Development :: Documentation
|
|
22
22
|
Classifier: Topic :: Software Development :: Libraries
|
|
23
23
|
Requires-Python: >=3.13
|
|
24
|
+
Requires-Dist: anyio>=4
|
|
24
25
|
Requires-Dist: fastmcp>=3.4
|
|
26
|
+
Requires-Dist: mcp>=1.24
|
|
25
27
|
Requires-Dist: pydantic>=2.9
|
|
26
28
|
Requires-Dist: python-ulid>=3.0
|
|
27
29
|
Description-Content-Type: text/markdown
|
|
@@ -73,7 +75,7 @@ only ever reads `graph.json`, so the plain install above is all it needs.
|
|
|
73
75
|
|
|
74
76
|
```
|
|
75
77
|
# 2. Inside a Claude Code session in that repo: install the plugin — MCP server + all
|
|
76
|
-
#
|
|
78
|
+
# four hooks, wired automatically.
|
|
77
79
|
/plugin marketplace add SantyagoSeaman/sidegraph
|
|
78
80
|
/plugin install sidegraph@sidegraph
|
|
79
81
|
```
|
|
@@ -167,7 +169,7 @@ projects the full store, history included, into an OKF v0.1 bundle any OKF consu
|
|
|
167
169
|
next session ◀── SessionStart TOC anchored to entities in the
|
|
168
170
|
of named domains ◀── get_task_context ◀────── engine's graph (read-only);
|
|
169
171
|
mistakes first drill_down re-anchored after refactors
|
|
170
|
-
|
|
172
|
+
Read / Edit / Bash read ──▶ the file's records delivered in the call (once per file per agent)
|
|
171
173
|
```
|
|
172
174
|
|
|
173
175
|
Two layers age differently: the **structure** layer (the code graph — entities,
|
|
@@ -45,7 +45,7 @@ only ever reads `graph.json`, so the plain install above is all it needs.
|
|
|
45
45
|
|
|
46
46
|
```
|
|
47
47
|
# 2. Inside a Claude Code session in that repo: install the plugin — MCP server + all
|
|
48
|
-
#
|
|
48
|
+
# four hooks, wired automatically.
|
|
49
49
|
/plugin marketplace add SantyagoSeaman/sidegraph
|
|
50
50
|
/plugin install sidegraph@sidegraph
|
|
51
51
|
```
|
|
@@ -139,7 +139,7 @@ projects the full store, history included, into an OKF v0.1 bundle any OKF consu
|
|
|
139
139
|
next session ◀── SessionStart TOC anchored to entities in the
|
|
140
140
|
of named domains ◀── get_task_context ◀────── engine's graph (read-only);
|
|
141
141
|
mistakes first drill_down re-anchored after refactors
|
|
142
|
-
|
|
142
|
+
Read / Edit / Bash read ──▶ the file's records delivered in the call (once per file per agent)
|
|
143
143
|
```
|
|
144
144
|
|
|
145
145
|
Two layers age differently: the **structure** layer (the code graph — entities,
|
|
@@ -238,7 +238,7 @@ for how this differs from a `Domain`.
|
|
|
238
238
|
|
|
239
239
|
## `schema_version` — a public contract
|
|
240
240
|
|
|
241
|
-
`SCHEMA_VERSION` (currently `0.6.0
|
|
241
|
+
`SCHEMA_VERSION` (currently `0.6.0`, defined in `store_layout.py` and re-exported by `schema.py`) is stamped into the store's `meta` table
|
|
242
242
|
once, at creation, and checked for an **exact** match on the fast (digest-matches) freshness
|
|
243
243
|
path — a mismatch there normally raises immediately rather than silently reading mismatched
|
|
244
244
|
data. The one exception: a store stamped with a version in `_RELOADABLE_SCHEMA_VERSIONS`
|
|
@@ -180,5 +180,5 @@ Continue through the maintenance loop:
|
|
|
180
180
|
|
|
181
181
|
The visual launch demo must show discovery and review, production proof, new-session capture
|
|
182
182
|
and ratification, and later organic retrieval. An import-only recording does not satisfy the
|
|
183
|
-
release package. The existing
|
|
183
|
+
release package. The existing PreToolUse records block is part of normal delivery; its
|
|
184
184
|
effect is measured separately and is not new Bootstrap functionality.
|
|
@@ -21,14 +21,24 @@ The commands below follow the current development branch. For durable environmen
|
|
|
21
21
|
/plugin install sidegraph@sidegraph
|
|
22
22
|
```
|
|
23
23
|
|
|
24
|
-
Installs the MCP server and all
|
|
25
|
-
step, pointed at `SIDEGRAPH_DIR=.sidegraph`/`SIDEGRAPH_GRAPH=graphify-out/graph.json` by
|
|
26
|
-
default. It
|
|
27
|
-
|
|
28
|
-
|
|
24
|
+
Installs the MCP server and all four hooks (`SessionStart`, `Stop`, `PreToolUse`,
|
|
25
|
+
`SubagentStart`) in one step, pointed at `SIDEGRAPH_DIR=.sidegraph`/`SIDEGRAPH_GRAPH=graphify-out/graph.json` by
|
|
26
|
+
default. It builds straight from this repository — no PyPI publish needed, works today: the MCP
|
|
27
|
+
server and `SessionStart` run `uvx --from git+https://github.com/SantyagoSeaman/
|
|
28
|
+
sidegraph.git@main` under the hood, and `Stop`, `PreToolUse` and `SubagentStart` start from the
|
|
29
|
+
commit `SessionStart` resolved. See
|
|
29
30
|
[the plugin install path](../integrations/claude-code.md#plugin-install-path) for exactly
|
|
30
31
|
what gets registered and the cwd-pinning details. Skip to [Verify](#verify) once installed.
|
|
31
32
|
|
|
33
|
+
**Scope.** `/plugin install` offers three scopes: user, local and project. From a terminal the
|
|
34
|
+
flag is `claude plugin install sidegraph@sidegraph --scope user|project|local`, and the default
|
|
35
|
+
is user. Enable the plugin at user scope, or in the repository root's
|
|
36
|
+
`.claude/settings.local.json`, and it covers sessions started in any subdirectory. Project scope
|
|
37
|
+
(`.claude/settings.json`) covers only the directory it was installed from: Claude Code reads a
|
|
38
|
+
launch directory's own project settings and no parent's, so a plugin installed at the repository
|
|
39
|
+
root leaves sessions started below it without it. `sidegraph-doctor` reports the gap as
|
|
40
|
+
[`plugin-off-in-subdirectories`](../guides/troubleshooting.md#plugin-off-in-subdirectories).
|
|
41
|
+
|
|
32
42
|
## Option B — manual registration
|
|
33
43
|
|
|
34
44
|
Prefer explicit `.mcp.json`/`.claude/settings.json` files (e.g. for review in a PR), or want
|
|
@@ -111,7 +121,51 @@ Add to `.claude/settings.json` (merge into an existing file):
|
|
|
111
121
|
"hooks": [
|
|
112
122
|
{
|
|
113
123
|
"type": "command",
|
|
114
|
-
"command": "SIDEGRAPH_DIR=.sidegraph
|
|
124
|
+
"command": "SIDEGRAPH_DIR=.sidegraph uvx --from git+https://github.com/SantyagoSeaman/sidegraph.git@main sidegraph-pre-tool-use || printf '{}\\n'"
|
|
125
|
+
}
|
|
126
|
+
]
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
"matcher": "Bash",
|
|
130
|
+
"hooks": [
|
|
131
|
+
{
|
|
132
|
+
"type": "command",
|
|
133
|
+
"if": "Bash(sed *)",
|
|
134
|
+
"command": "SIDEGRAPH_DIR=.sidegraph uvx --from git+https://github.com/SantyagoSeaman/sidegraph.git@main sidegraph-pre-tool-use || printf '{}\\n'"
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
"type": "command",
|
|
138
|
+
"if": "Bash(grep *)",
|
|
139
|
+
"command": "SIDEGRAPH_DIR=.sidegraph uvx --from git+https://github.com/SantyagoSeaman/sidegraph.git@main sidegraph-pre-tool-use || printf '{}\\n'"
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
"type": "command",
|
|
143
|
+
"if": "Bash(rg *)",
|
|
144
|
+
"command": "SIDEGRAPH_DIR=.sidegraph uvx --from git+https://github.com/SantyagoSeaman/sidegraph.git@main sidegraph-pre-tool-use || printf '{}\\n'"
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
"type": "command",
|
|
148
|
+
"if": "Bash(cat *)",
|
|
149
|
+
"command": "SIDEGRAPH_DIR=.sidegraph uvx --from git+https://github.com/SantyagoSeaman/sidegraph.git@main sidegraph-pre-tool-use || printf '{}\\n'"
|
|
150
|
+
}
|
|
151
|
+
]
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
"matcher": "Agent|Task",
|
|
155
|
+
"hooks": [
|
|
156
|
+
{
|
|
157
|
+
"type": "command",
|
|
158
|
+
"command": "SIDEGRAPH_DIR=.sidegraph uvx --from git+https://github.com/SantyagoSeaman/sidegraph.git@main sidegraph-pre-tool-use || printf '{}\\n'"
|
|
159
|
+
}
|
|
160
|
+
]
|
|
161
|
+
}
|
|
162
|
+
],
|
|
163
|
+
"SubagentStart": [
|
|
164
|
+
{
|
|
165
|
+
"hooks": [
|
|
166
|
+
{
|
|
167
|
+
"type": "command",
|
|
168
|
+
"command": "SIDEGRAPH_DIR=.sidegraph SIDEGRAPH_GRAPH=graphify-out/graph.json uvx --from git+https://github.com/SantyagoSeaman/sidegraph.git@main sidegraph-subagent-start || printf '{}\\n'"
|
|
115
169
|
}
|
|
116
170
|
]
|
|
117
171
|
}
|
|
@@ -120,6 +174,10 @@ Add to `.claude/settings.json` (merge into an existing file):
|
|
|
120
174
|
}
|
|
121
175
|
```
|
|
122
176
|
|
|
177
|
+
These recipes keep plain `@main` on every command, which is simpler to copy. The plugin's own
|
|
178
|
+
`Stop`, `PreToolUse` and `SubagentStart` commands start from the commit `SessionStart` resolved,
|
|
179
|
+
which is faster on each call; see [the plugin install path](../integrations/claude-code.md#plugin-install-path).
|
|
180
|
+
|
|
123
181
|
From a source checkout, replace each `uvx --from git+... <entrypoint>` above with `uv run
|
|
124
182
|
--project /ABSOLUTE/PATH/TO/sidegraph <entrypoint>` (see the note in step 1). Keep the trailing
|
|
125
183
|
`|| printf …` on each command: Claude Code treats a hook that exits 2 with text on stderr as a
|
|
@@ -136,18 +194,35 @@ The env vars are inlined into the command because Claude Code hook entries have
|
|
|
136
194
|
standing instruction to call `get_task_context` before any search — bash grep/rg/find and
|
|
137
195
|
MCP structure-query tools included, not just `Read`/`Grep` (see
|
|
138
196
|
[`reference/hooks.md`](../reference/hooks.md#sidegraph-session-start)).
|
|
139
|
-
- `Stop` nudges the agent,
|
|
197
|
+
- `Stop` nudges the agent, once per session and only once the session has produced
|
|
140
198
|
**>= 2 real user prompts** (a substance gate — a session's very first `Stop` no longer
|
|
141
|
-
triggers it), to propose durable decisions via `propose_decisions` before it finishes
|
|
199
|
+
triggers it), to propose durable decisions via `propose_decisions` before it finishes, and
|
|
200
|
+
again after 30 minutes and 10 new commits; set
|
|
142
201
|
`SIDEGRAPH_CAPTURE_NUDGE=off` (alongside the other env vars in the command) to disable it
|
|
143
202
|
entirely. See [`reference/hooks.md`](../reference/hooks.md#sidegraph-stop) for the exact
|
|
144
203
|
nudge text and the substance gate's mechanics.
|
|
145
|
-
- `PreToolUse`
|
|
146
|
-
`
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
204
|
+
- `PreToolUse` hands the agent the records anchored to a file when it reads or edits it — a
|
|
205
|
+
`Read`, `Grep`, `Edit` or `Write`, or a Bash line whose `sed`, `grep`, `rg` or `cat` names it —
|
|
206
|
+
as a non-blocking block: the top two records (three when the first two are mistakes) with their
|
|
207
|
+
ids, and a line naming `get_task_context` for the rest. Each file arrives once per agent, at
|
|
208
|
+
most three files per call and ten per agent, and the session's own agent and every subagent it
|
|
209
|
+
starts count separately; a file with no records prints nothing. Bash is wired as four entries
|
|
210
|
+
(`if` is `Bash(sed *)`, `Bash(grep *)`, `Bash(rg *)`, `Bash(cat *)`) with the same command, and
|
|
211
|
+
needs Claude Code 2.1.89 for correct matching. Set `SIDEGRAPH_GREP_NUDGE=off` (alongside the
|
|
212
|
+
other env vars in the command) to turn off all of it. See
|
|
213
|
+
[`reference/hooks.md`](../reference/hooks.md#sidegraph-pre-tool-use).
|
|
214
|
+
- The `Agent|Task` group runs that same command when the agent spawns a subagent. It appends the
|
|
215
|
+
records for the files the subagent's brief names (and for the files named in a plan or notes
|
|
216
|
+
document that the brief names) to the brief, so the subagent starts with them. The subagent sees the block in
|
|
217
|
+
its first message; the parent's view of its own call is unchanged. Set
|
|
218
|
+
`SIDEGRAPH_AGENT_BRIEF=off` (alongside the other env vars in the command) to turn it off. See
|
|
219
|
+
[`reference/hooks.md`](../reference/hooks.md#subagent-briefs).
|
|
220
|
+
- `SubagentStart` gives every subagent a short brief, because a subagent gets no `SessionStart`
|
|
221
|
+
context and Explore and Plan agents load no `CLAUDE.md`: the same `get_task_context` call the
|
|
222
|
+
`SessionStart` instruction names, and one sentence on how many records memory holds and on how
|
|
223
|
+
many files. Without this entry your subagents start unaware that memory exists. Set
|
|
224
|
+
`SIDEGRAPH_SUBAGENT_BRIEF=off` (alongside the other env vars in the command) to disable it. See
|
|
225
|
+
[`reference/hooks.md`](../reference/hooks.md#sidegraph-subagent-start).
|
|
151
226
|
|
|
152
227
|
> **Don't also run `graphify claude install`.** It writes its own `PreToolUse` hooks into
|
|
153
228
|
> `.claude/settings.json` that nudge toward `graphify query` on every read — redundant with
|
|
@@ -25,17 +25,19 @@ The commands below follow the current development branch. For durable environmen
|
|
|
25
25
|
/plugin install sidegraph@sidegraph
|
|
26
26
|
```
|
|
27
27
|
|
|
28
|
-
Installs the MCP server, the `SessionStart`/`Stop` hooks, and all 12 skills in one step,
|
|
28
|
+
Installs the MCP server, the `SessionStart`/`Stop`/`SubagentStart` hooks, and all 12 skills in one step,
|
|
29
29
|
pointed at `SIDEGRAPH_DIR=.sidegraph`/`SIDEGRAPH_GRAPH=graphify-out/graph.json` by default.
|
|
30
|
-
It
|
|
31
|
-
|
|
30
|
+
It builds straight from this repository, no PyPI publish needed: the MCP server and `SessionStart`
|
|
31
|
+
run `uvx --from git+https://github.com/SantyagoSeaman/sidegraph.git@main` under the hood, and
|
|
32
|
+
`Stop` and `SubagentStart` start from the commit `SessionStart` resolved. See
|
|
32
33
|
[the plugin install path](../integrations/codex.md#plugin-install-path) for exactly what
|
|
33
34
|
gets registered and the cwd-pinning details, and what has and hasn't been verified live.
|
|
34
35
|
|
|
35
|
-
1. Trust the hooks: start an interactive `codex` session in the repo. Codex detects the
|
|
36
|
-
|
|
37
|
-
trust them. Approve to complete it. Skip or decline and the MCP tools still work,
|
|
38
|
-
retrieval at session start
|
|
36
|
+
1. Trust the hooks: start an interactive `codex` session in the repo. Codex detects the new
|
|
37
|
+
Sidegraph hook definitions (`SessionStart`, `Stop`, `SubagentStart`) and prompts you in the
|
|
38
|
+
terminal to trust them. Approve to complete it. Skip or decline and the MCP tools still work,
|
|
39
|
+
but retrieval at session start, the capture reminder at session end and the memory brief a
|
|
40
|
+
subagent gets at its start stay silent. A hook
|
|
39
41
|
definition change in a later release needs a fresh approval. Review or re-approve anytime
|
|
40
42
|
with `/hooks`.
|
|
41
43
|
|
|
@@ -110,6 +112,16 @@ Create `.codex/hooks.json` in the repo:
|
|
|
110
112
|
}
|
|
111
113
|
]
|
|
112
114
|
}
|
|
115
|
+
],
|
|
116
|
+
"SubagentStart": [
|
|
117
|
+
{
|
|
118
|
+
"hooks": [
|
|
119
|
+
{
|
|
120
|
+
"type": "command",
|
|
121
|
+
"command": "cd \"$(git rev-parse --show-toplevel 2>/dev/null || pwd)\" && SIDEGRAPH_DIR=.sidegraph SIDEGRAPH_GRAPH=graphify-out/graph.json uv run --project /ABSOLUTE/PATH/TO/sidegraph sidegraph-subagent-start || printf '{}\\n'"
|
|
122
|
+
}
|
|
123
|
+
]
|
|
124
|
+
}
|
|
113
125
|
]
|
|
114
126
|
}
|
|
115
127
|
}
|
|
@@ -122,6 +134,10 @@ working on a non-git corpus too (Sidegraph doesn't require the corpus to be a gi
|
|
|
122
134
|
[`integrations/graphify.md`](../integrations/graphify.md#non-git-and-doc-only-corpora)), where a
|
|
123
135
|
bare `git rev-parse --show-toplevel` would fail and leave `cd` with no argument.
|
|
124
136
|
|
|
137
|
+
The `SubagentStart` entry gives each subagent a short brief (the `get_task_context` call to make,
|
|
138
|
+
and what memory holds), because a subagent gets no `SessionStart` context; see
|
|
139
|
+
[`reference/hooks.md`](../reference/hooks.md#sidegraph-subagent-start).
|
|
140
|
+
|
|
125
141
|
The trailing `|| printf …` is a guard, and it should stay. On `Stop`, Codex feeds a hook's stderr
|
|
126
142
|
back to the model when the hook exits 2, and `uv` exits 2 on some of its own errors (a project it
|
|
127
143
|
cannot find, a cache it cannot write), so a command that never reaches Python could keep
|
|
@@ -131,8 +147,8 @@ answers a `systemMessage` telling you to run the hook command in a terminal to s
|
|
|
131
147
|
every hook command in the plugin; see [`integrations/codex.md`](../integrations/codex.md#hooks-ga).
|
|
132
148
|
|
|
133
149
|
No `PreToolUse` entry is included above. Codex can invoke that event for local function tools,
|
|
134
|
-
but it has no stable `Read`/`Grep` tool pair to which Sidegraph's Claude-specific
|
|
135
|
-
attach. Therefore Claude Code's
|
|
150
|
+
but it has no stable `Read`/`Grep` tool pair to which Sidegraph's Claude-specific records block
|
|
151
|
+
can attach. Therefore Claude Code's `PreToolUse` delivery of a file's records
|
|
136
152
|
(`sidegraph-pre-tool-use`) has no Codex counterpart to wire up yet — see
|
|
137
153
|
[`integrations/codex.md`](../integrations/codex.md) for details.
|
|
138
154
|
|
|
@@ -45,16 +45,26 @@ Inside an interactive host session, in the repo you want memory over:
|
|
|
45
45
|
/plugin install sidegraph@sidegraph
|
|
46
46
|
```
|
|
47
47
|
|
|
48
|
-
The Claude Code host installs the MCP server and all
|
|
49
|
-
`PreToolUse`). Codex installs the MCP server, `SessionStart`/`Stop
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
48
|
+
The Claude Code host installs the MCP server and all four hooks (`SessionStart`, `Stop`,
|
|
49
|
+
`PreToolUse`, `SubagentStart`). Codex installs the MCP server, `SessionStart`/`Stop`/
|
|
50
|
+
`SubagentStart`, and the bundled skills;
|
|
51
|
+
its tool surface has no equivalent target for the Claude-specific `PreToolUse` records block. The
|
|
52
|
+
plugin's bundled config installs from the public repository, not PyPI: the MCP server and
|
|
53
|
+
`SessionStart` run `uvx --from git+https://github.com/SantyagoSeaman/sidegraph.git@main`, and the
|
|
54
|
+
`Stop`, `PreToolUse` and `SubagentStart` hooks start from the commit `SessionStart` resolved. Unlike the package
|
|
55
|
+
install, the plugin deliberately follows the public repository's `main` branch. See
|
|
55
56
|
the integration details for [Claude Code](../integrations/claude-code.md#plugin-install-path)
|
|
56
57
|
or [Codex](../integrations/codex.md#plugin-install-path).
|
|
57
58
|
|
|
59
|
+
**Scope.** `/plugin install` offers three scopes: user, local and project. From a terminal the
|
|
60
|
+
flag is `claude plugin install sidegraph@sidegraph --scope user|project|local`, and the default
|
|
61
|
+
is user. Enable the plugin at user scope, or in the repository root's
|
|
62
|
+
`.claude/settings.local.json`, and it covers sessions started in any subdirectory. Project scope
|
|
63
|
+
(`.claude/settings.json`) covers only the directory it was installed from: Claude Code reads a
|
|
64
|
+
launch directory's own project settings and no parent's, so a plugin installed at the repository
|
|
65
|
+
root leaves sessions started below it without it. `sidegraph-doctor` reports the gap as
|
|
66
|
+
[`plugin-off-in-subdirectories`](../guides/troubleshooting.md#plugin-off-in-subdirectories).
|
|
67
|
+
|
|
58
68
|
### Option C — uvx directly from git
|
|
59
69
|
|
|
60
70
|
Prefer manual wiring, or need an entry point outside Claude Code (e.g. `sidegraph-init` from
|
|
@@ -114,7 +124,8 @@ setup, scripted/CI use, and the two deliberately human-run jobs (`sidegraph-impo
|
|
|
114
124
|
| `sidegraph-mcp` | The decision MCP server (stdio transport). |
|
|
115
125
|
| `sidegraph-session-start` | `SessionStart` hook — injects project memory. |
|
|
116
126
|
| `sidegraph-stop` | `Stop` hook — nudges the agent to distill decisions. |
|
|
117
|
-
| `sidegraph-pre-tool-use` | `PreToolUse` hook —
|
|
127
|
+
| `sidegraph-pre-tool-use` | `PreToolUse` hook — hands the agent the records anchored to a file when it reads or edits it (`Read`, `Grep`, `Edit`, `Write`, and `sed`/`grep`/`rg`/`cat` in Bash). |
|
|
128
|
+
| `sidegraph-subagent-start` | `SubagentStart` hook — tells a starting subagent that decision memory exists and how to ask it. |
|
|
118
129
|
| `sidegraph-bootstrap` | Guided CLI — scan one of six supported ADR/spec profiles, preview and review candidates, write only after confirmation, verify anchors/host integration, and prove production retrieval. |
|
|
119
130
|
| `sidegraph-init` | CLI — bootstrap `.sidegraph/` in a repo: create the store, check for the graph, print the plugin install path (and the no-plugin `claude mcp add` alternative). |
|
|
120
131
|
| `sidegraph-ratify` | CLI — review/accept/drop proposed decisions, facts, and domains. |
|
|
@@ -33,6 +33,15 @@ Start a new interactive session in the repository and approve the hook trust pro
|
|
|
33
33
|
manual or source-checkout setup, use the host-specific page:
|
|
34
34
|
[Claude Code](claude-code-setup.md) or [Codex](codex-setup.md).
|
|
35
35
|
|
|
36
|
+
**Scope.** `/plugin install` offers three scopes: user, local and project. From a terminal the
|
|
37
|
+
flag is `claude plugin install sidegraph@sidegraph --scope user|project|local`, and the default
|
|
38
|
+
is user. Enable the plugin at user scope, or in the repository root's
|
|
39
|
+
`.claude/settings.local.json`, and it covers sessions started in any subdirectory. Project scope
|
|
40
|
+
(`.claude/settings.json`) covers only the directory it was installed from: Claude Code reads a
|
|
41
|
+
launch directory's own project settings and no parent's, so a plugin installed at the repository
|
|
42
|
+
root leaves sessions started below it without it. `sidegraph-doctor` reports the gap as
|
|
43
|
+
[`plugin-off-in-subdirectories`](../guides/troubleshooting.md#plugin-off-in-subdirectories).
|
|
44
|
+
|
|
36
45
|
## 3. Record one real gotcha
|
|
37
46
|
|
|
38
47
|
Choose a real file or symbol in the repository. Tell the agent:
|
|
@@ -35,9 +35,10 @@ search instruction**, once, ahead of the rest of the text (not inside either ren
|
|
|
35
35
|
> are indexed here. Before a non-trivial change, run the sidegraph check-plan skill if it is
|
|
36
36
|
> available. If the tool is listed only by name, load it first.
|
|
37
37
|
|
|
38
|
-
Unlike the `PreToolUse`
|
|
39
|
-
|
|
40
|
-
|
|
38
|
+
Unlike the `PreToolUse` records block (the files a `Read`, `Edit`, `Write`, `Grep` or
|
|
39
|
+
`sed`/`grep`/`rg`/`cat` line names, each at most once per agent — see below), this line is
|
|
40
|
+
unconditional and covers every search surface behaviorally, not just calls that name a file with
|
|
41
|
+
records — bash `find` and MCP structure-query tools included.
|
|
41
42
|
|
|
42
43
|
Both renderers also inject:
|
|
43
44
|
|