[FEATURE]: Bring back frontmatter-based skill filtering #4178

Closed
opened 2026-02-16 17:42:54 -05:00 by yindo · 4 comments
Owner

Originally created by @IgorWarzocha on GitHub (Jan 4, 2026).

Originally assigned to: @thdxr on GitHub.

Feature hasn't been suggested before.

  • I have verified this feature I'm about to request hasn't been suggested before.

Describe the enhancement you want to request

We used to be able to filter skills in agents' frontmatters via yaml as per below. This was nice, it allowed creating customised agents. As far as I understand, this functionality is now gone.

Filtering from agents files is perfect, it allows for better maintainability. Editing a skill markdown every time an agent is created is... painful. Since skills are a standard that has no frontmatter permission fields, it would be weird to add anything custom to it.

mode: primary
permission:
  skill:
    '*': deny
    plugin-installer: allow
    opencode-config: allow
    command-creator: allow
    skill-creator: allow
    agent-architect: allow
    mcp-installer: allow
    model-researcher: allow
---

ps. pff wrong label, sorry

Originally created by @IgorWarzocha on GitHub (Jan 4, 2026). Originally assigned to: @thdxr on GitHub. ### Feature hasn't been suggested before. - [x] I have verified this feature I'm about to request hasn't been suggested before. ### Describe the enhancement you want to request We used to be able to filter skills in agents' frontmatters via yaml as per below. This was nice, it allowed creating customised agents. As far as I understand, this functionality is now gone. Filtering from agents files is perfect, it allows for better maintainability. Editing a skill markdown every time an agent is created is... painful. Since skills are a standard that has no frontmatter permission fields, it would be weird to add anything custom to it. ``` mode: primary permission: skill: '*': deny plugin-installer: allow opencode-config: allow command-creator: allow skill-creator: allow agent-architect: allow mcp-installer: allow model-researcher: allow --- ``` ps. pff wrong label, sorry
yindo added the discussion label 2026-02-16 17:42:54 -05:00
yindo closed this issue 2026-02-16 17:42:54 -05:00
Author
Owner

@malhashemi commented on GitHub (Jan 4, 2026):

Hi @IgorWarzocha ,

Can you confirm it is no longer working for you?

With the new permission system this should already be supported, if anything we are getting vastly superior control on all tools, from my understanding the task tool, edit tool, read, etc. all supports this level of control that skills already have. Otherwise, this should be flagged as a bug.

@malhashemi commented on GitHub (Jan 4, 2026): Hi @IgorWarzocha , Can you confirm it is no longer working for you? With the new permission system this should already be supported, if anything we are getting vastly superior control on all tools, from my understanding the task tool, edit tool, read, etc. all supports this level of control that skills already have. Otherwise, this should be flagged as a bug.
Author
Owner

@IgorWarzocha commented on GitHub (Jan 4, 2026):

Hi @malhashemi aka mr Skills himself :)

This is on an empty directory - same config, different versions. 1.1.1 just goes ahead to list the global config. 1.0.223 identifies the skills correctly. It's precisely the same with any other agents formatted this way.

(I've tried multiple things, none of them seem to work)

Image

While this is "just an AI" scan of commits, and I am 100% certain there are more cascading changes, this commit seems to have changed this specifically. Verified on two lengthy runs and I've checked out this specific commit as branch to... preserve functionality just in case I wanna fork it.

The upstream change you are looking for is in commit 351ddeed91 (titled "Permission rework (#6319)"), specifically in packages/opencode/src/tool/skill.ts.
Here is the precise pinpoint of the change:

// packages/opencode/src/tool/skill.ts
// ... (imports)
export const SkillTool = Tool.define("skill", async () => {
  const skills = await Skill.all()
  // Filter skills by agent permissions if agent provided
  /* 
    // THIS BLOCK WAS COMMENTED OUT IN THE COMMIT
    let accessibleSkills = skills
    if (ctx?.agent) {
      const permissions = ctx.agent.permission.skill
      accessibleSkills = skills.filter((skill) => {
        const action = Wildcard.all(skill.name, permissions)
        return action !== "deny"
      })
    }
  */
  // ... (rest of the file)

Before this commit:
The code explicitly filtered accessibleSkills using Wildcard.all(skill.name, permissions). This function correctly handled specificity, allowing you to deny: * and then allow: specific-skill.
After this commit:
The filtering logic was commented out entirely. The tool now loads all skills into the description regardless of permissions, and relies on a runtime ctx.ask check which (in the new system) treats deny: * as a blanket ban without the same specificity overrides for the listing phase.
You are currently on branch feature/classic-skills-restored which has the code state before this change (parent commit f77e1d973), so the skills should be working correctly for you here.

@IgorWarzocha commented on GitHub (Jan 4, 2026): Hi @malhashemi aka mr Skills himself :) This is on an empty directory - same config, different versions. 1.1.1 just goes ahead to list the global config. 1.0.223 identifies the skills correctly. It's precisely the same with any other agents formatted this way. (I've tried multiple things, none of them seem to work) <img width="1920" height="1080" alt="Image" src="https://github.com/user-attachments/assets/d03ae8d0-4159-43ae-ade1-50eed99e622e" /> While this is "just an AI" scan of commits, and I am 100% certain there are more cascading changes, this commit seems to have changed this specifically. Verified on two lengthy runs and I've checked out this specific commit as branch to... preserve functionality just in case I wanna fork it. > The upstream change you are looking for is in commit 351ddeed914d237138fc6f3f8b3d65d2e559357a (titled "Permission rework (#6319)"), specifically in packages/opencode/src/tool/skill.ts. > Here is the precise pinpoint of the change: ``` // packages/opencode/src/tool/skill.ts // ... (imports) export const SkillTool = Tool.define("skill", async () => { const skills = await Skill.all() // Filter skills by agent permissions if agent provided /* // THIS BLOCK WAS COMMENTED OUT IN THE COMMIT let accessibleSkills = skills if (ctx?.agent) { const permissions = ctx.agent.permission.skill accessibleSkills = skills.filter((skill) => { const action = Wildcard.all(skill.name, permissions) return action !== "deny" }) } */ // ... (rest of the file) ``` > Before this commit: > The code explicitly filtered accessibleSkills using Wildcard.all(skill.name, permissions). This function correctly handled specificity, allowing you to deny: * and then allow: specific-skill. > After this commit: > The filtering logic was commented out entirely. The tool now loads all skills into the description regardless of permissions, and relies on a runtime ctx.ask check which (in the new system) treats deny: * as a blanket ban without the same specificity overrides for the listing phase. > You are currently on branch feature/classic-skills-restored which has the code state before this change (parent commit f77e1d973), so the skills should be working correctly for you here.
Author
Owner

@malhashemi commented on GitHub (Jan 5, 2026):

@IgorWarzocha apologies for the delay, I had such a strong flu I can barely open one eye, I will submit a PR to rectify this, please note the permission system is working fine the only issue is that the skill tool description filtration is broken now. Appreciate if you can fix the title and description and mark it as a bug please

So your agent would see all the skills (wasting context and tokens for no reason) but the deny behavior is still working, I am working on a PR to bring back the filtration functionality respecting the new system. @rekram1-node counting on you for a quick review/merge 🙏

@malhashemi commented on GitHub (Jan 5, 2026): @IgorWarzocha apologies for the delay, I had such a strong flu I can barely open one eye, I will submit a PR to rectify this, please note the permission system is working fine the only issue is that the skill tool description filtration is broken now. Appreciate if you can fix the title and description and mark it as a bug please So your agent would see all the skills (wasting context and tokens for no reason) but the deny behavior is still working, I am working on a PR to bring back the filtration functionality respecting the new system. @rekram1-node counting on you for a quick review/merge 🙏
Author
Owner

@rekram1-node commented on GitHub (Jan 5, 2026):

Sounds good

@rekram1-node commented on GitHub (Jan 5, 2026): Sounds good
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: anomalyco/opencode#4178