sessionwiki 2.0.0__tar.gz → 2.0.2__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.
- {sessionwiki-2.0.0/sessionwiki.egg-info → sessionwiki-2.0.2}/PKG-INFO +30 -8
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/README.md +29 -7
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/pyproject.toml +1 -1
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/__init__.py +27 -3
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/cli.py +15 -1
- {sessionwiki-2.0.0 → sessionwiki-2.0.2/sessionwiki.egg-info}/PKG-INFO +30 -8
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki.egg-info/SOURCES.txt +2 -1
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_cli.py +19 -0
- sessionwiki-2.0.2/tests/test_distribution_manifests.py +99 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_editorconfig_lychee.py +1 -2
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_release_pipeline.py +10 -0
- sessionwiki-2.0.2/tests/test_repo_root_resolution.py +90 -0
- sessionwiki-2.0.0/tests/test_homebrew_tap.py +0 -209
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/LICENSE +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/NOTICE +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/__main__.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/_frontmatter.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/_system_pages.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/adapter_config.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/adapters/__init__.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/adapters/base.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/adapters/claude_code.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/adapters/codex_cli.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/adapters/contrib/__init__.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/adapters/contrib/chatgpt.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/adapters/contrib/copilot_chat.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/adapters/contrib/copilot_cli.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/adapters/contrib/cursor.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/adapters/contrib/gemini_cli.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/adapters/contrib/obsidian.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/adapters/opencode.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/adapters/status.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/adapters/zcode.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/audit.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/backlinks.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/build.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/cache.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/candidates.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/categories.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/changelog_timeline.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/compare.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/completion.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/confidence.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/config.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/config_schedule.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/context_md.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/convert.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/docs_pages.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/doctor.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/exporters.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/freshness.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/graph.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/graphify_bridge.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/ingest_queue.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/lifecycle.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/link_checker.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/lint/__init__.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/lint/rules/__init__.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/lint/rules/_helpers.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/lint/rules/claim_verification.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/lint/rules/content_freshness.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/lint/rules/contradiction_detection.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/lint/rules/duplicate_detection.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/lint/rules/entity_consistency.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/lint/rules/frontmatter_completeness.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/lint/rules/frontmatter_count_consistency.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/lint/rules/frontmatter_validity.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/lint/rules/index_sync.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/lint/rules/link_integrity.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/lint/rules/orphan_detection.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/lint/rules/stale_candidates.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/lint/rules/stale_reference_detection.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/lint/rules/summary_accuracy.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/lint/rules/tags_topics_convention.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/lint/rules/tools_consistency.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/lock.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/log_reader.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/manifest.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/mcp/__init__.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/mcp/__main__.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/mcp/server.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/models_page.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/obsidian_output.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/opencode/__init__.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/opencode/autosync.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/opencode/export.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/opencode/install.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/pipeline.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/project_topics.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/py.typed +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/quarantine.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/queue.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/references.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/render/__init__.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/render/css.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/render/docs_css.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/render/js.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/schema.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/search_facets.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/search_tree.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/serve.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/session_export.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/skill_installer.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/sync/__init__.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/sync/status.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/synth/__init__.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/synth/agent_delegate.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/synth/base.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/synth/cli_helpers.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/synth/estimate.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/synth/ollama.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/synth/openai_compat.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/synth/pipeline.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/tag_utils.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/tags.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/vault.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/viz_heatmap.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/viz_tokens.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/viz_tools.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/watch.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/zcode/__init__.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/zcode/autosync.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/zcode/export.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki/zcode/install.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki.egg-info/dependency_links.txt +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki.egg-info/entry_points.txt +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki.egg-info/requires.txt +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/sessionwiki.egg-info/top_level.txt +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/setup.cfg +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_activity_timeline_label.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_adapter_config.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_adapter_graduation.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_adapter_is_available_unified.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_adapter_tag.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_adapters.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_agent_badges.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_agent_delegate.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_ai_suggested_tags.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_audit.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_backlinks.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_brand_system_doc.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_cache.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_candidates.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_categories.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_changelog_page.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_changelog_timeline.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_chatgpt_adapter.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_chip_contrast.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_ci_workflow.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_cli_doc_parity.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_cli_observability.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_cmd_all_parser.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_cmd_graph_fallback.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_collision_retry.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_compare.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_completion.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_confidence.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_config_layering.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_context_md.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_convert.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_convert_no_op_perf.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_convert_state_and_coerce.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_converter_metrics.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_copilot_adapters.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_cross_platform_paths.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_css_dark_code_and_sticky_header.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_dashboard.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_default_redaction.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_docker.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_docs_structure.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_doctor.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_edge_cases.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_edge_cases_unit.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_filter_slug_label.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_flat_naming.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_force_counters.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_freshness.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_frontmatter_consolidation.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_frontmatter_shared.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_gap_fixes.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_github_link_rewriter.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_graph_context_menu.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_graph_session.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_graph_site_url.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_graph_theme_sync.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_graph_top_nav.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_graph_viewer.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_graphify_bridge.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_healer_comment.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_highlightjs.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_home_card_date_range.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_ignore.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_ingest_queue_shim.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_is_subagent.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_issue_383_pipeline.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_lifecycle.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_light_mode_polish.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_lint_perf.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_lint_rules.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_lint_windows_paths.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_log_reader.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_mcp_byte_cap.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_mcp_enhanced.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_mcp_protocol.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_mcp_read_page_allowlist.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_mcp_safety.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_md_cache.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_mobile_hamburger_nav.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_models_page.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_no_phantom_adapters.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_obsidian_docs.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_obsidian_templates.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_ollama_backend.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_openai_compat.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_opencode_adapter.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_opencode_autosync.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_opencode_cli.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_opencode_export.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_opencode_install.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_palette_dialog_a11y.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_palette_indexes.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_parse_jsonl_oserror.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_path_traversal.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_post_review_remediation.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_pr_template.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_project_stubs.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_project_topics.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_quarantine.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_queue.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_raw_immutability.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_reader_api_doc.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_readme_badges.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_reference_coverage.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_references.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_render_is_subagent.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_render_split.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_schedule_config.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_schema.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_schema_entity_types.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_search_facets.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_search_tree.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_serve_smoke.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_session_description.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_session_export.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_session_ref_stripper.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_sessions_index_no_date_dup.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_setup_guide_doc.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_setup_scripts.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_skill_installer.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_slash_cli_parity.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_slug_fallback.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_state_locking.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_subprocess_paths.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_synth_coalesce.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_synth_config_loading.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_synth_pipeline.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_synthesize_cli_pending.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_synthesize_estimate.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_synthesize_overview_safety.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_tag_utils.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_tags.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_theme_pre_paint.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_tutorial_ux.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_two_way_editing.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_ui_a11y_bundle_473.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_username_autodetect.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_username_redact_paths.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_v02.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_v03.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_v04.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_v1378_remediation.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_vault.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_vault_sync_routing.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_viewport_meta.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_viz_heatmap.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_viz_tokens.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_viz_tools.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_wcag_contrast.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_zcode_adapter.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_zcode_autosync.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_zcode_cli.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_zcode_export.py +0 -0
- {sessionwiki-2.0.0 → sessionwiki-2.0.2}/tests/test_zcode_install.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: sessionwiki
|
|
3
|
-
Version: 2.0.
|
|
3
|
+
Version: 2.0.2
|
|
4
4
|
Summary: Searchable, interlinked wiki of your AI coding sessions (Claude Code, Codex CLI, Cursor, Gemini CLI, ZCode, OpenCode, Obsidian), with LLM synthesis and MCP access. Based on llmwiki by Pratiyush.
|
|
5
5
|
Author-email: Igor Lashkevich <3133574+necroz@users.noreply.github.com>
|
|
6
6
|
License: MIT
|
|
@@ -59,11 +59,13 @@ Dynamic: license-file
|
|
|
59
59
|
|
|
60
60
|
# sessionwiki
|
|
61
61
|
|
|
62
|
+
<!-- mcp-name: io.github.necroz/sessionwiki -->
|
|
63
|
+
|
|
62
64
|
> **Your AI coding sessions, compiled into a searchable, interlinked wiki** — from Claude Code, Codex CLI, Cursor, Gemini CLI, Copilot, ZCode and OpenCode. Local-first, with LLM synthesis, a session graph, and an MCP server so your agents can look up what you already solved.
|
|
63
65
|
|
|
64
66
|
[](https://github.com/necroz/sessionwiki/blob/master/LICENSE)
|
|
65
67
|
[](https://www.python.org/)
|
|
66
|
-
[](https://github.com/necroz/sessionwiki/blob/master/CHANGELOG.md)
|
|
67
69
|
[](https://github.com/necroz/sessionwiki/tree/master/tests)
|
|
68
70
|
[](https://github.com/necroz/sessionwiki/actions/workflows/ci.yml)
|
|
69
71
|
[](https://github.com/necroz/sessionwiki/actions/workflows/link-check.yml)
|
|
@@ -137,11 +139,19 @@ cd sessionwiki
|
|
|
137
139
|
|
|
138
140
|
`setup` creates a checkout-local `.venv`, installs the package, scaffolds `raw/`, `wiki/`, `site/`, enables the adapters for the agents it finds and runs `sessionwiki doctor`. The wrapper scripts use the venv automatically; for the CLI, activate it (`source .venv/bin/activate`) or call `.venv/bin/sessionwiki`.
|
|
139
141
|
|
|
140
|
-
|
|
142
|
+
Or install the published package — pick one:
|
|
143
|
+
|
|
144
|
+
```bash
|
|
145
|
+
uv tool install sessionwiki # uv: CLI in its own isolated environment
|
|
146
|
+
uvx sessionwiki --help # uv: run without installing
|
|
147
|
+
pip install sessionwiki # pip, inside a virtualenv
|
|
148
|
+
pip install 'sessionwiki[graph]' # + graphify graph engine (also works with uv tool install)
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
Docker — serve a site you have built (image `ghcr.io/necroz/sessionwiki`, see [Docker deployment](https://github.com/necroz/sessionwiki/blob/master/docs/deploy/docker.md) for `docker compose` and running CLI commands in the container):
|
|
141
152
|
|
|
142
153
|
```bash
|
|
143
|
-
|
|
144
|
-
pip install 'sessionwiki[all] @ git+https://github.com/necroz/sessionwiki' # + graph engine, dev, e2e
|
|
154
|
+
docker run --rm -p 8765:8765 -v "$PWD/site:/wiki/site:ro" ghcr.io/necroz/sessionwiki
|
|
145
155
|
```
|
|
146
156
|
|
|
147
157
|
A step-by-step walkthrough with screenshots lives in the [setup guide](https://github.com/necroz/sessionwiki/blob/master/docs/tutorials/setup-guide.md).
|
|
@@ -203,18 +213,29 @@ Backends: `ollama` (local), `openai` (any OpenAI-compatible `/v1`: vLLM, SGLang,
|
|
|
203
213
|
|
|
204
214
|
## Ask your wiki from your agents (MCP)
|
|
205
215
|
|
|
216
|
+
**Claude Code plugin** — the MCP server plus a skill that tells the agent when to search the wiki. It asks for your sessionwiki folder on install:
|
|
217
|
+
|
|
218
|
+
```
|
|
219
|
+
/plugin marketplace add necroz/sessionwiki
|
|
220
|
+
/plugin install sessionwiki@sessionwiki
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
**Any MCP client** — run the published package with `uvx`, and point `SESSIONWIKI_HOME` at the folder that holds `raw/` and `wiki/` (run `sessionwiki sync` there first):
|
|
224
|
+
|
|
206
225
|
```json
|
|
207
226
|
{
|
|
208
227
|
"mcpServers": {
|
|
209
228
|
"sessionwiki": {
|
|
210
|
-
"command": "
|
|
211
|
-
"args": ["
|
|
212
|
-
"
|
|
229
|
+
"command": "uvx",
|
|
230
|
+
"args": ["sessionwiki", "mcp"],
|
|
231
|
+
"env": { "SESSIONWIKI_HOME": "/path/to/your/sessionwiki" }
|
|
213
232
|
}
|
|
214
233
|
}
|
|
215
234
|
}
|
|
216
235
|
```
|
|
217
236
|
|
|
237
|
+
From a source checkout, use `"command": "/path/to/sessionwiki/.venv/bin/sessionwiki"` with `"args": ["mcp"]`; the checkout is the data root, so no `env` is needed.
|
|
238
|
+
|
|
218
239
|
Add it to Claude Code, Claude Desktop, ZCode or any MCP client. Tools include `wiki_query`, `wiki_search` (optionally over raw transcripts), `wiki_read_page`, `wiki_list_sources`, `wiki_lint`, `wiki_sync`, `wiki_export`, `wiki_dashboard` and more — 12 in total, stdio transport, no SDK dependency, path-traversal guarded.
|
|
219
240
|
|
|
220
241
|
## CLI reference
|
|
@@ -236,6 +257,7 @@ sessionwiki doctor # check Python, deps, config, agent paths
|
|
|
236
257
|
sessionwiki audit # scan raw/ wiki/ site/ for usernames and secrets
|
|
237
258
|
sessionwiki zcode # export · autosync · install
|
|
238
259
|
sessionwiki opencode # export · autosync · install
|
|
260
|
+
sessionwiki mcp # MCP server on stdio
|
|
239
261
|
sessionwiki version
|
|
240
262
|
```
|
|
241
263
|
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
# sessionwiki
|
|
2
2
|
|
|
3
|
+
<!-- mcp-name: io.github.necroz/sessionwiki -->
|
|
4
|
+
|
|
3
5
|
> **Your AI coding sessions, compiled into a searchable, interlinked wiki** — from Claude Code, Codex CLI, Cursor, Gemini CLI, Copilot, ZCode and OpenCode. Local-first, with LLM synthesis, a session graph, and an MCP server so your agents can look up what you already solved.
|
|
4
6
|
|
|
5
7
|
[](https://github.com/necroz/sessionwiki/blob/master/LICENSE)
|
|
6
8
|
[](https://www.python.org/)
|
|
7
|
-
[](https://github.com/necroz/sessionwiki/blob/master/CHANGELOG.md)
|
|
8
10
|
[](https://github.com/necroz/sessionwiki/tree/master/tests)
|
|
9
11
|
[](https://github.com/necroz/sessionwiki/actions/workflows/ci.yml)
|
|
10
12
|
[](https://github.com/necroz/sessionwiki/actions/workflows/link-check.yml)
|
|
@@ -78,11 +80,19 @@ cd sessionwiki
|
|
|
78
80
|
|
|
79
81
|
`setup` creates a checkout-local `.venv`, installs the package, scaffolds `raw/`, `wiki/`, `site/`, enables the adapters for the agents it finds and runs `sessionwiki doctor`. The wrapper scripts use the venv automatically; for the CLI, activate it (`source .venv/bin/activate`) or call `.venv/bin/sessionwiki`.
|
|
80
82
|
|
|
81
|
-
|
|
83
|
+
Or install the published package — pick one:
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
uv tool install sessionwiki # uv: CLI in its own isolated environment
|
|
87
|
+
uvx sessionwiki --help # uv: run without installing
|
|
88
|
+
pip install sessionwiki # pip, inside a virtualenv
|
|
89
|
+
pip install 'sessionwiki[graph]' # + graphify graph engine (also works with uv tool install)
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
Docker — serve a site you have built (image `ghcr.io/necroz/sessionwiki`, see [Docker deployment](https://github.com/necroz/sessionwiki/blob/master/docs/deploy/docker.md) for `docker compose` and running CLI commands in the container):
|
|
82
93
|
|
|
83
94
|
```bash
|
|
84
|
-
|
|
85
|
-
pip install 'sessionwiki[all] @ git+https://github.com/necroz/sessionwiki' # + graph engine, dev, e2e
|
|
95
|
+
docker run --rm -p 8765:8765 -v "$PWD/site:/wiki/site:ro" ghcr.io/necroz/sessionwiki
|
|
86
96
|
```
|
|
87
97
|
|
|
88
98
|
A step-by-step walkthrough with screenshots lives in the [setup guide](https://github.com/necroz/sessionwiki/blob/master/docs/tutorials/setup-guide.md).
|
|
@@ -144,18 +154,29 @@ Backends: `ollama` (local), `openai` (any OpenAI-compatible `/v1`: vLLM, SGLang,
|
|
|
144
154
|
|
|
145
155
|
## Ask your wiki from your agents (MCP)
|
|
146
156
|
|
|
157
|
+
**Claude Code plugin** — the MCP server plus a skill that tells the agent when to search the wiki. It asks for your sessionwiki folder on install:
|
|
158
|
+
|
|
159
|
+
```
|
|
160
|
+
/plugin marketplace add necroz/sessionwiki
|
|
161
|
+
/plugin install sessionwiki@sessionwiki
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
**Any MCP client** — run the published package with `uvx`, and point `SESSIONWIKI_HOME` at the folder that holds `raw/` and `wiki/` (run `sessionwiki sync` there first):
|
|
165
|
+
|
|
147
166
|
```json
|
|
148
167
|
{
|
|
149
168
|
"mcpServers": {
|
|
150
169
|
"sessionwiki": {
|
|
151
|
-
"command": "
|
|
152
|
-
"args": ["
|
|
153
|
-
"
|
|
170
|
+
"command": "uvx",
|
|
171
|
+
"args": ["sessionwiki", "mcp"],
|
|
172
|
+
"env": { "SESSIONWIKI_HOME": "/path/to/your/sessionwiki" }
|
|
154
173
|
}
|
|
155
174
|
}
|
|
156
175
|
}
|
|
157
176
|
```
|
|
158
177
|
|
|
178
|
+
From a source checkout, use `"command": "/path/to/sessionwiki/.venv/bin/sessionwiki"` with `"args": ["mcp"]`; the checkout is the data root, so no `env` is needed.
|
|
179
|
+
|
|
159
180
|
Add it to Claude Code, Claude Desktop, ZCode or any MCP client. Tools include `wiki_query`, `wiki_search` (optionally over raw transcripts), `wiki_read_page`, `wiki_list_sources`, `wiki_lint`, `wiki_sync`, `wiki_export`, `wiki_dashboard` and more — 12 in total, stdio transport, no SDK dependency, path-traversal guarded.
|
|
160
181
|
|
|
161
182
|
## CLI reference
|
|
@@ -177,6 +198,7 @@ sessionwiki doctor # check Python, deps, config, agent paths
|
|
|
177
198
|
sessionwiki audit # scan raw/ wiki/ site/ for usernames and secrets
|
|
178
199
|
sessionwiki zcode # export · autosync · install
|
|
179
200
|
sessionwiki opencode # export · autosync · install
|
|
201
|
+
sessionwiki mcp # MCP server on stdio
|
|
180
202
|
sessionwiki version
|
|
181
203
|
```
|
|
182
204
|
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "sessionwiki"
|
|
7
|
-
version = "2.0.
|
|
7
|
+
version = "2.0.2"
|
|
8
8
|
description = "Searchable, interlinked wiki of your AI coding sessions (Claude Code, Codex CLI, Cursor, Gemini CLI, ZCode, OpenCode, Obsidian), with LLM synthesis and MCP access. Based on llmwiki by Pratiyush."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.9"
|
|
@@ -15,14 +15,38 @@ Public API:
|
|
|
15
15
|
- sessionwiki.mcp.server.main() — MCP server (stdio)
|
|
16
16
|
"""
|
|
17
17
|
|
|
18
|
-
__version__ = "2.0.
|
|
18
|
+
__version__ = "2.0.2"
|
|
19
19
|
__author__ = "Igor Lashkevich" # based on llmwiki by Pratiyush (MIT)
|
|
20
20
|
__license__ = "MIT"
|
|
21
21
|
|
|
22
|
+
import os
|
|
22
23
|
from pathlib import Path
|
|
23
24
|
|
|
24
|
-
|
|
25
|
-
|
|
25
|
+
|
|
26
|
+
def _resolve_root(package_file: "str | Path" = __file__) -> Path:
|
|
27
|
+
"""Directory that holds raw/, wiki/, site/ and the state files.
|
|
28
|
+
|
|
29
|
+
1. ``$SESSIONWIKI_HOME`` (or the legacy ``$LLMWIKI_HOME``) when set.
|
|
30
|
+
2. The source checkout, when the package runs from a clone (``./setup.sh``
|
|
31
|
+
or ``pip install -e``): the parent of ``sessionwiki/`` has
|
|
32
|
+
``pyproject.toml``.
|
|
33
|
+
3. Otherwise — ``pip install`` / ``uv tool install`` / ``uvx`` / Docker,
|
|
34
|
+
where the parent is ``site-packages`` — the current directory.
|
|
35
|
+
"""
|
|
36
|
+
for var in ("SESSIONWIKI_HOME", "LLMWIKI_HOME"):
|
|
37
|
+
value = os.environ.get(var, "").strip()
|
|
38
|
+
if value:
|
|
39
|
+
return Path(value).expanduser().resolve()
|
|
40
|
+
checkout = Path(package_file).resolve().parent.parent
|
|
41
|
+
if (checkout / "pyproject.toml").is_file():
|
|
42
|
+
return checkout
|
|
43
|
+
return Path.cwd().resolve()
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
# Data root (raw/, wiki/, site/, state files). See _resolve_root().
|
|
47
|
+
REPO_ROOT = _resolve_root()
|
|
48
|
+
# The installed package itself — use this, not REPO_ROOT, for files that
|
|
49
|
+
# ship inside the package (templates, prompts, bundled assets).
|
|
26
50
|
PACKAGE_ROOT = Path(__file__).resolve().parent
|
|
27
51
|
|
|
28
52
|
# #arch-m4 (#617): the docstring above promised a "public API" but
|
|
@@ -57,6 +57,13 @@ def cmd_version(args: argparse.Namespace) -> int:
|
|
|
57
57
|
return 0
|
|
58
58
|
|
|
59
59
|
|
|
60
|
+
def cmd_mcp(args: argparse.Namespace) -> int:
|
|
61
|
+
"""Run the MCP server on stdin/stdout (same as `python3 -m sessionwiki.mcp`)."""
|
|
62
|
+
from sessionwiki.mcp.server import main as mcp_main
|
|
63
|
+
|
|
64
|
+
return mcp_main()
|
|
65
|
+
|
|
66
|
+
|
|
60
67
|
def cmd_all(args: argparse.Namespace) -> int:
|
|
61
68
|
"""Run the full wiki pipeline end-to-end: build → graph → export all → lint.
|
|
62
69
|
|
|
@@ -1111,7 +1118,7 @@ def _add_vault_arg(parser: argparse.ArgumentParser, *, role: str) -> None:
|
|
|
1111
1118
|
def build_parser() -> argparse.ArgumentParser:
|
|
1112
1119
|
p = argparse.ArgumentParser(
|
|
1113
1120
|
prog="sessionwiki",
|
|
1114
|
-
description="
|
|
1121
|
+
description="Searchable, interlinked wiki of your AI coding sessions (Claude Code, Codex CLI, Cursor, Gemini CLI, Copilot, ZCode, OpenCode).",
|
|
1115
1122
|
)
|
|
1116
1123
|
p.add_argument("--version", action="version", version=f"sessionwiki {__version__}")
|
|
1117
1124
|
|
|
@@ -1629,6 +1636,13 @@ def build_parser() -> argparse.ArgumentParser:
|
|
|
1629
1636
|
ver = sub.add_parser("version", help="Print version")
|
|
1630
1637
|
ver.set_defaults(func=cmd_version)
|
|
1631
1638
|
|
|
1639
|
+
# mcp — stdio MCP server (the entry point MCP clients and registries use)
|
|
1640
|
+
mcp = sub.add_parser(
|
|
1641
|
+
"mcp",
|
|
1642
|
+
help="Run the MCP server on stdio (data root: $SESSIONWIKI_HOME or the current directory)",
|
|
1643
|
+
)
|
|
1644
|
+
mcp.set_defaults(func=cmd_mcp)
|
|
1645
|
+
|
|
1632
1646
|
# all — run build + graph + export all + lint in sequence
|
|
1633
1647
|
all_p = sub.add_parser(
|
|
1634
1648
|
"all",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: sessionwiki
|
|
3
|
-
Version: 2.0.
|
|
3
|
+
Version: 2.0.2
|
|
4
4
|
Summary: Searchable, interlinked wiki of your AI coding sessions (Claude Code, Codex CLI, Cursor, Gemini CLI, ZCode, OpenCode, Obsidian), with LLM synthesis and MCP access. Based on llmwiki by Pratiyush.
|
|
5
5
|
Author-email: Igor Lashkevich <3133574+necroz@users.noreply.github.com>
|
|
6
6
|
License: MIT
|
|
@@ -59,11 +59,13 @@ Dynamic: license-file
|
|
|
59
59
|
|
|
60
60
|
# sessionwiki
|
|
61
61
|
|
|
62
|
+
<!-- mcp-name: io.github.necroz/sessionwiki -->
|
|
63
|
+
|
|
62
64
|
> **Your AI coding sessions, compiled into a searchable, interlinked wiki** — from Claude Code, Codex CLI, Cursor, Gemini CLI, Copilot, ZCode and OpenCode. Local-first, with LLM synthesis, a session graph, and an MCP server so your agents can look up what you already solved.
|
|
63
65
|
|
|
64
66
|
[](https://github.com/necroz/sessionwiki/blob/master/LICENSE)
|
|
65
67
|
[](https://www.python.org/)
|
|
66
|
-
[](https://github.com/necroz/sessionwiki/blob/master/CHANGELOG.md)
|
|
67
69
|
[](https://github.com/necroz/sessionwiki/tree/master/tests)
|
|
68
70
|
[](https://github.com/necroz/sessionwiki/actions/workflows/ci.yml)
|
|
69
71
|
[](https://github.com/necroz/sessionwiki/actions/workflows/link-check.yml)
|
|
@@ -137,11 +139,19 @@ cd sessionwiki
|
|
|
137
139
|
|
|
138
140
|
`setup` creates a checkout-local `.venv`, installs the package, scaffolds `raw/`, `wiki/`, `site/`, enables the adapters for the agents it finds and runs `sessionwiki doctor`. The wrapper scripts use the venv automatically; for the CLI, activate it (`source .venv/bin/activate`) or call `.venv/bin/sessionwiki`.
|
|
139
141
|
|
|
140
|
-
|
|
142
|
+
Or install the published package — pick one:
|
|
143
|
+
|
|
144
|
+
```bash
|
|
145
|
+
uv tool install sessionwiki # uv: CLI in its own isolated environment
|
|
146
|
+
uvx sessionwiki --help # uv: run without installing
|
|
147
|
+
pip install sessionwiki # pip, inside a virtualenv
|
|
148
|
+
pip install 'sessionwiki[graph]' # + graphify graph engine (also works with uv tool install)
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
Docker — serve a site you have built (image `ghcr.io/necroz/sessionwiki`, see [Docker deployment](https://github.com/necroz/sessionwiki/blob/master/docs/deploy/docker.md) for `docker compose` and running CLI commands in the container):
|
|
141
152
|
|
|
142
153
|
```bash
|
|
143
|
-
|
|
144
|
-
pip install 'sessionwiki[all] @ git+https://github.com/necroz/sessionwiki' # + graph engine, dev, e2e
|
|
154
|
+
docker run --rm -p 8765:8765 -v "$PWD/site:/wiki/site:ro" ghcr.io/necroz/sessionwiki
|
|
145
155
|
```
|
|
146
156
|
|
|
147
157
|
A step-by-step walkthrough with screenshots lives in the [setup guide](https://github.com/necroz/sessionwiki/blob/master/docs/tutorials/setup-guide.md).
|
|
@@ -203,18 +213,29 @@ Backends: `ollama` (local), `openai` (any OpenAI-compatible `/v1`: vLLM, SGLang,
|
|
|
203
213
|
|
|
204
214
|
## Ask your wiki from your agents (MCP)
|
|
205
215
|
|
|
216
|
+
**Claude Code plugin** — the MCP server plus a skill that tells the agent when to search the wiki. It asks for your sessionwiki folder on install:
|
|
217
|
+
|
|
218
|
+
```
|
|
219
|
+
/plugin marketplace add necroz/sessionwiki
|
|
220
|
+
/plugin install sessionwiki@sessionwiki
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
**Any MCP client** — run the published package with `uvx`, and point `SESSIONWIKI_HOME` at the folder that holds `raw/` and `wiki/` (run `sessionwiki sync` there first):
|
|
224
|
+
|
|
206
225
|
```json
|
|
207
226
|
{
|
|
208
227
|
"mcpServers": {
|
|
209
228
|
"sessionwiki": {
|
|
210
|
-
"command": "
|
|
211
|
-
"args": ["
|
|
212
|
-
"
|
|
229
|
+
"command": "uvx",
|
|
230
|
+
"args": ["sessionwiki", "mcp"],
|
|
231
|
+
"env": { "SESSIONWIKI_HOME": "/path/to/your/sessionwiki" }
|
|
213
232
|
}
|
|
214
233
|
}
|
|
215
234
|
}
|
|
216
235
|
```
|
|
217
236
|
|
|
237
|
+
From a source checkout, use `"command": "/path/to/sessionwiki/.venv/bin/sessionwiki"` with `"args": ["mcp"]`; the checkout is the data root, so no `env` is needed.
|
|
238
|
+
|
|
218
239
|
Add it to Claude Code, Claude Desktop, ZCode or any MCP client. Tools include `wiki_query`, `wiki_search` (optionally over raw transcripts), `wiki_read_page`, `wiki_list_sources`, `wiki_lint`, `wiki_sync`, `wiki_export`, `wiki_dashboard` and more — 12 in total, stdio transport, no SDK dependency, path-traversal guarded.
|
|
219
240
|
|
|
220
241
|
## CLI reference
|
|
@@ -236,6 +257,7 @@ sessionwiki doctor # check Python, deps, config, agent paths
|
|
|
236
257
|
sessionwiki audit # scan raw/ wiki/ site/ for usernames and secrets
|
|
237
258
|
sessionwiki zcode # export · autosync · install
|
|
238
259
|
sessionwiki opencode # export · autosync · install
|
|
260
|
+
sessionwiki mcp # MCP server on stdio
|
|
239
261
|
sessionwiki version
|
|
240
262
|
```
|
|
241
263
|
|
|
@@ -159,6 +159,7 @@ tests/test_cross_platform_paths.py
|
|
|
159
159
|
tests/test_css_dark_code_and_sticky_header.py
|
|
160
160
|
tests/test_dashboard.py
|
|
161
161
|
tests/test_default_redaction.py
|
|
162
|
+
tests/test_distribution_manifests.py
|
|
162
163
|
tests/test_docker.py
|
|
163
164
|
tests/test_docs_structure.py
|
|
164
165
|
tests/test_doctor.py
|
|
@@ -183,7 +184,6 @@ tests/test_graphify_bridge.py
|
|
|
183
184
|
tests/test_healer_comment.py
|
|
184
185
|
tests/test_highlightjs.py
|
|
185
186
|
tests/test_home_card_date_range.py
|
|
186
|
-
tests/test_homebrew_tap.py
|
|
187
187
|
tests/test_ignore.py
|
|
188
188
|
tests/test_ingest_queue_shim.py
|
|
189
189
|
tests/test_is_subagent.py
|
|
@@ -230,6 +230,7 @@ tests/test_references.py
|
|
|
230
230
|
tests/test_release_pipeline.py
|
|
231
231
|
tests/test_render_is_subagent.py
|
|
232
232
|
tests/test_render_split.py
|
|
233
|
+
tests/test_repo_root_resolution.py
|
|
233
234
|
tests/test_schedule_config.py
|
|
234
235
|
tests/test_schema.py
|
|
235
236
|
tests/test_schema_entity_types.py
|
|
@@ -26,6 +26,25 @@ def test_version_subcommand():
|
|
|
26
26
|
assert __version__ in r.stdout
|
|
27
27
|
|
|
28
28
|
|
|
29
|
+
def test_mcp_subcommand_serves_stdio(tmp_path):
|
|
30
|
+
"""`sessionwiki mcp` must start the stdio MCP server, so registry
|
|
31
|
+
clients can launch the PyPI package as `uvx sessionwiki mcp`."""
|
|
32
|
+
import json
|
|
33
|
+
import os
|
|
34
|
+
|
|
35
|
+
request = {"jsonrpc": "2.0", "id": 1, "method": "tools/list", "params": {}}
|
|
36
|
+
r = subprocess.run(
|
|
37
|
+
[sys.executable, "-m", "sessionwiki", "mcp"],
|
|
38
|
+
input=json.dumps(request) + "\n",
|
|
39
|
+
capture_output=True, text=True, timeout=30,
|
|
40
|
+
env={**os.environ, "SESSIONWIKI_HOME": str(tmp_path)},
|
|
41
|
+
)
|
|
42
|
+
assert r.returncode == 0, r.stderr
|
|
43
|
+
response = json.loads(r.stdout.splitlines()[0])
|
|
44
|
+
names = {tool["name"] for tool in response["result"]["tools"]}
|
|
45
|
+
assert {"wiki_query", "wiki_search", "wiki_read_page"} <= names
|
|
46
|
+
|
|
47
|
+
|
|
29
48
|
def test_adapters_lists_claude_code():
|
|
30
49
|
r = subprocess.run(
|
|
31
50
|
[sys.executable, "-m", "sessionwiki", "adapters"],
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
"""Guardrails for the catalog manifests: the Claude Code plugin, its
|
|
2
|
+
marketplace, the MCP Registry `server.json` and the Glama claim file.
|
|
3
|
+
|
|
4
|
+
The catalogs read these files as published, and a published MCP Registry
|
|
5
|
+
version cannot be changed, so drift between them and the package is caught
|
|
6
|
+
here instead of after a release.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
import json
|
|
12
|
+
import re
|
|
13
|
+
from pathlib import Path
|
|
14
|
+
|
|
15
|
+
from sessionwiki import __version__
|
|
16
|
+
from sessionwiki.cli import build_parser
|
|
17
|
+
|
|
18
|
+
REPO_ROOT = Path(__file__).resolve().parents[1]
|
|
19
|
+
SERVER_JSON = REPO_ROOT / "server.json"
|
|
20
|
+
MARKETPLACE_JSON = REPO_ROOT / ".claude-plugin" / "marketplace.json"
|
|
21
|
+
PLUGIN_DIR = REPO_ROOT / "plugin"
|
|
22
|
+
PLUGIN_JSON = PLUGIN_DIR / ".claude-plugin" / "plugin.json"
|
|
23
|
+
GLAMA_JSON = REPO_ROOT / "glama.json"
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def _load(path: Path) -> dict:
|
|
27
|
+
return json.loads(path.read_text(encoding="utf-8"))
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def _subcommands() -> set[str]:
|
|
31
|
+
for action in build_parser()._actions:
|
|
32
|
+
if isinstance(getattr(action, "choices", None), dict):
|
|
33
|
+
return set(action.choices)
|
|
34
|
+
raise AssertionError("no subparsers on build_parser()")
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def test_server_json_versions_match_package():
|
|
38
|
+
server = _load(SERVER_JSON)
|
|
39
|
+
assert server["version"] == __version__
|
|
40
|
+
for package in server["packages"]:
|
|
41
|
+
assert package["version"] == __version__
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def test_server_json_pypi_package_runs_the_mcp_subcommand():
|
|
45
|
+
(package,) = [p for p in _load(SERVER_JSON)["packages"] if p["registryType"] == "pypi"]
|
|
46
|
+
assert package["identifier"] == "sessionwiki"
|
|
47
|
+
assert package["transport"] == {"type": "stdio"}
|
|
48
|
+
args = [a["value"] for a in package.get("packageArguments", [])]
|
|
49
|
+
assert args == ["mcp"]
|
|
50
|
+
assert "mcp" in _subcommands()
|
|
51
|
+
env = {e["name"] for e in package.get("environmentVariables", [])}
|
|
52
|
+
assert "SESSIONWIKI_HOME" in env
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def test_server_json_description_fits_registry_limit():
|
|
56
|
+
assert len(_load(SERVER_JSON)["description"]) <= 100
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def test_readme_carries_the_registry_ownership_line():
|
|
60
|
+
"""The MCP Registry checks the PyPI description (our README) for
|
|
61
|
+
`mcp-name: <server name>`, followed by whitespace or `-->`."""
|
|
62
|
+
name = _load(SERVER_JSON)["name"]
|
|
63
|
+
readme = (REPO_ROOT / "README.md").read_text(encoding="utf-8")
|
|
64
|
+
assert re.search(rf"mcp-name: {re.escape(name)}(\s|-->)", readme)
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def test_plugin_version_matches_package():
|
|
68
|
+
assert _load(PLUGIN_JSON)["version"] == __version__
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def test_plugin_mcp_server_uses_the_mcp_subcommand_and_user_folder():
|
|
72
|
+
plugin = _load(PLUGIN_JSON)
|
|
73
|
+
server = plugin["mcpServers"]["sessionwiki"]
|
|
74
|
+
assert server["args"][-1] == "mcp"
|
|
75
|
+
home = server["env"]["SESSIONWIKI_HOME"]
|
|
76
|
+
key = re.fullmatch(r"\$\{user_config\.(\w+)\}", home).group(1)
|
|
77
|
+
assert plugin["userConfig"][key]["required"] is True
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def test_marketplace_points_to_the_plugin_folder():
|
|
81
|
+
market = _load(MARKETPLACE_JSON)
|
|
82
|
+
assert market["owner"]["name"]
|
|
83
|
+
(entry,) = market["plugins"]
|
|
84
|
+
assert entry["name"] == _load(PLUGIN_JSON)["name"]
|
|
85
|
+
assert (REPO_ROOT / entry["source"]).resolve() == PLUGIN_DIR.resolve()
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def test_plugin_skills_have_frontmatter():
|
|
89
|
+
skills = sorted((PLUGIN_DIR / "skills").glob("*/SKILL.md"))
|
|
90
|
+
assert skills
|
|
91
|
+
for skill in skills:
|
|
92
|
+
text = skill.read_text(encoding="utf-8")
|
|
93
|
+
assert text.startswith("---\n")
|
|
94
|
+
assert re.search(rf"^name: {skill.parent.name}$", text, re.MULTILINE)
|
|
95
|
+
assert re.search(r"^description: \S", text, re.MULTILINE)
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def test_glama_claim_names_a_maintainer():
|
|
99
|
+
assert _load(GLAMA_JSON)["maintainers"]
|
|
@@ -97,10 +97,9 @@ def test_lychee_skips_known_future_urls():
|
|
|
97
97
|
assert "v1\\\\.1" in text or "v1.1" in text
|
|
98
98
|
|
|
99
99
|
|
|
100
|
-
def
|
|
100
|
+
def test_lychee_skips_pypi_placeholder():
|
|
101
101
|
text = LYCHEE.read_text(encoding="utf-8")
|
|
102
102
|
assert "pypi" in text
|
|
103
|
-
assert "homebrew-sessionwiki" in text
|
|
104
103
|
|
|
105
104
|
|
|
106
105
|
# ─── workflow ─────────────────────────────────────────────────────────
|
|
@@ -155,3 +155,13 @@ def test_check_release_artifacts_script_runs_twine_check():
|
|
|
155
155
|
# metadata issues that trip up PyPI.
|
|
156
156
|
assert "python -m build" in text or "python3 -m build" in text
|
|
157
157
|
assert "twine check" in text
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
def test_release_job_publishes_a_release_drafter_draft():
|
|
161
|
+
"""Release Drafter pre-creates a draft for the next tag; the release
|
|
162
|
+
job must publish it, not just upload assets to it (v2.0.1 stayed a
|
|
163
|
+
draft until published by hand)."""
|
|
164
|
+
text = (REPO_ROOT / ".github" / "workflows" / "release.yml").read_text(encoding="utf-8")
|
|
165
|
+
assert "--json isDraft" in text
|
|
166
|
+
assert "--draft=false" in text
|
|
167
|
+
assert "--latest=false" in text # pre-releases must not become Latest
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"""Where sessionwiki keeps raw/, wiki/ and site/.
|
|
2
|
+
|
|
3
|
+
Before 2.0.1 the root was always the parent of the package directory.
|
|
4
|
+
That is right for a git clone, but for `pip install` / `uv tool install`
|
|
5
|
+
/ Docker it is `site-packages`, so `sessionwiki init` scaffolded raw/,
|
|
6
|
+
wiki/ and site/ inside the virtualenv (or failed on a read-only image).
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
import os
|
|
12
|
+
import subprocess
|
|
13
|
+
import sys
|
|
14
|
+
from pathlib import Path
|
|
15
|
+
|
|
16
|
+
import pytest
|
|
17
|
+
|
|
18
|
+
from sessionwiki import _resolve_root
|
|
19
|
+
|
|
20
|
+
CHECKOUT = Path(__file__).resolve().parent.parent
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def _clear(monkeypatch):
|
|
24
|
+
monkeypatch.delenv("SESSIONWIKI_HOME", raising=False)
|
|
25
|
+
monkeypatch.delenv("LLMWIKI_HOME", raising=False)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def test_source_checkout_is_the_root(monkeypatch, tmp_path):
|
|
29
|
+
_clear(monkeypatch)
|
|
30
|
+
monkeypatch.chdir(tmp_path)
|
|
31
|
+
pkg = CHECKOUT / "sessionwiki" / "__init__.py"
|
|
32
|
+
assert _resolve_root(pkg) == CHECKOUT
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def test_installed_package_uses_the_current_directory(monkeypatch, tmp_path):
|
|
36
|
+
_clear(monkeypatch)
|
|
37
|
+
site_packages = tmp_path / "venv" / "lib" / "site-packages"
|
|
38
|
+
pkg = site_packages / "sessionwiki" / "__init__.py"
|
|
39
|
+
pkg.parent.mkdir(parents=True)
|
|
40
|
+
pkg.write_text("", encoding="utf-8")
|
|
41
|
+
work = tmp_path / "work"
|
|
42
|
+
work.mkdir()
|
|
43
|
+
monkeypatch.chdir(work)
|
|
44
|
+
assert _resolve_root(pkg) == work.resolve()
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
@pytest.mark.parametrize("var", ["SESSIONWIKI_HOME", "LLMWIKI_HOME"])
|
|
48
|
+
def test_environment_variable_wins(monkeypatch, tmp_path, var):
|
|
49
|
+
_clear(monkeypatch)
|
|
50
|
+
home = tmp_path / "my-wiki"
|
|
51
|
+
monkeypatch.setenv(var, str(home))
|
|
52
|
+
assert _resolve_root(CHECKOUT / "sessionwiki" / "__init__.py") == home.resolve()
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def test_sessionwiki_home_beats_legacy_name(monkeypatch, tmp_path):
|
|
56
|
+
monkeypatch.setenv("SESSIONWIKI_HOME", str(tmp_path / "new"))
|
|
57
|
+
monkeypatch.setenv("LLMWIKI_HOME", str(tmp_path / "old"))
|
|
58
|
+
assert _resolve_root(CHECKOUT / "sessionwiki" / "__init__.py") == (tmp_path / "new").resolve()
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def test_blank_environment_variable_is_ignored(monkeypatch, tmp_path):
|
|
62
|
+
_clear(monkeypatch)
|
|
63
|
+
monkeypatch.setenv("SESSIONWIKI_HOME", " ")
|
|
64
|
+
assert _resolve_root(CHECKOUT / "sessionwiki" / "__init__.py") == CHECKOUT
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def test_init_from_an_installed_copy_writes_into_the_working_directory(tmp_path):
|
|
68
|
+
"""End-to-end: a copy of the package outside any checkout (like
|
|
69
|
+
site-packages) must scaffold into the current directory."""
|
|
70
|
+
site_packages = tmp_path / "site-packages"
|
|
71
|
+
subprocess.run(
|
|
72
|
+
[sys.executable, "-c",
|
|
73
|
+
"import shutil, sys; shutil.copytree(sys.argv[1], sys.argv[2], "
|
|
74
|
+
"ignore=shutil.ignore_patterns('__pycache__'))",
|
|
75
|
+
str(CHECKOUT / "sessionwiki"), str(site_packages / "sessionwiki")],
|
|
76
|
+
check=True,
|
|
77
|
+
)
|
|
78
|
+
work = tmp_path / "work"
|
|
79
|
+
work.mkdir()
|
|
80
|
+
env = {k: v for k, v in os.environ.items() if k not in {"SESSIONWIKI_HOME", "LLMWIKI_HOME"}}
|
|
81
|
+
env["PYTHONPATH"] = str(site_packages)
|
|
82
|
+
env["HOME"] = str(tmp_path / "home")
|
|
83
|
+
proc = subprocess.run(
|
|
84
|
+
[sys.executable, "-m", "sessionwiki", "init"],
|
|
85
|
+
cwd=str(work), env=env, capture_output=True, text=True,
|
|
86
|
+
)
|
|
87
|
+
assert proc.returncode == 0, proc.stderr[-500:]
|
|
88
|
+
assert (work / "raw").is_dir() and (work / "wiki").is_dir()
|
|
89
|
+
assert not (site_packages / "raw").exists()
|
|
90
|
+
assert not (site_packages / "wiki").exists()
|