Install
$ agentstack add skill-ychampion-cskill-agents-deferred-refresh-flag-contract ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
SKILL: Deferred Refresh Flag Contract
Domain: extensions-mcp Trigger: performBackgroundPluginInstallations completes reconcileMarketplaces and must decide whether to auto-refresh plugins or set plugins.needsRefresh via AppState. Source Pattern: Distilled from reviewed extension lifecycle and source-reconciliation patterns.
Core Method
When new marketplaces are installed (result.installed.length > 0), treat the change as urgent: clear both marketplace and plugin caches, then call refreshActivePlugins(setAppState) so MCP connections re-establish with the freshly cloned sources. If that auto-refresh fails, log the error, clear the plugin cache with a reason string, and set plugins.needsRefresh = true so the UI prompts /reload-plugins. When only updates are available (result.updated.length > 0), do not auto-refresh; instead clear caches and set needsRefresh so the user opts into the reload. needsRefresh updates must be idempotent: the setter checks prev.plugins.needsRefresh and returns early if already true.
Key Rules
- Always run
clearMarketplacesCache()before refreshing or flagging; it ensures the cached metadata is rebuilt before the next plugin load. - For installs, wrap
refreshActivePlugins(setAppState)in a try/catch. On failure, callclearPluginCache('performBackgroundPluginInstallations: auto-refresh failed')and fall back to theneedsRefreshguard that sets the flag to true only once. - For updates-only, clear the plugin cache with
clearPluginCache('performBackgroundPluginInstallations: marketplaces reconciled')so stale plugin bundles are not re-used, but leave control in the user’s hands by settingneedsRefreshinstead of forcing a reload. - The
needsRefreshsetter usessetAppState(prev => { if (prev.plugins.needsRefresh) return prev; return { ...prev, plugins: { ...prev.plugins, needsRefresh: true } }; })so the UI can show a single prompt and avoid redundant re-renders.
Example Application
After reconcileMarketplaces returns result.installed = [ ... ], the manager clears caches and calls refreshActivePlugins. If the refresh completes, caches stay clear and MCP reconnects automatically. If the refresh throws, the catch logs the failure, clears the plugin cache with a descriptive reason, and the guard flips plugins.needsRefresh so /reload-plugins shows up instead. When only result.updated is populated, the same cache-clearing and guard runs, but without trying to refresh automatically.
Anti-Patterns (What NOT to do)
- Do not auto-refresh when only marketplace updates exist; forcing a reload can interrupt long-running contexts when an update can safely wait for an explicit
/reload-plugins. - Do not leave cache-clearing out of either branch—stale marketplace metadata or plugin bundles will confuse the auto-refresh or manual reload paths.
- Do not set
needsRefreshby overwriting the object blindly; always check the previous flag so a failed refresh path does not recreate the AppState slice on every error log.
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: ychampion
- Source: ychampion/cskill-agents
- License: MIT
- Homepage: https://x.com/YashasGunderia/status/2039990540016693692?s=20
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.