[PR #168] feat: add skill ownership transfer #279

Open
opened 2026-02-15 17:16:38 -05:00 by yindo · 0 comments
Owner

📋 Pull Request Information

Original PR: https://github.com/openclaw/clawhub/pull/168
Author: @aronchick
Created: 2/7/2026
Status: 🔄 Open

Base: mainHead: feat/skill-ownership-transfer


📝 Commits (1)

  • f9db437 feat: add skill ownership transfer

📊 Changes

6 files changed (+839 additions, -9 deletions)

View changed files

📝 convex/http.ts (+7 -0)
📝 convex/httpApiV1.ts (+131 -9)
📝 convex/schema.ts (+23 -0)
convex/skillTransfers.ts (+384 -0)
📝 packages/clawdhub/src/cli.ts (+63 -0)
packages/clawdhub/src/cli/commands/transfer.ts (+231 -0)

📄 Description

Summary

Implements Phase 1 of the ownership architecture improvements: skill ownership transfer.

What This Adds

Schema

  • New skillOwnershipTransfers table tracking transfer requests
  • Status: pending → accepted/rejected/cancelled/expired
  • 7-day expiry on transfer requests

Backend (convex/skillTransfers.ts)

Mutation Description
requestTransfer Owner requests transfer to another user
acceptTransfer Recipient accepts, becomes new owner
rejectTransfer Recipient declines
cancelTransfer Owner cancels pending request
Query Description
listIncoming Pending transfers to current user
listOutgoing Pending transfers from current user
countIncoming Count for notification badge

API Routes

POST /api/v1/skills/{slug}/transfer         - Request transfer
POST /api/v1/skills/{slug}/transfer/accept  - Accept transfer
POST /api/v1/skills/{slug}/transfer/reject  - Reject transfer
POST /api/v1/skills/{slug}/transfer/cancel  - Cancel transfer
GET  /api/v1/transfers/incoming             - List incoming
GET  /api/v1/transfers/outgoing             - List outgoing

CLI

clawhub transfer request cool-skill @newowner --message "Taking over!"
clawhub transfer list                    # Show incoming requests
clawhub transfer list --outgoing         # Show outgoing requests
clawhub transfer accept cool-skill       # Accept incoming transfer
clawhub transfer reject cool-skill       # Reject incoming transfer
clawhub transfer cancel cool-skill       # Cancel outgoing transfer

Audit Trail

All transfer actions are logged to auditLogs table:

  • skill.transfer.request
  • skill.transfer.accept
  • skill.transfer.reject

What's NOT Included (Future Phases)

  • Web UI for transfers (Phase 1.5)
  • Collaborators/maintainers (Phase 2)
  • Fallback owners / orphan handling (Phase 3)
  • Organizations (Phase 4)

Testing

# Request transfer
clawhub transfer request my-skill @friend

# Recipient accepts
clawhub transfer accept my-skill

# Verify new owner
clawhub inspect my-skill

Closes #167 (Phase 1)

Greptile Overview

Greptile Summary

This PR adds Phase 1 of skill ownership transfers.

  • Data model: introduces a new skillOwnershipTransfers table (pending → accepted/rejected/cancelled/expired) with timestamps and expiry.
  • Backend: adds Convex mutations/queries to request/accept/reject/cancel transfers, plus helper internal queries for the HTTP layer.
  • HTTP API: extends the v1 skills POST router with /skills/{slug}/transfer[/accept|reject|cancel] and adds a new GET router under /api/v1/transfers/{incoming|outgoing}.
  • CLI: adds a clawhub transfer command group to request/list/accept/reject/cancel transfers via the new endpoints.

Confidence Score: 3/5

  • This PR is close to mergeable but has a correctness issue in transfer acceptance that can overwrite ownership in edge cases.
  • Core flow is implemented end-to-end (schema, Convex functions, HTTP routes, CLI), but acceptTransfer does not revalidate the skill’s current owner or deletion state at acceptance time, which can lead to incorrect ownership changes if the skill changed after the request. Minor CLI output robustness issue also present.
  • convex/skillTransfers.ts, packages/clawdhub/src/cli/commands/transfer.ts

🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.

## 📋 Pull Request Information **Original PR:** https://github.com/openclaw/clawhub/pull/168 **Author:** [@aronchick](https://github.com/aronchick) **Created:** 2/7/2026 **Status:** 🔄 Open **Base:** `main` ← **Head:** `feat/skill-ownership-transfer` --- ### 📝 Commits (1) - [`f9db437`](https://github.com/openclaw/clawhub/commit/f9db437ab986a00158700fd3620df9d2d12da84c) feat: add skill ownership transfer ### 📊 Changes **6 files changed** (+839 additions, -9 deletions) <details> <summary>View changed files</summary> 📝 `convex/http.ts` (+7 -0) 📝 `convex/httpApiV1.ts` (+131 -9) 📝 `convex/schema.ts` (+23 -0) ➕ `convex/skillTransfers.ts` (+384 -0) 📝 `packages/clawdhub/src/cli.ts` (+63 -0) ➕ `packages/clawdhub/src/cli/commands/transfer.ts` (+231 -0) </details> ### 📄 Description ## Summary Implements **Phase 1** of the [ownership architecture improvements](https://github.com/openclaw/clawhub/issues/167): skill ownership transfer. ## What This Adds ### Schema - New `skillOwnershipTransfers` table tracking transfer requests - Status: pending → accepted/rejected/cancelled/expired - 7-day expiry on transfer requests ### Backend (`convex/skillTransfers.ts`) | Mutation | Description | |----------|-------------| | `requestTransfer` | Owner requests transfer to another user | | `acceptTransfer` | Recipient accepts, becomes new owner | | `rejectTransfer` | Recipient declines | | `cancelTransfer` | Owner cancels pending request | | Query | Description | |-------|-------------| | `listIncoming` | Pending transfers to current user | | `listOutgoing` | Pending transfers from current user | | `countIncoming` | Count for notification badge | ### API Routes ``` POST /api/v1/skills/{slug}/transfer - Request transfer POST /api/v1/skills/{slug}/transfer/accept - Accept transfer POST /api/v1/skills/{slug}/transfer/reject - Reject transfer POST /api/v1/skills/{slug}/transfer/cancel - Cancel transfer GET /api/v1/transfers/incoming - List incoming GET /api/v1/transfers/outgoing - List outgoing ``` ### CLI ```bash clawhub transfer request cool-skill @newowner --message "Taking over!" clawhub transfer list # Show incoming requests clawhub transfer list --outgoing # Show outgoing requests clawhub transfer accept cool-skill # Accept incoming transfer clawhub transfer reject cool-skill # Reject incoming transfer clawhub transfer cancel cool-skill # Cancel outgoing transfer ``` ## Audit Trail All transfer actions are logged to `auditLogs` table: - `skill.transfer.request` - `skill.transfer.accept` - `skill.transfer.reject` ## What's NOT Included (Future Phases) - [ ] Web UI for transfers (Phase 1.5) - [ ] Collaborators/maintainers (Phase 2) - [ ] Fallback owners / orphan handling (Phase 3) - [ ] Organizations (Phase 4) ## Testing ```bash # Request transfer clawhub transfer request my-skill @friend # Recipient accepts clawhub transfer accept my-skill # Verify new owner clawhub inspect my-skill ``` Closes #167 (Phase 1) <!-- greptile_comment --> <h2>Greptile Overview</h2> <h3>Greptile Summary</h3> This PR adds Phase 1 of skill ownership transfers. - **Data model:** introduces a new `skillOwnershipTransfers` table (pending → accepted/rejected/cancelled/expired) with timestamps and expiry. - **Backend:** adds Convex mutations/queries to request/accept/reject/cancel transfers, plus helper internal queries for the HTTP layer. - **HTTP API:** extends the v1 skills POST router with `/skills/{slug}/transfer[/accept|reject|cancel]` and adds a new GET router under `/api/v1/transfers/{incoming|outgoing}`. - **CLI:** adds a `clawhub transfer` command group to request/list/accept/reject/cancel transfers via the new endpoints. <h3>Confidence Score: 3/5</h3> - This PR is close to mergeable but has a correctness issue in transfer acceptance that can overwrite ownership in edge cases. - Core flow is implemented end-to-end (schema, Convex functions, HTTP routes, CLI), but `acceptTransfer` does not revalidate the skill’s current owner or deletion state at acceptance time, which can lead to incorrect ownership changes if the skill changed after the request. Minor CLI output robustness issue also present. - convex/skillTransfers.ts, packages/clawdhub/src/cli/commands/transfer.ts <!-- greptile_other_comments_section --> <!-- /greptile_comment --> --- <sub>🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.</sub>
yindo added the pull-request label 2026-02-15 17:16:38 -05:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: openclaw/clawhub#279