diff --git a/.bumpversion.toml b/.bumpversion.toml index 0880417..d7e7edf 100644 --- a/.bumpversion.toml +++ b/.bumpversion.toml @@ -35,11 +35,11 @@ replace = 'version = "{new_version}"' search = 'version = "{current_version}"' - [[tool.bumpversion.files]] - filename = "src/agentic_mesh_protocol/__version__.py" - # Update the fallback version in the __version__.py file - replace = '__version__ = "{new_version}"' - search = '__version__ = "{current_version}"' +# [[tool.bumpversion.files]] +# filename = "src/agentic_mesh_protocol/__version__.py" +# # Update the fallback version in the __version__.py file +# replace = '__version__ = "{new_version}"' +# search = '__version__ = "{current_version}"' # Command aliases for convenience (these work with: bump-my-version bump ) # Examples: diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d77c132..57b9612 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -37,13 +37,10 @@ jobs: with: repo-token: ${{ secrets.GITHUB_TOKEN }} - - name: Set up Node.js - uses: actions/setup-node@v4 + - name: Install buf + uses: bufbuild/buf-action@v1 with: - node-version: "20" - - - name: Install npm dependencies for buf - run: task install:amp + setup_only: true - name: Cache dependencies id: cache-uv @@ -54,6 +51,9 @@ jobs: restore-keys: | ${{ runner.os }}-uv- + - name: Setup submodule + run: task install:submodule + - name: Generate Python code from protobuf run: task gen diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index f26f82e..1c85227 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -31,13 +31,13 @@ jobs: with: repo-token: ${{ secrets.GITHUB_TOKEN }} - - name: Set up Node.js - uses: actions/setup-node@v4 + - name: Install buf + uses: bufbuild/buf-action@v1 with: - node-version: "20" + setup_only: true - - name: Install npm dependencies for buf - run: task install:amp + - name: Setup submodule + run: task install:submodule - name: Generate Python code from protobuf run: task gen @@ -51,8 +51,8 @@ jobs: - name: Upload dist artifacts uses: actions/upload-artifact@v4 with: - name: dist - path: dist/ + name: gen + path: gen/ retention-days: 1 publish-test-pypi: @@ -67,8 +67,8 @@ jobs: - name: Download dist artifacts uses: actions/download-artifact@v4 with: - name: dist - path: dist/ + name: gen + path: gen/ - name: Publish to Test PyPI uses: pypa/gh-action-pypi-publish@release/v1 @@ -101,8 +101,8 @@ jobs: - name: Download dist artifacts uses: actions/download-artifact@v4 with: - name: dist - path: dist/ + name: gen + path: gen/ - name: Publish to PyPI uses: pypa/gh-action-pypi-publish@release/v1 diff --git a/.gitignore b/.gitignore index 28910f6..574375a 100644 --- a/.gitignore +++ b/.gitignore @@ -176,9 +176,8 @@ cython_debug/ *_pb2.py *_pb2.pyi *_pb2_grpc.py -src/digitalkin_proto/buf/ -src/digitalkin_proto/agentic_mesh_protocol/ -src/digitalkin_proto/google/ +src/ +gen/ .task/* .vscode/ diff --git a/agentic-mesh-protocol b/agentic-mesh-protocol index 48ade47..ddd9561 160000 --- a/agentic-mesh-protocol +++ b/agentic-mesh-protocol @@ -1 +1 @@ -Subproject commit 48ade479d02ebfa9664d853076e0f0486e0d4a6a +Subproject commit ddd95611c0a93e0147ed1a11890eb6b6ca96a91d diff --git a/pyproject.toml b/pyproject.toml index 075e0c3..acac53a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -66,10 +66,10 @@ build = [ "build>=1.3.0", "bump-my-version>=1.2.4", "twine>=6.2.0" ] [tool.setuptools] - package-dir = { "" = "src" } + package-dir = { "" = "gen" } [tool.setuptools.packages.find] - where = [ "src" ] + where = [ "gen" ] [tool.setuptools.package-data] agentic_mesh_protocol = [ "**/*.pyi", "py.typed" ] @@ -81,4 +81,3 @@ [tool.pytest.ini_options] python_files = "test_*.py" - testpaths = [ "tests" ] diff --git a/src/agentic_mesh_protocol/__init__.py b/src/agentic_mesh_protocol/__init__.py deleted file mode 100644 index 2d089b2..0000000 --- a/src/agentic_mesh_protocol/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -"""Agentic Mesh Protocol - Python gRPC interfaces.""" - -from agentic_mesh_protocol.__version__ import __version__ - -__all__ = ["__version__"] diff --git a/src/agentic_mesh_protocol/__version__.py b/src/agentic_mesh_protocol/__version__.py deleted file mode 100644 index b7fc74d..0000000 --- a/src/agentic_mesh_protocol/__version__.py +++ /dev/null @@ -1,8 +0,0 @@ -"""Version information for agentic_mesh_protocol package.""" - -from importlib.metadata import PackageNotFoundError, version - -try: - __version__ = version("agentic-mesh-protocol") -except PackageNotFoundError: - __version__ = "0.2.2" diff --git a/src/agentic_mesh_protocol/cost/__init__.py b/src/agentic_mesh_protocol/cost/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/agentic_mesh_protocol/cost/v1/__init__.py b/src/agentic_mesh_protocol/cost/v1/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/agentic_mesh_protocol/filesystem/__init__.py b/src/agentic_mesh_protocol/filesystem/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/agentic_mesh_protocol/filesystem/v1/__init__.py b/src/agentic_mesh_protocol/filesystem/v1/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/agentic_mesh_protocol/module/__init__.py b/src/agentic_mesh_protocol/module/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/agentic_mesh_protocol/module/v1/__init__.py b/src/agentic_mesh_protocol/module/v1/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/agentic_mesh_protocol/module_registry/__init__.py b/src/agentic_mesh_protocol/module_registry/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/agentic_mesh_protocol/module_registry/v1/__init__.py b/src/agentic_mesh_protocol/module_registry/v1/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/agentic_mesh_protocol/py.typed b/src/agentic_mesh_protocol/py.typed deleted file mode 100644 index e69de29..0000000 diff --git a/src/agentic_mesh_protocol/registry/__init__.py b/src/agentic_mesh_protocol/registry/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/agentic_mesh_protocol/registry/v1/__init__.py b/src/agentic_mesh_protocol/registry/v1/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/agentic_mesh_protocol/setup/__init__.py b/src/agentic_mesh_protocol/setup/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/agentic_mesh_protocol/setup/v1/__init__.py b/src/agentic_mesh_protocol/setup/v1/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/agentic_mesh_protocol/storage/__init__.py b/src/agentic_mesh_protocol/storage/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/agentic_mesh_protocol/storage/v1/__init__.py b/src/agentic_mesh_protocol/storage/v1/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/agentic_mesh_protocol/user_profile/__init__.py b/src/agentic_mesh_protocol/user_profile/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/agentic_mesh_protocol/user_profile/v1/__init__.py b/src/agentic_mesh_protocol/user_profile/v1/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/buf/__init__.py b/src/buf/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/buf/validate/__init__.py b/src/buf/validate/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/taskfile.yml b/taskfile.yml index eb3ffe4..87a51e0 100644 --- a/taskfile.yml +++ b/taskfile.yml @@ -1,365 +1,417 @@ version: "3" -# Modern, optimized Taskfile with dependency tracking and best practices - -includes: - amp: - taskfile: ./agentic-mesh-protocol/Taskfile.yml - dir: ./agentic-mesh-protocol - optional: true - vars: PACKAGE_NAME: agentic_mesh_protocol - PACKAGE_DIR: src/{{.PACKAGE_NAME}} - BUF_PACKAGE_DIR: src/buf + SRC_DIR: gen + PACKAGE_DIR: "{{.SRC_DIR}}/{{.PACKAGE_NAME}}" + BUF_PACKAGE_DIR: "{{.SRC_DIR}}/buf" PROTO_FOLDER: agentic-mesh-protocol PROTO_GEN_DIR: "{{.PROTO_FOLDER}}/gen/python" PYTHON: uv run + DIST_PATH: gen dotenv: [".env"] tasks: - # ============================================================================== - # Default - # ============================================================================== + # ============================================================================= + # DEFAULT + # ============================================================================= default: - desc: List available tasks + desc: "Show available tasks" cmds: - task --list + silent: true + + # ============================================================================= + # HELP + # ============================================================================= + help: + desc: "Explain the main workflows (setup vs install vs build)" + silent: true + cmds: + - | + echo "" + echo "╔══════════════════════════════════════════════════════════════╗" + echo "║ service-apis-py — Task Workflows ║" + echo "╚══════════════════════════════════════════════════════════════╝" + echo "" + echo " 📦 FIRST TIME SETUP" + echo " ─────────────────────────────────────────────────────────────" + echo " task setup" + echo " → Full setup for a new machine or fresh clone." + echo " → Checks required tools (uv, buf, git, rsync, task)." + echo " → Initializes git submodule (agentic-mesh-protocol)." + echo " → Generates Python code from proto files." + echo " → Installs Python dependencies via uv sync." + echo "" + echo " 🔄 DAILY USAGE" + echo " ─────────────────────────────────────────────────────────────" + echo " task install" + echo " → Same as setup but without the tool validation." + echo " → Use after pulling changes that update the submodule" + echo " or proto files." + echo "" + echo " task gen" + echo " → Regenerate Python code from proto files only." + echo " → Use when proto files change but deps are already installed." + echo "" + echo " 🏗️ BUILD & PUBLISH" + echo " ─────────────────────────────────────────────────────────────" + echo " task build" + echo " → Regenerates code + builds the Python wheel (dist/)." + echo " → Required before publishing." + echo " → Pour changer le dossier de sortie (.tar.gz/.whl), utilisez :" + echo " task build DIST_DIR=mon_dossier" + echo " (par défaut : dist/)" + echo "" + echo " task publish:test → Publish to TestPyPI" + echo " task publish:prod → Publish to PyPI" + echo "" + echo " 🔖 VERSIONING" + echo " ─────────────────────────────────────────────────────────────" + echo " task version:current" + echo " → Show current version." + echo "" + echo " task bump -- release_num # 0.2.1.dev1 → 0.2.1.dev2" + echo " task bump -- release_type # 0.2.1.a0 → 0.2.1.b0 → 0.2.1.rc0 → 0.2.1" + echo " task bump -- patch # 0.2.1 → 0.2.2 (sans suffixe)" + echo " task bump -- minor # 0.2.1 → 0.3.0 (sans suffixe)" + echo " task bump -- major # 0.2.1 → 1.0.0 (sans suffixe)" + echo "" + echo " Progression release_type : a → b → dev → final → post → rc" + echo "" + echo " task bump -- --new-version 0.3.0.dev1 # version spécifique" + echo "" + echo " 🧪 QUALITY" + echo " ─────────────────────────────────────────────────────────────" + echo " task lint → Lint Python + proto files" + echo " task test → Run test suite" + echo " task ci → Full CI pipeline (lint + test + build)" + echo "" + echo " 🔧 REQUIRED TOOLS" + echo " ─────────────────────────────────────────────────────────────" + echo " uv → https://docs.astral.sh/uv/" + echo " buf → brew install buf | https://buf.build/docs/installation" + echo " task → https://taskfile.dev/" + echo " git, rsync → via your package manager" + echo "" + + # ============================================================================= + # SETUP + # ============================================================================= + setup: + desc: "First-time setup: validate tools + submodule + python deps" + cmds: + - task: validate + - task: install:submodule + - task: gen + - task: install:python + - echo "✅ Development environment ready!" - # ============================================================================== - # Setup & Installation - # ============================================================================== + # ============================================================================= + # INSTALL + # ============================================================================= + install: + desc: "Install dependencies after pulling changes (submodule + python)" + cmds: + - task: install:submodule + - task: gen + - task: install:python - init: - desc: Initialize git submodules - aliases: [submodule] + install:submodule: + desc: "Initialize git submodules" cmds: - git submodule update --init --recursive status: - test -f {{.PROTO_FOLDER}}/.git - install: - desc: Install Python dependencies - aliases: [deps, sync] + install:submodule:update: + desc: "Update submodule to latest remote" + cmds: + - git submodule update --remote --merge {{.PROTO_FOLDER}} + + install:python: + desc: "Install Python dependencies" cmds: - uv sync sources: - pyproject.toml - uv.lock - generates: - - .venv/**/* - - install:amp: - desc: Install agentic-mesh-protocol npm dependencies - aliases: [amp-install] - deps: [init] - cmds: - - task: amp:install - status: - - test -d {{.PROTO_FOLDER}}/node_modules - - setup: - desc: Complete development environment setup - aliases: [bootstrap] - cmds: - - task: init - - task: amp:install - - task: install - - task: install:hooks install:hooks: - desc: Install pre-commit hooks + desc: "Install pre-commit hooks" cmds: - "{{.PYTHON}} pre-commit install --install-hooks" status: - test -f .git/hooks/pre-commit - preconditions: - - sh: command -v pre-commit >/dev/null 2>&1 || {{.PYTHON}} pre-commit --version - msg: "pre-commit not available" - - dev: - desc: Quick development setup - cmds: - - task: setup - - task: gen - - echo "Development environment ready!" - - # ============================================================================== - # Proto Generation - # ============================================================================== - proto:init: - desc: Ensure proto submodule is initialized - internal: true + # ============================================================================= + # GEN - Code generation + # ============================================================================= + gen: + desc: "Generate Python code from proto files" cmds: - - task: init - status: - - test -f {{.PROTO_FOLDER}}/.git + - task: gen:buf + - task: gen:copy + - task: gen:scaffold + - echo "✅ Proto generation complete!" - proto:generate: - desc: Generate Python code from proto files using buf + gen:buf: + desc: "Run buf generate (Python only)" internal: true - deps: ["proto:init", "install:amp"] + deps: [install:submodule] + dir: "{{.PROTO_FOLDER}}" cmds: - - task: amp:generate + - buf generate sources: - - "{{.PROTO_FOLDER}}/proto/**/*.proto" - - "{{.PROTO_FOLDER}}/buf.gen.yaml" + - "proto/**/*.proto" + - "buf.gen.yaml" generates: - - "{{.PROTO_GEN_DIR}}/**/*.py" - - "{{.PROTO_GEN_DIR}}/**/*.pyi" + - "gen/python/**/*.py" + - "gen/python/**/*.pyi" - proto:copy: - desc: Copy generated proto files to package + gen:copy: + desc: "Copy generated files to build/" internal: true - deps: ["proto:generate"] cmds: - mkdir -p {{.PACKAGE_DIR}} - mkdir -p {{.BUF_PACKAGE_DIR}} - # Copy agentic_mesh_protocol (content only, preserving __version__.py, __init__.py, py.typed) - - rsync -av --delete --exclude='__pycache__' --exclude='__version__.py' --exclude='__init__.py' --exclude='py.typed' {{.PROTO_GEN_DIR}}/agentic_mesh_protocol/ {{.PACKAGE_DIR}}/ - # Copy buf - - rsync -av --delete --exclude='__pycache__' --exclude='__init__.py' {{.PROTO_GEN_DIR}}/buf/ {{.BUF_PACKAGE_DIR}}/ - sources: - - "{{.PROTO_GEN_DIR}}/**/*.py" - - "{{.PROTO_GEN_DIR}}/**/*.pyi" - generates: - - "{{.PACKAGE_DIR}}/**/*.py" - - "{{.BUF_PACKAGE_DIR}}/**/*.py" + - rsync -a --delete --exclude='__pycache__' {{.PROTO_GEN_DIR}}/agentic_mesh_protocol/ {{.PACKAGE_DIR}}/ + - rsync -a --delete --exclude='__pycache__' {{.PROTO_GEN_DIR}}/buf/ {{.BUF_PACKAGE_DIR}}/ - gen: - desc: Complete proto generation pipeline - aliases: [generate, gen-proto, proto] - cmds: - - task: proto:init - - task: proto:generate - - task: proto:copy - - task: proto:ensure-init - - task: proto:create-namespaces - - task: build - - summary: | - Generates Python code from Protocol Buffer definitions. - - Steps: - 1. Initialize submodule - 2. Run buf generate in agentic-mesh-protocol (via amp:generate) - - Generates code for local proto files AND buf.build/bufbuild/protovalidate - 3. Copy generated files to src/agentic_mesh_protocol/ and src/buf/ - 4. Ensure __init__.py files exist in all directories - 5. Ensure buf package has __init__.py files - 6. Build package - - proto:ensure-init: - desc: Ensure all directories have __init__.py files + gen:scaffold: + desc: "Generate package scaffolding (__init__.py, __version__.py, py.typed)" internal: true + silent: true + cmds: + - | + V=$(grep -m1 'version' pyproject.toml | grep -o '"[^"]*"' | tr -d '"') + python3 -c " + import pathlib + pathlib.Path('{{.PACKAGE_DIR}}/__version__.py').write_text( + '\"\"\"Version information for agentic_mesh_protocol package.\"\"\"\\n\\n' + 'from importlib.metadata import PackageNotFoundError, version\\n\\n' + 'try:\\n' + ' __version__ = version(\"agentic-mesh-protocol\")\\n' + 'except PackageNotFoundError:\\n' + ' __version__ = \"$V\"\\n' + ) + " + - touch {{.PACKAGE_DIR}}/py.typed + - find {{.SRC_DIR}} -type d ! -path "*/__pycache__*" -exec sh -c 'test -f "$1/__init__.py" || touch "$1/__init__.py"' _ {} \; + + gen:check: + desc: "Verify generated code is up to date" cmds: - - find "{{.PACKAGE_DIR}}" -type d ! -path "*/__pycache__*" -exec sh -c 'test -f "$1/__init__.py" || touch "$1/__init__.py"' _ {} \; - - find "{{.BUF_PACKAGE_DIR}}" -type d ! -path "*/__pycache__*" -exec sh -c 'test -f "$1/__init__.py" || touch "$1/__init__.py"' _ {} \; - - proto:create-namespaces: - desc: Ensure buf package has __init__.py files for import compatibility - internal: true - cmds: - - touch {{.BUF_PACKAGE_DIR}}/__init__.py 2>/dev/null || true - - touch {{.BUF_PACKAGE_DIR}}/validate/__init__.py 2>/dev/null || true - - proto:clean: - desc: Clean generated proto files (preserves __version__.py, __init__.py, py.typed) - cmds: - - rm -rf {{.PACKAGE_DIR}}/module {{.PACKAGE_DIR}}/cost {{.PACKAGE_DIR}}/filesystem - - rm -rf {{.PACKAGE_DIR}}/module_registry {{.PACKAGE_DIR}}/setup {{.PACKAGE_DIR}}/storage - - rm -rf {{.PACKAGE_DIR}}/user_profile - - rm -rf {{.BUF_PACKAGE_DIR}}/validate - - rm -rf {{.PROTO_FOLDER}}/gen - - proto:lint: - desc: Lint proto files with buf - cmds: - - task: amp:lint - - proto:format: - desc: Format proto files with buf - cmds: - - task: amp:format - - proto:format:check: - desc: Check proto file formatting - cmds: - - task: amp:format:check - - proto:breaking: - desc: Check for breaking changes in proto files + - task: gen + - | + if [ -n "$(git status --porcelain {{.SRC_DIR}}/)" ]; then + echo "❌ Generated code is out of date. Run 'task gen' and commit." + exit 1 + fi + - echo "✅ Generated code is up to date" + + # ============================================================================= + # LINT - Code quality + # ============================================================================= + lint: + desc: "Run all linting (Python + proto)" cmds: - - task: amp:breaking - - # ============================================================================== - # Code Quality - # ============================================================================== + - task: lint:py + - task: lint:proto - fmt: - desc: Format code with ruff - aliases: [format] + lint:py: + desc: "Lint Python code with ruff" cmds: - - "{{.PYTHON}} ruff format ." - sources: - - "**/*.py" - - .ruff.toml - - pyproject.toml + - "{{.PYTHON}} ruff check ." - lint:fix: - desc: Lint and auto-fix issues - aliases: [fix] + lint:py:fix: + desc: "Fix Python linting issues" cmds: - - task: fmt - "{{.PYTHON}} ruff check --fix ." - lint: - desc: Check code quality (format + lint + type check) + lint:format: + desc: "Format Python code with ruff" cmds: - - task: lint:format - - task: lint:ruff + - "{{.PYTHON}} ruff format ." - lint:format: - desc: Check code formatting - internal: true + lint:format:check: + desc: "Check Python formatting (no write)" cmds: - "{{.PYTHON}} ruff format --check --diff ." - lint:ruff: - desc: Lint code with ruff - internal: true + lint:proto: + desc: "Lint proto files with buf" + dir: "{{.PROTO_FOLDER}}" cmds: - - "{{.PYTHON}} ruff check ." + - buf lint proto - pre-commit: - desc: Run all pre-commit hooks + lint:proto:format: + desc: "Format proto files with buf" + dir: "{{.PROTO_FOLDER}}" cmds: - - "{{.PYTHON}} pre-commit run --all-files" + - buf format -w proto - # ============================================================================== - # Testing - # ============================================================================== + lint:proto:format:check: + desc: "Check proto file formatting (no write)" + dir: "{{.PROTO_FOLDER}}" + cmds: + - buf format -d proto --exit-code + # ============================================================================= + # TEST + # ============================================================================= test: - desc: Run test suite - aliases: [t] + desc: "Run test suite" + deps: [gen, install:python] cmds: - "{{.PYTHON}} pytest {{.CLI_ARGS}}" - sources: - - "{{.PACKAGE_DIR}}/**/*.py" - - test/**/*.py - - tests/**/*.py - - pyproject.toml - test:watch: - desc: Run tests in watch mode + test:cov: + desc: "Run tests with coverage" + deps: [gen, install:python] cmds: - - "{{.PYTHON}} pytest-watch {{.CLI_ARGS}}" - - # ============================================================================== - # Building & Publishing - # ============================================================================== + - "{{.PYTHON}} pytest --cov={{.PACKAGE_DIR}} --cov-report=term-missing {{.CLI_ARGS}}" + # ============================================================================= + # BUILD + # ============================================================================= build: - desc: Build Python package - aliases: [build-package] - deps: ["proto:ensure-init"] + desc: "Generate and build Python package" + cmds: + - task: gen + - task: build:wheel + - echo "✅ Build complete!" + + build:wheel: + desc: "Build Python wheel" + internal: true cmds: - - uv build + - uv build --out-dir {{.DIST_PATH}} sources: - - "{{.PACKAGE_DIR}}/**/*.py" - - "{{.PACKAGE_DIR}}/**/*.pyi" + - "{{.SRC_DIR}}/**/*.py" + - "{{.SRC_DIR}}/**/*.pyi" - pyproject.toml - README.md generates: - - dist/*.whl - - dist/*.tar.gz + - "{{.DIST_PATH}}/*.whl" + - "{{.DIST_PATH}}/*.tar.gz" + preconditions: + - sh: test -d "{{.PACKAGE_DIR}}" + msg: "Generated code not found. Run 'task gen' first." + # ============================================================================= + # PUBLISH + # ============================================================================= publish:test: - desc: Publish package to TestPyPI - aliases: [publish-test] + desc: "Publish package to TestPyPI" deps: [build] cmds: - uv publish --repository-url https://test.pypi.org/legacy/ {{.CLI_ARGS}} preconditions: - sh: test -n "$(ls -A dist 2>/dev/null)" - msg: "No built packages found in dist/. Run 'task build' first." + msg: "No packages in dist/. Run 'task build' first." publish:prod: - desc: Publish package to PyPI - aliases: [publish, release] + desc: "Publish package to PyPI" deps: [build] cmds: - uv publish {{.CLI_ARGS}} preconditions: - sh: test -n "$(ls -A dist 2>/dev/null)" - msg: "No built packages found in dist/. Run 'task build' first." - - sh: '[ "$(git rev-parse --abbrev-ref HEAD)" = "main" ] || echo "WARNING: Not on main branch"' + msg: "No packages in dist/. Run 'task build' first." - # ============================================================================== - # Version Management - # ============================================================================== - - bump-version: - desc: "Bump package version (type: major, minor, patch, release_type or release_num)" + # ============================================================================= + # VERSION + # ============================================================================= + version:bump: + desc: "Bump version (usage: task version:bump -- major|minor|patch|release_num|release_type)" + aliases: [bump] cmds: - - SKIP=pytest bump-my-version bump {{.CLI_ARGS}} + - uv tool run bump-my-version bump {{.CLI_ARGS}} + - echo "✅ New version → $(uv tool run bump-my-version show current_version)" + silent: true - version:update-submodule: - desc: Update proto submodule to latest dev - internal: true + version:current: + desc: "Show current package version" + aliases: [version] cmds: - - git submodule update --remote --merge {{.PROTO_FOLDER}} + - uv tool run bump-my-version show current_version + silent: true - # ============================================================================== - # CI/CD - # ============================================================================== - - ci: - desc: Run full CI pipeline + version:breaking: + desc: "Check for breaking changes in proto files against main branch" + dir: "{{.PROTO_FOLDER}}" cmds: - - task: lint - - task: test - - task: build + - buf breaking proto --against '.git#branch=main,subdir=proto' - ci:quick: - desc: Quick CI checks (lint only) + version:breaking:verbose: + desc: "Check for breaking changes (verbose JSON output)" + dir: "{{.PROTO_FOLDER}}" cmds: - - task: lint:format - - task: lint:ruff + - buf breaking proto --against '.git#branch=main,subdir=proto' --error-format=json | jq - check: - desc: Quick health check + # ============================================================================= + # CLEAN + # ============================================================================= + clean: + desc: "Clean all artifacts (src/ + dist/ + .task/)" cmds: - - task: validate - - task: ci:quick - - echo "All checks passed!" + - task: clean:gen + - task: clean:build - validate: - desc: Validate development environment + clean:build: + desc: "Remove build artifacts (dist/)" cmds: - - command -v uv >/dev/null 2>&1 || { echo "uv not found"; exit 1; } - - command -v task >/dev/null 2>&1 || { echo "task not found"; exit 1; } - - command -v rsync >/dev/null 2>&1 || { echo "rsync not found"; exit 1; } - - echo "All required tools are installed" - - # ============================================================================== - # Cleanup - # ============================================================================== + - rm -rf dist + - find . -type d -name "*.egg-info" -exec rm -rf {} + 2>/dev/null || true + - find . -type d -name "__pycache__" -exec rm -rf {} + 2>/dev/null || true - clean: - desc: Remove build artifacts and cache directories + clean:gen: + desc: "Remove all generated code (src/ + submodule gen/)" cmds: - - rm -rf dist src/{{.PACKAGE_NAME}}.egg-info - - find . -type d -name "__pycache__" -exec rm -rf {} + 2>/dev/null || true - - find . -type d -name "*.egg-info" -exec rm -rf {} + 2>/dev/null || true + - rm -rf {{.SRC_DIR}} + - rm -rf {{.PROTO_GEN_DIR}} + - rm -rf {{.PROTO_FOLDER}}/gen + - rm -rf .task - clean:full: - desc: Deep clean (generated code + venv + all artifacts) - aliases: [clean-all, reset] + clean:all: + desc: "Deep clean (all artifacts + venv)" cmds: - task: clean - - task: proto:clean - rm -rf .venv + - rm -rf {{.PROTO_FOLDER}}/node_modules + + # ============================================================================= + # CI + # ============================================================================= + ci: + desc: "Run full CI pipeline (lint + test + build)" + cmds: + - task: lint:format:check + - task: lint:py + - task: lint:proto + - task: test + - task: build + - echo "✅ All CI checks passed!" + + ci:quick: + desc: "Quick CI checks (format + lint only)" + cmds: + - task: lint:format:check + - task: lint:py + + # ============================================================================= + # VALIDATE + # ============================================================================= + validate: + desc: "Check required tools are installed" + cmds: + - | + echo "Checking required tools..." + MISSING=0 + command -v uv &> /dev/null && echo "✅ uv $(uv --version)" || { echo "❌ uv - https://docs.astral.sh/uv/"; MISSING=1; } + command -v task &> /dev/null && echo "✅ task $(task --version | head -1)" || { echo "❌ task - https://taskfile.dev/"; MISSING=1; } + command -v rsync &> /dev/null && echo "✅ rsync" || { echo "❌ rsync - install via package manager"; MISSING=1; } + command -v git &> /dev/null && echo "✅ git $(git --version)" || { echo "❌ git - https://git-scm.com/"; MISSING=1; } + [ $MISSING -eq 0 ] && echo "✅ All tools installed!" || { echo "❌ Missing required tools."; exit 1; } \ No newline at end of file diff --git a/test/test_imports.py b/test/test_imports.py index 27316cd..4b73719 100644 --- a/test/test_imports.py +++ b/test/test_imports.py @@ -12,13 +12,15 @@ def test_all_proto_imports(): from agentic_mesh_protocol.filesystem.v1 import ( filesystem_service_pb2, ) + + # Module service imports from agentic_mesh_protocol.module.v1 import ( module_service_pb2, ) - # Module registry service imports - from agentic_mesh_protocol.module_registry.v1 import ( - module_registry_service_pb2, + # Registry service imports + from agentic_mesh_protocol.registry.v1 import ( + registry_service_pb2, ) # Setup service imports @@ -38,9 +40,9 @@ def test_all_proto_imports(): # Verify that the modules have expected attributes (basic sanity check) assert hasattr(module_service_pb2, "DESCRIPTOR") - assert hasattr(module_registry_service_pb2, "DESCRIPTOR") assert hasattr(storage_service_pb2, "DESCRIPTOR") assert hasattr(filesystem_service_pb2, "DESCRIPTOR") assert hasattr(cost_service_pb2, "DESCRIPTOR") assert hasattr(setup_service_pb2, "DESCRIPTOR") assert hasattr(user_profile_service_pb2, "DESCRIPTOR") + assert hasattr(registry_service_pb2, "DESCRIPTOR") diff --git a/uv.lock b/uv.lock index aecf812..f28abc6 100644 --- a/uv.lock +++ b/uv.lock @@ -1,5 +1,5 @@ version = 1 -revision = 2 +revision = 3 requires-python = ">=3.10" resolution-markers = [ "python_full_version == '3.14.*'", @@ -10,7 +10,7 @@ resolution-markers = [ [[package]] name = "agentic-mesh-protocol" -version = "0.2.1.dev0" +version = "0.2.2" source = { editable = "." } dependencies = [ { name = "bump-my-version" }, @@ -189,43 +189,31 @@ sdist = { url = "https://files.pythonhosted.org/packages/eb/56/b1ba7935a17738ae8 wheels = [ { url = "https://files.pythonhosted.org/packages/50/bd/b1a6362b80628111e6653c961f987faa55262b4002fcec42308cad1db680/cffi-2.0.0-cp310-cp310-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:53f77cbe57044e88bbd5ed26ac1d0514d2acf0591dd6bb02a3ae37f76811b80c", size = 208811, upload-time = "2025-09-08T23:22:12.267Z" }, { url = "https://files.pythonhosted.org/packages/4f/27/6933a8b2562d7bd1fb595074cf99cc81fc3789f6a6c05cdabb46284a3188/cffi-2.0.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3e837e369566884707ddaf85fc1744b47575005c0a229de3327f8f9a20f4efeb", size = 216402, upload-time = "2025-09-08T23:22:13.455Z" }, - { url = "https://files.pythonhosted.org/packages/05/eb/b86f2a2645b62adcfff53b0dd97e8dfafb5c8aa864bd0d9a2c2049a0d551/cffi-2.0.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:5eda85d6d1879e692d546a078b44251cdd08dd1cfb98dfb77b670c97cee49ea0", size = 203217, upload-time = "2025-09-08T23:22:14.596Z" }, - { url = "https://files.pythonhosted.org/packages/9f/e0/6cbe77a53acf5acc7c08cc186c9928864bd7c005f9efd0d126884858a5fe/cffi-2.0.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9332088d75dc3241c702d852d4671613136d90fa6881da7d770a483fd05248b4", size = 203079, upload-time = "2025-09-08T23:22:15.769Z" }, { url = "https://files.pythonhosted.org/packages/98/29/9b366e70e243eb3d14a5cb488dfd3a0b6b2f1fb001a203f653b93ccfac88/cffi-2.0.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc7de24befaeae77ba923797c7c87834c73648a05a4bde34b3b7e5588973a453", size = 216475, upload-time = "2025-09-08T23:22:17.427Z" }, { url = "https://files.pythonhosted.org/packages/21/7a/13b24e70d2f90a322f2900c5d8e1f14fa7e2a6b3332b7309ba7b2ba51a5a/cffi-2.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cf364028c016c03078a23b503f02058f1814320a56ad535686f90565636a9495", size = 218829, upload-time = "2025-09-08T23:22:19.069Z" }, { url = "https://files.pythonhosted.org/packages/60/99/c9dc110974c59cc981b1f5b66e1d8af8af764e00f0293266824d9c4254bc/cffi-2.0.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e11e82b744887154b182fd3e7e8512418446501191994dbf9c9fc1f32cc8efd5", size = 211211, upload-time = "2025-09-08T23:22:20.588Z" }, { url = "https://files.pythonhosted.org/packages/49/72/ff2d12dbf21aca1b32a40ed792ee6b40f6dc3a9cf1644bd7ef6e95e0ac5e/cffi-2.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8ea985900c5c95ce9db1745f7933eeef5d314f0565b27625d9a10ec9881e1bfb", size = 218036, upload-time = "2025-09-08T23:22:22.143Z" }, { url = "https://files.pythonhosted.org/packages/b1/b7/1200d354378ef52ec227395d95c2576330fd22a869f7a70e88e1447eb234/cffi-2.0.0-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:baf5215e0ab74c16e2dd324e8ec067ef59e41125d3eade2b863d294fd5035c92", size = 209613, upload-time = "2025-09-08T23:22:29.475Z" }, { url = "https://files.pythonhosted.org/packages/b8/56/6033f5e86e8cc9bb629f0077ba71679508bdf54a9a5e112a3c0b91870332/cffi-2.0.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:730cacb21e1bdff3ce90babf007d0a0917cc3e6492f336c2f0134101e0944f93", size = 216476, upload-time = "2025-09-08T23:22:31.063Z" }, - { url = "https://files.pythonhosted.org/packages/dc/7f/55fecd70f7ece178db2f26128ec41430d8720f2d12ca97bf8f0a628207d5/cffi-2.0.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:6824f87845e3396029f3820c206e459ccc91760e8fa24422f8b0c3d1731cbec5", size = 203374, upload-time = "2025-09-08T23:22:32.507Z" }, - { url = "https://files.pythonhosted.org/packages/84/ef/a7b77c8bdc0f77adc3b46888f1ad54be8f3b7821697a7b89126e829e676a/cffi-2.0.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9de40a7b0323d889cf8d23d1ef214f565ab154443c42737dfe52ff82cf857664", size = 202597, upload-time = "2025-09-08T23:22:34.132Z" }, { url = "https://files.pythonhosted.org/packages/d7/91/500d892b2bf36529a75b77958edfcd5ad8e2ce4064ce2ecfeab2125d72d1/cffi-2.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8941aaadaf67246224cee8c3803777eed332a19d909b47e29c9842ef1e79ac26", size = 215574, upload-time = "2025-09-08T23:22:35.443Z" }, { url = "https://files.pythonhosted.org/packages/44/64/58f6255b62b101093d5df22dcb752596066c7e89dd725e0afaed242a61be/cffi-2.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a05d0c237b3349096d3981b727493e22147f934b20f6f125a3eba8f994bec4a9", size = 218971, upload-time = "2025-09-08T23:22:36.805Z" }, { url = "https://files.pythonhosted.org/packages/ab/49/fa72cebe2fd8a55fbe14956f9970fe8eb1ac59e5df042f603ef7c8ba0adc/cffi-2.0.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:94698a9c5f91f9d138526b48fe26a199609544591f859c870d477351dc7b2414", size = 211972, upload-time = "2025-09-08T23:22:38.436Z" }, { url = "https://files.pythonhosted.org/packages/0b/28/dd0967a76aab36731b6ebfe64dec4e981aff7e0608f60c2d46b46982607d/cffi-2.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5fed36fccc0612a53f1d4d9a816b50a36702c28a2aa880cb8a122b3466638743", size = 217078, upload-time = "2025-09-08T23:22:39.776Z" }, { url = "https://files.pythonhosted.org/packages/ff/df/a4f0fbd47331ceeba3d37c2e51e9dfc9722498becbeec2bd8bc856c9538a/cffi-2.0.0-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:21d1152871b019407d8ac3985f6775c079416c282e431a4da6afe7aefd2bccbe", size = 212529, upload-time = "2025-09-08T23:22:47.349Z" }, { url = "https://files.pythonhosted.org/packages/d5/72/12b5f8d3865bf0f87cf1404d8c374e7487dcf097a1c91c436e72e6badd83/cffi-2.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b21e08af67b8a103c71a250401c78d5e0893beff75e28c53c98f4de42f774062", size = 220097, upload-time = "2025-09-08T23:22:48.677Z" }, - { url = "https://files.pythonhosted.org/packages/c2/95/7a135d52a50dfa7c882ab0ac17e8dc11cec9d55d2c18dda414c051c5e69e/cffi-2.0.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:1e3a615586f05fc4065a8b22b8152f0c1b00cdbc60596d187c2a74f9e3036e4e", size = 207983, upload-time = "2025-09-08T23:22:50.06Z" }, - { url = "https://files.pythonhosted.org/packages/3a/c8/15cb9ada8895957ea171c62dc78ff3e99159ee7adb13c0123c001a2546c1/cffi-2.0.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:81afed14892743bbe14dacb9e36d9e0e504cd204e0b165062c488942b9718037", size = 206519, upload-time = "2025-09-08T23:22:51.364Z" }, { url = "https://files.pythonhosted.org/packages/78/2d/7fa73dfa841b5ac06c7b8855cfc18622132e365f5b81d02230333ff26e9e/cffi-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3e17ed538242334bf70832644a32a7aae3d83b57567f9fd60a26257e992b79ba", size = 219572, upload-time = "2025-09-08T23:22:52.902Z" }, { url = "https://files.pythonhosted.org/packages/07/e0/267e57e387b4ca276b90f0434ff88b2c2241ad72b16d31836adddfd6031b/cffi-2.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3925dd22fa2b7699ed2617149842d2e6adde22b262fcbfada50e3d195e4b3a94", size = 222963, upload-time = "2025-09-08T23:22:54.518Z" }, { url = "https://files.pythonhosted.org/packages/b6/75/1f2747525e06f53efbd878f4d03bac5b859cbc11c633d0fb81432d98a795/cffi-2.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2c8f814d84194c9ea681642fd164267891702542f028a15fc97d4674b6206187", size = 221361, upload-time = "2025-09-08T23:22:55.867Z" }, { url = "https://files.pythonhosted.org/packages/b0/1e/d22cc63332bd59b06481ceaac49d6c507598642e2230f201649058a7e704/cffi-2.0.0-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:07b271772c100085dd28b74fa0cd81c8fb1a3ba18b21e03d7c27f3436a10606b", size = 212446, upload-time = "2025-09-08T23:23:03.472Z" }, { url = "https://files.pythonhosted.org/packages/a9/f5/a2c23eb03b61a0b8747f211eb716446c826ad66818ddc7810cc2cc19b3f2/cffi-2.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b", size = 220101, upload-time = "2025-09-08T23:23:04.792Z" }, - { url = "https://files.pythonhosted.org/packages/f2/7f/e6647792fc5850d634695bc0e6ab4111ae88e89981d35ac269956605feba/cffi-2.0.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f93fd8e5c8c0a4aa1f424d6173f14a892044054871c771f8566e4008eaa359d2", size = 207948, upload-time = "2025-09-08T23:23:06.127Z" }, - { url = "https://files.pythonhosted.org/packages/cb/1e/a5a1bd6f1fb30f22573f76533de12a00bf274abcdc55c8edab639078abb6/cffi-2.0.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:dd4f05f54a52fb558f1ba9f528228066954fee3ebe629fc1660d874d040ae5a3", size = 206422, upload-time = "2025-09-08T23:23:07.753Z" }, { url = "https://files.pythonhosted.org/packages/98/df/0a1755e750013a2081e863e7cd37e0cdd02664372c754e5560099eb7aa44/cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26", size = 219499, upload-time = "2025-09-08T23:23:09.648Z" }, { url = "https://files.pythonhosted.org/packages/50/e1/a969e687fcf9ea58e6e2a928ad5e2dd88cc12f6f0ab477e9971f2309b57c/cffi-2.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d9b29c1f0ae438d5ee9acb31cadee00a58c46cc9c0b2f9038c6b0b3470877a8c", size = 222928, upload-time = "2025-09-08T23:23:10.928Z" }, { url = "https://files.pythonhosted.org/packages/36/54/0362578dd2c9e557a28ac77698ed67323ed5b9775ca9d3fe73fe191bb5d8/cffi-2.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6d50360be4546678fc1b79ffe7a66265e28667840010348dd69a314145807a1b", size = 221302, upload-time = "2025-09-08T23:23:12.42Z" }, { url = "https://files.pythonhosted.org/packages/d6/43/0e822876f87ea8a4ef95442c3d766a06a51fc5298823f884ef87aaad168c/cffi-2.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:24b6f81f1983e6df8db3adc38562c83f7d4a0c36162885ec7f7b77c7dcbec97b", size = 220049, upload-time = "2025-09-08T23:23:20.853Z" }, - { url = "https://files.pythonhosted.org/packages/b4/89/76799151d9c2d2d1ead63c2429da9ea9d7aac304603de0c6e8764e6e8e70/cffi-2.0.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:12873ca6cb9b0f0d3a0da705d6086fe911591737a59f28b7936bdfed27c0d47c", size = 207793, upload-time = "2025-09-08T23:23:22.08Z" }, - { url = "https://files.pythonhosted.org/packages/bb/dd/3465b14bb9e24ee24cb88c9e3730f6de63111fffe513492bf8c808a3547e/cffi-2.0.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:d9b97165e8aed9272a6bb17c01e3cc5871a594a446ebedc996e2397a1c1ea8ef", size = 206300, upload-time = "2025-09-08T23:23:23.314Z" }, { url = "https://files.pythonhosted.org/packages/47/d9/d83e293854571c877a92da46fdec39158f8d7e68da75bf73581225d28e90/cffi-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775", size = 219244, upload-time = "2025-09-08T23:23:24.541Z" }, { url = "https://files.pythonhosted.org/packages/2b/0f/1f177e3683aead2bb00f7679a16451d302c436b5cbf2505f0ea8146ef59e/cffi-2.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:737fe7d37e1a1bffe70bd5754ea763a62a066dc5913ca57e957824b72a85e205", size = 222828, upload-time = "2025-09-08T23:23:26.143Z" }, { url = "https://files.pythonhosted.org/packages/c6/0f/cafacebd4b040e3119dcb32fed8bdef8dfe94da653155f9d0b9dc660166e/cffi-2.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:38100abb9d1b1435bc4cc340bb4489635dc2f0da7456590877030c9b3d40b0c1", size = 220926, upload-time = "2025-09-08T23:23:27.873Z" }, { url = "https://files.pythonhosted.org/packages/be/b4/c56878d0d1755cf9caa54ba71e5d049479c52f9e4afc230f06822162ab2f/cffi-2.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7cc09976e8b56f8cebd752f7113ad07752461f48a58cbba644139015ac24954c", size = 221593, upload-time = "2025-09-08T23:23:31.91Z" }, - { url = "https://files.pythonhosted.org/packages/e0/0d/eb704606dfe8033e7128df5e90fee946bbcb64a04fcdaa97321309004000/cffi-2.0.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:92b68146a71df78564e4ef48af17551a5ddd142e5190cdf2c5624d0c3ff5b2e8", size = 209354, upload-time = "2025-09-08T23:23:33.214Z" }, - { url = "https://files.pythonhosted.org/packages/d8/19/3c435d727b368ca475fb8742ab97c9cb13a0de600ce86f62eab7fa3eea60/cffi-2.0.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b1e74d11748e7e98e2f426ab176d4ed720a64412b6a15054378afdb71e0f37dc", size = 208480, upload-time = "2025-09-08T23:23:34.495Z" }, { url = "https://files.pythonhosted.org/packages/d0/44/681604464ed9541673e486521497406fadcc15b5217c3e326b061696899a/cffi-2.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:28a3a209b96630bca57cce802da70c266eb08c6e97e5afd61a75611ee6c64592", size = 221584, upload-time = "2025-09-08T23:23:36.096Z" }, { url = "https://files.pythonhosted.org/packages/25/8e/342a504ff018a2825d395d44d63a767dd8ebc927ebda557fecdaca3ac33a/cffi-2.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7553fb2090d71822f02c629afe6042c299edf91ba1bf94951165613553984512", size = 224443, upload-time = "2025-09-08T23:23:37.328Z" }, { url = "https://files.pythonhosted.org/packages/e1/5e/b666bacbbc60fbf415ba9988324a132c9a7a0448a9a8f125074671c0f2c3/cffi-2.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6c6c373cfc5c83a975506110d17457138c8c63016b563cc9ed6e056a82f13ce4", size = 223437, upload-time = "2025-09-08T23:23:38.945Z" }, @@ -364,10 +352,8 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/5c/49/498c86566a1d80e978b42f0d702795f69887005548c041636df6ae1ca64c/cryptography-46.0.3-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:01ca9ff2885f3acc98c29f1860552e37f6d7c7d013d7334ff2a9de43a449315d", size = 4450807, upload-time = "2025-10-15T23:16:56.414Z" }, { url = "https://files.pythonhosted.org/packages/4b/0a/863a3604112174c8624a2ac3c038662d9e59970c7f926acdcfaed8d61142/cryptography-46.0.3-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:6eae65d4c3d33da080cff9c4ab1f711b15c1d9760809dad6ea763f3812d254cb", size = 4299615, upload-time = "2025-10-15T23:16:58.442Z" }, { url = "https://files.pythonhosted.org/packages/64/02/b73a533f6b64a69f3cd3872acb6ebc12aef924d8d103133bb3ea750dc703/cryptography-46.0.3-cp311-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e5bf0ed4490068a2e72ac03d786693adeb909981cc596425d09032d372bcc849", size = 4016800, upload-time = "2025-10-15T23:17:00.378Z" }, - { url = "https://files.pythonhosted.org/packages/25/d5/16e41afbfa450cde85a3b7ec599bebefaef16b5c6ba4ec49a3532336ed72/cryptography-46.0.3-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:5ecfccd2329e37e9b7112a888e76d9feca2347f12f37918facbb893d7bb88ee8", size = 4984707, upload-time = "2025-10-15T23:17:01.98Z" }, { url = "https://files.pythonhosted.org/packages/c9/56/e7e69b427c3878352c2fb9b450bd0e19ed552753491d39d7d0a2f5226d41/cryptography-46.0.3-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:a2c0cd47381a3229c403062f764160d57d4d175e022c1df84e168c6251a22eec", size = 4482541, upload-time = "2025-10-15T23:17:04.078Z" }, { url = "https://files.pythonhosted.org/packages/78/f6/50736d40d97e8483172f1bb6e698895b92a223dba513b0ca6f06b2365339/cryptography-46.0.3-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:549e234ff32571b1f4076ac269fcce7a808d3bf98b76c8dd560e42dbc66d7d91", size = 4299464, upload-time = "2025-10-15T23:17:05.483Z" }, - { url = "https://files.pythonhosted.org/packages/00/de/d8e26b1a855f19d9994a19c702fa2e93b0456beccbcfe437eda00e0701f2/cryptography-46.0.3-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:c0a7bb1a68a5d3471880e264621346c48665b3bf1c3759d682fc0864c540bd9e", size = 4950838, upload-time = "2025-10-15T23:17:07.425Z" }, { url = "https://files.pythonhosted.org/packages/8f/29/798fc4ec461a1c9e9f735f2fc58741b0daae30688f41b2497dcbc9ed1355/cryptography-46.0.3-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:10b01676fc208c3e6feeb25a8b83d81767e8059e1fe86e1dc62d10a3018fa926", size = 4481596, upload-time = "2025-10-15T23:17:09.343Z" }, { url = "https://files.pythonhosted.org/packages/15/8d/03cd48b20a573adfff7652b76271078e3045b9f49387920e7f1f631d125e/cryptography-46.0.3-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:0abf1ffd6e57c67e92af68330d05760b7b7efb243aab8377e583284dbab72c71", size = 4426782, upload-time = "2025-10-15T23:17:11.22Z" }, { url = "https://files.pythonhosted.org/packages/fa/b1/ebacbfe53317d55cf33165bda24c86523497a6881f339f9aae5c2e13e57b/cryptography-46.0.3-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a04bee9ab6a4da801eb9b51f1b708a1b5b5c9eb48c03f74198464c66f0d344ac", size = 4698381, upload-time = "2025-10-15T23:17:12.829Z" }, @@ -375,10 +361,8 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c5/fd/bc1daf8230eaa075184cbbf5f8cd00ba9db4fd32d63fb83da4671b72ed8a/cryptography-46.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:39b6755623145ad5eff1dab323f4eae2a32a77a7abef2c5089a04a3d04366715", size = 4435078, upload-time = "2025-10-15T23:17:23.042Z" }, { url = "https://files.pythonhosted.org/packages/82/98/d3bd5407ce4c60017f8ff9e63ffee4200ab3e23fe05b765cab805a7db008/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:db391fa7c66df6762ee3f00c95a89e6d428f4d60e7abc8328f4fe155b5ac6e54", size = 4293460, upload-time = "2025-10-15T23:17:24.885Z" }, { url = "https://files.pythonhosted.org/packages/26/e9/e23e7900983c2b8af7a08098db406cf989d7f09caea7897e347598d4cd5b/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:78a97cf6a8839a48c49271cdcbd5cf37ca2c1d6b7fdd86cc864f302b5e9bf459", size = 3995237, upload-time = "2025-10-15T23:17:26.449Z" }, - { url = "https://files.pythonhosted.org/packages/91/15/af68c509d4a138cfe299d0d7ddb14afba15233223ebd933b4bbdbc7155d3/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:dfb781ff7eaa91a6f7fd41776ec37c5853c795d3b358d4896fdbb5df168af422", size = 4967344, upload-time = "2025-10-15T23:17:28.06Z" }, { url = "https://files.pythonhosted.org/packages/ca/e3/8643d077c53868b681af077edf6b3cb58288b5423610f21c62aadcbe99f4/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:6f61efb26e76c45c4a227835ddeae96d83624fb0d29eb5df5b96e14ed1a0afb7", size = 4466564, upload-time = "2025-10-15T23:17:29.665Z" }, { url = "https://files.pythonhosted.org/packages/0e/43/c1e8726fa59c236ff477ff2b5dc071e54b21e5a1e51aa2cee1676f1c986f/cryptography-46.0.3-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:23b1a8f26e43f47ceb6d6a43115f33a5a37d57df4ea0ca295b780ae8546e8044", size = 4292415, upload-time = "2025-10-15T23:17:31.686Z" }, - { url = "https://files.pythonhosted.org/packages/42/f9/2f8fefdb1aee8a8e3256a0568cffc4e6d517b256a2fe97a029b3f1b9fe7e/cryptography-46.0.3-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:b419ae593c86b87014b9be7396b385491ad7f320bde96826d0dd174459e54665", size = 4931457, upload-time = "2025-10-15T23:17:33.478Z" }, { url = "https://files.pythonhosted.org/packages/79/30/9b54127a9a778ccd6d27c3da7563e9f2d341826075ceab89ae3b41bf5be2/cryptography-46.0.3-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:50fc3343ac490c6b08c0cf0d704e881d0d660be923fd3076db3e932007e726e3", size = 4466074, upload-time = "2025-10-15T23:17:35.158Z" }, { url = "https://files.pythonhosted.org/packages/ac/68/b4f4a10928e26c941b1b6a179143af9f4d27d88fe84a6a3c53592d2e76bf/cryptography-46.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:22d7e97932f511d6b0b04f2bfd818d73dcd5928db509460aaf48384778eb6d20", size = 4420569, upload-time = "2025-10-15T23:17:37.188Z" }, { url = "https://files.pythonhosted.org/packages/a3/49/3746dab4c0d1979888f125226357d3262a6dd40e114ac29e3d2abdf1ec55/cryptography-46.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:d55f3dffadd674514ad19451161118fd010988540cee43d8bc20675e775925de", size = 4681941, upload-time = "2025-10-15T23:17:39.236Z" }, @@ -386,10 +370,8 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/26/42/fa8389d4478368743e24e61eea78846a0006caffaf72ea24a15159215a14/cryptography-46.0.3-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:15ab9b093e8f09daab0f2159bb7e47532596075139dd74365da52ecc9cb46c5d", size = 4440029, upload-time = "2025-10-15T23:17:49.837Z" }, { url = "https://files.pythonhosted.org/packages/5f/eb/f483db0ec5ac040824f269e93dd2bd8a21ecd1027e77ad7bdf6914f2fd80/cryptography-46.0.3-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:46acf53b40ea38f9c6c229599a4a13f0d46a6c3fa9ef19fc1a124d62e338dfa0", size = 4297222, upload-time = "2025-10-15T23:17:51.357Z" }, { url = "https://files.pythonhosted.org/packages/fd/cf/da9502c4e1912cb1da3807ea3618a6829bee8207456fbbeebc361ec38ba3/cryptography-46.0.3-cp38-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:10ca84c4668d066a9878890047f03546f3ae0a6b8b39b697457b7757aaf18dbc", size = 4012280, upload-time = "2025-10-15T23:17:52.964Z" }, - { url = "https://files.pythonhosted.org/packages/6b/8f/9adb86b93330e0df8b3dcf03eae67c33ba89958fc2e03862ef1ac2b42465/cryptography-46.0.3-cp38-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:36e627112085bb3b81b19fed209c05ce2a52ee8b15d161b7c643a7d5a88491f3", size = 4978958, upload-time = "2025-10-15T23:17:54.965Z" }, { url = "https://files.pythonhosted.org/packages/d1/a0/5fa77988289c34bdb9f913f5606ecc9ada1adb5ae870bd0d1054a7021cc4/cryptography-46.0.3-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:1000713389b75c449a6e979ffc7dcc8ac90b437048766cef052d4d30b8220971", size = 4473714, upload-time = "2025-10-15T23:17:56.754Z" }, { url = "https://files.pythonhosted.org/packages/14/e5/fc82d72a58d41c393697aa18c9abe5ae1214ff6f2a5c18ac470f92777895/cryptography-46.0.3-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:b02cf04496f6576afffef5ddd04a0cb7d49cf6be16a9059d793a30b035f6b6ac", size = 4296970, upload-time = "2025-10-15T23:17:58.588Z" }, - { url = "https://files.pythonhosted.org/packages/78/06/5663ed35438d0b09056973994f1aec467492b33bd31da36e468b01ec1097/cryptography-46.0.3-cp38-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:71e842ec9bc7abf543b47cf86b9a743baa95f4677d22baa4c7d5c69e49e9bc04", size = 4940236, upload-time = "2025-10-15T23:18:00.897Z" }, { url = "https://files.pythonhosted.org/packages/fc/59/873633f3f2dcd8a053b8dd1d38f783043b5fce589c0f6988bf55ef57e43e/cryptography-46.0.3-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:402b58fc32614f00980b66d6e56a5b4118e6cb362ae8f3fda141ba4689bd4506", size = 4472642, upload-time = "2025-10-15T23:18:02.749Z" }, { url = "https://files.pythonhosted.org/packages/3d/39/8e71f3930e40f6877737d6f69248cf74d4e34b886a3967d32f919cc50d3b/cryptography-46.0.3-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:ef639cb3372f69ec44915fafcd6698b6cc78fbe0c2ea41be867f6ed612811963", size = 4423126, upload-time = "2025-10-15T23:18:04.85Z" }, { url = "https://files.pythonhosted.org/packages/cd/c7/f65027c2810e14c3e7268353b1681932b87e5a48e65505d8cc17c99e36ae/cryptography-46.0.3-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:3b51b8ca4f1c6453d8829e1eb7299499ca7f313900dd4d89a24b8b87c0a780d4", size = 4686573, upload-time = "2025-10-15T23:18:06.908Z" },