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