Merged
Conversation
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
…yproject.yml (changes install setup) (#14) This update changes the structure of the toolkit, and switches to require to be installed, rather than used directly. Please see the README.md for installation guide. This update adds the following: - Add pyproject.toml and uv.lock - Move sources into src/challenge_toolkit - Expose CLI as 'challenge-toolkit' via project.scripts - Remove requirements.txt - Modify imports to always start from package name
Run build and tests across Python 3.10–3.14
Run build and tests across Python 3.10–3.14
## [1.2.0-rc.1](v1.1.2...v1.2.0-rc.1) (2026-02-05) ### Features * **ci:** add automated testing across python 3.10-3.14 ([#22](#22)) ([e689ebe](e689ebe)) * **release:** add automatic update of version in pyproject.toml ([7187d4a](7187d4a)) * switch package to be installed as `challenge-toolkit` through pyproject.yml (changes install setup) ([#14](#14)) ([58a205e](58a205e)) * **test:** add pytest with uv ([#19](#19)) ([96fc932](96fc932))
## [1.2.0-rc.2](v1.2.0-rc.1...v1.2.0-rc.2) (2026-03-21) ### Features * **release:** enable PyPI publishing in release configuration ([9d4334f](9d4334f))
## [1.2.0-rc.3](v1.2.0-rc.2...v1.2.0-rc.3) (2026-03-21) ### Bug Fixes * **release:** update release workflow to correctly update uv.lock on new releases ([a6fccca](a6fccca))
BREAKING CHANGE: Project restructured for PyPI distribution and standard Python conventions. The internal folder structure has been updated to align with modern Python packaging standards. The CLI entry point has moved from `src/ctf.py` to `src/challenge_toolkit/cli.py`. **Action Required:** The project is now officially available on PyPI as `challenge-toolkit`. Moving forward, the recommended way to use the system is via a global tool installation: - Using uv: `uv tool install challenge-toolkit` - Using pip: `pip install challenge-toolkit` Once installed, you can invoke the system directly from your terminal using the command `challenge-toolkit`.
## [2.0.0-rc.1](v1.2.0-rc.3...v2.0.0-rc.1) (2026-03-21) ### ⚠ BREAKING CHANGES * Project restructured for PyPI distribution and standard Python conventions. The internal folder structure has been updated to align with modern Python packaging standards. The CLI entry point has moved from `src/ctf.py` to `src/challenge_toolkit/cli.py`. **Action Required:** The project is now officially available on PyPI as `challenge-toolkit`. Moving forward, the recommended way to use the system is via a global tool installation: - Using uv: `uv tool install challenge-toolkit` - Using pip: `pip install challenge-toolkit` Once installed, you can invoke the system directly from your terminal using the command `challenge-toolkit`. ### Documentation * update installation guide ([49030f4](49030f4))
Contributor
There was a problem hiding this comment.
Pull request overview
This PR packages the toolkit for a 2.0 release by migrating to standard Python packaging (pyproject/uv), moving the code into a challenge_toolkit package, and updating CI/release automation and tests accordingly.
Changes:
- Introduces
pyproject.toml+uv.lock(and removessrc/requirements.txt) to support modern installs and builds. - Refactors CLI/commands to import from
challenge_toolkit.*and adds a propermain()entrypoint. - Adds/updates test fixtures and CI workflows to run builds/tests via
uv+pytest.
Reviewed changes
Copilot reviewed 15 out of 31 changed files in this pull request and generated 1 comment.
Show a summary per file
| File | Description |
|---|---|
uv.lock |
Adds uv lockfile for reproducible installs. |
pyproject.toml |
Defines package metadata, dependencies, and console script entrypoint. |
pytest.toml |
Configures pytest import mode for the new package layout. |
src/challenge_toolkit/cli.py |
Adds main() and wires subcommands via installed entrypoint. |
src/challenge_toolkit/library/config.py |
Centralizes schema URLs, allowed values, and defaults. |
src/challenge_toolkit/library/utils.py |
Adds filesystem helpers, slugify, and YAML/JSON loaders. |
src/challenge_toolkit/library/data.py |
Implements Challenge/Page models, validation, and serialization/loading. |
src/challenge_toolkit/library/generator.py |
Adds generator for challenge/page scaffold content. |
src/challenge_toolkit/commands/challenge_creator.py |
Updates imports to packaged module paths. |
src/challenge_toolkit/commands/template_renderer.py |
Updates imports to packaged module paths. |
src/challenge_toolkit/commands/pipeline.py |
Updates imports to packaged module paths. |
src/challenge_toolkit/commands/page.py |
Updates imports to packaged module paths. |
src/challenge_toolkit/commands/slugify.py |
Updates imports to packaged module paths. |
src/test.py |
Removes legacy direct test runner. |
src/requirements.txt |
Removes legacy requirements file in favor of pyproject.toml. |
tests/test_data.py |
Updates imports/path handling and expands/keeps unit tests. |
tests/data/minimal-example.yml |
Adds minimal YAML fixture for load tests. |
tests/data/full-example.yml |
Adds full YAML fixture for load tests. |
tests/data/full-example.yaml |
Adds full YAML (alt extension) fixture for load tests. |
tests/data/full-example.json |
Adds full JSON fixture for load tests. |
tests/data/full-example-multi-flag.yml |
Adds multi-flag YAML fixture for load tests. |
tests/data/full-example-multi-flag.json |
Adds multi-flag JSON fixture for load tests. |
tests/data/full-example-multi-flag-object.yml |
Adds multi-flag-object YAML fixture for load tests. |
tests/data/full-example-multi-flag-object.json |
Adds multi-flag-object JSON fixture for load tests. |
README.md |
Updates installation and usage docs for packaged CLI + uv/pytest workflow. |
.releaserc.json |
Adds semantic-release config for publishing and locking. |
.github/workflows/release.yml |
Updates release workflow usage and secrets/plugins. |
.github/workflows/ci.yaml |
Adds CI workflow to build and test with uv/pytest. |
Comments suppressed due to low confidence (2)
tests/test_data.py:862
file_diris apathlib.Path, but these tests build file paths with an f-string containing.../{...}. On Windows this can produce mixed separators (e.g.C:\...\data/full-example.json). Preferself.file_dir / self.json_file(and passstr(...)toChallenge.loadif needed).
tests/test_data.py:1189- The
__main__guard message tells contributors to runtest.py, but this PR deletessrc/test.pyand the repo now documents running tests viapytest/uv run pytest. Update or remove this message to avoid pointing to a non-existent entry point.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Update challenge-toolkit to v2.0.0.
The major change, is the change of entrypoint from
src/ctf.pytosrc/challenge_toolkit/cli.py, which breaks the integreation from the challenge-ci and challenge repository, which currently uses thesrc/ctf.pyto use the CLI, along with installing it as a submodule.As the project is now officially available on PyPI as
challenge-toolkit. Moving forward, the recommended way to use the system is via a global tool installation:uv tool install challenge-toolkitpip install challenge-toolkitOnce installed, you can invoke the system directly from your terminal using the command
challenge-toolkit.