reprompt-cli 0.9.2__tar.gz → 1.0.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (203) hide show
  1. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/.github/workflows/ci.yml +1 -1
  2. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/.github/workflows/publish.yml +8 -0
  3. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/CHANGELOG.md +88 -0
  4. reprompt_cli-1.0.0/PKG-INFO +143 -0
  5. reprompt_cli-1.0.0/README.md +98 -0
  6. reprompt_cli-1.0.0/docs/roadmap.md +74 -0
  7. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/pyproject.toml +10 -4
  8. reprompt_cli-1.0.0/src/reprompt/__init__.py +88 -0
  9. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/cli.py +44 -3
  10. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/core/pipeline.py +11 -4
  11. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/storage/db.py +40 -19
  12. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_cli.py +2 -2
  13. reprompt_cli-1.0.0/tests/test_coverage_boost.py +764 -0
  14. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_digest_cli.py +8 -3
  15. reprompt_cli-1.0.0/tests/test_empty_state.py +104 -0
  16. reprompt_cli-1.0.0/tests/test_public_api.py +33 -0
  17. reprompt_cli-1.0.0/tests/test_schema_version.py +128 -0
  18. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/uv.lock +4 -774
  19. reprompt_cli-0.9.2/PKG-INFO +0 -318
  20. reprompt_cli-0.9.2/README.md +0 -270
  21. reprompt_cli-0.9.2/docs/roadmap.md +0 -116
  22. reprompt_cli-0.9.2/src/reprompt/__init__.py +0 -5
  23. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/.editorconfig +0 -0
  24. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  25. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  26. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  27. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  28. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  29. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/.github/dependabot.yml +0 -0
  30. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/.gitignore +0 -0
  31. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/.pre-commit-config.yaml +0 -0
  32. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/CLAUDE.md +0 -0
  33. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/CODE_OF_CONDUCT.md +0 -0
  34. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/CONTRIBUTING.md +0 -0
  35. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/LICENSE +0 -0
  36. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/SECURITY.md +0 -0
  37. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/action.yml +0 -0
  38. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/docs/launch-post.md +0 -0
  39. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/docs/superpowers/specs/2026-03-11-html-dashboard-design.md +0 -0
  40. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/docs/superpowers/specs/2026-03-11-merge-view-design.md +0 -0
  41. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/docs/superpowers/specs/2026-03-11-prompt-templates-design.md +0 -0
  42. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/scripts/generate_demo_data.py +0 -0
  43. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/scripts/launch/hn_monitor.py +0 -0
  44. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/scripts/launch/reddit_helper.py +0 -0
  45. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/adapters/__init__.py +0 -0
  46. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/adapters/aider.py +0 -0
  47. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/adapters/base.py +0 -0
  48. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/adapters/chatgpt.py +0 -0
  49. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/adapters/claude_chat.py +0 -0
  50. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/adapters/claude_code.py +0 -0
  51. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/adapters/cline.py +0 -0
  52. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/adapters/cursor.py +0 -0
  53. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/adapters/filters.py +0 -0
  54. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/adapters/gemini.py +0 -0
  55. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/adapters/openclaw.py +0 -0
  56. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/bridge/__init__.py +0 -0
  57. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/bridge/handler.py +0 -0
  58. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/bridge/host.py +0 -0
  59. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/bridge/manifest.py +0 -0
  60. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/bridge/protocol.py +0 -0
  61. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/commands/__init__.py +0 -0
  62. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/commands/telemetry.py +0 -0
  63. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/commands/wrapped.py +0 -0
  64. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/config.py +0 -0
  65. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/core/__init__.py +0 -0
  66. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/core/analyzer.py +0 -0
  67. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/core/dedup.py +0 -0
  68. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/core/digest.py +0 -0
  69. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/core/effectiveness.py +0 -0
  70. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/core/extractors.py +0 -0
  71. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/core/extractors_zh.py +0 -0
  72. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/core/insights.py +0 -0
  73. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/core/lang_detect.py +0 -0
  74. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/core/library.py +0 -0
  75. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/core/lint.py +0 -0
  76. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/core/merge_view.py +0 -0
  77. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/core/models.py +0 -0
  78. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/core/persona.py +0 -0
  79. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/core/prompt_dna.py +0 -0
  80. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/core/recommend.py +0 -0
  81. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/core/scorer.py +0 -0
  82. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/core/segmenter.py +0 -0
  83. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/core/session_meta.py +0 -0
  84. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/core/style.py +0 -0
  85. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/core/templates.py +0 -0
  86. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/core/timeutil.py +0 -0
  87. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/core/trends.py +0 -0
  88. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/core/wrapped.py +0 -0
  89. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/demo.py +0 -0
  90. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/embeddings/__init__.py +0 -0
  91. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/embeddings/base.py +0 -0
  92. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/embeddings/local_embed.py +0 -0
  93. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/embeddings/ollama.py +0 -0
  94. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/embeddings/openai_embed.py +0 -0
  95. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/embeddings/tfidf.py +0 -0
  96. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/mcp.py +0 -0
  97. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/mcp_main.py +0 -0
  98. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/output/__init__.py +0 -0
  99. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/output/chartjs.min.js +0 -0
  100. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/output/html_report.py +0 -0
  101. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/output/json_out.py +0 -0
  102. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/output/markdown.py +0 -0
  103. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/output/terminal.py +0 -0
  104. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/output/wrapped_html.py +0 -0
  105. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/output/wrapped_terminal.py +0 -0
  106. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/py.typed +0 -0
  107. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/sharing/__init__.py +0 -0
  108. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/sharing/client.py +0 -0
  109. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/sharing/clipboard.py +0 -0
  110. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/storage/__init__.py +0 -0
  111. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/telemetry/__init__.py +0 -0
  112. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/telemetry/collector.py +0 -0
  113. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/telemetry/consent.py +0 -0
  114. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/telemetry/events.py +0 -0
  115. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/telemetry/prompt.py +0 -0
  116. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/telemetry/queue.py +0 -0
  117. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/telemetry/sender.py +0 -0
  118. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/__init__.py +0 -0
  119. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/conftest.py +0 -0
  120. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/fixtures/aider_chat_history.md +0 -0
  121. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/fixtures/chatgpt_conversations.json +0 -0
  122. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/fixtures/claude_chat_export.json +0 -0
  123. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/fixtures/claude_session.jsonl +0 -0
  124. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/fixtures/cline_task/api_conversation_history.json +0 -0
  125. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/fixtures/gemini_session.json +0 -0
  126. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/fixtures/openclaw_session.jsonl +0 -0
  127. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_adapter_aider.py +0 -0
  128. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_adapter_chatgpt.py +0 -0
  129. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_adapter_claude.py +0 -0
  130. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_adapter_claude_chat.py +0 -0
  131. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_adapter_cline.py +0 -0
  132. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_adapter_gemini.py +0 -0
  133. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_adapter_openclaw.py +0 -0
  134. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_analyzer.py +0 -0
  135. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_bridge_cli.py +0 -0
  136. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_bridge_handler.py +0 -0
  137. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_bridge_integration.py +0 -0
  138. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_bridge_manifest.py +0 -0
  139. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_bridge_protocol.py +0 -0
  140. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_cli_library_effectiveness.py +0 -0
  141. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_clipboard.py +0 -0
  142. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_config.py +0 -0
  143. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_cursor_adapter.py +0 -0
  144. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_db.py +0 -0
  145. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_db_digest.py +0 -0
  146. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_db_effectiveness.py +0 -0
  147. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_db_trends.py +0 -0
  148. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_dedup.py +0 -0
  149. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_demo.py +0 -0
  150. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_digest.py +0 -0
  151. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_e2e.py +0 -0
  152. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_effectiveness.py +0 -0
  153. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_embeddings_local.py +0 -0
  154. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_embeddings_ollama.py +0 -0
  155. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_embeddings_openai.py +0 -0
  156. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_extractors.py +0 -0
  157. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_extractors_routing.py +0 -0
  158. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_extractors_zh.py +0 -0
  159. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_extractors_zh_e2e.py +0 -0
  160. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_html_report.py +0 -0
  161. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_import_cli.py +0 -0
  162. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_import_e2e.py +0 -0
  163. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_insights.py +0 -0
  164. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_insights_cli.py +0 -0
  165. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_install_hook.py +0 -0
  166. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_lang_detect.py +0 -0
  167. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_library.py +0 -0
  168. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_lint.py +0 -0
  169. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_lint_cli.py +0 -0
  170. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_markdown.py +0 -0
  171. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_mcp.py +0 -0
  172. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_merge_view.py +0 -0
  173. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_models.py +0 -0
  174. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_output.py +0 -0
  175. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_persona.py +0 -0
  176. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_pipeline.py +0 -0
  177. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_prompt_dna.py +0 -0
  178. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_recommend.py +0 -0
  179. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_score_cli.py +0 -0
  180. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_scorer.py +0 -0
  181. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_segmenter.py +0 -0
  182. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_share_e2e.py +0 -0
  183. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_sharing_client.py +0 -0
  184. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_style.py +0 -0
  185. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_telemetry_cli.py +0 -0
  186. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_telemetry_collector.py +0 -0
  187. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_telemetry_consent.py +0 -0
  188. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_telemetry_e2e.py +0 -0
  189. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_telemetry_events.py +0 -0
  190. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_telemetry_prompt.py +0 -0
  191. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_telemetry_queue.py +0 -0
  192. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_telemetry_sender.py +0 -0
  193. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_templates.py +0 -0
  194. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_timeutil.py +0 -0
  195. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_trends.py +0 -0
  196. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_trends_cli.py +0 -0
  197. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_use_cli.py +0 -0
  198. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_wrapped.py +0 -0
  199. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_wrapped_cli.py +0 -0
  200. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_wrapped_e2e.py +0 -0
  201. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_wrapped_html.py +0 -0
  202. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_wrapped_output.py +0 -0
  203. {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_wrapped_share.py +0 -0
@@ -28,7 +28,7 @@ jobs:
28
28
  - name: Format check
29
29
  run: ruff format --check src/ tests/
30
30
  - name: Test
31
- run: pytest tests/ -v --cov=reprompt --cov-report=xml
31
+ run: pytest tests/ -v --cov=reprompt --cov-report=xml --cov-fail-under=88
32
32
  - name: Upload coverage
33
33
  if: matrix.python-version == '3.12' && matrix.os == 'ubuntu-latest'
34
34
  uses: codecov/codecov-action@v5
@@ -15,6 +15,14 @@ jobs:
15
15
  - uses: actions/setup-python@v6
16
16
  with:
17
17
  python-version: "3.12"
18
+ - name: Install uv
19
+ uses: astral-sh/setup-uv@v7
20
+ - name: Install dependencies
21
+ run: uv pip install --system -e ".[dev]"
22
+ - name: Lint
23
+ run: ruff check src/ tests/
24
+ - name: Test
25
+ run: pytest tests/ -v --cov=reprompt --cov-fail-under=88
18
26
  - name: Install build tools
19
27
  run: pip install build
20
28
  - name: Build
@@ -2,6 +2,94 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file.
4
4
 
5
+ ## [1.0.0] - 2026-03-16
6
+
7
+ ### Changed
8
+ - **Stability release** — no new features, focused on reliability and trust
9
+ - Empty-state guidance for `report` and `digest` commands
10
+ - Scan shows "Try next" hints for new users
11
+ - Feature extraction errors logged instead of silently swallowed
12
+
13
+ ### Infrastructure
14
+ - DB schema versioning via `PRAGMA user_version` — ordered migrations, no more ad-hoc ALTER TABLE
15
+ - CI enforces ≥90% test coverage; publish workflow runs tests before PyPI upload
16
+ - Removed unused `[science]` optional dependency group
17
+ - CHANGELOG backfill for all versions since v0.7.4
18
+
19
+ ## [0.9.3] - 2026-03-16
20
+
21
+ ### Added
22
+ - `reprompt report --source` and `reprompt search --source` — filter by source adapter
23
+
24
+ ## [0.9.2] - 2026-03-15
25
+
26
+ ### Added
27
+ - **Wrapped reports** — `reprompt wrapped` generates an annual Prompt DNA report (terminal, HTML, shareable)
28
+ - **6 prompt personas** — Architect, Debugger, Explorer, Novelist, Sniper, Teacher (auto-classified)
29
+ - **Telemetry** — opt-in anonymous 26-dimension feature vectors (no prompt text, no PII)
30
+ - **Share** — HMAC-SHA256 signed upload to getreprompt.dev/api/share
31
+ - Open-core plugin system: `entry_points(group="reprompt.plugins")` loaded at startup
32
+
33
+ ### Changed
34
+ - Migrated wrapped, personas, telemetry, share into open-source CLI (from reprompt-pro)
35
+
36
+ ## [0.9.1] - 2026-03-14
37
+
38
+ ### Added
39
+ - **Multi-language PromptDNA** — Chinese feature extraction via jieba (optional `[chinese]` extra)
40
+ - **Native messaging bridge** — Chrome/Firefox extension support (`reprompt install-extension`)
41
+ - **Style fingerprint** — `reprompt style` shows personal prompting patterns
42
+ - **Template variables** — `reprompt use template_name key=value` with `{placeholder}` substitution
43
+ - **Enhanced recommendations** — `reprompt recommend` uses effectiveness data
44
+
45
+ ### Infrastructure
46
+ - Plugin system for open-core architecture (reprompt-pro registers via entry_points)
47
+ - DB aggregation queries for plugin data access
48
+
49
+ ## [0.9.0] - 2026-03-13
50
+
51
+ ### Added
52
+ - **ChatGPT import** — `reprompt import conversations.json` parses OpenAI export format
53
+ - **Claude.ai import** — `reprompt import claude-export.zip` parses Claude web chat exports
54
+ - **`reprompt import` command** — unified import with auto-detection of source format
55
+ - 7 non-coding prompt categories for Chat AI support (brainstorm, summarize, explain, translate, roleplay, creative, casual)
56
+
57
+ ### Changed
58
+ - Tests: 580 → 680+
59
+
60
+ ## [0.8.2] - 2026-03-13
61
+
62
+ ### Added
63
+ - **Digest category deltas** — `reprompt digest` shows per-category % change with arrows
64
+ - **`reprompt digest --history`** — view past digest log entries
65
+
66
+ ## [0.8.1] - 2026-03-12
67
+
68
+ ### Added
69
+ - **HTML dashboard** — `reprompt report --html` generates interactive Chart.js dashboard
70
+ - Digest + cluster data wired into HTML report
71
+
72
+ ## [0.8.0] - 2026-03-12
73
+
74
+ ### Added
75
+ - **Effectiveness columns** — `prompts.effectiveness_score`, `prompt_patterns.effectiveness_avg`
76
+ - **`reprompt library`** shows Eff column with score + star rating
77
+ - **`reprompt digest`** shows avg session quality
78
+ - **OpenClaw `parse_session_meta()`** — session quality scoring for OpenClaw/OpenCode sessions
79
+ - `db.update_prompt_effectiveness()` and `db.compute_pattern_effectiveness()` methods
80
+ - Pipeline: `run_scan()` propagates session scores to prompts; `build_report_data()` recomputes pattern averages
81
+
82
+ ### Infrastructure
83
+ - `_migrate_v08()` adds effectiveness columns via safe ALTER TABLE
84
+
85
+ ### Changed
86
+ - Tests: 480 → 510+
87
+
88
+ ## [0.7.5] - 2026-03-12
89
+
90
+ ### Added
91
+ - Expanded Chinese stop words — 65 function words from stopwords-iso added
92
+
5
93
  ## [0.7.4] - 2026-03-12
6
94
 
7
95
  ### Improved
@@ -0,0 +1,143 @@
1
+ Metadata-Version: 2.4
2
+ Name: reprompt-cli
3
+ Version: 1.0.0
4
+ Summary: Discover, analyze, and evolve your best prompts from AI coding sessions
5
+ Project-URL: Homepage, https://github.com/reprompt-dev/reprompt
6
+ Project-URL: Repository, https://github.com/reprompt-dev/reprompt
7
+ Project-URL: Issues, https://github.com/reprompt-dev/reprompt/issues
8
+ Project-URL: Changelog, https://github.com/reprompt-dev/reprompt/blob/main/CHANGELOG.md
9
+ License: MIT
10
+ License-File: LICENSE
11
+ Keywords: ai,analytics,claude-code,cli,llm,prompt
12
+ Classifier: Development Status :: 5 - Production/Stable
13
+ Classifier: Environment :: Console
14
+ Classifier: Intended Audience :: Developers
15
+ Classifier: License :: OSI Approved :: MIT License
16
+ Classifier: Operating System :: OS Independent
17
+ Classifier: Programming Language :: Python :: 3
18
+ Classifier: Programming Language :: Python :: 3.10
19
+ Classifier: Programming Language :: Python :: 3.11
20
+ Classifier: Programming Language :: Python :: 3.12
21
+ Classifier: Topic :: Software Development :: Libraries
22
+ Classifier: Typing :: Typed
23
+ Requires-Python: >=3.10
24
+ Requires-Dist: pydantic-settings>=2.0
25
+ Requires-Dist: rich>=13.0
26
+ Requires-Dist: scikit-learn>=1.4
27
+ Requires-Dist: typer>=0.9
28
+ Provides-Extra: chinese
29
+ Requires-Dist: jieba>=0.42; extra == 'chinese'
30
+ Provides-Extra: dev
31
+ Requires-Dist: jieba>=0.42; extra == 'dev'
32
+ Requires-Dist: mypy>=1.0; extra == 'dev'
33
+ Requires-Dist: pytest-cov>=5.0; extra == 'dev'
34
+ Requires-Dist: pytest>=8.0; extra == 'dev'
35
+ Requires-Dist: ruff>=0.4; extra == 'dev'
36
+ Provides-Extra: local
37
+ Requires-Dist: sentence-transformers>=2.0; extra == 'local'
38
+ Provides-Extra: mcp
39
+ Requires-Dist: fastmcp>=2.0; extra == 'mcp'
40
+ Provides-Extra: ollama
41
+ Requires-Dist: requests>=2.31; extra == 'ollama'
42
+ Provides-Extra: openai
43
+ Requires-Dist: openai>=1.0; extra == 'openai'
44
+ Description-Content-Type: text/markdown
45
+
46
+ # `re:prompt`
47
+
48
+ **Grammarly for Prompts** -- analyze your AI conversations with research-backed scoring.
49
+
50
+ [![PyPI version](https://img.shields.io/pypi/v/reprompt-cli)](https://pypi.org/project/reprompt-cli/)
51
+ [![Python 3.10+](https://img.shields.io/pypi/pyversions/reprompt-cli)](https://pypi.org/project/reprompt-cli/)
52
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
53
+ [![Tests](https://img.shields.io/badge/tests-923-brightgreen)](https://github.com/reprompt-dev/reprompt)
54
+ [![Coverage](https://img.shields.io/badge/coverage-95%25-brightgreen)](https://github.com/reprompt-dev/reprompt)
55
+
56
+ ---
57
+
58
+ ## See it in action
59
+
60
+ ```bash
61
+ $ pip install reprompt-cli
62
+ $ reprompt scan --source claude-code
63
+ Scanning 890 sessions... Found 1,063 prompts (295 unique)
64
+
65
+ $ reprompt score "Fix the auth bug in src/login.ts where JWT expires"
66
+ Score: 74/100
67
+ Structure: 18/25 | Context: 22/25 | Position: 15/20 | Repetition: 9/15 | Clarity: 10/15
68
+ Tip: Add the error message for +15% accuracy
69
+
70
+ $ reprompt wrapped --share
71
+ Your Prompt DNA: Architect (Score 78, better than 72% of prompters)
72
+ Share link: https://getreprompt.dev/w/abc123
73
+ ```
74
+
75
+ ## What it does
76
+
77
+ | Command | Description |
78
+ |---------|-------------|
79
+ | `reprompt scan` | Scan 8+ AI tools for prompts (Claude Code, Cursor, Aider, Gemini CLI, Cline, OpenClaw, ChatGPT, Claude.ai) |
80
+ | `reprompt score` | Instant 0-100 scoring with 30+ research-backed features |
81
+ | `reprompt compare` | Side-by-side analysis of two prompts |
82
+ | `reprompt wrapped` | Your Prompt DNA report -- persona, scores, shareable card |
83
+ | `reprompt insights` | Personal patterns vs research-optimal |
84
+ | `reprompt digest` | Weekly summary comparing current vs previous period |
85
+ | `reprompt report` | Full analytics with hot terms, clusters, patterns |
86
+ | `reprompt library` | Auto-extracted prompt patterns and templates |
87
+
88
+ ## Prompt Science
89
+
90
+ Scoring is based on 4 research papers (Google, Stanford, EMNLP, Prompt Report) covering 30+ features across 5 dimensions:
91
+
92
+ | Dimension | What it measures |
93
+ |-----------|-----------------|
94
+ | **Structure** | Markdown formatting, code blocks, explicit constraints |
95
+ | **Context** | File paths, error messages, technical specificity |
96
+ | **Position** | Instruction placement relative to context |
97
+ | **Repetition** | Redundancy that degrades model attention |
98
+ | **Clarity** | Readability, sentence length, ambiguity |
99
+
100
+ All analysis runs locally in <1ms per prompt. No LLM calls, no network requests.
101
+
102
+ ## Supported AI tools
103
+
104
+ | Tool | Format | Session location |
105
+ |------|--------|-----------------|
106
+ | Claude Code | JSONL | `~/.claude/projects/` |
107
+ | Cursor | .vscdb | `~/Library/Application Support/Cursor/User/` |
108
+ | Aider | Markdown | `.aider.chat.history.md` |
109
+ | Gemini CLI | JSON | `~/.gemini/tmp/` |
110
+ | Cline (VS Code) | JSON | `globalStorage/saoudrizwan.claude-dev/` |
111
+ | OpenClaw / OpenCode | JSON | `~/.openclaw/` / `~/.opencode/sessions/` |
112
+ | ChatGPT | JSON | `conversations.json` export |
113
+ | Claude.ai | JSON/ZIP | Web chat export |
114
+
115
+ ## Installation
116
+
117
+ ```bash
118
+ pip install reprompt-cli # core
119
+ pip install reprompt-cli[chinese] # + Chinese prompt support
120
+ pip install reprompt-cli[mcp] # + MCP server for Claude Code / Continue.dev / Zed
121
+ ```
122
+
123
+ ## Privacy
124
+
125
+ - All analysis runs locally. No prompts leave your machine.
126
+ - Optional telemetry sends only anonymous 26-dimension feature vectors -- never prompt text.
127
+ - Open source: audit exactly what's collected.
128
+
129
+ [Privacy policy](https://getreprompt.dev/privacy)
130
+
131
+ ## Links
132
+
133
+ - **Website:** [getreprompt.dev](https://getreprompt.dev)
134
+ - **PyPI:** [reprompt-cli](https://pypi.org/project/reprompt-cli/)
135
+ - **Privacy:** [getreprompt.dev/privacy](https://getreprompt.dev/privacy)
136
+
137
+ ## Contributing
138
+
139
+ See [CONTRIBUTING.md](CONTRIBUTING.md) for development setup and guidelines.
140
+
141
+ ## License
142
+
143
+ MIT
@@ -0,0 +1,98 @@
1
+ # `re:prompt`
2
+
3
+ **Grammarly for Prompts** -- analyze your AI conversations with research-backed scoring.
4
+
5
+ [![PyPI version](https://img.shields.io/pypi/v/reprompt-cli)](https://pypi.org/project/reprompt-cli/)
6
+ [![Python 3.10+](https://img.shields.io/pypi/pyversions/reprompt-cli)](https://pypi.org/project/reprompt-cli/)
7
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
8
+ [![Tests](https://img.shields.io/badge/tests-923-brightgreen)](https://github.com/reprompt-dev/reprompt)
9
+ [![Coverage](https://img.shields.io/badge/coverage-95%25-brightgreen)](https://github.com/reprompt-dev/reprompt)
10
+
11
+ ---
12
+
13
+ ## See it in action
14
+
15
+ ```bash
16
+ $ pip install reprompt-cli
17
+ $ reprompt scan --source claude-code
18
+ Scanning 890 sessions... Found 1,063 prompts (295 unique)
19
+
20
+ $ reprompt score "Fix the auth bug in src/login.ts where JWT expires"
21
+ Score: 74/100
22
+ Structure: 18/25 | Context: 22/25 | Position: 15/20 | Repetition: 9/15 | Clarity: 10/15
23
+ Tip: Add the error message for +15% accuracy
24
+
25
+ $ reprompt wrapped --share
26
+ Your Prompt DNA: Architect (Score 78, better than 72% of prompters)
27
+ Share link: https://getreprompt.dev/w/abc123
28
+ ```
29
+
30
+ ## What it does
31
+
32
+ | Command | Description |
33
+ |---------|-------------|
34
+ | `reprompt scan` | Scan 8+ AI tools for prompts (Claude Code, Cursor, Aider, Gemini CLI, Cline, OpenClaw, ChatGPT, Claude.ai) |
35
+ | `reprompt score` | Instant 0-100 scoring with 30+ research-backed features |
36
+ | `reprompt compare` | Side-by-side analysis of two prompts |
37
+ | `reprompt wrapped` | Your Prompt DNA report -- persona, scores, shareable card |
38
+ | `reprompt insights` | Personal patterns vs research-optimal |
39
+ | `reprompt digest` | Weekly summary comparing current vs previous period |
40
+ | `reprompt report` | Full analytics with hot terms, clusters, patterns |
41
+ | `reprompt library` | Auto-extracted prompt patterns and templates |
42
+
43
+ ## Prompt Science
44
+
45
+ Scoring is based on 4 research papers (Google, Stanford, EMNLP, Prompt Report) covering 30+ features across 5 dimensions:
46
+
47
+ | Dimension | What it measures |
48
+ |-----------|-----------------|
49
+ | **Structure** | Markdown formatting, code blocks, explicit constraints |
50
+ | **Context** | File paths, error messages, technical specificity |
51
+ | **Position** | Instruction placement relative to context |
52
+ | **Repetition** | Redundancy that degrades model attention |
53
+ | **Clarity** | Readability, sentence length, ambiguity |
54
+
55
+ All analysis runs locally in <1ms per prompt. No LLM calls, no network requests.
56
+
57
+ ## Supported AI tools
58
+
59
+ | Tool | Format | Session location |
60
+ |------|--------|-----------------|
61
+ | Claude Code | JSONL | `~/.claude/projects/` |
62
+ | Cursor | .vscdb | `~/Library/Application Support/Cursor/User/` |
63
+ | Aider | Markdown | `.aider.chat.history.md` |
64
+ | Gemini CLI | JSON | `~/.gemini/tmp/` |
65
+ | Cline (VS Code) | JSON | `globalStorage/saoudrizwan.claude-dev/` |
66
+ | OpenClaw / OpenCode | JSON | `~/.openclaw/` / `~/.opencode/sessions/` |
67
+ | ChatGPT | JSON | `conversations.json` export |
68
+ | Claude.ai | JSON/ZIP | Web chat export |
69
+
70
+ ## Installation
71
+
72
+ ```bash
73
+ pip install reprompt-cli # core
74
+ pip install reprompt-cli[chinese] # + Chinese prompt support
75
+ pip install reprompt-cli[mcp] # + MCP server for Claude Code / Continue.dev / Zed
76
+ ```
77
+
78
+ ## Privacy
79
+
80
+ - All analysis runs locally. No prompts leave your machine.
81
+ - Optional telemetry sends only anonymous 26-dimension feature vectors -- never prompt text.
82
+ - Open source: audit exactly what's collected.
83
+
84
+ [Privacy policy](https://getreprompt.dev/privacy)
85
+
86
+ ## Links
87
+
88
+ - **Website:** [getreprompt.dev](https://getreprompt.dev)
89
+ - **PyPI:** [reprompt-cli](https://pypi.org/project/reprompt-cli/)
90
+ - **Privacy:** [getreprompt.dev/privacy](https://getreprompt.dev/privacy)
91
+
92
+ ## Contributing
93
+
94
+ See [CONTRIBUTING.md](CONTRIBUTING.md) for development setup and guidelines.
95
+
96
+ ## License
97
+
98
+ MIT
@@ -0,0 +1,74 @@
1
+ # reprompt Roadmap
2
+
3
+ > Last updated: 2026-03-16 · Current version: v1.0.0
4
+
5
+ ## Vision
6
+
7
+ reprompt is the **prompt analytics** tool for AI sessions — understand your patterns, improve your prompting, track your progress. Zero-config, privacy-first, CLI-first.
8
+
9
+ **Category definition:** reprompt analyzes *human inputs* (how you prompt), not *LLM outputs* (how models respond). Every other tool in the eval/observability space — Promptfoo, Braintrust, DeepEval, Langfuse — answers "did my AI system answer correctly?" reprompt answers "am I asking well?" This is an unoccupied category.
10
+
11
+ ---
12
+
13
+ ## Current State (v1.0.0) — Production Stable
14
+
15
+ ### Adapters (8)
16
+ Claude Code · OpenClaw · Cursor IDE · Aider · Gemini CLI · Cline · ChatGPT · Claude.ai
17
+
18
+ ### Commands (23)
19
+ `scan` · `import` · `report` · `library` · `trends` · `recommend` · `effectiveness` · `merge-view` · `save` · `templates` · `use` · `lint` · `search` · `demo` · `status` · `purge` · `install-hook` · `install-extension` · `extension-status` · `score` · `compare` · `insights` · `digest` · `style` · `wrapped` · `telemetry` · `mcp-serve`
20
+
21
+ ### Integrations
22
+ - MCP server (`reprompt mcp-serve`) for IDE integration
23
+ - GitHub Action (`action.yml`) for CI prompt quality checks
24
+ - HTML dashboard (`reprompt report --html`)
25
+ - Browser extension (Chrome/Firefox) via Native Messaging bridge
26
+ - JSON output on all commands for pipeline integration
27
+
28
+ ### v1.0.0 Hardening (this release)
29
+ - Empty-state UX guidance for `report` and `digest`
30
+ - Scan "Try next" onboarding hints for new users
31
+ - Feature extraction errors logged (no more silent swallowing)
32
+ - DB schema versioning via `PRAGMA user_version`
33
+ - CI: ≥90% coverage gate, pre-publish test step
34
+ - Stable public API (`score_prompt`, `compare_prompts`, `extract_features`)
35
+ - 935+ tests, ≥90% coverage
36
+
37
+ ---
38
+
39
+ ## v1.1+ — Future Work
40
+
41
+ | Feature | Description |
42
+ |---------|-------------|
43
+ | `reprompt consolidate` | Automated prompt merging (currently read-only `merge-view` is sufficient) |
44
+ | Homebrew formula | `brew install reprompt` via `homebrew-reprompt` tap |
45
+ | SSE transport for MCP | Alternative to stdio for remote IDE setups |
46
+ | More adapters | Perplexity, Mistral, Grok, Gemini Takeout |
47
+ | `reprompt suggest` | Ollama-powered prompt improvement suggestions |
48
+ | `.repromptignore` | Per-project filtering rules |
49
+ | Team features | Anonymized pattern sharing, CI lint standards |
50
+ | Windows Native Messaging | Extension support on Windows |
51
+
52
+ Nothing beyond v1.1 is formally scheduled.
53
+
54
+ ---
55
+
56
+ ## Architecture Principles
57
+
58
+ 1. **Zero-config first** — Every feature works without LLM by default
59
+ 2. **Privacy by design** — All data stays local; extension has zero server
60
+ 3. **Adapter pattern** — New AI tools supported by adding ~50 lines
61
+ 4. **Input not output** — We analyze human prompts (inputs); LLM eval tools analyze model responses (outputs)
62
+ 5. **CLI first, GUI second** — Terminal is primary, HTML dashboard is secondary
63
+ 6. **Composable** — Every command supports JSON output for piping
64
+
65
+ ---
66
+
67
+ ## How to Contribute
68
+
69
+ - **New adapter** (~50 lines) — see `src/reprompt/adapters/base.py`
70
+ - **New lint rules** — see `src/reprompt/core/lint.py`
71
+ - **Better categorization** — improve keyword rules in `core/library.py`
72
+ - **Browser extension** — see `reprompt-extension` repo
73
+
74
+ See [CONTRIBUTING.md](../CONTRIBUTING.md) for details.
@@ -1,13 +1,13 @@
1
1
  [project]
2
2
  name = "reprompt-cli"
3
- version = "0.9.2"
3
+ version = "1.0.0"
4
4
  description = "Discover, analyze, and evolve your best prompts from AI coding sessions"
5
5
  readme = "README.md"
6
6
  license = { text = "MIT" }
7
7
  requires-python = ">=3.10"
8
8
  keywords = ["prompt", "llm", "ai", "cli", "analytics", "claude-code"]
9
9
  classifiers = [
10
- "Development Status :: 3 - Alpha",
10
+ "Development Status :: 5 - Production/Stable",
11
11
  "Environment :: Console",
12
12
  "Intended Audience :: Developers",
13
13
  "License :: OSI Approved :: MIT License",
@@ -32,8 +32,7 @@ local = ["sentence-transformers>=2.0"]
32
32
  openai = ["openai>=1.0"]
33
33
  mcp = ["fastmcp>=2.0"]
34
34
  chinese = ["jieba>=0.42"]
35
- science = ["textstat>=0.7", "yake>=0.4", "spacy>=3.7"]
36
- dev = ["pytest>=8.0", "ruff>=0.4", "mypy>=1.0", "pytest-cov>=5.0"]
35
+ dev = ["pytest>=8.0", "ruff>=0.4", "mypy>=1.0", "pytest-cov>=5.0", "jieba>=0.42"]
37
36
 
38
37
  [project.scripts]
39
38
  reprompt = "reprompt.cli:app"
@@ -58,6 +57,13 @@ line-length = 100
58
57
  [tool.ruff.lint]
59
58
  select = ["E", "F", "I", "UP"]
60
59
 
60
+ [tool.coverage.run]
61
+ omit = [
62
+ "src/reprompt/mcp.py",
63
+ "src/reprompt/mcp_main.py",
64
+ "src/reprompt/embeddings/ollama.py",
65
+ ]
66
+
61
67
  [tool.pytest.ini_options]
62
68
  testpaths = ["tests"]
63
69
 
@@ -0,0 +1,88 @@
1
+ """reprompt — Discover, analyze, and evolve your best prompts from AI coding sessions."""
2
+
3
+ __version__ = "1.0.0"
4
+
5
+ __all__ = [
6
+ "__version__",
7
+ # Core analysis
8
+ "score_prompt",
9
+ "compare_prompts",
10
+ "extract_features",
11
+ # Data access
12
+ "PromptDB",
13
+ "Prompt",
14
+ "PromptDNA",
15
+ ]
16
+
17
+
18
+ def _grade(total: float) -> str:
19
+ """Map 0-100 score to letter grade."""
20
+ if total >= 85:
21
+ return "A"
22
+ if total >= 70:
23
+ return "B"
24
+ if total >= 55:
25
+ return "C"
26
+ if total >= 40:
27
+ return "D"
28
+ return "F"
29
+
30
+
31
+ def score_prompt(text: str) -> dict:
32
+ """Score a prompt and return breakdown dict. Public API."""
33
+ from reprompt.core.extractors import extract_features as _extract
34
+ from reprompt.core.scorer import score_prompt as _score
35
+
36
+ dna = _extract(text, source="api", session_id="")
37
+ breakdown = _score(dna)
38
+ return {
39
+ "total": breakdown.total,
40
+ "dimensions": {
41
+ "structure": breakdown.structure,
42
+ "context": breakdown.context,
43
+ "position": breakdown.position,
44
+ "repetition": breakdown.repetition,
45
+ "clarity": breakdown.clarity,
46
+ },
47
+ "grade": _grade(breakdown.total),
48
+ }
49
+
50
+
51
+ def compare_prompts(a: str, b: str) -> dict:
52
+ """Compare two prompts and return comparison dict. Public API."""
53
+ from reprompt.core.extractors import extract_features as _extract
54
+ from reprompt.core.scorer import score_prompt as _score
55
+
56
+ dna_a = _extract(a, source="api", session_id="")
57
+ dna_b = _extract(b, source="api", session_id="")
58
+ score_a = _score(dna_a)
59
+ score_b = _score(dna_b)
60
+ return {
61
+ "a": score_a.total,
62
+ "b": score_b.total,
63
+ "winner": "a" if score_a.total >= score_b.total else "b",
64
+ }
65
+
66
+
67
+ def extract_features(text: str):
68
+ """Extract PromptDNA features. Public API."""
69
+ from reprompt.core.extractors import extract_features as _extract
70
+
71
+ return _extract(text, source="api", session_id="")
72
+
73
+
74
+ # Lazy imports for type access
75
+ def __getattr__(name):
76
+ if name == "PromptDB":
77
+ from reprompt.storage.db import PromptDB
78
+
79
+ return PromptDB
80
+ if name == "Prompt":
81
+ from reprompt.core.models import Prompt
82
+
83
+ return Prompt
84
+ if name == "PromptDNA":
85
+ from reprompt.core.prompt_dna import PromptDNA
86
+
87
+ return PromptDNA
88
+ raise AttributeError(f"module 'reprompt' has no attribute {name!r}")
@@ -101,6 +101,13 @@ def scan(
101
101
  "after every Claude Code session.[/dim]"
102
102
  )
103
103
 
104
+ # Next steps for new users (show once, on first scan with data)
105
+ if result.new_stored > 0 and stats.get("total_prompts", 0) <= result.new_stored + 10:
106
+ console.print("\n[bold]Try next:[/bold]")
107
+ console.print(' reprompt score [dim]"your prompt"[/dim] — instant quality score')
108
+ console.print(" reprompt library — see your prompt patterns")
109
+ console.print(" reprompt insights — personal analysis")
110
+
104
111
 
105
112
  def _hook_registered() -> bool:
106
113
  """Check if reprompt hook is registered in Claude Code settings."""
@@ -223,7 +230,11 @@ def import_file(
223
230
  dna.overall_score = breakdown.total
224
231
  db.store_features(dna.prompt_hash, dna.to_dict())
225
232
  except Exception:
226
- pass
233
+ import logging
234
+
235
+ logging.getLogger("reprompt.cli").debug(
236
+ "Feature extraction failed during import: %s", exc_info=True
237
+ )
227
238
 
228
239
  # Mark file as processed
229
240
  db.mark_session_processed(str(path), source=adapter.name)
@@ -242,6 +253,9 @@ def report(
242
253
  output: str = typer.Option("", "--output", "-o", help="Output file path (for --html)"),
243
254
  top: int = typer.Option(20, help="Number of top terms to show"),
244
255
  clusters: int = typer.Option(0, "--clusters", help="Number of clusters (0 = auto-select)"),
256
+ source: str = typer.Option(
257
+ "", "--source", "-s", help="Filter by source (e.g. chatgpt-ext, claude-ext, claude-code)"
258
+ ),
245
259
  ) -> None:
246
260
  """Generate analytics report."""
247
261
  from reprompt.config import Settings
@@ -249,7 +263,16 @@ def report(
249
263
 
250
264
  settings = Settings()
251
265
  n_clusters_arg = clusters if clusters > 0 else None
252
- data = build_report_data(settings=settings, n_clusters=n_clusters_arg)
266
+ source_filter = source if source else None
267
+ data = build_report_data(settings=settings, n_clusters=n_clusters_arg, source=source_filter)
268
+
269
+ # Early exit with guidance when DB is empty
270
+ total = data.get("overview", {}).get("total_prompts", 0)
271
+ if total == 0:
272
+ console.print(
273
+ "No prompts found. Run [bold]reprompt scan[/bold] to analyze your AI sessions."
274
+ )
275
+ return
253
276
 
254
277
  if html:
255
278
  import webbrowser
@@ -345,6 +368,9 @@ def library(
345
368
  def search(
346
369
  query: str = typer.Argument(..., help="Search term (case-insensitive)"),
347
370
  limit: int = typer.Option(20, help="Maximum results to show"),
371
+ source: str = typer.Option(
372
+ "", "--source", "-s", help="Filter by source (e.g. chatgpt-ext, claude-ext, claude-code)"
373
+ ),
348
374
  ) -> None:
349
375
  """Search your prompt history by keyword."""
350
376
  from reprompt.config import Settings
@@ -352,7 +378,8 @@ def search(
352
378
 
353
379
  settings = Settings()
354
380
  db = PromptDB(settings.db_path)
355
- results = db.search_prompts(query, limit=limit)
381
+ source_filter = source if source else None
382
+ results = db.search_prompts(query, source=source_filter, limit=limit)
356
383
 
357
384
  if not results:
358
385
  console.print(f"No prompts matching [bold]{query}[/bold]")
@@ -959,6 +986,20 @@ def digest(
959
986
  print(render_digest_history(rows, period), end="")
960
987
  return
961
988
 
989
+ stats = db.get_stats()
990
+
991
+ # Early guidance when DB is empty (after history check)
992
+ if stats.get("total_prompts", 0) == 0:
993
+ if quiet:
994
+ print("reprompt: no data yet — run reprompt scan")
995
+ elif format == "json":
996
+ print(json_mod.dumps({"error": "no data", "hint": "run reprompt scan"}))
997
+ else:
998
+ console.print(
999
+ "No prompt data yet. Run [bold]reprompt scan[/bold] first to populate the database."
1000
+ )
1001
+ return
1002
+
962
1003
  data = build_digest(db, period=period)
963
1004
 
964
1005
  if quiet: