diff --git a/newsfragments/960.bugfix.rst b/newsfragments/960.bugfix.rst
new file mode 100644
index 00000000..25ac78b7
--- /dev/null
+++ b/newsfragments/960.bugfix.rst
@@ -0,0 +1,4 @@
+The :class:`trio.Path` classmethods, :meth:`~trio.Path.home` and
+:meth:`~trio.Path.cwd`, are now async functions.  Previously, a bug
+in the forwarding logic meant :meth:`~trio.Path.cwd` was synchronous
+and :meth:`~trio.Path.home` didn't work at all.
diff --git a/trio/_path.py b/trio/_path.py
index abaf9f7e..7c29f485 100644
--- a/trio/_path.py
+++ b/trio/_path.py
@@ -54,7 +54,7 @@ def _forward_magic(cls, attr):
 
 
 def thread_wrapper_factory(cls, meth_name):
-    @async_wraps(cls, pathlib.Path, meth_name)
+    @async_wraps(cls, cls._wraps, meth_name)
     async def wrapper(self, *args, **kwargs):
         args = unwrap_paths(args)
         meth = getattr(self._wrapped, meth_name)
@@ -65,6 +65,19 @@ def thread_wrapper_factory(cls, meth_name):
     return wrapper
 
 
+def classmethod_wrapper_factory(cls, meth_name):
+    @classmethod
+    @async_wraps(cls, cls._wraps, meth_name)
+    async def wrapper(cls, *args, **kwargs):
+        args = unwrap_paths(args)
+        meth = getattr(cls._wraps, meth_name)
+        func = partial(meth, *args, **kwargs)
+        value = await trio.run_sync_in_worker_thread(func)
+        return rewrap_path(value)
+
+    return wrapper
+
+
 class AsyncAutoWrapperType(type):
     def __init__(cls, name, bases, attrs):
         super().__init__(name, bases, attrs)
@@ -93,9 +106,9 @@ class AsyncAutoWrapperType(type):
         for attr_name, attr in cls._wraps.__dict__.items():
             if attr_name.startswith('_') or attr_name in attrs:
                 continue
-
             if isinstance(attr, classmethod):
-                setattr(cls, attr_name, attr)
+                wrapper = classmethod_wrapper_factory(cls, attr_name)
+                setattr(cls, attr_name, wrapper)
             elif isinstance(attr, types.FunctionType):
                 wrapper = thread_wrapper_factory(cls, attr_name)
                 setattr(cls, attr_name, wrapper)

trio.Path.home raises "AttributeError: _flavour"
I get the following on Mac and Linux:
```
>>> import trio
>>> trio.Path.home()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/Cellar/python/3.7.2_1/Frameworks/Python.framework/Versions/3.7/lib/python3.7/pathlib.py", line 1055, in home
    return cls(cls()._flavour.gethomedir(None))
  File "/Users/zach/.allotropic/python/default/lib/python3.7/site-packages/trio/_path.py", line 157, in __getattr__
    raise AttributeError(name)
AttributeError: _flavour
```
As the traceback states, ``pathlib.Path`` is instantiating itself to dertermine its ``_flavour``, which is a class to delegate filesystem calls to differing Windows and Posix environments.

I think the explanation is that trio.Path does not override ``__new__``, so it doesn't get a chance to turn into a ``PosixPath`` or ``WindowsPath`` object like ``pathlib.Path`` objects do.  The ``_flavour`` attribute is only available from these system-specific classes, and the ``AsyncAutoWrapperType`` doesn't explicitly wrap these classes to make it an attribute of ``trio.Path``.

One workaround is to override ``home`` in ``trio.Path``:
```
    @classmethod
    def home(cls):
        return cls(cls()._wraps()._flavour.gethomedir(None))
```

There are other approaches and I'd like to check in with the team here.  Any thoughts?
diff --git a/trio/tests/test_path.py b/trio/tests/test_path.py
index 65296deb..d234b824 100644
--- a/trio/tests/test_path.py
+++ b/trio/tests/test_path.py
@@ -209,3 +209,14 @@ async def test_iterdir(path):
         entries.add(entry.name)
 
     assert entries == {'bar.txt', 'foo'}
+
+
+async def test_classmethods():
+    assert isinstance(await trio.Path.home(), trio.Path)
+
+    # pathlib.Path has only two classmethods
+    assert str(await trio.Path.home()) == os.path.expanduser('~')
+    assert str(await trio.Path.cwd()) == os.getcwd()
+
+    # Wrapped method has docstring
+    assert trio.Path.home.__doc__

pip install -e .[dev]
parse_log_pytest
pytest
pytest
apt-get update apt-get install -y gcc
3.9
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
async-generator==1.10
attrs==25.3.0
exceptiongroup @ file:///croot/exceptiongroup_1706031385326/work
idna==3.10
iniconfig @ file:///home/linux1/recipes/ci/iniconfig_1610983019677/work
outcome==1.3.0.post0
packaging @ file:///croot/packaging_1734472117206/work
pluggy @ file:///croot/pluggy_1733169602837/work
pytest @ file:///croot/pytest_1738938843180/work
sniffio==1.3.1
sortedcontainers==2.4.0
tomli @ file:///opt/conda/conda-bld/tomli_1657175507142/work
-e git+https://github.com/python-trio/trio.git@6522fb5cc5d76e6738f2a830f58321b110a86466#egg=trio

name: trio
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - exceptiongroup=1.2.0=py39h06a4308_0
  - iniconfig=1.1.1=pyhd3eb1b0_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=3.0.16=h5eee18b_0
  - packaging=24.2=py39h06a4308_0
  - pip=25.0=py39h06a4308_0
  - pluggy=1.5.0=py39h06a4308_0
  - pytest=8.3.4=py39h06a4308_0
  - python=3.9.21=he870216_1
  - readline=8.2=h5eee18b_0
  - setuptools=75.8.0=py39h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tomli=2.0.1=py39h06a4308_0
  - tzdata=2025a=h04d1e81_0
  - wheel=0.45.1=py39h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - async-generator==1.10
      - attrs==25.3.0
      - idna==3.10
      - outcome==1.3.0.post0
      - sniffio==1.3.1
      - sortedcontainers==2.4.0
      - trio==0.11.0+dev
prefix: /opt/conda/envs/trio

trio/tests/test_path.py::test_classmethods
trio/tests/test_path.py::test_open_is_async_context_manager trio/tests/test_path.py::test_magic trio/tests/test_path.py::test_cmp_magic[Path-Path0] trio/tests/test_path.py::test_cmp_magic[Path-Path1] trio/tests/test_path.py::test_cmp_magic[Path-Path2] trio/tests/test_path.py::test_div_magic[Path-Path0] trio/tests/test_path.py::test_div_magic[Path-Path1] trio/tests/test_path.py::test_div_magic[Path-str] trio/tests/test_path.py::test_div_magic[str-Path] trio/tests/test_path.py::test_forwarded_properties trio/tests/test_path.py::test_async_method_signature trio/tests/test_path.py::test_compare_async_stat_methods[is_dir] trio/tests/test_path.py::test_compare_async_stat_methods[is_file] trio/tests/test_path.py::test_invalid_name_not_wrapped trio/tests/test_path.py::test_async_methods_rewrap[absolute] trio/tests/test_path.py::test_async_methods_rewrap[resolve] trio/tests/test_path.py::test_forward_methods_rewrap trio/tests/test_path.py::test_forward_properties_rewrap trio/tests/test_path.py::test_forward_methods_without_rewrap trio/tests/test_path.py::test_repr trio/tests/test_path.py::test_type_forwards_unsupported trio/tests/test_path.py::test_type_wraps_unsupported trio/tests/test_path.py::test_type_forwards_private trio/tests/test_path.py::test_type_wraps_private trio/tests/test_path.py::test_path_wraps_path[__init__] trio/tests/test_path.py::test_path_wraps_path[joinpath] trio/tests/test_path.py::test_path_nonpath trio/tests/test_path.py::test_open_file_can_open_path trio/tests/test_path.py::test_iterdir
trio/_path.py newsfragments/960.bugfix.rst
trio/_path.py newsfragments/960.bugfix.rst