mcp-feed-reader-crunchtools 0.1.1__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.
- mcp_feed_reader_crunchtools-0.1.1/.github/ISSUE_TEMPLATE/bug_report.yml +67 -0
- mcp_feed_reader_crunchtools-0.1.1/.github/ISSUE_TEMPLATE/config.yml +5 -0
- mcp_feed_reader_crunchtools-0.1.1/.github/ISSUE_TEMPLATE/feature_request.yml +51 -0
- mcp_feed_reader_crunchtools-0.1.1/.github/workflows/ci.yml +77 -0
- mcp_feed_reader_crunchtools-0.1.1/.github/workflows/container.yml +101 -0
- mcp_feed_reader_crunchtools-0.1.1/.github/workflows/publish.yml +24 -0
- mcp_feed_reader_crunchtools-0.1.1/.github/workflows/security.yml +94 -0
- mcp_feed_reader_crunchtools-0.1.1/.gitignore +99 -0
- mcp_feed_reader_crunchtools-0.1.1/.pre-commit-config.yaml +19 -0
- mcp_feed_reader_crunchtools-0.1.1/.specify/memory/constitution.md +290 -0
- mcp_feed_reader_crunchtools-0.1.1/CLAUDE.md +45 -0
- mcp_feed_reader_crunchtools-0.1.1/Containerfile +40 -0
- mcp_feed_reader_crunchtools-0.1.1/LICENSE +661 -0
- mcp_feed_reader_crunchtools-0.1.1/PKG-INFO +93 -0
- mcp_feed_reader_crunchtools-0.1.1/README.md +66 -0
- mcp_feed_reader_crunchtools-0.1.1/SECURITY.md +123 -0
- mcp_feed_reader_crunchtools-0.1.1/gourmand-exceptions.toml +29 -0
- mcp_feed_reader_crunchtools-0.1.1/gourmand.toml +22 -0
- mcp_feed_reader_crunchtools-0.1.1/pyproject.toml +84 -0
- mcp_feed_reader_crunchtools-0.1.1/server.json +21 -0
- mcp_feed_reader_crunchtools-0.1.1/src/mcp_feed_reader_crunchtools/__init__.py +69 -0
- mcp_feed_reader_crunchtools-0.1.1/src/mcp_feed_reader_crunchtools/__main__.py +5 -0
- mcp_feed_reader_crunchtools-0.1.1/src/mcp_feed_reader_crunchtools/config.py +40 -0
- mcp_feed_reader_crunchtools-0.1.1/src/mcp_feed_reader_crunchtools/database.py +108 -0
- mcp_feed_reader_crunchtools-0.1.1/src/mcp_feed_reader_crunchtools/errors.py +49 -0
- mcp_feed_reader_crunchtools-0.1.1/src/mcp_feed_reader_crunchtools/fetcher.py +130 -0
- mcp_feed_reader_crunchtools-0.1.1/src/mcp_feed_reader_crunchtools/models.py +49 -0
- mcp_feed_reader_crunchtools-0.1.1/src/mcp_feed_reader_crunchtools/server.py +223 -0
- mcp_feed_reader_crunchtools-0.1.1/src/mcp_feed_reader_crunchtools/tools/__init__.py +47 -0
- mcp_feed_reader_crunchtools-0.1.1/src/mcp_feed_reader_crunchtools/tools/categories.py +56 -0
- mcp_feed_reader_crunchtools-0.1.1/src/mcp_feed_reader_crunchtools/tools/entries.py +121 -0
- mcp_feed_reader_crunchtools-0.1.1/src/mcp_feed_reader_crunchtools/tools/feeds.py +166 -0
- mcp_feed_reader_crunchtools-0.1.1/src/mcp_feed_reader_crunchtools/tools/opml.py +142 -0
- mcp_feed_reader_crunchtools-0.1.1/tests/__init__.py +0 -0
- mcp_feed_reader_crunchtools-0.1.1/tests/conftest.py +32 -0
- mcp_feed_reader_crunchtools-0.1.1/tests/test_tools.py +325 -0
- mcp_feed_reader_crunchtools-0.1.1/tests/test_validation.py +75 -0
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
name: Bug Report
|
|
2
|
+
description: Report a bug or unexpected behavior
|
|
3
|
+
title: "[Bug]: "
|
|
4
|
+
labels: ["bug", "triage"]
|
|
5
|
+
body:
|
|
6
|
+
- type: textarea
|
|
7
|
+
id: description
|
|
8
|
+
attributes:
|
|
9
|
+
label: Bug Description
|
|
10
|
+
description: A clear description of the bug
|
|
11
|
+
placeholder: What happened?
|
|
12
|
+
validations:
|
|
13
|
+
required: true
|
|
14
|
+
|
|
15
|
+
- type: textarea
|
|
16
|
+
id: steps
|
|
17
|
+
attributes:
|
|
18
|
+
label: Steps to Reproduce
|
|
19
|
+
description: How can we reproduce this bug?
|
|
20
|
+
placeholder: |
|
|
21
|
+
1. Call tool '...' with args '...'
|
|
22
|
+
2. Observe error '...'
|
|
23
|
+
validations:
|
|
24
|
+
required: true
|
|
25
|
+
|
|
26
|
+
- type: textarea
|
|
27
|
+
id: expected
|
|
28
|
+
attributes:
|
|
29
|
+
label: Expected Behavior
|
|
30
|
+
description: What did you expect to happen?
|
|
31
|
+
validations:
|
|
32
|
+
required: true
|
|
33
|
+
|
|
34
|
+
- type: textarea
|
|
35
|
+
id: actual
|
|
36
|
+
attributes:
|
|
37
|
+
label: Actual Behavior
|
|
38
|
+
description: What actually happened? Include error messages if available.
|
|
39
|
+
validations:
|
|
40
|
+
required: true
|
|
41
|
+
|
|
42
|
+
- type: dropdown
|
|
43
|
+
id: transport
|
|
44
|
+
attributes:
|
|
45
|
+
label: Transport
|
|
46
|
+
description: How are you running the MCP server?
|
|
47
|
+
options:
|
|
48
|
+
- stdio (uvx / pip)
|
|
49
|
+
- streamable-http (container / systemd)
|
|
50
|
+
- SSE
|
|
51
|
+
validations:
|
|
52
|
+
required: true
|
|
53
|
+
|
|
54
|
+
- type: input
|
|
55
|
+
id: version
|
|
56
|
+
attributes:
|
|
57
|
+
label: Server Version
|
|
58
|
+
description: Output of `mcp-feed-reader-crunchtools --version` or pip show
|
|
59
|
+
placeholder: "0.1.0"
|
|
60
|
+
validations:
|
|
61
|
+
required: true
|
|
62
|
+
|
|
63
|
+
- type: textarea
|
|
64
|
+
id: additional
|
|
65
|
+
attributes:
|
|
66
|
+
label: Additional Context
|
|
67
|
+
description: Any other relevant information (logs, config, environment)
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
name: Feature Request
|
|
2
|
+
description: Suggest a new tool or enhancement
|
|
3
|
+
title: "[Feature]: "
|
|
4
|
+
labels: ["enhancement", "triage"]
|
|
5
|
+
body:
|
|
6
|
+
- type: textarea
|
|
7
|
+
id: problem
|
|
8
|
+
attributes:
|
|
9
|
+
label: Problem Statement
|
|
10
|
+
description: What problem does this feature solve?
|
|
11
|
+
placeholder: I need to...
|
|
12
|
+
validations:
|
|
13
|
+
required: true
|
|
14
|
+
|
|
15
|
+
- type: textarea
|
|
16
|
+
id: solution
|
|
17
|
+
attributes:
|
|
18
|
+
label: Proposed Solution
|
|
19
|
+
description: Describe the tool or change you'd like
|
|
20
|
+
placeholder: |
|
|
21
|
+
Tool name: `do_something`
|
|
22
|
+
Parameters: ...
|
|
23
|
+
validations:
|
|
24
|
+
required: true
|
|
25
|
+
|
|
26
|
+
- type: textarea
|
|
27
|
+
id: alternatives
|
|
28
|
+
attributes:
|
|
29
|
+
label: Alternatives Considered
|
|
30
|
+
description: What alternatives have you considered?
|
|
31
|
+
|
|
32
|
+
- type: dropdown
|
|
33
|
+
id: scope
|
|
34
|
+
attributes:
|
|
35
|
+
label: Tool Category
|
|
36
|
+
description: Which area does this feature belong to?
|
|
37
|
+
options:
|
|
38
|
+
- Feed Management
|
|
39
|
+
- Entry Management
|
|
40
|
+
- Category Management
|
|
41
|
+
- Import/Export (OPML)
|
|
42
|
+
- Search
|
|
43
|
+
- New Category
|
|
44
|
+
validations:
|
|
45
|
+
required: true
|
|
46
|
+
|
|
47
|
+
- type: textarea
|
|
48
|
+
id: additional
|
|
49
|
+
attributes:
|
|
50
|
+
label: Additional Context
|
|
51
|
+
description: Any other relevant information or examples
|
|
@@ -0,0 +1,77 @@
|
|
|
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.10", "3.11", "3.12"]
|
|
15
|
+
|
|
16
|
+
steps:
|
|
17
|
+
- uses: actions/checkout@v4
|
|
18
|
+
- name: Install uv
|
|
19
|
+
uses: astral-sh/setup-uv@v4
|
|
20
|
+
with:
|
|
21
|
+
version: "latest"
|
|
22
|
+
- name: Set up Python ${{ matrix.python-version }}
|
|
23
|
+
run: uv python install ${{ matrix.python-version }}
|
|
24
|
+
- name: Install dependencies
|
|
25
|
+
run: uv sync --all-extras
|
|
26
|
+
- name: Run linter
|
|
27
|
+
run: uv run ruff check src tests
|
|
28
|
+
- name: Run type checker
|
|
29
|
+
run: uv run mypy src
|
|
30
|
+
- name: Run tests
|
|
31
|
+
run: uv run pytest -v
|
|
32
|
+
|
|
33
|
+
gourmand:
|
|
34
|
+
name: Code Quality (Gourmand)
|
|
35
|
+
runs-on: ubuntu-latest
|
|
36
|
+
steps:
|
|
37
|
+
- uses: actions/checkout@v4
|
|
38
|
+
- name: Install Rust toolchain
|
|
39
|
+
uses: dtolnay/rust-toolchain@stable
|
|
40
|
+
- name: Cache Gourmand binary
|
|
41
|
+
uses: actions/cache@v4
|
|
42
|
+
with:
|
|
43
|
+
path: |
|
|
44
|
+
~/.cargo/bin/
|
|
45
|
+
~/.cargo/registry/
|
|
46
|
+
~/.cargo/git/
|
|
47
|
+
key: ${{ runner.os }}-cargo-gourmand-${{ hashFiles('gourmand.toml') }}
|
|
48
|
+
restore-keys: |
|
|
49
|
+
${{ runner.os }}-cargo-gourmand-
|
|
50
|
+
- name: Install Gourmand
|
|
51
|
+
run: |
|
|
52
|
+
if ! command -v gourmand &> /dev/null; then
|
|
53
|
+
cargo install --git https://codeberg.org/mattdm/gourmand.git
|
|
54
|
+
fi
|
|
55
|
+
- name: Run Gourmand
|
|
56
|
+
run: gourmand --full .
|
|
57
|
+
|
|
58
|
+
build-container:
|
|
59
|
+
runs-on: ubuntu-latest
|
|
60
|
+
steps:
|
|
61
|
+
- uses: actions/checkout@v4
|
|
62
|
+
- name: Build container image
|
|
63
|
+
run: docker build -f Containerfile -t mcp-feed-reader:test .
|
|
64
|
+
- name: Verify container
|
|
65
|
+
run: timeout 5 docker run --rm mcp-feed-reader:test || true
|
|
66
|
+
|
|
67
|
+
validate-constitution:
|
|
68
|
+
name: Constitution Validation
|
|
69
|
+
runs-on: ubuntu-latest
|
|
70
|
+
steps:
|
|
71
|
+
- uses: actions/checkout@v4
|
|
72
|
+
- uses: actions/checkout@v4
|
|
73
|
+
with:
|
|
74
|
+
repository: crunchtools/constitution
|
|
75
|
+
path: .constitution
|
|
76
|
+
- name: Validate constitution
|
|
77
|
+
run: python3 .constitution/validate-constitution.py .specify/memory/constitution.md --verbose
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
name: Container Build & Push
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
tags: ["v*"]
|
|
7
|
+
pull_request:
|
|
8
|
+
branches: [main]
|
|
9
|
+
workflow_dispatch:
|
|
10
|
+
|
|
11
|
+
env:
|
|
12
|
+
QUAY_IMAGE: quay.io/crunchtools/mcp-feed-reader
|
|
13
|
+
GHCR_IMAGE: ghcr.io/crunchtools/mcp-feed-reader
|
|
14
|
+
|
|
15
|
+
jobs:
|
|
16
|
+
build-and-push-quay:
|
|
17
|
+
runs-on: ubuntu-latest
|
|
18
|
+
permissions:
|
|
19
|
+
contents: read
|
|
20
|
+
steps:
|
|
21
|
+
- name: Checkout repository
|
|
22
|
+
uses: actions/checkout@v4
|
|
23
|
+
- name: Set up Docker Buildx
|
|
24
|
+
uses: docker/setup-buildx-action@v3
|
|
25
|
+
- name: Log in to Quay.io
|
|
26
|
+
if: github.event_name != 'pull_request'
|
|
27
|
+
uses: docker/login-action@v3
|
|
28
|
+
with:
|
|
29
|
+
registry: quay.io
|
|
30
|
+
username: ${{ secrets.QUAY_USERNAME }}
|
|
31
|
+
password: ${{ secrets.QUAY_PASSWORD }}
|
|
32
|
+
- name: Extract metadata
|
|
33
|
+
id: meta
|
|
34
|
+
uses: docker/metadata-action@v5
|
|
35
|
+
with:
|
|
36
|
+
images: ${{ env.QUAY_IMAGE }}
|
|
37
|
+
tags: |
|
|
38
|
+
type=ref,event=branch
|
|
39
|
+
type=ref,event=pr
|
|
40
|
+
type=semver,pattern={{version}}
|
|
41
|
+
type=semver,pattern={{major}}.{{minor}}
|
|
42
|
+
type=raw,value=latest,enable={{is_default_branch}}
|
|
43
|
+
- name: Build and push
|
|
44
|
+
uses: docker/build-push-action@v6
|
|
45
|
+
with:
|
|
46
|
+
context: .
|
|
47
|
+
file: ./Containerfile
|
|
48
|
+
push: ${{ github.event_name != 'pull_request' }}
|
|
49
|
+
tags: ${{ steps.meta.outputs.tags }}
|
|
50
|
+
labels: ${{ steps.meta.outputs.labels }}
|
|
51
|
+
cache-from: type=gha
|
|
52
|
+
cache-to: type=gha,mode=max
|
|
53
|
+
- name: Run Trivy vulnerability scanner
|
|
54
|
+
continue-on-error: true
|
|
55
|
+
if: github.event_name != 'pull_request'
|
|
56
|
+
uses: aquasecurity/trivy-action@0.34.1
|
|
57
|
+
with:
|
|
58
|
+
image-ref: ${{ env.QUAY_IMAGE }}:latest
|
|
59
|
+
format: "table"
|
|
60
|
+
exit-code: "0"
|
|
61
|
+
severity: "CRITICAL,HIGH"
|
|
62
|
+
version: "v0.68.2"
|
|
63
|
+
|
|
64
|
+
build-and-push-ghcr:
|
|
65
|
+
runs-on: ubuntu-latest
|
|
66
|
+
needs: build-and-push-quay
|
|
67
|
+
if: github.event_name != 'pull_request'
|
|
68
|
+
permissions:
|
|
69
|
+
contents: read
|
|
70
|
+
packages: write
|
|
71
|
+
steps:
|
|
72
|
+
- name: Checkout repository
|
|
73
|
+
uses: actions/checkout@v4
|
|
74
|
+
- name: Set up Docker Buildx
|
|
75
|
+
uses: docker/setup-buildx-action@v3
|
|
76
|
+
- name: Log in to GitHub Container Registry
|
|
77
|
+
uses: docker/login-action@v3
|
|
78
|
+
with:
|
|
79
|
+
registry: ghcr.io
|
|
80
|
+
username: ${{ github.repository_owner }}
|
|
81
|
+
password: ${{ github.token }}
|
|
82
|
+
- name: Extract metadata
|
|
83
|
+
id: meta
|
|
84
|
+
uses: docker/metadata-action@v5
|
|
85
|
+
with:
|
|
86
|
+
images: ${{ env.GHCR_IMAGE }}
|
|
87
|
+
tags: |
|
|
88
|
+
type=ref,event=branch
|
|
89
|
+
type=ref,event=pr
|
|
90
|
+
type=semver,pattern={{version}}
|
|
91
|
+
type=semver,pattern={{major}}.{{minor}}
|
|
92
|
+
type=raw,value=latest,enable={{is_default_branch}}
|
|
93
|
+
- name: Build and push
|
|
94
|
+
uses: docker/build-push-action@v6
|
|
95
|
+
with:
|
|
96
|
+
context: .
|
|
97
|
+
file: ./Containerfile
|
|
98
|
+
push: true
|
|
99
|
+
tags: ${{ steps.meta.outputs.tags }}
|
|
100
|
+
labels: ${{ steps.meta.outputs.labels }}
|
|
101
|
+
cache-from: type=gha
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
name: Publish to PyPI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
release:
|
|
5
|
+
types: [published]
|
|
6
|
+
workflow_dispatch:
|
|
7
|
+
|
|
8
|
+
jobs:
|
|
9
|
+
publish:
|
|
10
|
+
runs-on: ubuntu-latest
|
|
11
|
+
permissions:
|
|
12
|
+
id-token: write
|
|
13
|
+
steps:
|
|
14
|
+
- uses: actions/checkout@v4
|
|
15
|
+
- name: Install uv
|
|
16
|
+
uses: astral-sh/setup-uv@v4
|
|
17
|
+
with:
|
|
18
|
+
version: "latest"
|
|
19
|
+
- name: Set up Python
|
|
20
|
+
run: uv python install 3.12
|
|
21
|
+
- name: Build package
|
|
22
|
+
run: uv build
|
|
23
|
+
- name: Publish to PyPI
|
|
24
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
name: Security Scan
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [main]
|
|
8
|
+
schedule:
|
|
9
|
+
- cron: "0 9 * * 1"
|
|
10
|
+
workflow_dispatch:
|
|
11
|
+
|
|
12
|
+
permissions:
|
|
13
|
+
contents: read
|
|
14
|
+
issues: write
|
|
15
|
+
pull-requests: write
|
|
16
|
+
security-events: write
|
|
17
|
+
|
|
18
|
+
jobs:
|
|
19
|
+
dependency-audit:
|
|
20
|
+
name: Dependency CVE Scan
|
|
21
|
+
runs-on: ubuntu-latest
|
|
22
|
+
steps:
|
|
23
|
+
- uses: actions/checkout@v4
|
|
24
|
+
- name: Install uv
|
|
25
|
+
uses: astral-sh/setup-uv@v4
|
|
26
|
+
with:
|
|
27
|
+
version: "latest"
|
|
28
|
+
- name: Set up Python
|
|
29
|
+
run: uv python install 3.12
|
|
30
|
+
- name: Install dependencies
|
|
31
|
+
run: uv sync
|
|
32
|
+
- name: Install pip-audit
|
|
33
|
+
run: uv pip install pip-audit
|
|
34
|
+
- name: Run pip-audit
|
|
35
|
+
id: audit
|
|
36
|
+
continue-on-error: true
|
|
37
|
+
run: |
|
|
38
|
+
uv run pip-audit --format=json --output=audit-results.json || true
|
|
39
|
+
uv run pip-audit --format=markdown --output=audit-results.md || true
|
|
40
|
+
if [ -f audit-results.json ]; then
|
|
41
|
+
VULN_COUNT=$(cat audit-results.json | python -c "import sys,json; data=json.load(sys.stdin); print(len([d for d in data if d.get('vulns', [])]))" 2>/dev/null || echo "0")
|
|
42
|
+
echo "vuln_count=$VULN_COUNT" >> $GITHUB_OUTPUT
|
|
43
|
+
else
|
|
44
|
+
echo "vuln_count=0" >> $GITHUB_OUTPUT
|
|
45
|
+
fi
|
|
46
|
+
- name: Upload audit results
|
|
47
|
+
if: always()
|
|
48
|
+
uses: actions/upload-artifact@v4
|
|
49
|
+
with:
|
|
50
|
+
name: security-audit-results
|
|
51
|
+
path: |
|
|
52
|
+
audit-results.json
|
|
53
|
+
audit-results.md
|
|
54
|
+
retention-days: 30
|
|
55
|
+
- name: Fail on vulnerabilities (PRs only)
|
|
56
|
+
if: steps.audit.outputs.vuln_count != '0' && github.event_name == 'pull_request'
|
|
57
|
+
run: |
|
|
58
|
+
echo "::error::Security vulnerabilities found in dependencies."
|
|
59
|
+
exit 1
|
|
60
|
+
|
|
61
|
+
container-scan:
|
|
62
|
+
name: Container Security Scan
|
|
63
|
+
runs-on: ubuntu-latest
|
|
64
|
+
steps:
|
|
65
|
+
- uses: actions/checkout@v4
|
|
66
|
+
- name: Build container image
|
|
67
|
+
run: docker build -f Containerfile -t mcp-feed-reader:scan .
|
|
68
|
+
- name: Run Trivy vulnerability scanner
|
|
69
|
+
uses: aquasecurity/trivy-action@master
|
|
70
|
+
with:
|
|
71
|
+
image-ref: "mcp-feed-reader:scan"
|
|
72
|
+
format: "sarif"
|
|
73
|
+
output: "trivy-results.sarif"
|
|
74
|
+
severity: "CRITICAL,HIGH"
|
|
75
|
+
- name: Upload Trivy scan results
|
|
76
|
+
uses: github/codeql-action/upload-sarif@v3
|
|
77
|
+
if: always()
|
|
78
|
+
with:
|
|
79
|
+
sarif_file: "trivy-results.sarif"
|
|
80
|
+
|
|
81
|
+
codeql:
|
|
82
|
+
name: CodeQL Analysis
|
|
83
|
+
runs-on: ubuntu-latest
|
|
84
|
+
steps:
|
|
85
|
+
- uses: actions/checkout@v4
|
|
86
|
+
- name: Initialize CodeQL
|
|
87
|
+
uses: github/codeql-action/init@v3
|
|
88
|
+
with:
|
|
89
|
+
languages: python
|
|
90
|
+
queries: security-extended
|
|
91
|
+
- name: Perform CodeQL Analysis
|
|
92
|
+
uses: github/codeql-action/analyze@v3
|
|
93
|
+
with:
|
|
94
|
+
category: "/language:python"
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
# Byte-compiled / optimized / DLL files
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*$py.class
|
|
5
|
+
|
|
6
|
+
# C extensions
|
|
7
|
+
*.so
|
|
8
|
+
|
|
9
|
+
# Distribution / packaging
|
|
10
|
+
.Python
|
|
11
|
+
build/
|
|
12
|
+
develop-eggs/
|
|
13
|
+
dist/
|
|
14
|
+
downloads/
|
|
15
|
+
eggs/
|
|
16
|
+
.eggs/
|
|
17
|
+
lib/
|
|
18
|
+
lib64/
|
|
19
|
+
parts/
|
|
20
|
+
sdist/
|
|
21
|
+
var/
|
|
22
|
+
wheels/
|
|
23
|
+
share/python-wheels/
|
|
24
|
+
*.egg-info/
|
|
25
|
+
.installed.cfg
|
|
26
|
+
*.egg
|
|
27
|
+
MANIFEST
|
|
28
|
+
|
|
29
|
+
# PyInstaller
|
|
30
|
+
*.manifest
|
|
31
|
+
*.spec
|
|
32
|
+
|
|
33
|
+
# Installer logs
|
|
34
|
+
pip-log.txt
|
|
35
|
+
pip-delete-this-directory.txt
|
|
36
|
+
|
|
37
|
+
# Unit test / coverage reports
|
|
38
|
+
htmlcov/
|
|
39
|
+
.tox/
|
|
40
|
+
.nox/
|
|
41
|
+
.coverage
|
|
42
|
+
.coverage.*
|
|
43
|
+
.cache
|
|
44
|
+
nosetests.xml
|
|
45
|
+
coverage.xml
|
|
46
|
+
*.cover
|
|
47
|
+
*.py,cover
|
|
48
|
+
.hypothesis/
|
|
49
|
+
.pytest_cache/
|
|
50
|
+
cover/
|
|
51
|
+
|
|
52
|
+
# Translations
|
|
53
|
+
*.mo
|
|
54
|
+
*.pot
|
|
55
|
+
|
|
56
|
+
# Environments
|
|
57
|
+
.env
|
|
58
|
+
.venv
|
|
59
|
+
env/
|
|
60
|
+
venv/
|
|
61
|
+
ENV/
|
|
62
|
+
env.bak/
|
|
63
|
+
venv.bak/
|
|
64
|
+
|
|
65
|
+
# IDE
|
|
66
|
+
.idea/
|
|
67
|
+
.vscode/
|
|
68
|
+
*.swp
|
|
69
|
+
*.swo
|
|
70
|
+
*~
|
|
71
|
+
|
|
72
|
+
# mypy
|
|
73
|
+
.mypy_cache/
|
|
74
|
+
.dmypy.json
|
|
75
|
+
dmypy.json
|
|
76
|
+
|
|
77
|
+
# ruff
|
|
78
|
+
.ruff_cache/
|
|
79
|
+
|
|
80
|
+
# uv
|
|
81
|
+
.uv/
|
|
82
|
+
uv.lock
|
|
83
|
+
|
|
84
|
+
# Local development
|
|
85
|
+
.envrc
|
|
86
|
+
.direnv/
|
|
87
|
+
|
|
88
|
+
# Gourmand
|
|
89
|
+
.gourmand-cache/
|
|
90
|
+
|
|
91
|
+
# Claude Code
|
|
92
|
+
.claude/
|
|
93
|
+
|
|
94
|
+
# OS files
|
|
95
|
+
.DS_Store
|
|
96
|
+
Thumbs.db
|
|
97
|
+
|
|
98
|
+
# MCP Registry auth tokens
|
|
99
|
+
.mcpregistry_*
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
repos:
|
|
2
|
+
- repo: local
|
|
3
|
+
hooks:
|
|
4
|
+
- id: ruff-check
|
|
5
|
+
name: ruff check
|
|
6
|
+
entry: uv run ruff check --fix
|
|
7
|
+
language: system
|
|
8
|
+
types: [python]
|
|
9
|
+
stages: [pre-commit, pre-merge-commit]
|
|
10
|
+
- id: ruff-format
|
|
11
|
+
name: ruff format
|
|
12
|
+
entry: uv run ruff format
|
|
13
|
+
language: system
|
|
14
|
+
types: [python]
|
|
15
|
+
stages: [pre-commit, pre-merge-commit]
|
|
16
|
+
- repo: https://github.com/crunchtools/constitution
|
|
17
|
+
rev: v1.0.0
|
|
18
|
+
hooks:
|
|
19
|
+
- id: validate-constitution
|