{"id":"891663c4-5850-446c-bb89-b6bb36e870fa","shortId":"AcGtct","kind":"skill","title":"nonblocking-plugin-install-status-projection","tagline":"Map async marketplace reconciliation events into AppState rows so UIs show install/installing/failed badges without blocking.","description":"# SKILL: Nonblocking Plugin Install Status Projection\n**Domain:** extensions-mcp  \n**Trigger:** Use when marketplace reconciliation emits progress events but the main UI must remain responsive with up-to-date status rows.\n**Source Pattern:** Distilled from reviewed extension lifecycle and source-reconciliation patterns.\n\n## Core Method\nBefore the async reconciliation runs, seed AppState with `pending` rows for every diffed marketplace. Pass a shared updater into the reconciler’s `onProgress` hook that maps each event type (`installing`, `installed`, `failed`) to the corresponding AppState entry by marketplace name, keeping the rest of the state untouched. When an event includes an error, annotate that marketplace row so the UI can reveal diagnostics while still letting other installers continue running.\n\n## Key Rules\n- Always update AppState immutably via `setAppState(prev => ({ ...prev, plugins: { ...prev.plugins, installationStatus: { ... }}}))` to avoid clobbering unrelated UI state.\n- Use a central helper like `updateMarketplaceStatus` so each event only updates the matching `marketplaces` entry (by name) and nothing else.\n- Include event-specific metadata (`status`, optional `error`) in the row so the UI can show spinners, success checks, or failure hints.\n- Keep this projection logic outside the main reconciling flow so the long-running `reconcileMarketplaces` call never awaits UI updates; it merely fires events.\n\n## Example Application\nIf your agent tracks multiple plugin sources, apply this skill to emit nonblocking status rows for each install progress report so the user can monitor clones without stalling the command loop.\n\n## Anti-Patterns (What NOT to do)\n- Do not mutate the AppState array in place or replace `installationStatus` wholesale; that would drop other concurrent progress rows.\n- Do not ignore the `error` payload on failures, or the UI will never explain why a marketplace install failed.\n- Avoid waiting for the entire reconciliation to finish before updating statuses; the whole point is incremental feedback.","tags":["nonblocking","plugin","install","status","projection","cskill","agents","ychampion","agent-skills","ai-agents","cli","coding-agents"],"capabilities":["skill","source-ychampion","skill-nonblocking-plugin-install-status-projection","topic-agent-skills","topic-ai-agents","topic-cli","topic-coding-agents","topic-context-engineering","topic-developer-tools","topic-mcp","topic-multi-agent","topic-terminal-ui"],"categories":["cskill-agents"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/ychampion/cskill-agents/nonblocking-plugin-install-status-projection","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add ychampion/cskill-agents","source_repo":"https://github.com/ychampion/cskill-agents","install_from":"skills.sh"}},"qualityScore":"0.467","qualityRationale":"deterministic score 0.47 from registry signals: · indexed on github topic:agent-skills · 34 github stars · SKILL.md body (2,065 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-04-22T00:56:53.195Z","embedding":null,"createdAt":"2026-04-18T22:20:48.735Z","updatedAt":"2026-04-22T00:56:53.195Z","lastSeenAt":"2026-04-22T00:56:53.195Z","tsv":"'agent':227 'alway':140 'annot':121 'anti':257 'anti-pattern':256 'appli':232 'applic':224 'appstat':13,74,103,142,267 'array':268 'async':8,70 'avoid':152,301 'await':216 'badg':19 'block':21 'call':214 'central':159 'check':195 'clobber':153 'clone':250 'command':254 'concurr':279 'continu':136 'core':66 'correspond':102 'date':51 'diagnost':130 'dif':80 'distil':56 'domain':28 'drop':277 'els':176 'emit':37,236 'entir':305 'entri':104,171 'error':120,184,286 'event':11,39,95,117,165,179,222 'event-specif':178 'everi':79 'exampl':223 'explain':295 'extens':30,59 'extensions-mcp':29 'fail':99,300 'failur':197,289 'feedback':317 'finish':308 'fire':221 'flow':207 'helper':160 'hint':198 'hook':91 'ignor':284 'immut':143 'includ':118,177 'increment':316 'instal':4,25,97,98,135,242,299 'install/installing/failed':18 'installationstatus':150,273 'keep':108,199 'key':138 'let':133 'lifecycl':60 'like':161 'logic':202 'long':211 'long-run':210 'loop':255 'main':42,205 'map':7,93 'marketplac':9,35,81,106,123,170,298 'match':169 'mcp':31 'mere':220 'metadata':181 'method':67 'monitor':249 'multipl':229 'must':44 'mutat':265 'name':107,173 'never':215,294 'nonblock':2,23,237 'nonblocking-plugin-install-status-project':1 'noth':175 'onprogress':90 'option':183 'outsid':203 'pass':82 'pattern':55,65,258 'payload':287 'pend':76 'place':270 'plugin':3,24,148,230 'point':314 'prev':146,147 'prev.plugins':149 'progress':38,243,280 'project':6,27,201 'reconcil':88,206 'reconcilemarketplac':213 'reconcili':10,36,64,71,306 'remain':45 'replac':272 'report':244 'respons':46 'rest':110 'reveal':129 'review':58 'row':14,53,77,124,187,239,281 'rule':139 'run':72,137,212 'seed':73 'setappst':145 'share':84 'show':17,192 'skill':22,234 'skill-nonblocking-plugin-install-status-projection' 'sourc':54,63,231 'source-reconcili':62 'source-ychampion' 'specif':180 'spinner':193 'stall':252 'state':113,156 'status':5,26,52,182,238,311 'still':132 'success':194 'topic-agent-skills' 'topic-ai-agents' 'topic-cli' 'topic-coding-agents' 'topic-context-engineering' 'topic-developer-tools' 'topic-mcp' 'topic-multi-agent' 'topic-terminal-ui' 'track':228 'trigger':32 'type':96 'ui':16,43,127,155,190,217,292 'unrel':154 'untouch':114 'up-to-d':48 'updat':85,141,167,218,310 'updatemarketplacestatus':162 'use':33,157 'user':247 'via':144 'wait':302 'whole':313 'wholesal':274 'without':20,251 'would':276","prices":[{"id":"4d1a2474-cf4d-453e-9887-ee220d281347","listingId":"891663c4-5850-446c-bb89-b6bb36e870fa","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"ychampion","category":"cskill-agents","install_from":"skills.sh"},"createdAt":"2026-04-18T22:20:48.735Z"}],"sources":[{"listingId":"891663c4-5850-446c-bb89-b6bb36e870fa","source":"github","sourceId":"ychampion/cskill-agents/nonblocking-plugin-install-status-projection","sourceUrl":"https://github.com/ychampion/cskill-agents/tree/main/skills/nonblocking-plugin-install-status-projection","isPrimary":false,"firstSeenAt":"2026-04-18T22:20:48.735Z","lastSeenAt":"2026-04-22T00:56:53.195Z"}],"details":{"listingId":"891663c4-5850-446c-bb89-b6bb36e870fa","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"ychampion","slug":"nonblocking-plugin-install-status-projection","github":{"repo":"ychampion/cskill-agents","stars":34,"topics":["agent-skills","ai-agents","cli","coding-agents","context-engineering","developer-tools","mcp","multi-agent","terminal-ui"],"license":"mit","html_url":"https://github.com/ychampion/cskill-agents","pushed_at":"2026-04-04T14:13:23Z","description":"Agent skills for coding CLIs, multi-agent runtimes, context engines, MCP extensions, and terminal tooling. Instead of using claude code's source code, give your agent skills to create your own!","skill_md_sha":"77cf866f4ec6b7b5bfe28bd19a40a50088fd75b2","skill_md_path":"skills/nonblocking-plugin-install-status-projection/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/ychampion/cskill-agents/tree/main/skills/nonblocking-plugin-install-status-projection"},"layout":"multi","source":"github","category":"cskill-agents","frontmatter":{"name":"nonblocking-plugin-install-status-projection","description":"Map async marketplace reconciliation events into AppState rows so UIs show install/installing/failed badges without blocking."},"skills_sh_url":"https://skills.sh/ychampion/cskill-agents/nonblocking-plugin-install-status-projection"},"updatedAt":"2026-04-22T00:56:53.195Z"}}