Commit graph

409 commits

Author SHA1 Message Date
vsxd
fcfd9b203b fix(review): add pagination and time sorting to audit queues 2026-03-23 14:32:54 +08:00
vsxd
ddf9e6e1d2 refactor: address code review findings from 2026-03-22
Implements 6 high-priority improvements from code review:

Backend:
- Make label business limits configurable via application.yml (max-definitions, max-per-skill)

Frontend:
- Split use-skill-queries.ts into domain-specific modules (label/namespace/user/skill)
- Enable @typescript/no-explicit-any as warning and clean up 10 any types
- Unify API error handling by removing unwrap() in favor of fetchJson()

Testing:
- Add label system scenarios to smoke test script
- Add 6 new tests for label management UI (validation, rendering)

All tests passing: 301 backend, 129 frontend
2026-03-23 13:48:23 +08:00
yun-zhi-ztl
6e8b257abb feat(notification): add in-app notifications and harden delivery 2026-03-23 12:31:28 +08:00
XiaoSeS
3bc97ff1b8 feat(security): add security scanning system with multi-scanner support and frontend UI (#144)
* feat(security): extend scanner config with full analyzer options

Integrate skill-scanner's 8 analysis engines and policy configuration
into SkillHub's config system. Operators can now control behavioral,
LLM, Meta, AI Defense, VirusTotal, and trigger analyzers via
application.yml or environment variables.

Changes:
- Add Analyzers and Policy nested classes to SkillScannerProperties
- Create ScanOptions record to encapsulate analyzer flags
- Update SkillScannerService to pass options in /scan body and /scan-upload query params
- Wire ScanOptions through SkillScannerConfig and SkillScannerAdapter
- Extend application.yml with full scanner config block and env var overrides
- Update all tests to verify new configuration flow

All tests pass.

* feat(security): add domain model and integrate scan into publish flow

Add SCANNING/SCAN_FAILED status to SkillVersionStatus. Introduce
SecurityScanService, SecurityScanner port, ScanTask, SecurityAudit
and related domain types. Wire scan trigger into SkillPublishService
so non-auto-publish versions enter scanning when scanner is enabled,
falling back to review task creation when disabled.

* feat(security): add infra layer for scanner HTTP client and adapters

Add WebClient-based HttpClient abstraction with WebClientHttpClient
implementation. Add SkillScannerApiResponse record, SecurityScanException,
and SecurityAuditJpaRepository. Add webflux and test dependencies to
infra module.

* feat(security): add Redis stream consumers, audit API, and DB migration

Add AbstractStreamConsumer base class, ScanTaskConsumer for processing
scan results from Redis stream, and RedisScanTaskProducer. Add
RedisStreamConfig for stream/group initialization. Add SecurityAudit
REST controller and DTO. Add V35 Flyway migration for security_audits
table.

* feat(security): add scanner config to application profiles

Add scanner enabled flag to application-local.yml and
application-test.yml. Enable behavioral analyzer by default
in application.yml.

* feat(deploy): add skill-scanner to docker-compose and k8s manifests

Add skill-scanner service to docker-compose.yml with health check.
Add scanner k8s deployment, service, and configmap entries. Wire
scanner env vars into Makefile dev-all flow. Add verify-scanner.sh
script for post-deploy validation.

* docs(security): add scanner documentation suite

Add scanner docs: configuration guide, failure impact analysis,
monitoring guide, improvement recommendations, custom rules guide,
and skill-vetter rules conversion example. Update deployment docs
with scanner section. Add security-scanning overview and PRD.

* feat(security): add skill-vetter custom rule examples

Add example Regex and YARA rules derived from skill-vetter RED FLAGS
in scanner/examples/vetter-rules/. Includes 7 Regex rules
(signatures-append.yaml) and 3 YARA rules (skillhub_vetter.yara)
covering agent memory theft, IP-based exfiltration, and browser
data theft detection.

* feat(security): add scanner Docker build context

Add Dockerfile for cisco-ai-skill-scanner container and
.env.example with LLM configuration placeholders.

* fix(security): align Finding mapping with scanner API response schema

SkillScannerApiResponse.Finding used incorrect field names (message,
location.file, location.line, code_snippet) that did not match the
scanner's actual JSON output (description, file_path, line_number,
snippet), causing all four fields to deserialize as null.

Flatten Finding to match scanner API: remove nested Location, rename
fields to description/file_path/line_number/snippet. Add skill_name
and timestamp to SkillScannerApiResponse. Extend SecurityFinding with
remediation, analyzer, and metadata fields to capture LLM analyzer
output. Retain 8-arg compact constructor for backward compatibility.

* chore(security): add debug logging to scanner response mapping

Log raw scanner API response and mapped SecurityFinding fields
side-by-side to help verify data consistency between scanner
output and database records.

* feat(security): add multi-scanner support and soft delete for security audits

- Add ScannerType enum for type-safe scanner identification
- Update V35 migration to support multiple scanners and soft delete
- Remove CASCADE delete, use code-level soft delete (deleted_at)
- Add repository methods for querying latest audit by scanner type
- Update SecurityScanService to handle scanner type parameter
- Integrate soft delete in SkillHardDeleteService
- Update all tests to use ScannerType enum

This enables multiple scanner integrations (skill-scanner, future LLM/compliance scanners)
and preserves complete audit history through soft deletion.

* feat(security): add security audit UI to review detail and skill detail pages

Display security scan results on the review detail page (full audit
section with collapsible findings) and the skill detail sidebar (compact
summary with dialog for details).  Handles empty/404 gracefully by
returning null, avoids loading shimmer flicker, and separates lifecycle
action buttons with a visual divider.

* docs(security): add security audit UI PRD

* fix(security): replace LocalDateTime with Instant in security audit and align controller test with list API

SecurityAudit and SecurityScanService used LocalDateTime.now() which
violated the project time guardrail. Replaced with Instant and
Clock.systemUTC() to match existing conventions.

Also fixed SecurityAuditControllerTest to mock the correct repository
method (findLatestActiveByVersionId) and assert against the list
response shape.

* test(security): add useQuery mock for security audit components in frontend tests

The SecurityAuditSummary and SecurityAuditSection components use
useQuery via useSecurityAudits hook, which was missing from the
@tanstack/react-query mocks in skill-detail and review-detail tests.
2026-03-23 09:56:03 +08:00
vsxd
45ef31b12f fix(label): refresh i18n label queries and visible filters 2026-03-20 17:14:23 +08:00
vsxd
e6abc83133 fix(web): avoid replaceAll in admin label form 2026-03-20 16:10:38 +08:00
vsxd
54b165e188 fix(label): harden validation and batched search sync 2026-03-20 16:10:38 +08:00
Xudong Sun
611d67f845 fix(web): update skill detail install command (#139)
* fix(web): update skill install command on detail page

* fix(web): reuse base url for skill install registry

* test(web): fix install command window mock typing
2026-03-20 15:44:09 +08:00
Xudong Sun
21ba6ee938 fea: implement skill label system end to end (#140)
* docs(label): add skill label system design spec

Covers data model, permission model, search integration,
API design, and frontend design for the label system.

* docs(label): address spec review findings

- Add CHECK constraint on label_definition.type, deny-by-default in app layer
- Use TIMESTAMPTZ consistently for all new tables
- Add (label_id) index on skill_label for filter performance
- Add label count limits (10 per skill, 100 definitions)
- Detail async rebuild strategy (Spring @Async, batch 50, error isolation)
- Clarify search_vector is GENERATED STORED column, auto-maintained
- Expand SearchQuery with labelSlugs field, detail SQL changes
- Define all API response JSON structures
- Clarify PUT update: no slug in body, full-replace translations
- Clarify hard delete with audit_log
- Add cross-namespace permission boundary (promotion scenario)
- Pre-reserve multi-label API param for future
- Clarify ClawHub compat layer: no label support in phase 1

* docs(label): address second-round spec review findings

- Fix chapter numbering (duplicate "6." → "6." + "7.")
- Move labelSlugs to end of SearchQuery record to reduce breaking change
- Add TIMESTAMPTZ convention note for new tables
- Clarify async rebuild transaction boundary (per-skill independent tx)
- Move rebuildByLabelId to app layer to preserve module boundaries
- Clarify multi-label filter uses OR semantics with AND extension path

* docs(label): fix section numbering in frontend design chapter

* Implement skill label system end to end

* Unify label app services and DTOs

* Add admin label management page

* Add label admin backend tests

* Fix merge fallout in generated schema
2026-03-20 15:26:41 +08:00
XiaoSeS
28e9049562 feat(profile): add field policy config and GET response
* feat(profile): add field policy config and GET response

Add per-field edit policy configuration (editable, requiresReview) to
application.yml and expose it in the GET /api/v1/user/profile response
via a new fieldPolicies map, enabling the frontend to dynamically render
fields based on backend-driven policies.

* feat(profile): implement mixed submission in PATCH

Split profile update changes by per-field policy: fields without
requiresReview apply immediately, fields with requiresReview enter
the pending queue. Return PARTIALLY_APPLIED status with appliedFields
and pendingFields maps when both paths trigger in a single request.

* feat(web): rewrite profile page with dynamic fields

Render profile fields dynamically from backend fieldPolicies, with
whole-page read/edit mode toggle. Handle APPLIED, PENDING_REVIEW, and
PARTIALLY_APPLIED responses. Add i18n keys for review hints and
partial-apply toasts in both en and zh.

* merge: resolve deepwiki.yml conflict with package-lock.json fix

* api schema

* fix(profile): align moderation defaults and tests

* ci(deepwiki): run crawler on release publish
2026-03-20 14:59:21 +08:00
dongmucat
8658738319 test(review): stabilize skill detail i18n assertions 2026-03-20 14:27:20 +08:00
dongmucat
fb33d376fa test(review): align review detail section copy assertions 2026-03-20 14:27:20 +08:00
dongmucat
0dea20f4be fix(select): use pointer cursor for expanded options 2026-03-20 14:27:20 +08:00
dongmucat
862328a915 test(select): pin dropdown visual contract
变更摘要:

- 为共享 Select 补充最终视觉契约回归测试,覆盖下拉阴影和选项层级

- 保持范围收敛,仅强化 shared contract,不改生产代码

- 已运行共享测试、lint 和 build 进行回归验证

关键文件:

- web/src/shared/ui/select.test.ts
2026-03-20 14:27:20 +08:00
dongmucat
192aea6e63 fix(web): restore clearable publish namespace select 2026-03-20 14:27:20 +08:00
dongmucat
c36b74fda6 feat(web): migrate shared select to radix 2026-03-20 14:27:20 +08:00
dongmucat
c116ac2167 fix(web): keep shared select native wrapper 2026-03-20 14:27:20 +08:00
dongmucat
cd8e3ee200 test(web): lock shared select theme contract 2026-03-20 14:27:20 +08:00
yun-zhi-ztl
94ecc4d0b2 feat: add super-admin hard delete skill api (#131)
* feat: add super-admin hard delete skill api

* fix: address hard delete review feedback

* fix: add missing unarchive skill locale

* docs: add skill detail hard delete design

* feat: add owner hard delete flow for skill details
2026-03-20 11:02:02 +08:00
yun-zhi-ztl
cf1ec1b89e merge: pull request #124 from feature/project-fixbug319
feat: add pending skill detail to review workflow
2026-03-19 22:16:09 +08:00
yun-zhi-ztl
7977871539 test: expand review detail regression coverage 2026-03-19 20:29:59 +08:00
yun-zhi-ztl
15d51c8ee9 fix: collapse review skill detail by default 2026-03-19 20:26:56 +08:00
vsxd
9bad6a38e2 chore(release): v0.1.0 2026-03-19 20:25:18 +08:00
yun-zhi-ztl
08b708c25b fix: keep review actions visible beside skill detail 2026-03-19 20:18:37 +08:00
XiaoSeS
9c778d5cc3 feat: add user profile update feature with moderation support
* feat: add user profile update feature with moderation support

Add ability for users to update their display name with optional machine/human review.

Backend:
- Add profile_change_request table (V15 migration)
- Add UserProfileService with moderation workflow
- Add PATCH /api/v1/user/profile and GET /api/v1/user/profile endpoints
- Add ProfileModerationService interface with NoOp implementation
- Add ProfileModerationProperties for machine/human review toggles
- Update AuthController /me to refresh session when displayName changes
- Add i18n messages for profile validation and responses

Frontend:
- Add /settings/profile page with edit-on-click pattern
- Add profileApi.updateProfile() to client
- Update user menu: add "Profile Settings", make "Security Settings" local-only
- Add i18n translations (en/zh) for profile settings

Testing:
- Add UserProfileControllerTest with 8 test cases
- Add UserProfileServiceTest with 6 test cases
- Add AuthControllerTest case for session refresh on displayName change

* version sql

* merge main

* feat: add profile review admin workflow

* feat(web): add pagination to skill review list

- useReviewList now passes page/size to backend and returns paginated response
- reviews.tsx maintains per-tab page state with prev/next controls
- namespace-reviews.tsx adapted to new response shape
- Added i18n keys for pagination (en/zh)

* feat(web): lazy-load review tabs and adjust profile review pagination

- Skill review tabs only fetch data when activated (not all 3 on mount)
- Tabs component now supports controlled mode via value prop
- Profile review page size reduced from 20 to 10
- Profile review pagination bar always visible regardless of page count

* feat(web): lazy-load profile review tabs

- useProfileReviewList now accepts enabled parameter
- Profile review tabs only fetch data when activated

* remove unnecessary file

* remove unnecessary file
2026-03-19 20:15:26 +08:00
yun-zhi-ztl
9e7c6d4563 feat: show pending skill detail in review flow 2026-03-19 20:01:47 +08:00
vsxd
f86f04a2d3 docs: align clawhub env vars with public docs 2026-03-19 17:39:38 +08:00
yun-zhi-ztl
5748018f8b Merge pull request #108 from iflytek/feature/project-fixbug319
fix: paginate governance views and add my skills filters
2026-03-19 17:37:32 +08:00
dongmucat
44936b9b11 feat: Initialize Vite configuration for React development with path aliases, server settings, and API proxies. 2026-03-19 17:32:27 +08:00
dongmucat
d6913d28aa feat(web): refine app shell layout polish
变更摘要:

- 优化应用壳布局,统一 search 与 dashboard 的内容宽度与切换时机

- 恢复 search 与 dashboard 页面的上浮入场动画,并保留 sticky header 阴影效果

- 将本次新增前端测试收纳到 web/test/app,并纳入 TypeScript 检查范围

- 同步调整 landing quick start 文案字号与本地开发代理地址

关键文件:

- web/src/app/layout.tsx

- web/src/app/layout-main-content.ts

- web/src/app/page-shell-style.ts

- web/test/app/layout-main-content.test.ts

- web/vite.config.ts
2026-03-19 17:32:27 +08:00
XiaoSeS
f2cf22b3e1 feat: add user profile update feature with moderation support
* feat: add user profile update feature with moderation support

Add ability for users to update their display name with optional machine/human review.

Backend:
- Add profile_change_request table (V15 migration)
- Add UserProfileService with moderation workflow
- Add PATCH /api/v1/user/profile and GET /api/v1/user/profile endpoints
- Add ProfileModerationService interface with NoOp implementation
- Add ProfileModerationProperties for machine/human review toggles
- Update AuthController /me to refresh session when displayName changes
- Add i18n messages for profile validation and responses

Frontend:
- Add /settings/profile page with edit-on-click pattern
- Add profileApi.updateProfile() to client
- Update user menu: add "Profile Settings", make "Security Settings" local-only
- Add i18n translations (en/zh) for profile settings

Testing:
- Add UserProfileControllerTest with 8 test cases
- Add UserProfileServiceTest with 6 test cases
- Add AuthControllerTest case for session refresh on displayName change

* version sql

* merge main

* feat: add profile review admin workflow

* feat(web): add pagination to skill review list

- useReviewList now passes page/size to backend and returns paginated response
- reviews.tsx maintains per-tab page state with prev/next controls
- namespace-reviews.tsx adapted to new response shape
- Added i18n keys for pagination (en/zh)
2026-03-19 17:23:05 +08:00
yun-zhi-ztl
4d827204bb fix: refine my skills empty states 2026-03-19 17:10:09 +08:00
yun-zhi-ztl
296c713652 fix: add my skills status filters 2026-03-19 17:06:26 +08:00
Xudong Sun
b9c4b05a0f fix: environment variable name for the registry
Signed-off-by: Xudong Sun <sun.xd@hotmail.com>
2026-03-19 17:01:16 +08:00
yun-zhi-ztl
3ba6d22c18 fix: paginate governance queries 2026-03-19 16:51:09 +08:00
yun-zhi-ztl
8665413650 fix: clamp governance inbox subtitles 2026-03-19 16:37:05 +08:00
dongmucat
e00eb84234 chore(web): remove doc injection and add crawler metadata (#102)
变更摘要:

- 移除 inject-docs 构建注入链路,build 脚本不再执行文档注入

- 删除注入脚本并移除 marked 依赖,同步更新 pnpm lockfile

- 新增 robots.txt 与 sitemap.xml,显式暴露 registry/skill.md 抓取入口

关键文件:

- web/package.json

- web/pnpm-lock.yaml

- web/scripts/inject-docs.mjs

- web/public/robots.txt

- web/public/sitemap.xml
2026-03-19 15:33:06 +08:00
vsxd
024e66d747 feat: add search index rebuild workflow 2026-03-19 15:20:08 +08:00
yun-zhi-ztl
cd570ed208 fix(web): swap password visibility toggle eye icons 2026-03-19 14:54:04 +08:00
yun-zhi-ztl
4365a9363c fix(web): remove default focus outline on user menu trigger button 2026-03-19 14:54:04 +08:00
yun-zhi-ztl
db92d17b25 fix(web): remove misleading visibility statement from publish review description 2026-03-19 14:54:04 +08:00
yun-zhi-ztl
7d8915fc7a fix(web): prevent version badges from overlapping action buttons in version list 2026-03-19 14:54:04 +08:00
yun-zhi-ztl
7222ff0f37 fix(web): add rejected badge for skill versions that failed review 2026-03-19 14:54:04 +08:00
yun-zhi-ztl
a4cb9f0cf9 fix(web): disable report button after successful submission 2026-03-19 14:54:04 +08:00
yun-zhi-ztl
1a5b8de196 fix: handle archived skill version deletion 2026-03-19 14:54:04 +08:00
yun-zhi-ztl
ac94930c94 fix: hide governance entry for unauthorized users 2026-03-19 14:54:04 +08:00
vsxd
f26a06d42f docs: simplify skillhub registry guide 2026-03-19 14:18:46 +08:00
vsxd
729b1c0498 docs: enrich frontend code documentation 2026-03-19 13:37:21 +08:00
Xudong Sun
6a62fec9e8 feat: allow spaces in profile display names (#97) 2026-03-19 11:13:52 +08:00
Xudong Sun
d126af15d8 fix:change 'Start Building' to 'Publish Skill' (#96) 2026-03-19 10:54:44 +08:00