prompt-database 0.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. prompt_database-0.1.0/.editorconfig +25 -0
  2. prompt_database-0.1.0/.gitattributes +29 -0
  3. prompt_database-0.1.0/.github/ISSUE_TEMPLATE/bug_report.md +29 -0
  4. prompt_database-0.1.0/.github/ISSUE_TEMPLATE/feature_request.md +22 -0
  5. prompt_database-0.1.0/.github/ISSUE_TEMPLATE/prompt_submission.md +49 -0
  6. prompt_database-0.1.0/.github/PULL_REQUEST_TEMPLATE.md +28 -0
  7. prompt_database-0.1.0/.github/workflows/ci.yml +40 -0
  8. prompt_database-0.1.0/.github/workflows/publish.yml +32 -0
  9. prompt_database-0.1.0/.github/workflows/validate-prompts.yml +78 -0
  10. prompt_database-0.1.0/.gitignore +89 -0
  11. prompt_database-0.1.0/CHANGELOG.md +32 -0
  12. prompt_database-0.1.0/CONTRIBUTING.md +68 -0
  13. prompt_database-0.1.0/LICENSE +38 -0
  14. prompt_database-0.1.0/Makefile +36 -0
  15. prompt_database-0.1.0/PKG-INFO +244 -0
  16. prompt_database-0.1.0/README.md +207 -0
  17. prompt_database-0.1.0/SECURITY.md +66 -0
  18. prompt_database-0.1.0/curated_advanced_prompts_v2.json +144562 -0
  19. prompt_database-0.1.0/elite_custom_prompts.json +156 -0
  20. prompt_database-0.1.0/examples/basic_usage.py +115 -0
  21. prompt_database-0.1.0/pyproject.toml +73 -0
  22. prompt_database-0.1.0/src/prompt_database/__init__.py +7 -0
  23. prompt_database-0.1.0/src/prompt_database/cli.py +927 -0
  24. prompt_database-0.1.0/src/prompt_database/db.py +611 -0
  25. prompt_database-0.1.0/src/prompt_database/exporters.py +157 -0
  26. prompt_database-0.1.0/src/prompt_database/ingest.py +325 -0
  27. prompt_database-0.1.0/src/prompt_database/py.typed +0 -0
  28. prompt_database-0.1.0/src/prompt_database/quality.py +238 -0
  29. prompt_database-0.1.0/src/prompt_database/schema.sql +224 -0
  30. prompt_database-0.1.0/src/prompt_database/tester.py +215 -0
  31. prompt_database-0.1.0/src/prompt_database/validate.py +149 -0
  32. prompt_database-0.1.0/submissions/TEMPLATE.jsonl +1 -0
  33. prompt_database-0.1.0/tests/__init__.py +0 -0
  34. prompt_database-0.1.0/tests/test_cli_enhancements.py +113 -0
  35. prompt_database-0.1.0/tests/test_db.py +158 -0
  36. prompt_database-0.1.0/tests/test_exporters.py +101 -0
  37. prompt_database-0.1.0/tests/test_quality.py +68 -0
  38. prompt_database-0.1.0/tests/test_tester.py +53 -0
  39. prompt_database-0.1.0/tests/test_validate.py +97 -0
  40. prompt_database-0.1.0/web/.gitignore +3 -0
  41. prompt_database-0.1.0/web/app/globals.css +22 -0
  42. prompt_database-0.1.0/web/app/layout.tsx +20 -0
  43. prompt_database-0.1.0/web/app/page.tsx +43 -0
  44. prompt_database-0.1.0/web/app/prompt-browser.tsx +228 -0
  45. prompt_database-0.1.0/web/next-env.d.ts +6 -0
  46. prompt_database-0.1.0/web/next.config.ts +7 -0
  47. prompt_database-0.1.0/web/package-lock.json +1661 -0
  48. prompt_database-0.1.0/web/package.json +23 -0
  49. prompt_database-0.1.0/web/postcss.config.mjs +7 -0
  50. prompt_database-0.1.0/web/prompts-data.json +1 -0
  51. prompt_database-0.1.0/web/tsconfig.json +41 -0
@@ -0,0 +1,25 @@
1
+ # EditorConfig helps maintain consistent coding styles
2
+ # https://editorconfig.org
3
+
4
+ root = true
5
+
6
+ [*]
7
+ charset = utf-8
8
+ end_of_line = lf
9
+ insert_final_newline = true
10
+ trim_trailing_whitespace = true
11
+
12
+ [*.{py,sh}]
13
+ indent_style = space
14
+ indent_size = 4
15
+
16
+ [*.{json,yml,yaml}]
17
+ indent_style = space
18
+ indent_size = 2
19
+
20
+ [*.md]
21
+ trim_trailing_whitespace = false
22
+ max_line_length = off
23
+
24
+ [Makefile]
25
+ indent_style = tab
@@ -0,0 +1,29 @@
1
+ # Auto detect text files and perform LF normalization
2
+ * text=auto
3
+
4
+ # Source code
5
+ *.py text eol=lf
6
+ *.sh text eol=lf
7
+ *.md text eol=lf
8
+ *.txt text eol=lf
9
+ *.json text eol=lf
10
+ *.yml text eol=lf
11
+ *.yaml text eol=lf
12
+
13
+ # Git LFS - Track large files
14
+ *.db filter=lfs diff=lfs merge=lfs -text
15
+ *.sqlite filter=lfs diff=lfs merge=lfs -text
16
+ *.sqlite3 filter=lfs diff=lfs merge=lfs -text
17
+
18
+ # Large JSON files (if you decide to commit them)
19
+ curated_advanced_prompts*.json filter=lfs diff=lfs merge=lfs -text
20
+
21
+ # Binary files
22
+ *.pkl binary
23
+ *.pickle binary
24
+ *.npy binary
25
+ *.npz binary
26
+ *.pt binary
27
+ *.pth binary
28
+ *.h5 binary
29
+ *.hdf5 binary
@@ -0,0 +1,29 @@
1
+ ---
2
+ name: Bug Report
3
+ about: Report a bug or issue
4
+ title: '[BUG] '
5
+ labels: bug
6
+ assignees: ''
7
+ ---
8
+
9
+ ## Bug Description
10
+ <!-- A clear description of the bug -->
11
+
12
+ ## Steps to Reproduce
13
+ 1.
14
+ 2.
15
+ 3.
16
+
17
+ ## Expected Behavior
18
+ <!-- What you expected to happen -->
19
+
20
+ ## Actual Behavior
21
+ <!-- What actually happened -->
22
+
23
+ ## Environment
24
+ - OS:
25
+ - Python version:
26
+ - Database version:
27
+
28
+ ## Additional Context
29
+ <!-- Screenshots, logs, or other relevant information -->
@@ -0,0 +1,22 @@
1
+ ---
2
+ name: Feature Request
3
+ about: Suggest a new feature or improvement
4
+ title: '[FEATURE] '
5
+ labels: enhancement
6
+ assignees: ''
7
+ ---
8
+
9
+ ## Feature Description
10
+ <!-- Clear description of the proposed feature -->
11
+
12
+ ## Use Case
13
+ <!-- Why is this feature needed? What problem does it solve? -->
14
+
15
+ ## Proposed Solution
16
+ <!-- How should this feature work? -->
17
+
18
+ ## Alternatives Considered
19
+ <!-- Other approaches you've thought about -->
20
+
21
+ ## Additional Context
22
+ <!-- Any other relevant information -->
@@ -0,0 +1,49 @@
1
+ ---
2
+ name: Prompt Submission
3
+ about: Submit new attack prompts for the database
4
+ title: '[PROMPT] '
5
+ labels: prompt-addition
6
+ assignees: ''
7
+ ---
8
+
9
+ ## Prompt Information
10
+
11
+ **Attack Technique:**
12
+ <!-- e.g., Prompt Extraction, Jailbreak, etc. -->
13
+
14
+ **Complexity Level:**
15
+ <!-- basic | intermediate | advanced -->
16
+
17
+ **Attack Vector:**
18
+ <!-- Direct | Indirect | Hybrid -->
19
+
20
+ ## Prompt Content
21
+ ```
22
+ [Paste the attack prompt here]
23
+ ```
24
+
25
+ ## Description
26
+ <!-- How this attack works, what it attempts to do -->
27
+
28
+ ## Test Results
29
+ <!-- Which models did you test this against? What were the results? -->
30
+
31
+ **Tested Models:**
32
+ - [ ] Claude Sonnet 4.5
33
+ - [ ] GPT-4
34
+ - [ ] Other (specify):
35
+
36
+ **Success Rate:**
37
+
38
+ **Sample Response:**
39
+ ```
40
+ [If applicable, paste a redacted example of the model's response]
41
+ ```
42
+
43
+ ## Attribution
44
+ <!-- If this is based on published research, provide citation/link -->
45
+
46
+ ## Responsible Use Declaration
47
+ - [ ] I confirm this submission is for defensive security research only
48
+ - [ ] I have not tested this against production systems without authorization
49
+ - [ ] This prompt does not contain sensitive/proprietary information
@@ -0,0 +1,28 @@
1
+ ## Description
2
+ <!-- Briefly describe what this PR does -->
3
+
4
+ ## Type of Change
5
+ - [ ] Bug fix
6
+ - [ ] New prompt additions
7
+ - [ ] Database improvements
8
+ - [ ] Documentation update
9
+ - [ ] Other (please describe):
10
+
11
+ ## Testing
12
+ <!-- Describe how you tested your changes -->
13
+
14
+ - [ ] Tested prompts against multiple models
15
+ - [ ] Verified database integrity
16
+ - [ ] Checked for duplicates
17
+ - [ ] Validated categorization
18
+
19
+ ## Checklist
20
+ - [ ] Code follows project style guidelines
21
+ - [ ] Comments added for complex logic
22
+ - [ ] Documentation updated (if needed)
23
+ - [ ] No sensitive data included
24
+ - [ ] Commits follow conventional format
25
+ - [ ] Changes are for defensive research purposes only
26
+
27
+ ## Additional Context
28
+ <!-- Any other relevant information -->
@@ -0,0 +1,40 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ branches: [main]
8
+
9
+ jobs:
10
+ test:
11
+ runs-on: ubuntu-latest
12
+ strategy:
13
+ matrix:
14
+ python-version: ["3.11", "3.12", "3.13"]
15
+
16
+ steps:
17
+ - uses: actions/checkout@v4
18
+ with:
19
+ lfs: true
20
+
21
+ - name: Set up Python ${{ matrix.python-version }}
22
+ uses: actions/setup-python@v5
23
+ with:
24
+ python-version: ${{ matrix.python-version }}
25
+
26
+ - name: Install dependencies
27
+ run: pip install -e ".[dev]"
28
+
29
+ - name: Lint with ruff
30
+ run: |
31
+ ruff check src/ tests/
32
+ ruff format --check src/ tests/
33
+
34
+ - name: Run tests
35
+ run: pytest tests/ -v --tb=short
36
+
37
+ - name: Verify build command
38
+ run: |
39
+ prompt-db build --data-dir . --output /tmp/ci_test.db --force
40
+ prompt-db --db /tmp/ci_test.db stats
@@ -0,0 +1,32 @@
1
+ name: Publish to PyPI
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - "v*"
7
+
8
+ jobs:
9
+ publish:
10
+ runs-on: ubuntu-latest
11
+ permissions:
12
+ contents: read
13
+ id-token: write # trusted publishing
14
+
15
+ steps:
16
+ - uses: actions/checkout@v4
17
+ with:
18
+ lfs: true
19
+
20
+ - name: Set up Python
21
+ uses: actions/setup-python@v5
22
+ with:
23
+ python-version: "3.12"
24
+
25
+ - name: Install build tools
26
+ run: pip install hatchling build
27
+
28
+ - name: Build package
29
+ run: python -m build
30
+
31
+ - name: Publish to PyPI
32
+ uses: pypa/gh-action-pypi-publish@release/v1
@@ -0,0 +1,78 @@
1
+ name: Validate Prompt Submissions
2
+
3
+ on:
4
+ pull_request:
5
+ paths:
6
+ - "submissions/**"
7
+ - "*.jsonl"
8
+
9
+ jobs:
10
+ validate:
11
+ runs-on: ubuntu-latest
12
+ permissions:
13
+ contents: read
14
+ pull-requests: write
15
+
16
+ steps:
17
+ - uses: actions/checkout@v4
18
+ with:
19
+ lfs: true
20
+
21
+ - name: Set up Python
22
+ uses: actions/setup-python@v5
23
+ with:
24
+ python-version: "3.12"
25
+
26
+ - name: Install prompt-database
27
+ run: pip install -e .
28
+
29
+ - name: Build reference database
30
+ run: prompt-db build --data-dir . --output /tmp/reference.db --force
31
+
32
+ - name: Find submission files
33
+ id: find-files
34
+ run: |
35
+ # Find new/changed JSONL or text files in submissions/ or root
36
+ FILES=$(git diff --name-only --diff-filter=ACM origin/main... -- 'submissions/*.jsonl' 'submissions/*.txt' '*.jsonl' | head -20)
37
+ echo "files=$FILES" >> "$GITHUB_OUTPUT"
38
+ if [ -z "$FILES" ]; then
39
+ echo "No submission files found"
40
+ echo "found=false" >> "$GITHUB_OUTPUT"
41
+ else
42
+ echo "found=true" >> "$GITHUB_OUTPUT"
43
+ echo "Found files: $FILES"
44
+ fi
45
+
46
+ - name: Validate submissions
47
+ if: steps.find-files.outputs.found == 'true'
48
+ run: |
49
+ EXIT=0
50
+ for file in ${{ steps.find-files.outputs.files }}; do
51
+ echo "=== Validating: $file ==="
52
+ prompt-db --db /tmp/reference.db validate "$file" --check-dupes || EXIT=1
53
+ done
54
+ exit $EXIT
55
+
56
+ - name: Post validation summary
57
+ if: always() && steps.find-files.outputs.found == 'true'
58
+ uses: actions/github-script@v7
59
+ with:
60
+ script: |
61
+ const body = `### Prompt Submission Validation
62
+
63
+ The submission validation workflow ran on this PR.
64
+ Check the [Actions log](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}) for details.
65
+
66
+ **What's checked:**
67
+ - Minimum content length (10+ chars)
68
+ - Attack pattern detection (60+ regex patterns)
69
+ - Quality scoring (must score 15+/100)
70
+ - Duplicate detection against existing database
71
+ `;
72
+
73
+ github.rest.issues.createComment({
74
+ issue_number: context.issue.number,
75
+ owner: context.repo.owner,
76
+ repo: context.repo.repo,
77
+ body: body
78
+ });
@@ -0,0 +1,89 @@
1
+ # Database files (built from JSON sources via `prompt-db build`)
2
+ *.db
3
+ *.db-journal
4
+ *.db-wal
5
+ *.db-shm
6
+ *.sqlite
7
+ *.sqlite3
8
+
9
+ # Python
10
+ __pycache__/
11
+ *.py[cod]
12
+ *$py.class
13
+ *.so
14
+ .Python
15
+ build/
16
+ develop-eggs/
17
+ dist/
18
+ downloads/
19
+ eggs/
20
+ .eggs/
21
+ lib/
22
+ lib64/
23
+ parts/
24
+ sdist/
25
+ var/
26
+ wheels/
27
+ *.egg-info/
28
+ .installed.cfg
29
+ *.egg
30
+
31
+ # Virtual environments
32
+ venv/
33
+ env/
34
+ ENV/
35
+ .venv
36
+
37
+ # IDEs
38
+ .vscode/
39
+ .idea/
40
+ *.swp
41
+ *.swo
42
+ *~
43
+ .DS_Store
44
+
45
+ # Logs
46
+ *.log
47
+ logs/
48
+ *.log.*
49
+
50
+ # Temporary files
51
+ tmp/
52
+ temp/
53
+ *.tmp
54
+ *.bak
55
+ *.backup
56
+
57
+ # Research data (comment out if you want to commit datasets)
58
+ prompt_injection_datasets/
59
+ extracted_prompts/
60
+ raw_data/
61
+ datasets/
62
+
63
+ # API keys and secrets
64
+ .env
65
+ .env.local
66
+ *.key
67
+ *.pem
68
+ credentials.json
69
+ config.local.*
70
+
71
+ # OS files
72
+ Thumbs.db
73
+ .DS_Store
74
+ desktop.ini
75
+
76
+ # Jupyter
77
+ .ipynb_checkpoints/
78
+ *.ipynb_checkpoints
79
+
80
+ # Model files (often too large for git)
81
+ *.pt
82
+ *.pth
83
+ *.ckpt
84
+ *.safetensors
85
+ *.bin
86
+ models/
87
+
88
+ # Large JSON files (optional - uncomment if too large)
89
+ # extracted_prompts.json
@@ -0,0 +1,32 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [0.1.0] - 2026-03-30
9
+
10
+ ### Added
11
+ - **Python package** (`prompt-database`) installable via `pip install -e .`
12
+ - **`prompt-db` CLI** with commands: `build`, `stats`, `search`, `export`, `info`, `audit`, `curate`
13
+ - **SQLite schema** with FTS5 full-text search, SHA256 content-hash deduplication, and schema versioning
14
+ - **OWASP LLM Top 10 (2025)** category mapping with correct descriptions
15
+ - **MITRE ATLAS** technique IDs on categories for threat model interoperability
16
+ - **Quality scoring engine** with 60+ regex patterns for identifying real attacks vs. noise
17
+ - **Data curation pipeline** — audit and remove non-attack content (removes ~67% noise)
18
+ - **Ingestion pipeline** for `curated_advanced_prompts_v2.json` and `elite_custom_prompts.json`
19
+ - **Test result tracking** with automatic success_rate aggregation
20
+ - **19 passing tests** covering schema, CRUD, search, dedup, quality, and build
21
+ - **Export** to JSON, JSONL, and CSV formats
22
+
23
+ ### Changed
24
+ - Database is now built from JSON sources via `prompt-db build` (no longer committed as binary)
25
+ - Deduplication reduced 8,568 records to 3,983 unique prompts
26
+ - Quality curation further reduces to ~1,300 high-signal attack prompts
27
+
28
+ ### Removed
29
+ - Binary `prompts.db` from git tracking (build it yourself from JSON sources)
30
+ - Phantom file references in README (db_manager.py, schema.sql, etc. that never existed)
31
+
32
+ [0.1.0]: https://github.com/scthornton/prompt-database/releases/tag/v0.1.0
@@ -0,0 +1,68 @@
1
+ # Contributing to Prompt Database
2
+
3
+ Thank you for your interest in contributing to this defensive security research project!
4
+
5
+ ## Code of Conduct
6
+
7
+ This project is for **defensive security research only**. All contributions must:
8
+ - Focus on improving security defenses
9
+ - Not enable or encourage malicious use
10
+ - Comply with responsible disclosure practices
11
+
12
+ ## How to Contribute
13
+
14
+ ### Reporting Issues
15
+ - Use GitHub Issues for bug reports and feature requests
16
+ - Provide clear reproduction steps
17
+ - Include relevant context and examples
18
+
19
+ ### Contributing Prompts
20
+ When adding new attack prompts to the database:
21
+
22
+ 1. **Quality over quantity** - Focus on sophisticated, novel attacks
23
+ 2. **Categorization** - Properly tag with attack technique and complexity
24
+ 3. **Documentation** - Explain the attack mechanism and expected behavior
25
+ 4. **Testing** - Verify the prompt works as described
26
+ 5. **Attribution** - Credit original sources when applicable
27
+
28
+ ### Contribution Process
29
+
30
+ 1. Fork the repository
31
+ 2. Create a feature branch (`git checkout -b feature/your-feature`)
32
+ 3. Make your changes
33
+ 4. Test thoroughly
34
+ 5. Commit with clear messages (`git commit -m 'Add: sophisticated context manipulation technique'`)
35
+ 6. Push to your fork (`git push origin feature/your-feature`)
36
+ 7. Open a Pull Request
37
+
38
+ ### Commit Message Format
39
+
40
+ ```
41
+ Type: Brief description
42
+
43
+ Longer explanation if needed.
44
+
45
+ - Bullet points for details
46
+ - Reference issues: #123
47
+ ```
48
+
49
+ Types: `Add`, `Fix`, `Update`, `Refactor`, `Docs`, `Test`
50
+
51
+ ### Code Style
52
+ - Follow PEP 8 for Python code
53
+ - Use meaningful variable names
54
+ - Add comments for complex logic
55
+ - Keep functions focused and testable
56
+
57
+ ### Testing
58
+ - Test prompts against multiple models when possible
59
+ - Document success rates and model responses
60
+ - Report findings responsibly
61
+
62
+ ## Questions?
63
+
64
+ Open an issue or reach out to the maintainers.
65
+
66
+ ## License
67
+
68
+ By contributing, you agree that your contributions will be licensed under the MIT License.
@@ -0,0 +1,38 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Scott Thornton
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
22
+
23
+ ---
24
+
25
+ RESPONSIBLE USE NOTICE
26
+
27
+ This database contains prompt injection and adversarial attack examples for
28
+ DEFENSIVE SECURITY RESEARCH ONLY. By using this software, you agree to:
29
+
30
+ 1. Use these materials only for legitimate security research, testing, and
31
+ defense development purposes
32
+ 2. Not use these materials to attack, compromise, or harm any systems without
33
+ explicit authorization
34
+ 3. Comply with all applicable laws and regulations
35
+ 4. Not weaponize or distribute these materials for malicious purposes
36
+
37
+ The authors and contributors are not responsible for any misuse of this
38
+ database or the materials contained within it.
@@ -0,0 +1,36 @@
1
+ .PHONY: install dev test lint format build curate stats clean help
2
+
3
+ help: ## Show this help
4
+ @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-15s\033[0m %s\n", $$1, $$2}'
5
+
6
+ install: ## Install the package
7
+ pip install -e .
8
+
9
+ dev: ## Install with dev dependencies
10
+ pip install -e ".[dev]"
11
+
12
+ test: ## Run tests
13
+ pytest tests/ -v
14
+
15
+ lint: ## Run linter
16
+ ruff check src/ tests/
17
+ ruff format --check src/ tests/
18
+
19
+ format: ## Auto-format code
20
+ ruff format src/ tests/
21
+ ruff check --fix src/ tests/
22
+
23
+ build: ## Build the database from JSON sources
24
+ prompt-db build --data-dir . --output prompts.db --force
25
+
26
+ curate: build ## Build and curate (remove noise)
27
+ prompt-db --db prompts.db curate
28
+
29
+ stats: ## Show database statistics (build first if needed)
30
+ @test -f prompts.db || $(MAKE) build
31
+ prompt-db --db prompts.db stats
32
+
33
+ clean: ## Remove generated files
34
+ rm -f prompts.db prompts.db-wal prompts.db-shm
35
+ rm -rf __pycache__ .pytest_cache .ruff_cache
36
+ find . -type d -name __pycache__ -exec rm -rf {} + 2>/dev/null || true