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.
Files changed (282) hide show
  1. {sessionwiki-2.0.1/sessionwiki.egg-info → sessionwiki-2.0.2}/PKG-INFO +19 -5
  2. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/README.md +18 -4
  3. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/pyproject.toml +1 -1
  4. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/__init__.py +1 -1
  5. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/cli.py +14 -0
  6. {sessionwiki-2.0.1 → sessionwiki-2.0.2/sessionwiki.egg-info}/PKG-INFO +19 -5
  7. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki.egg-info/SOURCES.txt +1 -0
  8. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_cli.py +19 -0
  9. sessionwiki-2.0.2/tests/test_distribution_manifests.py +99 -0
  10. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_release_pipeline.py +10 -0
  11. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/LICENSE +0 -0
  12. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/NOTICE +0 -0
  13. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/__main__.py +0 -0
  14. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/_frontmatter.py +0 -0
  15. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/_system_pages.py +0 -0
  16. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/adapter_config.py +0 -0
  17. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/adapters/__init__.py +0 -0
  18. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/adapters/base.py +0 -0
  19. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/adapters/claude_code.py +0 -0
  20. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/adapters/codex_cli.py +0 -0
  21. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/adapters/contrib/__init__.py +0 -0
  22. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/adapters/contrib/chatgpt.py +0 -0
  23. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/adapters/contrib/copilot_chat.py +0 -0
  24. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/adapters/contrib/copilot_cli.py +0 -0
  25. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/adapters/contrib/cursor.py +0 -0
  26. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/adapters/contrib/gemini_cli.py +0 -0
  27. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/adapters/contrib/obsidian.py +0 -0
  28. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/adapters/opencode.py +0 -0
  29. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/adapters/status.py +0 -0
  30. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/adapters/zcode.py +0 -0
  31. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/audit.py +0 -0
  32. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/backlinks.py +0 -0
  33. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/build.py +0 -0
  34. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/cache.py +0 -0
  35. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/candidates.py +0 -0
  36. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/categories.py +0 -0
  37. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/changelog_timeline.py +0 -0
  38. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/compare.py +0 -0
  39. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/completion.py +0 -0
  40. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/confidence.py +0 -0
  41. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/config.py +0 -0
  42. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/config_schedule.py +0 -0
  43. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/context_md.py +0 -0
  44. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/convert.py +0 -0
  45. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/docs_pages.py +0 -0
  46. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/doctor.py +0 -0
  47. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/exporters.py +0 -0
  48. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/freshness.py +0 -0
  49. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/graph.py +0 -0
  50. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/graphify_bridge.py +0 -0
  51. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/ingest_queue.py +0 -0
  52. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/lifecycle.py +0 -0
  53. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/link_checker.py +0 -0
  54. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/lint/__init__.py +0 -0
  55. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/lint/rules/__init__.py +0 -0
  56. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/lint/rules/_helpers.py +0 -0
  57. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/lint/rules/claim_verification.py +0 -0
  58. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/lint/rules/content_freshness.py +0 -0
  59. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/lint/rules/contradiction_detection.py +0 -0
  60. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/lint/rules/duplicate_detection.py +0 -0
  61. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/lint/rules/entity_consistency.py +0 -0
  62. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/lint/rules/frontmatter_completeness.py +0 -0
  63. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/lint/rules/frontmatter_count_consistency.py +0 -0
  64. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/lint/rules/frontmatter_validity.py +0 -0
  65. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/lint/rules/index_sync.py +0 -0
  66. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/lint/rules/link_integrity.py +0 -0
  67. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/lint/rules/orphan_detection.py +0 -0
  68. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/lint/rules/stale_candidates.py +0 -0
  69. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/lint/rules/stale_reference_detection.py +0 -0
  70. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/lint/rules/summary_accuracy.py +0 -0
  71. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/lint/rules/tags_topics_convention.py +0 -0
  72. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/lint/rules/tools_consistency.py +0 -0
  73. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/lock.py +0 -0
  74. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/log_reader.py +0 -0
  75. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/manifest.py +0 -0
  76. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/mcp/__init__.py +0 -0
  77. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/mcp/__main__.py +0 -0
  78. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/mcp/server.py +0 -0
  79. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/models_page.py +0 -0
  80. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/obsidian_output.py +0 -0
  81. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/opencode/__init__.py +0 -0
  82. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/opencode/autosync.py +0 -0
  83. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/opencode/export.py +0 -0
  84. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/opencode/install.py +0 -0
  85. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/pipeline.py +0 -0
  86. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/project_topics.py +0 -0
  87. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/py.typed +0 -0
  88. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/quarantine.py +0 -0
  89. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/queue.py +0 -0
  90. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/references.py +0 -0
  91. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/render/__init__.py +0 -0
  92. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/render/css.py +0 -0
  93. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/render/docs_css.py +0 -0
  94. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/render/js.py +0 -0
  95. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/schema.py +0 -0
  96. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/search_facets.py +0 -0
  97. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/search_tree.py +0 -0
  98. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/serve.py +0 -0
  99. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/session_export.py +0 -0
  100. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/skill_installer.py +0 -0
  101. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/sync/__init__.py +0 -0
  102. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/sync/status.py +0 -0
  103. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/synth/__init__.py +0 -0
  104. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/synth/agent_delegate.py +0 -0
  105. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/synth/base.py +0 -0
  106. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/synth/cli_helpers.py +0 -0
  107. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/synth/estimate.py +0 -0
  108. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/synth/ollama.py +0 -0
  109. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/synth/openai_compat.py +0 -0
  110. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/synth/pipeline.py +0 -0
  111. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/tag_utils.py +0 -0
  112. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/tags.py +0 -0
  113. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/vault.py +0 -0
  114. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/viz_heatmap.py +0 -0
  115. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/viz_tokens.py +0 -0
  116. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/viz_tools.py +0 -0
  117. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/watch.py +0 -0
  118. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/zcode/__init__.py +0 -0
  119. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/zcode/autosync.py +0 -0
  120. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/zcode/export.py +0 -0
  121. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki/zcode/install.py +0 -0
  122. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki.egg-info/dependency_links.txt +0 -0
  123. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki.egg-info/entry_points.txt +0 -0
  124. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki.egg-info/requires.txt +0 -0
  125. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/sessionwiki.egg-info/top_level.txt +0 -0
  126. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/setup.cfg +0 -0
  127. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_activity_timeline_label.py +0 -0
  128. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_adapter_config.py +0 -0
  129. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_adapter_graduation.py +0 -0
  130. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_adapter_is_available_unified.py +0 -0
  131. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_adapter_tag.py +0 -0
  132. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_adapters.py +0 -0
  133. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_agent_badges.py +0 -0
  134. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_agent_delegate.py +0 -0
  135. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_ai_suggested_tags.py +0 -0
  136. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_audit.py +0 -0
  137. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_backlinks.py +0 -0
  138. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_brand_system_doc.py +0 -0
  139. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_cache.py +0 -0
  140. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_candidates.py +0 -0
  141. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_categories.py +0 -0
  142. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_changelog_page.py +0 -0
  143. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_changelog_timeline.py +0 -0
  144. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_chatgpt_adapter.py +0 -0
  145. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_chip_contrast.py +0 -0
  146. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_ci_workflow.py +0 -0
  147. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_cli_doc_parity.py +0 -0
  148. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_cli_observability.py +0 -0
  149. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_cmd_all_parser.py +0 -0
  150. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_cmd_graph_fallback.py +0 -0
  151. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_collision_retry.py +0 -0
  152. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_compare.py +0 -0
  153. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_completion.py +0 -0
  154. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_confidence.py +0 -0
  155. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_config_layering.py +0 -0
  156. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_context_md.py +0 -0
  157. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_convert.py +0 -0
  158. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_convert_no_op_perf.py +0 -0
  159. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_convert_state_and_coerce.py +0 -0
  160. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_converter_metrics.py +0 -0
  161. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_copilot_adapters.py +0 -0
  162. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_cross_platform_paths.py +0 -0
  163. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_css_dark_code_and_sticky_header.py +0 -0
  164. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_dashboard.py +0 -0
  165. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_default_redaction.py +0 -0
  166. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_docker.py +0 -0
  167. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_docs_structure.py +0 -0
  168. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_doctor.py +0 -0
  169. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_edge_cases.py +0 -0
  170. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_edge_cases_unit.py +0 -0
  171. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_editorconfig_lychee.py +0 -0
  172. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_filter_slug_label.py +0 -0
  173. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_flat_naming.py +0 -0
  174. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_force_counters.py +0 -0
  175. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_freshness.py +0 -0
  176. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_frontmatter_consolidation.py +0 -0
  177. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_frontmatter_shared.py +0 -0
  178. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_gap_fixes.py +0 -0
  179. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_github_link_rewriter.py +0 -0
  180. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_graph_context_menu.py +0 -0
  181. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_graph_session.py +0 -0
  182. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_graph_site_url.py +0 -0
  183. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_graph_theme_sync.py +0 -0
  184. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_graph_top_nav.py +0 -0
  185. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_graph_viewer.py +0 -0
  186. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_graphify_bridge.py +0 -0
  187. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_healer_comment.py +0 -0
  188. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_highlightjs.py +0 -0
  189. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_home_card_date_range.py +0 -0
  190. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_ignore.py +0 -0
  191. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_ingest_queue_shim.py +0 -0
  192. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_is_subagent.py +0 -0
  193. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_issue_383_pipeline.py +0 -0
  194. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_lifecycle.py +0 -0
  195. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_light_mode_polish.py +0 -0
  196. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_lint_perf.py +0 -0
  197. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_lint_rules.py +0 -0
  198. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_lint_windows_paths.py +0 -0
  199. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_log_reader.py +0 -0
  200. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_mcp_byte_cap.py +0 -0
  201. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_mcp_enhanced.py +0 -0
  202. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_mcp_protocol.py +0 -0
  203. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_mcp_read_page_allowlist.py +0 -0
  204. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_mcp_safety.py +0 -0
  205. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_md_cache.py +0 -0
  206. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_mobile_hamburger_nav.py +0 -0
  207. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_models_page.py +0 -0
  208. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_no_phantom_adapters.py +0 -0
  209. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_obsidian_docs.py +0 -0
  210. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_obsidian_templates.py +0 -0
  211. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_ollama_backend.py +0 -0
  212. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_openai_compat.py +0 -0
  213. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_opencode_adapter.py +0 -0
  214. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_opencode_autosync.py +0 -0
  215. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_opencode_cli.py +0 -0
  216. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_opencode_export.py +0 -0
  217. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_opencode_install.py +0 -0
  218. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_palette_dialog_a11y.py +0 -0
  219. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_palette_indexes.py +0 -0
  220. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_parse_jsonl_oserror.py +0 -0
  221. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_path_traversal.py +0 -0
  222. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_post_review_remediation.py +0 -0
  223. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_pr_template.py +0 -0
  224. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_project_stubs.py +0 -0
  225. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_project_topics.py +0 -0
  226. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_quarantine.py +0 -0
  227. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_queue.py +0 -0
  228. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_raw_immutability.py +0 -0
  229. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_reader_api_doc.py +0 -0
  230. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_readme_badges.py +0 -0
  231. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_reference_coverage.py +0 -0
  232. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_references.py +0 -0
  233. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_render_is_subagent.py +0 -0
  234. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_render_split.py +0 -0
  235. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_repo_root_resolution.py +0 -0
  236. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_schedule_config.py +0 -0
  237. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_schema.py +0 -0
  238. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_schema_entity_types.py +0 -0
  239. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_search_facets.py +0 -0
  240. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_search_tree.py +0 -0
  241. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_serve_smoke.py +0 -0
  242. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_session_description.py +0 -0
  243. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_session_export.py +0 -0
  244. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_session_ref_stripper.py +0 -0
  245. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_sessions_index_no_date_dup.py +0 -0
  246. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_setup_guide_doc.py +0 -0
  247. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_setup_scripts.py +0 -0
  248. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_skill_installer.py +0 -0
  249. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_slash_cli_parity.py +0 -0
  250. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_slug_fallback.py +0 -0
  251. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_state_locking.py +0 -0
  252. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_subprocess_paths.py +0 -0
  253. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_synth_coalesce.py +0 -0
  254. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_synth_config_loading.py +0 -0
  255. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_synth_pipeline.py +0 -0
  256. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_synthesize_cli_pending.py +0 -0
  257. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_synthesize_estimate.py +0 -0
  258. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_synthesize_overview_safety.py +0 -0
  259. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_tag_utils.py +0 -0
  260. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_tags.py +0 -0
  261. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_theme_pre_paint.py +0 -0
  262. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_tutorial_ux.py +0 -0
  263. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_two_way_editing.py +0 -0
  264. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_ui_a11y_bundle_473.py +0 -0
  265. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_username_autodetect.py +0 -0
  266. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_username_redact_paths.py +0 -0
  267. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_v02.py +0 -0
  268. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_v03.py +0 -0
  269. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_v04.py +0 -0
  270. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_v1378_remediation.py +0 -0
  271. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_vault.py +0 -0
  272. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_vault_sync_routing.py +0 -0
  273. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_viewport_meta.py +0 -0
  274. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_viz_heatmap.py +0 -0
  275. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_viz_tokens.py +0 -0
  276. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_viz_tools.py +0 -0
  277. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_wcag_contrast.py +0 -0
  278. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_zcode_adapter.py +0 -0
  279. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_zcode_autosync.py +0 -0
  280. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_zcode_cli.py +0 -0
  281. {sessionwiki-2.0.1 → sessionwiki-2.0.2}/tests/test_zcode_export.py +0 -0
  282. {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.1
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
  [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://github.com/necroz/sessionwiki/blob/master/LICENSE)
65
67
  [![Python 3.9+](https://img.shields.io/badge/python-3.9+-blue.svg)](https://www.python.org/)
66
- [![Version](https://img.shields.io/badge/version-v2.0.1-10B981.svg)](https://github.com/necroz/sessionwiki/blob/master/CHANGELOG.md)
68
+ [![Version](https://img.shields.io/badge/version-v2.0.2-10B981.svg)](https://github.com/necroz/sessionwiki/blob/master/CHANGELOG.md)
67
69
  [![Tests](https://img.shields.io/badge/tests-2886%20passing-10B981.svg)](https://github.com/necroz/sessionwiki/tree/master/tests)
68
70
  [![CI](https://github.com/necroz/sessionwiki/actions/workflows/ci.yml/badge.svg?branch=master)](https://github.com/necroz/sessionwiki/actions/workflows/ci.yml)
69
71
  [![Link check](https://github.com/necroz/sessionwiki/actions/workflows/link-check.yml/badge.svg?branch=master)](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": "/path/to/sessionwiki/.venv/bin/python",
219
- "args": ["-m", "sessionwiki.mcp"],
220
- "cwd": "/path/to/sessionwiki"
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
  [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://github.com/necroz/sessionwiki/blob/master/LICENSE)
6
8
  [![Python 3.9+](https://img.shields.io/badge/python-3.9+-blue.svg)](https://www.python.org/)
7
- [![Version](https://img.shields.io/badge/version-v2.0.1-10B981.svg)](https://github.com/necroz/sessionwiki/blob/master/CHANGELOG.md)
9
+ [![Version](https://img.shields.io/badge/version-v2.0.2-10B981.svg)](https://github.com/necroz/sessionwiki/blob/master/CHANGELOG.md)
8
10
  [![Tests](https://img.shields.io/badge/tests-2886%20passing-10B981.svg)](https://github.com/necroz/sessionwiki/tree/master/tests)
9
11
  [![CI](https://github.com/necroz/sessionwiki/actions/workflows/ci.yml/badge.svg?branch=master)](https://github.com/necroz/sessionwiki/actions/workflows/ci.yml)
10
12
  [![Link check](https://github.com/necroz/sessionwiki/actions/workflows/link-check.yml/badge.svg?branch=master)](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": "/path/to/sessionwiki/.venv/bin/python",
160
- "args": ["-m", "sessionwiki.mcp"],
161
- "cwd": "/path/to/sessionwiki"
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.1"
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,7 +15,7 @@ Public API:
15
15
  - sessionwiki.mcp.server.main() — MCP server (stdio)
16
16
  """
17
17
 
18
- __version__ = "2.0.1"
18
+ __version__ = "2.0.2"
19
19
  __author__ = "Igor Lashkevich" # based on llmwiki by Pratiyush (MIT)
20
20
  __license__ = "MIT"
21
21
 
@@ -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.1
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
  [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://github.com/necroz/sessionwiki/blob/master/LICENSE)
65
67
  [![Python 3.9+](https://img.shields.io/badge/python-3.9+-blue.svg)](https://www.python.org/)
66
- [![Version](https://img.shields.io/badge/version-v2.0.1-10B981.svg)](https://github.com/necroz/sessionwiki/blob/master/CHANGELOG.md)
68
+ [![Version](https://img.shields.io/badge/version-v2.0.2-10B981.svg)](https://github.com/necroz/sessionwiki/blob/master/CHANGELOG.md)
67
69
  [![Tests](https://img.shields.io/badge/tests-2886%20passing-10B981.svg)](https://github.com/necroz/sessionwiki/tree/master/tests)
68
70
  [![CI](https://github.com/necroz/sessionwiki/actions/workflows/ci.yml/badge.svg?branch=master)](https://github.com/necroz/sessionwiki/actions/workflows/ci.yml)
69
71
  [![Link check](https://github.com/necroz/sessionwiki/actions/workflows/link-check.yml/badge.svg?branch=master)](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": "/path/to/sessionwiki/.venv/bin/python",
219
- "args": ["-m", "sessionwiki.mcp"],
220
- "cwd": "/path/to/sessionwiki"
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