Skip to content

feat: add skill, mcp, and changes to mobile app#31

Merged
sirily11 merged 7 commits into
mainfrom
skill-tip
May 20, 2026
Merged

feat: add skill, mcp, and changes to mobile app#31
sirily11 merged 7 commits into
mainfrom
skill-tip

Conversation

@sirily11
Copy link
Copy Markdown
Contributor

No description provided.

sirily11 and others added 7 commits May 20, 2026 22:42
Add RxCodeWidget extension with Live Activity support to display
running job status, including the MobileLiveActivityCoordinator and
app group entitlements for sharing data between the app and widget.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
The desktop issued a fresh push-to-start every time a session began
streaming, and ended the activity with an auto-dismissal date when it
stopped. Re-running the same thread therefore spent a new push-to-start
each time, exhausting the iOS push-to-start budget. Once the budget is
exhausted, liveactivitiesd accepts the APNs push but silently refuses to
start the activity, so the Live Activity never appears.

Now an activity is created once per session and reused for its lifetime:
it flips between "running" and "done" via update pushes and is never
ended or auto-dismissed by the desktop. The user dismisses it manually.
The mobile coordinator observes activityStateUpdates and reports the
dismissal so the desktop forgets the activity and the next run of that
session starts a fresh one.

- Payload: add LiveActivityTokenPayload.activityDismissed
- MobileLiveActivityCoordinator: observe activityStateUpdates, report
  dismissal/end to the desktop
- MobileSyncService: reuse the activity (running <-> done), drop
  sendLiveActivityEnd and the dismissal-date, handle the dismissal
  signal, track isDone per job

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Add `extraSystemPrompt` to BackendSendRequest and thread it through
  ClaudeService into a single `--append-system-prompt` value
- Surface the current branch briefing and installed-skill context to
  the Claude agent as background context
- Fetch OpenAI curated skills into the marketplace, store SKILL.md
  instructions, and clip skill prompt context to a token budget
- Defer Live Activity push-to-start so a foregrounded device can start
  the activity locally without spending the push-to-start budget
- Show an active-jobs chip on mobile briefing cards

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings May 20, 2026 18:08
@vercel
Copy link
Copy Markdown

vercel Bot commented May 20, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
rxcode Ready Ready Preview, Comment May 20, 2026 6:08pm

Request Review

@sirily11 sirily11 enabled auto-merge (squash) May 20, 2026 18:08
@autopilot-project-manager autopilot-project-manager Bot added the enhancement New feature or request label May 20, 2026
@sirily11 sirily11 merged commit f661042 into main May 20, 2026
8 checks passed
@sirily11 sirily11 deleted the skill-tip branch May 20, 2026 18:11
Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR adds iOS widget + Live Activity support for tracking ongoing RxCode jobs, expands the mobile companion to remotely manage desktop configuration (skills, ACP clients, MCP servers) and view per-thread changes, and updates the desktop + relay server plumbing to support these new capabilities (including new marketplace sources and push delivery modes).

Changes:

  • Added a WidgetKit extension + shared App Group snapshot store, and implemented an aggregate “jobs” Live Activity (push-to-start + update token flow).
  • Added mobile screens for Skills / ACP Clients / MCP Servers management plus a “View Changes” sheet and supporting desktop sync events.
  • Updated the relay /push endpoint to support liveactivity and background push types, and expanded marketplace + Git cloning support.

Reviewed changes

Copilot reviewed 64 out of 64 changed files in this pull request and generated 5 comments.

Show a summary per file
File Description
RxCodeWidget/RxCodeWidgetLiveActivity.swift Implements Dynamic Island + lock screen UI for an aggregate jobs Live Activity.
RxCodeWidget/RxCodeWidgetData.swift Defines the shared widget snapshot model + App Group storage helpers.
RxCodeWidget/RxCodeWidgetBundle.swift Registers the widget + live activity in a WidgetBundle.
RxCodeWidget/RxCodeWidget.swift Implements the home-screen widget timeline + UI.
RxCodeWidget/RxCodeWidget.entitlements Adds App Group entitlement for widget extension.
RxCodeWidget/RxCodeJobActivity.swift Defines shared ActivityKit attributes/content-state wire contract.
RxCodeWidget/Info.plist Widget extension Info.plist.
RxCodeWidget/Assets.xcassets/WidgetBackground.colorset/Contents.json Widget asset catalog entry.
RxCodeWidget/Assets.xcassets/Contents.json Widget asset catalog metadata.
RxCodeWidget/Assets.xcassets/AppIcon.appiconset/Contents.json Widget extension icon set metadata.
RxCodeWidget/Assets.xcassets/AccentColor.colorset/Contents.json Widget accent color asset metadata.
RxCodeMobile/Views/ThreadChangesSheet.swift New mobile sheet to view thread edits + uncommitted git changes and drill into diffs.
RxCodeMobile/Views/QRScannerView.swift Keeps AVCapture preview correctly rotated (notably iPad).
RxCodeMobile/Views/ProjectsSidebar.swift Adds TipKit popover tips to key sidebar controls.
RxCodeMobile/Views/OnboardingView.swift Adds TipKit pairing tip on onboarding actions.
RxCodeMobile/Views/NewThreadSheet.swift Adds TipKit tips to config controls and changes interactive dismissal behavior.
RxCodeMobile/Views/MobileTips.swift Defines mobile TipKit tips used across views.
RxCodeMobile/Views/MobileSkillMarketView.swift New mobile skills marketplace browser + install/remove + custom git sources.
RxCodeMobile/Views/MobileSettingsView.swift Adds “Desktop Configuration” section + TipKit tips for settings controls.
RxCodeMobile/Views/MobileMCPServersView.swift New mobile MCP server list + add/edit form + enable/disable + remove flow.
RxCodeMobile/Views/MobileChatView.swift Adds “View Changes” action and presents ThreadChangesSheet.
RxCodeMobile/Views/MobileBriefingView.swift Adds active-job count chip per project + TipKit briefing tip.
RxCodeMobile/Views/MobileACPClientsView.swift New mobile ACP client manager (installed + registry install/remove/enable).
RxCodeMobile/State/MobileLiveActivityCoordinator.swift iOS-side Live Activity token observation + local-start coordination.
RxCodeMobile/State/MobileAppState.swift Adds state + request/response handling for skills/ACP/MCP + thread changes + widget snapshot refresh.
RxCodeMobile/RxCodeMobileApp.swift Configures TipKit and binds the live activity coordinator at app start.
RxCodeMobile/RxCodeMobile.entitlements Adds App Group entitlement for the mobile app.
RxCodeMobile/Info.plist Enables Live Activities (incl. frequent updates).
RxCodeMobile/AppDelegate.swift Handles widget snapshot background pushes and updates App Group store.
RxCode/Views/UserManualView.swift Updates manual copy from “plugins” to “skills” marketplace messaging.
RxCode/Views/Tips/RxCodeTips.swift Adds desktop TipKit tips for key features (MCP/ACP/mobile/briefing/search/etc.).
RxCode/Views/Sidebar/ProjectTreeView.swift Adds TipKit tip to briefing button in sidebar.
RxCode/Views/SettingsView.swift Adds Skill Marketplace as a settings tab and wires TipKit tips.
RxCode/Views/Settings/MobileSettingsTab.swift Adds TipKit tip to pairing UI.
RxCode/Views/Settings/MCPSettingsTab.swift Adds TipKit tip to MCP settings.
RxCode/Views/Settings/ACPClientSettingsTab.swift Adds TipKit tip to ACP settings.
RxCode/Views/MainView.swift Adds TipKit tips for global search and agent selection controls.
RxCode/Views/Chat/SkillMarketView.swift Adds custom git sources UI and switches install/remove to RxCode-managed state.
RxCode/Views/Chat/GitHubSheet.swift Adds “Custom” repos tab with add/clone/remove flows.
RxCode/Services/PersistenceService.swift Persists custom git repo list to disk.
RxCode/Services/NotificationService.swift Adds local notification for remote desktop config changes.
RxCode/Services/MobileSyncService.swift Adds Live Activity + widget push orchestration and mobile remote-config request routing.
RxCode/Services/MCPService.swift Adds globalRecords() to return full MCP server records for editing UIs.
RxCode/Services/MarketplaceService.swift Adds OpenAI skills ingestion, custom git marketplace sources, and RxCode-owned skill install state.
RxCode/Services/GitHubService.swift Adds clone-by-URL helper (git clone to specified path).
RxCode/Services/ClaudeService.swift Adds per-request extraSystemPrompt support and merges system prompt append sections.
RxCode/App/RxCodeApp.swift Configures TipKit in the macOS app.
RxCode.xcodeproj/xcshareddata/xcschemes/RxCodeMobile.xcscheme Adds mobile test targets to the scheme.
RxCode.xcodeproj/project.pbxproj Adds a WidgetKit extension target and embeds it in the mobile app.
relay-server/README.md Documents new /push delivery modes (alert, liveactivity, background).
relay-server/push.go Implements new push delivery modes and raw payload forwarding.
README.md Updates top-level feature list to reflect skills marketplace changes.
Packages/Sources/RxCodeCore/Utilities/GitHelper.swift Adds helper to compute staged/unstaged/untracked diffs for “uncommitted changes”.
Packages/Sources/RxCodeCore/Models/MarketplacePlugin.swift Extends marketplace models for sources/custom sources and RxCode-owned install records.
Packages/Sources/RxCodeCore/Models/GitHubModels.swift Adds CustomRepo model.
Packages/Sources/RxCodeCore/Backend/BackendCapability.swift Adds .skills capability and enables it for providers.
Packages/Sources/RxCodeCore/Backend/AgentBackend.swift Adds extraSystemPrompt to backend send request.
Packages/Sources/RxCodeChatKit/MessageListView.swift Removes scroll-phase-based Textual selection toggling.
Packages/Sources/RxCodeChatKit/MarkdownView.swift Disables Textual text selection permanently to avoid scroll jank.
Packages/Sources/RxCodeChatKit/InputBarView.swift Adds TipKit popover tip for plan mode.
Packages/Sources/RxCodeChatKit/FeatureTips.swift Defines ChatFeature TipKit tips.
Packages/Sources/RxCodeChatKit/ChangeDiffView.swift Adds a full-screen diff renderer for mobile “View Changes” detail.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread relay-server/push.go
Comment on lines +149 to 153
payloadBytes, _ := notif.Payload.([]byte)
log.Printf(
"apns push send: device=%s category=%q collapse_id=%q collapse_len=%d payload_bytes=%d enc_bytes=%d",
short(req.DeviceToken),
req.Category,
req.CollapseID,
len(req.CollapseID),
len(raw),
len(req.EncryptedAlertB64),
"apns push send: mode=%s device=%s category=%q collapse_id=%q payload_bytes=%d",
mode, short(req.DeviceToken), req.Category, req.CollapseID, len(payloadBytes),
)
Comment thread relay-server/push.go
Comment on lines 96 to +101
// pushHandler returns an http.HandlerFunc that signs and forwards APNs pushes.
//
// Auth is intentionally minimal in v1: any client may submit, since the
// payload itself is E2E-encrypted to the recipient device. A future hardening
// pass should require a signed sender token (see plan: risk areas).
// Auth is intentionally minimal in v1: any client may submit, since the alert
// payload itself is E2E-encrypted to the recipient device. Live Activity and
// widget payloads are not encrypted (ActivityKit / WidgetKit consume them
// directly); a future hardening pass should require a signed sender token.
Comment on lines +105 to +109
Toggle("", isOn: Binding(
get: { server.isGloballyEnabled },
set: { value in Task { await state.setMCPServerEnabled(server.name, enabled: value) } }
))
.labelsHidden()
Comment on lines +429 to +432
let clonePath = "\(home)/RxCode/\(repo.name)"
let fm = FileManager.default
if !fm.fileExists(atPath: "\(home)/RxCode") {
try fm.createDirectory(atPath: "\(home)/RxCode", withIntermediateDirectories: true)
Comment on lines +725 to +729
func requestThreadChanges(sessionID: String) async {
guard isPaired else { return }
let requestID = UUID()
pendingThreadChangesID = requestID
isLoadingThreadChanges = true
@sirily11
Copy link
Copy Markdown
Contributor Author

🎉 This PR is included in version 1.8.0 🎉

The release is available on GitHub release

Your semantic-release bot 📦🚀

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request released

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants