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.
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/.github/workflows/ci.yml +1 -1
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/.github/workflows/publish.yml +8 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/CHANGELOG.md +88 -0
- reprompt_cli-1.0.0/PKG-INFO +143 -0
- reprompt_cli-1.0.0/README.md +98 -0
- reprompt_cli-1.0.0/docs/roadmap.md +74 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/pyproject.toml +10 -4
- reprompt_cli-1.0.0/src/reprompt/__init__.py +88 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/cli.py +44 -3
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/core/pipeline.py +11 -4
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/storage/db.py +40 -19
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_cli.py +2 -2
- reprompt_cli-1.0.0/tests/test_coverage_boost.py +764 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_digest_cli.py +8 -3
- reprompt_cli-1.0.0/tests/test_empty_state.py +104 -0
- reprompt_cli-1.0.0/tests/test_public_api.py +33 -0
- reprompt_cli-1.0.0/tests/test_schema_version.py +128 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/uv.lock +4 -774
- reprompt_cli-0.9.2/PKG-INFO +0 -318
- reprompt_cli-0.9.2/README.md +0 -270
- reprompt_cli-0.9.2/docs/roadmap.md +0 -116
- reprompt_cli-0.9.2/src/reprompt/__init__.py +0 -5
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/.editorconfig +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/.github/dependabot.yml +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/.gitignore +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/.pre-commit-config.yaml +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/CLAUDE.md +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/CODE_OF_CONDUCT.md +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/CONTRIBUTING.md +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/LICENSE +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/SECURITY.md +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/action.yml +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/docs/launch-post.md +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/docs/superpowers/specs/2026-03-11-html-dashboard-design.md +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/docs/superpowers/specs/2026-03-11-merge-view-design.md +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/docs/superpowers/specs/2026-03-11-prompt-templates-design.md +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/scripts/generate_demo_data.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/scripts/launch/hn_monitor.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/scripts/launch/reddit_helper.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/adapters/__init__.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/adapters/aider.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/adapters/base.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/adapters/chatgpt.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/adapters/claude_chat.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/adapters/claude_code.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/adapters/cline.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/adapters/cursor.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/adapters/filters.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/adapters/gemini.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/adapters/openclaw.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/bridge/__init__.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/bridge/handler.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/bridge/host.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/bridge/manifest.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/bridge/protocol.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/commands/__init__.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/commands/telemetry.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/commands/wrapped.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/config.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/core/__init__.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/core/analyzer.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/core/dedup.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/core/digest.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/core/effectiveness.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/core/extractors.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/core/extractors_zh.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/core/insights.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/core/lang_detect.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/core/library.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/core/lint.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/core/merge_view.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/core/models.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/core/persona.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/core/prompt_dna.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/core/recommend.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/core/scorer.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/core/segmenter.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/core/session_meta.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/core/style.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/core/templates.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/core/timeutil.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/core/trends.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/core/wrapped.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/demo.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/embeddings/__init__.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/embeddings/base.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/embeddings/local_embed.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/embeddings/ollama.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/embeddings/openai_embed.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/embeddings/tfidf.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/mcp.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/mcp_main.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/output/__init__.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/output/chartjs.min.js +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/output/html_report.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/output/json_out.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/output/markdown.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/output/terminal.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/output/wrapped_html.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/output/wrapped_terminal.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/py.typed +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/sharing/__init__.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/sharing/client.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/sharing/clipboard.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/storage/__init__.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/telemetry/__init__.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/telemetry/collector.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/telemetry/consent.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/telemetry/events.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/telemetry/prompt.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/telemetry/queue.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/src/reprompt/telemetry/sender.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/__init__.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/conftest.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/fixtures/aider_chat_history.md +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/fixtures/chatgpt_conversations.json +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/fixtures/claude_chat_export.json +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/fixtures/claude_session.jsonl +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/fixtures/cline_task/api_conversation_history.json +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/fixtures/gemini_session.json +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/fixtures/openclaw_session.jsonl +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_adapter_aider.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_adapter_chatgpt.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_adapter_claude.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_adapter_claude_chat.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_adapter_cline.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_adapter_gemini.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_adapter_openclaw.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_analyzer.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_bridge_cli.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_bridge_handler.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_bridge_integration.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_bridge_manifest.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_bridge_protocol.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_cli_library_effectiveness.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_clipboard.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_config.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_cursor_adapter.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_db.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_db_digest.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_db_effectiveness.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_db_trends.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_dedup.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_demo.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_digest.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_e2e.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_effectiveness.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_embeddings_local.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_embeddings_ollama.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_embeddings_openai.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_extractors.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_extractors_routing.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_extractors_zh.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_extractors_zh_e2e.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_html_report.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_import_cli.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_import_e2e.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_insights.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_insights_cli.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_install_hook.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_lang_detect.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_library.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_lint.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_lint_cli.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_markdown.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_mcp.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_merge_view.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_models.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_output.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_persona.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_pipeline.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_prompt_dna.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_recommend.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_score_cli.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_scorer.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_segmenter.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_share_e2e.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_sharing_client.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_style.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_telemetry_cli.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_telemetry_collector.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_telemetry_consent.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_telemetry_e2e.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_telemetry_events.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_telemetry_prompt.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_telemetry_queue.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_telemetry_sender.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_templates.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_timeutil.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_trends.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_trends_cli.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_use_cli.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_wrapped.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_wrapped_cli.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_wrapped_e2e.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_wrapped_html.py +0 -0
- {reprompt_cli-0.9.2 → reprompt_cli-1.0.0}/tests/test_wrapped_output.py +0 -0
- {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
|
+
[](https://pypi.org/project/reprompt-cli/)
|
|
51
|
+
[](https://pypi.org/project/reprompt-cli/)
|
|
52
|
+
[](https://opensource.org/licenses/MIT)
|
|
53
|
+
[](https://github.com/reprompt-dev/reprompt)
|
|
54
|
+
[](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
|
+
[](https://pypi.org/project/reprompt-cli/)
|
|
6
|
+
[](https://pypi.org/project/reprompt-cli/)
|
|
7
|
+
[](https://opensource.org/licenses/MIT)
|
|
8
|
+
[](https://github.com/reprompt-dev/reprompt)
|
|
9
|
+
[](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.
|
|
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 ::
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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:
|