quickshell-mcp 1.4.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.
Files changed (72) hide show
  1. quickshell_mcp-1.4.1/.coderabbit.yaml +6 -0
  2. quickshell_mcp-1.4.1/.github/ISSUE_TEMPLATE/bug_report.yml +122 -0
  3. quickshell_mcp-1.4.1/.github/ISSUE_TEMPLATE/config.yml +11 -0
  4. quickshell_mcp-1.4.1/.github/ISSUE_TEMPLATE/config_help.yml +70 -0
  5. quickshell_mcp-1.4.1/.github/ISSUE_TEMPLATE/feature_request.yml +76 -0
  6. quickshell_mcp-1.4.1/.github/pull_request_template.md +39 -0
  7. quickshell_mcp-1.4.1/.github/workflows/ci.yml +150 -0
  8. quickshell_mcp-1.4.1/.github/workflows/semantic-release.yml +95 -0
  9. quickshell_mcp-1.4.1/.gitignore +26 -0
  10. quickshell_mcp-1.4.1/.releaserc.json +35 -0
  11. quickshell_mcp-1.4.1/.serena/.gitignore +2 -0
  12. quickshell_mcp-1.4.1/.serena/project.yml +169 -0
  13. quickshell_mcp-1.4.1/AGENTS.md +109 -0
  14. quickshell_mcp-1.4.1/CLAUDE.md +109 -0
  15. quickshell_mcp-1.4.1/CODE_OF_CONDUCT.md +37 -0
  16. quickshell_mcp-1.4.1/CONTRIBUTING.md +104 -0
  17. quickshell_mcp-1.4.1/Dockerfile +10 -0
  18. quickshell_mcp-1.4.1/LICENSE +21 -0
  19. quickshell_mcp-1.4.1/PKG-INFO +189 -0
  20. quickshell_mcp-1.4.1/README.md +152 -0
  21. quickshell_mcp-1.4.1/flake.lock +27 -0
  22. quickshell_mcp-1.4.1/flake.nix +71 -0
  23. quickshell_mcp-1.4.1/pyproject.toml +72 -0
  24. quickshell_mcp-1.4.1/quickshell_mcp/__init__.py +3 -0
  25. quickshell_mcp-1.4.1/quickshell_mcp/__main__.py +4 -0
  26. quickshell_mcp-1.4.1/quickshell_mcp/caches.py +96 -0
  27. quickshell_mcp-1.4.1/quickshell_mcp/config.py +40 -0
  28. quickshell_mcp-1.4.1/quickshell_mcp/extraction.py +31 -0
  29. quickshell_mcp-1.4.1/quickshell_mcp/server.py +586 -0
  30. quickshell_mcp-1.4.1/quickshell_mcp/sources/__init__.py +1 -0
  31. quickshell_mcp-1.4.1/quickshell_mcp/sources/docs.py +238 -0
  32. quickshell_mcp-1.4.1/quickshell_mcp/sources/examples.py +78 -0
  33. quickshell_mcp-1.4.1/quickshell_mcp/sources/explain_error.py +608 -0
  34. quickshell_mcp-1.4.1/quickshell_mcp/sources/find_pattern.py +261 -0
  35. quickshell_mcp-1.4.1/quickshell_mcp/sources/implementations.py +345 -0
  36. quickshell_mcp-1.4.1/quickshell_mcp/sources/qt_docs.py +171 -0
  37. quickshell_mcp-1.4.1/quickshell_mcp/sources/search_all.py +337 -0
  38. quickshell_mcp-1.4.1/quickshell_mcp/sources/validate.py +1442 -0
  39. quickshell_mcp-1.4.1/quickshell_mcp/utils.py +70 -0
  40. quickshell_mcp-1.4.1/quickshell_mcp/versions.py +74 -0
  41. quickshell_mcp-1.4.1/scripts/smoke_test.py +161 -0
  42. quickshell_mcp-1.4.1/tests/conftest.py +72 -0
  43. quickshell_mcp-1.4.1/tests/fixtures/about.html +75 -0
  44. quickshell_mcp-1.4.1/tests/fixtures/example_readme.md +4 -0
  45. quickshell_mcp-1.4.1/tests/fixtures/examples_contents_root.json +1 -0
  46. quickshell_mcp-1.4.1/tests/fixtures/examples_repo_info.json +1 -0
  47. quickshell_mcp-1.4.1/tests/fixtures/guide_index.html +101 -0
  48. quickshell_mcp-1.4.1/tests/fixtures/hyprland_monitor.html +105 -0
  49. quickshell_mcp-1.4.1/tests/fixtures/impl_caelestia_anchoranim.qml +51 -0
  50. quickshell_mcp-1.4.1/tests/fixtures/impl_caelestia_repo_info.json +1 -0
  51. quickshell_mcp-1.4.1/tests/fixtures/impl_caelestia_tree.json +1417 -0
  52. quickshell_mcp-1.4.1/tests/fixtures/impl_noctalia_nbutton.qml +184 -0
  53. quickshell_mcp-1.4.1/tests/fixtures/impl_noctalia_tree.json +2097 -0
  54. quickshell_mcp-1.4.1/tests/fixtures/qml_language.html +1362 -0
  55. quickshell_mcp-1.4.1/tests/fixtures/qt_qml_qtquick_rectangle.html +445 -0
  56. quickshell_mcp-1.4.1/tests/fixtures/qt_qtquick_controls_qmlmodule.html +395 -0
  57. quickshell_mcp-1.4.1/tests/fixtures/qt_qtquick_qmlmodule.html +451 -0
  58. quickshell_mcp-1.4.1/tests/test_code_quality.py +69 -0
  59. quickshell_mcp-1.4.1/tests/test_content_search.py +153 -0
  60. quickshell_mcp-1.4.1/tests/test_disk_cache.py +108 -0
  61. quickshell_mcp-1.4.1/tests/test_errors_retry.py +97 -0
  62. quickshell_mcp-1.4.1/tests/test_examples.py +86 -0
  63. quickshell_mcp-1.4.1/tests/test_explain_error.py +699 -0
  64. quickshell_mcp-1.4.1/tests/test_extraction.py +49 -0
  65. quickshell_mcp-1.4.1/tests/test_find_pattern.py +221 -0
  66. quickshell_mcp-1.4.1/tests/test_implementations.py +227 -0
  67. quickshell_mcp-1.4.1/tests/test_index_search.py +92 -0
  68. quickshell_mcp-1.4.1/tests/test_live.py +37 -0
  69. quickshell_mcp-1.4.1/tests/test_qt_docs.py +167 -0
  70. quickshell_mcp-1.4.1/tests/test_search_all.py +208 -0
  71. quickshell_mcp-1.4.1/tests/test_validate.py +753 -0
  72. quickshell_mcp-1.4.1/tests/test_versions.py +106 -0
@@ -0,0 +1,6 @@
1
+ reviews:
2
+ finishing_touches:
3
+ autofix:
4
+ enabled: false
5
+ fix_ci:
6
+ enabled: false
@@ -0,0 +1,122 @@
1
+ name: Bug report
2
+ description: Report something broken
3
+ title: "[Bug] "
4
+ labels: [bug]
5
+ assignees: []
6
+ body:
7
+ - type: markdown
8
+ attributes:
9
+ value: |
10
+ Thanks for reporting. Fill in what you can; the more, the faster the fix.
11
+ If you can reproduce this with the [MCP Inspector](https://github.com/modelcontextprotocol/inspector), that isolates whether it's this server or your client config.
12
+
13
+ - type: dropdown
14
+ id: install
15
+ attributes:
16
+ label: How did you install?
17
+ options:
18
+ - pip
19
+ - uvx
20
+ - From source
21
+ - Nix
22
+ - Docker
23
+ - Other
24
+ validations:
25
+ required: true
26
+
27
+ - type: input
28
+ id: version
29
+ attributes:
30
+ label: quickshell-mcp version
31
+ description: Output of `quickshell-mcp --version` or `pip show quickshell-mcp`
32
+ validations:
33
+ required: true
34
+
35
+ - type: input
36
+ id: python
37
+ attributes:
38
+ label: Python version
39
+ description: Output of `python --version`
40
+ validations:
41
+ required: true
42
+
43
+ - type: input
44
+ id: os
45
+ attributes:
46
+ label: OS
47
+ placeholder: "e.g. NixOS 24.11, macOS 15, Ubuntu 24.04"
48
+ validations:
49
+ required: true
50
+
51
+ - type: input
52
+ id: transport
53
+ attributes:
54
+ label: Transport
55
+ description: stdio or http?
56
+ placeholder: stdio
57
+ validations:
58
+ required: true
59
+
60
+ - type: dropdown
61
+ id: source
62
+ attributes:
63
+ label: Which source is affected?
64
+ options:
65
+ - quickshell.org (types/guide)
66
+ - doc.qt.io (Qt types)
67
+ - quickshell-examples
68
+ - Caelestia/Noctalia implementations
69
+ - General / not sure
70
+ validations:
71
+ required: true
72
+
73
+ - type: textarea
74
+ id: what
75
+ attributes:
76
+ label: What happened
77
+ validations:
78
+ required: true
79
+
80
+ - type: textarea
81
+ id: expected
82
+ attributes:
83
+ label: Expected behavior
84
+ validations:
85
+ required: true
86
+
87
+ - type: textarea
88
+ id: reproduce
89
+ attributes:
90
+ label: Steps to reproduce
91
+ placeholder: |
92
+ 1. Call tool `quickshell_get_type` with ...
93
+ 2. ...
94
+ validations:
95
+ required: true
96
+
97
+ - type: textarea
98
+ id: output
99
+ attributes:
100
+ label: Error output
101
+ description: Paste stderr, traceback, or MCP error here. Set `QUICKSHELL_DOCS_MCP_LOG=DEBUG` for more detail.
102
+ render: text
103
+
104
+ - type: dropdown
105
+ id: cache
106
+ attributes:
107
+ label: Did clearing the disk cache change anything?
108
+ description: Try `refresh=True` on the affected tool, or clear `~/.cache/quickshell-mcp`.
109
+ options:
110
+ - Not tried
111
+ - "Yes, it fixed the issue"
112
+ - "No, same result after clearing"
113
+ validations:
114
+ required: false
115
+
116
+ - type: checkboxes
117
+ id: regression
118
+ attributes:
119
+ label: Regression?
120
+ options:
121
+ - label: This used to work in a previous version
122
+ required: false
@@ -0,0 +1,11 @@
1
+ blank_issues_enabled: false
2
+ contact_links:
3
+ - name: Quickshell documentation
4
+ url: https://quickshell.org
5
+ about: Official Quickshell docs, not this project's issue tracker.
6
+ - name: Quickshell examples
7
+ url: https://git.outfoxxed.me/quickshell/quickshell-examples
8
+ about: Official example configs maintained upstream.
9
+ - name: MCP Inspector
10
+ url: https://github.com/modelcontextprotocol/inspector
11
+ about: Debug this server interactively before filing a bug. See the README for steps.
@@ -0,0 +1,70 @@
1
+ name: Setup help
2
+ description: Getting started or configuring the MCP server
3
+ title: "[Help] "
4
+ labels: [question]
5
+ assignees: []
6
+ body:
7
+ - type: markdown
8
+ attributes:
9
+ value: |
10
+ Before filing, try the [MCP Inspector](https://github.com/modelcontextprotocol/inspector) to debug interactively. It often surfaces the issue faster than trial and error in your client.
11
+
12
+ - type: dropdown
13
+ id: install
14
+ attributes:
15
+ label: How did you install?
16
+ options:
17
+ - pip
18
+ - uvx
19
+ - From source
20
+ - Nix
21
+ - Docker
22
+ - Other
23
+ validations:
24
+ required: true
25
+
26
+ - type: input
27
+ id: version
28
+ attributes:
29
+ label: Version
30
+ description: Run `pip show quickshell-mcp` (or check `quickshell_about`) to find this.
31
+ placeholder: "0.4.1"
32
+ validations:
33
+ required: true
34
+
35
+ - type: input
36
+ id: environment
37
+ attributes:
38
+ label: OS and Python version
39
+ placeholder: "e.g. NixOS 24.11, Python 3.12"
40
+ validations:
41
+ required: true
42
+
43
+ - type: textarea
44
+ id: goal
45
+ attributes:
46
+ label: What you're trying to do
47
+ description: Which client (opencode, Claude Desktop, etc.) and what setup?
48
+ validations:
49
+ required: true
50
+
51
+ - type: textarea
52
+ id: tried
53
+ attributes:
54
+ label: What you tried
55
+ validations:
56
+ required: true
57
+
58
+ - type: textarea
59
+ id: config
60
+ attributes:
61
+ label: Your config
62
+ description: Paste your MCP client config (redact paths or tokens if needed).
63
+ render: json
64
+
65
+ - type: textarea
66
+ id: output
67
+ attributes:
68
+ label: Output / errors
69
+ description: Any error messages or unexpected behavior. Set `QUICKSHELL_DOCS_MCP_LOG=DEBUG` for more detail.
70
+ render: text
@@ -0,0 +1,76 @@
1
+ name: Feature request
2
+ description: Suggest something new
3
+ title: "[Feature] "
4
+ labels: [enhancement]
5
+ assignees: []
6
+ body:
7
+ - type: markdown
8
+ attributes:
9
+ value: |
10
+ Thanks for taking the time to suggest a feature. Before filing, please [search existing issues](../issues) to see if it's already been requested.
11
+
12
+ - type: textarea
13
+ id: what
14
+ attributes:
15
+ label: What
16
+ description: The feature in one sentence.
17
+ placeholder: Add a tool to search deprecated type warnings across doc versions.
18
+ validations:
19
+ required: true
20
+
21
+ - type: textarea
22
+ id: why
23
+ attributes:
24
+ label: Why
25
+ description: Pain point it solves or use case. Link a related issue if there is one.
26
+ placeholder: Agents keep suggesting types that were deprecated in v0.3.0 because nothing surfaces that signal today.
27
+ validations:
28
+ required: true
29
+
30
+ - type: dropdown
31
+ id: area
32
+ attributes:
33
+ label: Area
34
+ options:
35
+ - New tool
36
+ - Existing tool improvement
37
+ - New upstream source
38
+ - Search / indexing
39
+ - Caching
40
+ - Documentation
41
+ - Other
42
+ validations:
43
+ required: true
44
+
45
+ - type: textarea
46
+ id: how
47
+ attributes:
48
+ label: How it could work
49
+ description: Rough idea; which tool, which source, new endpoint, etc. Doesn't need to be a full spec.
50
+ placeholder: |
51
+ Could live as a flag on `quickshell_get_type` (`include_deprecated=True`), or a
52
+ standalone `quickshell_list_deprecated` tool. Deprecation notices already exist
53
+ in the changelog pages, so this might just be a targeted parse of those.
54
+
55
+ - type: textarea
56
+ id: alternatives
57
+ attributes:
58
+ label: Alternatives considered
59
+ description: Other approaches you thought about and why you didn't go with them. "None" is fine.
60
+
61
+ - type: dropdown
62
+ id: contribute
63
+ attributes:
64
+ label: Would you be willing to open a PR for this?
65
+ options:
66
+ - "Yes"
67
+ - "Yes, with some guidance"
68
+ - "No"
69
+ validations:
70
+ required: false
71
+
72
+ - type: textarea
73
+ id: context
74
+ attributes:
75
+ label: Additional context
76
+ description: Screenshots, links, related issues, or anything else that helps explain the request.
@@ -0,0 +1,39 @@
1
+ ## What
2
+
3
+ Brief description of the change.
4
+
5
+ ## Why
6
+
7
+ Link to issue or explain the problem. Use `Closes #123` if this resolves an open issue.
8
+
9
+ ## How
10
+
11
+ Key implementation details or approach taken.
12
+
13
+ ## Type of Change
14
+
15
+ - [ ] `feat` (new feature or tool)
16
+ - [ ] `fix` (bug fix)
17
+ - [ ] `docs` (documentation only)
18
+ - [ ] `refactor` (code change with no behavior change)
19
+ - [ ] `chore` (maintenance, deps, CI)
20
+
21
+ ## Breaking Changes
22
+
23
+ - [ ] This PR introduces a breaking change (tool signature, config format, or output shape)
24
+
25
+ If checked, describe the impact and migration path below.
26
+
27
+ ## Checklist
28
+
29
+ - [ ] Tests pass (`pytest`)
30
+ - [ ] Lint passes (`ruff check . && ruff format --check .`)
31
+ - [ ] Types pass (`mypy quickshell_mcp`)
32
+ - [ ] New tools have happy + failure path tests
33
+ - [ ] Tool docstrings written for how users ask, not what code does
34
+ - [ ] No hardcoded version strings outside `tests/fixtures/`
35
+ - [ ] Docs updated (`README.md`, tool tables) if behavior or interface changed
36
+
37
+ ## Related Issues
38
+
39
+ Closes #
@@ -0,0 +1,150 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [ main ]
6
+ paths-ignore:
7
+ - '**.md'
8
+ - 'LICENSE'
9
+ - '.gitignore'
10
+ pull_request:
11
+ branches: [ main ]
12
+ paths-ignore:
13
+ - '**.md'
14
+ - 'LICENSE'
15
+ - '.gitignore'
16
+ workflow_dispatch:
17
+
18
+ permissions:
19
+ contents: read
20
+
21
+ jobs:
22
+ check:
23
+ runs-on: ubuntu-latest
24
+ steps:
25
+ - uses: actions/checkout@v6
26
+
27
+ - name: Install Nix
28
+ uses: cachix/install-nix-action@v31
29
+ with:
30
+ nix_path: nixpkgs=channel:nixos-unstable
31
+ extra_nix_config: |
32
+ experimental-features = nix-command flakes
33
+ accept-flake-config = true
34
+
35
+ - name: Check flake
36
+ run: |
37
+ nix flake check
38
+ nix flake show --all-systems --json >/dev/null
39
+
40
+ build:
41
+ runs-on: ubuntu-latest
42
+ needs: check
43
+ steps:
44
+ - uses: actions/checkout@v6
45
+
46
+ - name: Install Nix
47
+ uses: cachix/install-nix-action@v31
48
+ with:
49
+ nix_path: nixpkgs=channel:nixos-unstable
50
+ extra_nix_config: |
51
+ experimental-features = nix-command flakes
52
+ accept-flake-config = true
53
+
54
+ - name: Build Nix package
55
+ run: nix build
56
+
57
+ - name: Test package runs
58
+ run: |
59
+ timeout 5s ./result/bin/quickshell-mcp || true
60
+
61
+ - name: Build Python distribution
62
+ run: |
63
+ nix develop --command python -m build --no-isolation
64
+ ls -la dist/
65
+
66
+ - name: Validate package metadata
67
+ run: nix develop --command twine check dist/*
68
+
69
+ lint:
70
+ runs-on: ubuntu-latest
71
+ needs: check
72
+ steps:
73
+ - uses: actions/checkout@v6
74
+
75
+ - name: Install Nix
76
+ uses: cachix/install-nix-action@v31
77
+ with:
78
+ nix_path: nixpkgs=channel:nixos-unstable
79
+ extra_nix_config: |
80
+ experimental-features = nix-command flakes
81
+ accept-flake-config = true
82
+
83
+ - name: Lint with ruff
84
+ run: |
85
+ nix develop --command ruff check quickshell_mcp/ tests/ scripts/
86
+ nix develop --command ruff format --check quickshell_mcp/ tests/ scripts/
87
+
88
+ - name: Type check with mypy
89
+ run: nix develop --command mypy quickshell_mcp/
90
+
91
+ test:
92
+ runs-on: ubuntu-latest
93
+ needs: check
94
+ timeout-minutes: 10
95
+ steps:
96
+ - uses: actions/checkout@v6
97
+
98
+ - name: Install Nix
99
+ uses: cachix/install-nix-action@v31
100
+ with:
101
+ nix_path: nixpkgs=channel:nixos-unstable
102
+ extra_nix_config: |
103
+ experimental-features = nix-command flakes
104
+ accept-flake-config = true
105
+
106
+ - name: Run tests (offline suite + code-quality gates)
107
+ run: |
108
+ nix develop --command pytest tests/ -v -n auto \
109
+ --cov=quickshell_mcp --cov-report=xml --cov-report=term
110
+
111
+ - name: Upload coverage to Codecov
112
+ uses: codecov/codecov-action@v6
113
+ with:
114
+ token: ${{ secrets.CODECOV_TOKEN }}
115
+ slug: franklinnolasco7/quickshell-mcp
116
+ files: ./coverage.xml
117
+ flags: unittests
118
+ name: codecov-umbrella
119
+ fail_ci_if_error: false
120
+
121
+ docker-build:
122
+ runs-on: ubuntu-latest
123
+ needs: [build, lint, test]
124
+ steps:
125
+ - uses: actions/checkout@v6
126
+
127
+ - name: Build Docker image
128
+ run: docker build -t quickshell-mcp .
129
+
130
+ - name: Smoke-run image over stdio
131
+ run: |
132
+ docker run --rm -i -d --name qs-smoke quickshell-mcp &
133
+ sleep 3
134
+ docker stop qs-smoke >/dev/null
135
+
136
+ live-smoke:
137
+ if: github.event_name == 'workflow_dispatch'
138
+ runs-on: ubuntu-latest
139
+ steps:
140
+ - uses: actions/checkout@v6
141
+
142
+ - uses: actions/setup-python@v5
143
+ with:
144
+ python-version: "3.12"
145
+
146
+ - name: Install
147
+ run: pip install -e '.[dev]'
148
+
149
+ - name: Live smoke test against quickshell.org
150
+ run: QUICKSHELL_LIVE_TEST=1 pytest -m live -q
@@ -0,0 +1,95 @@
1
+ name: Semantic release
2
+
3
+ on:
4
+ push:
5
+ branches: [ main ]
6
+ workflow_dispatch:
7
+ inputs:
8
+ tag:
9
+ description: "Existing vX.Y.Z tag to build and publish"
10
+ required: true
11
+ type: string
12
+
13
+ permissions:
14
+ contents: write
15
+ id-token: write
16
+
17
+ concurrency:
18
+ group: semantic-release
19
+
20
+ jobs:
21
+ semantic-release:
22
+ runs-on: ubuntu-latest
23
+ outputs:
24
+ released: ${{ steps.sr.outputs.released }}
25
+ version: ${{ steps.sr.outputs.version }}
26
+ steps:
27
+ - uses: actions/checkout@v6
28
+ with:
29
+ fetch-depth: 0
30
+ persist-credentials: false
31
+
32
+ - uses: actions/setup-node@v4
33
+ with:
34
+ node-version: 22
35
+
36
+ - name: Install semantic-release and plugins
37
+ if: github.event_name == 'push'
38
+ run: |
39
+ npm install --no-save \
40
+ semantic-release@^25 \
41
+ @semantic-release/git@^11 \
42
+ @semantic-release/exec@^7 \
43
+ "@google/semantic-release-replace-plugin@^1.2.7"
44
+
45
+ - name: Release
46
+ id: sr
47
+ if: github.event_name == 'push'
48
+ env:
49
+ GITHUB_TOKEN: ${{ secrets.RELEASE_TOKEN }}
50
+ run: npx semantic-release
51
+
52
+ publish:
53
+ needs: semantic-release
54
+ runs-on: ubuntu-latest
55
+ environment: pypi
56
+ if: >-
57
+ github.event_name == 'workflow_dispatch' ||
58
+ needs.semantic-release.outputs.released == 'true'
59
+ steps:
60
+ - name: Resolve version
61
+ id: meta
62
+ env:
63
+ INPUT_TAG: ${{ inputs.tag }}
64
+ SR_VERSION: ${{ needs.semantic-release.outputs.version }}
65
+ run: |
66
+ TAG="${INPUT_TAG:-$SR_VERSION}"
67
+ if [ -z "$TAG" ]; then
68
+ echo "::error::No version resolved. On workflow_dispatch you must pass the tag input (e.g. v1.0.0); push triggers get it from semantic-release."
69
+ exit 1
70
+ fi
71
+ echo "version=${TAG#v}" >> "$GITHUB_OUTPUT"
72
+
73
+ - uses: actions/checkout@v6
74
+ with:
75
+ ref: "v${{ steps.meta.outputs.version }}"
76
+ persist-credentials: false
77
+
78
+ - name: Install Nix
79
+ uses: cachix/install-nix-action@v31
80
+ with:
81
+ nix_path: nixpkgs=channel:nixos-unstable
82
+ extra_nix_config: |
83
+ experimental-features = nix-command flakes
84
+ accept-flake-config = true
85
+
86
+ - name: Build Python distribution
87
+ run: |
88
+ nix develop --command python -m build --no-isolation
89
+ ls -la dist/
90
+
91
+ - name: Validate package metadata
92
+ run: nix develop --command twine check dist/*
93
+
94
+ - name: Publish to PyPI
95
+ uses: pypa/gh-action-pypi-publish@release/v1
@@ -0,0 +1,26 @@
1
+ # Python
2
+ __pycache__/
3
+ *.py[cod]
4
+ *.egg-info/
5
+ dist/
6
+ build/
7
+ .venv/
8
+
9
+ # Tool caches
10
+ .mypy_cache/
11
+ .pytest_cache/
12
+ .ruff_cache/
13
+ .coverage
14
+ coverage.xml
15
+ htmlcov/
16
+
17
+ # Nix
18
+ result
19
+ result-*
20
+ .direnv/
21
+
22
+ # Editors / OS
23
+ .vscode/
24
+ .idea/
25
+ *.swp
26
+ .DS_Store
@@ -0,0 +1,35 @@
1
+ {
2
+ "branches": ["main"],
3
+ "tagFormat": "v${version}",
4
+ "plugins": [
5
+ "@semantic-release/commit-analyzer",
6
+ "@semantic-release/release-notes-generator",
7
+ [
8
+ "@google/semantic-release-replace-plugin",
9
+ {
10
+ "replacements": [
11
+ {
12
+ "files": ["pyproject.toml"],
13
+ "from": "version = \"[0-9]+\\.[0-9]+\\.[0-9]+[^\"]*\"",
14
+ "to": "version = \"${nextRelease.version}\"",
15
+ "results": [{ "file": "pyproject.toml", "hasChanged": true }]
16
+ }
17
+ ]
18
+ }
19
+ ],
20
+ [
21
+ "@semantic-release/git",
22
+ {
23
+ "assets": ["pyproject.toml"],
24
+ "message": "chore(release): ${nextRelease.version} [skip ci]"
25
+ }
26
+ ],
27
+ [
28
+ "@semantic-release/exec",
29
+ {
30
+ "prepareCmd": "echo 'released=true' >> \"$GITHUB_OUTPUT\" && echo \"version=${nextRelease.version}\" >> \"$GITHUB_OUTPUT\""
31
+ }
32
+ ],
33
+ "@semantic-release/github"
34
+ ]
35
+ }
@@ -0,0 +1,2 @@
1
+ /cache
2
+ /project.local.yml