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.
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/.gitignore +1 -0
- reprompt_cli-1.8.0/.pre-commit-hooks.yaml +26 -0
- reprompt_cli-1.8.0/.testmondata-shm +0 -0
- reprompt_cli-1.8.0/.testmondata-wal +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/CHANGELOG.md +16 -0
- reprompt_cli-1.8.0/CONTRIBUTING.md +120 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/PKG-INFO +45 -10
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/README.md +44 -9
- reprompt_cli-1.8.0/Screenshot 2026-03-24 at 09.45.03.png +0 -0
- reprompt_cli-1.8.0/action.yml +211 -0
- reprompt_cli-1.8.0/docs/demo.gif +0 -0
- reprompt_cli-1.8.0/docs/icons/brand-icon-128.png +0 -0
- reprompt_cli-1.8.0/docs/icons/brand-icon-16.png +0 -0
- reprompt_cli-1.8.0/docs/icons/brand-icon-256.png +0 -0
- reprompt_cli-1.8.0/docs/icons/brand-icon-32.png +0 -0
- reprompt_cli-1.8.0/docs/icons/brand-icon-48.png +0 -0
- reprompt_cli-1.8.0/docs/icons/brand-icon-512.png +0 -0
- reprompt_cli-1.8.0/docs/icons/brand-icon-96.png +0 -0
- reprompt_cli-1.8.0/docs/icons/brand-icon.svg +22 -0
- reprompt_cli-1.8.0/docs/icons/cli-favicon-128.png +0 -0
- reprompt_cli-1.8.0/docs/icons/cli-favicon-16.png +0 -0
- reprompt_cli-1.8.0/docs/icons/cli-favicon-256.png +0 -0
- reprompt_cli-1.8.0/docs/icons/cli-favicon-32.png +0 -0
- reprompt_cli-1.8.0/docs/icons/cli-favicon-48.png +0 -0
- reprompt_cli-1.8.0/docs/icons/cli-favicon-512.png +0 -0
- reprompt_cli-1.8.0/docs/icons/cli-favicon-96.png +0 -0
- reprompt_cli-1.8.0/docs/icons/cli-favicon.svg +13 -0
- reprompt_cli-1.8.0/docs/icons/cli-icon-128.png +0 -0
- reprompt_cli-1.8.0/docs/icons/cli-icon-16.png +0 -0
- reprompt_cli-1.8.0/docs/icons/cli-icon-256.png +0 -0
- reprompt_cli-1.8.0/docs/icons/cli-icon-32.png +0 -0
- reprompt_cli-1.8.0/docs/icons/cli-icon-48.png +0 -0
- reprompt_cli-1.8.0/docs/icons/cli-icon-512.png +0 -0
- reprompt_cli-1.8.0/docs/icons/cli-icon-96.png +0 -0
- reprompt_cli-1.8.0/docs/icons/cli-icon.svg +15 -0
- reprompt_cli-1.8.0/docs/icons/favicon-128.png +0 -0
- reprompt_cli-1.8.0/docs/icons/favicon-16.png +0 -0
- reprompt_cli-1.8.0/docs/icons/favicon-256.png +0 -0
- reprompt_cli-1.8.0/docs/icons/favicon-32.png +0 -0
- reprompt_cli-1.8.0/docs/icons/favicon-48.png +0 -0
- reprompt_cli-1.8.0/docs/icons/favicon-512.png +0 -0
- reprompt_cli-1.8.0/docs/icons/favicon-96.png +0 -0
- reprompt_cli-1.8.0/docs/icons/favicon.svg +16 -0
- reprompt_cli-1.8.0/docs/icons/generate.sh +44 -0
- reprompt_cli-1.8.0/docs/superpowers/specs/2026-03-24-v14-command-consolidation-design.md +287 -0
- reprompt_cli-1.8.0/docs/superpowers/specs/2026-03-25-v1.5-dashboard-design.md +338 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/pyproject.toml +1 -1
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/__init__.py +1 -1
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/adapters/chatgpt.py +13 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/bridge/handler.py +10 -26
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/bridge/protocol.py +10 -1
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/cli.py +219 -17
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/core/analyzer.py +3 -1
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/core/compress.py +72 -1
- reprompt_cli-1.8.0/src/reprompt/core/cost.py +96 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/core/dedup.py +15 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/core/extractors.py +19 -6
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/core/extractors_zh.py +2 -1
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/core/insights.py +14 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/core/pipeline.py +112 -1
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/core/privacy_scan.py +34 -0
- reprompt_cli-1.8.0/src/reprompt/core/session_quality.py +203 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/core/suggestions.py +3 -0
- reprompt_cli-1.8.0/src/reprompt/mcp.py +335 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/output/dashboard_terminal.py +16 -2
- reprompt_cli-1.8.0/src/reprompt/output/sessions_terminal.py +172 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/output/terminal.py +31 -5
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/storage/db.py +139 -5
- reprompt_cli-1.8.0/tests/test_cost.py +93 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_db_effectiveness.py +77 -0
- reprompt_cli-1.8.0/tests/test_db_session_quality.py +181 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_e2e.py +2 -2
- reprompt_cli-1.8.0/tests/test_lint_cli.py +184 -0
- reprompt_cli-1.8.0/tests/test_mcp.py +180 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_privacy_scan.py +116 -0
- reprompt_cli-1.8.0/tests/test_session_quality.py +455 -0
- reprompt_cli-1.8.0/tests/test_sessions_cli.py +193 -0
- reprompt_cli-1.8.0/tests/test_sessions_output.py +102 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_suggestions.py +5 -1
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/uv.lock +1 -1
- reprompt_cli-1.6.0/.testmondata +0 -0
- reprompt_cli-1.6.0/CLAUDE.md +0 -166
- reprompt_cli-1.6.0/CONTRIBUTING.md +0 -71
- reprompt_cli-1.6.0/action.yml +0 -100
- reprompt_cli-1.6.0/docs/launch-post.md +0 -116
- reprompt_cli-1.6.0/docs/roadmap.md +0 -112
- reprompt_cli-1.6.0/docs/superpowers/specs/2026-03-11-html-dashboard-design.md +0 -144
- reprompt_cli-1.6.0/docs/superpowers/specs/2026-03-11-merge-view-design.md +0 -136
- reprompt_cli-1.6.0/docs/superpowers/specs/2026-03-11-prompt-templates-design.md +0 -62
- reprompt_cli-1.6.0/docs/superpowers/specs/2026-03-22-prompt-compress-design.md +0 -512
- reprompt_cli-1.6.0/docs/superpowers/specs/2026-03-23-distill-design.md +0 -375
- reprompt_cli-1.6.0/docs/superpowers/specs/2026-03-23-v131-suggestions-source-design.md +0 -179
- reprompt_cli-1.6.0/docs/superpowers/specs/2026-03-24-v14-context-recovery-design.md +0 -342
- reprompt_cli-1.6.0/docs/superpowers/specs/2026-03-24-v141-polish-design.md +0 -184
- reprompt_cli-1.6.0/docs/superpowers/specs/2026-03-28-v1.6-agent-intelligence-design.md +0 -479
- reprompt_cli-1.6.0/module.yaml +0 -12
- reprompt_cli-1.6.0/scripts/launch/hn_monitor.py +0 -163
- reprompt_cli-1.6.0/scripts/launch/reddit_helper.py +0 -193
- reprompt_cli-1.6.0/src/reprompt/mcp.py +0 -207
- reprompt_cli-1.6.0/tests/test_lint_cli.py +0 -95
- reprompt_cli-1.6.0/tests/test_mcp.py +0 -113
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/.editorconfig +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/.github/dependabot.yml +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/.github/workflows/ci.yml +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/.github/workflows/publish.yml +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/.pre-commit-config.yaml +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/CODE_OF_CONDUCT.md +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/LICENSE +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/SECURITY.md +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/scripts/generate_demo_data.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/adapters/__init__.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/adapters/aider.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/adapters/base.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/adapters/claude_chat.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/adapters/claude_code.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/adapters/cline.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/adapters/codex.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/adapters/cursor.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/adapters/filters.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/adapters/gemini.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/adapters/openclaw.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/bridge/__init__.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/bridge/host.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/bridge/manifest.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/commands/__init__.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/commands/telemetry.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/commands/wrapped.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/config.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/core/__init__.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/core/agent.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/core/conversation.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/core/dashboard.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/core/digest.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/core/distill.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/core/effectiveness.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/core/lang_detect.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/core/library.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/core/lint.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/core/merge_view.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/core/models.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/core/persona.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/core/privacy.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/core/prompt_dna.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/core/recommend.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/core/scorer.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/core/segmenter.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/core/session_meta.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/core/session_type.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/core/style.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/core/templates.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/core/timeutil.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/core/trends.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/core/wrapped.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/demo.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/embeddings/__init__.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/embeddings/base.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/embeddings/local_embed.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/embeddings/ollama.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/embeddings/openai_embed.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/embeddings/tfidf.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/mcp_main.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/output/__init__.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/output/agent_terminal.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/output/chartjs.min.js +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/output/compress_terminal.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/output/distill_terminal.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/output/export.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/output/html_report.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/output/json_out.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/output/markdown.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/output/wrapped_html.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/output/wrapped_terminal.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/py.typed +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/sharing/__init__.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/sharing/client.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/sharing/clipboard.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/storage/__init__.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/telemetry/__init__.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/telemetry/collector.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/telemetry/consent.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/telemetry/events.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/telemetry/prompt.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/telemetry/queue.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/src/reprompt/telemetry/sender.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/__init__.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/conftest.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/fixtures/aider_chat_history.md +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/fixtures/chatgpt_conversations.json +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/fixtures/claude_chat_export.json +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/fixtures/claude_session.jsonl +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/fixtures/cline_task/api_conversation_history.json +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/fixtures/export/default_export.md +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/fixtures/export/full_export.md +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/fixtures/gemini_session.json +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/fixtures/openclaw_session.jsonl +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_adapter_aider.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_adapter_chatgpt.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_adapter_claude.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_adapter_claude_chat.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_adapter_cline.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_adapter_gemini.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_adapter_openclaw.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_agent.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_agent_cli.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_analyzer.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_bridge_cli.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_bridge_e2e.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_bridge_handler.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_bridge_integration.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_bridge_manifest.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_bridge_protocol.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_cli.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_cli_deprecations.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_cli_library_effectiveness.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_clipboard.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_codex_adapter.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_compare_best_worst.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_compress.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_compress_cli.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_compress_dna.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_compress_html.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_compress_insights.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_config.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_conversation.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_copy_flag.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_coverage_boost.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_cursor_adapter.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_dashboard.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_db.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_db_digest.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_db_trends.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_dedup.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_demo.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_deprecated_commands.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_digest.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_digest_cli.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_distill.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_distill_cli.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_distill_weights.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_effectiveness.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_embeddings_local.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_embeddings_ollama.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_embeddings_openai.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_empty_state.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_export.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_export_cli.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_export_snapshot.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_extractors.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_extractors_routing.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_extractors_zh.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_extractors_zh_e2e.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_html_report.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_import_cli.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_import_e2e.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_insights.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_insights_cli.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_insights_expanded.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_install_hook.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_lang_detect.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_library.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_lint.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_markdown.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_merge_view.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_models.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_output.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_parse_conversation_base.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_parse_conversation_chatgpt.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_parse_conversation_claude.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_persona.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_pipeline.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_privacy.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_privacy_cli.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_privacy_e2e.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_privacy_output.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_prompt_dna.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_public_api.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_recommend.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_schema_version.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_score_cli.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_scorer.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_segmenter.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_session_type.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_share_e2e.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_sharing_client.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_source_filter.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_style.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_style_trends.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_telemetry_cli.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_telemetry_collector.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_telemetry_consent.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_telemetry_e2e.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_telemetry_events.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_telemetry_prompt.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_telemetry_queue.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_telemetry_sender.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_template_cli.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_templates.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_timeutil.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_trends.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_trends_cli.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_use_cli.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_wrapped.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_wrapped_cli.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_wrapped_e2e.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_wrapped_html.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_wrapped_output.py +0 -0
- {reprompt_cli-1.6.0 → reprompt_cli-1.8.0}/tests/test_wrapped_share.py +0 -0
|
@@ -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.
|
|
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
|
-
**
|
|
48
|
+
**Analyze what you type into AI tools** -- prompt scoring, agent error loops, leaked credential detection, conversation distillation.
|
|
49
49
|
|
|
50
50
|
[](https://pypi.org/project/reprompt-cli/)
|
|
51
51
|
[](https://pypi.org/project/reprompt-cli/)
|
|
@@ -55,6 +55,8 @@ Description-Content-Type: text/markdown
|
|
|
55
55
|
|
|
56
56
|
---
|
|
57
57
|
|
|
58
|
+

|
|
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:
|
|
71
|
-
Structure:
|
|
72
|
-
Tip:
|
|
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 "
|
|
80
|
-
Before:
|
|
81
|
-
"
|
|
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 (
|
|
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
|
-
**
|
|
3
|
+
**Analyze what you type into AI tools** -- prompt scoring, agent error loops, leaked credential detection, conversation distillation.
|
|
4
4
|
|
|
5
5
|
[](https://pypi.org/project/reprompt-cli/)
|
|
6
6
|
[](https://pypi.org/project/reprompt-cli/)
|
|
@@ -10,6 +10,8 @@
|
|
|
10
10
|
|
|
11
11
|
---
|
|
12
12
|
|
|
13
|
+

|
|
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:
|
|
26
|
-
Structure:
|
|
27
|
-
Tip:
|
|
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 "
|
|
35
|
-
Before:
|
|
36
|
-
"
|
|
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 (
|
|
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)
|
|
Binary file
|
|
@@ -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
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
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>
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|