feat: Doraemon Skills kit — dt-skill CLI, registry API, and marketplace UISkills kit support#86
Merged
Merged
Conversation
…ness for API routes
…proved structure and functionality
Drop unimplemented OpenClaw package commands, bulk sync workflow, and clawdbot workspace discovery so the CLI focuses on core skill operations. Co-authored-by: Cursor <cursoragent@cursor.com>
Align registry discovery, env vars, and local state with dt-skill naming and rename backend clawhub modules to skillsRegistry. Co-authored-by: Cursor <cursoragent@cursor.com>
Revert accidental version bump, rename SkillCard styles to style.scss, and remove internal plan artifact. Co-authored-by: Cursor <cursoragent@cursor.com>
prettier 2.7.1 cannot parse the satisfies operator, which broke the prettier CI step and silently masked downstream lint/typecheck/build failures. Replace satisfies with an explicit Promise<FetchedGitHubSource> return type, then format the rest of the repo to match the configured prettier rules.
With the prettier step finally green, eslint, stylelint, and the rest of the CI pipeline ran for the first time on this branch and surfaced pre-existing failures. Address them so the pipeline can be green end-to-end: - eslint --fix to apply autofixable rules across the repo - stylelint --fix to normalize hex casing in scss - ignore dt-skill/dist/ from eslint (build artifacts) - drop unused imports/vars and a redundant try/catch - rename Promise constructor params to (resolve, reject) - silence no-throw-literal where the test deliberately throws a non-Error
- C2: extract normalizeRelativePath into shared util; normalize stored paths in publish/buildSkillZip to prevent zip-slip - C3: wrap publishSkill in a transaction and use SkillsSource findOrCreate to remove race and dirty data - I1: fail loudly on file read errors during publish instead of silently storing empty skills - I2: persist lockfile inside cmdUpdate loop so a crash no longer drifts it - I3: guard fetchLikeStatus with a cancel flag to avoid races on fast navigation - I4: add safeOpenUrl to restrict window.open to http(s) - I6: stop rendering the placeholder comment as a copyable command - I8: cap zip entry count and total bytes in extractZipToDir to prevent zip bombs - UX: show child skill count in multi-skill package import message
Contributor
Author
added 4 commits
July 1, 2026 10:40
- .detail-main-column.is-package: max-width 1280/1600/1780/2200 via @media (1600/1920/2560) - min-width: 0 + width: 100% + align-self: center to fix grid item shrink - .detail-hero-main: padding 24px 32px, border-radius 12px, gap 14px - .skill-card-unified.is-compact: padding 20px 22px, icon 48px, name 16px, desc 14px - <Row gutter={[24, 24]}> in SkillDetailHero for wider card gutters - .skill-card-unified.is-compact min-height 132px
- .prettierignore: ignore dt-skill/dist/ and run/ (build/runtime output, already in .gitignore but prettier does not read .gitignore) - app/web/pages/skills/index.tsx: drop extra space in empty blocks - app/service/skillsRegistry.js: fix indent in object literal - test/skills-registry-contract.test.js: drop extra space in empty blocks - CLAUDE.md: replace duplicated copy with symlink to AGENTS.md
- Extract agent definitions to src/cli/agents/definitions.ts (data layer) - Add src/cli/installer.ts for canonical .agents/skills physical install - Update skills command, publish, ui, types, and test kit for the split - Stage .serena config
- Extract Lockfile module (src/lockfile.ts): own read/write/pin helpers
and LockfileEntry type; drop the `as { version?... }` cast at the
lockfile entry read site
- Type package children as SkillChild[] in ApiV1SkillResponseSchema;
remove the two `as any` casts in the package expand branches
- Extract install pipeline (src/cli/installerPipeline.ts): the
download→extract→origin→link→lock sequence takes an injected
InstallPipelineHttp adapter (real in prod, fake in tests) so the
deepest install logic is its own module, not inlined in the command
- Collapse the duplicated suspicious-moderation decision tree and
version-verify into checkSuspiciousModeration / verifyVersion helpers,
preserving the exact pre-flight ordering the tests assert
- Move lockfile unit tests to src/lockfile.test.ts; add pipeline http
seam test and a package-children schema test
Contributor
Author
added 3 commits
July 1, 2026 19:24
getSkillFileContent used the raw filePath from the request for the DB lookup without passing it through normalizeRelativePath, unlike buildSkillZip and the upload flow. Route the query path through the shared guard and return null on invalid input so the controller's 404 stays uniform. Add a behavior test pinning normalizeRelativePath.
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.


提交的变更类型是
相关链接
(无外部 issue 链接)
需求描述和解决方案
描述
为 Doraemon Skills 市场补齐端到端工具链:服务端 ClawHub 兼容 API、前端技能详情/列表体验、以及独立的
dt-skillCLI。同时统一 skill fingerprint 规则,并移除已无登录入口的 Registry 鉴权残留。解决方案
服务端(Egg.js)
clawhub/skills服务:搜索、安装、发布、指纹解析、composite list cursor 等/api/v1/*能力skillsStorageReady中间件,在/api/v1/*路由层统一ensureStorageReady,避免各 handler 重复调用contracts/skill-fingerprint/作为 CLI 与服务端共享的 fingerprint 契约(扩展名白名单 + golden vectors)CLI(
dt-skill/)skillFingerprintContract适配层复用主仓契约前端
SkillDetailContent为 shell + 子组件(文件树、文档区、安装面板、Hero)测试
clawhub-contract、clawhub-integration、skill-fingerprint-contract、skills-storage-ready-middleware等dt-skill:Vitest 单元测试 + built CLI artifact 测试变更规模: 8 commits,
master...skills-kit-support,117 files(+46k / −1.4k lines)自查清单
Test plan
node --test test/clawhub-contract.test.js test/clawhub-integration.test.js test/skill-fingerprint-contract.test.js test/skills-storage-ready-middleware.test.jscd dt-skill && npm run build && npm run test:srcnpm run check-types(前端 TypeScript)npm run dev打开技能详情页,验证安装/文件浏览/子 skill 展示dt-skill search/install/publish指向本地 registry(--registry http://127.0.0.1:7001)