Changelog
[0.31.0] - 2026-08-23
- Added:
Dedicated
[format]configuration section inscaldys-project.tomlwith themarkdown_targetssetting, enabling explicit configuration of Markdown files and directories formatted bymdformat(directories are recursively scanned for*.md). Settingmarkdown_targets = []explicitly disables Markdown formatting.CI workflow drift detection:
scaldys-project ci markdowninspects.github/workflows/ci.yml(if present) and logs a warning when workflowmdformatarguments diverge from the configuredmarkdown_targets.
- Changed:
scaldys-project format markdownandscaldys-project ci markdownnow resolve target paths from[format] markdown_targetsinscaldys-project.toml, falling back to default discovery (README.mdand MkDocs doc directories) when unconfigured.
- Docs:
Updated
users/topics/configuration.rstandusers/topics/scaldys_project_toml_reference.rstto document the[format]section andmarkdown_targetssetting.Updated
developers/markdown_formatting.rstwith target path resolution details and CI workflow drift detection guidance.
[0.30.0] - 2026-08-20
- Changed:
Replaced the Node.js-based
prettiermarkdown formatter andpre-commitframework withmdformat, a pure-Python CommonMark formatter invoked directly viauv run mdformat.Scoped Markdown CI checks and formatting:
scaldys-project ci markdownandscaldys-project format markdownnow targetREADME.md(in the project root) and all*.mdfiles under MkDocs documentation directories (docs/**), explicitly excludingRELEASES.mdand non-documentation Markdown files.Updated GitHub Actions CI workflow (
.github/workflows/ci.yml) to verify Markdown formatting directly viauv run mdformat --check README.md.Updated
pyproject.tomldev dependencies to includemdformat>=0.7.22and removedpre-commit.
- Removed:
Removed
.pre-commit-config.yaml,.prettierrc, and the bundled resourcesrc/scaldys_project/resources/.pre-commit-check-config.yaml.Removed
licenses/pre_commit.md.
- Docs:
Rewrote
developers/markdown_formatting.rstto document directmdformatexecution, CommonMark compliance, target scoping, and developer workflows.Updated
users/cli_usage.rst,developers/contributing.rst, anddevelopers/publishing.rstwithmdformatcommand syntax and descriptions.Added
licenses/mdformat.md(MIT License) and updatedlicenses/README.md.
[0.20.0] - 2026-08-05
- Changed:
Simplified PyInstaller hook handling: the automatic renaming of
hook_package.pytohook-<package_name>.pyhas been removed. Hook files must now be named correctly (hook-<package_name>.py) directly in the project source tree.Note
Breaking change for consuming projects. Existing projects must rename their
src/extra_hooks/hook_package.pytosrc/extra_hooks/hook-<package_name>.py(e.g.hook-scaldys_template.py) to remain compatible withscaldys-project >= 0.20.0.
- Docs:
Updated
users/topics/windows_exe.rstto instruct developers to use thehook-<package_name>.pynaming convention directly.
[0.15.0] - 2026-07-31
- Added:
Log the complete subprocess syntax to the terminal when executing CI, format, and test commands.
New compliance rule: Cython-compiled modules must not use
match/case(PEP 634) syntax. Cython does not yet fully support this syntax, soscaldys-projectnow validates all modules listed incompiled_modulesbefore starting the build. If anymatch/caseblocks are detected, the compliance check reports a failure:✗ match/case is not fully supported yet in cython. Replace it with an equivalent if-elif-else structure. Concerned files: src/myapp/engine.py
The rule applies whenever
compiled_modulesinscaldys-project.tomlis not empty.
- Changed:
ci allandformat allnow execute all steps regardless of failures, providing a summary report at the end.Minor improvements to terminal output readability.
- Docs:
Updated CLI usage and developer guides to reflect command logging and the non-interrupting behavior of
ci allandformat all.users/topics/compliance_checking.rst— Rule 12 added to the compliance table; mode-condition notes updated.users/topics/cython_compilation.rst— Limitations and caveats updated to document thematch/caselimitation.users/topics/scaldys_project_toml_reference.rst— Added a note to thecompiled_modulessetting regardingmatch/case.users/topics/configuration.rst— Added a note to thecompiled_modulesdescription.
[0.14.0] - 2026-05-20
- Added:
New compliance rule:
tests/directory must exist at the project root.scaldys-project check(and every build command that runs compliance checks) now reports a failure if the directory is absent:✗ Tests directory not found: 'tests/'. Create it and add at least one test file.
The rule is unconditional — it applies in all deployment modes. The
tests/directory is already wherescaldys-project test(via[tool.pytest.ini_options] testpaths) looks for tests, so a missing directory would cause the test command to silently collect nothing. The check makes that failure explicit and early.
- Changed:
scaldys-project initwizard — contextual hints are now printed above each prompt so users understand what to enter without consulting the manual. Every prompt in the four-section wizard gains a short dim/italic line that covers:Project name — single word preferred; multi-word: lowercase with dashes (e.g.
my-cool-app); underscores allowed but not recommended.Package name — underscores only, dashes forbidden (e.g.
my_cool_app); used insrc/layout andimportstatements.Project slug — lowercase with dashes only, underscores forbidden (e.g.
my-cool-app); used as git repo name and CLI entry-point.Organization name — used in copyright notices and package metadata.
Author name / email — written to
pyproject.tomland Sphinx docs.Short description — one-line summary (≤ 80 chars) for
pyproject.tomland README.Initial version — semantic version
MAJOR.MINOR.PATCH, stored inpyproject.toml.GitHub username/org — used to generate badge URLs in README; leave empty to skip.
Deployment mode — inline legend listing what each of the three modes (
pyinstaller,pyruntime,wheel_only) produces.Target directory — where the project folder is created.
Initialise git repository? — runs
git init+ initial commit.Run uv sync? — creates
.venvand installs all dependencies.
- Fixed:
--template-refdefault documented asmasterin the changelog entry for 0.13.0 and in bothcli_usage.rstandproject_initialization.rst; corrected tomain(matches the actual code default).
- Docs:
users/topics/project_initialization.rst— Project identity wizard table updated: Project name notes now state the naming convention (single word preferred, multi-word → lowercase with dashes); Package name notes explicitly state dashes are forbidden and the field is used insrc/layout and imports; Project slug notes explicitly state underscores are forbidden.--template-refdefault corrected tomain.users/cli_usage.rst—--template-refdefault corrected tomain.users/topics/compliance_checking.rst— Rule 11 added to the compliance table; mode-condition notes updated.users/topics/project_layout.rst—tests/annotated as required in the recommended layout diagram; new Tests directory section added.
[0.13.0] - 2026-05-20
- Added:
scaldys-project init— new interactive project-scaffolding command. Downloads scaldys-template from GitHub (or uses a local copy via--local PATH) and produces a fully configured project directory in one step.An interactive wizard collects project name, package name, project slug, organisation name, author details, description, version, GitHub username, Windows deployment mode, and target directory. A summary panel is shown before any files are written.
After copying the template the command performs, in order:
String replacement of all placeholder tokens in text files (
Scaldys-Template,scaldys_template,scaldys-template,scaldys@scaldys.net,Scaldys; see Placeholder substitution in the user guide for the full ordered list).Post-order rename of every file and directory whose name contains a placeholder token.
Targeted post-processing: copyright year and author in Sphinx
conf.pyfiles, description and initial version inpyproject.toml, deployment mode inscaldys-project.toml.Optional
git init+ initial commit.Optional
uv syncto install project dependencies.
Options:
--local PATH,--template-ref REF(default:master),--force/-f,--no-git,--no-sync.No new package dependencies are required; all file operations use the Python standard library.
scaldys-project ci doclint— new RST documentation lint step that runsuv run sphinx-lint docs/in the current directory. Reports RST style and syntax issues; exits non-zero if any are found. No files are modified. Included as the final step ofci all, mirroring the new Sphinx doc lint step added to the GitHub Actionsci.ymlworkflow.sphinx-lintadded to the project dev dependencies.
- Fixed:
README.md(or whichever file is declared asreadmeinpyproject.toml) is now copied intobuild/compiled/alongsidepyproject.tomlbefore the wheel is built, so PyPI receives the package description instead of showing “The author of this package has not provided a project description”.
- Docs:
users/topics/project_initialization.rst(new) — full user guide forscaldys-project init: interactive wizard reference, substitution map, excluded items table,--local/--forceusage,uv runtip, and CLI options reference.developers/init_command.rst(new) — developer internals forcmd_init.py: module structure, template acquisition, exclusion list, replacement ordering rationale, binary file detection, post-order rename algorithm, targeted post-processing details, error handling, and an extension guide.users/quickstart.rst— restructured into two paths: Starting a new project (usinginit) and Adding to an existing project (original content).users/cli_usage.rst—initadded to the command tree; newinitreference section added with options table.users/topics/index.rst—project_initializationadded to the toctree and guide summaries.developers/architecture.rst—cmd_init.pyadded to the module layout diagram; cross-reference toinit_command_internalsadded.users/overview.rst— Getting started quickly section updated to mentionscaldys-project initas the bootstrap command.cli_usage.rst—doclintadded to thecicommand tree; step 5 (RST documentation lint) added to theci allstep list; newci doclintreference section added; step descriptions forci allupdated to use Python lint and Python type checking wording.contributing.rst—scaldys-project ci doclintadded to thecicommand list with an inline annotation.windows_exe.rst— How the wheel is built section updated to document that the readme file is copied intobuild/compiled/.
[0.12.0] - 2026-05-19
- Added:
scaldys-project ci markdown— check-only Markdown formatting check that mirrors the Prettier format step in the GitHub Actions CI pipeline. Prettier runs in--checkmode so no files are modified. Included as the final step ofci all.The check-only pre-commit configuration is bundled inside the
scaldys-projectwheel (scaldys_project/resources/.pre-commit-check-config.yaml) and resolved viaimportlib.resourcesat runtime. Consumer projects do not need a.pre-commit-check-config.yamlfile in their root.scaldys-project format— new command group for auto-formatting files in place:format python— rewrites Python source files withuv run ruff format .format markdown— rewrites Markdown files withuv run pre-commit run prettier --all-filesformat all— runsformat pythonthenformat markdown
scaldys_project/resources/.pre-commit-check-config.yaml— check-only pre-commit configuration (Prettier with--check) bundled as a package resource inside the wheel. Used exclusively byci markdown; consumer projects are not required to provide this file.
- Changed:
Configuration file renamed from
scaldys.tomltoscaldys-project.toml.The file name now unambiguously identifies which tool owns it within the
scaldysproject umbrella. Using justscaldys.tomlwas ambiguous when a consuming project also uses other tools under the same umbrella (e.g.scaldys-template); naming the file after the specific tool (scaldys-project) removes that ambiguity entirely and is consistent with the hyphenated package name convention. No settings, sections, or defaults are changed.Note
Breaking change for consuming projects. Any project that provides a
scaldys.tomlfile must rename it toscaldys-project.toml. The file contents remain identical; only the filename changes.Documentation file
scaldys_toml_reference.rstrenamed toscaldys_project_toml_reference.rstand its.. _scaldys_toml_reference:label updated to.. _scaldys_project_toml_reference:accordingly.All internal source code, tests, and documentation updated to reference
scaldys-project.tomlandscaldys_project_toml_reference.
- Removed:
sphinx-apidocintegration removed from the documentation build pipeline.internal_doc_dirs(the[docs]key that triggered asphinx-apidocpre-pass beforesphinx-build) has been removed fromDocsConfigand fromscaldys-project.toml.sphinx_apidoc_exe_pathhas been removed fromBaseBuildEnvironment.The
[docs]section now has a single key:public_doc_dirs. All documentation units are built bysphinx-builddirectly; API reference pages should be hand-authored using.. automodule::directives rather than generated bysphinx-apidoc.Note
Breaking change for consuming projects. Remove any
internal_doc_dirskey from yourscaldys-project.toml. The key is silently ignored byload_config()(unknown TOML keys are not an error), but it no longer has any effect.
- Fixed:
Pure-Python wheel now correctly tagged
py3-none-anywhen nocompiled_modulesare declared.Compiler._build_wheel()previously wrote asetup.pythat forced a platform-specific wheel tag unconditionally. The intent was to prevent setuptools from downgrading a wheel that contains pre-built.pydextensions topy3-none-any, but the samesetup.pywas injected even whencompiled_modules = [](the default), causing a pure-Python build to produce a spurious platform tag such ascp313-cp313-win_amd64. TheBinaryDistributionsetup.pyis now only written whencompiled_modulesis non-empty; otherwise any stalesetup.pyfrom a previous build is removed, allowing setuptools to apply the correctpy3-none-anytag.
- Docs:
docs/manual/source/developers/markdown_formatting.rstexpanded with a full technical explanation: how the pre-commit config is split between the project-level.pre-commit-config.yamland the check-only config bundled in the wheel, theci(check-only) vsformat(fix-in-place) contract, and a scenario-by-scenario comparison of local git hook,ci markdown,format markdown, and GitHub Actions behaviour.docs/manual/source/developers/contributing.rstupdated to list allciandformatsubcommands with their intent; cross-reference text updated to reflect the project-file / bundled-resource split.docs/manual/source/users/cli_usage.rstupdated with theformatcommand group (tree,format all,format python,format markdownsections) and the correctedci markdowndescription (bundled config, no project file required).
[0.11.0] - 2026-05-17
- Added:
cisubcommand group: runs quality checks locally, mirroring the GitHub Actions pipeline step-for-step. Allcicommands operate on the current working directory (not the project root), so they work for any project:scaldys-project ci all # run every step; stops on first failure scaldys-project ci lint # uv run ruff check . scaldys-project ci format # uv run ruff format --diff . scaldys-project ci typecheck # uv sync && uv run pyright ./src
testcommand: runs the project test suite via pytest:scaldys-project test # uv run pytest -v --durations=0 --cov --cov-report=xml
publishcommand: uploads the binary wheel fromdist/to PyPI viauv publish. Refuses to publish pure-Python wheels (platform tagnone-any) to prevent Cython source code from being exposed on PyPI. Also refuses when multiple binary wheels are found indist/(stale build artifacts):scaldys-project publish # upload binary wheel to PyPI scaldys-project publish --test # upload to TestPyPI instead
This command is intended for consuming projects that use Cython-compiled extensions and therefore cannot rely on automated CI publishing (which would produce a pure-Python source distribution).
scaldys-projectitself continues to publish automatically via GitHub Actions.
- Changed:
CLI refactored from a single monolithic
__main__.pyinto a structuredcli/package, following the same layout asscaldys-template. The new layout:cli/ ├── cli.py # Typer app, logging, command wiring ├── utils.py # shared console, find_project_root() └── commands/ ├── cmd_build.py # build subcommands (unchanged behaviour) ├── cmd_check.py # check command (unchanged behaviour) ├── cmd_ci.py # new ci subcommands ├── cmd_publish.py # new publish command └── cmd_test.py # new test command__main__.pyis now a minimal entry point that importsappfromcli/cli.py. Thepyproject.tomlentry point is unchanged (scaldys_project.__main__:app).A single
Consoleinstance is now shared across logging and all build commands (viacli/utils.py) to prevent Rich live-display conflicts.
- Removed:
ci buildsubcommand (uv build). The command was redundant withscaldys-project build alland actively misleading for binary-wheel projects: runninguv buildlocally produces a pure-Python wheel, which is the wrong artifact for projects that use Cython compilation. Thecigroup now covers only quality gates (lint, format, typecheck), matching the scope of the GitHub Actionsci.ymlworkflow.
- Docs:
Publishing guide in the developer manual updated with a Why automated publishing? section that explains the design rationale:
scaldys-projectis pure-Python and open-source, so CI-built wheels are the correct and complete artifact and OIDC Trusted Publishing is the most secure release mechanism. The section also contrasts with consuming projects that use Cython-compiled extensions and must publish manually viascaldys-project publish.
[0.10.0] - 2026-05-17
- Docs:
Added Publishing guide to the developer manual covering PyPI Trusted Publishing setup, GitHub environment configuration, workflow files, version bump procedure, release triggering, and TestPyPI dry run.
[0.9.0] - 2026-05-17
- Changed:
Configuration file renamed from
builder.tomltoscaldys.toml.The file name now matches the project name (
scaldys-project) rather than describing the tool’s original role. No settings, sections, or defaults are changed.Note
Breaking change for consuming projects. Any project that provides a
builder.tomlfile must rename it toscaldys.toml. The file contents remain identical; only the filename changes.Documentation file
builder_toml_reference.rstrenamed toscaldys_toml_reference.rstand its.. _builder_toml_reference:label updated to.. _scaldys_toml_reference:accordingly.All internal source code, tests, and documentation updated to reference
scaldys.tomlandscaldys_toml_reference.
[0.8.0] - 2026-05-17
- Changed:
Project renamed from
scaldys-buildertoscaldys-project.PyPI package name changed:
scaldys-builder→scaldys-project.Python package (import name) changed:
scaldys_builder→scaldys_project.CLI entry point changed:
scaldys-builder→scaldys-project.Source directory renamed:
src/scaldys_builder/→src/scaldys_project/.
All internal imports, documentation references, configuration files, and lock file entries are updated accordingly. No functional changes are introduced in this release.
Note
Breaking change. Any project depending on
scaldys-buildermust update its dependency declaration (e.g. inpyproject.toml) toscaldys-project. Any code that imports fromscaldys_buildermust be updated to import fromscaldys_project.
[0.7.0] - 2026-05-17
- Changed:
Build output split into two top-level directories with distinct purposes:
dist/— PyPI-conventional directory for the distributable wheel. Thedist/wheels/subdirectory is eliminated; the wheel is now written directly intodist/, matching the convention expected bytwine upload dist/*anduv publish.artifacts/— new top-level directory for all other build outputs that are not published to PyPI. Replaces the previous use ofdist/for non-wheel artefacts.
Previous
dist/paths and theirartifacts/replacements:Old path
New path
dist/wheels/<name>.whldist/<name>.whldist/portable/artifacts/portable/dist/installer/artifacts/installer/dist/documentation/artifacts/documentation/dist/pyruntime/artifacts/pyruntime/Note
Breaking change for consuming projects. Any Inno Setup
.issscript that referencesdist\portable\,dist\installer\, ordist\documentation\must be updated to referenceartifacts\portable\,artifacts\installer\, andartifacts\documentation\respectively.build cleannow removesartifacts/in addition tobuild/anddist/. The OneDrive slow-sync warning is updated to mention all three directories.builder.tomldeployment-mode documentation updated to reflect the new directory layout.
- Added:
Pre-build compliance check for package installation in
pyinstallermode.check_compliance()now verifies that the project package is installed in the active virtual environment (i.e. a dist-info entry is present and discoverable byimportlib.metadata).A missing dist-info previously caused
copy_metadata()in the PyInstaller hook to raise aStopIterationdeep inside PyInstaller, producing a cryptic traceback with no indication of the fix. The check now catches this condition before the build starts and reports:✗ Package 'my-app' is not installed in the active virtual environment (no dist-info found). Run 'uv sync' (or 'pip install -e .') and retry.
This most commonly occurs after renaming the project (changing
nameinpyproject.toml) without reinstalling.
[0.6.1] - 2026-05-15
- Fixed:
build allinwheel_onlymode now distributes built documentation todist/documentation/as documented inbuilder.toml. Previously, the entire packaging step was skipped in this mode, so Sphinx built the docs tobuild/<name>/html/but they were never copied todist/.A new
Packager._distribute_docs()method handles this: it copies eachpublic_doc_dirsentry frombuild/<name>/html/todist/documentation/<name>/. A Distributing documentation step now appears in thebuild allprogress bar forwheel_onlymode (previously absent).
[0.6.0] - 2026-05-14
- Changed:
Output subdirectory
dist/pyinstaller/renamed todist/portable/to describe the content (copy-and-run standalone bundle) rather than the tool that produced it.Output subdirectory
dist/setup/renamed todist/installer/to describe the artifact type (Windows installer) rather than the conventional filename of the executable it contains.builder.pyrenamed to__main__.py, makingscaldys-projectconsistent with the project layout it enforces on consuming projects. The module is now also runnable aspython -m scaldys_project. Thepyproject.tomlentry point updated accordingly (scaldys_project.__main__:app).Developer manual updated to reflect the rename in the module layout diagram and execution-flow description (
architecture.rst) and in the new-platform-builder guide (extension_points.rst).[docs]configuration keys renamed to better express their purpose:dist_dirs→public_doc_dirs(documentation units destined for end users, bundled into the installer) andapidoc_dirs→internal_doc_dirs(documentation units for project developers, not distributed to end users). Updated inconfig.py,docs.py,windows/builder.py, all tests,builder.toml, and the full user manual.
- Docs:
User manual synchronised with the codebase changes introduced in 0.4.0–0.6.0. All affected pages updated in one pass
[0.5.0] - 2026-05-10
- Added:
_build_wheel()build step: after PyInstaller completes, a.pyd-only distribution wheel is built frombuild/compiled/(which contains compiled.pydextensions only, no Python source). The step patches a copy of the project’spyproject.tomlto restrict setuptools package discovery to the project package (excludingextra_hooks/) and to declare*.pydfiles as package data. The resulting wheel is placed indist/ready foruv pip install --find-links.Online and offline installer modes: the build supports an optional
PythonRuntimeDirvariable in the Inno Setup.issscript. When set, the pre-built PythonRuntime directory is embedded insidesetup.exe(offline mode); when absent, Python is downloaded at install time viauv(online mode)..python-versioncompliance requirement:scaldys-projectnow rejects a build if the target project’s root does not contain a.python-versionfile. This file serves as the single source of truth for the Python version shared between the build pipeline, the wheel build, and the PythonRuntime setup script.
- Changed:
Compliance rule set extended with the
.python-versioncheck (seescaldys-project checkand the Project Compliance guide).
[0.4.0] - 2026-05-08
- Added:
Generic documentation system: every immediate subdirectory of
docs/is now treated as an independent documentation unit. There is no longer a fixed set of names — subdirectory names are freely choosable. All units are discovered and built automatically; no configuration is needed to add a new unit.Engine auto-detection: the documentation engine for each unit is determined by inspecting its contents. A
source/conf.pyfile selects Sphinx; amkdocs.ymlselects MkDocs (detected but not yet built — a warning is logged and the unit is skipped). Units whose directory matches neither marker also produce a warning and are skipped.[docs]section inbuilder.toml:dist_dirs— list of subdirectory names whose built HTML is copied into the distribution artefacts (dist/portable/documentation/<name>/). Defaults to[](no documentation distributed).apidoc_dirs— list of subdirectory names that require asphinx-apidocpre-pass beforesphinx-build. Defaults to[]. This replaces the previously hardcoded behaviour of always runningsphinx-apidocfor a directory nameddeveloper_guide.
DocEngineenum and_detect_engine()function inscaldys_project.common.docs, providing a testable, reusable engine detection primitive.WindowsBuilder._any_sphinx_docs()helper: replaces the hardcoded check fordocs/manual/when determining whether Sphinx must be present at pre-flight time.
- Changed:
Distribution path for documentation changed from the single fixed destination
dist/portable/documentation/help files/todist/portable/documentation/<name>/(one sub-folder per entry in[docs] dist_dirs).Note
Breaking change for consuming projects. Any Inno Setup
.issscript that references the olddocumentation\help files\path must be updated to referencedocumentation\<name>\instead.DocumentationBuilderrefactored: the two hardcoded methodsbuild_user_guide()andbuild_developer_guide()are replaced by a genericbuild()/_build_one()/_build_sphinx()loop that works for any number of doc units.BaseBuildEnvironmentno longer exposes the four hardcoded path attributesuser_guide_dir_path,user_guide_build_dir_path,developer_guide_dir_path, anddeveloper_guide_build_dir_path. Paths are now derived at call-time from the directory name.Documentation updated throughout: Documentation Building guide rewritten for the generic system; Configuration guide updated with the new
[docs]section; Project Layout, CLI Reference, Overview, Quick Start, and Windows Installer pages updated to reflect the new paths and behaviour.
[0.4.0] - 2026-05-14
- Added:
Three Windows deployment modes, controlled by
deployment_modeinbuilder.toml([windows]section):"pyinstaller"(default) — existing behaviour: PyInstaller bundles the application into a self-contained executable directory; Inno Setup produces asetup.exe."pyruntime"— PyInstaller is not used. A managed Python virtual environment (PythonRuntime) is deployed alongside the application via Inno Setup. Intended for applications that must coexist with Quarto, Jupyter, or another tool that requires a real Python interpreter.setup_pyruntime.ps1,uv.exe, and.python-versionare staged intodist/portable/bin/so the installer can set up the runtime at install time."wheel_only"— builds a binary distribution wheel only; no installer is created. The Inno Setup script and launcher files are not required. Use for packages distributed viapiporuv.
dist/wheels/— unified top-level output directory for the binary distribution wheel in all three modes. Inpyruntimemode the wheel is additionally staged todist/portable/wheels/so Inno Setup can bundle it into the installer.WindowsBuilder.build_distribution()— new method that runs the Windows distribution pipeline without the documentation step. Used by the newbuild windowsCLI command.WindowsBuilder._distribution_steps()— internal helper that returns the mode-dependent step list, shared bymain()andbuild_distribution().WindowsBuilder._run_steps()— internal helper that drives the Rich progress bar for a given step list; avoids duplicating the progress-bar loop betweenmain()andbuild_distribution().
- Changed:
CLI redesigned — the
build windowssub-group and its five commands (exe,installer,all,docs,clean) are replaced by four flat commands directly underbuild:build all— documentation + full Windows distribution pipeline (replacesbuild windows all)build docs— Sphinx documentation only (replacesbuild windows docs)build windows— Windows distribution only, no docs rebuild (replaces the separatebuild windows exe+build windows installerpair; behaviour is mode-dependent)build clean— deletebuild/anddist/(replacesbuild windows clean)
Compliance checking is now mode-dependent. Rules 5–8 (packaging directory,
.issscript, launcher scripts) are only enforced whendeployment_modeis not"wheel_only". Rule 9 (.python-version) is only enforced in"pyruntime"mode.Compiler.build()— PyInstaller is only invoked whendeployment_mode == "pyinstaller".Compiler._build_wheel()— wheel output path changed fromdist/portable/bin/wheels/todist/wheels/(all modes).Packager.prepare_windows_files()—setup_pyruntime.ps1,.python-version, anduv.exeare staged only inpyruntimemode; wheel staging todist/portable/wheels/is likewise restricted topyruntimemode.Packager.run_innosetup()— passes/DPyruntimeMode=1and optionally/DPythonRuntimeDironly inpyruntimemode.Packager.build()— returns early with an informational log message inwheel_onlymode (no installer step).WindowsBuildEnvironment— newdist_wheels_dir_pathattribute (dist/wheels/).Pre-flight checks and compliance checks are skipped for irrelevant tools depending on the active mode (e.g. PyInstaller not checked in
pyruntimeorwheel_onlymode; Inno Setup not checked inwheel_onlymode).User manual updated throughout: new Windows Distribution Modes guide (replaces PyInstaller Executable Bundling), updated Windows Installer Creation, CLI Reference, Configuration, Project Compliance, Project Layout, Overview, Quick Start, and
builder.toml — Full Referencepages.builder.tomlreference updated with the newdeployment_modekey and revisedbundle_pyruntimedocumentation (now explicitly scoped topyruntimemode).
- Docs:
architecture.rstupdated: execution flow section revised for the new CLI structure and mode-aware step list;BuildConfigdataclass diagram extended withDocsConfig,deployment_mode, andbundle_pyruntime.
[0.3.0] - 2026-05-07
- Added:
Project compliance checking:
scaldys-projectnow validates the target project’s required files and structure before running any build step. All issues are reported together in a single pass so they can be fixed at once. If any requirement is not met the tool exits cleanly with a descriptive message rather than failing mid-build with a cryptic error.Compliance is checked automatically at the start of
build windows exe,build windows installer, andbuild windows all.New top-level command
scaldys-project check: runs the full compliance check on the current project without triggering a build. Useful for verifying a freshly cloned project or diagnosing issues.New documentation page Project Compliance (In-Depth Guides section): lists all eight compliance rules with descriptions, the commands each rule applies to, and cross-reference links to the relevant guide sections.
- Fixed:
Project names containing hyphens (e.g.
my-app) are now normalised to underscores when resolving Python package paths (e.g.src/my_app/,my_app/__main__.py,--collect-submodules my_app), matching the Python import system convention (PEP 503 / PEP 508). The raw project name is preserved for artefact naming (executable,.issscript, launcher scripts, icon).
[0.2.0] - 2026-05-04
- Added:
Sphinx-based user manual under
docs/manual/, structured in three sections:Users
Overview — what
scaldys-projectdoes, the build pipeline diagram, and two clear entry paths (new project vs. existing project)Installation — adding
scaldys-projectas a dev dependency with extras, external tool requirements, and installation verificationQuick Start — step-by-step project setup and first build walkthrough
CLI Reference — complete reference for every command and option
In-Depth Guides: project layout and build output,
builder.tomlconfiguration, documentation building, Cython compilation, Windows EXE bundling, and Inno Setup installer creation
Developers
Architecture — module layout, three-class composition pattern, execution flow, configuration loading, and an explanation of why
compile_runner.pyruns as a subprocessExtension Points — design conventions and how to add Cython modules, build steps, or a new platform builder
Contributing — dev environment setup, testing, linting, publishing, and testing changes against a consuming project
About
Changelog, authors, license, and get-help page
docs/manual/Makefileandmake.batfor building the HTML manuallicenses/directory with license copies and credit information for all third-party tools used byscaldys-projectlicenses/README.mdindex listing each tool’s license type, upstream URL, and link to the corresponding local license file
[0.1.1] - 2025-xx-xx
- Changed:
Added
uv.lockfor reproducible dependency resolutionMinor corrections based on Pyright feedback
[0.1.0] - (unreleased)
- Added:
Initial release extracted from scaldys-template
Modular build system: common base, Windows builder, Sphinx docs, Cython runner
builder.tomlfor per-project build configuration (compiled modules, packaging paths)compile_runnermodule replaces project-levelcompile.pyscripts