diff --git a/qiming-backend/D:/work/workspace/feitian-base/nvw/.dev/uploads/local/default/20260602/2d6a4d5796a5422a8df05d3b730ea424.jpg b/qiming-backend/D:/work/workspace/feitian-base/nvw/.dev/uploads/local/default/20260602/2d6a4d5796a5422a8df05d3b730ea424.jpg
new file mode 100644
index 00000000..5f2d56db
Binary files /dev/null and b/qiming-backend/D:/work/workspace/feitian-base/nvw/.dev/uploads/local/default/20260602/2d6a4d5796a5422a8df05d3b730ea424.jpg differ
diff --git a/qiming-backend/D:/work/workspace/feitian-base/nvw/.dev/uploads/local/default/20260602/802468e2f1174dd98aa1519745335af1.jpg b/qiming-backend/D:/work/workspace/feitian-base/nvw/.dev/uploads/local/default/20260602/802468e2f1174dd98aa1519745335af1.jpg
new file mode 100644
index 00000000..5f2d56db
Binary files /dev/null and b/qiming-backend/D:/work/workspace/feitian-base/nvw/.dev/uploads/local/default/20260602/802468e2f1174dd98aa1519745335af1.jpg differ
diff --git a/qiming-backend/D:/work/workspace/feitian-base/nvw/.dev/uploads/local/default/20260602/d21f6fab557b466080096b50633f7335.jpg b/qiming-backend/D:/work/workspace/feitian-base/nvw/.dev/uploads/local/default/20260602/d21f6fab557b466080096b50633f7335.jpg
new file mode 100644
index 00000000..5f2d56db
Binary files /dev/null and b/qiming-backend/D:/work/workspace/feitian-base/nvw/.dev/uploads/local/default/20260602/d21f6fab557b466080096b50633f7335.jpg differ
diff --git a/qiming-backend/D:/work/workspace/feitian-base/nvw/.dev/uploads/local/skill_dev/20260615/0aacaa8315a745b6908331d7b33326a5.md b/qiming-backend/D:/work/workspace/feitian-base/nvw/.dev/uploads/local/skill_dev/20260615/0aacaa8315a745b6908331d7b33326a5.md
new file mode 100644
index 00000000..576fceb1
--- /dev/null
+++ b/qiming-backend/D:/work/workspace/feitian-base/nvw/.dev/uploads/local/skill_dev/20260615/0aacaa8315a745b6908331d7b33326a5.md
@@ -0,0 +1,9 @@
+---
+name:
+description:
+license:
+---
+
+# Processing Guide
+
+## Overview
diff --git a/qiming-backend/D:/work/workspace/feitian-base/nvw/.dev/uploads/local/skill_dev/20260615/7dc4b3363f094dbf93441029b29b53b1.json b/qiming-backend/D:/work/workspace/feitian-base/nvw/.dev/uploads/local/skill_dev/20260615/7dc4b3363f094dbf93441029b29b53b1.json
new file mode 100644
index 00000000..61dd7e18
--- /dev/null
+++ b/qiming-backend/D:/work/workspace/feitian-base/nvw/.dev/uploads/local/skill_dev/20260615/7dc4b3363f094dbf93441029b29b53b1.json
@@ -0,0 +1,4 @@
+{
+ "description": "Skill template",
+ "config": {}
+}
diff --git a/qiming-backend/D:/work/workspace/feitian-base/nvw/.dev/uploads/local/skill_dev/20260615/a3eea0ea5f604cc1ad72d772ee67a31d.py b/qiming-backend/D:/work/workspace/feitian-base/nvw/.dev/uploads/local/skill_dev/20260615/a3eea0ea5f604cc1ad72d772ee67a31d.py
new file mode 100644
index 00000000..ea7403a2
--- /dev/null
+++ b/qiming-backend/D:/work/workspace/feitian-base/nvw/.dev/uploads/local/skill_dev/20260615/a3eea0ea5f604cc1ad72d772ee67a31d.py
@@ -0,0 +1,5 @@
+#!/usr/bin/env python3
+# Helper script for this skill
+
+if __name__ == "__main__":
+ print("Process script placeholder")
diff --git a/qiming-backend/D:/work/workspace/feitian-base/nvw/.dev/uploads/local/skill_dev/20260615/dfaff6515c964c85ab53f87622e96992.md b/qiming-backend/D:/work/workspace/feitian-base/nvw/.dev/uploads/local/skill_dev/20260615/dfaff6515c964c85ab53f87622e96992.md
new file mode 100644
index 00000000..e2f8263b
--- /dev/null
+++ b/qiming-backend/D:/work/workspace/feitian-base/nvw/.dev/uploads/local/skill_dev/20260615/dfaff6515c964c85ab53f87622e96992.md
@@ -0,0 +1,3 @@
+# API Documentation
+
+Add interface descriptions related to skills here.
\ No newline at end of file
diff --git a/qiming-backend/app-platform-bootstrap/app-platform-web-bootstrap/pom.xml b/qiming-backend/app-platform-bootstrap/app-platform-web-bootstrap/pom.xml
index 48a8b826..53286b56 100644
--- a/qiming-backend/app-platform-bootstrap/app-platform-web-bootstrap/pom.xml
+++ b/qiming-backend/app-platform-bootstrap/app-platform-web-bootstrap/pom.xml
@@ -104,6 +104,10 @@
com.xspaceagi
app-platform-bill-web
+
+ org.springframework.boot
+ spring-boot-starter-actuator
+
diff --git a/qiming/package.json b/qiming/package.json
index 03a5df8b..b9fb6752 100644
--- a/qiming/package.json
+++ b/qiming/package.json
@@ -33,7 +33,8 @@
"serve": "http-server ./dist",
"setup": "max setup",
"start": "npm run dev",
- "test": "vitest",
+ "test": "vitest run",
+ "test:watch": "vitest",
"verify-commit": "max verify-commit"
},
"lint-staged": {
@@ -140,14 +141,15 @@
"cross-env": "^7.0.3",
"esbuild": "^0.27.0",
"husky": "^9.1.7",
- "jsdom": "^27.3.0",
+ "jest-axe": "^10.0.0",
+ "jsdom": "^22.1.0",
"lint-staged": "^13.2.0",
"prettier": "^2.8.7",
"prettier-plugin-organize-imports": "^3.2.2",
"prettier-plugin-packagejson": "^2.4.3",
"standard-version": "^9.5.0",
"typescript": "^5.0.3",
- "vitest": "^4.0.15"
+ "vitest": "^0.34.6"
},
"packageManager": "pnpm@10.27.0",
"engines": {
diff --git a/qiming/tests/a11y/base-components.test.tsx b/qiming/tests/a11y/base-components.test.tsx
index 8b734872..c50b3552 100644
--- a/qiming/tests/a11y/base-components.test.tsx
+++ b/qiming/tests/a11y/base-components.test.tsx
@@ -1,17 +1,25 @@
/**
* Axe smoke coverage for low-level shared UI components.
*/
-import {
- ActionMenu,
- CopyButton,
- CopyIconButton,
- MenuListItem,
- SecondMenuItem,
-} from '@/components/base';
+import ActionMenu from '@/components/base/ActionMenu';
+import CopyButton from '@/components/base/CopyButton';
+import CopyIconButton from '@/components/base/CopyIconButton';
+import MenuListItem from '@/components/base/MenuListItem';
+import SecondMenuItem from '@/components/base/SecondMenuItem';
import { render } from '@testing-library/react';
import { axe } from 'jest-axe';
import { describe, expect, it, vi } from 'vitest';
+vi.mock('@/components/base/SvgIcon', () => ({
+ default: ({ name }: { name: string }) => (
+
+ ),
+}));
+
+vi.mock('@/services/i18nRuntime', () => ({
+ dict: (key: string) => key,
+}));
+
const assertNoViolations = async (element: HTMLElement) => {
const results = await axe(element);
expect(results.violations).toEqual([]);
diff --git a/qiming/tests/setupTests.ts b/qiming/tests/setupTests.ts
index 0c434623..0cbd9456 100644
--- a/qiming/tests/setupTests.ts
+++ b/qiming/tests/setupTests.ts
@@ -1,4 +1,52 @@
import '@testing-library/jest-dom';
+import { TextDecoder, TextEncoder } from 'node:util';
+
+Object.assign(globalThis, { TextDecoder, TextEncoder });
+
+if (typeof window !== 'undefined') {
+ Object.assign(window, { TextDecoder, TextEncoder });
+}
+
+class MemoryStorage implements Storage {
+ private readonly store = new Map();
+
+ get length() {
+ return this.store.size;
+ }
+
+ clear() {
+ this.store.clear();
+ }
+
+ getItem(key: string) {
+ return this.store.get(key) ?? null;
+ }
+
+ key(index: number) {
+ return Array.from(this.store.keys())[index] ?? null;
+ }
+
+ removeItem(key: string) {
+ this.store.delete(key);
+ }
+
+ setItem(key: string, value: string) {
+ this.store.set(key, String(value));
+ }
+}
+
+const ensureStorage = (name: 'localStorage' | 'sessionStorage') => {
+ const current = globalThis[name];
+ if (current) return;
+
+ Object.defineProperty(globalThis, name, {
+ configurable: true,
+ value: new MemoryStorage(),
+ });
+};
+
+ensureStorage('localStorage');
+ensureStorage('sessionStorage');
// antd 响应式依赖 matchMedia,测试环境补齐
if (typeof window !== 'undefined' && !window.matchMedia) {
diff --git a/qiming/vitest.config.ts b/qiming/vitest.config.ts
index eaa68a1e..68e40073 100644
--- a/qiming/vitest.config.ts
+++ b/qiming/vitest.config.ts
@@ -11,6 +11,11 @@ export default defineConfig({
test: {
globals: true,
environment: 'jsdom',
+ environmentOptions: {
+ jsdom: {
+ url: 'http://localhost/',
+ },
+ },
setupFiles: './tests/setupTests.ts',
exclude: [...configDefaults.exclude, 'tests/**/*[Vv]2*.test.{ts,tsx}'],
alias: {
diff --git a/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/output/playwright/workbuddy-sidebar.png b/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/output/playwright/workbuddy-sidebar.png
new file mode 100644
index 00000000..2f395891
Binary files /dev/null and b/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/output/playwright/workbuddy-sidebar.png differ