mirror of
https://github.com/Fission-AI/OpenSpec.git
synced 2026-11-07 09:14:38 +08:00
* feat(skills): auto-approve the openspec CLI in generated skills Emit `allowed-tools: Bash(openspec:*)` in every generated SKILL.md so agents that honor the Agent Skills standard run `openspec` commands without prompting on each call. Scope is limited to the CLI; per the standard `allowed-tools` pre-approves rather than restricts, so every other tool a skill uses stays available under the user's normal permission settings. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * feat(commands): auto-approve the openspec CLI in Claude slash commands Extend the allowed-tools pre-approval to the second surface: Claude Code /opsx:* slash commands share the skill frontmatter contract, so the Claude command adapter now emits `allowed-tools: Bash(openspec:*)` too. The value is single-sourced in `src/core/shared/allowed-tools.ts` (a leaf module both surfaces import). Other command adapters are unchanged — no other tool's slash-command format defines a per-command pre-approval field; on the skills side every tool already gets the standard field via generateSkillContent and non-implementing tools ignore the unknown key. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2.5 KiB
2.5 KiB
Why
Every generated OpenSpec skill drives the openspec CLI (openspec list, status, instructions, …). Today the skill frontmatter never pre-approves those calls, so agents that gate Bash on permission prompt the user on every single openspec invocation. The workflow stalls on approvals for a first-party, read-mostly CLI the user already opted into by installing OpenSpec.
The Agent Skills standard already solves this: an allowed-tools frontmatter field pre-approves listed tools while a skill is active. We just aren't emitting it.
What Changes
- Every generated
SKILL.mdgainsallowed-tools: Bash(openspec:*)in its YAML frontmatter, so agents runopenspeccommands from the skill without prompting. Emitted centrally ingenerateSkillContent, soinit,update, every tool's skills directory, and every current and future skill get it uniformly. - Claude Code slash commands (
.claude/commands/opsx/*.md) gain the same field — commands share the skill frontmatter contract, so the same pre-approval applies when a user runs/opsx:*. - Scope is deliberately narrow: only the
openspecCLI is pre-approved. Per the standard,allowed-toolspre-approves rather than restricts — so any other tool a skill or command uses (Read, Write, or arbitrary Bash for builds/tests inapply/onboard) stays available under the user's normal permission settings, still prompting as before. - Cross-tool: skills go to every supported tool's skills directory, and
allowed-toolsis an Agent Skills standard field — tools that implement the standard honor it; tools that don't ignore the unknown key. Only the Claude command adapter changes, because no other tool's slash-command format defines a per-command pre-approval field.
Capabilities
Modified Capabilities
cli-init: the Skill Generation requirement now specifies theallowed-toolspre-approval in generated skill frontmatter.command-generation: the Claude adapter frontmatter now includes theallowed-toolsfield.
Impact
src/core/shared/allowed-tools.ts— the sharedOPENSPEC_CLI_ALLOWED_TOOLSconstant (single source for both surfaces).src/core/shared/skill-generation.ts— emitallowed-toolsin the SKILL.md frontmatter.src/core/command-generation/adapters/claude.ts— emitallowed-toolsin the slash-command frontmatter.- Tests: regenerated golden skill-content hashes; new assertions that every deployed skill and the Claude command format pre-approve the CLI.
- No behavior change for agents that ignore
allowed-tools; pure upside for agents that honor it.