From app-intents-pro
Exposes app actions to Siri, Shortcuts, and Spotlight using AppIntent, AppEntity, and AppShortcuts. Use when adding intents, modeling entities, or registering zero-setup Siri phrases.
How this skill is triggered — by the user, by Claude, or both
Slash command
/app-intents-pro:app-intents-proThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Expose app actions to the system: Siri, Shortcuts, Spotlight, widgets, and controls.
Expose app actions to the system: Siri, Shortcuts, Spotlight, widgets, and controls.
AppIntents for app actions.AppEntity types for parameters/results.AppShortcuts for zero-setup Siri phrases.Trigger: /app-intents-pro.
AppShortcuts so users get Siri phrases without manual setup.import AppIntents
struct AddTaskIntent: AppIntent {
static let title: LocalizedStringResource = "Add Task"
static let description = IntentDescription("Creates a new task.")
@Parameter(title: "Title") var taskTitle: String
func perform() async throws -> some IntentResult & ProvidesDialog {
try await TaskStore.shared.add(title: taskTitle)
return .result(dialog: "Added “\(taskTitle)”.")
}
}
title/description are required and user-visible.perform() is async throws — call your real model, don't duplicate logic.❌ Untyped, no prompt
@Parameter var value: String // Siri can't elicit it well
✅
@Parameter(title: "Due date") var dueDate: Date
@Parameter(title: "Priority") var priority: Priority // an AppEnum
AppEnum for fixed choices:
enum Priority: String, AppEnum {
case low, normal, high
static let typeDisplayRepresentation: TypeDisplayRepresentation = "Priority"
static let caseDisplayRepresentations: [Priority: DisplayRepresentation] =
[.low: "Low", .normal: "Normal", .high: "High"]
}
struct TaskEntity: AppEntity, Identifiable {
let id: UUID
let title: String
static let typeDisplayRepresentation: TypeDisplayRepresentation = "Task"
var displayRepresentation: DisplayRepresentation { .init(title: "\(title)") }
static var defaultQuery = TaskQuery()
}
struct TaskQuery: EntityQuery {
func entities(for ids: [UUID]) async throws -> [TaskEntity] { /* fetch */ }
func suggestedEntities() async throws -> [TaskEntity] { /* recents */ }
}
struct TasksShortcuts: AppShortcutsProvider {
static var appShortcuts: [AppShortcut] {
AppShortcut(intent: AddTaskIntent(),
phrases: ["Add a task in \(.applicationName)"],
shortTitle: "Add Task",
systemImageName: "plus.circle")
}
}
Always include \(.applicationName) in at least one phrase.
perform() instead of calling the model.String parameters where Date/AppEnum/AppEntity fit.AppShortcutsProvider, so users get no Siri phrases.\(.applicationName).EntityQuery without suggestedEntities().Per issue: file:line, rule, before/after. Flag intents that bypass the model layer first.
Creates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.
npx claudepluginhub laxrajpurohit/swift-skills-pro --plugin app-intents-pro