pycastle 0.2.0.2.dev0__tar.gz → 0.2.0.5__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 (105) hide show
  1. pycastle-0.2.0.5/.github/workflows/publish.yml +95 -0
  2. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/PKG-INFO +1 -1
  3. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/pyproject.toml +2 -0
  4. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/src/pycastle/defaults/prompts/implement-prompt.md +3 -3
  5. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/src/pycastle/defaults/prompts/review-prompt.md +3 -5
  6. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/src/pycastle/docker_session.py +2 -2
  7. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/src/pycastle.egg-info/PKG-INFO +1 -1
  8. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/tests/test_docker_session.py +27 -1
  9. pycastle-0.2.0.2.dev0/.github/workflows/publish.yml +0 -104
  10. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/.gitignore +0 -0
  11. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/.python-version +0 -0
  12. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/CLAUDE.md +0 -0
  13. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/CONTEXT.md +0 -0
  14. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/LICENSE +0 -0
  15. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/README.md +0 -0
  16. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/docs/adr/0001-runtime-dependency-installation.md +0 -0
  17. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/docs/adr/0002-cli-native-model-shorthand-resolution.md +0 -0
  18. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/docs/agents/domain.md +0 -0
  19. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/docs/agents/issue-tracker.md +0 -0
  20. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/docs/agents/triage-labels.md +0 -0
  21. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/setup.cfg +0 -0
  22. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/src/pycastle/__init__.py +0 -0
  23. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/src/pycastle/_types.py +0 -0
  24. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/src/pycastle/agent_output_protocol.py +0 -0
  25. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/src/pycastle/agent_result.py +0 -0
  26. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/src/pycastle/agent_runner.py +0 -0
  27. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/src/pycastle/build_command.py +0 -0
  28. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/src/pycastle/config/__init__.py +0 -0
  29. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/src/pycastle/config/loader.py +0 -0
  30. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/src/pycastle/container_runner.py +0 -0
  31. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/src/pycastle/defaults/.gitignore +0 -0
  32. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/src/pycastle/defaults/Dockerfile +0 -0
  33. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/src/pycastle/defaults/config.py +0 -0
  34. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/src/pycastle/defaults/prompts/coding-standards/deep-modules.md +0 -0
  35. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/src/pycastle/defaults/prompts/coding-standards/interfaces.md +0 -0
  36. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/src/pycastle/defaults/prompts/coding-standards/mocking.md +0 -0
  37. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/src/pycastle/defaults/prompts/coding-standards/refactoring.md +0 -0
  38. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/src/pycastle/defaults/prompts/coding-standards/tests.md +0 -0
  39. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/src/pycastle/defaults/prompts/merge-prompt.md +0 -0
  40. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/src/pycastle/defaults/prompts/plan-prompt.md +0 -0
  41. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/src/pycastle/defaults/prompts/preflight-issue.md +0 -0
  42. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/src/pycastle/errors.py +0 -0
  43. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/src/pycastle/init_command.py +0 -0
  44. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/src/pycastle/iteration/__init__.py +0 -0
  45. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/src/pycastle/iteration/_deps.py +0 -0
  46. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/src/pycastle/iteration/_phase_row.py +0 -0
  47. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/src/pycastle/iteration/_utils.py +0 -0
  48. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/src/pycastle/iteration/implement.py +0 -0
  49. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/src/pycastle/iteration/merge.py +0 -0
  50. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/src/pycastle/iteration/planning.py +0 -0
  51. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/src/pycastle/iteration/preflight.py +0 -0
  52. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/src/pycastle/labels.py +0 -0
  53. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/src/pycastle/main.py +0 -0
  54. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/src/pycastle/orchestrator.py +0 -0
  55. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/src/pycastle/prompt_pipeline.py +0 -0
  56. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/src/pycastle/rich_status_display.py +0 -0
  57. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/src/pycastle/services/__init__.py +0 -0
  58. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/src/pycastle/services/_base.py +0 -0
  59. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/src/pycastle/services/claude_service.py +0 -0
  60. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/src/pycastle/services/docker_service.py +0 -0
  61. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/src/pycastle/services/git_service.py +0 -0
  62. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/src/pycastle/services/github_service.py +0 -0
  63. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/src/pycastle/status_display.py +0 -0
  64. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/src/pycastle/stream_session.py +0 -0
  65. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/src/pycastle/worktree.py +0 -0
  66. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/src/pycastle.egg-info/SOURCES.txt +0 -0
  67. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/src/pycastle.egg-info/dependency_links.txt +0 -0
  68. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/src/pycastle.egg-info/entry_points.txt +0 -0
  69. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/src/pycastle.egg-info/requires.txt +0 -0
  70. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/src/pycastle.egg-info/top_level.txt +0 -0
  71. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/tests/__init__.py +0 -0
  72. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/tests/conftest.py +0 -0
  73. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/tests/test_agent_output_protocol.py +0 -0
  74. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/tests/test_agent_result.py +0 -0
  75. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/tests/test_agent_runner.py +0 -0
  76. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/tests/test_build_command.py +0 -0
  77. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/tests/test_claude_service.py +0 -0
  78. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/tests/test_config_new.py +0 -0
  79. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/tests/test_container_runner.py +0 -0
  80. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/tests/test_default_prompts.py +0 -0
  81. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/tests/test_deps.py +0 -0
  82. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/tests/test_docker_service.py +0 -0
  83. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/tests/test_errors.py +0 -0
  84. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/tests/test_git_service.py +0 -0
  85. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/tests/test_github_service.py +0 -0
  86. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/tests/test_implement.py +0 -0
  87. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/tests/test_init_command.py +0 -0
  88. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/tests/test_integration.py +0 -0
  89. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/tests/test_iteration.py +0 -0
  90. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/tests/test_labels.py +0 -0
  91. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/tests/test_main.py +0 -0
  92. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/tests/test_merge.py +0 -0
  93. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/tests/test_orchestrator.py +0 -0
  94. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/tests/test_phase_row.py +0 -0
  95. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/tests/test_plain_status_display.py +0 -0
  96. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/tests/test_plan.py +0 -0
  97. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/tests/test_planning.py +0 -0
  98. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/tests/test_preflight.py +0 -0
  99. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/tests/test_prompt_pipeline.py +0 -0
  100. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/tests/test_prompt_utils.py +0 -0
  101. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/tests/test_status_display.py +0 -0
  102. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/tests/test_stream_session.py +0 -0
  103. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/tests/test_subprocess_service.py +0 -0
  104. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/tests/test_utils.py +0 -0
  105. {pycastle-0.2.0.2.dev0 → pycastle-0.2.0.5}/tests/test_worktree.py +0 -0
@@ -0,0 +1,95 @@
1
+ name: Publish
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - main
7
+ tags:
8
+ - 'v*.*.*'
9
+ pull_request:
10
+ branches:
11
+ - main
12
+
13
+ jobs:
14
+ test:
15
+ runs-on: ubuntu-latest
16
+ steps:
17
+ - uses: actions/checkout@v4
18
+ - uses: actions/setup-python@v5
19
+ with:
20
+ python-version: "3.12"
21
+ - run: pip install -e ".[dev]"
22
+ - run: ruff check
23
+ - run: mypy src
24
+ - run: pytest
25
+
26
+ build:
27
+ runs-on: ubuntu-latest
28
+ needs: test
29
+ if: github.event_name == 'push'
30
+ outputs:
31
+ is_tag: ${{ steps.version.outputs.is_tag }}
32
+ steps:
33
+ - uses: actions/checkout@v4
34
+ with:
35
+ fetch-depth: 0
36
+ fetch-tags: true
37
+
38
+ - uses: actions/setup-python@v5
39
+ with:
40
+ python-version: "3.12"
41
+
42
+ - name: Compute version
43
+ id: version
44
+ run: |
45
+ pip install setuptools-scm
46
+ VERSION=$(python -m setuptools_scm)
47
+ echo "Computed version: $VERSION"
48
+ if [[ "$GITHUB_REF" == refs/tags/v* ]]; then
49
+ if [[ "$VERSION" == *".dev"* ]]; then
50
+ echo "ERROR: dev version on tag build" >&2
51
+ exit 1
52
+ fi
53
+ echo "is_tag=true" >> "$GITHUB_OUTPUT"
54
+ else
55
+ echo "is_tag=false" >> "$GITHUB_OUTPUT"
56
+ fi
57
+ echo "SETUPTOOLS_SCM_PRETEND_VERSION_FOR_PYCASTLE=$VERSION" >> "$GITHUB_ENV"
58
+
59
+ - name: Build
60
+ run: pip install build && python -m build
61
+
62
+ - uses: actions/upload-artifact@v4
63
+ with:
64
+ name: dist
65
+ path: dist/
66
+
67
+ publish-testpypi:
68
+ runs-on: ubuntu-latest
69
+ needs: build
70
+ if: needs.build.outputs.is_tag == 'false'
71
+ environment: testpypi
72
+ permissions:
73
+ id-token: write
74
+ steps:
75
+ - uses: actions/download-artifact@v4
76
+ with:
77
+ name: dist
78
+ path: dist/
79
+ - uses: pypa/gh-action-pypi-publish@release/v1
80
+ with:
81
+ repository-url: https://test.pypi.org/legacy/
82
+
83
+ publish-pypi:
84
+ runs-on: ubuntu-latest
85
+ needs: build
86
+ if: needs.build.outputs.is_tag == 'true'
87
+ environment: pypi
88
+ permissions:
89
+ id-token: write
90
+ steps:
91
+ - uses: actions/download-artifact@v4
92
+ with:
93
+ name: dist
94
+ path: dist/
95
+ - uses: pypa/gh-action-pypi-publish@release/v1
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pycastle
3
- Version: 0.2.0.2.dev0
3
+ Version: 0.2.0.5
4
4
  Summary: Python orchestrator for autonomous Claude Code agents in Docker
5
5
  License: MIT License
6
6
 
@@ -36,6 +36,8 @@ build-backend = "setuptools.build_meta"
36
36
 
37
37
  [tool.setuptools_scm]
38
38
  local_scheme = "no-local-version"
39
+ version_scheme = "guess-next-dev"
40
+ fallback_version = "0.0.0"
39
41
 
40
42
  [tool.setuptools.packages.find]
41
43
  where = ["src"]
@@ -85,11 +85,11 @@ Before finishing, run `{{FEEDBACK_COMMANDS}}` to ensure all tests pass.
85
85
 
86
86
  Do not stage files or run `git commit` — the orchestrator handles commits.
87
87
 
88
- Emit a `<commit_message>` tag with a plain description of the changes. Do not include a `RALPH:` prefix or any git commands. Keep it concise — task completed, key decisions made, and files changed.
88
+ Emit a `<commit_message>` tag with a plain description of the changes. Keep it concise — task completed, key decisions made, and files changed.
89
89
 
90
- Example: `<commit_message>task completed + PRD reference; key decisions; files changed</commit_message>`
90
+ Example: `<commit_message>task completed + PRD reference; key decisions; files changed; Blockers or notes for next iteration</commit_message>`
91
91
 
92
- ### 8. Issue
92
+ ### 8. Issues
93
93
 
94
94
  If the task is not complete, leave a comment on the GitHub issue with what was done.
95
95
 
@@ -91,12 +91,10 @@ Check that the implementation respects any ADRs in `docs/adr/` that touch the ar
91
91
 
92
92
  Standards were applied at each step above — no separate standards file reference needed.
93
93
 
94
- ## 8. Output
95
-
96
94
  Run `{{FEEDBACK_COMMANDS}}` to ensure nothing is broken.
97
95
 
98
- Do not stage files or run `git commit` — the orchestrator handles commits.
96
+ ## 8. Output
99
97
 
100
- Emit a `<commit_message>` tag with a plain description of the refinements. Do not include a `RALPH:` prefix or any git commands. Keep it concise.
98
+ Emit a `<commit_message>` tag with a plain description of the refinements. Keep it concise.
101
99
 
102
- Example: `<commit_message>describe the refinements made during review</commit_message>`
100
+ Example: `<commit_message>Description of revinements</commit_message>`
@@ -4,7 +4,7 @@ import sys
4
4
  import tarfile
5
5
  import threading
6
6
  from collections.abc import Iterator
7
- from pathlib import Path
7
+ from pathlib import Path, PurePosixPath
8
8
  from typing import cast
9
9
 
10
10
  import docker
@@ -180,7 +180,7 @@ class DockerSession:
180
180
 
181
181
  def write_file(self, content: str, container_path: str) -> None:
182
182
  data = content.encode("utf-8")
183
- path = Path(container_path)
183
+ path = PurePosixPath(container_path)
184
184
  buf = io.BytesIO()
185
185
  with tarfile.open(fileobj=buf, mode="w") as tar:
186
186
  info = tarfile.TarInfo(name=path.name)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pycastle
3
- Version: 0.2.0.2.dev0
3
+ Version: 0.2.0.5
4
4
  Summary: Python orchestrator for autonomous Claude Code agents in Docker
5
5
  License: MIT License
6
6
 
@@ -1,6 +1,6 @@
1
1
  import tarfile
2
2
  import threading
3
- from pathlib import Path
3
+ from pathlib import Path, PureWindowsPath
4
4
  from unittest.mock import MagicMock, patch
5
5
 
6
6
  import pytest
@@ -562,3 +562,29 @@ def test_docker_session_write_file_puts_archive_with_correct_content():
562
562
  assert member.name == "myfile.txt"
563
563
  content = tar.extractfile(member).read().decode("utf-8")
564
564
  assert content == "hello content"
565
+
566
+
567
+ def test_docker_session_write_file_splits_container_path_as_posix_on_windows_host():
568
+ """Regression for #467: container paths must split as POSIX even on Windows hosts.
569
+
570
+ Simulates a Windows host by patching the module's Path symbol with PureWindowsPath.
571
+ With the buggy implementation, parent renders as '\\home\\agent' and Docker
572
+ rejects the put_archive call with a 404.
573
+ """
574
+ mock_client = MagicMock()
575
+ session = DockerSession(
576
+ volumes={},
577
+ container_env={},
578
+ image_name="img",
579
+ cfg=Config(),
580
+ docker_client=mock_client,
581
+ )
582
+ session.__enter__()
583
+
584
+ with patch("pycastle.docker_session.Path", PureWindowsPath):
585
+ session.write_file("token", "/home/agent/.claude.json")
586
+
587
+ mock_container = mock_client.containers.run.return_value
588
+ directory, _ = mock_container.put_archive.call_args[0]
589
+ assert "\\" not in directory
590
+ assert directory == "/home/agent"
@@ -1,104 +0,0 @@
1
- name: Publish
2
-
3
- on:
4
- push:
5
- branches:
6
- - main
7
- tags:
8
- - 'v*.*.*'
9
- pull_request:
10
- branches:
11
- - main
12
-
13
- jobs:
14
- test:
15
- runs-on: ubuntu-latest
16
- steps:
17
- - uses: actions/checkout@v4
18
- with:
19
- fetch-depth: 0
20
-
21
- - uses: actions/setup-python@v5
22
- with:
23
- python-version: "3.12"
24
-
25
- - name: Install
26
- run: pip install -e ".[dev]"
27
-
28
- - name: Lint
29
- run: ruff check
30
-
31
- - name: Type-check
32
- run: mypy src
33
-
34
- - name: Test
35
- run: pytest
36
-
37
- publish-testpypi:
38
- runs-on: ubuntu-latest
39
- needs: test
40
- if: github.event_name == 'push' && github.ref == 'refs/heads/main'
41
- environment: testpypi
42
- permissions:
43
- id-token: write
44
- contents: read
45
- steps:
46
- - uses: actions/checkout@v4
47
- with:
48
- fetch-depth: 0
49
- fetch-tags: true
50
-
51
- - uses: actions/setup-python@v5
52
- with:
53
- python-version: "3.12"
54
-
55
- - name: Install build
56
- run: pip install build setuptools-scm
57
-
58
- - name: Show computed version
59
- run: python -m setuptools_scm
60
-
61
- - name: Build
62
- run: python -m build
63
-
64
- - name: Publish to TestPyPI
65
- uses: pypa/gh-action-pypi-publish@release/v1
66
- with:
67
- repository-url: https://test.pypi.org/legacy/
68
-
69
- publish-pypi:
70
- runs-on: ubuntu-latest
71
- needs: test
72
- if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v')
73
- environment: pypi
74
- permissions:
75
- id-token: write
76
- contents: read
77
- steps:
78
- - uses: actions/checkout@v4
79
- with:
80
- fetch-depth: 0
81
- fetch-tags: true
82
-
83
- - uses: actions/setup-python@v5
84
- with:
85
- python-version: "3.12"
86
-
87
- - name: Install build
88
- run: pip install build setuptools-scm
89
-
90
- - name: Verify tag matches HEAD and version is final
91
- run: |
92
- git describe --tags --exact-match HEAD
93
- VERSION=$(python -m setuptools_scm)
94
- echo "Computed version: $VERSION"
95
- if [[ "$VERSION" == *".dev"* ]]; then
96
- echo "ERROR: dev version on tag build — tag not visible to setuptools-scm" >&2
97
- exit 1
98
- fi
99
-
100
- - name: Build
101
- run: python -m build
102
-
103
- - name: Publish to PyPI
104
- uses: pypa/gh-action-pypi-publish@release/v1
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes