anolis-workbench 0.1.0__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 (91) hide show
  1. anolis_workbench-0.1.0/.gitattributes +13 -0
  2. anolis_workbench-0.1.0/.github/workflows/ci.yml +184 -0
  3. anolis_workbench-0.1.0/.github/workflows/release.yml +219 -0
  4. anolis_workbench-0.1.0/.gitignore +212 -0
  5. anolis_workbench-0.1.0/LICENSE +661 -0
  6. anolis_workbench-0.1.0/PKG-INFO +85 -0
  7. anolis_workbench-0.1.0/README.md +64 -0
  8. anolis_workbench-0.1.0/anolis_workbench/__init__.py +1 -0
  9. anolis_workbench-0.1.0/anolis_workbench/catalog/providers.json +96 -0
  10. anolis_workbench-0.1.0/anolis_workbench/cli/__init__.py +1 -0
  11. anolis_workbench-0.1.0/anolis_workbench/cli/main.py +13 -0
  12. anolis_workbench-0.1.0/anolis_workbench/cli/package_cli.py +46 -0
  13. anolis_workbench-0.1.0/anolis_workbench/cli/validate_cli.py +44 -0
  14. anolis_workbench-0.1.0/anolis_workbench/core/__init__.py +1 -0
  15. anolis_workbench-0.1.0/anolis_workbench/core/exporter.py +393 -0
  16. anolis_workbench-0.1.0/anolis_workbench/core/launcher.py +732 -0
  17. anolis_workbench-0.1.0/anolis_workbench/core/package_validator.py +396 -0
  18. anolis_workbench-0.1.0/anolis_workbench/core/paths.py +72 -0
  19. anolis_workbench-0.1.0/anolis_workbench/core/projects.py +271 -0
  20. anolis_workbench-0.1.0/anolis_workbench/core/renderer.py +278 -0
  21. anolis_workbench-0.1.0/anolis_workbench/core/validator.py +143 -0
  22. anolis_workbench-0.1.0/anolis_workbench/frontend/css/style.css +1167 -0
  23. anolis_workbench-0.1.0/anolis_workbench/frontend/index.html +252 -0
  24. anolis_workbench-0.1.0/anolis_workbench/schema/system.schema.json +136 -0
  25. anolis_workbench-0.1.0/anolis_workbench/schemas/machine-profile.schema.json +182 -0
  26. anolis_workbench-0.1.0/anolis_workbench/schemas/runtime-config.schema.json +732 -0
  27. anolis_workbench-0.1.0/anolis_workbench/server/__init__.py +1 -0
  28. anolis_workbench-0.1.0/anolis_workbench/server/app.py +256 -0
  29. anolis_workbench-0.1.0/anolis_workbench/server/routes/__init__.py +1 -0
  30. anolis_workbench-0.1.0/anolis_workbench/server/routes/commission.py +136 -0
  31. anolis_workbench-0.1.0/anolis_workbench/server/routes/compose.py +177 -0
  32. anolis_workbench-0.1.0/anolis_workbench/server/routes/operate.py +110 -0
  33. anolis_workbench-0.1.0/anolis_workbench/templates/bioreactor-manual/system.json +101 -0
  34. anolis_workbench-0.1.0/anolis_workbench/templates/mixed-bus-mock/system.json +93 -0
  35. anolis_workbench-0.1.0/anolis_workbench/templates/sim-quickstart/system.json +58 -0
  36. anolis_workbench-0.1.0/contracts/README.md +20 -0
  37. anolis_workbench-0.1.0/contracts/composer-control.openapi.v1.yaml +227 -0
  38. anolis_workbench-0.1.0/contracts/runtime-http.openapi.v0.yaml +805 -0
  39. anolis_workbench-0.1.0/contracts/validate-composer-control-openapi.py +228 -0
  40. anolis_workbench-0.1.0/contracts/validate-handoff-packages.py +17 -0
  41. anolis_workbench-0.1.0/contracts/validate-workbench-api-openapi.py +306 -0
  42. anolis_workbench-0.1.0/contracts/workbench-api.openapi.v1.yaml +752 -0
  43. anolis_workbench-0.1.0/docs/commissioning-handoff-runbook.md +101 -0
  44. anolis_workbench-0.1.0/docs/contracts/composer-control-baseline.md +59 -0
  45. anolis_workbench-0.1.0/docs/contracts/handoff-package-baseline.md +59 -0
  46. anolis_workbench-0.1.0/docs/contracts/handoff-package-v1.md +84 -0
  47. anolis_workbench-0.1.0/docs/release-pypi-handoff.md +104 -0
  48. anolis_workbench-0.1.0/frontend/index.html +12 -0
  49. anolis_workbench-0.1.0/frontend/package-lock.json +1508 -0
  50. anolis_workbench-0.1.0/frontend/package.json +18 -0
  51. anolis_workbench-0.1.0/frontend/src/App.svelte +279 -0
  52. anolis_workbench-0.1.0/frontend/src/app.css +1100 -0
  53. anolis_workbench-0.1.0/frontend/src/lib/ProviderList.svelte +507 -0
  54. anolis_workbench-0.1.0/frontend/src/lib/RuntimeForm.svelte +172 -0
  55. anolis_workbench-0.1.0/frontend/src/lib/api.js +68 -0
  56. anolis_workbench-0.1.0/frontend/src/lib/guards.js +93 -0
  57. anolis_workbench-0.1.0/frontend/src/lib/operate-contracts.js +162 -0
  58. anolis_workbench-0.1.0/frontend/src/lib/operate-events.js +152 -0
  59. anolis_workbench-0.1.0/frontend/src/main.js +7 -0
  60. anolis_workbench-0.1.0/frontend/src/routes/Commission.svelte +443 -0
  61. anolis_workbench-0.1.0/frontend/src/routes/Compose.svelte +90 -0
  62. anolis_workbench-0.1.0/frontend/src/routes/Home.svelte +122 -0
  63. anolis_workbench-0.1.0/frontend/src/routes/Operate.svelte +710 -0
  64. anolis_workbench-0.1.0/frontend/svelte.config.js +5 -0
  65. anolis_workbench-0.1.0/frontend/vite.config.js +17 -0
  66. anolis_workbench-0.1.0/pyproject.toml +92 -0
  67. anolis_workbench-0.1.0/requirements-lock.txt +29 -0
  68. anolis_workbench-0.1.0/requirements.txt +16 -0
  69. anolis_workbench-0.1.0/schemas/machine-profile.schema.json +182 -0
  70. anolis_workbench-0.1.0/schemas/runtime-config.schema.json +732 -0
  71. anolis_workbench-0.1.0/start.cmd +9 -0
  72. anolis_workbench-0.1.0/start.sh +4 -0
  73. anolis_workbench-0.1.0/tests/fixtures/bioreactor/anolis-runtime.bioreactor.manual.yaml +50 -0
  74. anolis_workbench-0.1.0/tests/fixtures/bioreactor/anolis-runtime.bioreactor.telemetry.yaml +57 -0
  75. anolis_workbench-0.1.0/tests/fixtures/bioreactor/provider-bread.bioreactor.yaml +27 -0
  76. anolis_workbench-0.1.0/tests/fixtures/bioreactor/provider-ezo.bioreactor.yaml +21 -0
  77. anolis_workbench-0.1.0/tests/test_templates.py +234 -0
  78. anolis_workbench-0.1.0/tests/unit/launch_url_resolution.test.mjs +49 -0
  79. anolis_workbench-0.1.0/tests/unit/operate_contracts.test.mjs +206 -0
  80. anolis_workbench-0.1.0/tests/unit/operate_events.test.mjs +198 -0
  81. anolis_workbench-0.1.0/tests/unit/smoke_system_composer.py +204 -0
  82. anolis_workbench-0.1.0/tests/unit/test_control_contract.py +323 -0
  83. anolis_workbench-0.1.0/tests/unit/test_exporter.py +177 -0
  84. anolis_workbench-0.1.0/tests/unit/test_package_validator.py +160 -0
  85. anolis_workbench-0.1.0/tests/unit/test_paths_runtime_support.py +64 -0
  86. anolis_workbench-0.1.0/tests/unit/test_projects_validation.py +86 -0
  87. anolis_workbench-0.1.0/tests/unit/test_shell_route_support.py +412 -0
  88. anolis_workbench-0.1.0/tests/unit/test_validator.py +347 -0
  89. anolis_workbench-0.1.0/tests/unit/workbench_guards.test.mjs +121 -0
  90. anolis_workbench-0.1.0/uv.lock +805 -0
  91. anolis_workbench-0.1.0/workbench-api-contract.md +712 -0
@@ -0,0 +1,13 @@
1
+ # Enforce LF line endings for all text files
2
+ * text=auto eol=lf
3
+
4
+ # Windows batch scripts use CRLF
5
+ *.cmd text eol=crlf
6
+ *.bat text eol=crlf
7
+
8
+ # Explicitly binary
9
+ *.png binary
10
+ *.jpg binary
11
+ *.ico binary
12
+ *.woff2 binary
13
+ *.woff binary
@@ -0,0 +1,184 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ paths-ignore:
7
+ - "docs/**"
8
+ - "**/*.md"
9
+ - "**/*.png"
10
+ - "**/*.svg"
11
+ pull_request:
12
+ branches: [main]
13
+ paths-ignore:
14
+ - "docs/**"
15
+ - "**/*.md"
16
+ - "**/*.png"
17
+ - "**/*.svg"
18
+ workflow_dispatch:
19
+ workflow_call:
20
+
21
+ permissions:
22
+ contents: read
23
+
24
+ concurrency:
25
+ group: ci-${{ github.ref }}
26
+ cancel-in-progress: true
27
+
28
+ jobs:
29
+ frontend:
30
+ name: Frontend (Node / Vite build)
31
+ runs-on: ubuntu-24.04
32
+ timeout-minutes: 10
33
+
34
+ steps:
35
+ - uses: actions/checkout@v4
36
+
37
+ - uses: actions/setup-node@v4
38
+ with:
39
+ node-version: "20"
40
+ cache: "npm"
41
+ cache-dependency-path: frontend/package-lock.json
42
+
43
+ - name: Install dependencies
44
+ run: npm ci
45
+ working-directory: frontend
46
+
47
+ - name: Build
48
+ run: npm run build
49
+ working-directory: frontend
50
+
51
+ lint:
52
+ name: Lint (ruff)
53
+ runs-on: ubuntu-24.04
54
+ timeout-minutes: 10
55
+
56
+ steps:
57
+ - uses: actions/checkout@v4
58
+
59
+ - uses: actions/setup-python@v5
60
+ with:
61
+ python-version: "3.12"
62
+
63
+ - uses: astral-sh/setup-uv@v3
64
+ with:
65
+ enable-cache: true
66
+ cache-dependency-glob: |
67
+ pyproject.toml
68
+ uv.lock
69
+
70
+ - name: Install dependencies
71
+ run: |
72
+ uv venv
73
+ uv pip install -e .[dev]
74
+
75
+ - name: Check
76
+ run: |
77
+ uv run ruff check . --output-format=github
78
+ uv run ruff format --check .
79
+
80
+ typecheck:
81
+ name: Type check (mypy)
82
+ runs-on: ubuntu-24.04
83
+ timeout-minutes: 10
84
+
85
+ steps:
86
+ - uses: actions/checkout@v4
87
+
88
+ - uses: actions/setup-python@v5
89
+ with:
90
+ python-version: "3.12"
91
+
92
+ - uses: astral-sh/setup-uv@v3
93
+ with:
94
+ enable-cache: true
95
+ cache-dependency-glob: |
96
+ pyproject.toml
97
+ uv.lock
98
+
99
+ - name: Install dependencies
100
+ run: |
101
+ uv venv
102
+ uv pip install -e .[dev]
103
+
104
+ - name: Run mypy
105
+ run: uv run mypy anolis_workbench tests
106
+
107
+ test:
108
+ name: Unit tests
109
+ runs-on: ubuntu-24.04
110
+ timeout-minutes: 15
111
+
112
+ steps:
113
+ - uses: actions/checkout@v4
114
+
115
+ - uses: actions/setup-node@v4
116
+ with:
117
+ node-version: "20"
118
+ cache: "npm"
119
+ cache-dependency-path: frontend/package-lock.json
120
+
121
+ - name: Build frontend
122
+ run: |
123
+ npm ci
124
+ npm run build
125
+ working-directory: frontend
126
+
127
+ - uses: actions/setup-python@v5
128
+ with:
129
+ python-version: "3.12"
130
+
131
+ - uses: astral-sh/setup-uv@v3
132
+ with:
133
+ enable-cache: true
134
+ cache-dependency-glob: |
135
+ pyproject.toml
136
+ uv.lock
137
+
138
+ - name: Install dependencies
139
+ run: |
140
+ uv venv
141
+ uv pip install -e .[dev]
142
+
143
+ - name: Run tests
144
+ run: uv run pytest tests/ -v --tb=short
145
+
146
+ - name: Validate composer-control OpenAPI
147
+ run: uv run python contracts/validate-composer-control-openapi.py
148
+
149
+ - name: Validate workbench-api OpenAPI
150
+ run: uv run python contracts/validate-workbench-api-openapi.py
151
+
152
+ contract-drift:
153
+ name: Contract drift check
154
+ runs-on: ubuntu-24.04
155
+ timeout-minutes: 10
156
+
157
+ steps:
158
+ - uses: actions/checkout@v4
159
+
160
+ - uses: actions/checkout@v4
161
+ with:
162
+ repository: FEASTorg/anolis
163
+ path: anolis-upstream
164
+ sparse-checkout: |
165
+ schemas/machine-profile.schema.json
166
+ schemas/runtime-config.schema.json
167
+ schemas/http/runtime-http.openapi.v0.yaml
168
+ sparse-checkout-cone-mode: false
169
+
170
+ - name: Compare bundled schemas
171
+ run: |
172
+ diff anolis_workbench/schemas/machine-profile.schema.json \
173
+ anolis-upstream/schemas/machine-profile.schema.json || \
174
+ (echo "machine-profile schema drift detected" && exit 1)
175
+
176
+ diff anolis_workbench/schemas/runtime-config.schema.json \
177
+ anolis-upstream/schemas/runtime-config.schema.json || \
178
+ (echo "runtime-config schema drift detected" && exit 1)
179
+
180
+ - name: Compare OpenAPI contract snapshot
181
+ run: |
182
+ diff contracts/runtime-http.openapi.v0.yaml \
183
+ anolis-upstream/schemas/http/runtime-http.openapi.v0.yaml || \
184
+ (echo "runtime-http OpenAPI contract drift detected" && exit 1)
@@ -0,0 +1,219 @@
1
+ name: Release
2
+
3
+ on:
4
+ workflow_dispatch:
5
+ inputs:
6
+ version:
7
+ description: Version to release (e.g. 0.1.0)
8
+ required: true
9
+ type: string
10
+ prerelease:
11
+ description: Mark release as prerelease
12
+ required: false
13
+ type: boolean
14
+ default: false
15
+
16
+ permissions:
17
+ contents: write
18
+
19
+ jobs:
20
+ validate:
21
+ name: Validate release request
22
+ runs-on: ubuntu-latest
23
+ outputs:
24
+ tag: ${{ steps.validate.outputs.tag }}
25
+ steps:
26
+ - name: Checkout repository
27
+ uses: actions/checkout@v4
28
+ with:
29
+ fetch-depth: 0
30
+
31
+ - name: Validate requested version
32
+ id: validate
33
+ run: |
34
+ set -euo pipefail
35
+
36
+ VERSION="${{ inputs.version }}"
37
+ if [[ ! "$VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z0-9.]+)?$ ]]; then
38
+ echo "Invalid semver version: $VERSION"
39
+ exit 1
40
+ fi
41
+
42
+ PYPROJECT_VERSION=$(python3 -c "import pathlib, tomllib; print(tomllib.loads(pathlib.Path('pyproject.toml').read_text())['project']['version'])")
43
+
44
+ if [[ "$VERSION" != "$PYPROJECT_VERSION" ]]; then
45
+ echo "Version mismatch: input=$VERSION pyproject=$PYPROJECT_VERSION"
46
+ exit 1
47
+ fi
48
+
49
+ TAG="v$VERSION"
50
+ if git rev-parse "$TAG" >/dev/null 2>&1; then
51
+ echo "Tag already exists: $TAG"
52
+ exit 1
53
+ fi
54
+
55
+ echo "tag=$TAG" >> "$GITHUB_OUTPUT"
56
+ echo "Release request validated for $TAG"
57
+
58
+ ci:
59
+ name: CI gate
60
+ needs: validate
61
+ uses: ./.github/workflows/ci.yml
62
+
63
+ build:
64
+ name: Build sdist and wheel
65
+ needs: [validate, ci]
66
+ runs-on: ubuntu-latest
67
+ steps:
68
+ - name: Checkout repository
69
+ uses: actions/checkout@v4
70
+
71
+ - name: Setup Node
72
+ uses: actions/setup-node@v4
73
+ with:
74
+ node-version: "20"
75
+ cache: "npm"
76
+ cache-dependency-path: frontend/package-lock.json
77
+
78
+ - name: Build frontend
79
+ run: |
80
+ npm ci
81
+ npm run build
82
+ working-directory: frontend
83
+
84
+ - name: Setup Python
85
+ uses: actions/setup-python@v5
86
+ with:
87
+ python-version: "3.12"
88
+
89
+ - name: Setup uv
90
+ uses: astral-sh/setup-uv@v3
91
+ with:
92
+ enable-cache: true
93
+ cache-dependency-glob: |
94
+ pyproject.toml
95
+ uv.lock
96
+
97
+ - name: Install dependencies
98
+ run: |
99
+ uv venv
100
+ uv pip install -e .[dev]
101
+
102
+ - name: Build distributions
103
+ run: uv build
104
+
105
+ - name: Verify dist artifacts
106
+ run: |
107
+ set -euo pipefail
108
+ test -d dist
109
+ ls -lh dist/
110
+ ls dist/*.whl dist/*.tar.gz >/dev/null
111
+
112
+ - name: Upload dist artifacts
113
+ uses: actions/upload-artifact@v4
114
+ with:
115
+ name: dist-artifacts
116
+ path: dist/*
117
+ if-no-files-found: error
118
+ retention-days: 14
119
+
120
+ publish-pypi:
121
+ name: Publish to PyPI
122
+ needs: [validate, build]
123
+ runs-on: ubuntu-latest
124
+ environment:
125
+ name: pypi
126
+ url: https://pypi.org/project/anolis-workbench/
127
+ permissions:
128
+ id-token: write # OIDC trusted publisher
129
+ contents: read
130
+ steps:
131
+ - name: Download dist artifacts
132
+ uses: actions/download-artifact@v4
133
+ with:
134
+ name: dist-artifacts
135
+ path: dist
136
+
137
+ - name: Publish package to PyPI
138
+ uses: pypa/gh-action-pypi-publish@release/v1
139
+ with:
140
+ print-hash: true
141
+
142
+ smoke-test:
143
+ name: Smoke test from clean install
144
+ needs: [validate, publish-pypi]
145
+ runs-on: ubuntu-latest
146
+ steps:
147
+ - name: Setup Python
148
+ uses: actions/setup-python@v5
149
+ with:
150
+ python-version: "3.12"
151
+
152
+ - name: Install from PyPI and run smoke checks
153
+ run: |
154
+ set -euo pipefail
155
+ python -m venv /tmp/smoke-venv
156
+ /tmp/smoke-venv/bin/pip install --quiet "anolis-workbench==${{ inputs.version }}"
157
+ /tmp/smoke-venv/bin/anolis-workbench --help
158
+ /tmp/smoke-venv/bin/anolis-package --help
159
+ /tmp/smoke-venv/bin/anolis-validate --help
160
+ echo "Smoke test passed for anolis-workbench==${{ inputs.version }}"
161
+
162
+ create-release:
163
+ name: Tag and create GitHub Release
164
+ needs: [validate, smoke-test]
165
+ runs-on: ubuntu-latest
166
+ permissions:
167
+ contents: write
168
+ steps:
169
+ - name: Checkout repository
170
+ uses: actions/checkout@v4
171
+ with:
172
+ fetch-depth: 0
173
+
174
+ - name: Download dist artifacts
175
+ uses: actions/download-artifact@v4
176
+ with:
177
+ name: dist-artifacts
178
+ path: dist
179
+
180
+ - name: Create and push release tag
181
+ run: |
182
+ set -euo pipefail
183
+ TAG="${{ needs.validate.outputs.tag }}"
184
+ git config user.name "github-actions[bot]"
185
+ git config user.email "github-actions[bot]@users.noreply.github.com"
186
+ git tag -a "$TAG" -m "Release ${{ inputs.version }}"
187
+ git push origin "$TAG"
188
+
189
+ - name: Generate release notes
190
+ id: notes
191
+ uses: actions/github-script@v7
192
+ with:
193
+ script: |
194
+ const version = '${{ inputs.version }}';
195
+ const tag = '${{ needs.validate.outputs.tag }}';
196
+ const owner = context.repo.owner;
197
+ const repo = context.repo.repo;
198
+ return [
199
+ `Release ${version}`,
200
+ ``,
201
+ `Install: \`pip install anolis-workbench==${version}\``,
202
+ ``,
203
+ `Assets include wheel and source distribution.`,
204
+ ``,
205
+ `Tag: ${tag}`,
206
+ `Repository: ${owner}/${repo}`,
207
+ ].join('\n');
208
+ result-encoding: string
209
+
210
+ - name: Create GitHub Release
211
+ uses: softprops/action-gh-release@v2
212
+ with:
213
+ tag_name: ${{ needs.validate.outputs.tag }}
214
+ name: Release ${{ inputs.version }}
215
+ body: ${{ steps.notes.outputs.result }}
216
+ prerelease: ${{ inputs.prerelease }}
217
+ files: |
218
+ dist/*.whl
219
+ dist/*.tar.gz
@@ -0,0 +1,212 @@
1
+ # Node / frontend
2
+ frontend/node_modules/
3
+ # SPA build output — generated by `npm run build`, not committed
4
+ anolis_workbench/frontend/dist/
5
+
6
+ # Byte-compiled / optimized / DLL files
7
+ __pycache__/
8
+ *.py[codz]
9
+ *$py.class
10
+
11
+ # C extensions
12
+ *.so
13
+
14
+ # Distribution / packaging
15
+ .Python
16
+ build/
17
+ develop-eggs/
18
+ dist/
19
+ downloads/
20
+ eggs/
21
+ .eggs/
22
+ /lib/
23
+ /lib64/
24
+ parts/
25
+ sdist/
26
+ var/
27
+ wheels/
28
+ share/python-wheels/
29
+ *.egg-info/
30
+ .installed.cfg
31
+ *.egg
32
+ MANIFEST
33
+
34
+ # PyInstaller
35
+ # Usually these files are written by a python script from a template
36
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
37
+ *.manifest
38
+ *.spec
39
+
40
+ # Installer logs
41
+ pip-log.txt
42
+ pip-delete-this-directory.txt
43
+
44
+ # Unit test / coverage reports
45
+ htmlcov/
46
+ .tox/
47
+ .nox/
48
+ .coverage
49
+ .coverage.*
50
+ .cache
51
+ nosetests.xml
52
+ coverage.xml
53
+ *.cover
54
+ *.py.cover
55
+ .hypothesis/
56
+ .pytest_cache/
57
+ cover/
58
+
59
+ # Translations
60
+ *.mo
61
+ *.pot
62
+
63
+ # Django stuff:
64
+ *.log
65
+ local_settings.py
66
+ db.sqlite3
67
+ db.sqlite3-journal
68
+
69
+ # Flask stuff:
70
+ instance/
71
+ .webassets-cache
72
+
73
+ # Scrapy stuff:
74
+ .scrapy
75
+
76
+ # Sphinx documentation
77
+ docs/_build/
78
+
79
+ # PyBuilder
80
+ .pybuilder/
81
+ target/
82
+
83
+ # Jupyter Notebook
84
+ .ipynb_checkpoints
85
+
86
+ # IPython
87
+ profile_default/
88
+ ipython_config.py
89
+
90
+ # pyenv
91
+ # For a library or package, you might want to ignore these files since the code is
92
+ # intended to run in multiple environments; otherwise, check them in:
93
+ # .python-version
94
+
95
+ # pipenv
96
+ # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
97
+ # However, in case of collaboration, if having platform-specific dependencies or dependencies
98
+ # having no cross-platform support, pipenv may install dependencies that don't work, or not
99
+ # install all needed dependencies.
100
+ #Pipfile.lock
101
+
102
+ # UV
103
+ # Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control.
104
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
105
+ # commonly ignored for libraries.
106
+ #uv.lock
107
+
108
+ # poetry
109
+ # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
110
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
111
+ # commonly ignored for libraries.
112
+ # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
113
+ #poetry.lock
114
+ #poetry.toml
115
+
116
+ # pdm
117
+ # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
118
+ # pdm recommends including project-wide configuration in pdm.toml, but excluding .pdm-python.
119
+ # https://pdm-project.org/en/latest/usage/project/#working-with-version-control
120
+ #pdm.lock
121
+ #pdm.toml
122
+ .pdm-python
123
+ .pdm-build/
124
+
125
+ # pixi
126
+ # Similar to Pipfile.lock, it is generally recommended to include pixi.lock in version control.
127
+ #pixi.lock
128
+ # Pixi creates a virtual environment in the .pixi directory, just like venv module creates one
129
+ # in the .venv directory. It is recommended not to include this directory in version control.
130
+ .pixi
131
+
132
+ # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
133
+ __pypackages__/
134
+
135
+ # Celery stuff
136
+ celerybeat-schedule
137
+ celerybeat.pid
138
+
139
+ # SageMath parsed files
140
+ *.sage.py
141
+
142
+ # Environments
143
+ .env
144
+ .envrc
145
+ .venv
146
+ env/
147
+ venv/
148
+ ENV/
149
+ env.bak/
150
+ venv.bak/
151
+
152
+ # Spyder project settings
153
+ .spyderproject
154
+ .spyproject
155
+
156
+ # Rope project settings
157
+ .ropeproject
158
+
159
+ # mkdocs documentation
160
+ /site
161
+
162
+ # mypy
163
+ .mypy_cache/
164
+ .dmypy.json
165
+ dmypy.json
166
+
167
+ # Pyre type checker
168
+ .pyre/
169
+
170
+ # pytype static type analyzer
171
+ .pytype/
172
+
173
+ # Cython debug symbols
174
+ cython_debug/
175
+
176
+ # PyCharm
177
+ # JetBrains specific template is maintained in a separate JetBrains.gitignore that can
178
+ # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
179
+ # and can be added to the global gitignore or merged into this file. For a more nuclear
180
+ # option (not recommended) you can uncomment the following to ignore the entire idea folder.
181
+ #.idea/
182
+
183
+ # Abstra
184
+ # Abstra is an AI-powered process automation framework.
185
+ # Ignore directories containing user credentials, local state, and settings.
186
+ # Learn more at https://abstra.io/docs
187
+ .abstra/
188
+
189
+ # Visual Studio Code
190
+ # Visual Studio Code specific template is maintained in a separate VisualStudioCode.gitignore
191
+ # that can be found at https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore
192
+ # and can be added to the global gitignore or merged into this file. However, if you prefer,
193
+ # you could uncomment the following to ignore the entire vscode folder
194
+ # .vscode/
195
+
196
+ # Ruff stuff:
197
+ .ruff_cache/
198
+
199
+ # PyPI configuration file
200
+ .pypirc
201
+
202
+ # Cursor
203
+ # Cursor is an AI-powered code editor. `.cursorignore` specifies files/directories to
204
+ # exclude from AI features like autocomplete and code analysis. Recommended for sensitive data
205
+ # refer to https://docs.cursor.com/context/ignore-files
206
+ .cursorignore
207
+ .cursorindexingignore
208
+
209
+ # Marimo
210
+ marimo/_static/
211
+ marimo/_lsp/
212
+ __marimo__/