{"_id":"@async23/pi-skill-control","_rev":"6-3b3bc2b8994f8c741ad08f26dd87421a","name":"@async23/pi-skill-control","dist-tags":{"latest":"0.6.0"},"versions":{"0.3.2":{"name":"@async23/pi-skill-control","version":"0.3.2","keywords":["pi-package","pi-coding-agent","skills","skill-control"],"license":"MIT","_id":"@async23/pi-skill-control@0.3.2","maintainers":[{"name":"async23","email":"gearrr005@gmail.com"}],"homepage":"https://github.com/Async23/pi-packages/tree/main/packages/skill-control#readme","bugs":{"url":"https://github.com/Async23/pi-packages/issues"},"pi":{"extensions":["./extensions/index.ts"]},"dist":{"shasum":"3be0f4c35a81f7b5ec2bdeb11863fc5e3d8a4376","tarball":"https://registry.npmjs.org/@async23/pi-skill-control/-/pi-skill-control-0.3.2.tgz","fileCount":5,"integrity":"sha512-0zEX0S36+KMlaewLFo2mZNZwTsiclj89ibawNF+GtMIm4kxiArjecUlDI/nzCLzlBWbAerBA/7H5sfuQJaxCUg==","signatures":[{"sig":"MEUCIDkuREOckLqUI27pUqbnHKhJqeMJTxzEf3Ei/7y29uwsAiEA0M0wPb3rc2lsppJ/wvebAV9pb1epDgXPlZgmPo17QWU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":66540},"type":"module","gitHead":"ba273a9b3ef7a0ed949b9d4747e583228d3afc4f","_npmUser":{"name":"async23","email":"gearrr005@gmail.com"},"repository":{"url":"git+https://github.com/Async23/pi-packages.git","type":"git","directory":"packages/skill-control"},"_npmVersion":"11.17.0","description":"Control model and direct user access for every Skill discovered by Pi","directories":{},"_nodeVersion":"26.5.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-skill-control_0.3.2_1785515215583_0.776526624894947","host":"s3://npm-registry-packages-npm-production"}},"0.3.3":{"name":"@async23/pi-skill-control","version":"0.3.3","keywords":["pi-package","pi-coding-agent","skills","skill-control"],"license":"MIT","_id":"@async23/pi-skill-control@0.3.3","maintainers":[{"name":"async23","email":"gearrr005@gmail.com"}],"homepage":"https://github.com/Async23/pi-packages/tree/main/packages/skill-control#readme","bugs":{"url":"https://github.com/Async23/pi-packages/issues"},"pi":{"extensions":["./extensions/index.ts"]},"dist":{"shasum":"9f4dc15540d595902a7191dbcca1787695a71634","tarball":"https://registry.npmjs.org/@async23/pi-skill-control/-/pi-skill-control-0.3.3.tgz","fileCount":5,"integrity":"sha512-67pnsosW/2Jc6rpDMNhxNHuqx8HFgU/Bh5EYvlMpqvc1xrGUhk9/KeqVKqix5X2OpdS7cTN+XF9oUvIFzD1C/A==","signatures":[{"sig":"MEQCICpB89QPQyIwqPk6FNP0tSI8qHBKJdmo3CYiS+Ak7sD1AiBpDVfaWnnhtJzC8CuxDUZUa8EnQVz5Rw0RHiuoX/3p6g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":75890},"type":"module","gitHead":"074ed2413405d043ad21fc41672fe18dbf2eb3ce","_npmUser":{"name":"async23","email":"gearrr005@gmail.com"},"repository":{"url":"git+https://github.com/Async23/pi-packages.git","type":"git","directory":"packages/skill-control"},"_npmVersion":"11.17.0","description":"Control model and direct user access for every Skill discovered by Pi","directories":{},"_nodeVersion":"26.5.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-skill-control_0.3.3_1785520936943_0.3419466808386309","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@async23/pi-skill-control","version":"0.5.0","keywords":["pi-package","pi-coding-agent","skills","skill-control"],"license":"MIT","_id":"@async23/pi-skill-control@0.5.0","maintainers":[{"name":"async23","email":"gearrr005@gmail.com"}],"homepage":"https://github.com/Async23/pi-packages/tree/main/packages/skill-control#readme","bugs":{"url":"https://github.com/Async23/pi-packages/issues"},"pi":{"extensions":["./extensions/index.ts"]},"dist":{"shasum":"5fffafe2cd43a6dd75a0745abcd4bf5baafec15b","tarball":"https://registry.npmjs.org/@async23/pi-skill-control/-/pi-skill-control-0.5.0.tgz","fileCount":6,"integrity":"sha512-rehv3bfEIsY+G+GMvOfGYChxzbEm/Jp7XI+m1u8kge4XGLy5rj4c6D99oCnidNOns2wiUdtW7bPuH+UYVPQD/Q==","signatures":[{"sig":"MEQCICO6bHcYibwN4Pf8jnBq/IalLHU9MBtBKfFTKWnAs0v4AiBNGItUTUGqoIIMQ5y4JRgMGDxRXM3fbOLSmg9m+SlvdQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@async23%2fpi-skill-control@0.5.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":92822},"type":"module","gitHead":"4e36a65cb81ea5364bcd01fe85de420e6c0298b4","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a530debc-3e6a-43ad-8ef5-f217194bfc07"}},"repository":{"url":"git+https://github.com/Async23/pi-packages.git","type":"git","directory":"packages/skill-control"},"_npmVersion":"11.17.0","description":"Control Skill availability in Pi while showing native invocation routes","directories":{},"_nodeVersion":"24.18.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-skill-control_0.5.0_1785832182401_0.48862680783331225","host":"s3://npm-registry-packages-npm-production"}},"0.5.1":{"name":"@async23/pi-skill-control","version":"0.5.1","keywords":["pi-package","pi-coding-agent","skills","skill-control"],"license":"MIT","_id":"@async23/pi-skill-control@0.5.1","maintainers":[{"name":"async23","email":"gearrr005@gmail.com"}],"homepage":"https://github.com/Async23/pi-packages/tree/main/packages/skill-control#readme","bugs":{"url":"https://github.com/Async23/pi-packages/issues"},"pi":{"extensions":["./extensions/index.ts"]},"dist":{"shasum":"744212cc3b45e1fd7d117270e1ed99c03b438db2","tarball":"https://registry.npmjs.org/@async23/pi-skill-control/-/pi-skill-control-0.5.1.tgz","fileCount":6,"integrity":"sha512-HfWVRlV+tG/c3US4qWpu+Zj3Itp6WFDhBbrp/DpiJRqthahZofOh3iD1H/bWYSvo/cKrc0FtbuV+SaAQmIklrg==","signatures":[{"sig":"MEUCIQDW0OLSpl8SPGE9bFslDum9G5m00EH+P9XwfzVt++g/pQIgCPOq2twmkhRyFRAjGaZcNrpzihN1Cn2Bn7+NzZhOQ6s=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@async23%2fpi-skill-control@0.5.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":92046},"type":"module","gitHead":"15852fbd4d4aad5499c13ff1c05614a34e19f047","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a530debc-3e6a-43ad-8ef5-f217194bfc07"}},"repository":{"url":"git+https://github.com/Async23/pi-packages.git","type":"git","directory":"packages/skill-control"},"_npmVersion":"11.17.0","description":"Control Skill availability in Pi while showing native invocation routes","directories":{},"_nodeVersion":"24.19.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-skill-control_0.5.1_1786089360019_0.6397647373143758","host":"s3://npm-registry-packages-npm-production"}},"0.5.2":{"name":"@async23/pi-skill-control","version":"0.5.2","keywords":["pi-package","pi-coding-agent","skills","skill-control"],"license":"MIT","_id":"@async23/pi-skill-control@0.5.2","maintainers":[{"name":"async23","email":"gearrr005@gmail.com"}],"homepage":"https://github.com/Async23/pi-packages/tree/main/packages/skill-control#readme","bugs":{"url":"https://github.com/Async23/pi-packages/issues"},"pi":{"extensions":["./extensions/index.ts"]},"dist":{"shasum":"590b86f836e1fad27c35d688da2f8d2760f95f57","tarball":"https://registry.npmjs.org/@async23/pi-skill-control/-/pi-skill-control-0.5.2.tgz","fileCount":6,"integrity":"sha512-9qwLm3nlxxsIs9h472K1U+YUkY6Cfv+YtQ49AaBPD5MEK7Iu73AWyeqtcrftBLk7VdqZFiU4YRT1mmDRHig5rg==","signatures":[{"sig":"MEYCIQC4tMg2p4WbGHoZZWW79TieediAIr7QXG/q+tPLNGMeJAIhAPYMIjcQSLkXwkBnmQtenUHyJWXMcNw70iUzF/CGzh0D","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@async23%2fpi-skill-control@0.5.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":92142},"type":"module","gitHead":"796763144bbed81d5930ea17d237acc2d8a8712b","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a530debc-3e6a-43ad-8ef5-f217194bfc07"}},"repository":{"url":"git+https://github.com/Async23/pi-packages.git","type":"git","directory":"packages/skill-control"},"_npmVersion":"11.17.0","description":"Control Skill availability in Pi while showing native invocation routes","directories":{},"_nodeVersion":"24.18.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-skill-control_0.5.2_1786100577880_0.7739857439665427","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@async23/pi-skill-control","version":"0.6.0","description":"Control Skill availability in Pi while showing native invocation routes","type":"module","license":"MIT","keywords":["pi-package","pi-coding-agent","skills","skill-control"],"repository":{"type":"git","url":"git+https://github.com/Async23/pi-packages.git","directory":"packages/skill-control"},"homepage":"https://github.com/Async23/pi-packages/tree/main/packages/skill-control#readme","bugs":{"url":"https://github.com/Async23/pi-packages/issues"},"peerDependencies":{"@earendil-works/pi-coding-agent":"*","@earendil-works/pi-tui":"*"},"publishConfig":{"access":"public"},"pi":{"extensions":["./extensions/index.ts"]},"gitHead":"9649bd649f0031a77b49eeec84931e3bcf46a17e","_id":"@async23/pi-skill-control@0.6.0","_nodeVersion":"24.19.0","_npmVersion":"11.17.0","dist":{"integrity":"sha512-xvL/otvPiQN5mmAHCBSDQc2F3UgvOVEh59LsvRdAfNMQ1CI0AWDgzfxqi4sD1xnuG+43f49Z2fV8je+7x4Ddbg==","shasum":"b110860bcb8e7a64ba89941f664476c38cda8b88","tarball":"https://registry.npmjs.org/@async23/pi-skill-control/-/pi-skill-control-0.6.0.tgz","fileCount":6,"unpackedSize":96859,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@async23%2fpi-skill-control@0.6.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIGU9VXwkaCjstP6VqQmcWncK5FDdWJAhoWUaF/BVVveYAiEAuFPSaJjyRbNRMWf/xKSVDxyBOMcmw2IyrUTLAaaEWPM="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a530debc-3e6a-43ad-8ef5-f217194bfc07"}},"directories":{},"maintainers":[{"name":"async23","email":"gearrr005@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/pi-skill-control_0.6.0_1786870982997_0.014502714358671565"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-31T16:26:55.342Z","modified":"2026-08-16T09:03:03.428Z","0.3.2":"2026-07-31T16:26:55.774Z","0.3.3":"2026-07-31T18:02:17.095Z","0.5.0":"2026-08-04T08:29:42.539Z","0.5.1":"2026-08-07T07:56:00.171Z","0.5.2":"2026-08-07T11:02:58.028Z","0.6.0":"2026-08-16T09:03:03.155Z"},"bugs":{"url":"https://github.com/Async23/pi-packages/issues"},"license":"MIT","homepage":"https://github.com/Async23/pi-packages/tree/main/packages/skill-control#readme","keywords":["pi-package","pi-coding-agent","skills","skill-control"],"repository":{"type":"git","url":"git+https://github.com/Async23/pi-packages.git","directory":"packages/skill-control"},"description":"Control Skill availability in Pi while showing native invocation routes","maintainers":[{"name":"async23","email":"gearrr005@gmail.com"}],"readme":"# @async23/pi-skill-control\n\nA Pi extension for marking every Skill Pi has discovered as **Unblocked** or **Blocked**, while showing Pi's native invocation routes.\n\nPi remains responsible for discovery and invocation semantics: default directories, `settings.json`, packages, `--skill`, other extensions, and each Skill's `disable-model-invocation` frontmatter determine the candidate Skill set and its native availability. **Unblocked** means Skill Control adds no restriction and preserves Pi's native behavior; **Blocked** means Skill Control blocks both observable invocation routes. It does not add scan paths, edit `SKILL.md`, or override `disable-model-invocation`.\n\n## Install\n\n```bash\npi install npm:@async23/pi-skill-control\n```\n\nRestart Pi after installation, or run `/reload` in an existing session to load the extension code.\n\nFor local development from this repository:\n\n```bash\npi --no-extensions -e ./packages/skill-control\n```\n\n## Usage\n\nRun:\n\n```text\n/skills\n```\n\nThe inspector lists the Skills Pi discovered for the current session, groups them by their actual source, and previews each `SKILL.md` with theme-aware YAML frontmatter and Markdown highlighting. The selected file path remains visible in both wide and narrow layouts. A symlinked Skill shows both its lexical `Scanned` entry and canonical `Target`; a regular Skill shows a single `Path`.\n\nThe Source strip recognizes `.agents`, Pi, Claude Code, Codex, OpenCode, Gemini, Antigravity, Cursor, Trae, Grok, and Kimi Code. Zed is also counted because it consumes `.agents` rather than owning a separate Skill root. Sources with discovered Skills stay in their stable order, while known tools with no distinct candidate collapse into a dimmed `N empty sources` summary. If `~/.claude/skills` is a symlink to another discovered root such as `~/.agents/skills`, Claude Code remains a selectable source alias: its count overlaps the canonical source while `ALL` continues to count each Skill only once. Selecting the alias shows both the Claude Code entry path and its canonical target. Other empty sources commonly have no Skill in their independent root, reuse an unaliased shared root, lose a same-name collision, or point to no distinct candidate; empty does not imply that Pi skipped a configured directory.\n\nIn `ALL`, the Skill list remains grouped by its actual source. In a specific Source filter, the same list is grouped by Pi's configuration scope: **Global** (`user`), **Project**, then **Temporary**. Within each group, normal lists order Skills by saved markers and then name: unblocked **/skill only**, unblocked **Model + /skill**, blocked **/skill only**, then blocked **Model + /skill**. Pending policy edits stay in place until Ctrl+S succeeds; the reordered list keeps the same Skill selected. Filtering continues to rank fuzzy-match relevance ahead of marker order. Group headings stay at the top level while their Skill rows are indented beneath them. Groups start expanded, show `▾` or `▸`, and can be selected and folded for the lifetime of the inspector. Filtering temporarily expands groups that contain matches without changing their saved fold state, and a long scrolled list keeps the current group heading visible.\n\n- Up/Down or `j`/`k` selects a group heading or Skill while Skills is focused and scrolls while Preview is focused.\n- Space or Enter folds or unfolds a selected group heading. On narrow terminals, Enter opens Preview for a selected Skill.\n- On a selected group heading, Left or `h` collapses the group and Right or `l` expands it. On a selected Skill, Left/Right or `h`/`l` cycles focus between Skills and Preview. Moving past either end wraps to the other pane; Tab remains an alternative on wide terminals.\n- `[`/`]` cycles backward/forward through source filters that contain discovered Skills. Empty known-tool entries remain visible in the summary but are skipped while cycling. Moving past either end wraps around.\n- `/` enters filter input from either pane; it is a trigger, not part of the displayed query. Filtering mirrors Codex CLI: it matches only Skill names with a case-insensitive subsequence fuzzy match, ranks tighter and leading matches first, and does not search descriptions, sources, or paths.\n- Filter input uses Pi's native single-line editor, including Unicode/IME cursor positioning, paste, Left/Right, Home/End, and customized keybindings. Defaults include Backspace or Ctrl+H to delete a character, Ctrl+W to delete a word, and Ctrl+U to delete to the start.\n- While filter input is active, printable characters—including `h`, `j`, `k`, `l`, `[`, `]`, Space, and `?`—edit the query. Up/Down navigates results, Enter keeps the filter, and Escape cancels the edit and restores the previous filter.\n- Outside filter input, Escape returns from the narrow Preview first, then clears a kept filter before closing the inspector. Pending policy changes still require explicit discard confirmation.\n- On a selected Skill, Space toggles between **Unblocked** and **Blocked**. `r` unblocks the selected Skill, and `u` undoes the latest policy change.\n- `?` opens a read-only guide to native availability and the blocking policy.\n- Ctrl+S writes and applies all pending changes without closing the inspector; the saved state becomes the new editing baseline, so you can continue adjusting other Skills. No Pi reload is needed.\n\n### Native availability and policy\n\nPi defines the native invocation routes of every discovered Skill:\n\n| Native availability | Model sees the Skill | `/skill:name` is shown and accepted |\n| --- | --- | --- |\n| **Model + /skill** | Yes | Yes |\n| **/skill only** | No | Yes |\n\n`disable-model-invocation: true` produces **/skill only**; otherwise Pi uses **Model + /skill**. Skill Control displays this native information but does not edit or override it.\n\nSkill Control adds one binary policy:\n\n| Policy | Effective behavior |\n| --- | --- |\n| **Unblocked** | Add no restriction; preserve Pi's native **Model + /skill** or **/skill only** availability |\n| **Blocked** | Hide the Skill from the model and block direct `/skill:name` invocation |\n\nSkill rows use a two-cell nesting indent, then keep the two dimensions visually independent in fixed columns: the saved **Blocked** policy marker `⊘`, the native user marker, and the Skill name. Both marker columns remain reserved when empty, so every Skill name stays aligned. A normal **Model + /skill** Skill has no native marker; a native **/skill only** Skill shows the user marker. An unsaved edit shows `Unsaved` on the right instead of a saved policy marker. The preview still spells out native availability, effective availability, and policy. Changes remain pending until Ctrl+S; saving keeps the inspector open and starts a fresh undo history from the new baseline. Policy shortcuts do nothing while Preview is focused.\n\nThe inspector header is Source-first. The active Source keeps its brackets, empty Sources stay aggregated, and the filter prompt shares a row with the `[/] source` hint. Native availability and policy move into the **Skills** divider as a compact live summary: `Skills <visible> · model <model-visible> · <user marker> <command-only> · ⊘ <blocked>`. A pending policy change adds `△ <pending>`. Text filtering updates these counts to describe the Skills currently shown, while the **Skills** and **Preview** divider labels continue to show keyboard focus.\n\nThe user marker is Font Awesome `user` (`U+F007`) when Nerd Font support is detected, otherwise `ⓤ` (`U+24E4`). Detection checks `PI_SKILL_CONTROL_NERD_FONT`, Ghostty's effective font configuration, then `fontconfig` support for `U+F007`. Set `PI_SKILL_CONTROL_NERD_FONT=1` or `0` before starting Pi to override automatic detection.\n\n## Configuration\n\nUser policy:\n\n```text\n~/.pi/agent/skill-control.json\n```\n\nVersion 5 stores blocked canonical `SKILL.md` paths:\n\n```json\n{\n  \"version\": 5,\n  \"blockedPaths\": [\n    \"/absolute/path/to/example/SKILL.md\"\n  ]\n}\n```\n\nProject-local `.pi/skill-control.json` files are not read or modified. Existing files are left untouched.\n\nVersion 1, 2, and 4 `disabledPaths` entries migrate directly to `blockedPaths`. Version 3 invocation overrides that removed either route migrate conservatively to **Blocked**; fully open overrides migrate to **Unblocked**. Migration is written immediately in version 5 format. The old `discover` setting is no longer used; configure additional Skill paths through Pi's native `skills` setting instead. For the supported tool roots on macOS/Linux:\n\n```json\n{\n  \"skills\": [\n    \"~/.pi/agent/skills\",\n    \"~/.agents/skills\",\n    \"~/.codex/skills\",\n    \"~/.claude/skills\",\n    \"~/.config/opencode/skills\",\n    \"~/.gemini/config/skills\",\n    \"~/.cursor/skills\",\n    \"~/.trae/skills\",\n    \"~/.grok/skills\",\n    \"~/.kimi-code/skills\"\n  ]\n}\n```\n\nPi already scans `~/.pi/agent/skills` and `~/.agents/skills`; the example repeats them to make their precedence explicit. In this layout, Gemini CLI and Zed use the shared `.agents` root, while Antigravity uses `~/.gemini/config/skills`. Kimi Code reads both `.agents/skills` and its independent global `~/.kimi-code/skills` / project `.kimi-code/skills` roots; shared Skills remain labeled `.agents`, while independent Skills are labeled `Kimi Code`. Add `~/.gemini/skills` only when that separate Gemini directory exists. The source classifier preserves the lexical discovery path, so a Skill loaded through a tool-specific symlink is labeled with that tool while policy continues to use the canonical file path.\n\nWhen source ownership matters, explicitly placing `~/.pi/agent/skills` and `~/.agents/skills` first in the array keeps their Skills ahead of tool-specific symlink aliases and same-name copies. Pi still deduplicates by canonical file path and keeps the first Skill for a name collision.\n\n## Enforcement\n\nPi does not expose a per-Skill enable/disable API. Pi's resource configuration remains the discovery authority, and **Unblocked** is not an active enable operation—it only means this extension is not blocking the Skill. For temporary `--skill` entries and Skills injected by other extensions, stock Pi also does not expose a resource-removal hook. This package therefore enforces **Blocked** through extension hooks at the observable entry points:\n\n- Blocked Skills are removed from `<available_skills>` when Pi would normally show them.\n- Blocked Skills are removed from slash-command autocomplete.\n- A manually typed `/skill:name` invocation for a blocked Skill is intercepted before expansion.\n\nThe underlying Skill file is never modified or deleted.\n\n## License\n\nMIT\n","readmeFilename":"README.md"}