Skip to content

Release plan

release_plan

Read-only workspace release planning through the shared AXMTool surface.

GitReleasePlanTool

Bases: AXMTool

Plan package releases in mandatory dependency order without publishing.

Source code in packages/axm-git/src/axm_git/tools/release_plan.py
Python
class GitReleasePlanTool(AXMTool):
    """Plan package releases in mandatory dependency order without publishing."""

    @property
    def name(self) -> str:
        """Registered AXMTool name."""
        return "git_release_plan"

    def execute(
        self, *, path: str = ".", ref: str = "HEAD", **kwargs: object
    ) -> ToolResult:
        """Return the pinned workspace plan; never fetch, checkout, tag or push.

        Args:
            path: Repository or package directory inside the repository.
            ref: Commit or ref to plan, resolved once before reading metadata.

        Returns:
            Structured ordered package/version plan, or an explicit blocker.
        """
        root = find_git_root(Path(path).resolve())
        if root is None:
            return ToolResult(success=False, error="Not a Git repository")
        try:
            data = plan_releases(root, ref)
        except subprocess.TimeoutExpired as exc:
            return timeout_error_result(exc)
        except (ValueError, OSError) as exc:
            return ToolResult(success=False, error=str(exc))
        packages = data["packages"]
        assert isinstance(packages, list)
        lines = [f"git_release_plan | {data['ref']} | {len(packages)} packages"]
        for entry in packages:
            assert isinstance(entry, dict)
            lines.append(
                f"{entry['name']} {entry['suggested_next']} | {entry['action']}"
            )
        return ToolResult(success=True, data=data, text="\n".join(lines))
name property

Registered AXMTool name.

execute(*, path='.', ref='HEAD', **kwargs)

Return the pinned workspace plan; never fetch, checkout, tag or push.

Parameters:

Name Type Description Default
path str

Repository or package directory inside the repository.

'.'
ref str

Commit or ref to plan, resolved once before reading metadata.

'HEAD'

Returns:

Type Description
ToolResult

Structured ordered package/version plan, or an explicit blocker.

Source code in packages/axm-git/src/axm_git/tools/release_plan.py
Python
def execute(
    self, *, path: str = ".", ref: str = "HEAD", **kwargs: object
) -> ToolResult:
    """Return the pinned workspace plan; never fetch, checkout, tag or push.

    Args:
        path: Repository or package directory inside the repository.
        ref: Commit or ref to plan, resolved once before reading metadata.

    Returns:
        Structured ordered package/version plan, or an explicit blocker.
    """
    root = find_git_root(Path(path).resolve())
    if root is None:
        return ToolResult(success=False, error="Not a Git repository")
    try:
        data = plan_releases(root, ref)
    except subprocess.TimeoutExpired as exc:
        return timeout_error_result(exc)
    except (ValueError, OSError) as exc:
        return ToolResult(success=False, error=str(exc))
    packages = data["packages"]
    assert isinstance(packages, list)
    lines = [f"git_release_plan | {data['ref']} | {len(packages)} packages"]
    for entry in packages:
        assert isinstance(entry, dict)
        lines.append(
            f"{entry['name']} {entry['suggested_next']} | {entry['action']}"
        )
    return ToolResult(success=True, data=data, text="\n".join(lines))