reprompt-cli 1.6.0__tar.gz → 1.8.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 (312) hide show
  1. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/.gitignore +1 -0
  2. reprompt_cli-1.8.0/.pre-commit-hooks.yaml +26 -0
  3. reprompt_cli-1.8.0/.testmondata-shm +0 -0
  4. reprompt_cli-1.8.0/.testmondata-wal +0 -0
  5. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/CHANGELOG.md +16 -0
  6. reprompt_cli-1.8.0/CONTRIBUTING.md +120 -0
  7. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/PKG-INFO +45 -10
  8. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/README.md +44 -9
  9. reprompt_cli-1.8.0/Screenshot 2026-03-24 at 09.45.03.png +0 -0
  10. reprompt_cli-1.8.0/action.yml +211 -0
  11. reprompt_cli-1.8.0/docs/demo.gif +0 -0
  12. reprompt_cli-1.8.0/docs/icons/brand-icon-128.png +0 -0
  13. reprompt_cli-1.8.0/docs/icons/brand-icon-16.png +0 -0
  14. reprompt_cli-1.8.0/docs/icons/brand-icon-256.png +0 -0
  15. reprompt_cli-1.8.0/docs/icons/brand-icon-32.png +0 -0
  16. reprompt_cli-1.8.0/docs/icons/brand-icon-48.png +0 -0
  17. reprompt_cli-1.8.0/docs/icons/brand-icon-512.png +0 -0
  18. reprompt_cli-1.8.0/docs/icons/brand-icon-96.png +0 -0
  19. reprompt_cli-1.8.0/docs/icons/brand-icon.svg +22 -0
  20. reprompt_cli-1.8.0/docs/icons/cli-favicon-128.png +0 -0
  21. reprompt_cli-1.8.0/docs/icons/cli-favicon-16.png +0 -0
  22. reprompt_cli-1.8.0/docs/icons/cli-favicon-256.png +0 -0
  23. reprompt_cli-1.8.0/docs/icons/cli-favicon-32.png +0 -0
  24. reprompt_cli-1.8.0/docs/icons/cli-favicon-48.png +0 -0
  25. reprompt_cli-1.8.0/docs/icons/cli-favicon-512.png +0 -0
  26. reprompt_cli-1.8.0/docs/icons/cli-favicon-96.png +0 -0
  27. reprompt_cli-1.8.0/docs/icons/cli-favicon.svg +13 -0
  28. reprompt_cli-1.8.0/docs/icons/cli-icon-128.png +0 -0
  29. reprompt_cli-1.8.0/docs/icons/cli-icon-16.png +0 -0
  30. reprompt_cli-1.8.0/docs/icons/cli-icon-256.png +0 -0
  31. reprompt_cli-1.8.0/docs/icons/cli-icon-32.png +0 -0
  32. reprompt_cli-1.8.0/docs/icons/cli-icon-48.png +0 -0
  33. reprompt_cli-1.8.0/docs/icons/cli-icon-512.png +0 -0
  34. reprompt_cli-1.8.0/docs/icons/cli-icon-96.png +0 -0
  35. reprompt_cli-1.8.0/docs/icons/cli-icon.svg +15 -0
  36. reprompt_cli-1.8.0/docs/icons/favicon-128.png +0 -0
  37. reprompt_cli-1.8.0/docs/icons/favicon-16.png +0 -0
  38. reprompt_cli-1.8.0/docs/icons/favicon-256.png +0 -0
  39. reprompt_cli-1.8.0/docs/icons/favicon-32.png +0 -0
  40. reprompt_cli-1.8.0/docs/icons/favicon-48.png +0 -0
  41. reprompt_cli-1.8.0/docs/icons/favicon-512.png +0 -0
  42. reprompt_cli-1.8.0/docs/icons/favicon-96.png +0 -0
  43. reprompt_cli-1.8.0/docs/icons/favicon.svg +16 -0
  44. reprompt_cli-1.8.0/docs/icons/generate.sh +44 -0
  45. reprompt_cli-1.8.0/docs/superpowers/specs/2026-03-24-v14-command-consolidation-design.md +287 -0
  46. reprompt_cli-1.8.0/docs/superpowers/specs/2026-03-25-v1.5-dashboard-design.md +338 -0
  47. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/pyproject.toml +1 -1
  48. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/__init__.py +1 -1
  49. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/adapters/chatgpt.py +13 -0
  50. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/bridge/handler.py +10 -26
  51. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/bridge/protocol.py +10 -1
  52. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/cli.py +219 -17
  53. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/core/analyzer.py +3 -1
  54. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/core/compress.py +72 -1
  55. reprompt_cli-1.8.0/src/reprompt/core/cost.py +96 -0
  56. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/core/dedup.py +15 -0
  57. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/core/extractors.py +19 -6
  58. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/core/extractors_zh.py +2 -1
  59. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/core/insights.py +14 -0
  60. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/core/pipeline.py +112 -1
  61. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/core/privacy_scan.py +34 -0
  62. reprompt_cli-1.8.0/src/reprompt/core/session_quality.py +203 -0
  63. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/core/suggestions.py +3 -0
  64. reprompt_cli-1.8.0/src/reprompt/mcp.py +335 -0
  65. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/output/dashboard_terminal.py +16 -2
  66. reprompt_cli-1.8.0/src/reprompt/output/sessions_terminal.py +172 -0
  67. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/output/terminal.py +31 -5
  68. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/storage/db.py +139 -5
  69. reprompt_cli-1.8.0/tests/test_cost.py +93 -0
  70. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_db_effectiveness.py +77 -0
  71. reprompt_cli-1.8.0/tests/test_db_session_quality.py +181 -0
  72. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_e2e.py +2 -2
  73. reprompt_cli-1.8.0/tests/test_lint_cli.py +184 -0
  74. reprompt_cli-1.8.0/tests/test_mcp.py +180 -0
  75. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_privacy_scan.py +116 -0
  76. reprompt_cli-1.8.0/tests/test_session_quality.py +455 -0
  77. reprompt_cli-1.8.0/tests/test_sessions_cli.py +193 -0
  78. reprompt_cli-1.8.0/tests/test_sessions_output.py +102 -0
  79. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_suggestions.py +5 -1
  80. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/uv.lock +1 -1
  81. reprompt_cli-1.6.0/.testmondata +0 -0
  82. reprompt_cli-1.6.0/CLAUDE.md +0 -166
  83. reprompt_cli-1.6.0/CONTRIBUTING.md +0 -71
  84. reprompt_cli-1.6.0/action.yml +0 -100
  85. reprompt_cli-1.6.0/docs/launch-post.md +0 -116
  86. reprompt_cli-1.6.0/docs/roadmap.md +0 -112
  87. reprompt_cli-1.6.0/docs/superpowers/specs/2026-03-11-html-dashboard-design.md +0 -144
  88. reprompt_cli-1.6.0/docs/superpowers/specs/2026-03-11-merge-view-design.md +0 -136
  89. reprompt_cli-1.6.0/docs/superpowers/specs/2026-03-11-prompt-templates-design.md +0 -62
  90. reprompt_cli-1.6.0/docs/superpowers/specs/2026-03-22-prompt-compress-design.md +0 -512
  91. reprompt_cli-1.6.0/docs/superpowers/specs/2026-03-23-distill-design.md +0 -375
  92. reprompt_cli-1.6.0/docs/superpowers/specs/2026-03-23-v131-suggestions-source-design.md +0 -179
  93. reprompt_cli-1.6.0/docs/superpowers/specs/2026-03-24-v14-context-recovery-design.md +0 -342
  94. reprompt_cli-1.6.0/docs/superpowers/specs/2026-03-24-v141-polish-design.md +0 -184
  95. reprompt_cli-1.6.0/docs/superpowers/specs/2026-03-28-v1.6-agent-intelligence-design.md +0 -479
  96. reprompt_cli-1.6.0/module.yaml +0 -12
  97. reprompt_cli-1.6.0/scripts/launch/hn_monitor.py +0 -163
  98. reprompt_cli-1.6.0/scripts/launch/reddit_helper.py +0 -193
  99. reprompt_cli-1.6.0/src/reprompt/mcp.py +0 -207
  100. reprompt_cli-1.6.0/tests/test_lint_cli.py +0 -95
  101. reprompt_cli-1.6.0/tests/test_mcp.py +0 -113
  102. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/.editorconfig +0 -0
  103. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  104. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  105. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  106. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  107. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  108. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/.github/dependabot.yml +0 -0
  109. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/.github/workflows/ci.yml +0 -0
  110. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/.github/workflows/publish.yml +0 -0
  111. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/.pre-commit-config.yaml +0 -0
  112. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/CODE_OF_CONDUCT.md +0 -0
  113. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/LICENSE +0 -0
  114. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/SECURITY.md +0 -0
  115. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/scripts/generate_demo_data.py +0 -0
  116. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/adapters/__init__.py +0 -0
  117. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/adapters/aider.py +0 -0
  118. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/adapters/base.py +0 -0
  119. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/adapters/claude_chat.py +0 -0
  120. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/adapters/claude_code.py +0 -0
  121. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/adapters/cline.py +0 -0
  122. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/adapters/codex.py +0 -0
  123. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/adapters/cursor.py +0 -0
  124. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/adapters/filters.py +0 -0
  125. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/adapters/gemini.py +0 -0
  126. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/adapters/openclaw.py +0 -0
  127. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/bridge/__init__.py +0 -0
  128. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/bridge/host.py +0 -0
  129. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/bridge/manifest.py +0 -0
  130. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/commands/__init__.py +0 -0
  131. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/commands/telemetry.py +0 -0
  132. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/commands/wrapped.py +0 -0
  133. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/config.py +0 -0
  134. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/core/__init__.py +0 -0
  135. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/core/agent.py +0 -0
  136. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/core/conversation.py +0 -0
  137. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/core/dashboard.py +0 -0
  138. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/core/digest.py +0 -0
  139. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/core/distill.py +0 -0
  140. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/core/effectiveness.py +0 -0
  141. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/core/lang_detect.py +0 -0
  142. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/core/library.py +0 -0
  143. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/core/lint.py +0 -0
  144. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/core/merge_view.py +0 -0
  145. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/core/models.py +0 -0
  146. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/core/persona.py +0 -0
  147. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/core/privacy.py +0 -0
  148. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/core/prompt_dna.py +0 -0
  149. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/core/recommend.py +0 -0
  150. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/core/scorer.py +0 -0
  151. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/core/segmenter.py +0 -0
  152. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/core/session_meta.py +0 -0
  153. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/core/session_type.py +0 -0
  154. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/core/style.py +0 -0
  155. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/core/templates.py +0 -0
  156. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/core/timeutil.py +0 -0
  157. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/core/trends.py +0 -0
  158. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/core/wrapped.py +0 -0
  159. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/demo.py +0 -0
  160. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/embeddings/__init__.py +0 -0
  161. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/embeddings/base.py +0 -0
  162. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/embeddings/local_embed.py +0 -0
  163. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/embeddings/ollama.py +0 -0
  164. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/embeddings/openai_embed.py +0 -0
  165. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/embeddings/tfidf.py +0 -0
  166. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/mcp_main.py +0 -0
  167. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/output/__init__.py +0 -0
  168. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/output/agent_terminal.py +0 -0
  169. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/output/chartjs.min.js +0 -0
  170. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/output/compress_terminal.py +0 -0
  171. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/output/distill_terminal.py +0 -0
  172. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/output/export.py +0 -0
  173. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/output/html_report.py +0 -0
  174. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/output/json_out.py +0 -0
  175. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/output/markdown.py +0 -0
  176. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/output/wrapped_html.py +0 -0
  177. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/output/wrapped_terminal.py +0 -0
  178. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/py.typed +0 -0
  179. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/sharing/__init__.py +0 -0
  180. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/sharing/client.py +0 -0
  181. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/sharing/clipboard.py +0 -0
  182. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/storage/__init__.py +0 -0
  183. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/telemetry/__init__.py +0 -0
  184. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/telemetry/collector.py +0 -0
  185. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/telemetry/consent.py +0 -0
  186. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/telemetry/events.py +0 -0
  187. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/telemetry/prompt.py +0 -0
  188. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/telemetry/queue.py +0 -0
  189. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/telemetry/sender.py +0 -0
  190. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/__init__.py +0 -0
  191. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/conftest.py +0 -0
  192. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/fixtures/aider_chat_history.md +0 -0
  193. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/fixtures/chatgpt_conversations.json +0 -0
  194. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/fixtures/claude_chat_export.json +0 -0
  195. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/fixtures/claude_session.jsonl +0 -0
  196. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/fixtures/cline_task/api_conversation_history.json +0 -0
  197. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/fixtures/export/default_export.md +0 -0
  198. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/fixtures/export/full_export.md +0 -0
  199. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/fixtures/gemini_session.json +0 -0
  200. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/fixtures/openclaw_session.jsonl +0 -0
  201. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_adapter_aider.py +0 -0
  202. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_adapter_chatgpt.py +0 -0
  203. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_adapter_claude.py +0 -0
  204. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_adapter_claude_chat.py +0 -0
  205. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_adapter_cline.py +0 -0
  206. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_adapter_gemini.py +0 -0
  207. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_adapter_openclaw.py +0 -0
  208. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_agent.py +0 -0
  209. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_agent_cli.py +0 -0
  210. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_analyzer.py +0 -0
  211. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_bridge_cli.py +0 -0
  212. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_bridge_e2e.py +0 -0
  213. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_bridge_handler.py +0 -0
  214. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_bridge_integration.py +0 -0
  215. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_bridge_manifest.py +0 -0
  216. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_bridge_protocol.py +0 -0
  217. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_cli.py +0 -0
  218. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_cli_deprecations.py +0 -0
  219. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_cli_library_effectiveness.py +0 -0
  220. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_clipboard.py +0 -0
  221. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_codex_adapter.py +0 -0
  222. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_compare_best_worst.py +0 -0
  223. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_compress.py +0 -0
  224. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_compress_cli.py +0 -0
  225. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_compress_dna.py +0 -0
  226. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_compress_html.py +0 -0
  227. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_compress_insights.py +0 -0
  228. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_config.py +0 -0
  229. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_conversation.py +0 -0
  230. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_copy_flag.py +0 -0
  231. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_coverage_boost.py +0 -0
  232. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_cursor_adapter.py +0 -0
  233. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_dashboard.py +0 -0
  234. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_db.py +0 -0
  235. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_db_digest.py +0 -0
  236. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_db_trends.py +0 -0
  237. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_dedup.py +0 -0
  238. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_demo.py +0 -0
  239. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_deprecated_commands.py +0 -0
  240. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_digest.py +0 -0
  241. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_digest_cli.py +0 -0
  242. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_distill.py +0 -0
  243. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_distill_cli.py +0 -0
  244. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_distill_weights.py +0 -0
  245. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_effectiveness.py +0 -0
  246. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_embeddings_local.py +0 -0
  247. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_embeddings_ollama.py +0 -0
  248. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_embeddings_openai.py +0 -0
  249. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_empty_state.py +0 -0
  250. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_export.py +0 -0
  251. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_export_cli.py +0 -0
  252. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_export_snapshot.py +0 -0
  253. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_extractors.py +0 -0
  254. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_extractors_routing.py +0 -0
  255. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_extractors_zh.py +0 -0
  256. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_extractors_zh_e2e.py +0 -0
  257. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_html_report.py +0 -0
  258. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_import_cli.py +0 -0
  259. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_import_e2e.py +0 -0
  260. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_insights.py +0 -0
  261. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_insights_cli.py +0 -0
  262. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_insights_expanded.py +0 -0
  263. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_install_hook.py +0 -0
  264. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_lang_detect.py +0 -0
  265. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_library.py +0 -0
  266. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_lint.py +0 -0
  267. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_markdown.py +0 -0
  268. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_merge_view.py +0 -0
  269. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_models.py +0 -0
  270. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_output.py +0 -0
  271. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_parse_conversation_base.py +0 -0
  272. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_parse_conversation_chatgpt.py +0 -0
  273. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_parse_conversation_claude.py +0 -0
  274. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_persona.py +0 -0
  275. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_pipeline.py +0 -0
  276. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_privacy.py +0 -0
  277. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_privacy_cli.py +0 -0
  278. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_privacy_e2e.py +0 -0
  279. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_privacy_output.py +0 -0
  280. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_prompt_dna.py +0 -0
  281. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_public_api.py +0 -0
  282. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_recommend.py +0 -0
  283. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_schema_version.py +0 -0
  284. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_score_cli.py +0 -0
  285. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_scorer.py +0 -0
  286. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_segmenter.py +0 -0
  287. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_session_type.py +0 -0
  288. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_share_e2e.py +0 -0
  289. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_sharing_client.py +0 -0
  290. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_source_filter.py +0 -0
  291. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_style.py +0 -0
  292. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_style_trends.py +0 -0
  293. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_telemetry_cli.py +0 -0
  294. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_telemetry_collector.py +0 -0
  295. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_telemetry_consent.py +0 -0
  296. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_telemetry_e2e.py +0 -0
  297. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_telemetry_events.py +0 -0
  298. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_telemetry_prompt.py +0 -0
  299. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_telemetry_queue.py +0 -0
  300. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_telemetry_sender.py +0 -0
  301. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_template_cli.py +0 -0
  302. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_templates.py +0 -0
  303. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_timeutil.py +0 -0
  304. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_trends.py +0 -0
  305. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_trends_cli.py +0 -0
  306. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_use_cli.py +0 -0
  307. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_wrapped.py +0 -0
  308. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_wrapped_cli.py +0 -0
  309. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_wrapped_e2e.py +0 -0
  310. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_wrapped_html.py +0 -0
  311. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_wrapped_output.py +0 -0
  312. {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_wrapped_share.py +0 -0
@@ -41,6 +41,7 @@ thoughts/
41
41
  .tldr/
42
42
  .tldrignore
43
43
  .worktrees/
44
+ CLAUDE.md
44
45
 
45
46
  # Launch / marketing drafts (not part of the codebase)
46
47
  docs/launch/
@@ -0,0 +1,26 @@
1
+ - id: reprompt-lint
2
+ name: reprompt lint
3
+ description: Check AI prompt quality in session files
4
+ entry: reprompt lint
5
+ language: python
6
+ pass_filenames: false
7
+ always_run: true
8
+ additional_dependencies: ["reprompt-cli"]
9
+
10
+ - id: reprompt-lint-strict
11
+ name: reprompt lint (strict)
12
+ description: Check AI prompt quality — fail on warnings too
13
+ entry: reprompt lint --strict
14
+ language: python
15
+ pass_filenames: false
16
+ always_run: true
17
+ additional_dependencies: ["reprompt-cli"]
18
+
19
+ - id: reprompt-lint-score
20
+ name: reprompt lint (score gate)
21
+ description: Check AI prompt quality — fail if avg score below threshold
22
+ entry: reprompt lint --score-threshold 50
23
+ language: python
24
+ pass_filenames: false
25
+ always_run: true
26
+ additional_dependencies: ["reprompt-cli"]
Binary file
Binary file
@@ -2,6 +2,22 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file.
4
4
 
5
+ ## [1.6.1] - 2026-03-28
6
+
7
+ ### Fixed
8
+ - **Critical: `reprompt scan` crash** — `compute_pattern_effectiveness` failed on prompts containing SQL LIKE wildcards (`%`, `_`). Replaced `LIKE` with `INSTR()` for exact substring matching.
9
+ - **Score calibration** — single-paragraph prompts incorrectly received 0/20 for Position (instruction was treated as "buried in the middle"). Now correctly scores instruction-at-start as optimal position.
10
+ - **Compress grammar bugs** — fixed leading whitespace after filler deletion, dangling "that" after "the thing is" removal, orphaned commas, and remnant pleasantry fragments.
11
+ - **Deprecated command references** — `reprompt library` and `reprompt trends` references in report footer and scan guidance now point to `reprompt template list` and `reprompt digest --trends`.
12
+ - **Wrong adapter names** — `--source` help examples used non-existent `chatgpt-ext`; fixed to `chatgpt-export`.
13
+
14
+ ### Improved
15
+ - **Compress engine** — added 15 filler phrases (`kind of`, `sort of`, `additionally`, `the fact that`, etc.) and 16 phrase simplification rules (`take a look at` → `check`, `let me know` → removed, etc.). Added post-compression cleanup pass for whitespace, punctuation, and sentence capitalization. Typical savings improved from 3-33% to 38-60%.
16
+ - **Score UX** — suggestions now sorted by impact (high first); paper citations dimmed; new "Very Poor" grade tier for scores under 20.
17
+ - **CLI help** — added usage examples to 7 key commands (score, scan, compress, compare, distill, lint, privacy). Added Quick Start guide to main `--help`. Standardized `--source` option across all commands with `-s` shorthand.
18
+ - **Help panels** — moved `digest` from Manage to Analyze panel. Listed all 9 adapters in `scan --help`.
19
+ - Tests: 1490 → 1497
20
+
5
21
  ## [1.6.0] - 2026-03-28
6
22
 
7
23
  ### Added
@@ -0,0 +1,120 @@
1
+ # Contributing to reprompt
2
+
3
+ Thanks for your interest in contributing! reprompt is an open-source prompt intelligence tool, and contributions of all kinds are welcome.
4
+
5
+ ## Quick Links
6
+
7
+ - [Good First Issues](https://github.com/reprompt-dev/reprompt/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22)
8
+ - [Help Wanted](https://github.com/reprompt-dev/reprompt/issues?q=is%3Aissue+is%3Aopen+label%3A%22help+wanted%22)
9
+
10
+ ## Development Setup
11
+
12
+ ```bash
13
+ git clone https://github.com/reprompt-dev/reprompt
14
+ cd reprompt
15
+ uv venv
16
+ uv pip install -e ".[dev]"
17
+ ```
18
+
19
+ ## Running Tests
20
+
21
+ ```bash
22
+ uv run pytest tests/ -v
23
+ uv run pytest tests/ -v --cov=reprompt # with coverage
24
+ ```
25
+
26
+ ## Code Style
27
+
28
+ We use [ruff](https://docs.astral.sh/ruff/) for linting and formatting:
29
+
30
+ ```bash
31
+ uv run ruff check src/ tests/
32
+ uv run ruff format src/ tests/
33
+ ```
34
+
35
+ ## Type Checking
36
+
37
+ We use [mypy](https://mypy-lang.org/) in strict mode:
38
+
39
+ ```bash
40
+ uv run mypy src/reprompt/
41
+ ```
42
+
43
+ ## Pull Requests
44
+
45
+ 1. Fork the repo and create a feature branch
46
+ 2. Write tests for new functionality
47
+ 3. Ensure all tests pass and coverage doesn't decrease
48
+ 4. Run `ruff check` and `ruff format`
49
+ 5. Run `mypy src/reprompt/` -- must pass clean
50
+ 6. Submit a PR with a clear description
51
+
52
+ ### Before Submitting
53
+
54
+ - **Comment on the issue first** — introduce yourself and outline your approach before writing code. This avoids wasted work and duplicate effort.
55
+ - **One PR per issue** — don't submit multiple PRs for the same issue.
56
+ - PRs from brand-new GitHub accounts with no prior project engagement will generally not be reviewed.
57
+
58
+ ## Common Contribution Areas
59
+
60
+ ### Adding Adapters (new AI tool support)
61
+
62
+ Adding a new adapter is the easiest way to contribute. Each adapter is ~50-100 lines:
63
+
64
+ 1. Create `src/reprompt/adapters/your_tool.py`
65
+ 2. Subclass `BaseAdapter` from `adapters/base.py`
66
+ 3. Implement:
67
+ - `name` property -- adapter identifier (e.g., `"copilot"`)
68
+ - `default_session_path` -- where the tool stores sessions
69
+ - `discover_sessions()` -- find session files
70
+ - `parse_session(path)` -- extract `Prompt` objects
71
+ - Optional: `parse_conversation(path)` -- extract full conversation turns
72
+ 4. Register in `core/pipeline.py` → `get_adapters()`
73
+ 5. Add tests in `tests/test_your_tool_adapter.py`
74
+
75
+ **Reference adapters:**
76
+ - `adapters/cline.py` -- simplest (~80 lines, JSON format)
77
+ - `adapters/aider.py` -- markdown parsing
78
+ - `adapters/cursor.py` -- SQLite/vscdb format
79
+
80
+ ### Adding Lint Rules
81
+
82
+ Each lint rule is a standalone function in `core/lint.py`:
83
+
84
+ 1. Add your rule check in `lint_prompt()`
85
+ 2. Return a `LintViolation` with `severity="error"` or `"warning"`
86
+ 3. Add tests in `tests/test_lint.py`
87
+
88
+ ### Adding Privacy Patterns
89
+
90
+ Extend sensitive content detection in `core/privacy_scan.py`:
91
+
92
+ 1. Add a regex pattern to the `PATTERNS` dict
93
+ 2. Add category mapping in `CATEGORY_MAP`
94
+ 3. Add safety filter if needed (to exclude false positives)
95
+ 4. Add tests in `tests/test_privacy_scan.py`
96
+
97
+ ## Architecture
98
+
99
+ ```
100
+ src/reprompt/
101
+ ├── cli.py # Typer CLI (21 commands)
102
+ ├── config.py # pydantic-settings configuration
103
+ ├── core/ # Business logic
104
+ │ ├── models.py # Prompt dataclass
105
+ │ ├── scorer.py # Research-calibrated 0-100 scoring
106
+ │ ├── lint.py # Quality linter
107
+ │ ├── compress.py # 4-layer prompt compression
108
+ │ ├── distill.py # Conversation distillation
109
+ │ ├── agent.py # Agent workflow analysis
110
+ │ ├── privacy_scan.py # Sensitive content detection
111
+ │ └── pipeline.py # Orchestrator
112
+ ├── adapters/ # 9 AI tool parsers
113
+ ├── storage/ # SQLite layer
114
+ ├── bridge/ # Browser extension Native Messaging
115
+ └── output/ # Report formatters (terminal, JSON, HTML)
116
+ ```
117
+
118
+ ## Questions?
119
+
120
+ Open an issue or start a discussion. We're happy to help you get started.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: reprompt-cli
3
- Version: 1.6.0
3
+ Version: 1.8.0
4
4
  Summary: Discover, analyze, and optimize your prompts from AI coding sessions
5
5
  Project-URL: Homepage, https://github.com/reprompt-dev/reprompt
6
6
  Project-URL: Repository, https://github.com/reprompt-dev/reprompt
@@ -45,7 +45,7 @@ Description-Content-Type: text/markdown
45
45
 
46
46
  # `re:prompt`
47
47
 
48
- **Prompt Intelligence for AI power users** -- understand, optimize, and manage your AI conversations.
48
+ **Analyze what you type into AI tools** -- prompt scoring, agent error loops, leaked credential detection, conversation distillation.
49
49
 
50
50
  [![PyPI version](https://img.shields.io/pypi/v/reprompt-cli)](https://pypi.org/project/reprompt-cli/)
51
51
  [![Python 3.10+](https://img.shields.io/pypi/pyversions/reprompt-cli)](https://pypi.org/project/reprompt-cli/)
@@ -55,6 +55,8 @@ Description-Content-Type: text/markdown
55
55
 
56
56
  ---
57
57
 
58
+ ![reprompt demo](docs/demo.gif)
59
+
58
60
  ## See it in action
59
61
 
60
62
  ```bash
@@ -67,18 +69,18 @@ $ reprompt
67
69
  ╰────────────────────────────────────────────────────────────╯
68
70
 
69
71
  $ reprompt score "Fix the auth bug in src/login.ts where JWT expires"
70
- Score: 74/100
71
- Structure: 18/25 | Context: 22/25 | Position: 15/20 | Repetition: 9/15 | Clarity: 10/15
72
- Tip: Add the error message for +15% accuracy
72
+ Score: 40/100 (Fair)
73
+ Structure: 0/25 | Context: 8/25 | Position: 20/20 | Repetition: 0/15 | Clarity: 12/15
74
+ Tip: Include the error message -- debug prompts with errors are 3.7x more effective
73
75
 
74
76
  $ reprompt distill --last 3 --summary
75
77
  Session: feature-dev (42 turns, 18 important)
76
78
  Key moments: initial spec → auth module → test failures → JWT fix → passing
77
79
  Context: "Building auth system with JWT refresh tokens for Express API"
78
80
 
79
- $ reprompt compress "请帮我看一下这个代码,就是那个 login 的那个文件,好像有点问题"
80
- Before: 31 tokens → After: 15 tokens (52% saved)
81
- "看一下 login 文件的问题"
81
+ $ reprompt compress "I was wondering if you could please help me refactor this code. Basically what I need is to split this function into smaller helpers and add error handling."
82
+ Before: 28 tokens → After: 14 tokens (50% saved)
83
+ "Help me refactor this code. Split this function into smaller helpers and add error handling."
82
84
  ```
83
85
 
84
86
  ## What it does
@@ -99,7 +101,7 @@ $ reprompt compress "请帮我看一下这个代码,就是那个 login 的那
99
101
 
100
102
  | Command | Description |
101
103
  |---------|-------------|
102
- | `reprompt compress "prompt"` | 4-layer prompt compression (50%+ token savings typical) |
104
+ | `reprompt compress "prompt"` | 4-layer prompt compression (40-60% token savings typical) |
103
105
  | `reprompt distill` | Extract important turns from conversations with 6-signal scoring |
104
106
  | `reprompt distill --export` | Recover context when a session runs out -- paste into new session |
105
107
  | `reprompt lint` | Prompt quality linter with GitHub Action support |
@@ -183,12 +185,44 @@ reprompt install-hook # adds post-session hook to Claude Code
183
185
 
184
186
  Capture prompts from ChatGPT, Claude.ai, and Gemini directly in your browser:
185
187
 
186
- 1. **Install the extension** from [Chrome Web Store](https://chromewebstore.google.com/detail/reprompt/ojdccpagaanchmkninlbgbgemdcjckhn)
188
+ 1. **Install the extension** from [Chrome Web Store](https://chromewebstore.google.com/detail/reprompt/ojdccpagaanchmkninlbgbgemdcjckhn) or [Firefox Add-ons](https://addons.mozilla.org/addon/reprompt-cli/)
187
189
  2. **Connect to the CLI:** `reprompt install-extension`
188
190
  3. **Verify:** `reprompt extension-status`
189
191
 
190
192
  Captured prompts sync locally via Native Messaging -- nothing leaves your machine.
191
193
 
194
+ ### CI integration
195
+
196
+ #### GitHub Action
197
+
198
+ ```yaml
199
+ # .github/workflows/prompt-lint.yml
200
+ - uses: reprompt-dev/reprompt@main
201
+ with:
202
+ score-threshold: 50 # fail if avg prompt score < 50
203
+ strict: true # fail on warnings too
204
+ comment-on-pr: true # post quality report as PR comment
205
+ ```
206
+
207
+ #### pre-commit
208
+
209
+ ```yaml
210
+ # .pre-commit-config.yaml
211
+ repos:
212
+ - repo: https://github.com/reprompt-dev/reprompt
213
+ rev: v1.7.0
214
+ hooks:
215
+ - id: reprompt-lint
216
+ ```
217
+
218
+ #### Direct CLI
219
+
220
+ ```bash
221
+ reprompt lint --score-threshold 50 # exit 1 if avg score < 50
222
+ reprompt lint --strict # exit 1 on warnings
223
+ reprompt lint --json # machine-readable output
224
+ ```
225
+
192
226
  ## Privacy
193
227
 
194
228
  - All analysis runs locally. No prompts leave your machine.
@@ -202,6 +236,7 @@ Captured prompts sync locally via Native Messaging -- nothing leaves your machin
202
236
 
203
237
  - **Website:** [getreprompt.dev](https://getreprompt.dev)
204
238
  - **Chrome Extension:** [Chrome Web Store](https://chromewebstore.google.com/detail/reprompt/ojdccpagaanchmkninlbgbgemdcjckhn)
239
+ - **Firefox Add-on:** [Firefox Add-ons](https://addons.mozilla.org/addon/reprompt-cli/)
205
240
  - **PyPI:** [reprompt-cli](https://pypi.org/project/reprompt-cli/)
206
241
  - **Changelog:** [CHANGELOG.md](CHANGELOG.md)
207
242
  - **Privacy:** [getreprompt.dev/privacy](https://getreprompt.dev/privacy)
@@ -1,6 +1,6 @@
1
1
  # `re:prompt`
2
2
 
3
- **Prompt Intelligence for AI power users** -- understand, optimize, and manage your AI conversations.
3
+ **Analyze what you type into AI tools** -- prompt scoring, agent error loops, leaked credential detection, conversation distillation.
4
4
 
5
5
  [![PyPI version](https://img.shields.io/pypi/v/reprompt-cli)](https://pypi.org/project/reprompt-cli/)
6
6
  [![Python 3.10+](https://img.shields.io/pypi/pyversions/reprompt-cli)](https://pypi.org/project/reprompt-cli/)
@@ -10,6 +10,8 @@
10
10
 
11
11
  ---
12
12
 
13
+ ![reprompt demo](docs/demo.gif)
14
+
13
15
  ## See it in action
14
16
 
15
17
  ```bash
@@ -22,18 +24,18 @@ $ reprompt
22
24
  ╰────────────────────────────────────────────────────────────╯
23
25
 
24
26
  $ reprompt score "Fix the auth bug in src/login.ts where JWT expires"
25
- Score: 74/100
26
- Structure: 18/25 | Context: 22/25 | Position: 15/20 | Repetition: 9/15 | Clarity: 10/15
27
- Tip: Add the error message for +15% accuracy
27
+ Score: 40/100 (Fair)
28
+ Structure: 0/25 | Context: 8/25 | Position: 20/20 | Repetition: 0/15 | Clarity: 12/15
29
+ Tip: Include the error message -- debug prompts with errors are 3.7x more effective
28
30
 
29
31
  $ reprompt distill --last 3 --summary
30
32
  Session: feature-dev (42 turns, 18 important)
31
33
  Key moments: initial spec → auth module → test failures → JWT fix → passing
32
34
  Context: "Building auth system with JWT refresh tokens for Express API"
33
35
 
34
- $ reprompt compress "请帮我看一下这个代码,就是那个 login 的那个文件,好像有点问题"
35
- Before: 31 tokens → After: 15 tokens (52% saved)
36
- "看一下 login 文件的问题"
36
+ $ reprompt compress "I was wondering if you could please help me refactor this code. Basically what I need is to split this function into smaller helpers and add error handling."
37
+ Before: 28 tokens → After: 14 tokens (50% saved)
38
+ "Help me refactor this code. Split this function into smaller helpers and add error handling."
37
39
  ```
38
40
 
39
41
  ## What it does
@@ -54,7 +56,7 @@ $ reprompt compress "请帮我看一下这个代码,就是那个 login 的那
54
56
 
55
57
  | Command | Description |
56
58
  |---------|-------------|
57
- | `reprompt compress "prompt"` | 4-layer prompt compression (50%+ token savings typical) |
59
+ | `reprompt compress "prompt"` | 4-layer prompt compression (40-60% token savings typical) |
58
60
  | `reprompt distill` | Extract important turns from conversations with 6-signal scoring |
59
61
  | `reprompt distill --export` | Recover context when a session runs out -- paste into new session |
60
62
  | `reprompt lint` | Prompt quality linter with GitHub Action support |
@@ -138,12 +140,44 @@ reprompt install-hook # adds post-session hook to Claude Code
138
140
 
139
141
  Capture prompts from ChatGPT, Claude.ai, and Gemini directly in your browser:
140
142
 
141
- 1. **Install the extension** from [Chrome Web Store](https://chromewebstore.google.com/detail/reprompt/ojdccpagaanchmkninlbgbgemdcjckhn)
143
+ 1. **Install the extension** from [Chrome Web Store](https://chromewebstore.google.com/detail/reprompt/ojdccpagaanchmkninlbgbgemdcjckhn) or [Firefox Add-ons](https://addons.mozilla.org/addon/reprompt-cli/)
142
144
  2. **Connect to the CLI:** `reprompt install-extension`
143
145
  3. **Verify:** `reprompt extension-status`
144
146
 
145
147
  Captured prompts sync locally via Native Messaging -- nothing leaves your machine.
146
148
 
149
+ ### CI integration
150
+
151
+ #### GitHub Action
152
+
153
+ ```yaml
154
+ # .github/workflows/prompt-lint.yml
155
+ - uses: reprompt-dev/reprompt@main
156
+ with:
157
+ score-threshold: 50 # fail if avg prompt score < 50
158
+ strict: true # fail on warnings too
159
+ comment-on-pr: true # post quality report as PR comment
160
+ ```
161
+
162
+ #### pre-commit
163
+
164
+ ```yaml
165
+ # .pre-commit-config.yaml
166
+ repos:
167
+ - repo: https://github.com/reprompt-dev/reprompt
168
+ rev: v1.7.0
169
+ hooks:
170
+ - id: reprompt-lint
171
+ ```
172
+
173
+ #### Direct CLI
174
+
175
+ ```bash
176
+ reprompt lint --score-threshold 50 # exit 1 if avg score < 50
177
+ reprompt lint --strict # exit 1 on warnings
178
+ reprompt lint --json # machine-readable output
179
+ ```
180
+
147
181
  ## Privacy
148
182
 
149
183
  - All analysis runs locally. No prompts leave your machine.
@@ -157,6 +191,7 @@ Captured prompts sync locally via Native Messaging -- nothing leaves your machin
157
191
 
158
192
  - **Website:** [getreprompt.dev](https://getreprompt.dev)
159
193
  - **Chrome Extension:** [Chrome Web Store](https://chromewebstore.google.com/detail/reprompt/ojdccpagaanchmkninlbgbgemdcjckhn)
194
+ - **Firefox Add-on:** [Firefox Add-ons](https://addons.mozilla.org/addon/reprompt-cli/)
160
195
  - **PyPI:** [reprompt-cli](https://pypi.org/project/reprompt-cli/)
161
196
  - **Changelog:** [CHANGELOG.md](CHANGELOG.md)
162
197
  - **Privacy:** [getreprompt.dev/privacy](https://getreprompt.dev/privacy)
@@ -0,0 +1,211 @@
1
+ name: "reprompt lint"
2
+ description: "Check AI prompt quality in your codebase"
3
+ branding:
4
+ icon: "zap"
5
+ color: "blue"
6
+
7
+ inputs:
8
+ version:
9
+ description: "reprompt-cli version to install"
10
+ required: false
11
+ default: "latest"
12
+ source:
13
+ description: "Adapter to scan (claude-code, aider, gemini, cline, cursor, openclaw)"
14
+ required: false
15
+ default: ""
16
+ path:
17
+ description: "Path to scan for session files"
18
+ required: false
19
+ default: ""
20
+ strict:
21
+ description: "Fail on warnings too (not just errors)"
22
+ required: false
23
+ default: "false"
24
+ score-threshold:
25
+ description: "Fail if average prompt score is below this threshold (0-100)"
26
+ required: false
27
+ default: "0"
28
+ json:
29
+ description: "Output results as JSON"
30
+ required: false
31
+ default: "false"
32
+ comment-on-pr:
33
+ description: "Post quality report as PR comment (requires pull_request event)"
34
+ required: false
35
+ default: "false"
36
+
37
+ outputs:
38
+ errors:
39
+ description: "Number of lint errors found"
40
+ value: ${{ steps.lint.outputs.errors }}
41
+ warnings:
42
+ description: "Number of lint warnings found"
43
+ value: ${{ steps.lint.outputs.warnings }}
44
+ avg-score:
45
+ description: "Average prompt score (when score-threshold > 0)"
46
+ value: ${{ steps.lint.outputs.avg_score }}
47
+
48
+ runs:
49
+ using: "composite"
50
+ steps:
51
+ - name: Set up uv
52
+ uses: astral-sh/setup-uv@v7
53
+
54
+ - name: Install reprompt
55
+ shell: bash
56
+ env:
57
+ INPUT_VERSION: ${{ inputs.version }}
58
+ run: |
59
+ if [ "$INPUT_VERSION" = "latest" ]; then
60
+ uv tool install reprompt-cli
61
+ else
62
+ uv tool install "reprompt-cli==$INPUT_VERSION"
63
+ fi
64
+
65
+ - name: Scan sessions
66
+ shell: bash
67
+ env:
68
+ INPUT_SOURCE: ${{ inputs.source }}
69
+ INPUT_PATH: ${{ inputs.path }}
70
+ run: |
71
+ SCAN_ARGS=""
72
+ if [ -n "$INPUT_SOURCE" ]; then
73
+ SCAN_ARGS="$SCAN_ARGS --source $INPUT_SOURCE"
74
+ fi
75
+ if [ -n "$INPUT_PATH" ]; then
76
+ SCAN_ARGS="$SCAN_ARGS --path $INPUT_PATH"
77
+ fi
78
+ reprompt scan $SCAN_ARGS || true
79
+
80
+ - name: Run lint
81
+ id: lint
82
+ shell: bash
83
+ env:
84
+ INPUT_SOURCE: ${{ inputs.source }}
85
+ INPUT_PATH: ${{ inputs.path }}
86
+ INPUT_STRICT: ${{ inputs.strict }}
87
+ INPUT_SCORE_THRESHOLD: ${{ inputs.score-threshold }}
88
+ INPUT_JSON: ${{ inputs.json }}
89
+ run: |
90
+ LINT_ARGS=""
91
+ if [ -n "$INPUT_SOURCE" ]; then
92
+ LINT_ARGS="$LINT_ARGS --source $INPUT_SOURCE"
93
+ fi
94
+ if [ -n "$INPUT_PATH" ]; then
95
+ LINT_ARGS="$LINT_ARGS --path $INPUT_PATH"
96
+ fi
97
+ if [ "$INPUT_STRICT" = "true" ]; then
98
+ LINT_ARGS="$LINT_ARGS --strict"
99
+ fi
100
+ if [ "$INPUT_SCORE_THRESHOLD" != "0" ]; then
101
+ LINT_ARGS="$LINT_ARGS --score-threshold $INPUT_SCORE_THRESHOLD"
102
+ fi
103
+
104
+ # Always get JSON for outputs + PR comment
105
+ JSON_RESULT=$(reprompt lint --json $LINT_ARGS 2>/dev/null || echo '{"errors":0,"warnings":0}')
106
+ echo "$JSON_RESULT" > /tmp/reprompt-lint.json
107
+
108
+ echo "errors=$(echo "$JSON_RESULT" | python3 -c 'import sys,json; print(json.load(sys.stdin).get("errors",0))')" >> "$GITHUB_OUTPUT"
109
+ echo "warnings=$(echo "$JSON_RESULT" | python3 -c 'import sys,json; print(json.load(sys.stdin).get("warnings",0))')" >> "$GITHUB_OUTPUT"
110
+ echo "avg_score=$(echo "$JSON_RESULT" | python3 -c 'import sys,json; d=json.load(sys.stdin); print(d.get("score",{}).get("avg_score",0))')" >> "$GITHUB_OUTPUT"
111
+
112
+ # Run lint for display output
113
+ if [ "$INPUT_JSON" = "true" ]; then
114
+ reprompt lint --json $LINT_ARGS
115
+ else
116
+ reprompt lint $LINT_ARGS
117
+ fi
118
+
119
+ - name: Comment on PR
120
+ if: inputs.comment-on-pr == 'true' && github.event_name == 'pull_request'
121
+ shell: bash
122
+ env:
123
+ GH_TOKEN: ${{ github.token }}
124
+ PR_NUMBER: ${{ github.event.pull_request.number }}
125
+ REPO: ${{ github.repository }}
126
+ run: |
127
+ # Build markdown comment from lint JSON
128
+ COMMENT=$(python3 << 'PYEOF'
129
+ import json, os
130
+
131
+ with open("/tmp/reprompt-lint.json") as f:
132
+ data = json.load(f)
133
+
134
+ errors = data.get("errors", 0)
135
+ warnings = data.get("warnings", 0)
136
+ total = data.get("total_prompts", 0)
137
+ score = data.get("score", {})
138
+ violations = data.get("violations", [])
139
+
140
+ # Status badge
141
+ if errors > 0:
142
+ status = "🔴 **Failed**"
143
+ elif warnings > 0:
144
+ status = "🟡 **Passed with warnings**"
145
+ else:
146
+ status = "🟢 **Passed**"
147
+
148
+ lines = []
149
+ lines.append("<!-- reprompt-lint -->")
150
+ lines.append("## reprompt lint " + status)
151
+ lines.append("")
152
+ lines.append(f"| Metric | Value |")
153
+ lines.append(f"|--------|-------|")
154
+ lines.append(f"| Prompts checked | {total} |")
155
+ lines.append(f"| Errors | {errors} |")
156
+ lines.append(f"| Warnings | {warnings} |")
157
+
158
+ if score:
159
+ avg = score.get("avg_score", 0)
160
+ threshold = score.get("threshold", 0)
161
+ passed = "✅" if score.get("pass") else "❌"
162
+ lines.append(f"| Avg Score | {avg}/100 {passed} (threshold: {threshold}) |")
163
+ lines.append(f"| Score Range | {score.get('min_score', 0)} — {score.get('max_score', 0)} |")
164
+
165
+ # Violations (collapsible)
166
+ if violations:
167
+ lines.append("")
168
+ lines.append(f"<details><summary>📋 {len(violations)} violation(s)</summary>")
169
+ lines.append("")
170
+ lines.append("| Severity | Rule | Message |")
171
+ lines.append("|----------|------|---------|")
172
+ for v in violations[:20]:
173
+ sev = "🔴" if v["severity"] == "error" else "🟡"
174
+ lines.append(f"| {sev} | `{v['rule']}` | {v['message']} |")
175
+ if len(violations) > 20:
176
+ lines.append(f"| | | ... and {len(violations) - 20} more |")
177
+ lines.append("")
178
+ lines.append("</details>")
179
+
180
+ lines.append("")
181
+ lines.append("*Run `reprompt lint` locally for full details — [docs](https://github.com/reprompt-dev/reprompt)*")
182
+
183
+ print("\n".join(lines))
184
+ PYEOF
185
+ )
186
+
187
+ # Find existing comment to update (avoid duplicates)
188
+ EXISTING=$(gh api "repos/$REPO/issues/$PR_NUMBER/comments" \
189
+ --jq '.[] | select(.body | contains("<!-- reprompt-lint -->")) | .id' \
190
+ 2>/dev/null | head -1)
191
+
192
+ if [ -n "$EXISTING" ]; then
193
+ # Update existing comment
194
+ gh api "repos/$REPO/issues/$PR_NUMBER/comments/$EXISTING" \
195
+ -X PATCH -f body="$COMMENT" > /dev/null
196
+ else
197
+ # Create new comment
198
+ gh api "repos/$REPO/issues/$PR_NUMBER/comments" \
199
+ -f body="$COMMENT" > /dev/null
200
+ fi
201
+
202
+ - name: Add summary
203
+ if: always()
204
+ shell: bash
205
+ run: |
206
+ echo "## reprompt lint results" >> "$GITHUB_STEP_SUMMARY"
207
+ echo "" >> "$GITHUB_STEP_SUMMARY"
208
+ echo "- Errors: ${{ steps.lint.outputs.errors }}" >> "$GITHUB_STEP_SUMMARY"
209
+ echo "- Warnings: ${{ steps.lint.outputs.warnings }}" >> "$GITHUB_STEP_SUMMARY"
210
+ echo "" >> "$GITHUB_STEP_SUMMARY"
211
+ echo "Run \`reprompt lint\` locally for full details." >> "$GITHUB_STEP_SUMMARY"
Binary file
@@ -0,0 +1,22 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" width="512" height="512">
2
+ <!--
3
+ reprompt Brand Icon — Production
4
+ Full-bleed square: let each platform apply its own mask.
5
+ Safe zone: content within central 75% (384x384, 64px margins).
6
+ Optical center: rP baseline at y=330 places visual mass at canvas center.
7
+ -->
8
+ <defs>
9
+ <linearGradient id="bg" x1="0" y1="0" x2="1" y2="1">
10
+ <stop offset="0%" stop-color="#e94560"/>
11
+ <stop offset="100%" stop-color="#c73050"/>
12
+ </linearGradient>
13
+ </defs>
14
+ <!-- Full-bleed background — NO rounded corners -->
15
+ <rect width="512" height="512" fill="url(#bg)"/>
16
+ <!-- Optically centered rP monogram -->
17
+ <text x="256" y="330" text-anchor="middle"
18
+ font-family="Inter, Helvetica Neue, Arial, -apple-system, sans-serif"
19
+ font-size="240">
20
+ <tspan fill="rgba(255,255,255,0.45)" font-weight="400">r</tspan><tspan fill="#ffffff" font-weight="800">P</tspan>
21
+ </text>
22
+ </svg>