yurli 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.
@@ -0,0 +1,29 @@
1
+ ---
2
+ name: dependency-maintenance
3
+ description: >-
4
+ Maintains Python and npm dependencies, developer tools, lockfiles, and prek hooks. Use
5
+ when adding, removing, or updating project dependencies, tool versions, or hook
6
+ revisions.
7
+ ---
8
+
9
+ # Dependency maintenance
10
+
11
+ Use the repository's declared dependency mechanisms and preserve consistency between
12
+ metadata, lockfiles, CI, and hooks.
13
+
14
+ - Manage Python dependencies with `uv` and declarations in `pyproject.toml`. Use
15
+ `uv add`, `uv remove`, or an intentional metadata edit followed by `uv lock`; commit
16
+ the resulting `uv.lock` changes.
17
+ - Manage npm dependencies through npm commands and `package.json`. Regenerate and commit
18
+ `package-lock.json`; use `npm ci` to install the locked set.
19
+ - When changing hook revisions in `prek.toml` or relevant Python tool versions, run the
20
+ configured `sync-with-uv` hook (`uv run prek run sync-with-uv`) and review any
21
+ resulting lockfile updates.
22
+ - Check that versions agree across CI workflow setup, dependency declarations,
23
+ `uv.lock`, `package-lock.json`, and `prek.toml` where applicable. Prefer the existing
24
+ dependency-management mechanisms over duplicating version information.
25
+ - Run relevant checks after changes. See `CONTRIBUTING.md` for `uv sync --locked`,
26
+ tests, `tools/linters.sh`, `tools/formatters.sh`, and `uv run prek run --all-files`.
27
+
28
+ Do not add dependencies or weaken checks unless the requested change requires it.
29
+ Document workflow changes in `CONTRIBUTING.md` or `README.md` as appropriate.
@@ -0,0 +1,27 @@
1
+ ---
2
+ name: release
3
+ description: >-
4
+ Prepares and validates releases for this Python package template. Use when planning,
5
+ validating, or publishing a release, including version tags, distributions, GitHub
6
+ Releases, or PyPI trusted publishing.
7
+ ---
8
+
9
+ # Release preparation and validation
10
+
11
+ This template derives package versions from Git history and tags through hatch-vcs.
12
+ Review the release workflow in `.github/workflows/publish.yml` and current packaging
13
+ configuration before preparing a release.
14
+
15
+ - Confirm the intended source commit and release version. Create a valid version tag
16
+ (optionally prefixed with `v`) only when explicitly authorized; the built package
17
+ version must match the tag after removing that prefix.
18
+ - Run the relevant tests and coverage checks documented in `CONTRIBUTING.md`, then build
19
+ distributions with `uv build`.
20
+ - Validate the distributions and confirm the version in package metadata matches the
21
+ intended tag. Follow the existing validation in `.github/workflows/publish.yml`.
22
+ - If the project publishes to PyPI, confirm its trusted publisher and `pypi` GitHub
23
+ environment are configured for the repository and workflow. This template may be
24
+ adapted for projects that do not publish to PyPI; skip PyPI steps for those projects.
25
+ - GitHub Release creation, tag creation, package upload, and other publishing are
26
+ external actions. Never create tags, publish releases, or upload packages without
27
+ explicit user authorization.
@@ -0,0 +1,23 @@
1
+ # Template update history
2
+
3
+ Template-Source: `xozoid/python-template`
4
+
5
+ Template-Revision: `c9a5cf91408da939219746d426f7ad92fc49ec5f`
6
+
7
+ The revision is the full upstream template commit last fully applied to this project. It
8
+ is not a commit from the target repository. Adoption sets the initial revision to the
9
+ upstream commit used to create the project. During later updates, change this file only
10
+ after the applicable migration succeeds and validation passes.
11
+
12
+ ## Skipped template changes
13
+
14
+ Record each intentional skip with the target template revision where it was first
15
+ skipped, affected path or behavior, a short description, and the reason. At each later
16
+ update, check whether changes touch or depend on a recorded skip. Review template
17
+ evolution from that skip revision through the new target revision; determine whether
18
+ later changes build on, replace, or invalidate the skipped change, and reconsider the
19
+ local adaptation accordingly. Do not treat a skip as permanent. After a successful
20
+ migration, update the entry with its current disposition or remove it if it is resolved
21
+ or no longer relevant.
22
+
23
+ - None recorded.
@@ -0,0 +1,56 @@
1
+ ---
2
+ name: update-from-template
3
+ description: >-
4
+ Updates a project adopted from xozoid/python-template while preserving
5
+ project-specific code, configuration, and intentional deviations.
6
+ ---
7
+
8
+ # Update from template
9
+
10
+ Read `.agents/skills/update-from-template/HISTORY.md` for the template source, last
11
+ applied revision, and persistent list of intentionally skipped changes. Keep that file
12
+ as the only template tracking record. Do not edit this `SKILL.md` during an update.
13
+
14
+ ## Update workflow
15
+
16
+ 1. Read the source and last applied full commit SHA from `HISTORY.md`. Resolve the
17
+ template repository's default branch and its current full commit SHA. Fetch the
18
+ upstream template and verify that the recorded revision exists there.
19
+ 2. Compare the recorded revision with the current default-branch revision. If they are
20
+ identical, report that no update is needed and leave `HISTORY.md` unchanged. If the
21
+ target revision does not descend from the recorded revision, report divergence and
22
+ stop before applying changes.
23
+ 3. Review the template changes between the recorded and target revisions. Compare the
24
+ affected files with the project, then apply relevant changes in context. Preserve
25
+ project-specific code, metadata, dependencies, configuration, CI customizations, and
26
+ intentional deviations. Never overwrite uncommitted changes or discard local edits.
27
+ 4. For intentionally skipped changes, record the affected paths, the template revision
28
+ where each change was first skipped, a short description, and the reason in
29
+ `HISTORY.md`. During every later update, check whether new changes touch the same
30
+ paths or behavior, or depend on a skipped change. Review the template evolution from
31
+ the recorded skip revision through the new target revision to see whether later work
32
+ builds on, replaces, or invalidates the skip. Reconsider the local adaptation when
33
+ needed; do not treat a skip as a permanent instruction to ignore that area. Update
34
+ the history entry with the result after a successful migration.
35
+ 5. Run relevant tests, linting, formatting, dependency locking, and pre-commit
36
+ synchronization checks. Review generated changes and resolve conflicts with the
37
+ project's conventions.
38
+ 6. Only after the applicable migration is complete and checks succeed, update
39
+ `HISTORY.md` with the full target template SHA and any intentional skips. Do not
40
+ automatically commit changes unless the user explicitly requests a commit.
41
+
42
+ ## Finding an initial revision
43
+
44
+ If the revision in `HISTORY.md` is unset or still contains a placeholder, compare the
45
+ project's initial state with the template's history and use file contents and timestamps
46
+ only as supporting evidence. Do not select a revision solely because it looks like the
47
+ closest match. If the origin cannot be identified confidently, describe the candidate
48
+ revisions and ask the user to confirm before updating.
49
+
50
+ ## Report
51
+
52
+ Report the target template revision, applied changes, skipped changes and reasons,
53
+ conflicts, and validation results. State clearly when no update was needed or when
54
+ divergence or an ambiguous starting revision prevented an update. If a commit is
55
+ requested, use a clear summary. Update `HISTORY.md` only when a template migration has
56
+ completed successfully; leave it unchanged for a no-op, failed, or incomplete update.
@@ -0,0 +1,2 @@
1
+ # Force LF checkout for source files.
2
+ * text=auto eol=lf
@@ -0,0 +1,15 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: npm
4
+ directory: /
5
+ schedule:
6
+ interval: weekly
7
+ - package-ecosystem: github-actions
8
+ directory: /
9
+ schedule:
10
+ interval: weekly
11
+ - package-ecosystem: uv
12
+ directory: /
13
+ schedule:
14
+ interval: weekly
15
+ versioning-strategy: increase
@@ -0,0 +1,32 @@
1
+ {
2
+ "bypass_actors": [],
3
+ "conditions": {
4
+ "ref_name": {
5
+ "exclude": [],
6
+ "include": ["refs/heads/main"]
7
+ }
8
+ },
9
+ "enforcement": "active",
10
+ "name": "Main - squash merges only",
11
+ "rules": [
12
+ {
13
+ "type": "deletion"
14
+ },
15
+ {
16
+ "type": "non_fast_forward"
17
+ },
18
+ {
19
+ "parameters": {
20
+ "allowed_merge_methods": ["squash"],
21
+ "dismiss_stale_reviews_on_push": false,
22
+ "require_extra_approval_for_unattributed_changes": true,
23
+ "require_last_push_approval": false,
24
+ "required_approving_review_count": 0,
25
+ "required_review_thread_resolution": true,
26
+ "required_reviewers": []
27
+ },
28
+ "type": "pull_request"
29
+ }
30
+ ],
31
+ "target": "branch"
32
+ }
@@ -0,0 +1,141 @@
1
+ name: CI
2
+ on:
3
+ workflow_call:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ branches: [main]
8
+ workflow_dispatch:
9
+ permissions:
10
+ contents: read
11
+ jobs:
12
+ pytest:
13
+ runs-on: ubuntu-latest
14
+ strategy:
15
+ fail-fast: false
16
+ matrix:
17
+ python-version: ["3.12", "3.13", "3.14", "3.15"]
18
+ steps:
19
+ - uses: actions/checkout@v7
20
+ - uses: astral-sh/setup-uv@v7
21
+ with:
22
+ python-version: ${{ matrix.python-version }}
23
+ enable-cache: true
24
+ - run: uv sync --locked --no-default-groups --group test
25
+ - run: uv run --no-sync pytest
26
+ minimum-runtime-dependencies:
27
+ runs-on: ubuntu-latest
28
+ steps:
29
+ - uses: actions/checkout@v7
30
+ - uses: astral-sh/setup-uv@v7
31
+ with:
32
+ python-version: "3.12"
33
+ enable-cache: true
34
+ - name: Resolve minimum runtime dependencies
35
+ run: |
36
+ uv venv --python 3.12 .venv-minimum
37
+ uv pip install --python .venv-minimum/bin/python --resolution lowest-direct .
38
+ uv pip freeze --python .venv-minimum/bin/python > /tmp/minimum-constraints.txt
39
+ - name: Install locked pytest
40
+ run: |
41
+ PYTEST_VERSION=$(python -c "
42
+ import tomllib
43
+ with open('uv.lock', 'rb') as f:
44
+ lock = tomllib.load(f)
45
+ print(next(p['version'] for p in lock['package'] if p['name'] == 'pytest'))
46
+ ")
47
+ uv pip install --python .venv-minimum/bin/python --constraint /tmp/minimum-constraints.txt "pytest==$PYTEST_VERSION"
48
+ - name: Verify minimum dependencies were preserved
49
+ run: |
50
+ uv pip freeze --python .venv-minimum/bin/python > /tmp/after.txt
51
+ grep -Fxf /tmp/minimum-constraints.txt /tmp/after.txt | diff - /tmp/minimum-constraints.txt
52
+ - name: Run tests
53
+ run: .venv-minimum/bin/python -m pytest
54
+ ruff:
55
+ runs-on: ubuntu-latest
56
+ steps:
57
+ - uses: actions/checkout@v7
58
+ - uses: astral-sh/setup-uv@v7
59
+ with:
60
+ python-version: "3.15"
61
+ enable-cache: true
62
+ - run: uv sync --locked --no-default-groups --group lint
63
+ - run: uv run --no-sync ruff check .
64
+ types:
65
+ runs-on: ubuntu-latest
66
+ steps:
67
+ - uses: actions/checkout@v7
68
+ - uses: astral-sh/setup-uv@v7
69
+ with:
70
+ python-version: "3.15"
71
+ enable-cache: true
72
+ - run: uv sync --locked --no-default-groups --group types
73
+ - run: uv run --no-sync basedpyright
74
+ formatting:
75
+ runs-on: ubuntu-latest
76
+ steps:
77
+ - uses: actions/checkout@v7
78
+ - uses: astral-sh/setup-uv@v7
79
+ with:
80
+ python-version: "3.15"
81
+ enable-cache: true
82
+ - uses: actions/setup-node@v7
83
+ with:
84
+ node-version: 24
85
+ cache: npm
86
+ - run: uv sync --locked --no-default-groups --group format
87
+ - run: npm ci
88
+ - run: uv run --no-sync ruff format --check .
89
+ - run: npm exec --no -- prettier --check .
90
+ - run: uv run --no-sync taplo fmt --check '*.toml'
91
+ - run: uv run --no-sync prek run yamlfmt --all-files
92
+ sync-with-uv:
93
+ runs-on: ubuntu-latest
94
+ steps:
95
+ - uses: actions/checkout@v7
96
+ - uses: astral-sh/setup-uv@v7
97
+ - run: uv sync --locked --no-default-groups --only-group prek --no-install-project
98
+ - run: uv run --no-sync prek run --all-files sync-with-uv
99
+ - run: git diff --exit-code
100
+ spelling:
101
+ runs-on: ubuntu-latest
102
+ steps:
103
+ - uses: actions/checkout@v7
104
+ - uses: astral-sh/setup-uv@v7
105
+ with:
106
+ python-version: "3.15"
107
+ enable-cache: true
108
+ - run: uv sync --locked --no-default-groups --group spell
109
+ - run: uv run --no-sync codespell --skip=node_modules .
110
+ coverage:
111
+ runs-on: ubuntu-latest
112
+ steps:
113
+ - uses: actions/checkout@v7
114
+ - uses: astral-sh/setup-uv@v7
115
+ with:
116
+ python-version: "3.15"
117
+ enable-cache: true
118
+ - run: uv sync --locked --no-default-groups --group coverage
119
+ - run: uv run --no-sync coverage run -m pytest
120
+ - run: uv run --no-sync coverage report
121
+ - uses: actions/upload-artifact@v7
122
+ if: always()
123
+ with:
124
+ name: coverage-data
125
+ path: .coverage
126
+ build:
127
+ runs-on: ubuntu-latest
128
+ steps:
129
+ - uses: actions/checkout@v7
130
+ - uses: astral-sh/setup-uv@v7
131
+ with:
132
+ python-version: "3.15"
133
+ enable-cache: true
134
+ - run: uv build
135
+ - run: uv venv --no-project /tmp/wheel-test
136
+ - run: uv pip install --python /tmp/wheel-test/bin/python dist/*.whl
137
+ - name: Verify installed wheel import
138
+ run: |
139
+ tmpdir=$(mktemp -d)
140
+ cd "$tmpdir"
141
+ /tmp/wheel-test/bin/python -c "import yurli"
@@ -0,0 +1,34 @@
1
+ name: Docs CI
2
+ on:
3
+ pull_request:
4
+ branches: [main]
5
+ paths:
6
+ - README.md
7
+ - CONTRIBUTING.md
8
+ permissions:
9
+ contents: read
10
+ jobs:
11
+ vale:
12
+ runs-on: ubuntu-latest
13
+ steps:
14
+ - uses: actions/checkout@v7
15
+ - name: Install Vale
16
+ env:
17
+ GH_TOKEN: ${{ github.token }}
18
+ run: |
19
+ url=$(gh api repos/vale-cli/vale/releases/latest \
20
+ --jq '.assets[] | select(.name | endswith("_Linux_64-bit.tar.gz")) | .browser_download_url')
21
+ curl -fsSL "$url" | sudo tar -xz -C /usr/local/bin vale
22
+ vale --version
23
+ - name: Sync Vale styles
24
+ run: |
25
+ attempt=0
26
+ until vale sync; do
27
+ attempt=$((attempt + 1))
28
+ if [ "$attempt" -ge 5 ]; then
29
+ exit 1
30
+ fi
31
+ sleep "$((attempt * 5))"
32
+ done
33
+ - name: Lint documentation
34
+ run: vale README.md CONTRIBUTING.md
@@ -0,0 +1,44 @@
1
+ name: Publish to PyPI
2
+ on:
3
+ release:
4
+ types: [published]
5
+ permissions:
6
+ contents: read
7
+ jobs:
8
+ validate:
9
+ uses: ./.github/workflows/ci.yml
10
+ publish:
11
+ needs: validate
12
+ runs-on: ubuntu-latest
13
+ environment:
14
+ name: pypi
15
+ url: https://pypi.org/p/yurli
16
+ permissions:
17
+ id-token: write
18
+ steps:
19
+ - uses: actions/checkout@v7
20
+ with:
21
+ fetch-depth: 0
22
+ - uses: astral-sh/setup-uv@v7
23
+ with:
24
+ python-version: "3.15"
25
+ - run: uv build
26
+ - name: Verify release tag matches package version
27
+ env:
28
+ RELEASE_TAG: ${{ github.event.release.tag_name }}
29
+ run: |
30
+ python - <<'PY'
31
+ from email import message_from_bytes
32
+ from os import environ
33
+ from pathlib import Path
34
+ from zipfile import ZipFile
35
+
36
+ wheel = next(Path("dist").glob("*.whl"))
37
+ with ZipFile(wheel) as archive:
38
+ metadata_path = next(path for path in archive.namelist() if path.endswith(".dist-info/METADATA"))
39
+ version = message_from_bytes(archive.read(metadata_path))["Version"]
40
+ tag = environ["RELEASE_TAG"]
41
+ if tag.removeprefix("v") != version:
42
+ raise SystemExit(f"Release tag {tag!r} does not match package version {version!r}")
43
+ PY
44
+ - uses: pypa/gh-action-pypi-publish@release/v1
yurli-0.1.0/.gitignore ADDED
@@ -0,0 +1,29 @@
1
+ # Local environments and secrets
2
+ .venv/
3
+ .env*
4
+
5
+ # Python bytecode and caches
6
+ __pycache__/
7
+ *.py[cod]
8
+ .pytest_cache/
9
+ .ruff_cache/
10
+ .basedpyright/
11
+
12
+ # Vale's downloaded style packages and scratch data
13
+ .vale/styles/*
14
+ !.vale/styles/config
15
+
16
+ # Coverage output
17
+ .coverage
18
+ .coverage.*
19
+ coverage.xml
20
+ coverage.json
21
+ htmlcov/
22
+
23
+ # JavaScript dependencies
24
+ node_modules/
25
+
26
+ # Build and packaging output
27
+ dist/
28
+ build/
29
+ *.egg-info/
@@ -0,0 +1,15 @@
1
+ # Version control metadata
2
+ .git
3
+
4
+ # Local environments and dependencies
5
+ .venv
6
+ node_modules
7
+
8
+ # Generated Vale styles
9
+ .vale/styles
10
+
11
+ # Build output
12
+ dist
13
+
14
+ # Dependency lockfile
15
+ uv.lock
@@ -0,0 +1,4 @@
1
+ {
2
+ "printWidth": 88,
3
+ "proseWrap": "always"
4
+ }
@@ -0,0 +1,6 @@
1
+ Coverage.py
2
+ Dependabot('s)?
3
+ new-project
4
+ pytest
5
+ uv
6
+ yurli
yurli-0.1.0/.vale.ini ADDED
@@ -0,0 +1,14 @@
1
+ StylesPath = .vale/styles
2
+ MinAlertLevel = error
3
+ Packages = Microsoft, proselint, write-good
4
+ Vocab = LocalProject
5
+
6
+ [*.{md,rst,adoc,txt}]
7
+ BasedOnStyles = Vale, Microsoft, proselint, write-good
8
+
9
+ # Agent instructions are operational text for coding agents, not user-facing prose.
10
+ [AGENTS.md]
11
+ BasedOnStyles = NONE
12
+
13
+ [.agents/skills/**]
14
+ BasedOnStyles = NONE
yurli-0.1.0/AGENTS.md ADDED
@@ -0,0 +1,35 @@
1
+ # Agent instructions
2
+
3
+ ## Project structure
4
+
5
+ This repository is a Python package named `yurli`. The import package lives in `yurli/`,
6
+ tests live in `tests/`, project and tool configuration lives in `pyproject.toml`, and
7
+ GitHub Actions workflows live in `.github/workflows/`. Keep the established architecture
8
+ unless a change is explicitly requested. Prefer focused changes and avoid unnecessary
9
+ dependencies or abstractions.
10
+
11
+ ## Tooling
12
+
13
+ - Use `uv` for Python dependencies and environments. `pyproject.toml` declares Hatchling
14
+ and `hatch-vcs`; package versions come from Git tags.
15
+ - Ruff handles Python linting, formatting, and import sorting. Its configuration is in
16
+ `pyproject.toml`.
17
+ - `basedpyright` runs in strict mode, configured in `pyproject.toml`.
18
+ - Tests use pytest. Coverage runs with branch measurement and enforces the configured
19
+ minimum in `pyproject.toml`.
20
+ - `tools/linters.sh`, `tools/formatters.sh`, and `tools/env.sh` provide the documented
21
+ local workflows. `prek.toml` defines hooks, including Ruff, basedpyright,
22
+ `sync-with-uv`, Vale, and Prettier.
23
+ - Vale is intentionally disabled for agent-facing instruction files through `.vale.ini`;
24
+ keep other writing checks active.
25
+
26
+ ## Changes and checks
27
+
28
+ When modifying code, add or update focused tests for the changed behavior. Run relevant
29
+ checks after modifications, using the commands in `CONTRIBUTING.md` and the applicable
30
+ CI jobs in `.github/workflows/ci.yml`. Update documentation when workflows or
31
+ contributor instructions change. Never silently weaken linting, type checking, or
32
+ coverage requirements.
33
+
34
+ In your report, state which checks you actually ran, their results, any failures, and
35
+ any checks you could not run.
@@ -0,0 +1,106 @@
1
+ # Contributing
2
+
3
+ ## Environment and dependencies
4
+
5
+ Install Git, Python 3.12 or later, `uv`, Node.js 24 or later with npm, and Vale. Run
6
+ `tools/env.sh` from any directory in the repository to sync the locked Python
7
+ dependencies, install `prek` Git hooks, fetch Vale styles, run `npm ci`, and create
8
+ `.env` and `.env.leave` if they aren't present. The script installs Vale when needed
9
+ through a supported package manager. Use `tools/env.sh --upgrade` to upgrade Python
10
+ dependencies before setup.
11
+
12
+ Add Python development dependencies to the appropriate group in `pyproject.toml`
13
+ (`lint`, `spell`, `test`, `coverage`, `types`, `format`, `prek`, or the aggregate `dev`
14
+ group). Pin each development dependency to the exact version resolved in `uv.lock`, then
15
+ update and commit `uv.lock`:
16
+
17
+ ```sh
18
+ uv add --dev package-name
19
+ uv lock
20
+ uv lock --check
21
+ uv sync --locked --all-groups
22
+ uv run --no-sync prek run --all-files sync-with-uv
23
+ ```
24
+
25
+ Use `uv add --group <group> package-name` for another dependency group, or edit the
26
+ project metadata and run `uv lock` when needed. Set the exact pin to the version
27
+ selected by the lockfile. Leave runtime dependencies in `[project.dependencies]`
28
+ unpinned. The `dev` group includes all groups for the complete local environment. The
29
+ `format` group includes `prek` for its `yamlfmt` hook; CI selects only the groups each
30
+ independent job needs. Update npm development dependencies with
31
+ `npm install --save-dev package-name` and commit both `package.json` and
32
+ `package-lock.json`. Dependabot also checks uv, npm, and GitHub Actions dependencies
33
+ weekly.
34
+
35
+ ## Tests and checks
36
+
37
+ Run tests and coverage from the repository root:
38
+
39
+ ```sh
40
+ uv run pytest
41
+ uv run coverage run -m pytest
42
+ uv run coverage report
43
+ ```
44
+
45
+ The coverage report enforces the configured 85% minimum. `tools/linters.sh` runs Ruff,
46
+ `basedpyright`, `codespell`, and Vale (errors only). `tools/formatters.sh` runs Ruff
47
+ format, Prettier, `Taplo`, and `yamlfmt`. These scripts apply formatting changes; review
48
+ the resulting diff.
49
+
50
+ `uv run prek run --all-files` runs the configured hooks against all files. The hooks
51
+ include Ruff lint and format, `codespell`, `Taplo`, `basedpyright`, `yamlfmt`, standard
52
+ file checks, Vale, and Prettier. `tools/env.sh` installs the Git hooks so `prek` runs on
53
+ commits. The `sync-with-uv` hook keeps hook revisions aligned with Python packages in
54
+ `uv.lock`; run it after changing hook revisions or relevant dependencies, then review
55
+ and commit the lockfile changes.
56
+
57
+ Dependabot's weekly uv updates cover exact-pinned development dependencies. Its
58
+ `increase` versioning strategy advances the manifest constraint, while the uv updater
59
+ resolves and records the update in `uv.lock`. CI runs `sync-with-uv` on every pull
60
+ request, including Dependabot pull requests. It installs the `prek` group, runs the
61
+ hook, and fails if the hook would modify tracked files. If an update changes a tool
62
+ revision represented in `prek.toml`, run `uv run prek run --all-files sync-with-uv` and
63
+ commit the generated change with the lockfile update. Dependabot doesn't provide an
64
+ arbitrary post-update script in `dependabot.yml`; its
65
+ [options reference](https://docs.github.com/en/code-security/reference/supply-chain-security/dependabot-options-reference)
66
+ documents the supported update behavior.
67
+
68
+ ## Agent instructions and skills
69
+
70
+ Persistent repository guidance lives in the root `AGENTS.md`. Focused, task-specific
71
+ Agent Skills live under `.agents/skills/`; each skill has a `SKILL.md` with metadata
72
+ that helps compatible agents discover when to use it. `AGENTS.md` describes project-wide
73
+ expectations, while skills provide checklists for particular tasks. Contributors can
74
+ extend or maintain skills by adding a narrowly scoped directory and a valid `SKILL.md`,
75
+ then updating its instructions when project workflows change. See the
76
+ [Agent Skills specification](https://agentskills.io/specification) for the format.
77
+
78
+ Projects created from this template should set the `Template-Revision` field in
79
+ `.agents/skills/update-from-template/HISTORY.md` to the full upstream commit SHA used at
80
+ adoption. For later updates, compare and migrate template changes while preserving local
81
+ customizations, run the relevant checks above, and update that history file only after
82
+ the migration succeeds. It also keeps the persistent record of intentionally skipped
83
+ changes; the skill instructions remain unchanged.
84
+
85
+ ## Pull requests and CI
86
+
87
+ Open a pull request against `main`. CI keeps checks in separate jobs: pytest on Python
88
+ 3.12 through 3.15, pytest against the lowest compatible runtime dependencies on Python
89
+ 3.12, Ruff, `basedpyright`, formatting (Ruff, Prettier, `Taplo`, `yamlfmt`), spelling,
90
+ Vale, coverage, and build/import validation. Run the relevant local commands and ensure
91
+ CI passes. Update tests and documentation when behavior or contributor instructions
92
+ change.
93
+
94
+ ## Releases
95
+
96
+ `hatch-vcs` reads the package version from Git tags. Create and publish a GitHub Release
97
+ with a version tag such as `1.2.3` or `v1.2.3`; the optional `v` is removed for
98
+ comparison with the package version. The published-release event starts
99
+ `.github/workflows/publish.yml`. It runs CI first, builds the distribution, verifies
100
+ that the release tag matches the built version, then publishes to PyPI through trusted
101
+ publishing.
102
+
103
+ Before releasing, ensure the tag resolves to the intended source commit, the matching
104
+ PyPI project exists, and trusted publishing is configured for this repository's `pypi`
105
+ GitHub environment. A tag that doesn't match the package version fails validation and
106
+ isn't published.
yurli-0.1.0/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Project Authors
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.