sessionwiki 2.0.1__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.1/sessionwiki.egg-info → sessionwiki-2.0.2}/PKG-INFO +19 -5
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/README.md +18 -4
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/pyproject.toml +1 -1
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/__init__.py +1 -1
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/cli.py +14 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2/sessionwiki.egg-info}/PKG-INFO +19 -5
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki.egg-info/SOURCES.txt +1 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_cli.py +19 -0
- sessionwiki-2.0.2/tests/test_distribution_manifests.py +99 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_release_pipeline.py +10 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/LICENSE +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/NOTICE +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/__main__.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/_frontmatter.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/_system_pages.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/adapter_config.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/adapters/__init__.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/adapters/base.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/adapters/claude_code.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/adapters/codex_cli.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/adapters/contrib/__init__.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/adapters/contrib/chatgpt.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/adapters/contrib/copilot_chat.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/adapters/contrib/copilot_cli.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/adapters/contrib/cursor.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/adapters/contrib/gemini_cli.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/adapters/contrib/obsidian.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/adapters/opencode.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/adapters/status.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/adapters/zcode.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/audit.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/backlinks.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/build.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/cache.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/candidates.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/categories.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/changelog_timeline.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/compare.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/completion.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/confidence.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/config.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/config_schedule.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/context_md.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/convert.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/docs_pages.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/doctor.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/exporters.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/freshness.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/graph.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/graphify_bridge.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/ingest_queue.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/lifecycle.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/link_checker.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/lint/__init__.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/lint/rules/__init__.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/lint/rules/_helpers.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/lint/rules/claim_verification.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/lint/rules/content_freshness.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/lint/rules/contradiction_detection.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/lint/rules/duplicate_detection.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/lint/rules/entity_consistency.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/lint/rules/frontmatter_completeness.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/lint/rules/frontmatter_count_consistency.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/lint/rules/frontmatter_validity.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/lint/rules/index_sync.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/lint/rules/link_integrity.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/lint/rules/orphan_detection.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/lint/rules/stale_candidates.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/lint/rules/stale_reference_detection.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/lint/rules/summary_accuracy.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/lint/rules/tags_topics_convention.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/lint/rules/tools_consistency.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/lock.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/log_reader.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/manifest.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/mcp/__init__.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/mcp/__main__.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/mcp/server.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/models_page.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/obsidian_output.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/opencode/__init__.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/opencode/autosync.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/opencode/export.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/opencode/install.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/pipeline.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/project_topics.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/py.typed +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/quarantine.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/queue.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/references.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/render/__init__.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/render/css.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/render/docs_css.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/render/js.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/schema.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/search_facets.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/search_tree.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/serve.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/session_export.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/skill_installer.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/sync/__init__.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/sync/status.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/synth/__init__.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/synth/agent_delegate.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/synth/base.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/synth/cli_helpers.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/synth/estimate.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/synth/ollama.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/synth/openai_compat.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/synth/pipeline.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/tag_utils.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/tags.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/vault.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/viz_heatmap.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/viz_tokens.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/viz_tools.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/watch.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/zcode/__init__.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/zcode/autosync.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/zcode/export.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/zcode/install.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki.egg-info/dependency_links.txt +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki.egg-info/entry_points.txt +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki.egg-info/requires.txt +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki.egg-info/top_level.txt +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/setup.cfg +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_activity_timeline_label.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_adapter_config.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_adapter_graduation.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_adapter_is_available_unified.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_adapter_tag.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_adapters.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_agent_badges.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_agent_delegate.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_ai_suggested_tags.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_audit.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_backlinks.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_brand_system_doc.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_cache.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_candidates.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_categories.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_changelog_page.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_changelog_timeline.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_chatgpt_adapter.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_chip_contrast.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_ci_workflow.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_cli_doc_parity.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_cli_observability.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_cmd_all_parser.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_cmd_graph_fallback.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_collision_retry.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_compare.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_completion.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_confidence.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_config_layering.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_context_md.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_convert.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_convert_no_op_perf.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_convert_state_and_coerce.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_converter_metrics.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_copilot_adapters.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_cross_platform_paths.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_css_dark_code_and_sticky_header.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_dashboard.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_default_redaction.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_docker.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_docs_structure.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_doctor.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_edge_cases.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_edge_cases_unit.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_editorconfig_lychee.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_filter_slug_label.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_flat_naming.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_force_counters.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_freshness.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_frontmatter_consolidation.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_frontmatter_shared.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_gap_fixes.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_github_link_rewriter.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_graph_context_menu.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_graph_session.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_graph_site_url.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_graph_theme_sync.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_graph_top_nav.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_graph_viewer.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_graphify_bridge.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_healer_comment.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_highlightjs.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_home_card_date_range.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_ignore.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_ingest_queue_shim.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_is_subagent.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_issue_383_pipeline.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_lifecycle.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_light_mode_polish.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_lint_perf.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_lint_rules.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_lint_windows_paths.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_log_reader.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_mcp_byte_cap.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_mcp_enhanced.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_mcp_protocol.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_mcp_read_page_allowlist.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_mcp_safety.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_md_cache.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_mobile_hamburger_nav.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_models_page.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_no_phantom_adapters.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_obsidian_docs.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_obsidian_templates.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_ollama_backend.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_openai_compat.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_opencode_adapter.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_opencode_autosync.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_opencode_cli.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_opencode_export.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_opencode_install.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_palette_dialog_a11y.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_palette_indexes.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_parse_jsonl_oserror.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_path_traversal.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_post_review_remediation.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_pr_template.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_project_stubs.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_project_topics.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_quarantine.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_queue.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_raw_immutability.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_reader_api_doc.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_readme_badges.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_reference_coverage.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_references.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_render_is_subagent.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_render_split.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_repo_root_resolution.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_schedule_config.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_schema.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_schema_entity_types.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_search_facets.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_search_tree.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_serve_smoke.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_session_description.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_session_export.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_session_ref_stripper.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_sessions_index_no_date_dup.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_setup_guide_doc.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_setup_scripts.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_skill_installer.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_slash_cli_parity.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_slug_fallback.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_state_locking.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_subprocess_paths.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_synth_coalesce.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_synth_config_loading.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_synth_pipeline.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_synthesize_cli_pending.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_synthesize_estimate.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_synthesize_overview_safety.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_tag_utils.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_tags.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_theme_pre_paint.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_tutorial_ux.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_two_way_editing.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_ui_a11y_bundle_473.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_username_autodetect.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_username_redact_paths.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_v02.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_v03.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_v04.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_v1378_remediation.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_vault.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_vault_sync_routing.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_viewport_meta.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_viz_heatmap.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_viz_tokens.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_viz_tools.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_wcag_contrast.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_zcode_adapter.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_zcode_autosync.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_zcode_cli.py +0 -0
- {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_zcode_export.py +0 -0
- {sessionwiki-2.0.1 → 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)
|
|
@@ -211,18 +213,29 @@ Backends: `ollama` (local), `openai` (any OpenAI-compatible `/v1`: vLLM, SGLang,
|
|
|
211
213
|
|
|
212
214
|
## Ask your wiki from your agents (MCP)
|
|
213
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
|
+
|
|
214
225
|
```json
|
|
215
226
|
{
|
|
216
227
|
"mcpServers": {
|
|
217
228
|
"sessionwiki": {
|
|
218
|
-
"command": "
|
|
219
|
-
"args": ["
|
|
220
|
-
"
|
|
229
|
+
"command": "uvx",
|
|
230
|
+
"args": ["sessionwiki", "mcp"],
|
|
231
|
+
"env": { "SESSIONWIKI_HOME": "/path/to/your/sessionwiki" }
|
|
221
232
|
}
|
|
222
233
|
}
|
|
223
234
|
}
|
|
224
235
|
```
|
|
225
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
|
+
|
|
226
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.
|
|
227
240
|
|
|
228
241
|
## CLI reference
|
|
@@ -244,6 +257,7 @@ sessionwiki doctor # check Python, deps, config, agent paths
|
|
|
244
257
|
sessionwiki audit # scan raw/ wiki/ site/ for usernames and secrets
|
|
245
258
|
sessionwiki zcode # export · autosync · install
|
|
246
259
|
sessionwiki opencode # export · autosync · install
|
|
260
|
+
sessionwiki mcp # MCP server on stdio
|
|
247
261
|
sessionwiki version
|
|
248
262
|
```
|
|
249
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)
|
|
@@ -152,18 +154,29 @@ Backends: `ollama` (local), `openai` (any OpenAI-compatible `/v1`: vLLM, SGLang,
|
|
|
152
154
|
|
|
153
155
|
## Ask your wiki from your agents (MCP)
|
|
154
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
|
+
|
|
155
166
|
```json
|
|
156
167
|
{
|
|
157
168
|
"mcpServers": {
|
|
158
169
|
"sessionwiki": {
|
|
159
|
-
"command": "
|
|
160
|
-
"args": ["
|
|
161
|
-
"
|
|
170
|
+
"command": "uvx",
|
|
171
|
+
"args": ["sessionwiki", "mcp"],
|
|
172
|
+
"env": { "SESSIONWIKI_HOME": "/path/to/your/sessionwiki" }
|
|
162
173
|
}
|
|
163
174
|
}
|
|
164
175
|
}
|
|
165
176
|
```
|
|
166
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
|
+
|
|
167
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.
|
|
168
181
|
|
|
169
182
|
## CLI reference
|
|
@@ -185,6 +198,7 @@ sessionwiki doctor # check Python, deps, config, agent paths
|
|
|
185
198
|
sessionwiki audit # scan raw/ wiki/ site/ for usernames and secrets
|
|
186
199
|
sessionwiki zcode # export · autosync · install
|
|
187
200
|
sessionwiki opencode # export · autosync · install
|
|
201
|
+
sessionwiki mcp # MCP server on stdio
|
|
188
202
|
sessionwiki version
|
|
189
203
|
```
|
|
190
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"
|
|
@@ -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
|
|
|
@@ -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)
|
|
@@ -211,18 +213,29 @@ Backends: `ollama` (local), `openai` (any OpenAI-compatible `/v1`: vLLM, SGLang,
|
|
|
211
213
|
|
|
212
214
|
## Ask your wiki from your agents (MCP)
|
|
213
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
|
+
|
|
214
225
|
```json
|
|
215
226
|
{
|
|
216
227
|
"mcpServers": {
|
|
217
228
|
"sessionwiki": {
|
|
218
|
-
"command": "
|
|
219
|
-
"args": ["
|
|
220
|
-
"
|
|
229
|
+
"command": "uvx",
|
|
230
|
+
"args": ["sessionwiki", "mcp"],
|
|
231
|
+
"env": { "SESSIONWIKI_HOME": "/path/to/your/sessionwiki" }
|
|
221
232
|
}
|
|
222
233
|
}
|
|
223
234
|
}
|
|
224
235
|
```
|
|
225
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
|
+
|
|
226
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.
|
|
227
240
|
|
|
228
241
|
## CLI reference
|
|
@@ -244,6 +257,7 @@ sessionwiki doctor # check Python, deps, config, agent paths
|
|
|
244
257
|
sessionwiki audit # scan raw/ wiki/ site/ for usernames and secrets
|
|
245
258
|
sessionwiki zcode # export · autosync · install
|
|
246
259
|
sessionwiki opencode # export · autosync · install
|
|
260
|
+
sessionwiki mcp # MCP server on stdio
|
|
247
261
|
sessionwiki version
|
|
248
262
|
```
|
|
249
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
|
|
@@ -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"]
|
|
@@ -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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/lint/rules/frontmatter_count_consistency.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|