summaryrefslogtreecommitdiffhomepage
path: root/packages/app/src/components
diff options
context:
space:
mode:
authorRyan Vogel <[email protected]>2026-01-31 09:59:28 -0500
committerGitHub <[email protected]>2026-01-31 08:59:28 -0600
commit786ae0a584688214c99d613f18b6dc1b4ccefb9e (patch)
tree266e6f7486dff023bf1397e4adde37b73e7f0011 /packages/app/src/components
parentf73f88fb56381f0ea6746964bbd4a6496f7ec229 (diff)
downloadopencode-786ae0a584688214c99d613f18b6dc1b4ccefb9e.tar.gz
opencode-786ae0a584688214c99d613f18b6dc1b4ccefb9e.zip
feat(app): add skill slash commands (#11369)
Diffstat (limited to 'packages/app/src/components')
-rw-r--r--packages/app/src/components/prompt-input.tsx36
1 files changed, 34 insertions, 2 deletions
diff --git a/packages/app/src/components/prompt-input.tsx b/packages/app/src/components/prompt-input.tsx
index 5c1d417eb..2bf9acf32 100644
--- a/packages/app/src/components/prompt-input.tsx
+++ b/packages/app/src/components/prompt-input.tsx
@@ -111,7 +111,7 @@ interface SlashCommand {
title: string
description?: string
keybind?: string
- type: "builtin" | "custom"
+ type: "builtin" | "custom" | "skill"
}
export const PromptInput: Component<PromptInputProps> = (props) => {
@@ -519,7 +519,15 @@ export const PromptInput: Component<PromptInputProps> = (props) => {
type: "custom" as const,
}))
- return [...custom, ...builtin]
+ const skills = sync.data.skill.map((skill) => ({
+ id: `skill.${skill.name}`,
+ trigger: `skill:${skill.name}`,
+ title: skill.name,
+ description: skill.description,
+ type: "skill" as const,
+ }))
+
+ return [...skills, ...custom, ...builtin]
})
const handleSlashSelect = (cmd: SlashCommand | undefined) => {
@@ -543,6 +551,25 @@ export const PromptInput: Component<PromptInputProps> = (props) => {
return
}
+ if (cmd.type === "skill") {
+ // Extract skill name from the id (skill.{name})
+ const skillName = cmd.id.replace("skill.", "")
+ const text = `Load the "${skillName}" skill and follow its instructions.`
+ editorRef.innerHTML = ""
+ editorRef.textContent = text
+ prompt.set([{ type: "text", content: text, start: 0, end: text.length }], text.length)
+ requestAnimationFrame(() => {
+ editorRef.focus()
+ const range = document.createRange()
+ const sel = window.getSelection()
+ range.selectNodeContents(editorRef)
+ range.collapse(false)
+ sel?.removeAllRanges()
+ sel?.addRange(range)
+ })
+ return
+ }
+
editorRef.innerHTML = ""
prompt.set([{ type: "text", content: "", start: 0, end: 0 }], 0)
command.trigger(cmd.id, "slash")
@@ -1706,6 +1733,11 @@ export const PromptInput: Component<PromptInputProps> = (props) => {
{language.t("prompt.slash.badge.custom")}
</span>
</Show>
+ <Show when={cmd.type === "skill"}>
+ <span class="text-11-regular text-text-subtle px-1.5 py-0.5 bg-surface-base rounded">
+ {language.t("prompt.slash.badge.skill")}
+ </span>
+ </Show>
<Show when={command.keybind(cmd.id)}>
<span class="text-12-regular text-text-subtle">{command.keybind(cmd.id)}</span>
</Show>