dotaix 0.0.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. dotaix-0.0.1/.gitignore +181 -0
  2. dotaix-0.0.1/PKG-INFO +21 -0
  3. dotaix-0.0.1/README.md +35 -0
  4. dotaix-0.0.1/pydantic-settings-sops/LICENSE +28 -0
  5. dotaix-0.0.1/pydantic-settings-sops/README.md +64 -0
  6. dotaix-0.0.1/pyproject.toml +306 -0
  7. dotaix-0.0.1/ref/extension-creator/LICENSE +21 -0
  8. dotaix-0.0.1/ref/extension-creator/README.md +49 -0
  9. dotaix-0.0.1/ref/research/2026-03-04/repos/agent-rules-sync/LICENSE +21 -0
  10. dotaix-0.0.1/ref/research/2026-03-04/repos/agent-rules-sync/README.md +437 -0
  11. dotaix-0.0.1/ref/research/2026-03-04/repos/agent-skills-cli/README.md +91 -0
  12. dotaix-0.0.1/ref/research/2026-03-04/repos/agent-sync/LICENSE +201 -0
  13. dotaix-0.0.1/ref/research/2026-03-04/repos/agent-sync/README.md +143 -0
  14. dotaix-0.0.1/ref/research/2026-03-04/repos/agent-sync/docs/app/README.md +29 -0
  15. dotaix-0.0.1/ref/research/2026-03-04/repos/agent-sync/docs/formats/README.md +29 -0
  16. dotaix-0.0.1/ref/research/2026-03-04/repos/agent-sync/tests/fixtures/README.md +48 -0
  17. dotaix-0.0.1/ref/research/2026-03-04/repos/agent-sync/tests/fixtures/copilot/README.md +13 -0
  18. dotaix-0.0.1/ref/research/2026-03-04/repos/agentsync/LICENSE +21 -0
  19. dotaix-0.0.1/ref/research/2026-03-04/repos/agentsync/README.md +196 -0
  20. dotaix-0.0.1/ref/research/2026-03-04/repos/agnostic-ai/.ai/avatars/README.md +25 -0
  21. dotaix-0.0.1/ref/research/2026-03-04/repos/agnostic-ai/.ai/mcps/README.md +230 -0
  22. dotaix-0.0.1/ref/research/2026-03-04/repos/agnostic-ai/README.md +463 -0
  23. dotaix-0.0.1/ref/research/2026-03-04/repos/agnostic-ai/templates/.ai/avatars/README.md +25 -0
  24. dotaix-0.0.1/ref/research/2026-03-04/repos/agnostic-ai/templates/.ai/mcps/README.md +230 -0
  25. dotaix-0.0.1/ref/research/2026-03-04/repos/agnostic-ai/templates/migrations/README.md +125 -0
  26. dotaix-0.0.1/ref/research/2026-03-04/repos/ai-configurator/LICENSE +21 -0
  27. dotaix-0.0.1/ref/research/2026-03-04/repos/ai-configurator/README.md +605 -0
  28. dotaix-0.0.1/ref/research/2026-03-04/repos/ai-configurator/library/README.md +40 -0
  29. dotaix-0.0.1/ref/research/2026-03-04/repos/ai-sync/LICENSE +131 -0
  30. dotaix-0.0.1/ref/research/2026-03-04/repos/ai-sync/README.md +413 -0
  31. dotaix-0.0.1/ref/research/2026-03-04/repos/aix/.beads/README.md +81 -0
  32. dotaix-0.0.1/ref/research/2026-03-04/repos/aix/LICENSE +21 -0
  33. dotaix-0.0.1/ref/research/2026-03-04/repos/aix/README.md +196 -0
  34. dotaix-0.0.1/ref/research/2026-03-04/repos/aix/aix-docs/LICENSE +21 -0
  35. dotaix-0.0.1/ref/research/2026-03-04/repos/code-agnostic/LICENSE +674 -0
  36. dotaix-0.0.1/ref/research/2026-03-04/repos/code-agnostic/README.md +200 -0
  37. dotaix-0.0.1/ref/research/2026-03-04/repos/code-agnostic/website/README.md +42 -0
  38. dotaix-0.0.1/ref/research/2026-03-04/repos/coder-config/LICENSE +21 -0
  39. dotaix-0.0.1/ref/research/2026-03-04/repos/coder-config/README.md +700 -0
  40. dotaix-0.0.1/ref/research/2026-03-04/repos/coder-config/plugin/README.md +35 -0
  41. dotaix-0.0.1/ref/research/2026-03-04/repos/dallay-agentsync/LICENSE +21 -0
  42. dotaix-0.0.1/ref/research/2026-03-04/repos/dallay-agentsync/README.md +524 -0
  43. dotaix-0.0.1/ref/research/2026-03-04/repos/dallay-agentsync/npm/agentsync/README.md +199 -0
  44. dotaix-0.0.1/ref/research/2026-03-04/repos/dallay-agentsync/specs/001-skills-sh-integration/README.md +3 -0
  45. dotaix-0.0.1/ref/research/2026-03-04/repos/dallay-agentsync/website/docs/README.md +18 -0
  46. dotaix-0.0.1/ref/research/2026-03-04/repos/hcom/LICENSE +21 -0
  47. dotaix-0.0.1/ref/research/2026-03-04/repos/hcom/README.md +1156 -0
  48. dotaix-0.0.1/ref/research/2026-03-04/repos/rulesync/LICENSE +21 -0
  49. dotaix-0.0.1/ref/research/2026-03-04/repos/rulesync/README.md +101 -0
  50. dotaix-0.0.1/src/dotai/__init__.py +5 -0
  51. dotaix-0.0.1/src/dotai/cli.py +298 -0
  52. dotaix-0.0.1/src/dotai/core/__init__.py +17 -0
  53. dotaix-0.0.1/src/dotai/core/errors.py +33 -0
  54. dotaix-0.0.1/src/dotai/py.typed +0 -0
  55. dotaix-0.0.1/src/dotai/schemas/sources.yaml +48 -0
@@ -0,0 +1,181 @@
1
+ # pixi environments
2
+ .pixi/*
3
+ !.pixi/config.toml
4
+
5
+ # Created by https://www.toptal.com/developers/gitignore/api/python
6
+ # Edit at https://www.toptal.com/developers/gitignore?templates=python
7
+
8
+ ### Python ###
9
+ # Byte-compiled / optimized / DLL files
10
+ __pycache__/
11
+ *.py[cod]
12
+ *$py.class
13
+
14
+ # C extensions
15
+ *.so
16
+
17
+ # Distribution / packaging
18
+ .Python
19
+ build/
20
+ develop-eggs/
21
+ dist/
22
+ downloads/
23
+ eggs/
24
+ .eggs/
25
+ lib/
26
+ lib64/
27
+ parts/
28
+ sdist/
29
+ var/
30
+ wheels/
31
+ share/python-wheels/
32
+ *.egg-info/
33
+ .installed.cfg
34
+ *.egg
35
+ MANIFEST
36
+
37
+ # PyInstaller
38
+ # Usually these files are written by a python script from a template
39
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
40
+ *.manifest
41
+ *.spec
42
+
43
+ # Installer logs
44
+ pip-log.txt
45
+ pip-delete-this-directory.txt
46
+
47
+ # Unit test / coverage reports
48
+ htmlcov/
49
+ .tox/
50
+ .nox/
51
+ .coverage
52
+ .coverage.*
53
+ .cache
54
+ nosetests.xml
55
+ coverage.xml
56
+ *.cover
57
+ *.py,cover
58
+ .hypothesis/
59
+ .pytest_cache/
60
+ cover/
61
+
62
+ # Translations
63
+ *.mo
64
+ *.pot
65
+
66
+ # Django stuff:
67
+ *.log
68
+ local_settings.py
69
+ db.sqlite3
70
+ db.sqlite3-journal
71
+
72
+ # Flask stuff:
73
+ instance/
74
+ .webassets-cache
75
+
76
+ # Scrapy stuff:
77
+ .scrapy
78
+
79
+ # Sphinx documentation
80
+ docs/_build/
81
+
82
+ # PyBuilder
83
+ .pybuilder/
84
+ target/
85
+
86
+ # Jupyter Notebook
87
+ .ipynb_checkpoints
88
+
89
+ # IPython
90
+ profile_default/
91
+ ipython_config.py
92
+
93
+ # pyenv
94
+ # For a library or package, you might want to ignore these files since the code is
95
+ # intended to run in multiple environments; otherwise, check them in:
96
+ # .python-version
97
+
98
+ # pipenv
99
+ # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
100
+ # However, in case of collaboration, if having platform-specific dependencies or dependencies
101
+ # having no cross-platform support, pipenv may install dependencies that don't work, or not
102
+ # install all needed dependencies.
103
+ #Pipfile.lock
104
+
105
+ # poetry
106
+ # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
107
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
108
+ # commonly ignored for libraries.
109
+ # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
110
+ #poetry.lock
111
+
112
+ # pdm
113
+ # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
114
+ #pdm.lock
115
+ # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
116
+ # in version control.
117
+ # https://pdm.fming.dev/#use-with-ide
118
+ .pdm.toml
119
+
120
+ # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
121
+ __pypackages__/
122
+
123
+ # Celery stuff
124
+ celerybeat-schedule
125
+ celerybeat.pid
126
+
127
+ # SageMath parsed files
128
+ *.sage.py
129
+
130
+ # Environments
131
+ .env
132
+ .venv
133
+ env/
134
+ venv/
135
+ ENV/
136
+ env.bak/
137
+ venv.bak/
138
+
139
+ # Spyder project settings
140
+ .spyderproject
141
+ .spyproject
142
+
143
+ # Rope project settings
144
+ .ropeproject
145
+
146
+ # mkdocs documentation
147
+ /site
148
+
149
+ # mypy
150
+ .mypy_cache/
151
+ .dmypy.json
152
+ dmypy.json
153
+
154
+ # Pyre type checker
155
+ .pyre/
156
+
157
+ # pytype static type analyzer
158
+ .pytype/
159
+
160
+ # Cython debug symbols
161
+ cython_debug/
162
+
163
+ # PyCharm
164
+ # JetBrains specific template is maintained in a separate JetBrains.gitignore that can
165
+ # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
166
+ # and can be added to the global gitignore or merged into this file. For a more nuclear
167
+ # option (not recommended) you can uncomment the following to ignore the entire idea folder.
168
+ #.idea/
169
+
170
+ ### Python Patch ###
171
+ # Poetry local configuration file - https://python-poetry.org/docs/configuration/#local-configuration
172
+ poetry.toml
173
+
174
+ # ruff
175
+ .ruff_cache/
176
+
177
+ # LSP config files
178
+ pyrightconfig.json
179
+
180
+ # End of https://www.toptal.com/developers/gitignore/api/python
181
+ uv.lock
dotaix-0.0.1/PKG-INFO ADDED
@@ -0,0 +1,21 @@
1
+ Metadata-Version: 2.4
2
+ Name: dotaix
3
+ Version: 0.0.1
4
+ Author: dotai contributors
5
+ Classifier: Development Status :: 1 - Planning
6
+ Requires-Python: <3.14,>=3.10
7
+ Requires-Dist: pydantic-settings>=2.12.0
8
+ Requires-Dist: typer<0.24,>=0.23.0
9
+ Provides-Extra: dev
10
+ Requires-Dist: coverage; extra == 'dev'
11
+ Requires-Dist: packaging; extra == 'dev'
12
+ Requires-Dist: pre-commit; extra == 'dev'
13
+ Requires-Dist: pyright; extra == 'dev'
14
+ Requires-Dist: pytest; extra == 'dev'
15
+ Requires-Dist: pytest-cov; extra == 'dev'
16
+ Requires-Dist: pytest-sugar; extra == 'dev'
17
+ Requires-Dist: ruff; extra == 'dev'
18
+ Requires-Dist: ty; extra == 'dev'
19
+ Requires-Dist: types-requests; extra == 'dev'
20
+ Requires-Dist: zstandard; extra == 'dev'
21
+ Provides-Extra: gui
dotaix-0.0.1/README.md ADDED
@@ -0,0 +1,35 @@
1
+ # dotai 🔐
2
+
3
+ **dotai** is a project secret management tool designed to simplify Developer Experience (DevX). Aims to bridge the gap between secure vault backends and the diverse consumers that need them, providing a unified, repo-scoped interface for secret management.
4
+
5
+ ## 🚀 Vision
6
+
7
+ Managing secrets across multiple projects, backends, and deployment targets is a common source of friction and security risk. dotai makes it as easy as using a `.env` file, but with the power and security of industrial-grade secret managers.
8
+
9
+ ## ✨ Key Features
10
+
11
+ - **📂 Repo-Scoped Secrets:** Automatically discover and scope secrets based on your Git repository context.
12
+ - **🔄 Multi-Backend Sync:** Native integration with major secret providers:
13
+ - HashiCorp Vault
14
+ - Infisical
15
+ - Doppler
16
+ - 1Password
17
+ - **📡 Consumer Integration:** Seamlessly sync and inject secrets into:
18
+ - **CI/CD:** GitHub Actions, GitLab CI.
19
+ - **Environments:** GitHub Codespaces, Docker, Kubernetes.
20
+ - **Cloud:** AWS (Secrets Manager/Parameter Store), GCP (Secret Manager).
21
+ - **🔧 Syntax Conversion:** Automatically convert between standard `.env` formats and backend-specific syntaxes.
22
+ - **📝 Templates:** Define powerful templates for generating complex configuration files from secrets.
23
+ - **🖥️ CLI First:** A powerful, developer-centric CLI for all operations.
24
+
25
+ ## 📦 Installation
26
+
27
+ ### Via Pixi (Recommended)
28
+ ```bash
29
+ uv tool install dotaix
30
+ ```
31
+
32
+ ### Via pixi
33
+ ```bash
34
+ pixi global install dotaix
35
+ ```
@@ -0,0 +1,28 @@
1
+ BSD 3-Clause License
2
+
3
+ Copyright (c) 2024, Pavel Zwerschke
4
+
5
+ Redistribution and use in source and binary forms, with or without
6
+ modification, are permitted provided that the following conditions are met:
7
+
8
+ 1. Redistributions of source code must retain the above copyright notice, this
9
+ list of conditions and the following disclaimer.
10
+
11
+ 2. Redistributions in binary form must reproduce the above copyright notice,
12
+ this list of conditions and the following disclaimer in the documentation
13
+ and/or other materials provided with the distribution.
14
+
15
+ 3. Neither the name of the copyright holder nor the names of its
16
+ contributors may be used to endorse or promote products derived from
17
+ this software without specific prior written permission.
18
+
19
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
23
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
25
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
26
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
27
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@@ -0,0 +1,64 @@
1
+ # pydantic-settings-sops
2
+
3
+ [![CI](https://img.shields.io/github/actions/workflow/status/pavelzw/pydantic-settings-sops/ci.yml?style=flat-square&branch=main)](https://github.com/pavelzw/pydantic-settings-sops/actions/workflows/ci.yml)
4
+ [![conda-forge](https://img.shields.io/conda/vn/conda-forge/pydantic-settings-sops?logoColor=white&logo=conda-forge&style=flat-square)](https://prefix.dev/channels/conda-forge/packages/pydantic-settings-sops)
5
+ [![pypi-version](https://img.shields.io/pypi/v/pydantic-settings-sops.svg?logo=pypi&logoColor=white&style=flat-square)](https://pypi.org/project/pydantic-settings-sops)
6
+ [![python-version](https://img.shields.io/pypi/pyversions/pydantic-settings-sops?logoColor=white&logo=python&style=flat-square)](https://pypi.org/project/pydantic-settings-sops)
7
+
8
+ SOPS extension for `pydantic-settings`.
9
+
10
+ This package allows you to read SOPS files into a `pydantic-settings` object.
11
+
12
+ You can install this package via
13
+
14
+ ```bash
15
+ pip install pydantic-settings-sops
16
+ # or
17
+ pixi add pydantic-settings-sops
18
+ ```
19
+
20
+ ## Example
21
+
22
+ To use pydantic-settings-sops, adjust your settings sources by defining a custom `settings_customise_sources`.
23
+ For more information on `pydantic-settings`, please visit the [official documentation](https://docs.pydantic.dev/latest/concepts/pydantic_settings).
24
+
25
+ ```py
26
+ from pydantic_settings import (
27
+ BaseSettings,
28
+ PydanticBaseSettingsSource,
29
+ SettingsConfigDict,
30
+ )
31
+ from pydantic_settings_sops import SOPSConfigSettingsSource
32
+
33
+ class SettingsExample(BaseSettings):
34
+ model_config = SettingsConfigDict(
35
+ yaml_file="secrets.yaml"
36
+ )
37
+
38
+ foobar: str
39
+
40
+ @classmethod
41
+ def settings_customise_sources(
42
+ cls,
43
+ settings_cls: BaseSettings,
44
+ init_settings: PydanticBaseSettingsSource,
45
+ env_settings: PydanticBaseSettingsSource,
46
+ dotenv_settings: PydanticBaseSettingsSource,
47
+ file_secret_settings: PydanticBaseSettingsSource,
48
+ ) -> tuple[PydanticBaseSettingsSource, ...]:
49
+ return (init_settings, SOPSConfigSettingsSource(settings_cls))
50
+ ```
51
+
52
+ ## Installation
53
+
54
+ This project is managed by [pixi](https://pixi.sh).
55
+ You can install the package in development mode using:
56
+
57
+ ```bash
58
+ git clone https://github.com/pavelzw/pydantic-settings-sops
59
+ cd pydantic-settings-sops
60
+
61
+ pixi run pre-commit-install
62
+ pixi run postinstall
63
+ pixi run test
64
+ ```
@@ -0,0 +1,306 @@
1
+ # Single config file: keep wheel + conda + dev tasks in pyproject.toml.
2
+ # Hatchling wheel backend: PEP 517 builds via hatchling.
3
+ # Buildable with uv build: uv acts as the frontend, not the backend.
4
+ # Library + CLI + GUI: importable package plus console/gui entry points.
5
+ # Conda package via Pixi: pixi build produces .conda artifacts.
6
+ # Dependency coherence: runtime deps declared once under [project.dependencies] and (optionally) mapped into conda run deps.
7
+ # Dev workflow baked in: Pixi tasks provide standardized commands for formatting, linting, typing, testing, building, cleaning.
8
+
9
+ [project]
10
+ name = "dotaix"
11
+ version = "0.0.1"
12
+ # description = "Single Source of Truth (dotai) for coding agent configuration. Sync secrets between agent platforms"
13
+ # readme = "README.md"
14
+ # Pinned <3.14 to ensure compatibility with stable build backends and avoid experimental Python issues.
15
+ requires-python = ">=3.10,<3.14"
16
+ authors = [{ name = "dotai contributors" }]
17
+ classifiers = [
18
+ "Development Status :: 1 - Planning",
19
+ # "Intended Audience :: Developers",
20
+ # "Programming Language :: Python :: 3",
21
+ # "Programming Language :: Python :: 3.10",
22
+ # "Programming Language :: Python :: 3.11",
23
+ # "Programming Language :: Python :: 3.12",
24
+ # "Programming Language :: Python :: 3.13",
25
+ # "Programming Language :: Python",
26
+ # "Topic :: AI",
27
+ # "Topic :: Software Development",
28
+ # "Topic :: Utilities",
29
+ # "Environment :: Console",
30
+ # "Environment :: Plugins"
31
+ ]
32
+ # keywords = ["agents", "ai", "claude", "config"]
33
+
34
+ # Core runtime dependencies. pixi-build-python automatically maps these to Conda run-dependencies.
35
+ dependencies = [
36
+ "pydantic-settings>=2.12.0",
37
+ "typer>=0.23.0,<0.24",
38
+ ]
39
+
40
+ [project.optional-dependencies]
41
+ # Pixi automatically maps this 'dev' extra to a Pixi feature named 'dev'.
42
+ dev = [
43
+ "ruff",
44
+ "pyright",
45
+ "pytest",
46
+ "pytest-cov",
47
+ "packaging",
48
+ "zstandard",
49
+ "pytest-sugar",
50
+ "types-requests",
51
+ "ty",
52
+ "coverage",
53
+ "pre-commit",
54
+
55
+ ]
56
+ gui = []
57
+
58
+ [project.scripts]
59
+ dotai = "dotai.cli:main"
60
+ dotaix = "dotai.cli:main"
61
+
62
+ # [project.gui-scripts]
63
+ # dotagui = "dotai.gui:main"
64
+
65
+ # [project.urls]
66
+ # Homepage = "https://github.com/rwbot/dotai"
67
+ # Repository = "https://github.com/rwbot/dotai/repo"
68
+ # Issues = "https://github.com/rwbot/dotai/issues"
69
+
70
+ # ----------------------------
71
+ # Hatch (wheel backend config)
72
+ # ----------------------------
73
+ [build-system]
74
+ requires = ["hatchling"]
75
+ build-backend = "hatchling.build"
76
+
77
+ [tool.hatch.build.targets.wheel]
78
+ packages = ["src/dotai"]
79
+
80
+ [tool.hatch.build.targets.sdist]
81
+ include = ["src/**", "README.md", "LICENSE"]
82
+
83
+ # ----------------------------
84
+ # Pixi (env + tasks + conda build)
85
+ # ----------------------------
86
+
87
+ [tool.pixi.workspace]
88
+ # Opt-in to the preview 'pixi build' feature which enables building Conda packages from pyproject.toml.
89
+ preview = ["pixi-build"]
90
+ channels = ["conda-forge"]
91
+ platforms = ["linux-64", "linux-aarch64", "osx-arm64", "osx-64", "win-64"]
92
+
93
+ [tool.pixi.pypi-dependencies]
94
+ # Ensures the local package is installed in editable mode in the Pixi environment.
95
+ dotaix = { path = ".", editable = true }
96
+
97
+ [tool.pixi.feature.dev.dependencies]
98
+ # Pinned to match host-dependencies for environment consistency.
99
+ python = ">=3.10,<3.14"
100
+ # uv is used for the 'build-pypi' task.
101
+ uv = "*"
102
+ # mypy is required by the check-mypy pixi task.
103
+ mypy = "*"
104
+ # hatchling is included as a Conda package here so that
105
+ # 'uv build --no-build-isolation' can find it in the active environment.
106
+ hatchling = "*"
107
+
108
+ # Unix (Linux/macOS)
109
+ [tool.pixi.target.unix.activation.env]
110
+ UV_SYSTEM_PYTHON = "1" # Prevents creation of .venv, ensuring uv uses the Pixi-managed Python interpreter in .pixi
111
+
112
+ [tool.pixi.environments]
113
+ # The 'dev' feature includes both the Conda tools above and the PyPI extras from project.optional-dependencies.dev.
114
+ default = ["dev"]
115
+
116
+ # ----------------------------
117
+ # Pixi package build config (conda artifacts)
118
+ # ----------------------------
119
+
120
+ [tool.pixi.package]
121
+ name = "dotai"
122
+ # This version field is automatically updated by the 'sync-conda-version' task before 'pixi build' runs.
123
+ version = "0.0.1"
124
+ # Note: 'description', 'authors', 'license', 'readme', and URLs are automatically
125
+ # extracted from the [project] section by the pixi-build-python backend.
126
+
127
+ [tool.pixi.package.build.backend]
128
+ name = "pixi-build-python"
129
+ version = "0.4.*"
130
+ channels = ["https://prefix.dev/pixi-build-backends", "conda-forge"]
131
+
132
+ [tool.pixi.package.build.config]
133
+ # Ensures the backend reads pyproject.toml for dependencies and metadata.
134
+ ignore-pyproject-manifest = false
135
+ # Allows mapping PyPI dependencies to Conda equivalents during the build.
136
+ ignore-pypi-mapping = false
137
+
138
+ [tool.pixi.package.host-dependencies]
139
+ # Host dependencies are used inside the build environment created by 'pixi build'.
140
+ # They must match your local dev environment to ensure the internal wheel build is identical.
141
+ python = ">=3.10,<3.14"
142
+ hatchling = "*"
143
+ uv = "*"
144
+
145
+ [tool.pixi.package.run-dependencies]
146
+ # Runtime Python constraint for the Conda package.
147
+ python = ">=3.10,<3.14"
148
+
149
+ # ----------------------------
150
+ # Tooling defaults
151
+ # ----------------------------
152
+
153
+ [tool.mypy]
154
+ strict = true
155
+ python_version = '3.11'
156
+ show_error_codes = true
157
+ follow_imports = 'silent'
158
+ strict_optional = true
159
+ warn_redundant_casts = true
160
+ warn_unused_ignores = true
161
+ disallow_any_generics = true
162
+ check_untyped_defs = true
163
+ no_implicit_reexport = true
164
+ warn_unused_configs = true
165
+ disallow_subclassing_any = true
166
+ disallow_incomplete_defs = true
167
+ disallow_untyped_decorators = true
168
+ disallow_untyped_calls = true
169
+ # for strict mypy
170
+ disallow_untyped_defs = true
171
+
172
+ [[tool.mypy.overrides]]
173
+ module = "shellingham"
174
+ ignore_missing_imports = true
175
+
176
+ [tool.pytest.ini_options]
177
+ testpaths = ["tests"]
178
+ addopts = ["-ra"]
179
+
180
+ [tool.ruff]
181
+ target-version = "py311"
182
+ line-length = 100
183
+ src = [ "src" ]
184
+
185
+ preview = true
186
+ format.indent-style = "space"
187
+ format.quote-style = "double"
188
+ format.line-ending = "auto"
189
+ format.skip-magic-trailing-comma = false
190
+ format.docstring-code-format = true
191
+ lint.select = [
192
+ "A", # flake8-builtins
193
+ "ANN", # flake8-annotations
194
+ "ARG", # flake8-unused-arguments
195
+ "ASYNC", # flake8-async
196
+ "B", # flake8-bugbear
197
+ "BLE", # flake8-blind-except
198
+ "C4", # flake8-comprehensions
199
+ "C90", # mccabe
200
+ "COM", # flake8-commas
201
+ "DOC", # pydoclint
202
+ "DTZ", # flake8-datetimez
203
+ "E", # pycodestyle errors
204
+ "EM", # flake8-errmsg
205
+ "ERA", # eradicate
206
+ "EXE", # flake8-executable
207
+ "F", # pyflakes
208
+ "FA", # flake8-future-annotations
209
+ "FIX", # flake8-fixme
210
+ "FLY", # flynt
211
+ "FURB", # refurb
212
+ "G", # flake8-logging-format
213
+ "I", # isort
214
+ "ICN", # flake8-import-conventions
215
+ "INP", # flake8-no-pep420
216
+ "ISC", # flake8-implicit-str-concat
217
+ "LOG", # flake8-logging
218
+ "N", # pep8-naming
219
+ "PERF", # perflint
220
+ "PGH", # pygrep-hooks
221
+ "PIE", # flake8-pie
222
+ "PL", # pylint
223
+ "PT", # flake8-pytest-style
224
+ "PYI", # flake8-pyi (for stub files)
225
+ "Q", # flake8-quotes
226
+ "RET", # flake8-return
227
+ "RSE", # flake8-raise
228
+ "RUF", # ruff-specific rules
229
+ "S", # flake8-bandit
230
+ "SIM", # flake8-simplify
231
+ "SLF", # flake8-self
232
+ "SLOT", # flake8-slots
233
+ "T10", # flake8-debugger
234
+ "T20", # flake8-print
235
+ "TC", # flake8-type-checking
236
+ "TD", # flake8-todos
237
+ "TID", # flake8-tidy-imports
238
+ "TRY", # tryceratops
239
+ "UP", # pyupgrade
240
+ "W", # pycodestyle warnings
241
+ "YTT", # flake8-2020
242
+ ]
243
+ lint.ignore = [
244
+ "B008", # do not perform function calls in argument defaults
245
+ "C901", # too complex
246
+ "COM812", # Missing trailing comma (formatter conflict)
247
+ "E501", # line too long, handled by formatter
248
+ "ISC001", # Implicit string concatenation (formatter conflict)
249
+ "TID252", # relative imports okay
250
+ "W191", # indentation contains tabs
251
+ ]
252
+ lint.per-file-ignores."tests/*" = [
253
+ "ANN", # Type annotations in tests
254
+ "S101", # Use of `assert` detected
255
+ "SLF001", # Private member accessed
256
+ ]
257
+ lint.flake8-quotes = { inline-quotes = 'double', multiline-quotes = 'double' }
258
+ lint.isort = { known-first-party = [ 'pixi_ask', 'tests' ] }
259
+ lint.mccabe = { max-complexity = 14 }
260
+ lint.pydocstyle = { convention = 'google' }
261
+ # Preserve types, even if a file imports `from __future__ import annotations`.
262
+ lint.pyupgrade.keep-runtime-typing = true
263
+
264
+
265
+ # ----------------------------
266
+ # Pixi Tasks
267
+ # ----------------------------
268
+ [tool.pixi.tasks]
269
+ fmt = "ruff format src/ tests"
270
+ lint = {cmd = "ruff check . --fix", depends-on = "fmt"}
271
+ check-mypy = { cmd = "mypy src/ tests", description = "type check with mypy", default-environment = "dev" }
272
+ check-ty = { cmd = "ty check src/ tests", description = "type check with ty", default-environment = "dev" }
273
+ check = { depends-on = [ "check-mypy", "check-ty", "fmt" ], description = "Run all formatting, linting, and checking" }
274
+ test = { cmd = "pytest --cov --cov-report=term-missing --cov-report=xml -o console_output_style=progress --showlocals", description = "Run tests", env = { TERMINAL_WIDTH = "3000", _TYPER_FORCE_DISABLE_TERMINAL = "1", _TYPER_RUN_INSTALL_COMPLETION_TESTS = "1" }, default-environment = "dev", depends-on = ["check"] }
275
+ test-nocov = "pytest --"
276
+ strip-comments = "python tasks/strip_comments.py"
277
+ publish-pypi = "uv publish"
278
+ publish-conda = "pixi upload prefix --channel rwbot dist/*.conda --skip-existing"
279
+ prec = "prek"
280
+ # A robust Python-based clean script that avoids deleting the .pixi directory,
281
+ # which would destroy the environment currently running the tasks.
282
+ clean-all = "python -c 'import shutil, pathlib; [shutil.rmtree(p, ignore_errors=True) for p in [\"dist\", \"build\", \".tmp\", \".venv\", \".ruff_cache\"]]; [p.unlink(missing_ok=True) for p in pathlib.Path(\".\").glob(\"*.conda\")]'"
283
+
284
+ # Builds both Wheel and SDist using uv.
285
+ # --no-build-isolation uses the build backends already installed in the Pixi environment.
286
+ # --python python forces uv to use the Pixi-managed interpreter.
287
+ build-pypi = "uv build --no-build-isolation --python python"
288
+
289
+ # Extracts the version from the generated wheel and patches [tool.pixi.package].version.
290
+ # This ensures the Conda package metadata matches the Python package metadata exactly.
291
+ sync-conda-version = { cmd = "python tasks/sync_conda_version.py", depends-on = [
292
+ "build-pypi",
293
+ ] }
294
+
295
+ # Builds the Conda artifact. --output-dir dist co-locates the .conda file with wheels/sdist.
296
+ build-all = { cmd = "pixi build --output-dir dist", depends-on = [
297
+ "sync-conda-version",
298
+ ] }
299
+
300
+ # A safety check that confirms the internal version strings of all generated artifacts match.
301
+ validate-artifacts = { cmd = "python tasks/validate_artifacts.py", depends-on = [
302
+ "build-all",
303
+ ] }
304
+
305
+ # The full pipeline: clean, build python, sync version, build conda, and validate.
306
+ clean-build-all = { depends-on = ["clean-all", "validate-artifacts"] }
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Thor Einstein
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.