import type { SkillLockEntry } from "../lockfile/types.js"; import type { AgentDefinition } from "../agents/agents-registry.js"; /** * How an agent surface receives a skill enablement. * * - "claude-code-style": the agent reads `enabledPlugins` from a * settings.json file (today, only Claude Code), so toggling requires a * `claude plugin install/uninstall` invocation. * - "auto-discover": the agent picks up skills by scanning its * `localSkillsDir` / `globalSkillsDir`, so there is nothing to toggle — * `vskill remove ` is the only way to un-load such a skill. */ export type AgentSurfaceClass = "claude-code-style" | "auto-discover"; /** * The lifecycle action that produced the report row. * * Drives the wording in the human-readable line. Machine consumers should * read the structured `action` field rather than parsing the string. */ export type LifecycleAction = "enabled" | "already-enabled" | "disabled" | "already-disabled" | "removed" | "not-applicable"; export interface PerAgentReportEntry { /** Agent id (e.g. "claude-code") */ id: string; /** Display name (e.g. "Claude Code") */ displayName: string; /** Whether this agent uses enabledPlugins or auto-discovers from disk */ surface: AgentSurfaceClass; /** The lifecycle action that resolved for this agent */ action: LifecycleAction; /** Pre-formatted human-readable line, e.g. "Claude Code (user) — enabled via claude CLI" */ line: string; } export interface BuildPerAgentReportOptions { /** Skill name (used for log context, not currently embedded in the line). */ skill: string; /** Target scope of the operation. */ scope: "user" | "project"; /** The action that triggered the report. Auto-discover agents always map to `not-applicable` for enable/disable actions. */ action: LifecycleAction; /** * F5: optional per-agent override of `action`. `vskill remove` deletes * files from some agents but not others, so it reports "removed" only for * the agents it actually cleaned. Falls back to `action` when absent. */ actionFor?: (agent: AgentDefinition) => LifecycleAction; /** The list of agents detected on the local machine. */ agents: AgentDefinition[]; } /** * Compute the plugin id used by the claude CLI. * * Format: `@`. Returns `null` when the lockfile * entry has no `marketplace` field (or it is empty), which signals that the * skill is auto-discovered and there is no plugin entry to enable / disable. * * Parameter type is narrowed to `Pick` so * callers that only have a partial entry shape (e.g. enableAfterInstall in * add.ts) don't need to cast — the function only ever reads `marketplace`. */ export declare function resolvePluginId(skillName: string, entry: Pick): string | null; /** * Decide whether an agent uses settings.json's enabledPlugins (claude-code * style) or auto-discovers skills from its skills dir. * * Today the only `claude-code-style` agent is `claude-code` itself. Every * other agent in the registry auto-discovers from its `localSkillsDir` / * `globalSkillsDir`, so toggling a skill there is a no-op (the only way to * un-load it is to delete the files via `vskill remove`). * * Kept as a function rather than a flag on `AgentDefinition` so we don't * have to mutate 53 registry rows just for this one branching point — and * so we can extend the rule (e.g. another agent ships its own settings.json) * without a registry migration. */ export declare function classifyAgentSurface(agent: AgentDefinition): AgentSurfaceClass; /** * Walk the supplied agent list and produce one PerAgentReportEntry per * agent. Used by `enable`, `disable`, `install`, and `remove` for both * human-readable and JSON output. * * Pure — does not detect agents, does not read settings.json. Callers must * pass the already-detected list (via `detectInstalledAgents()`). */ export declare function buildPerAgentReport(opts: BuildPerAgentReportOptions): PerAgentReportEntry[];