Kotti Next:Kotti CMS的精神继承者,调试代码(使用WorkBuddy AI自动编程)前端未调通,重新生成一个更加轻型的前端

Kotti Next:Kotti CMS的精神继承者,调试代码(使用WorkBuddy AI自动编程)前端未调通,重新生成一个更加轻型的前端

前面使用WorkBuddy AI自动编程写了Kotti Next这个项目:https://blog.ZEEKLOG.net/skywalk8163/article/details/159729287

repo:https://gitcode.com/skywalk163/kottinext

现在进行代码测试。

先上结论:后端调调通了,前端未调通,准备重新生成一个更加轻型的前端

先安装服务器

### Installation ```bash # Create virtual environment python -m venv .venv source .venv/bin/activate # Linux/Mac .venv\Scripts\activate # Windows # Install dependencies pip install -e ".[dev]" ``` ### Initialize Database ```bash kotti-next init ``` This will: - Create the database tables - Create an admin user (username: `admin`, password: `admin`) ### Run Development Server ```bash kotti-next dev ``` Or with auto-reload: ```bash kotti-next dev --reload ```

对于我的系统,代码在这个目录:c:\Users\Admin\WorkBuddy\20260330150804\backend>

发现没有数据库初始化这条命令啊

(.venv) c:\Users\Admin\WorkBuddy\20260330150804\backend>kotti-next init Usage: kotti-next [OPTIONS] COMMAND [ARGS]... Try 'kotti-next --help' for help. Error: No such command 'init'.

原来是这条命令:

kotti-next db init

执行后报错:

(.venv) c:\Users\Admin\WorkBuddy\20260330150804\backend>kotti-next db init → Creating database tables… Traceback (most recent call last): File "G:\workbuddy\.venv\Lib\site-packages\sqlalchemy\orm\clsregistry.py", line 516, in _resolve_name rval = d[token] ~^^^^^^^ File "G:\workbuddy\.venv\Lib\site-packages\sqlalchemy\util\_collections.py", line 340, in __missing__ self[key] = val = self.creator(key) ^^^^^^^^^^^^^^^^^ File "G:\workbuddy\.venv\Lib\site-packages\sqlalchemy\orm\clsregistry.py", line 484, in _access_cls return self.fallback[key] ~~~~~~~~~~~~~^^^^^ KeyError: 'Webhook' The above exception was the direct cause of the following exception: Traceback (most recent call last): File "<frozen runpy>", line 198, in _run_module_as_main File "<frozen runpy>", line 88, in _run_code File "G:\workbuddy\.venv\Scripts\kotti-next.exe\__main__.py", line 5, in <module> File "G:\workbuddy\.venv\Lib\site-packages\click\core.py", line 1485, in __call__ return self.main(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^ File "G:\workbuddy\.venv\Lib\site-packages\click\core.py", line 1406, in main rv = self.invoke(ctx) ^^^^^^^^^^^^^^^^ File "G:\workbuddy\.venv\Lib\site-packages\click\core.py", line 1873, in invoke return _process_result(sub_ctx.command.invoke(sub_ctx)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "G:\workbuddy\.venv\Lib\site-packages\click\core.py", line 1873, in invoke return _process_result(sub_ctx.command.invoke(sub_ctx)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "G:\workbuddy\.venv\Lib\site-packages\click\core.py", line 1269, in invoke return ctx.invoke(self.callback, **ctx.params) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "G:\workbuddy\.venv\Lib\site-packages\click\core.py", line 824, in invoke return callback(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\Admin\WorkBuddy\20260330150804\backend\kotti_next\cli\db.py", line 99, in init asyncio.run(_run()) File "E:\py312\Lib\asyncio\runners.py", line 195, in run return runner.run(main) ^^^^^^^^^^^^^^^^ File "E:\py312\Lib\asyncio\runners.py", line 118, in run return self._loop.run_until_complete(task) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "E:\py312\Lib\asyncio\base_events.py", line 691, in run_until_complete return future.result() ^^^^^^^^^^^^^^^ File "C:\Users\Admin\WorkBuddy\20260330150804\backend\kotti_next\cli\db.py", line 72, in _run await session.execute( File "G:\workbuddy\.venv\Lib\site-packages\sqlalchemy\ext\asyncio\session.py", line 449, in execute result = await greenlet_spawn( ^^^^^^^^^^^^^^^^^^^^^ File "G:\workbuddy\.venv\Lib\site-packages\sqlalchemy\util\_concurrency_py3k.py", line 203, in greenlet_spawn result = context.switch(value) ^^^^^^^^^^^^^^^^^^^^^ File "G:\workbuddy\.venv\Lib\site-packages\sqlalchemy\orm\session.py", line 2351, in execute return self._execute_internal( ^^^^^^^^^^^^^^^^^^^^^^^ File "G:\workbuddy\.venv\Lib\site-packages\sqlalchemy\orm\session.py", line 2249, in _execute_internal result: Result[Any] = compile_state_cls.orm_execute_statement( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "G:\workbuddy\.venv\Lib\site-packages\sqlalchemy\orm\context.py", line 306, in orm_execute_statement result = conn.execute( ^^^^^^^^^^^^^ File "G:\workbuddy\.venv\Lib\site-packages\sqlalchemy\engine\base.py", line 1419, in execute return meth( ^^^^^ File "G:\workbuddy\.venv\Lib\site-packages\sqlalchemy\sql\elements.py", line 527, in _execute_on_connection return connection._execute_clauseelement( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "G:\workbuddy\.venv\Lib\site-packages\sqlalchemy\engine\base.py", line 1633, in _execute_clauseelement compiled_sql, extracted_params, cache_hit = elem._compile_w_cache( ^^^^^^^^^^^^^^^^^^^^^^ File "G:\workbuddy\.venv\Lib\site-packages\sqlalchemy\sql\elements.py", line 716, in _compile_w_cache compiled_sql = self._compiler( ^^^^^^^^^^^^^^^ File "G:\workbuddy\.venv\Lib\site-packages\sqlalchemy\sql\elements.py", line 324, in _compiler return dialect.statement_compiler(dialect, self, **kw) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "G:\workbuddy\.venv\Lib\site-packages\sqlalchemy\sql\compiler.py", line 1461, in __init__ Compiled.__init__(self, dialect, statement, **kwargs) File "G:\workbuddy\.venv\Lib\site-packages\sqlalchemy\sql\compiler.py", line 901, in __init__ self.string = self.process(self.statement, **compile_kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "G:\workbuddy\.venv\Lib\site-packages\sqlalchemy\sql\compiler.py", line 947, in process return obj._compiler_dispatch(self, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "G:\workbuddy\.venv\Lib\site-packages\sqlalchemy\sql\visitors.py", line 138, in _compiler_dispatch return meth(self, **kw) # type: ignore # noqa: E501 ^^^^^^^^^^^^^^^^ File "G:\workbuddy\.venv\Lib\site-packages\sqlalchemy\sql\compiler.py", line 4807, in visit_select compile_state = select_stmt._compile_state_factory( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "G:\workbuddy\.venv\Lib\site-packages\sqlalchemy\sql\base.py", line 775, in create_for_statement return klass.create_for_statement(statement, compiler, **kw) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "G:\workbuddy\.venv\Lib\site-packages\sqlalchemy\orm\context.py", line 447, in create_for_statement return cls._create_orm_context( ^^^^^^^^^^^^^^^^^^^^^^^^ File "G:\workbuddy\.venv\Lib\site-packages\sqlalchemy\orm\context.py", line 1175, in _create_orm_context _QueryEntity.to_compile_state( File "G:\workbuddy\.venv\Lib\site-packages\sqlalchemy\orm\context.py", line 2628, in to_compile_state _MapperEntity( File "G:\workbuddy\.venv\Lib\site-packages\sqlalchemy\orm\context.py", line 2708, in __init__ entity._post_inspect File "G:\workbuddy\.venv\Lib\site-packages\sqlalchemy\util\langhelpers.py", line 1235, in __get__ obj.__dict__[self.__name__] = result = self.fget(obj) ^^^^^^^^^^^^^^ File "G:\workbuddy\.venv\Lib\site-packages\sqlalchemy\orm\mapper.py", line 2733, in _post_inspect self._check_configure() File "G:\workbuddy\.venv\Lib\site-packages\sqlalchemy\orm\mapper.py", line 2410, in _check_configure _configure_registries({self.registry}, cascade=True) File "G:\workbuddy\.venv\Lib\site-packages\sqlalchemy\orm\mapper.py", line 4227, in _configure_registries _do_configure_registries(registries, cascade) File "G:\workbuddy\.venv\Lib\site-packages\sqlalchemy\orm\mapper.py", line 4268, in _do_configure_registries mapper._post_configure_properties() File "G:\workbuddy\.venv\Lib\site-packages\sqlalchemy\orm\mapper.py", line 2427, in _post_configure_properties prop.init() File "G:\workbuddy\.venv\Lib\site-packages\sqlalchemy\orm\interfaces.py", line 595, in init self.do_init() File "G:\workbuddy\.venv\Lib\site-packages\sqlalchemy\orm\relationships.py", line 1655, in do_init self._setup_entity() File "G:\workbuddy\.venv\Lib\site-packages\sqlalchemy\orm\relationships.py", line 1865, in _setup_entity self._clsregistry_resolve_name(argument)(), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "G:\workbuddy\.venv\Lib\site-packages\sqlalchemy\orm\clsregistry.py", line 520, in _resolve_name self._raise_for_name(name, err) File "G:\workbuddy\.venv\Lib\site-packages\sqlalchemy\orm\clsregistry.py", line 501, in _raise_for_name raise exc.InvalidRequestError( sqlalchemy.exc.InvalidRequestError: When initializing mapper Mapper[Principal(principals)], expression 'Webhook' failed to locate a name ('Webhook'). If this is a class name, consider adding this relationship() to the <class 'kotti_next.models.principal.Principal'> class after both dependent classes have been defined.

AI去搞定

搞定之后,发现数据库这块还是有问题,让AI来搞定吧:

让AI解决数据库方面的问题

你的测试包含了数据库这块吗? 怎么还有一些问题。比如:  File "C:\Users\Admin\WorkBuddy\20260330150804\backend\kotti_next\cli\db.py", line 96, in _run
    await close_db()
          ^^^^^^^^
UnboundLocalError: cannot access local variable 'close_db' where it is not associated with a value

请添加数据库的测试部分,尽量覆盖全面。并解决测试中碰到的相关问题。

AI搞定,数据库初始化问题解决

(.venv) c:\Users\Admin\WorkBuddy\20260330150804\backend>kotti-next db init → Creating database tables… Admin user already exists, skipping ✓ Initialisation complete

前端测试报错

在前端目录,执行命令

node node_modules/vitest/vitest.mjs run --reporter=verbose
c:\Users\Admin\WorkBuddy\20260330150804\frontend>node node_modules/vitest/vitest.mjs run --reporter=verbose RUN v4.1.2 c:/Users/Admin/WorkBuddy/20260330150804/frontend ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ Failed Suites 6 ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ FAIL tests/api/auth.test.ts [ tests/api/auth.test.ts ] TypeError: Cannot read properties of undefined (reading 'config') ❯ tests/api/auth.test.ts:22:1 ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/6]⎯ FAIL tests/api/client.test.ts [ tests/api/client.test.ts ] TypeError: Cannot read properties of undefined (reading 'config') ❯ tests/api/client.test.ts:55:1 ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[2/6]⎯ FAIL tests/api/nodes.test.ts [ tests/api/nodes.test.ts ] TypeError: Cannot read properties of undefined (reading 'config') ❯ tests/api/nodes.test.ts:28:1 ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[3/6]⎯ FAIL tests/stores/auth.test.ts [ tests/stores/auth.test.ts ] FAIL tests/stores/content.test.ts [ tests/stores/content.test.ts ] Error: Cannot find module './use-config' Require stack: - c:\Users\Admin\WorkBuddy\20260330150804\frontend\node_modules\naive-ui\lib\_mixins\index.js - c:\Users\Admin\WorkBuddy\20260330150804\frontend\node_modules\naive-ui\lib\affix\src\Affix.js - c:\Users\Admin\WorkBuddy\20260330150804\frontend\node_modules\naive-ui\lib\affix\index.js ❯ Object.<anonymous> node_modules/naive-ui/lib/_mixins/index.js:7:20 ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ Serialized Error: { code: 'MODULE_NOT_FOUND', requireStack: [ 'c:\Users\Admin\WorkBuddy\20260330150804\frontend\node_modules\naive-ui\lib\_mixins\index.js', 'c:\Users\Admin\WorkBuddy\20260330150804\frontend\node_modules\naive-ui\lib\affix\src\Affix.js', 'c:\Users\Admin\WorkBuddy\20260330150804\frontend\node_modules\naive-ui\lib\affix\index.js' ] } ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[4/6]⎯ FAIL tests/stores/ui.test.ts [ tests/stores/ui.test.ts ] TypeError: Cannot read properties of undefined (reading 'config') ❯ tests/stores/ui.test.ts:5:1 ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[5/6]⎯ Test Files 6 failed (6) Tests no tests Start at 22:37:15 Duration 6.72s (transform 669ms, setup 1.86s, import 0ms, tests 0ms, environment 27.07s)

AI说搞定了,问题是我测试下来还是报错

升级naive-ui到最新版试试

npm install naive-ui@latest 

降级到2.38.1试试

npm install [email protected]

奇了怪了,版本就是不动,后来用npm ls naive-ui,发现版本是变了

c:\Users\Admin\WorkBuddy\20260330150804\frontend>npm view naive-ui version 2.44.1 c:\Users\Admin\WorkBuddy\20260330150804\frontend>npm uninstall naive-ui removed 21 packages in 12s 168 packages are looking for funding run `npm fund` for details c:\Users\Admin\WorkBuddy\20260330150804\frontend>npm install [email protected] added 21 packages in 31s 169 packages are looking for funding run `npm fund` for details c:\Users\Admin\WorkBuddy\20260330150804\frontend>npm view naive-ui version 2.44.1 c:\Users\Admin\WorkBuddy\20260330150804\frontend>npm ls naive-ui [email protected] c:\Users\Admin\WorkBuddy\20260330150804\frontend `-- [email protected]

结果还是一样的报错,也许不是版本的问题吧。

AI DuMate进行分析

单独运行 ui.test.ts 成功了!这说明问题出在并行运行多个测试文件时的冲突。让我逐个运行其他测试文件:


所有测试文件单独运行都能通过!这确认了问题是并行运行时的冲突。
所有测试文件单独运行都通过了!问题确认是并行运行时的 mock 冲突。

问题分析

根本原因:vitest 4.x 在并行运行多个测试文件时,不同测试文件中的 vi.mock() 会相互干扰。

具体来说:多个测试文件(auth.test.tsclient.test.tsnodes.test.ts 等)都对 @/api/client 和 axios 进行了 mock并行运行时,这些 mock 会相互覆盖或冲突导致某些测试文件在加载模块时获取到了错误的 mock 实例,从而抛出 Cannot read properties of undefined (reading 'config') 错误解决方案

在 vitest.config.ts 中添加了 fileParallelism: false 配置:

这样测试文件会顺序执行,避免了 mock 冲突。后续优化建议

如果你想恢复并行执行以加快测试速度,可以考虑:统一 mock 设置:将共享的 mock(如 @/api/client)移到 tests/setup.ts 中统一管理使用 vi.resetModules():在每个测试文件的 beforeEach 中重置模块缓存隔离 mock 作用域:确保每个测试文件的 mock 不会影响其他文件

按照DuMate的修改建议,在vtest.config.ts文件中加入

 // 禁用并行执行以避免 mock 冲突 fileParallelism: false,

但是还是一样的报错信息:

 FAIL  tests/stores/content.test.ts [ tests/stores/content.test.ts ]
TypeError: Cannot read properties of undefined (reading 'config')
 ❯ tests/stores/content.test.ts:42:1

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[2/6]⎯

 FAIL  tests/stores/ui.test.ts [ tests/stores/ui.test.ts ]
TypeError: Cannot read properties of undefined (reading 'config')
 ❯ tests/stores/ui.test.ts:5:1

改在ubuntu下测试

怀疑是windows的干扰,改在ubuntu下测试,还是报错,但是报错信息不一样了:

ubuntu下的报错

skywalk@DESKTOP-9C5AU01:/mnt/c/Users/Admin/WorkBuddy/20260330150804/frontend$ node node_modules/vitest/vitest.mjs run --reporter=verbose
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ Unhandled Errors ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯

Vitest caught 6 unhandled errors during the test run.
This might cause false positive tests. Resolve unhandled errors to make sure your tests are not affected.

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ Unhandled Error ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
Error: [vitest-pool]: Failed to start forks worker for test files /mnt/c/Users/Admin/WorkBuddy/20260330150804/frontend/tests/api/auth.test.ts.
 ❯ node_modules/vitest/dist/chunks/cli-api.Bxr1Nn49.js:3450:94
 ❯ Pool.schedule node_modules/vitest/dist/chunks/cli-api.Bxr1Nn49.js:3450:5

Caused by: Error: [vitest-pool-runner]: Timeout waiting for worker to respond
 ❯ Timeout.<anonymous> node_modules/vitest/dist/chunks/cli-api.Bxr1Nn49.js:3030:58
 ❯ listOnTimeout node:internal/timers:594:17
 ❯ processTimers node:internal/timers:529:7


⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ Unhandled Error ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
Error: [vitest-pool]: Failed to start forks worker for test files /mnt/c/Users/Admin/WorkBuddy/20260330150804/frontend/tests/api/client.test.ts.
 ❯ node_modules/vitest/dist/chunks/cli-api.Bxr1Nn49.js:3450:94
 ❯ Pool.schedule node_modules/vitest/dist/chunks/cli-api.Bxr1Nn49.js:3450:5

Caused by: Error: [vitest-pool-runner]: Timeout waiting for worker to respond
 ❯ Timeout.<anonymous> node_modules/vitest/dist/chunks/cli-api.Bxr1Nn49.js:3030:58
 ❯ listOnTimeout node:internal/timers:594:17
 ❯ processTimers node:internal/timers:529:7


⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ Unhandled Error ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
Error: [vitest-pool]: Failed to start forks worker for test files /mnt/c/Users/Admin/WorkBuddy/20260330150804/frontend/tests/api/nodes.test.ts.
 ❯ node_modules/vitest/dist/chunks/cli-api.Bxr1Nn49.js:3450:94
 ❯ Pool.schedule node_modules/vitest/dist/chunks/cli-api.Bxr1Nn49.js:3450:5

Caused by: Error: [vitest-pool-runner]: Timeout waiting for worker to respond
 ❯ Timeout.<anonymous> node_modules/vitest/dist/chunks/cli-api.Bxr1Nn49.js:3030:58
 ❯ listOnTimeout node:internal/timers:594:17
 ❯ processTimers node:internal/timers:529:7


⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ Unhandled Error ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
Error: [vitest-pool]: Failed to start forks worker for test files /mnt/c/Users/Admin/WorkBuddy/20260330150804/frontend/tests/stores/auth.test.ts.
 ❯ node_modules/vitest/dist/chunks/cli-api.Bxr1Nn49.js:3450:94
 ❯ Pool.schedule node_modules/vitest/dist/chunks/cli-api.Bxr1Nn49.js:3450:5

Caused by: Error: [vitest-pool-runner]: Timeout waiting for worker to respond
 ❯ Timeout.<anonymous> node_modules/vitest/dist/chunks/cli-api.Bxr1Nn49.js:3030:58
 ❯ listOnTimeout node:internal/timers:594:17
 ❯ processTimers node:internal/timers:529:7


⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ Unhandled Error ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
Error: [vitest-pool]: Failed to start forks worker for test files /mnt/c/Users/Admin/WorkBuddy/20260330150804/frontend/tests/stores/content.test.ts.
 ❯ node_modules/vitest/dist/chunks/cli-api.Bxr1Nn49.js:3450:94
 ❯ Pool.schedule node_modules/vitest/dist/chunks/cli-api.Bxr1Nn49.js:3450:5

Caused by: Error: [vitest-pool-runner]: Timeout waiting for worker to respond
 ❯ Timeout.<anonymous> node_modules/vitest/dist/chunks/cli-api.Bxr1Nn49.js:3030:58
 ❯ listOnTimeout node:internal/timers:594:17
 ❯ processTimers node:internal/timers:529:7


⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ Unhandled Error ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
Error: [vitest-pool]: Failed to start forks worker for test files /mnt/c/Users/Admin/WorkBuddy/20260330150804/frontend/tests/stores/ui.test.ts.
 ❯ node_modules/vitest/dist/chunks/cli-api.Bxr1Nn49.js:3450:94
 ❯ Pool.schedule node_modules/vitest/dist/chunks/cli-api.Bxr1Nn49.js:3450:5

Caused by: Error: [vitest-pool-runner]: Timeout waiting for worker to respond
 ❯ Timeout.<anonymous> node_modules/vitest/dist/chunks/cli-api.Bxr1Nn49.js:3030:58
 ❯ listOnTimeout node:internal/timers:594:17
 ❯ processTimers node:internal/timers:529:7

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯


 Test Files  no tests
      Tests  no tests
     Errors  6 errors
   Start at  07:46:12
   Duration  360.12s (transform 0ms, setup 0ms, import 0ms, tests 0ms, environment 0ms)

文心的回答

在 Ubuntu 下运行 Vitest 时遇到 [vitest-pool]: Failed to start forks worker for test files,Timeout waiting for worker to respond 错误,通常与 Worker 进程启动超时或环境配置有关。可以尝试以下解决方案:

  1. 检查系统资源‌:
    在 Ubuntu 环境中,确保系统有足够的内存和 CPU 资源供 Vitest 启动多个 Worker 进程。如果资源紧张,可能导致 Worker 启动缓慢或失败。
  2. 禁用 Worker 池‌:
    如果问题持续存在,可以暂时禁用 Worker 池,使用单线程运行测试:npx vitest run --threads=false
  3. 更新 Vitest 和相关依赖‌:
    确保使用的 Vitest 版本是最新的,或者至少是稳定版本,以避免已知的 Worker 启动问题。
  4. 检查环境变量和权限‌:
    确保在 Ubuntu 环境中,Vitest 能够正确访问所需的环境变量和文件权限,尤其是当测试涉及文件系统或网络请求时。

增加超时时间‌:
如果 Worker 启动时间较长,可以尝试增加超时设置,例如:

export default defineConfig({ test: { pool: 'forks', poolOptions: { forks: { maxConcurrency: 1, }, }, }, }) 

切换进程池类型‌:
尝试将 vitest 的进程池类型从默认的 threads 切换为 forks,以避免与 Node.js 的 fetch API 或 abort controller 的兼容性问题。在 vitest.config.ts 中添加以下配置:

export default defineConfig({ test: { pool: 'forks', // 或 'vmForks' }, }) 

这种方法可以绕过 threads 池可能存在的兼容性问题,

尝试禁用Worker池报错

用这条命令报错

node node_modules/vitest/vitest.mjs run --reporter=verbose --threads=false

报错信息

skywalk@DESKTOP-9C5AU01:/mnt/c/Users/Admin/WorkBuddy/20260330150804/frontend$ node node_modules/vitest/vitest.mjs run --reporter=verbose --threads=false file:///mnt/c/Users/Admin/WorkBuddy/20260330150804/frontend/node_modules/vitest/dist/chunks/cac.DRKYQDPl.js:406 throw new CACError(`Unknown option \`${name.length > 1 ? `--${name}` : `-${name}`}\``); ^ CACError: Unknown option `--threads` at Command.checkUnknownOptions (file:///mnt/c/Users/Admin/WorkBuddy/20260330150804/frontend/node_modules/vitest/dist/chunks/cac.DRKYQDPl.js:406:17) at CAC.runMatchedCommand (file:///mnt/c/Users/Admin/WorkBuddy/20260330150804/frontend/node_modules/vitest/dist/chunks/cac.DRKYQDPl.js:606:13) at CAC.parse (file:///mnt/c/Users/Admin/WorkBuddy/20260330150804/frontend/node_modules/vitest/dist/chunks/cac.DRKYQDPl.js:547:12) at file:///mnt/c/Users/Admin/WorkBuddy/20260330150804/frontend/node_modules/vitest/dist/cli.js:11:13 at ModuleJob.run (node:internal/modules/esm/module_job:271:25) at async onImport.tracePromise.__proto__ (node:internal/modules/esm/loader:578:26) at async asyncRunEntryPointWithESMLoader (node:internal/modules/run_main:116:5) Node.js v22.14.0

据说新版本没有--threads指令。可以用--pool=forks这个指令。

用--pool=forks这个指令后有新的报错

skywalk@DESKTOP-9C5AU01:/mnt/c/Users/Admin/WorkBuddy/20260330150804/frontend$ node node_modules/vitest/vitest.mjs run --reporter=verbose --pool=forks RUN v4.1.2 /mnt/c/Users/Admin/WorkBuddy/20260330150804/frontend ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ Unhandled Errors ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ Vitest caught 6 unhandled errors during the test run. This might cause false positive tests. Resolve unhandled errors to make sure your tests are not affected. ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ Unhandled Error ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ Error: [vitest-pool]: Failed to start forks worker for test files /mnt/c/Users/Admin/WorkBuddy/20260330150804/frontend/tests/api/auth.test.ts. ❯ node_modules/vitest/dist/chunks/cli-api.Bxr1Nn49.js:3450:94 ❯ Pool.schedule node_modules/vitest/dist/chunks/cli-api.Bxr1Nn49.js:3450:5 Caused by: Error: [vitest-pool-runner]: Timeout waiting for worker to respond ❯ Timeout.<anonymous> node_modules/vitest/dist/chunks/cli-api.Bxr1Nn49.js:3030:58 ❯ listOnTimeout node:internal/timers:594:17 ❯ processTimers node:internal/timers:529:7

看来是时间超时了。

尝试增加超时

export default defineConfig({ test: { pool: 'forks', poolOptions: { forks: { maxConcurrency: 1, }, }, }, }) 

没看懂,这里怎么就增加超时了?所以我没有去改它。

最终我是让WorkBuddy去做一个新的更轻型的前端。

尝试修改配置文件

修改了又注释掉了,直接用--pool=forks就行了。

 // 将 vitest 的进程池类型从默认的 threads 切换为 forks pool: 'forks',

决定让WorkBuddy去做一个新的更轻型的前端

我前端测试的时候,还是有报错,好像跟进程池有关系。为什么你的测试就没有报错?是不是vite是比较重的框架?帮我找一个相对更加轻型的前端(因为kotti就是轻型框架),做kotti-next的新前端,放置在tinyfrontend目录。同时写好全面测试的代码。

Read more

如何快速实现无人机RemoteID合规?ArduRemoteID开源方案完整指南

如何快速实现无人机RemoteID合规?ArduRemoteID开源方案完整指南 【免费下载链接】ArduRemoteIDRemoteID support using OpenDroneID 项目地址: https://gitcode.com/gh_mirrors/ar/ArduRemoteID ArduRemoteID是一个专为无人机设计的开源RemoteID解决方案,基于OpenDroneID标准实现,完美支持FAA与欧盟法规要求。通过MAVLink和DroneCAN协议与飞行控制器通信,提供WiFi广播、蓝牙5等多种传输模式,兼容ESP32-S3/C3等主流硬件平台,帮助开发者轻松实现无人机身份识别功能。 🚁 项目核心功能解析 多协议兼容的身份发射系统 ArduRemoteID模块集成了MAVLink与DroneCAN双协议支持,可无缝对接ArduPilot等主流飞控系统。通过RemoteIDModule/transmitter.cpp实现的发射逻辑,能同时广播无人机位置、速度、高度等关键飞行数据,确保监管平台实时获取设备状态。 全平台硬件适配方案 支持ESP3

低代码AI化爆发:OpenClaw成企业数字化破局关键

低代码AI化爆发:OpenClaw成企业数字化破局关键

企业数字化转型喊了多年,却始终卡在两难境地:纯代码开发周期长、成本高、迭代慢,中小团队耗不起;传统低代码看似快捷,却只能做简单表单和固化流程,适配不了复杂业务,智能化更是形同虚设。        如今低代码AI化迎来全面爆发,行业彻底告别“拖拽凑数”的浅层次应用,可多数平台依旧停留在AI插件拼接的伪智能阶段。直到OpenClaw的落地,才真正打通了低代码、AI与企业业务的壁垒,凭借原生智能体能力,补齐企业数字化的最后一块短板,成为转型落地的核心抓手。 一、行业痛点:企业数字化的三座拦路大山        抛开浮华的概念,企业做数字化转型,最怕的不是没工具,而是工具不实用、不落地,当前市面上的方案普遍存在三大硬伤,卡死转型进度: * AI与业务割裂:低代码搭载的AI仅能做表层代码生成、问答交互,无法深度理解业务逻辑、对接企业现有系统,智能能力用不上、落地难; * 开发门槛仍偏高:即便用低代码,仍需专人配置流程、对接数据、调试权限,业务人员无法自主操作,技术团队负担依旧繁重; * 数据安全存隐患:多数AI能力依赖云端接口,企业核心业务数据、经营数据需要外发,隐

低空经济新实践:无人机如何革新光伏电站巡检

低空经济新实践:无人机如何革新光伏电站巡检

引言:当低空经济遇见新能源革命 在“双碳”战略引领下,光伏电站如雨后春笋般遍布神州大地。截至2023年底,我国光伏发电装机容量已突破6亿千瓦,连续多年位居全球首位。然而,随着光伏电站规模的急剧扩大,传统人工巡检方式已难以满足高效、精准的运维需求。此时,低空经济的崛起为这一痛点带来了创新解法——无人机光伏巡检技术正在重新定义新能源设施的运维模式。 一、传统光伏巡检之困:低效、高风险、不精准 传统光伏巡检主要依赖人工方式,运维人员需要手持红外热像仪等设备,在光伏板阵列中徒步检查。这种方式存在明显短板: 1. 效率低下:一个100MW的光伏电站,人工全面巡检往往需要数周时间 2. 安全风险:高温、高电压环境下作业,人员安全隐患不容忽视 3. 漏检率高:人工目视检查难以发现细微缺陷,问题检出率通常不足70% 4. 数据离散:检查结果依赖个人经验,难以形成标准化数据资产 二、无人机智能巡检系统架构 现代无人机光伏巡检已形成完整的系统解决方案,主要由以下核心模块组成: 2.1 硬件配置 * 飞行平台:

【一轮截稿】第二届机器人与传感器网络国际会议

01 会议信息 第二届机器人与传感器网络国际会议(RoSeN 2026) 会议地点:中国·天津 会议检索:提交EI、Scopus数据库 会议时间:2026年4月17日-19日 一轮截稿:2026年2月5日 主办单位:天津大学 协办单位:贵州大学、东北大学、武汉理工大学、天津市机器人学会、天津市系统科学与工业控制学会、ESBK国际学术交流中心、AC学术平台 02 征稿主题 征稿主题包含但不限于以下主题: 机器人:机器人学、机电一体化、分布式智能系统、机器人和自动化、人机交互、人机界面和交互、无人系统、多机器人团队和网络化群体、机器智能、机器学习、系统自治和自主系统、机器人感知。 传感:视觉传感、智能控制、传感器融合、视觉感知、力感知、传感器、感知和控制算法、传感器网络、