mcp-postgresql-ops 3.4.1__tar.gz → 3.4.3__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 (76) hide show
  1. mcp_postgresql_ops-3.4.1/README.md → mcp_postgresql_ops-3.4.3/PKG-INFO +20 -14
  2. mcp_postgresql_ops-3.4.1/src/mcp_postgresql_ops.egg-info/PKG-INFO → mcp_postgresql_ops-3.4.3/README.md +2 -32
  3. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.3}/scripts/check_release.py +3 -6
  4. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.3}/scripts/publish_release.py +1 -3
  5. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.3/src/mcp_postgresql_ops.egg-info}/PKG-INFO +3 -15
  6. mcp_postgresql_ops-3.4.3/src/mcp_postgresql_ops.egg-info/scm_version.json +8 -0
  7. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.3}/tests/test_release.py +30 -14
  8. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.3}/uv.lock +100 -69
  9. mcp_postgresql_ops-3.4.1/src/mcp_postgresql_ops.egg-info/scm_version.json +0 -8
  10. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.3}/.env.example +0 -0
  11. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.3}/.github/CONTRIBUTING.md +0 -0
  12. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.3}/.github/FUNDING.yml +0 -0
  13. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.3}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  14. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.3}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  15. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.3}/.github/ISSUE_TEMPLATE/documentation.md +0 -0
  16. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.3}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  17. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.3}/.github/ISSUE_TEMPLATE/question.md +0 -0
  18. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.3}/.github/copilot-instructions.md +0 -0
  19. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.3}/.github/dependabot.yml +0 -0
  20. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.3}/.github/pull_request_template.md +0 -0
  21. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.3}/.github/workflows/pypi-publish.yml +0 -0
  22. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.3}/.github/workflows/test.yml +0 -0
  23. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.3}/.gitignore +0 -0
  24. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.3}/.gitleaks.toml +0 -0
  25. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.3}/.pre-commit-config.yaml +0 -0
  26. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.3}/.python-version +0 -0
  27. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.3}/Dockerfile.MCP-Server +0 -0
  28. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.3}/Dockerfile.MCPO-Proxy +0 -0
  29. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.3}/LICENSE +0 -0
  30. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.3}/MANIFEST.in +0 -0
  31. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.3}/SECURITY.md +0 -0
  32. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.3}/_config.yml +0 -0
  33. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.3}/_includes/head-custom-google-analytics.html +0 -0
  34. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.3}/build-mcp-server-docker-image.sh +0 -0
  35. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.3}/build-mcpo-server-docker-image.sh +0 -0
  36. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.3}/docker-compose.custom-db.yml +0 -0
  37. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.3}/docker-compose.yml +0 -0
  38. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.3}/img/MCP-Workflow-of-Quickstart-Tutorial.png +0 -0
  39. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.3}/img/screenshot-000.png +0 -0
  40. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.3}/img/screenshot-001.png +0 -0
  41. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.3}/img/screenshot-002.png +0 -0
  42. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.3}/img/screenshot-004.png +0 -0
  43. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.3}/img/screenshot-005.png +0 -0
  44. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.3}/img/screenshot-claude-desktop-airflow-connections-html.png +0 -0
  45. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.3}/img/screenshot-claude-desktop-mermaid-diagram.png +0 -0
  46. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.3}/img/screenshot-claude-desktop-question-001.png +0 -0
  47. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.3}/img/screenshot-swagger-api.png +0 -0
  48. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.3}/mcp-config.json.http +0 -0
  49. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.3}/mcp-config.json.stdio +0 -0
  50. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.3}/pyproject.toml +0 -0
  51. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.3}/run-mcp-inspector-local.sh +0 -0
  52. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.3}/run-mcp-inspector-pypi.sh +0 -0
  53. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.3}/scripts/create-test-data.sh +0 -0
  54. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.3}/scripts/create-test-data.sql +0 -0
  55. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.3}/scripts/enable-pgsql-extensions.sh +0 -0
  56. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.3}/scripts/mcp-server-docker-cmd.sh +0 -0
  57. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.3}/setup.cfg +0 -0
  58. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.3}/src/mcp_postgresql_ops/__init__.py +0 -0
  59. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.3}/src/mcp_postgresql_ops/__main__.py +0 -0
  60. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.3}/src/mcp_postgresql_ops/functions.py +0 -0
  61. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.3}/src/mcp_postgresql_ops/mcp_main.py +0 -0
  62. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.3}/src/mcp_postgresql_ops/prompt_template.md +0 -0
  63. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.3}/src/mcp_postgresql_ops/version_compat.py +0 -0
  64. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.3}/src/mcp_postgresql_ops.egg-info/SOURCES.txt +0 -0
  65. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.3}/src/mcp_postgresql_ops.egg-info/dependency_links.txt +0 -0
  66. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.3}/src/mcp_postgresql_ops.egg-info/entry_points.txt +0 -0
  67. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.3}/src/mcp_postgresql_ops.egg-info/requires.txt +0 -0
  68. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.3}/src/mcp_postgresql_ops.egg-info/scm_file_list.json +0 -0
  69. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.3}/src/mcp_postgresql_ops.egg-info/top_level.txt +0 -0
  70. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.3}/tests/__init__.py +0 -0
  71. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.3}/tests/conftest.py +0 -0
  72. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.3}/tests/docker/docker-compose.test.yml +0 -0
  73. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.3}/tests/docker/init-test-db.sql +0 -0
  74. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.3}/tests/test_tool_schema_null_defaults.py +0 -0
  75. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.3}/tests/test_tools_integration.py +0 -0
  76. {mcp_postgresql_ops-3.4.1 → mcp_postgresql_ops-3.4.3}/tests/test_version_compat.py +0 -0
@@ -1,5 +1,25 @@
1
+ Metadata-Version: 2.4
2
+ Name: mcp-postgresql-ops
3
+ Version: 3.4.3
4
+ Summary: Add your description here
5
+ Author-email: JungJungIn <call518@gmail.com>
6
+ Requires-Python: >=3.12
7
+ Description-Content-Type: text/markdown
8
+ License-File: LICENSE
9
+ Requires-Dist: fastmcp>=2.12.3
10
+ Requires-Dist: asyncpg>=0.29.0
11
+ Requires-Dist: psycopg2-binary>=2.9.7
12
+ Requires-Dist: setuptools-scm>=10.0.5
13
+ Requires-Dist: pre-commit>=4.6.0
14
+ Provides-Extra: dev
15
+ Requires-Dist: pytest>=7.0.0; extra == "dev"
16
+ Requires-Dist: pytest-asyncio>=0.21.0; extra == "dev"
17
+ Dynamic: license-file
18
+
1
19
  # MCP Server for PostgreSQL Operations and Monitoring
2
20
 
21
+ [![MCPVault: claimed](https://mcpvault.io/badge/mcp-postgresql-ops.svg?theme=dark)](https://mcpvault.io/servers/mcp-postgresql-ops/health?utm_source=external_badge&utm_medium=referral&utm_campaign=mcp_health_report)
22
+
3
23
  [![MCP Toplist](https://mcptoplist.com/badge/smithery%2Fcall518%2Fmcp-postgresql-ops.svg)](https://mcptoplist.com/server/smithery%2Fcall518%2Fmcp-postgresql-ops)
4
24
 
5
25
  [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)
@@ -291,20 +311,6 @@ The `create-test-data.sql` script is executed by the `postgres-init-extensions`
291
311
 
292
312
  ---
293
313
 
294
- ## Tagged Releases
295
-
296
- The GitHub Actions workflow publishes a pushed version tag (for example,
297
- `v1.2.3`, `1.2.3`, or `1.2.3rc1`) to TestPyPI, then PyPI, and finally creates
298
- a GitHub Release with the tag as its title. Both distribution versions must match
299
- the tag. The existing `testpypi` and `pypi` GitHub environments must have Trusted
300
- Publishing configured on their respective package indexes.
301
-
302
- Release notes include full commit messages since the most recently published
303
- GitHub Release, or all commits for the first release. The previous release tag
304
- must be an ancestor of the new tag. Alpha, beta, and release candidate tags create
305
- prereleases. Existing published releases are preserved; an existing draft requires
306
- manual review. A failed publication prevents subsequent publication jobs.
307
-
308
314
  ## Installation
309
315
 
310
316
  ### From PyPI (Recommended)
@@ -1,23 +1,7 @@
1
- Metadata-Version: 2.4
2
- Name: mcp-postgresql-ops
3
- Version: 3.4.1
4
- Summary: Add your description here
5
- Author-email: JungJungIn <call518@gmail.com>
6
- Requires-Python: >=3.12
7
- Description-Content-Type: text/markdown
8
- License-File: LICENSE
9
- Requires-Dist: fastmcp>=2.12.3
10
- Requires-Dist: asyncpg>=0.29.0
11
- Requires-Dist: psycopg2-binary>=2.9.7
12
- Requires-Dist: setuptools-scm>=10.0.5
13
- Requires-Dist: pre-commit>=4.6.0
14
- Provides-Extra: dev
15
- Requires-Dist: pytest>=7.0.0; extra == "dev"
16
- Requires-Dist: pytest-asyncio>=0.21.0; extra == "dev"
17
- Dynamic: license-file
18
-
19
1
  # MCP Server for PostgreSQL Operations and Monitoring
20
2
 
3
+ [![MCPVault: claimed](https://mcpvault.io/badge/mcp-postgresql-ops.svg?theme=dark)](https://mcpvault.io/servers/mcp-postgresql-ops/health?utm_source=external_badge&utm_medium=referral&utm_campaign=mcp_health_report)
4
+
21
5
  [![MCP Toplist](https://mcptoplist.com/badge/smithery%2Fcall518%2Fmcp-postgresql-ops.svg)](https://mcptoplist.com/server/smithery%2Fcall518%2Fmcp-postgresql-ops)
22
6
 
23
7
  [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)
@@ -309,20 +293,6 @@ The `create-test-data.sql` script is executed by the `postgres-init-extensions`
309
293
 
310
294
  ---
311
295
 
312
- ## Tagged Releases
313
-
314
- The GitHub Actions workflow publishes a pushed version tag (for example,
315
- `v1.2.3`, `1.2.3`, or `1.2.3rc1`) to TestPyPI, then PyPI, and finally creates
316
- a GitHub Release with the tag as its title. Both distribution versions must match
317
- the tag. The existing `testpypi` and `pypi` GitHub environments must have Trusted
318
- Publishing configured on their respective package indexes.
319
-
320
- Release notes include full commit messages since the most recently published
321
- GitHub Release, or all commits for the first release. The previous release tag
322
- must be an ancestor of the new tag. Alpha, beta, and release candidate tags create
323
- prereleases. Existing published releases are preserved; an existing draft requires
324
- manual review. A failed publication prevents subsequent publication jobs.
325
-
326
296
  ## Installation
327
297
 
328
298
  ### From PyPI (Recommended)
@@ -10,13 +10,10 @@ from pathlib import Path
10
10
 
11
11
  def release_version(tag: str) -> str:
12
12
  """Validate a canonical release tag and return its package version."""
13
- version = tag.removeprefix("v")
14
13
  number = r"(?:0|[1-9][0-9]*)"
15
- if not re.fullmatch(
16
- rf"{number}\.{number}\.{number}(?:(?:a|b|rc){number})?", version
17
- ):
18
- raise ValueError("Use a tag such as 0.5.7, v0.5.7, or 0.5.7rc1")
19
- return version
14
+ if not re.fullmatch(rf"{number}\.{number}\.{number}", tag):
15
+ raise ValueError("Use a numeric major.minor.patch tag such as 0.5.7")
16
+ return tag
20
17
 
21
18
 
22
19
  def check_release(tag: str, directory: Path) -> None:
@@ -69,7 +69,7 @@ def release_notes(repository: str, tag: str, previous: str | None) -> str:
69
69
 
70
70
  def publish_release(repository: str, tag: str) -> None:
71
71
  """Create a release once, using the last published release as the baseline."""
72
- version = release_version(tag)
72
+ release_version(tag)
73
73
  current = command("git", "rev-parse", "--verify", f"refs/tags/{tag}^{{commit}}")
74
74
  remote = command("gh", "api", f"repos/{repository}/commits/{tag}", "--jq", ".sha")
75
75
  if current != remote or current != command("git", "rev-parse", "HEAD"):
@@ -117,8 +117,6 @@ def publish_release(repository: str, tag: str) -> None:
117
117
  "--notes-file",
118
118
  str(path),
119
119
  ]
120
- if re.search(r"(?:a|b|rc)\d+$", version):
121
- args.extend(["--prerelease", "--latest=false"])
122
120
  command(*args)
123
121
  print(f"Published GitHub Release {tag} (previous release: {previous or 'none'}).")
124
122
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mcp-postgresql-ops
3
- Version: 3.4.1
3
+ Version: 3.4.3
4
4
  Summary: Add your description here
5
5
  Author-email: JungJungIn <call518@gmail.com>
6
6
  Requires-Python: >=3.12
@@ -18,6 +18,8 @@ Dynamic: license-file
18
18
 
19
19
  # MCP Server for PostgreSQL Operations and Monitoring
20
20
 
21
+ [![MCPVault: claimed](https://mcpvault.io/badge/mcp-postgresql-ops.svg?theme=dark)](https://mcpvault.io/servers/mcp-postgresql-ops/health?utm_source=external_badge&utm_medium=referral&utm_campaign=mcp_health_report)
22
+
21
23
  [![MCP Toplist](https://mcptoplist.com/badge/smithery%2Fcall518%2Fmcp-postgresql-ops.svg)](https://mcptoplist.com/server/smithery%2Fcall518%2Fmcp-postgresql-ops)
22
24
 
23
25
  [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)
@@ -309,20 +311,6 @@ The `create-test-data.sql` script is executed by the `postgres-init-extensions`
309
311
 
310
312
  ---
311
313
 
312
- ## Tagged Releases
313
-
314
- The GitHub Actions workflow publishes a pushed version tag (for example,
315
- `v1.2.3`, `1.2.3`, or `1.2.3rc1`) to TestPyPI, then PyPI, and finally creates
316
- a GitHub Release with the tag as its title. Both distribution versions must match
317
- the tag. The existing `testpypi` and `pypi` GitHub environments must have Trusted
318
- Publishing configured on their respective package indexes.
319
-
320
- Release notes include full commit messages since the most recently published
321
- GitHub Release, or all commits for the first release. The previous release tag
322
- must be an ancestor of the new tag. Alpha, beta, and release candidate tags create
323
- prereleases. Existing published releases are preserved; an existing draft requires
324
- manual review. A failed publication prevents subsequent publication jobs.
325
-
326
314
  ## Installation
327
315
 
328
316
  ### From PyPI (Recommended)
@@ -0,0 +1,8 @@
1
+ {
2
+ "tag": "3.4.3",
3
+ "distance": 0,
4
+ "node": "gc6c53317d8f3a6691bdf37540536dc8451a855d0",
5
+ "dirty": false,
6
+ "branch": "HEAD",
7
+ "node_date": "2026-10-25"
8
+ }
@@ -16,12 +16,18 @@ from scripts.check_release import check_release, release_version
16
16
  from scripts.publish_release import publish_release, release_notes
17
17
 
18
18
 
19
- @pytest.mark.parametrize("tag", ["1.2.3", "v1.2.3", "1.2.3rc1"])
19
+ @pytest.mark.parametrize("tag", ["0.0.0", "1.2.3", "10.20.30"])
20
20
  def test_release_version(tag):
21
- assert release_version(tag) == tag.removeprefix("v")
21
+ assert release_version(tag) == tag
22
22
 
23
23
 
24
- @pytest.mark.parametrize("tag", ["latest", "1.2", "v01.2.3", "1.2.3+local"])
24
+ @pytest.mark.parametrize(
25
+ "tag",
26
+ [
27
+ "latest", "1.2", "1.2.3.4", "v1.2.3", "01.2.3", "1.02.3", "1.2.03",
28
+ "1.2.3a1", "1.2.3b1", "1.2.3rc1", "1.2.3+local", "1..3", "1.2.3",
29
+ ],
30
+ )
25
31
  def test_invalid_release_version(tag):
26
32
  with pytest.raises(ValueError):
27
33
  release_version(tag)
@@ -37,20 +43,20 @@ def test_distribution_versions(tmp_path, version):
37
43
  info.size = len(metadata)
38
44
  archive.addfile(info, io.BytesIO(metadata))
39
45
  if version == "1.2.3":
40
- check_release("v1.2.3", tmp_path)
46
+ check_release("1.2.3", tmp_path)
41
47
  else:
42
48
  with pytest.raises(ValueError, match="expected"):
43
- check_release("v1.2.3", tmp_path)
49
+ check_release("1.2.3", tmp_path)
44
50
 
45
51
 
46
52
  def test_notes_use_previous_release_and_preserve_messages():
47
53
  message = "Fix issue\n\n```\n$(touch unwanted)\n```"
48
54
  with patch("scripts.publish_release.command") as command:
49
55
  command.side_effect = ["new", "old", "", f"abcdef123\0{message}\0"]
50
- notes = release_notes("owner/repo", "v1.2.3", "v1.2.2")
56
+ notes = release_notes("owner/repo", "1.2.3", "1.2.2")
51
57
  assert message in notes
52
58
  assert "````text" in notes
53
- assert "compare/v1.2.2...v1.2.3" in notes
59
+ assert "compare/1.2.2...1.2.3" in notes
54
60
  assert command.call_args.args[-2:] == ("old..new", "--")
55
61
 
56
62
 
@@ -59,28 +65,38 @@ def test_existing_release_is_not_overwritten(draft):
59
65
  with patch("scripts.publish_release.command") as command:
60
66
  command.side_effect = [
61
67
  "sha", "sha", "sha",
62
- json.dumps([[{"tag_name": "v1.2.3", "draft": draft}]]),
68
+ json.dumps([[{"tag_name": "1.2.3", "draft": draft}]]),
63
69
  ]
64
70
  if draft:
65
71
  with pytest.raises(ValueError, match="draft"):
66
- publish_release("owner/repo", "v1.2.3")
72
+ publish_release("owner/repo", "1.2.3")
67
73
  else:
68
- publish_release("owner/repo", "v1.2.3")
74
+ publish_release("owner/repo", "1.2.3")
69
75
  assert command.call_count == 4
70
76
 
71
77
 
72
- def test_first_prerelease_creation():
78
+ def test_first_release_creation():
73
79
  with patch("scripts.publish_release.command") as command:
74
80
  command.side_effect = ["sha", "sha", "sha", "[[]]", "sha", "", ""]
75
- publish_release("owner/repo", "v1.2.3rc1")
81
+ publish_release("owner/repo", "1.2.3")
76
82
  args = command.call_args.args
77
83
  assert args[:3] == ("gh", "release", "create")
78
- assert args[-2:] == ("--prerelease", "--latest=false")
84
+ assert args[3] == "1.2.3"
85
+ assert "--prerelease" not in args
86
+ assert "--latest=false" not in args
79
87
 
80
88
 
81
89
  def test_remote_tag_mismatch_stops_publication():
82
90
  with patch("scripts.publish_release.command") as command:
83
91
  command.side_effect = ["local", "remote"]
84
92
  with pytest.raises(ValueError, match="must match"):
85
- publish_release("owner/repo", "v1.2.3")
93
+ publish_release("owner/repo", "1.2.3")
86
94
  assert command.call_count == 2
95
+
96
+
97
+ @pytest.mark.parametrize("tag", ["v1.2.3", "1.2.3rc1"])
98
+ def test_invalid_tag_stops_publication(tag):
99
+ with patch("scripts.publish_release.command") as command:
100
+ with pytest.raises(ValueError):
101
+ publish_release("owner/repo", tag)
102
+ command.assert_not_called()
@@ -1,5 +1,5 @@
1
1
  version = 1
2
- revision = 3
2
+ revision = 2
3
3
  requires-python = ">=3.12"
4
4
  resolution-markers = [
5
5
  "python_full_version >= '3.14' and sys_platform == 'win32'",
@@ -128,11 +128,11 @@ wheels = [
128
128
 
129
129
  [[package]]
130
130
  name = "certifi"
131
- version = "2025.8.3"
131
+ version = "2026.10.19"
132
132
  source = { registry = "https://pypi.org/simple" }
133
- sdist = { url = "https://files.pythonhosted.org/packages/dc/67/960ebe6bf230a96cda2e0abcf73af550ec4f090005363542f0765df162e0/certifi-2025.8.3.tar.gz", hash = "sha256:e564105f78ded564e3ae7c923924435e1daa7463faeab5bb932bc53ffae63407", size = 162386, upload-time = "2025-08-03T03:07:47.08Z" }
133
+ sdist = { url = "https://files.pythonhosted.org/packages/a6/bd/1436c50cc46699de0230fbaacc1d1de7bfec413176099949e9d5112e88f2/certifi-2026.10.19.tar.gz", hash = "sha256:035c1e85572b141bf1c3a3eff0e33a8eb74917522f2559075ff8d2fea780a1ae", size = 137598, upload-time = "2026-10-20T02:24:16.604Z" }
134
134
  wheels = [
135
- { url = "https://files.pythonhosted.org/packages/e5/48/1549795ba7742c948d2ad169c1c8cdbae65bc450d6cd753d124b17c8cd32/certifi-2025.8.3-py3-none-any.whl", hash = "sha256:f6c12493cfb1b06ba2ff328595af9350c65d6644968e5d3a2ffd78699af217a5", size = 161216, upload-time = "2025-08-03T03:07:45.777Z" },
135
+ { url = "https://files.pythonhosted.org/packages/c4/51/29046e48f693c54e5b7412216d447a1d8362c9653148d98c02cdf65fa733/certifi-2026.10.19-py3-none-any.whl", hash = "sha256:42d35340cc5b9ba78e818ddbff0c5b1c2b779de448a340fd1b989f5fa8670e1b", size = 136464, upload-time = "2026-10-20T02:24:15.072Z" },
136
136
  ]
137
137
 
138
138
  [[package]]
@@ -331,11 +331,11 @@ wheels = [
331
331
 
332
332
  [[package]]
333
333
  name = "distlib"
334
- version = "0.4.0"
334
+ version = "0.4.4"
335
335
  source = { registry = "https://pypi.org/simple" }
336
- sdist = { url = "https://files.pythonhosted.org/packages/96/8e/709914eb2b5749865801041647dc7f4e6d00b549cfe88b65ca192995f07c/distlib-0.4.0.tar.gz", hash = "sha256:feec40075be03a04501a973d81f633735b4b69f98b05450592310c0f401a4e0d", size = 614605, upload-time = "2025-07-17T16:52:00.465Z" }
336
+ sdist = { url = "https://files.pythonhosted.org/packages/68/bc/d36966de7304047a1001a7559fbf266c464bb5d8cc85464536ef8c9bcc32/distlib-0.4.4.tar.gz", hash = "sha256:ca4175b4ac7f71223cc30ed7248c45d2b38c2439d8ee6e498ab67ed63cf3508d", size = 621304, upload-time = "2026-10-16T13:56:34.203Z" }
337
337
  wheels = [
338
- { url = "https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl", hash = "sha256:9659f7d87e46584a30b5780e43ac7a2143098441670ff0a49d5f9034c54a6c16", size = 469047, upload-time = "2025-07-17T16:51:58.613Z" },
338
+ { url = "https://files.pythonhosted.org/packages/c1/2b/238f02a4927fa2e27aa995371d240a468b52e42eae44a678434aff736b38/distlib-0.4.4-py2.py3-none-any.whl", hash = "sha256:cf09d55b1e85a89576b036aeb71550bfd68320f3f21761ca329eadadad918638", size = 472099, upload-time = "2026-10-16T13:56:32.053Z" },
339
339
  ]
340
340
 
341
341
  [[package]]
@@ -392,44 +392,84 @@ wheels = [
392
392
 
393
393
  [[package]]
394
394
  name = "fastmcp"
395
- version = "3.2.0"
395
+ version = "3.4.10"
396
396
  source = { registry = "https://pypi.org/simple" }
397
397
  dependencies = [
398
+ { name = "fastmcp-slim", extra = ["client", "server"] },
399
+ ]
400
+ sdist = { url = "https://files.pythonhosted.org/packages/7e/ce/b2057fd2d3e453048ffae962c746ef7bcb9cf6700086fb1dfcff8a8ba65d/fastmcp-3.4.10.tar.gz", hash = "sha256:c6474855d6230cce4feb7084d654ba518578b25856c6ef26a2ff2d806ef68969", size = 28866789, upload-time = "2026-10-20T14:49:39.101Z" }
401
+ wheels = [
402
+ { url = "https://files.pythonhosted.org/packages/40/c4/72da20dfbfce1c99e3c70bc973e736744daf6d461de138f52f9aaa558959/fastmcp-3.4.10-py3-none-any.whl", hash = "sha256:68f422db0a7c6228142663f17d9f79a5a12a509e1408a8ac207b3e442e166e38", size = 8026, upload-time = "2026-10-20T14:49:37.137Z" },
403
+ ]
404
+
405
+ [[package]]
406
+ name = "fastmcp-slim"
407
+ version = "3.4.10"
408
+ source = { registry = "https://pypi.org/simple" }
409
+ dependencies = [
410
+ { name = "platformdirs" },
411
+ { name = "pydantic", version = "2.11.9", source = { registry = "https://pypi.org/simple" }, extra = ["email"], marker = "python_full_version < '3.14'" },
412
+ { name = "pydantic", version = "2.13.4", source = { registry = "https://pypi.org/simple" }, extra = ["email"], marker = "python_full_version >= '3.14'" },
413
+ { name = "pydantic-settings" },
414
+ { name = "python-dotenv" },
415
+ { name = "rich" },
416
+ { name = "typing-extensions" },
417
+ ]
418
+ sdist = { url = "https://files.pythonhosted.org/packages/98/3b/28be7f0963fee1c848e78898d801e1232dd2e05b6e37026c400a788caa9a/fastmcp_slim-3.4.10.tar.gz", hash = "sha256:d80ae606ead8dfefa1f21b009929824210ea87eb4b422653a1be8dca61797ccd", size = 610326, upload-time = "2026-10-20T14:49:15.096Z" }
419
+ wheels = [
420
+ { url = "https://files.pythonhosted.org/packages/7c/28/1e0681b524191ee170f40e8e800fd3785084e12806fc46675c70d7f8fa43/fastmcp_slim-3.4.10-py3-none-any.whl", hash = "sha256:f388941db8bdf38999e6c9d2536c4cd59a6571908d851cee2d10ee59f4e53532", size = 785895, upload-time = "2026-10-20T14:49:13.466Z" },
421
+ ]
422
+
423
+ [package.optional-dependencies]
424
+ client = [
425
+ { name = "authlib" },
426
+ { name = "exceptiongroup" },
427
+ { name = "httpx" },
428
+ { name = "mcp" },
429
+ { name = "opentelemetry-api" },
430
+ { name = "py-key-value-aio", extra = ["filetree", "keyring", "memory"] },
431
+ { name = "starlette" },
432
+ ]
433
+ server = [
398
434
  { name = "authlib" },
399
435
  { name = "cyclopts" },
400
436
  { name = "exceptiongroup" },
437
+ { name = "griffelib" },
401
438
  { name = "httpx" },
439
+ { name = "joserfc" },
402
440
  { name = "jsonref" },
403
441
  { name = "jsonschema-path" },
404
442
  { name = "mcp" },
405
443
  { name = "openapi-pydantic" },
406
444
  { name = "opentelemetry-api" },
407
445
  { name = "packaging" },
408
- { name = "platformdirs" },
409
446
  { name = "py-key-value-aio", extra = ["filetree", "keyring", "memory"] },
410
- { name = "pydantic", version = "2.11.9", source = { registry = "https://pypi.org/simple" }, extra = ["email"], marker = "python_full_version < '3.14'" },
411
- { name = "pydantic", version = "2.13.4", source = { registry = "https://pypi.org/simple" }, extra = ["email"], marker = "python_full_version >= '3.14'" },
412
447
  { name = "pyperclip" },
413
- { name = "python-dotenv" },
448
+ { name = "python-multipart" },
414
449
  { name = "pyyaml" },
415
- { name = "rich" },
450
+ { name = "starlette" },
416
451
  { name = "uncalled-for" },
417
452
  { name = "uvicorn" },
418
453
  { name = "watchfiles" },
419
454
  { name = "websockets" },
420
455
  ]
421
- sdist = { url = "https://files.pythonhosted.org/packages/d0/32/4f1b2cfd7b50db89114949f90158b1dcc2c92a1917b9f57c0ff24e47a2f4/fastmcp-3.2.0.tar.gz", hash = "sha256:d4830b8ffc3592d3d9c76dc0f398904cf41f04910e41a0de38cc1004e0903bef", size = 26318581, upload-time = "2026-03-30T20:25:37.692Z" }
456
+
457
+ [[package]]
458
+ name = "filelock"
459
+ version = "4.2.1"
460
+ source = { registry = "https://pypi.org/simple" }
461
+ sdist = { url = "https://files.pythonhosted.org/packages/d5/98/771d8ca889f220d7d7e352addf500666368f0fd081c6080a83767580c6e4/filelock-4.2.1.tar.gz", hash = "sha256:c4c937ccac2a813cee448e662a56366cfb374c0f8702e75f295c412cc1c5d5a3", size = 650997, upload-time = "2026-10-17T16:48:14.435Z" }
422
462
  wheels = [
423
- { url = "https://files.pythonhosted.org/packages/4f/67/684fa2d2de1e7504549d4ca457b4f854ccec3cd3be03bd86b33b599fbf58/fastmcp-3.2.0-py3-none-any.whl", hash = "sha256:e71aba3df16f86f546a4a9e513261d3233bcc92bef0dfa647bac3fa33623f681", size = 705550, upload-time = "2026-03-30T20:25:35.499Z" },
463
+ { url = "https://files.pythonhosted.org/packages/28/00/db89d339bc4ecdc8087fa7b8607ba22ffc27bf96286f340c9620bea428b3/filelock-4.2.1-py3-none-any.whl", hash = "sha256:7be2662e9e826b9bba28afc0f843a123280d799a2ea44bb5d35ccec67905ae44", size = 162455, upload-time = "2026-10-17T16:48:12.937Z" },
424
464
  ]
425
465
 
426
466
  [[package]]
427
- name = "filelock"
428
- version = "3.29.0"
467
+ name = "griffelib"
468
+ version = "2.4.1"
429
469
  source = { registry = "https://pypi.org/simple" }
430
- sdist = { url = "https://files.pythonhosted.org/packages/b5/fe/997687a931ab51049acce6fa1f23e8f01216374ea81374ddee763c493db5/filelock-3.29.0.tar.gz", hash = "sha256:69974355e960702e789734cb4871f884ea6fe50bd8404051a3530bc07809cf90", size = 57571, upload-time = "2026-04-19T15:39:10.068Z" }
470
+ sdist = { url = "https://files.pythonhosted.org/packages/36/e2/0f5d8ed08766bc6dcd3eebf5a6623d83cbca33a6e4c90aef57156ce745ad/griffelib-2.4.1.tar.gz", hash = "sha256:40c028dd2e623f464423f0e11e3c553158f1cf4f1368239a370534d73e1407ff", size = 245153, upload-time = "2026-10-22T11:20:03.705Z" }
431
471
  wheels = [
432
- { url = "https://files.pythonhosted.org/packages/81/47/dd9a212ef6e343a6857485ffe25bba537304f1913bdbed446a23f7f592e1/filelock-3.29.0-py3-none-any.whl", hash = "sha256:96f5f6344709aa1572bbf631c640e4ebeeb519e08da902c39a001882f30ac258", size = 39812, upload-time = "2026-04-19T15:39:08.752Z" },
472
+ { url = "https://files.pythonhosted.org/packages/de/02/1156d5f5307f573b901b14373848b84e69ca6cab09169b8cc97d16a181f9/griffelib-2.4.1-py3-none-any.whl", hash = "sha256:76bc562f936ad1ce198d2cf6d0731bd5c92a7d934b69ef828ef22ee0ffdb62ce", size = 172983, upload-time = "2026-10-22T11:19:59.843Z" },
433
473
  ]
434
474
 
435
475
  [[package]]
@@ -496,18 +536,6 @@ wheels = [
496
536
  { url = "https://files.pythonhosted.org/packages/d2/23/408243171aa9aaba178d3e2559159c24c1171a641aa83b67bdd3394ead8e/idna-3.15-py3-none-any.whl", hash = "sha256:048adeaf8c2d788c40fee287673ccaa74c24ffd8dcf09ffa555a2fbb59f10ac8", size = 72340, upload-time = "2026-05-12T22:45:55.733Z" },
497
537
  ]
498
538
 
499
- [[package]]
500
- name = "importlib-metadata"
501
- version = "8.7.1"
502
- source = { registry = "https://pypi.org/simple" }
503
- dependencies = [
504
- { name = "zipp" },
505
- ]
506
- sdist = { url = "https://files.pythonhosted.org/packages/f3/49/3b30cad09e7771a4982d9975a8cbf64f00d4a1ececb53297f1d9a7be1b10/importlib_metadata-8.7.1.tar.gz", hash = "sha256:49fef1ae6440c182052f407c8d34a68f72efc36db9ca90dc0113398f2fdde8bb", size = 57107, upload-time = "2025-12-21T10:00:19.278Z" }
507
- wheels = [
508
- { url = "https://files.pythonhosted.org/packages/fa/5e/f8e9a1d23b9c20a551a8a02ea3637b4642e22c2626e3a13a9a29cdea99eb/importlib_metadata-8.7.1-py3-none-any.whl", hash = "sha256:5a1f80bf1daa489495071efbb095d75a634cf28a8bc299581244063b53176151", size = 27865, upload-time = "2025-12-21T10:00:18.329Z" },
509
- ]
510
-
511
539
  [[package]]
512
540
  name = "iniconfig"
513
541
  version = "2.1.0"
@@ -559,6 +587,18 @@ wheels = [
559
587
  { url = "https://files.pythonhosted.org/packages/b2/a3/e137168c9c44d18eff0376253da9f1e9234d0239e0ee230d2fee6cea8e55/jeepney-0.9.0-py3-none-any.whl", hash = "sha256:97e5714520c16fc0a45695e5365a2e11b81ea79bba796e26f9f1d178cb182683", size = 49010, upload-time = "2025-02-27T18:51:00.104Z" },
560
588
  ]
561
589
 
590
+ [[package]]
591
+ name = "joserfc"
592
+ version = "1.7.7"
593
+ source = { registry = "https://pypi.org/simple" }
594
+ dependencies = [
595
+ { name = "cryptography" },
596
+ ]
597
+ sdist = { url = "https://files.pythonhosted.org/packages/bd/15/48ff246732232d35ee234228def22b52455fcc55577f06146602399a29b0/joserfc-1.7.7.tar.gz", hash = "sha256:471d0fd12a5a0d1c0942de280f39efe6f597878315033270b504d4d006d25510", size = 237446, upload-time = "2026-10-19T00:30:29.974Z" }
598
+ wheels = [
599
+ { url = "https://files.pythonhosted.org/packages/df/9f/934db284aa22f37af59708e382903860d4b81329c137b1b0ed2745daeb65/joserfc-1.7.7-py3-none-any.whl", hash = "sha256:06979cfbab78bc802f14c0358f32969826cc26720e13cb38926ffdc86bc0cb2c", size = 71758, upload-time = "2026-10-19T00:30:28.498Z" },
600
+ ]
601
+
562
602
  [[package]]
563
603
  name = "jsonref"
564
604
  version = "1.1.0"
@@ -737,24 +777,23 @@ wheels = [
737
777
 
738
778
  [[package]]
739
779
  name = "opentelemetry-api"
740
- version = "1.40.0"
780
+ version = "1.45.1"
741
781
  source = { registry = "https://pypi.org/simple" }
742
782
  dependencies = [
743
- { name = "importlib-metadata" },
744
783
  { name = "typing-extensions" },
745
784
  ]
746
- sdist = { url = "https://files.pythonhosted.org/packages/2c/1d/4049a9e8698361cc1a1aa03a6c59e4fa4c71e0c0f94a30f988a6876a2ae6/opentelemetry_api-1.40.0.tar.gz", hash = "sha256:159be641c0b04d11e9ecd576906462773eb97ae1b657730f0ecf64d32071569f", size = 70851, upload-time = "2026-03-04T14:17:21.555Z" }
785
+ sdist = { url = "https://files.pythonhosted.org/packages/2e/02/6e0ae9cc61bd3169d401077b507b3ebc344745171e1051ab430be012dcd9/opentelemetry_api-1.45.1.tar.gz", hash = "sha256:aa38ed19bcc084ba42782a73255b3582283eced7ad6dddbd6695189e69adfb75", size = 72804, upload-time = "2026-10-06T17:32:58.133Z" }
747
786
  wheels = [
748
- { url = "https://files.pythonhosted.org/packages/5f/bf/93795954016c522008da367da292adceed71cca6ee1717e1d64c83089099/opentelemetry_api-1.40.0-py3-none-any.whl", hash = "sha256:82dd69331ae74b06f6a874704be0cfaa49a1650e1537d4a813b86ecef7d0ecf9", size = 68676, upload-time = "2026-03-04T14:17:01.24Z" },
787
+ { url = "https://files.pythonhosted.org/packages/1e/41/f7dcf80b81ee8e71c1a2b59f14208bc723edbd89ed027a73b175abf6348e/opentelemetry_api-1.45.1-py3-none-any.whl", hash = "sha256:b31553efa588ae44bc306f863c785c5333a9ecc091248c6ee68b4b6c87fdedfb", size = 60256, upload-time = "2026-10-06T17:32:33.506Z" },
749
788
  ]
750
789
 
751
790
  [[package]]
752
791
  name = "packaging"
753
- version = "25.0"
792
+ version = "26.3"
754
793
  source = { registry = "https://pypi.org/simple" }
755
- sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload-time = "2025-04-19T11:48:59.673Z" }
794
+ sdist = { url = "https://files.pythonhosted.org/packages/7d/fa/3944b40b07da9ce895c0e6303a5ab7d53da063554f534556b134a54d6093/packaging-26.3.tar.gz", hash = "sha256:94edc256424af38762eb31306eed28beb9f0efc50a8837492c9d6fd6004aed79", size = 313412, upload-time = "2026-08-04T18:15:28.737Z" }
756
795
  wheels = [
757
- { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" },
796
+ { url = "https://files.pythonhosted.org/packages/63/34/ba1c580383c9eada3711951fef0795c80b829a078d72188184bcab9dd527/packaging-26.3-py3-none-any.whl", hash = "sha256:d7193f7c8e4e93f444fde0262bf90af30e16fa0ad0ad44cb553c87339b23cd1c", size = 129956, upload-time = "2026-08-04T18:15:27.159Z" },
758
797
  ]
759
798
 
760
799
  [[package]]
@@ -874,10 +913,10 @@ resolution-markers = [
874
913
  "python_full_version < '3.14' and sys_platform != 'win32'",
875
914
  ]
876
915
  dependencies = [
877
- { name = "annotated-types" },
878
- { name = "pydantic-core", version = "2.33.2", source = { registry = "https://pypi.org/simple" } },
879
- { name = "typing-extensions" },
880
- { name = "typing-inspection", version = "0.4.1", source = { registry = "https://pypi.org/simple" } },
916
+ { name = "annotated-types", marker = "python_full_version < '3.14'" },
917
+ { name = "pydantic-core", version = "2.33.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.14'" },
918
+ { name = "typing-extensions", marker = "python_full_version < '3.14'" },
919
+ { name = "typing-inspection", version = "0.4.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.14'" },
881
920
  ]
882
921
  sdist = { url = "https://files.pythonhosted.org/packages/ff/5d/09a551ba512d7ca404d785072700d3f6727a02f6f3c24ecfd081c7cf0aa8/pydantic-2.11.9.tar.gz", hash = "sha256:6b8ffda597a14812a7975c90b82a8a2e777d9257aba3453f973acd3c032a18e2", size = 788495, upload-time = "2025-09-13T11:26:39.325Z" }
883
922
  wheels = [
@@ -886,7 +925,7 @@ wheels = [
886
925
 
887
926
  [package.optional-dependencies]
888
927
  email = [
889
- { name = "email-validator" },
928
+ { name = "email-validator", marker = "python_full_version < '3.14'" },
890
929
  ]
891
930
 
892
931
  [[package]]
@@ -898,10 +937,10 @@ resolution-markers = [
898
937
  "python_full_version >= '3.14' and sys_platform != 'win32'",
899
938
  ]
900
939
  dependencies = [
901
- { name = "annotated-types" },
902
- { name = "pydantic-core", version = "2.46.4", source = { registry = "https://pypi.org/simple" } },
903
- { name = "typing-extensions" },
904
- { name = "typing-inspection", version = "0.4.2", source = { registry = "https://pypi.org/simple" } },
940
+ { name = "annotated-types", marker = "python_full_version >= '3.14'" },
941
+ { name = "pydantic-core", version = "2.46.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.14'" },
942
+ { name = "typing-extensions", marker = "python_full_version >= '3.14'" },
943
+ { name = "typing-inspection", version = "0.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.14'" },
905
944
  ]
906
945
  sdist = { url = "https://files.pythonhosted.org/packages/18/a5/b60d21ac674192f8ab0ba4e9fd860690f9b4a6e51ca5df118733b487d8d6/pydantic-2.13.4.tar.gz", hash = "sha256:c40756b57adaa8b1efeeced5c196f3f3b7c435f90e84ea7f443901bec8099ef6", size = 844775, upload-time = "2026-05-06T13:43:05.343Z" }
907
946
  wheels = [
@@ -910,7 +949,7 @@ wheels = [
910
949
 
911
950
  [package.optional-dependencies]
912
951
  email = [
913
- { name = "email-validator" },
952
+ { name = "email-validator", marker = "python_full_version >= '3.14'" },
914
953
  ]
915
954
 
916
955
  [[package]]
@@ -922,7 +961,7 @@ resolution-markers = [
922
961
  "python_full_version < '3.14' and sys_platform != 'win32'",
923
962
  ]
924
963
  dependencies = [
925
- { name = "typing-extensions" },
964
+ { name = "typing-extensions", marker = "python_full_version < '3.14'" },
926
965
  ]
927
966
  sdist = { url = "https://files.pythonhosted.org/packages/ad/88/5f2260bdfae97aabf98f1778d43f69574390ad787afb646292a638c923d4/pydantic_core-2.33.2.tar.gz", hash = "sha256:7cb8bc3605c29176e1b105350d2e6474142d7c1bd1d9327c4a9bdb46bf827acc", size = 435195, upload-time = "2025-04-23T18:33:52.104Z" }
928
967
  wheels = [
@@ -968,7 +1007,7 @@ resolution-markers = [
968
1007
  "python_full_version >= '3.14' and sys_platform != 'win32'",
969
1008
  ]
970
1009
  dependencies = [
971
- { name = "typing-extensions" },
1010
+ { name = "typing-extensions", marker = "python_full_version >= '3.14'" },
972
1011
  ]
973
1012
  sdist = { url = "https://files.pythonhosted.org/packages/9d/56/921726b776ace8d8f5db44c4ef961006580d91dc52b803c489fafd1aa249/pydantic_core-2.46.4.tar.gz", hash = "sha256:62f875393d7f270851f20523dd2e29f082bcc82292d66db2b64ea71f64b6e1c1", size = 471464, upload-time = "2026-05-06T13:37:06.98Z" }
974
1013
  wheels = [
@@ -1337,8 +1376,8 @@ name = "secretstorage"
1337
1376
  version = "3.5.0"
1338
1377
  source = { registry = "https://pypi.org/simple" }
1339
1378
  dependencies = [
1340
- { name = "cryptography" },
1341
- { name = "jeepney" },
1379
+ { name = "cryptography", marker = "sys_platform != 'win32'" },
1380
+ { name = "jeepney", marker = "sys_platform != 'win32'" },
1342
1381
  ]
1343
1382
  sdist = { url = "https://files.pythonhosted.org/packages/1c/03/e834bcd866f2f8a49a85eaff47340affa3bfa391ee9912a952a1faa68c7b/secretstorage-3.5.0.tar.gz", hash = "sha256:f04b8e4689cbce351744d5537bf6b1329c6fc68f91fa666f60a380edddcd11be", size = 19884, upload-time = "2025-11-23T19:02:53.191Z" }
1344
1383
  wheels = [
@@ -1347,11 +1386,11 @@ wheels = [
1347
1386
 
1348
1387
  [[package]]
1349
1388
  name = "setuptools"
1350
- version = "83.0.0"
1389
+ version = "84.1.0"
1351
1390
  source = { registry = "https://pypi.org/simple" }
1352
- sdist = { url = "https://files.pythonhosted.org/packages/34/26/f5d29e25ffdb535afef2d35cdb55b325298f96debd670da4c325e08d70f4/setuptools-83.0.0.tar.gz", hash = "sha256:025bccbbf0fa05b6192bc64ae1e7b16e001fd6d6d4d5de03c97b1c1ade523bef", size = 1154254, upload-time = "2026-07-04T15:31:22.699Z" }
1391
+ sdist = { url = "https://files.pythonhosted.org/packages/73/eb/7e5f628ee2eb168fecbf8026de7856b2543d6d609cc85f086b9a91ac93d6/setuptools-84.1.0.tar.gz", hash = "sha256:23657205b63d4d31395ab917815247f694aafad28cd21316bf5fd45a51048ea0", size = 1171783, upload-time = "2026-10-19T20:11:43.489Z" }
1353
1392
  wheels = [
1354
- { url = "https://files.pythonhosted.org/packages/5d/40/e1e72872c6354b306daef1703549e8e83b4d43cfea356311bf722a043752/setuptools-83.0.0-py3-none-any.whl", hash = "sha256:29b23c360f22f414dc7336bb39178cc7bcbf6021ed2733cde173f09dba19abb3", size = 1008090, upload-time = "2026-07-04T15:31:20.885Z" },
1393
+ { url = "https://files.pythonhosted.org/packages/18/02/b4bbb90f8f29e334898ff45c6d9b1fffaa6f378017052b3023a06262b5f7/setuptools-84.1.0-py3-none-any.whl", hash = "sha256:5231689c6ac8156cd155cfb98c3fd6fb252c3e7e9bd3d78b64d3c55f132624c9", size = 819380, upload-time = "2026-10-19T20:11:41.684Z" },
1355
1394
  ]
1356
1395
 
1357
1396
  [[package]]
@@ -1411,7 +1450,7 @@ resolution-markers = [
1411
1450
  "python_full_version < '3.14' and sys_platform != 'win32'",
1412
1451
  ]
1413
1452
  dependencies = [
1414
- { name = "typing-extensions" },
1453
+ { name = "typing-extensions", marker = "python_full_version < '3.14'" },
1415
1454
  ]
1416
1455
  sdist = { url = "https://files.pythonhosted.org/packages/f8/b1/0c11f5058406b3af7609f121aaa6b609744687f1d158b3c3a5bf4cc94238/typing_inspection-0.4.1.tar.gz", hash = "sha256:6ae134cc0203c33377d43188d4064e9b357dba58cff3185f22924610e70a9d28", size = 75726, upload-time = "2025-05-21T18:55:23.885Z" }
1417
1456
  wheels = [
@@ -1427,7 +1466,7 @@ resolution-markers = [
1427
1466
  "python_full_version >= '3.14' and sys_platform != 'win32'",
1428
1467
  ]
1429
1468
  dependencies = [
1430
- { name = "typing-extensions" },
1469
+ { name = "typing-extensions", marker = "python_full_version >= '3.14'" },
1431
1470
  ]
1432
1471
  sdist = { url = "https://files.pythonhosted.org/packages/55/e3/70399cb7dd41c10ac53367ae42139cf4b1ca5f36bb3dc6c9d33acdb43655/typing_inspection-0.4.2.tar.gz", hash = "sha256:ba561c48a67c5958007083d386c3295464928b01faa735ab8547c5692e87f464", size = 75949, upload-time = "2025-10-01T02:14:41.687Z" }
1433
1472
  wheels = [
@@ -1479,17 +1518,18 @@ wheels = [
1479
1518
 
1480
1519
  [[package]]
1481
1520
  name = "virtualenv"
1482
- version = "21.7.13"
1521
+ version = "21.14.13"
1483
1522
  source = { registry = "https://pypi.org/simple" }
1484
1523
  dependencies = [
1485
1524
  { name = "distlib" },
1486
1525
  { name = "filelock" },
1526
+ { name = "packaging" },
1487
1527
  { name = "platformdirs" },
1488
1528
  { name = "python-discovery" },
1489
1529
  ]
1490
- sdist = { url = "https://files.pythonhosted.org/packages/13/50/c9b84eb106d0db420b9878dac0a386c5791726f127ce20b06897f6e3a1e9/virtualenv-21.7.13.tar.gz", hash = "sha256:0355558b6f33619aab31347e43643b0ebc97f61ea3acf617b2b69e1f8a843d11", size = 5360306, upload-time = "2026-09-18T04:35:49.354Z" }
1530
+ sdist = { url = "https://files.pythonhosted.org/packages/70/aa/bff50daee0488e16d611258a9b6c5a1d0c9e128f8ca424e9f4e1c0444ef2/virtualenv-21.14.13.tar.gz", hash = "sha256:de5307ba4b9a0001d9c8ea02832d38f63ca432880f416c1bface61c4323fd905", size = 5570301, upload-time = "2026-10-22T20:10:16.952Z" }
1491
1531
  wheels = [
1492
- { url = "https://files.pythonhosted.org/packages/9a/ce/e74453531b0c49a58d0e8a4f9bab4495705859fee4a4f7de27d58f4a791a/virtualenv-21.7.13-py3-none-any.whl", hash = "sha256:1bea5af7463f59c4719db48fe739579a2a4f569c96f26c086edda85c96da9f59", size = 5328680, upload-time = "2026-09-18T04:35:47.194Z" },
1532
+ { url = "https://files.pythonhosted.org/packages/bb/a9/c10d8a44a29fb94a18b43fdf11f38caca53ae7c9406f11a72b1cb8f624f1/virtualenv-21.14.13-py3-none-any.whl", hash = "sha256:5fbb04138a4861580b78ba9110d529a26bc48fcc93c8ec36bc0202eeed96a788", size = 5557094, upload-time = "2026-10-22T20:10:15.096Z" },
1493
1533
  ]
1494
1534
 
1495
1535
  [[package]]
@@ -1606,12 +1646,3 @@ wheels = [
1606
1646
  { url = "https://files.pythonhosted.org/packages/9f/3e/28135a24e384493fa804216b79a6a6759a38cc4ff59118787b9fb693df93/websockets-16.0-cp314-cp314t-win_amd64.whl", hash = "sha256:b14dc141ed6d2dde437cddb216004bcac6a1df0935d79656387bd41632ba0bbd", size = 178531, upload-time = "2026-01-10T09:23:35.016Z" },
1607
1647
  { url = "https://files.pythonhosted.org/packages/6f/28/258ebab549c2bf3e64d2b0217b973467394a9cea8c42f70418ca2c5d0d2e/websockets-16.0-py3-none-any.whl", hash = "sha256:1637db62fad1dc833276dded54215f2c7fa46912301a24bd94d45d46a011ceec", size = 171598, upload-time = "2026-01-10T09:23:45.395Z" },
1608
1648
  ]
1609
-
1610
- [[package]]
1611
- name = "zipp"
1612
- version = "3.23.0"
1613
- source = { registry = "https://pypi.org/simple" }
1614
- sdist = { url = "https://files.pythonhosted.org/packages/e3/02/0f2892c661036d50ede074e376733dca2ae7c6eb617489437771209d4180/zipp-3.23.0.tar.gz", hash = "sha256:a07157588a12518c9d4034df3fbbee09c814741a33ff63c05fa29d26a2404166", size = 25547, upload-time = "2025-06-08T17:06:39.4Z" }
1615
- wheels = [
1616
- { url = "https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl", hash = "sha256:071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e", size = 10276, upload-time = "2025-06-08T17:06:38.034Z" },
1617
- ]
@@ -1,8 +0,0 @@
1
- {
2
- "tag": "3.4.1",
3
- "distance": 0,
4
- "node": "g040ffedb6a319f1cd3ceec18f5ec489bac8a41e1",
5
- "dirty": false,
6
- "branch": "HEAD",
7
- "node_date": "2026-10-24"
8
- }