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.
- quickshell_mcp-1.4.1/.coderabbit.yaml +6 -0
- quickshell_mcp-1.4.1/.github/ISSUE_TEMPLATE/bug_report.yml +122 -0
- quickshell_mcp-1.4.1/.github/ISSUE_TEMPLATE/config.yml +11 -0
- quickshell_mcp-1.4.1/.github/ISSUE_TEMPLATE/config_help.yml +70 -0
- quickshell_mcp-1.4.1/.github/ISSUE_TEMPLATE/feature_request.yml +76 -0
- quickshell_mcp-1.4.1/.github/pull_request_template.md +39 -0
- quickshell_mcp-1.4.1/.github/workflows/ci.yml +150 -0
- quickshell_mcp-1.4.1/.github/workflows/semantic-release.yml +95 -0
- quickshell_mcp-1.4.1/.gitignore +26 -0
- quickshell_mcp-1.4.1/.releaserc.json +35 -0
- quickshell_mcp-1.4.1/.serena/.gitignore +2 -0
- quickshell_mcp-1.4.1/.serena/project.yml +169 -0
- quickshell_mcp-1.4.1/AGENTS.md +109 -0
- quickshell_mcp-1.4.1/CLAUDE.md +109 -0
- quickshell_mcp-1.4.1/CODE_OF_CONDUCT.md +37 -0
- quickshell_mcp-1.4.1/CONTRIBUTING.md +104 -0
- quickshell_mcp-1.4.1/Dockerfile +10 -0
- quickshell_mcp-1.4.1/LICENSE +21 -0
- quickshell_mcp-1.4.1/PKG-INFO +189 -0
- quickshell_mcp-1.4.1/README.md +152 -0
- quickshell_mcp-1.4.1/flake.lock +27 -0
- quickshell_mcp-1.4.1/flake.nix +71 -0
- quickshell_mcp-1.4.1/pyproject.toml +72 -0
- quickshell_mcp-1.4.1/quickshell_mcp/__init__.py +3 -0
- quickshell_mcp-1.4.1/quickshell_mcp/__main__.py +4 -0
- quickshell_mcp-1.4.1/quickshell_mcp/caches.py +96 -0
- quickshell_mcp-1.4.1/quickshell_mcp/config.py +40 -0
- quickshell_mcp-1.4.1/quickshell_mcp/extraction.py +31 -0
- quickshell_mcp-1.4.1/quickshell_mcp/server.py +586 -0
- quickshell_mcp-1.4.1/quickshell_mcp/sources/__init__.py +1 -0
- quickshell_mcp-1.4.1/quickshell_mcp/sources/docs.py +238 -0
- quickshell_mcp-1.4.1/quickshell_mcp/sources/examples.py +78 -0
- quickshell_mcp-1.4.1/quickshell_mcp/sources/explain_error.py +608 -0
- quickshell_mcp-1.4.1/quickshell_mcp/sources/find_pattern.py +261 -0
- quickshell_mcp-1.4.1/quickshell_mcp/sources/implementations.py +345 -0
- quickshell_mcp-1.4.1/quickshell_mcp/sources/qt_docs.py +171 -0
- quickshell_mcp-1.4.1/quickshell_mcp/sources/search_all.py +337 -0
- quickshell_mcp-1.4.1/quickshell_mcp/sources/validate.py +1442 -0
- quickshell_mcp-1.4.1/quickshell_mcp/utils.py +70 -0
- quickshell_mcp-1.4.1/quickshell_mcp/versions.py +74 -0
- quickshell_mcp-1.4.1/scripts/smoke_test.py +161 -0
- quickshell_mcp-1.4.1/tests/conftest.py +72 -0
- quickshell_mcp-1.4.1/tests/fixtures/about.html +75 -0
- quickshell_mcp-1.4.1/tests/fixtures/example_readme.md +4 -0
- quickshell_mcp-1.4.1/tests/fixtures/examples_contents_root.json +1 -0
- quickshell_mcp-1.4.1/tests/fixtures/examples_repo_info.json +1 -0
- quickshell_mcp-1.4.1/tests/fixtures/guide_index.html +101 -0
- quickshell_mcp-1.4.1/tests/fixtures/hyprland_monitor.html +105 -0
- quickshell_mcp-1.4.1/tests/fixtures/impl_caelestia_anchoranim.qml +51 -0
- quickshell_mcp-1.4.1/tests/fixtures/impl_caelestia_repo_info.json +1 -0
- quickshell_mcp-1.4.1/tests/fixtures/impl_caelestia_tree.json +1417 -0
- quickshell_mcp-1.4.1/tests/fixtures/impl_noctalia_nbutton.qml +184 -0
- quickshell_mcp-1.4.1/tests/fixtures/impl_noctalia_tree.json +2097 -0
- quickshell_mcp-1.4.1/tests/fixtures/qml_language.html +1362 -0
- quickshell_mcp-1.4.1/tests/fixtures/qt_qml_qtquick_rectangle.html +445 -0
- quickshell_mcp-1.4.1/tests/fixtures/qt_qtquick_controls_qmlmodule.html +395 -0
- quickshell_mcp-1.4.1/tests/fixtures/qt_qtquick_qmlmodule.html +451 -0
- quickshell_mcp-1.4.1/tests/test_code_quality.py +69 -0
- quickshell_mcp-1.4.1/tests/test_content_search.py +153 -0
- quickshell_mcp-1.4.1/tests/test_disk_cache.py +108 -0
- quickshell_mcp-1.4.1/tests/test_errors_retry.py +97 -0
- quickshell_mcp-1.4.1/tests/test_examples.py +86 -0
- quickshell_mcp-1.4.1/tests/test_explain_error.py +699 -0
- quickshell_mcp-1.4.1/tests/test_extraction.py +49 -0
- quickshell_mcp-1.4.1/tests/test_find_pattern.py +221 -0
- quickshell_mcp-1.4.1/tests/test_implementations.py +227 -0
- quickshell_mcp-1.4.1/tests/test_index_search.py +92 -0
- quickshell_mcp-1.4.1/tests/test_live.py +37 -0
- quickshell_mcp-1.4.1/tests/test_qt_docs.py +167 -0
- quickshell_mcp-1.4.1/tests/test_search_all.py +208 -0
- quickshell_mcp-1.4.1/tests/test_validate.py +753 -0
- quickshell_mcp-1.4.1/tests/test_versions.py +106 -0
|
@@ -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
|
+
}
|