Metadata-Version: 2.4
Name: scitrera-repo-tools
Version: 0.1.7
Summary: Centralized monorepo version-sync tool driven by versions.yaml.
Project-URL: Homepage, https://github.com/scitrera/repo-tools
Project-URL: Repository, https://github.com/scitrera/repo-tools
Author-email: "scitrera.ai" <open-source-team@scitrera.com>
License-Expression: BSD-3-Clause
License-File: LICENSE
Keywords: monorepo,package.json,pyproject,sync,version
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Developers
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3 :: Only
Classifier: Topic :: Software Development :: Build Tools
Requires-Python: >=3.11
Requires-Dist: pyyaml==6.0.3
Provides-Extra: test
Requires-Dist: pytest==9.0.3; extra == 'test'
Description-Content-Type: text/markdown

# scitrera-repo-tools

Centralized monorepo version-sync tool driven by `versions.yaml`.

## Install

```bash
pip install scitrera-repo-tools
# or, from source:
pip install -e .
```

## Usage

From any directory inside a monorepo containing a `versions.yaml`:

```bash
sync-versions            # apply updates (preserves local refs)
sync-versions --check    # dry-run, exit 1 on drift
sync-versions --verbose  # show every file inspected
sync-versions --config path/to/versions.yaml
```

### Release mode

By default, `sync-versions` preserves local-reference dep specifiers
(`file:../foo`, `workspace:*`, `link:`, `git+...`, PEP 508 `pkg @ git+...`)
so local development keeps working. Before publishing to PyPI/npm, opt in
to rewrite those into canonical version pins from `versions.yaml`:

```bash
sync-versions --release            # rewrite local refs to version pins
sync-versions --release --check    # preview the release-pass diff in CI
```

Typical pre-publish flow:

```bash
sync-versions --release
git diff                            # review the version-pin substitutions
# ... build + publish (npm publish / uv publish) ...
git checkout -- .                   # restore local refs for ongoing dev
```

## `versions.yaml` schema

```yaml
# Top-level project versions
my-python-pkg: 0.1.22
my-ts-pkg: 0.1.22

# External dep pins per language (optional)
preferred_versions:
  python:
    "pydantic": "2.13.4"             # bare -> `==2.13.4`; literal w/ operator preserved
  typescript:
    "@modelcontextprotocol/sdk": "^1.26.0"
  go:
    "google.golang.org/grpc": "v1.65.0"      # bare or `v`-prefixed both accepted
    "google.golang.org/protobuf": "1.34.1"

# Per-project file rules (replaces the hardcoded PROJECT_RULES dict)
project_rules:
  my-python-pkg:
    - { type: pyproject, path: my-python-pkg/pyproject.toml }
    - { type: init_py,   path: my-python-pkg/src/my_pkg/__init__.py }
  my-ts-pkg:
    - { type: package,   path: my-ts-pkg/package.json }

# Internal monorepo cross-reference sync (optional)
dependency_mappings:
  python:
    packages:
      "my-internal-dir": "my-published-name"
    dependencies:
      my-consumer:
        - "my-internal-dir"

# Lockfile fallback for nulls in preferred_versions (optional)
sources:
  python:
    - "uv.lock"

# Global Go toolchain directives (optional, no-inject)
# Walks every go.mod referenced in project_rules.gomod_require.
go_toolchain:
  go:        "1.25"      # rewrites the `go X.Y` directive
  toolchain: "1.25.10"   # rewrites `toolchain goX.Y.Z` (Go 1.21+ feature)
```

## Releases

Releases are automated via GitHub Actions on tag push (`v*.*.*`):

1. CI runs the test suite on Python 3.11/3.12/3.13.
2. A guard step asserts the tag matches `pyproject.toml`'s `[project].version`.
3. `python -m build` produces an sdist + wheel.
4. The artifacts are published to PyPI via [trusted publishing](https://docs.pypi.org/trusted-publishers/) (OIDC; no API token).
5. A GitHub Release is created with the artifacts attached.

## License

BSD 3-Clause.
