nixbot

builds

failed mcptoon-0.7.17 checks.x86_64-linux.pkgs-mcptoon · build #4819 · raw

1Sourcing python-remove-tests-dir-hook2Sourcing python-catch-conflicts-hook.sh3Sourcing python-remove-bin-bytecode-hook.sh4Sourcing pypa-build-hook5Using pypaBuildPhase6Sourcing python-runtime-deps-check-hook7Using pythonRuntimeDepsCheckHook8Sourcing pypa-install-hook9Using pypaInstallPhase10Sourcing python-imports-check-hook.sh11Using pythonImportsCheckPhase12Sourcing python-namespaces-hook13Sourcing python-catch-conflicts-hook.sh14Sourcing pytest-check-hook15Using pytestCheckPhase
unpackPhase
16unpacking source archive /nix/store/92q287ar3njqi8x54ib1ap60df8m9720-source17source root is source18setting SOURCE_DATE_EPOCH to timestamp 315619200 of file "source/tests/test_watch.py"
configurePhase
19no configure script, doing nothing
buildPhase
20Executing pypaBuildPhase21Creating a wheel...22pypa build flags: --no-isolation --outdir dist/ --wheel23* Getting build dependencies for wheel...24/nix/store/gyficbimx12q5975523ps3kjzz8ys4pq-python3.14-setuptools-83.0.0/lib/python3.14/site-packages/setuptools/config/_apply_pyprojecttoml.py:82: SetuptoolsDeprecationWarning: `project.license` as a TOML table is deprecated25!!2627 ********************************************************************************28 Please use a simple string containing a SPDX expression for `project.license`. You can also use `project.license-files`. (Both options available on setuptools>=77.0.0).2930 By 2027-Feb-18, you need to update your project and remove deprecated calls31 or your builds will no longer be supported.3233 See https://packaging.python.org/en/latest/guides/writing-pyproject-toml/#license for details.34 ********************************************************************************3536!!37 corresp(dist, value, root_dir)38/nix/store/gyficbimx12q5975523ps3kjzz8ys4pq-python3.14-setuptools-83.0.0/lib/python3.14/site-packages/setuptools/config/_apply_pyprojecttoml.py:61: SetuptoolsDeprecationWarning: License classifiers are deprecated.39!!4041 ********************************************************************************42 Please consider removing the following classifiers in favor of a SPDX license expression:4344 License :: OSI Approved :: Apache Software License4546 See https://packaging.python.org/en/latest/guides/writing-pyproject-toml/#license for details.47 ********************************************************************************4849!!50 dist._finalize_license_expression()51/nix/store/gyficbimx12q5975523ps3kjzz8ys4pq-python3.14-setuptools-83.0.0/lib/python3.14/site-packages/setuptools/dist.py:765: SetuptoolsDeprecationWarning: License classifiers are deprecated.52!!5354 ********************************************************************************55 Please consider removing the following classifiers in favor of a SPDX license expression:5657 License :: OSI Approved :: Apache Software License5859 See https://packaging.python.org/en/latest/guides/writing-pyproject-toml/#license for details.60 ********************************************************************************6162!!63 self._finalize_license_expression()64running egg_info65creating src/mcptoon.egg-info66writing src/mcptoon.egg-info/PKG-INFO67writing dependency_links to src/mcptoon.egg-info/dependency_links.txt68writing entry points to src/mcptoon.egg-info/entry_points.txt69writing requirements to src/mcptoon.egg-info/requires.txt70writing top-level names to src/mcptoon.egg-info/top_level.txt71writing manifest file 'src/mcptoon.egg-info/SOURCES.txt'72reading manifest file 'src/mcptoon.egg-info/SOURCES.txt'73adding license file 'LICENSE'74adding license file 'NOTICE'75writing manifest file 'src/mcptoon.egg-info/SOURCES.txt'76* Building wheel...77/nix/store/gyficbimx12q5975523ps3kjzz8ys4pq-python3.14-setuptools-83.0.0/lib/python3.14/site-packages/setuptools/config/_apply_pyprojecttoml.py:82: SetuptoolsDeprecationWarning: `project.license` as a TOML table is deprecated78!!7980 ********************************************************************************81 Please use a simple string containing a SPDX expression for `project.license`. You can also use `project.license-files`. (Both options available on setuptools>=77.0.0).8283 By 2027-Feb-18, you need to update your project and remove deprecated calls84 or your builds will no longer be supported.8586 See https://packaging.python.org/en/latest/guides/writing-pyproject-toml/#license for details.87 ********************************************************************************8889!!90 corresp(dist, value, root_dir)91/nix/store/gyficbimx12q5975523ps3kjzz8ys4pq-python3.14-setuptools-83.0.0/lib/python3.14/site-packages/setuptools/config/_apply_pyprojecttoml.py:61: SetuptoolsDeprecationWarning: License classifiers are deprecated.92!!9394 ********************************************************************************95 Please consider removing the following classifiers in favor of a SPDX license expression:9697 License :: OSI Approved :: Apache Software License9899 See https://packaging.python.org/en/latest/guides/writing-pyproject-toml/#license for details.100 ********************************************************************************101102!!103 dist._finalize_license_expression()104/nix/store/gyficbimx12q5975523ps3kjzz8ys4pq-python3.14-setuptools-83.0.0/lib/python3.14/site-packages/setuptools/dist.py:765: SetuptoolsDeprecationWarning: License classifiers are deprecated.105!!106107 ********************************************************************************108 Please consider removing the following classifiers in favor of a SPDX license expression:109110 License :: OSI Approved :: Apache Software License111112 See https://packaging.python.org/en/latest/guides/writing-pyproject-toml/#license for details.113 ********************************************************************************114115!!116 self._finalize_license_expression()117running bdist_wheel118running build119running build_py120creating build/lib/mcptoon121copying src/mcptoon/__main__.py -> build/lib/mcptoon122copying src/mcptoon/usage.py -> build/lib/mcptoon123copying src/mcptoon/errors.py -> build/lib/mcptoon124copying src/mcptoon/demo_server.py -> build/lib/mcptoon125copying src/mcptoon/sync.py -> build/lib/mcptoon126copying src/mcptoon/discover.py -> build/lib/mcptoon127copying src/mcptoon/serve.py -> build/lib/mcptoon128copying src/mcptoon/output.py -> build/lib/mcptoon129copying src/mcptoon/plugin.py -> build/lib/mcptoon130copying src/mcptoon/demo.py -> build/lib/mcptoon131copying src/mcptoon/toon_vendored.py -> build/lib/mcptoon132copying src/mcptoon/skills.py -> build/lib/mcptoon133copying src/mcptoon/client.py -> build/lib/mcptoon134copying src/mcptoon/manifest.py -> build/lib/mcptoon135copying src/mcptoon/config.py -> build/lib/mcptoon136copying src/mcptoon/__init__.py -> build/lib/mcptoon137copying src/mcptoon/installer.py -> build/lib/mcptoon138copying src/mcptoon/cache.py -> build/lib/mcptoon139copying src/mcptoon/router.py -> build/lib/mcptoon140copying src/mcptoon/bench.py -> build/lib/mcptoon141copying src/mcptoon/native_tools.py -> build/lib/mcptoon142copying src/mcptoon/watch.py -> build/lib/mcptoon143copying src/mcptoon/schema_simplifier.py -> build/lib/mcptoon144copying src/mcptoon/health.py -> build/lib/mcptoon145copying src/mcptoon/cli.py -> build/lib/mcptoon146running egg_info147writing src/mcptoon.egg-info/PKG-INFO148writing dependency_links to src/mcptoon.egg-info/dependency_links.txt149writing entry points to src/mcptoon.egg-info/entry_points.txt150writing requirements to src/mcptoon.egg-info/requires.txt151writing top-level names to src/mcptoon.egg-info/top_level.txt152reading manifest file 'src/mcptoon.egg-info/SOURCES.txt'153adding license file 'LICENSE'154adding license file 'NOTICE'155writing manifest file 'src/mcptoon.egg-info/SOURCES.txt'156installing to build/bdist.linux-x86_64/wheel157running install158running install_lib159creating build/bdist.linux-x86_64/wheel160creating build/bdist.linux-x86_64/wheel/mcptoon161copying build/lib/mcptoon/__init__.py -> build/bdist.linux-x86_64/wheel/./mcptoon162copying build/lib/mcptoon/demo_server.py -> build/bdist.linux-x86_64/wheel/./mcptoon163copying build/lib/mcptoon/config.py -> build/bdist.linux-x86_64/wheel/./mcptoon164copying build/lib/mcptoon/cli.py -> build/bdist.linux-x86_64/wheel/./mcptoon165copying build/lib/mcptoon/sync.py -> build/bdist.linux-x86_64/wheel/./mcptoon166copying build/lib/mcptoon/router.py -> build/bdist.linux-x86_64/wheel/./mcptoon167copying build/lib/mcptoon/native_tools.py -> build/bdist.linux-x86_64/wheel/./mcptoon168copying build/lib/mcptoon/serve.py -> build/bdist.linux-x86_64/wheel/./mcptoon169copying build/lib/mcptoon/health.py -> build/bdist.linux-x86_64/wheel/./mcptoon170copying build/lib/mcptoon/demo.py -> build/bdist.linux-x86_64/wheel/./mcptoon171copying build/lib/mcptoon/toon_vendored.py -> build/bdist.linux-x86_64/wheel/./mcptoon172copying build/lib/mcptoon/usage.py -> build/bdist.linux-x86_64/wheel/./mcptoon173copying build/lib/mcptoon/installer.py -> build/bdist.linux-x86_64/wheel/./mcptoon174copying build/lib/mcptoon/output.py -> build/bdist.linux-x86_64/wheel/./mcptoon175copying build/lib/mcptoon/plugin.py -> build/bdist.linux-x86_64/wheel/./mcptoon176copying build/lib/mcptoon/__main__.py -> build/bdist.linux-x86_64/wheel/./mcptoon177copying build/lib/mcptoon/schema_simplifier.py -> build/bdist.linux-x86_64/wheel/./mcptoon178copying build/lib/mcptoon/errors.py -> build/bdist.linux-x86_64/wheel/./mcptoon179copying build/lib/mcptoon/discover.py -> build/bdist.linux-x86_64/wheel/./mcptoon180copying build/lib/mcptoon/watch.py -> build/bdist.linux-x86_64/wheel/./mcptoon181copying build/lib/mcptoon/bench.py -> build/bdist.linux-x86_64/wheel/./mcptoon182copying build/lib/mcptoon/skills.py -> build/bdist.linux-x86_64/wheel/./mcptoon183copying build/lib/mcptoon/manifest.py -> build/bdist.linux-x86_64/wheel/./mcptoon184copying build/lib/mcptoon/client.py -> build/bdist.linux-x86_64/wheel/./mcptoon185copying build/lib/mcptoon/cache.py -> build/bdist.linux-x86_64/wheel/./mcptoon186running install_egg_info187Copying src/mcptoon.egg-info to build/bdist.linux-x86_64/wheel/./mcptoon-0.7.17-py3.14.egg-info188running install_scripts189creating build/bdist.linux-x86_64/wheel/mcptoon-0.7.17.dist-info/WHEEL190creating '/build/source/dist/.tmp-za7rm42m/mcptoon-0.7.17-py3-none-any.whl' and adding 'build/bdist.linux-x86_64/wheel' to it191adding 'mcptoon/__init__.py'192adding 'mcptoon/__main__.py'193adding 'mcptoon/bench.py'194adding 'mcptoon/cache.py'195adding 'mcptoon/cli.py'196adding 'mcptoon/client.py'197adding 'mcptoon/config.py'198adding 'mcptoon/demo.py'199adding 'mcptoon/demo_server.py'200adding 'mcptoon/discover.py'201adding 'mcptoon/errors.py'202adding 'mcptoon/health.py'203adding 'mcptoon/installer.py'204adding 'mcptoon/manifest.py'205adding 'mcptoon/native_tools.py'206adding 'mcptoon/output.py'207adding 'mcptoon/plugin.py'208adding 'mcptoon/router.py'209adding 'mcptoon/schema_simplifier.py'210adding 'mcptoon/serve.py'211adding 'mcptoon/skills.py'212adding 'mcptoon/sync.py'213adding 'mcptoon/toon_vendored.py'214adding 'mcptoon/usage.py'215adding 'mcptoon/watch.py'216adding 'mcptoon-0.7.17.dist-info/licenses/LICENSE'217adding 'mcptoon-0.7.17.dist-info/licenses/NOTICE'218adding 'mcptoon-0.7.17.dist-info/METADATA'219adding 'mcptoon-0.7.17.dist-info/WHEEL'220adding 'mcptoon-0.7.17.dist-info/entry_points.txt'221adding 'mcptoon-0.7.17.dist-info/top_level.txt'222adding 'mcptoon-0.7.17.dist-info/RECORD'223removing build/bdist.linux-x86_64/wheel224Successfully built mcptoon-0.7.17-py3-none-any.whl225Finished creating a wheel...226Finished executing pypaBuildPhase
pythonRuntimeDepsCheckHook
227Executing pythonRuntimeDepsCheck228Checking runtime dependencies for mcptoon-0.7.17-py3-none-any.whl229Finished executing pythonRuntimeDepsCheck
installPhase
230Executing pypaInstallPhase231Successfully installed mcptoon-0.7.17-py3-none-any.whl232Finished executing pypaInstallPhase
pythonOutputDistPhase
233Executing pythonOutputDistPhase234Finished executing pythonOutputDistPhase
fixupPhase
235shrinking RPATHs of ELF executables and libraries in /nix/store/wfil1bf753n2g832mxmwx5qcjfyk9w0v-mcptoon-0.7.17236checking for references to /build/ in /nix/store/wfil1bf753n2g832mxmwx5qcjfyk9w0v-mcptoon-0.7.17...237patching script interpreter paths in /nix/store/wfil1bf753n2g832mxmwx5qcjfyk9w0v-mcptoon-0.7.17238stripping (with command strip and flags -S -p) in /nix/store/wfil1bf753n2g832mxmwx5qcjfyk9w0v-mcptoon-0.7.17/lib /nix/store/wfil1bf753n2g832mxmwx5qcjfyk9w0v-mcptoon-0.7.17/bin239shrinking RPATHs of ELF executables and libraries in /nix/store/7nrcv55v6z2xwqjmzhlqw48yd16icds6-mcptoon-0.7.17-dist240checking for references to /build/ in /nix/store/7nrcv55v6z2xwqjmzhlqw48yd16icds6-mcptoon-0.7.17-dist...241patching script interpreter paths in /nix/store/7nrcv55v6z2xwqjmzhlqw48yd16icds6-mcptoon-0.7.17-dist242Rewriting #!/nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/bin/python3.14 to #!/nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7243wrapping `/nix/store/wfil1bf753n2g832mxmwx5qcjfyk9w0v-mcptoon-0.7.17/bin/mcptoon'...244Executing pythonRemoveTestsDir245Finished executing pythonRemoveTestsDir
installCheckPhase
246no Makefile or custom installCheckPhase, doing nothing
pythonImportsCheckPhase
247Executing pythonImportsCheckPhase248Check whether the following modules can be imported: mcptoon
pytestCheckPhase
249Executing pytestCheckPhase250pytest flags: -m pytest251============================= test session starts ==============================252platform linux -- Python 3.14.7, pytest-9.1.1, pluggy-1.6.0253rootdir: /build/source254configfile: pyproject.toml255testpaths: tests256collected 1050 items 257258tests/test_bench.py ............. [ 1%]259tests/test_cache.py .... [ 1%]260tests/test_calculator.py .......................... [ 4%]261tests/test_claude_plugin_package.py ............. [ 5%]262tests/test_cli_flags.py ........... [ 6%]263tests/test_client.py .............................. [ 9%]264tests/test_command_coverage.py .... [ 9%]265tests/test_completion.py ........ [ 10%]266tests/test_config.py ........ [ 11%]267tests/test_dead_server_diagnostics.py ... [ 11%]268tests/test_demo.py ..................... [ 13%]269tests/test_demo_dead_package.py ........ [ 14%]270tests/test_demo_server.py .............................................. [ 18%]271..... [ 19%]272tests/test_discover.py ................................ [ 22%]273tests/test_doctor_star_hint.py ..... [ 22%]274tests/test_envelope.py ........ [ 23%]275tests/test_fallback_json.py ...... [ 23%]276tests/test_footprint_claims.py ............ [ 25%]277tests/test_gemini_manifest.py ...... [ 25%]278tests/test_health.py ............. [ 26%]279tests/test_help_shortcircuit.py ......... [ 27%]280tests/test_llms_txt.py ...... [ 28%]281tests/test_native_tools.py ........................... [ 30%]282tests/test_output.py ................................................... [ 35%]283........................................................................ [ 42%]284................ [ 44%]285tests/test_plugin_install.py .......... [ 45%]286tests/test_plugin_scan.py ............................... [ 48%]287tests/test_policy_overrides.py ................ [ 49%]288tests/test_readme_links.py ... [ 49%]289tests/test_registry_sync.py ............ [ 50%]290tests/test_router.py ............................................ [ 55%]291tests/test_search.py ................................ [ 58%]292tests/test_serve.py .................................................... [ 63%]293... [ 63%]294tests/test_serve_perf.py .......... [ 64%]295tests/test_serve_prompts.py ........ [ 65%]296tests/test_skills.py ................................................... [ 70%]297................................FFF....... [ 74%]298tests/test_stats_toggle.py ......... [ 74%]299tests/test_sync.py ................ [ 76%]300tests/test_tier_claims_consistent.py .... [ 76%]301tests/test_toml_config.py .......................... [ 79%]302tests/test_toon_cross_validate.py ............................... [ 82%]303tests/test_v02_features.py .................................... [ 85%]304tests/test_v04_features.py ................ [ 87%]305tests/test_v05_features.py ...................... [ 89%]306tests/test_v072_delight.py ..........s.. [ 90%]307tests/test_v073_http_security.py .............................. [ 93%]308tests/test_v074_stdio_timeout.py ............ [ 94%]309tests/test_v076_stateless_serve.py ................... [ 96%]310tests/test_v07_spec2026.py ..................... [ 98%]311tests/test_watch.py .................. [100%]312313=================================== FAILURES ===================================314_____ TombstoneTests.test_removal_uses_the_shared_graveyard_when_given_one _____315316self = <tests.test_skills.TombstoneTests testMethod=test_removal_uses_the_shared_graveyard_when_given_one>317318 def setUp(self):319 self.tmp = tempfile.TemporaryDirectory()320 self.base = Path(self.tmp.name)321 self.repo = self.base / "repo"322 (self.repo / "skills" / "alpha").mkdir(parents=True)323 (self.repo / "skills" / "alpha" / "SKILL.md").write_text(324 "---\nname: alpha\ndescription: d\n---\n", encoding="utf-8")325 (self.repo / "unrelated.txt").write_text("keep me\n", encoding="utf-8")326> self._git("init")327328tests/test_skills.py:940: 329_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 330tests/test_skills.py:951: in _git331 return subprocess.run(["git", *args], cwd=str(self.repo),332/nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/subprocess.py:555: in run333 with Popen(*popenargs, **kwargs) as process:334 ^^^^^^^^^^^^^^^^^^^^^^^^^^^335/nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/subprocess.py:1039: in __init__336 self._execute_child(args, executable, preexec_fn, close_fds,337_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 338339self = <Popen: returncode: 255 args: ['git', 'init']>, args = ['git', 'init']340executable = b'git', preexec_fn = None, close_fds = True, pass_fds = ()341cwd = '/build/tmpqv_q5v69/repo', env = None, startupinfo = None342creationflags = 0, shell = False, p2cread = -1, p2cwrite = -1, c2pread = 11343c2pwrite = 12, errread = 13, errwrite = 14, restore_signals = True, gid = None344gids = None, uid = None, umask = -1, start_new_session = False345process_group = -1346347 def _execute_child(self, args, executable, preexec_fn, close_fds,348 pass_fds, cwd, env,349 startupinfo, creationflags, shell,350 p2cread, p2cwrite,351 c2pread, c2pwrite,352 errread, errwrite,353 restore_signals,354 gid, gids, uid, umask,355 start_new_session, process_group):356 """Execute program (POSIX version)"""357 358 if isinstance(args, (str, bytes)):359 args = [args]360 elif isinstance(args, os.PathLike):361 if shell:362 raise TypeError('path-like args is not allowed when '363 'shell is true')364 args = [args]365 else:366 args = list(args)367 368 if shell:369 # On Android the default shell is at '/system/bin/sh'.370 unix_shell = ('/system/bin/sh' if371 hasattr(sys, 'getandroidapilevel') else '/nix/store/svx59425zxp552p2b8gm11qj5r09b56i-bash-5.3p15/bin/sh')372 args = [unix_shell, "-c"] + args373 if executable:374 args[0] = executable375 376 if executable is None:377 executable = args[0]378 379 sys.audit("subprocess.Popen", executable, args, cwd, env)380 381 if (_USE_POSIX_SPAWN382 and os.path.dirname(executable)383 and preexec_fn is None384 and (not close_fds or _HAVE_POSIX_SPAWN_CLOSEFROM)385 and not pass_fds386 and cwd is None387 and (p2cread == -1 or p2cread > 2)388 and (c2pwrite == -1 or c2pwrite > 2)389 and (errwrite == -1 or errwrite > 2)390 and not start_new_session391 and process_group == -1392 and gid is None393 and gids is None394 and uid is None395 and umask < 0):396 self._posix_spawn(args, executable, env, restore_signals, close_fds,397 p2cread, p2cwrite,398 c2pread, c2pwrite,399 errread, errwrite)400 return401 402 orig_executable = executable403 404 # For transferring possible exec failure from child to parent.405 # Data format: "exception name:hex errno:description"406 # Pickle is not used; it is complex and involves memory allocation.407 errpipe_read, errpipe_write = os.pipe()408 # errpipe_write must not be in the standard io 0, 1, or 2 fd range.409 low_fds_to_close = []410 while errpipe_write < 3:411 low_fds_to_close.append(errpipe_write)412 errpipe_write = os.dup(errpipe_write)413 for low_fd in low_fds_to_close:414 os.close(low_fd)415 try:416 try:417 # We must avoid complex work that could involve418 # malloc or free in the child process to avoid419 # potential deadlocks, thus we do all this here.420 # and pass it to fork_exec()421 422 if env is not None:423 env_list = []424 for k, v in env.items():425 k = os.fsencode(k)426 if b'=' in k:427 raise ValueError("illegal environment variable name")428 env_list.append(k + b'=' + os.fsencode(v))429 else:430 env_list = None # Use execv instead of execve.431 executable = os.fsencode(executable)432 if os.path.dirname(executable):433 executable_list = (executable,)434 else:435 # This matches the behavior of os._execvpe().436 executable_list = tuple(437 os.path.join(os.fsencode(dir), executable)438 for dir in os.get_exec_path(env))439 fds_to_keep = set(pass_fds)440 fds_to_keep.add(errpipe_write)441 self.pid = _fork_exec(442 args, executable_list,443 close_fds, tuple(sorted(map(int, fds_to_keep))),444 cwd, env_list,445 p2cread, p2cwrite, c2pread, c2pwrite,446 errread, errwrite,447 errpipe_read, errpipe_write,448 restore_signals, start_new_session,449 process_group, gid, gids, uid, umask,450 preexec_fn)451 self._child_created = True452 finally:453 # be sure the FD is closed no matter what454 os.close(errpipe_write)455 456 self._close_pipe_fds(p2cread, p2cwrite,457 c2pread, c2pwrite,458 errread, errwrite)459 460 # Wait for exec to fail or succeed; possibly raising an461 # exception (limited in size)462 errpipe_data = bytearray()463 while True:464 part = os.read(errpipe_read, 50000)465 errpipe_data += part466 if not part or len(errpipe_data) > 50000:467 break468 finally:469 # be sure the FD is closed no matter what470 os.close(errpipe_read)471 472 if errpipe_data:473 try:474 pid, sts = os.waitpid(self.pid, 0)475 if pid == self.pid:476 self._handle_exitstatus(sts)477 else:478 self.returncode = sys.maxsize479 except ChildProcessError:480 pass481 482 try:483 exception_name, hex_errno, err_msg = (484 errpipe_data.split(b':', 2))485 # The encoding here should match the encoding486 # written in by the subprocess implementations487 # like _posixsubprocess488 err_msg = err_msg.decode()489 except ValueError:490 exception_name = b'SubprocessError'491 hex_errno = b'0'492 err_msg = 'Bad exception data from child: {!r}'.format(493 bytes(errpipe_data))494 child_exception_type = getattr(495 builtins, exception_name.decode('ascii'),496 SubprocessError)497 if issubclass(child_exception_type, OSError) and hex_errno:498 errno_num = int(hex_errno, 16)499 if err_msg == "noexec:chdir":500 err_msg = ""501 # The error must be from chdir(cwd).502 err_filename = cwd503 elif err_msg == "noexec":504 err_msg = ""505 err_filename = None506 else:507 err_filename = orig_executable508 if errno_num != 0:509 err_msg = os.strerror(errno_num)510 if err_filename is not None:511> raise child_exception_type(errno_num, err_msg, err_filename)512E FileNotFoundError: [Errno 2] No such file or directory: 'git'513514/nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/subprocess.py:1990: FileNotFoundError515__________ TombstoneTests.test_removal_without_a_repo_still_archives ___________516517self = <tests.test_skills.TombstoneTests testMethod=test_removal_without_a_repo_still_archives>518519 def setUp(self):520 self.tmp = tempfile.TemporaryDirectory()521 self.base = Path(self.tmp.name)522 self.repo = self.base / "repo"523 (self.repo / "skills" / "alpha").mkdir(parents=True)524 (self.repo / "skills" / "alpha" / "SKILL.md").write_text(525 "---\nname: alpha\ndescription: d\n---\n", encoding="utf-8")526 (self.repo / "unrelated.txt").write_text("keep me\n", encoding="utf-8")527> self._git("init")528529tests/test_skills.py:940: 530_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 531tests/test_skills.py:951: in _git532 return subprocess.run(["git", *args], cwd=str(self.repo),533/nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/subprocess.py:555: in run534 with Popen(*popenargs, **kwargs) as process:535 ^^^^^^^^^^^^^^^^^^^^^^^^^^^536/nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/subprocess.py:1039: in __init__537 self._execute_child(args, executable, preexec_fn, close_fds,538_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 539540self = <Popen: returncode: 255 args: ['git', 'init']>, args = ['git', 'init']541executable = b'git', preexec_fn = None, close_fds = True, pass_fds = ()542cwd = '/build/tmp1742pfpt/repo', env = None, startupinfo = None543creationflags = 0, shell = False, p2cread = -1, p2cwrite = -1, c2pread = 11544c2pwrite = 12, errread = 13, errwrite = 14, restore_signals = True, gid = None545gids = None, uid = None, umask = -1, start_new_session = False546process_group = -1547548 def _execute_child(self, args, executable, preexec_fn, close_fds,549 pass_fds, cwd, env,550 startupinfo, creationflags, shell,551 p2cread, p2cwrite,552 c2pread, c2pwrite,553 errread, errwrite,554 restore_signals,555 gid, gids, uid, umask,556 start_new_session, process_group):557 """Execute program (POSIX version)"""558 559 if isinstance(args, (str, bytes)):560 args = [args]561 elif isinstance(args, os.PathLike):562 if shell:563 raise TypeError('path-like args is not allowed when '564 'shell is true')565 args = [args]566 else:567 args = list(args)568 569 if shell:570 # On Android the default shell is at '/system/bin/sh'.571 unix_shell = ('/system/bin/sh' if572 hasattr(sys, 'getandroidapilevel') else '/nix/store/svx59425zxp552p2b8gm11qj5r09b56i-bash-5.3p15/bin/sh')573 args = [unix_shell, "-c"] + args574 if executable:575 args[0] = executable576 577 if executable is None:578 executable = args[0]579 580 sys.audit("subprocess.Popen", executable, args, cwd, env)581 582 if (_USE_POSIX_SPAWN583 and os.path.dirname(executable)584 and preexec_fn is None585 and (not close_fds or _HAVE_POSIX_SPAWN_CLOSEFROM)586 and not pass_fds587 and cwd is None588 and (p2cread == -1 or p2cread > 2)589 and (c2pwrite == -1 or c2pwrite > 2)590 and (errwrite == -1 or errwrite > 2)591 and not start_new_session592 and process_group == -1593 and gid is None594 and gids is None595 and uid is None596 and umask < 0):597 self._posix_spawn(args, executable, env, restore_signals, close_fds,598 p2cread, p2cwrite,599 c2pread, c2pwrite,600 errread, errwrite)601 return602 603 orig_executable = executable604 605 # For transferring possible exec failure from child to parent.606 # Data format: "exception name:hex errno:description"607 # Pickle is not used; it is complex and involves memory allocation.608 errpipe_read, errpipe_write = os.pipe()609 # errpipe_write must not be in the standard io 0, 1, or 2 fd range.610 low_fds_to_close = []611 while errpipe_write < 3:612 low_fds_to_close.append(errpipe_write)613 errpipe_write = os.dup(errpipe_write)614 for low_fd in low_fds_to_close:615 os.close(low_fd)616 try:617 try:618 # We must avoid complex work that could involve619 # malloc or free in the child process to avoid620 # potential deadlocks, thus we do all this here.621 # and pass it to fork_exec()622 623 if env is not None:624 env_list = []625 for k, v in env.items():626 k = os.fsencode(k)627 if b'=' in k:628 raise ValueError("illegal environment variable name")629 env_list.append(k + b'=' + os.fsencode(v))630 else:631 env_list = None # Use execv instead of execve.632 executable = os.fsencode(executable)633 if os.path.dirname(executable):634 executable_list = (executable,)635 else:636 # This matches the behavior of os._execvpe().637 executable_list = tuple(638 os.path.join(os.fsencode(dir), executable)639 for dir in os.get_exec_path(env))640 fds_to_keep = set(pass_fds)641 fds_to_keep.add(errpipe_write)642 self.pid = _fork_exec(643 args, executable_list,644 close_fds, tuple(sorted(map(int, fds_to_keep))),645 cwd, env_list,646 p2cread, p2cwrite, c2pread, c2pwrite,647 errread, errwrite,648 errpipe_read, errpipe_write,649 restore_signals, start_new_session,650 process_group, gid, gids, uid, umask,651 preexec_fn)652 self._child_created = True653 finally:654 # be sure the FD is closed no matter what655 os.close(errpipe_write)656 657 self._close_pipe_fds(p2cread, p2cwrite,658 c2pread, c2pwrite,659 errread, errwrite)660 661 # Wait for exec to fail or succeed; possibly raising an662 # exception (limited in size)663 errpipe_data = bytearray()664 while True:665 part = os.read(errpipe_read, 50000)666 errpipe_data += part667 if not part or len(errpipe_data) > 50000:668 break669 finally:670 # be sure the FD is closed no matter what671 os.close(errpipe_read)672 673 if errpipe_data:674 try:675 pid, sts = os.waitpid(self.pid, 0)676 if pid == self.pid:677 self._handle_exitstatus(sts)678 else:679 self.returncode = sys.maxsize680 except ChildProcessError:681 pass682 683 try:684 exception_name, hex_errno, err_msg = (685 errpipe_data.split(b':', 2))686 # The encoding here should match the encoding687 # written in by the subprocess implementations688 # like _posixsubprocess689 err_msg = err_msg.decode()690 except ValueError:691 exception_name = b'SubprocessError'692 hex_errno = b'0'693 err_msg = 'Bad exception data from child: {!r}'.format(694 bytes(errpipe_data))695 child_exception_type = getattr(696 builtins, exception_name.decode('ascii'),697 SubprocessError)698 if issubclass(child_exception_type, OSError) and hex_errno:699 errno_num = int(hex_errno, 16)700 if err_msg == "noexec:chdir":701 err_msg = ""702 # The error must be from chdir(cwd).703 err_filename = cwd704 elif err_msg == "noexec":705 err_msg = ""706 err_filename = None707 else:708 err_filename = orig_executable709 if errno_num != 0:710 err_msg = os.strerror(errno_num)711 if err_filename is not None:712> raise child_exception_type(errno_num, err_msg, err_filename)713E FileNotFoundError: [Errno 2] No such file or directory: 'git'714715/nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/subprocess.py:1990: FileNotFoundError716_________ TombstoneTests.test_tombstone_commits_only_the_removed_path __________717718self = <tests.test_skills.TombstoneTests testMethod=test_tombstone_commits_only_the_removed_path>719720 def setUp(self):721 self.tmp = tempfile.TemporaryDirectory()722 self.base = Path(self.tmp.name)723 self.repo = self.base / "repo"724 (self.repo / "skills" / "alpha").mkdir(parents=True)725 (self.repo / "skills" / "alpha" / "SKILL.md").write_text(726 "---\nname: alpha\ndescription: d\n---\n", encoding="utf-8")727 (self.repo / "unrelated.txt").write_text("keep me\n", encoding="utf-8")728> self._git("init")729730tests/test_skills.py:940: 731_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 732tests/test_skills.py:951: in _git733 return subprocess.run(["git", *args], cwd=str(self.repo),734/nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/subprocess.py:555: in run735 with Popen(*popenargs, **kwargs) as process:736 ^^^^^^^^^^^^^^^^^^^^^^^^^^^737/nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/subprocess.py:1039: in __init__738 self._execute_child(args, executable, preexec_fn, close_fds,739_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 740741self = <Popen: returncode: 255 args: ['git', 'init']>, args = ['git', 'init']742executable = b'git', preexec_fn = None, close_fds = True, pass_fds = ()743cwd = '/build/tmp2ty_d45n/repo', env = None, startupinfo = None744creationflags = 0, shell = False, p2cread = -1, p2cwrite = -1, c2pread = 11745c2pwrite = 12, errread = 13, errwrite = 14, restore_signals = True, gid = None746gids = None, uid = None, umask = -1, start_new_session = False747process_group = -1748749 def _execute_child(self, args, executable, preexec_fn, close_fds,750 pass_fds, cwd, env,751 startupinfo, creationflags, shell,752 p2cread, p2cwrite,753 c2pread, c2pwrite,754 errread, errwrite,755 restore_signals,756 gid, gids, uid, umask,757 start_new_session, process_group):758 """Execute program (POSIX version)"""759 760 if isinstance(args, (str, bytes)):761 args = [args]762 elif isinstance(args, os.PathLike):763 if shell:764 raise TypeError('path-like args is not allowed when '765 'shell is true')766 args = [args]767 else:768 args = list(args)769 770 if shell:771 # On Android the default shell is at '/system/bin/sh'.772 unix_shell = ('/system/bin/sh' if773 hasattr(sys, 'getandroidapilevel') else '/nix/store/svx59425zxp552p2b8gm11qj5r09b56i-bash-5.3p15/bin/sh')774 args = [unix_shell, "-c"] + args775 if executable:776 args[0] = executable777 778 if executable is None:779 executable = args[0]780 781 sys.audit("subprocess.Popen", executable, args, cwd, env)782 783 if (_USE_POSIX_SPAWN784 and os.path.dirname(executable)785 and preexec_fn is None786 and (not close_fds or _HAVE_POSIX_SPAWN_CLOSEFROM)787 and not pass_fds788 and cwd is None789 and (p2cread == -1 or p2cread > 2)790 and (c2pwrite == -1 or c2pwrite > 2)791 and (errwrite == -1 or errwrite > 2)792 and not start_new_session793 and process_group == -1794 and gid is None795 and gids is None796 and uid is None797 and umask < 0):798 self._posix_spawn(args, executable, env, restore_signals, close_fds,799 p2cread, p2cwrite,800 c2pread, c2pwrite,801 errread, errwrite)802 return803 804 orig_executable = executable805 806 # For transferring possible exec failure from child to parent.807 # Data format: "exception name:hex errno:description"808 # Pickle is not used; it is complex and involves memory allocation.809 errpipe_read, errpipe_write = os.pipe()810 # errpipe_write must not be in the standard io 0, 1, or 2 fd range.811 low_fds_to_close = []812 while errpipe_write < 3:813 low_fds_to_close.append(errpipe_write)814 errpipe_write = os.dup(errpipe_write)815 for low_fd in low_fds_to_close:816 os.close(low_fd)817 try:818 try:819 # We must avoid complex work that could involve820 # malloc or free in the child process to avoid821 # potential deadlocks, thus we do all this here.822 # and pass it to fork_exec()823 824 if env is not None:825 env_list = []826 for k, v in env.items():827 k = os.fsencode(k)828 if b'=' in k:829 raise ValueError("illegal environment variable name")830 env_list.append(k + b'=' + os.fsencode(v))831 else:832 env_list = None # Use execv instead of execve.833 executable = os.fsencode(executable)834 if os.path.dirname(executable):835 executable_list = (executable,)836 else:837 # This matches the behavior of os._execvpe().838 executable_list = tuple(839 os.path.join(os.fsencode(dir), executable)840 for dir in os.get_exec_path(env))841 fds_to_keep = set(pass_fds)842 fds_to_keep.add(errpipe_write)843 self.pid = _fork_exec(844 args, executable_list,845 close_fds, tuple(sorted(map(int, fds_to_keep))),846 cwd, env_list,847 p2cread, p2cwrite, c2pread, c2pwrite,848 errread, errwrite,849 errpipe_read, errpipe_write,850 restore_signals, start_new_session,851 process_group, gid, gids, uid, umask,852 preexec_fn)853 self._child_created = True854 finally:855 # be sure the FD is closed no matter what856 os.close(errpipe_write)857 858 self._close_pipe_fds(p2cread, p2cwrite,859 c2pread, c2pwrite,860 errread, errwrite)861 862 # Wait for exec to fail or succeed; possibly raising an863 # exception (limited in size)864 errpipe_data = bytearray()865 while True:866 part = os.read(errpipe_read, 50000)867 errpipe_data += part868 if not part or len(errpipe_data) > 50000:869 break870 finally:871 # be sure the FD is closed no matter what872 os.close(errpipe_read)873 874 if errpipe_data:875 try:876 pid, sts = os.waitpid(self.pid, 0)877 if pid == self.pid:878 self._handle_exitstatus(sts)879 else:880 self.returncode = sys.maxsize881 except ChildProcessError:882 pass883 884 try:885 exception_name, hex_errno, err_msg = (886 errpipe_data.split(b':', 2))887 # The encoding here should match the encoding888 # written in by the subprocess implementations889 # like _posixsubprocess890 err_msg = err_msg.decode()891 except ValueError:892 exception_name = b'SubprocessError'893 hex_errno = b'0'894 err_msg = 'Bad exception data from child: {!r}'.format(895 bytes(errpipe_data))896 child_exception_type = getattr(897 builtins, exception_name.decode('ascii'),898 SubprocessError)899 if issubclass(child_exception_type, OSError) and hex_errno:900 errno_num = int(hex_errno, 16)901 if err_msg == "noexec:chdir":902 err_msg = ""903 # The error must be from chdir(cwd).904 err_filename = cwd905 elif err_msg == "noexec":906 err_msg = ""907 err_filename = None908 else:909 err_filename = orig_executable910 if errno_num != 0:911 err_msg = os.strerror(errno_num)912 if err_filename is not None:913> raise child_exception_type(errno_num, err_msg, err_filename)914E FileNotFoundError: [Errno 2] No such file or directory: 'git'915916/nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/subprocess.py:1990: FileNotFoundError917=========================== short test summary info ============================918FAILED tests/test_skills.py::TombstoneTests::test_removal_uses_the_shared_graveyard_when_given_one - FileNotFoundError: [Errno 2] No such file or directory: 'git'919FAILED tests/test_skills.py::TombstoneTests::test_removal_without_a_repo_still_archives - FileNotFoundError: [Errno 2] No such file or directory: 'git'920FAILED tests/test_skills.py::TombstoneTests::test_tombstone_commits_only_the_removed_path - FileNotFoundError: [Errno 2] No such file or directory: 'git'921============= 3 failed, 1046 passed, 1 skipped in 62.70s (0:01:02) =============