Open
Conversation
Add responsive text wrapping and overflow handling to token-related components to prevent layout breaking with long token names or descriptions. Changes: - Add min-w-0 to dialog headers to allow flex shrinking - Add break-all/break-words to prevent text overflow - Add overflow-hidden to token display container - Apply max-w-48 constraint to token name column
…load button - Reset form fields and mutation state when create-token dialog reopens - Fix delete pagination: check items.length === 0 (post-delete) instead of 1 - Restrict skill download to PUBLISHED versions only
- Backend: /api/v1/auth/me now fetches fresh roles from DB and updates session when roles have changed, so users see role changes on page refresh without re-login - Frontend: invalidate ['auth', 'me'] cache after admin user mutations (role change, status change, approve, disable, enable) and account merge - Login: fix reversed eye icon (Eye=visible, EyeOff=hidden) - Login: hide browser-native password reveal button to avoid duplicate
- Change skill uniqueness constraint from (namespace_id, slug) to (namespace_id, slug, owner_id) to support per-user skill records - Reject publish when another owner has a published skill with same slug - Reject review approval when same-slug conflict exists - Auto-withdraw pending review versions when submitting a new version - Resolve visible skill by preferring published skill, then current user's own skill, to fix wrong skill returned for same-slug queries - Invalidate all skill query cache on publish to prevent stale data
Add responsive text wrapping and overflow handling to token-related components to prevent layout breaking with long token names or descriptions. Changes: - Add min-w-0 to dialog headers to allow flex shrinking - Add break-all/break-words to prevent text overflow - Add overflow-hidden to token display container - Apply max-w-48 constraint to token name column
…load button - Reset form fields and mutation state when create-token dialog reopens - Fix delete pagination: check items.length === 0 (post-delete) instead of 1 - Restrict skill download to PUBLISHED versions only
- Backend: /api/v1/auth/me now fetches fresh roles from DB and updates session when roles have changed, so users see role changes on page refresh without re-login - Frontend: invalidate ['auth', 'me'] cache after admin user mutations (role change, status change, approve, disable, enable) and account merge - Login: fix reversed eye icon (Eye=visible, EyeOff=hidden) - Login: hide browser-native password reveal button to avoid duplicate
- Change skill uniqueness constraint from (namespace_id, slug) to (namespace_id, slug, owner_id) to support per-user skill records - Reject publish when another owner has a published skill with same slug - Reject review approval when same-slug conflict exists - Auto-withdraw pending review versions when submitting a new version - Resolve visible skill by preferring published skill, then current user's own skill, to fix wrong skill returned for same-slug queries - Invalidate all skill query cache on publish to prevent stale data
cli login fix
# Conflicts: # web/src/api/client.ts # web/src/app/router.tsx # web/src/pages/skill-detail.tsx
* fix(skill): resolve duplicate result error when deleting skill with shared namespace+slug V13 migration changed the unique constraint from (namespace_id, slug) to (namespace_id, slug, owner_id), allowing multiple skills with the same namespace+slug but different owners. The findByNamespaceSlugAndSlug query returned Optional<Skill> which threw IncorrectResultSizeDataAccessException when 2 rows matched. Changed the query to return List<Skill> and added ownerId query param to DELETE endpoints so the frontend can specify exactly which skill to delete. * fix(review): keep failed scans reviewable and expose feedback * fix(skill-delete): delete skills by id * fix(skill): defer version storage deletion until commit
* fix(scanner): stage upload bundles from object storage * fix(web): wrap long skill detail values
…ient (iflytek#166) - Create scanner-specific HttpClient bean with proper timeout configuration - Wire SkillScannerProperties.connectTimeoutMs (5s) and readTimeoutMs (5min) into WebClient - Add logging for timeout configuration verification - Fix cloud environment 5-second timeout issue by ensuring responseTimeout is properly applied The previous global WebClient.Builder configuration was not being used correctly, causing scanner requests to timeout after 5 seconds in cloud environment. This fix creates a dedicated HttpClient for scanner with explicit timeout settings.
将自动版本号的时间戳从 UTC 时区改为北京时区 (Asia/Shanghai)。 修复 iflytek#169
* fix(scanner): wire timeout config and create dedicated scanner HttpClient - Create scanner-specific HttpClient bean with proper timeout configuration - Wire SkillScannerProperties.connectTimeoutMs (5s) and readTimeoutMs (5min) into WebClient - Add logging for timeout configuration verification - Fix cloud environment 5-second timeout issue by ensuring responseTimeout is properly applied The previous global WebClient.Builder configuration was not being used correctly, causing scanner requests to timeout after 5 seconds in cloud environment. This fix creates a dedicated HttpClient for scanner with explicit timeout settings. * refactor(webclient): use WebClientCustomizer and add scanner connection pool - Replace singleton WebClient.Builder bean with WebClientCustomizer (follows Spring Boot best practice for prototype-scoped builder) - Add connection pool config to scanner HttpClient (maxConn=10, maxIdleTime=20s, evictInBackground=30s) to prevent stale connections - Add connectTimeout to global WebClient config * fix(skill): use system default timezone for auto-generated version numbers - Change AUTO_VERSION_FORMATTER from UTC to ZoneId.systemDefault() - Version format yyyyMMdd.HHmmss now uses server's local timezone - Update test to validate format instead of exact value (timezone-independent) This allows the service to adapt to deployment location: - Deployed in China → uses Asia/Shanghai timezone - Deployed in US → uses US timezone - Follows server's system timezone configuration
变更摘要: - 新增项目级 Codex MCP 配置,接入 Figma 与 Playwright - 迁移 Claude agents 到 .codex/agents,并补齐 Codex frontmatter - 复制并改造 skillhub-dev-workflow 为项目级 Codex skill - 修正迁移文档中的 migration 版本与 API 生成说明 关键文件: - .codex/config.toml - .codex/skills/skillhub-dev-workflow/SKILL.md - .codex/agents/backend.md - .codex/agents/migration-guard.md - .codex/agents/api-drift.md
变更摘要: - 将 6 个项目级 agent 定义从 Markdown 迁移为 TOML frontmatter 格式 - 保留 backend、frontend、tester、reviewer、api-drift、migration-guard 的职责说明 - 在 .codex/config.toml 启用 powershell_utf8、multi_agent、apps,并设置 agent 并发深度 关键文件: - .codex/config.toml - .codex/agents/backend.toml - .codex/agents/frontend.toml - .codex/agents/tester.toml - .codex/agents/reviewer.toml
变更摘要: - 将 Agent 概览中的定义文件路径由 .md 统一修正为 .toml,匹配仓库实际结构 - 强化 tester 阶段要求:涉及 UI/路由/权限/跨页面流程时,必须执行 Playwright MCP E2E - 在测试与质量门禁中新增 E2E 关键路径回归与证据要求(截图/日志可追溯) - 补充 E2E 失败回流规则,明确回到 frontend agent,必要时联动 backend agent 关键文件: - .codex/skills/skillhub-dev-workflow/SKILL.md
… MCP - 在 skillhub-dev-workflow skill 中增加"阶段七 — 提交 Pull Request" - 添加结构化 PR 模板,包含概述、变更内容、质量门禁、安全考虑、测试说明 - 为 Claude Code 创建对应的 skill 版本(.claude/skills/) - 配置 Playwright MCP 服务器用于 E2E 测试 - 更新 .gitignore 以支持 .claude/ 目录和 *.local.json 文件
- 添加 6 个项目级 agents(backend, frontend, migration-guard, api-drift, tester, reviewer) - 配置 Claude Code hooks(pre-tool-use, post-tool-use, stop hooks) - 添加 settings.json 配置文件
- Replace hardcoded 'Network error' with i18n key 'apiError.networkError' - Add dedicated handler for status 0 in handleApiError - Add test case for network error scenario Closes iflytek#160
变更摘要: - Playwright MCP E2E 范围从特定场景扩展到所有前端修改 - 强化截图要求:关键步骤必须截图,规范文件命名和路径 - 新增阶段五 Validation:功能完整性、UI/UX、性能、安全四大验证维度 - 更新工作流图,增加 Validation 节点和失败处理流程 - 同步更新 .claude 和 .codex 两个版本的技能文件 关键文件: - .claude/skills/skillhub-dev-workflow/SKILL.md - .codex/skills/skillhub-dev-workflow/SKILL.md
* test(web): add Playwright e2e testing framework Add Playwright for end-to-end testing with initial test suites for search flow and network error handling. Also enhance unit tests for network error scenarios. - Add @playwright/test dependency and npm scripts - Configure Playwright with chromium browser and HTML reporter - Add e2e tests for search flow and network error handling - Update .gitignore to exclude Playwright generated files - Add network error test cases to api-error unit tests * feat(web): add skill share button to detail page Add share button to skill detail page that copies skill info to clipboard. Share text includes skill name, short description (max 30 chars), and detail page URL. Closes iflytek#168 * test(web): add e2e tests for skill share button Add Playwright e2e tests to verify share button functionality including clipboard copy, text formatting, and state transitions. * fix(web): fix share button e2e tests and document Playwright workflow Fix 3 issues in share-button e2e tests: - Use authenticated mock (skill detail page requires login) - Add publishedVersion to skill factory (ShareButton render condition) - Mock versions/files sub-resource APIs to prevent server errors - Adjust description assertion for 30-char truncation logic Add Playwright E2E section to CLAUDE.md documenting commands, screenshot behavior, and test-results directory conventions. E2E test results: 10/10 passed (Chromium, Playwright 1.58.2) - network-error.spec.ts: 3/3 passed - search-flow.spec.ts: 3/3 passed - share-button.spec.ts: 4/4 passed * refactor(web): improve share button layout and text format - Remove description truncation, display full text - Change share text format from 2 lines to 3 lines (name, description, URL) - Replace Button component with custom styled native button - Move ShareButton from card to below download button - Update tests to match new 3-line format * fix(web): handle clipboard copy failure in fallback path - Check document.execCommand('copy') return value - Throw error when copy fails in fallback path - Ensure error is properly caught and displayed to user Fixes issue where "复制 Token 失败,请重试" was shown but the underlying failure was not properly detected in the fallback code path. * refactor(web): modernize clipboard with useCopyToClipboard hook - Add useCopyToClipboard React hook for cleaner state management - Migrate all copy buttons to use the new hook - Remove repetitive useState + setTimeout patterns across 7 files - Simplify clipboard.ts by removing excessive diagnostic logging - Keep copyToClipboard utility for special cases (file-preview-dialog) Benefits: - More idiomatic React code with custom hook - Consistent 2-second auto-reset behavior - Reduced code duplication - Better separation of concerns * test(web): fix api-error tests and exclude e2e from vitest - Set i18n language to 'zh' in api-error.test.ts beforeEach - Add vitest config to exclude e2e directory from unit tests - All 506 tests now pass --------- Co-authored-by: xiose <huyanlin@nuaa.edu.cn>
…ek#185) * feat(upload): allow xsd, xsl, dtd file types in skill packages Add XML schema-related file extensions (.xsd, .xsl, .dtd) to the upload allowlist and text content validation. Users uploading skills with XML Schema files (e.g., Anthropic's docx skill) were getting rejected because .xsd was not in the allowed extensions list. Closes iflytek#165 * feat(upload): expand office file allowlist * test(app): verify publish extension env override * docs(readme): document upload allowlist override
* feat(upload): allow xsd, xsl, dtd file types in skill packages Add XML schema-related file extensions (.xsd, .xsl, .dtd) to the upload allowlist and text content validation. Users uploading skills with XML Schema files (e.g., Anthropic's docx skill) were getting rejected because .xsd was not in the allowed extensions list. Closes iflytek#165 * feat(upload): expand office file allowlist * test(app): verify publish extension env override * docs(readme): document upload allowlist override * feat(upload): add legacy Office formats to upload allowlist Add .doc, .xls, .ppt to SkillPackagePolicy.ALLOWED_EXTENSIONS so users can upload skill packages containing legacy Office files. * chore: remove v0.2.0 release notes draft --------- Co-authored-by: wowo-zZ <zhenggui5228@126.com>
* feat(deploy): add scanner service to release deployment - Add skill-scanner service to compose.release.yml (enabled by default) - Add scanner image to CI publish-images workflow matrix - Add --scanner-image and --no-scanner flags to runtime.sh - Add scanner config to .env.release.example * fix(docker): add skillhub-notification module to server Dockerfile * fix(deploy): set scanner mode to upload for container deployment * fix(deploy): use env override instead of persisting scanner disabled state
…ytek#195) * fix: increase nginx upload limit and filter Chrome DevTools logs - Add client_max_body_size 100M to nginx config to allow large skill package uploads - Silently handle Chrome DevTools .well-known requests to reduce log noise Fixes iflytek#193 * remove
* fix: increase nginx upload limit and filter Chrome DevTools logs - Add client_max_body_size 100M to nginx config to allow large skill package uploads - Silently handle Chrome DevTools .well-known requests to reduce log noise Fixes iflytek#193 * feat(domain): add Unicode slug support with emoji validation - Update SLUG_PATTERN to support Unicode letters (\p{L}), numbers (\p{N}), and symbols (\p{So}) - Add UPPERCASE_PATTERN to maintain lowercase-only validation - Modify slugify() to preserve Unicode characters instead of replacing with hyphens - Add 8 new test cases covering Chinese, Japanese, Korean, emoji, and mixed Unicode slugs - Maintain backward compatibility with existing ASCII slug validation - All 16 tests passing Implements Phase 1 of unicode-slug-support-v1.0-prd.md * feat(web): add URL encoding for Unicode slugs and improve monospace font support - Encode skill slugs in all navigation URLs using encodeURIComponent - Encode slugs in API client methods for proper HTTP request handling - Update share button to generate properly encoded URLs - Extend monospace font stack with system fonts for better Unicode support - All frontend tests pass (506 tests) Related to Unicode slug support PRD phase 2 and 3 * feat(web): regenerate API types for Unicode slug support - Update OpenAPI schema types after backend slug validator changes - Reflects new Unicode-aware slug pattern validation * remove
* feat : 调整本地开发环境 * feat : 调整sse 超时 GlobalExceptionHandler 拦截异常 See : rg.springframework.web.context.request.async.AsyncRequestTimeoutException: null at org.springframework.web.context.request.async.TimeoutDeferredResultProcessingInterceptor.handleTimeout(TimeoutDeferredResultProcessingInterceptor.java:42) ~[spring-web-6.1.4.jar:6.1.4] at org.springframework.web.context.request.async.DeferredResultInterceptorChain.triggerAfterTimeout(DeferredResultInterceptorChain.java:81) ~[spring-web-6.1.4.jar:6.1.4] at org.springframework.web.context.request.async.WebAsyncManager.lambda$startDeferredResultProcessing$5(WebAsyncManager.java:430) ~[spring-web-6.1.4.jar:6.1.4] at java.base/java.util.ArrayList.forEach(ArrayList.java:1596) ~[na:na] at org.springframework.web.context.request.async.StandardServletAsyncWebRequest.onTimeout(StandardServletAsyncWebRequest.java:149) ~[spring-web-6.1.4.jar:6.1.4] at org.apache.catalina.core.AsyncListenerWrapper.fireOnTimeout(AsyncListenerWrapper.java:44) ~[tomcat-embed-core-10.1.19.jar:10.1.19] at org.apache.catalina.core.AsyncContextImpl.timeout(AsyncContextImpl.java:136) ~[tomcat-embed-core-10.1.19.jar:10.1.19] at org.apache.catalina.connector.CoyoteAdapter.asyncDispatch(CoyoteAdapter.java:135) ~[tomcat-embed-core-10.1.19.jar:10.1.19] at org.apache.coyote.AbstractProcessor.dispatch(AbstractProcessor.java:243) ~[tomcat-embed-core-10.1.19.jar:10.1.19] at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:57) ~[tomcat-embed-core-10.1.19.jar:10.1.19] at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896) ~[tomcat-embed-core-10.1.19.jar:10.1.19] at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1744) ~[tomcat-embed-core-10.1.19.jar:10.1.19] at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[tomcat-embed-core-10.1.19.jar:10.1.19] at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) ~[tomcat-embed-core-10.1.19.jar:10.1.19] at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-10.1.19.jar:10.1.19] at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) ~[tomcat-embed-core-10.1.19.jar:10.1.19] at java.base/java.lang.Thread.run(Thread.java:1583) ~[na:na] * Revert "feat : 调整sse 超时 GlobalExceptionHandler 拦截异常" This reverts commit f2daf46. * Revert "feat : 调整本地开发环境" This reverts commit 584fe53. * feat : 调整sse 超时 GlobalExceptionHandler 拦截异常 See : rg.springframework.web.context.request.async.AsyncRequestTimeoutException: null at org.springframework.web.context.request.async.TimeoutDeferredResultProcessingInterceptor.handleTimeout(TimeoutDeferredResultProcessingInterceptor.java:42) ~[spring-web-6.1.4.jar:6.1.4] at org.springframework.web.context.request.async.DeferredResultInterceptorChain.triggerAfterTimeout(DeferredResultInterceptorChain.java:81) ~[spring-web-6.1.4.jar:6.1.4] at org.springframework.web.context.request.async.WebAsyncManager.lambda$startDeferredResultProcessing$5(WebAsyncManager.java:430) ~[spring-web-6.1.4.jar:6.1.4] at java.base/java.util.ArrayList.forEach(ArrayList.java:1596) ~[na:na] at org.springframework.web.context.request.async.StandardServletAsyncWebRequest.onTimeout(StandardServletAsyncWebRequest.java:149) ~[spring-web-6.1.4.jar:6.1.4] at org.apache.catalina.core.AsyncListenerWrapper.fireOnTimeout(AsyncListenerWrapper.java:44) ~[tomcat-embed-core-10.1.19.jar:10.1.19] at org.apache.catalina.core.AsyncContextImpl.timeout(AsyncContextImpl.java:136) ~[tomcat-embed-core-10.1.19.jar:10.1.19] at org.apache.catalina.connector.CoyoteAdapter.asyncDispatch(CoyoteAdapter.java:135) ~[tomcat-embed-core-10.1.19.jar:10.1.19] at org.apache.coyote.AbstractProcessor.dispatch(AbstractProcessor.java:243) ~[tomcat-embed-core-10.1.19.jar:10.1.19] at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:57) ~[tomcat-embed-core-10.1.19.jar:10.1.19] at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896) ~[tomcat-embed-core-10.1.19.jar:10.1.19] at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1744) ~[tomcat-embed-core-10.1.19.jar:10.1.19] at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[tomcat-embed-core-10.1.19.jar:10.1.19] at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) ~[tomcat-embed-core-10.1.19.jar:10.1.19] at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-10.1.19.jar:10.1.19] at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) ~[tomcat-embed-core-10.1.19.jar:10.1.19] at java.base/java.lang.Thread.run(Thread.java:1583) ~[na:na] * fix(app): stabilize async timeout handling --------- Co-authored-by: zhaieryuan <zhaieryuan@enn.cn> Co-authored-by: wowo-zZ <zhenggui5228@126.com>
…lytek#198) * chore(workflow): align local hooks and e2e guidance * test(e2e): expand reusable api mock helpers * test(skill): stabilize share button e2e assertions * chore(test): add e2e make target and tune playwright workers * test(web): expand e2e coverage and smoke suite * test(e2e): migrate to real API flows and add request-based data builder * ci(e2e): add PR workflow for real-service frontend e2e * ci(e2e): install playwright chromium in PR workflow * test(e2e): relax timeout and force single worker in CI * test(e2e): stabilize not-found assertions and harden CI session bootstrap * chore(agents): align tester role with web/e2e workflow
* docs: Improve the user manual for regular users * docs: Align the document title and fix formatting issues in the example
2a8fbfc to
3e4a4bc
Compare
Collaborator
|
仓库整体调整了一波哈,麻烦重新提交fork/commit哈,感谢感谢。 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR adds a demonstration GIF to both the English and Chinese README files to better showcase the SkillHub platform interface.