import type { Provenance } from "../studio/types.js"; /** Where a skill lives on disk. */ export type SkillSourceLocation = "project" | "personal" | "cache"; /** A discovered source skill, with absolute path and parsed identity. */ export interface SkillSource { location: SkillSourceLocation; /** Absolute path to the skill directory (the dir containing SKILL.md). */ skillDir: string; /** Skill name as parsed from frontmatter (or directory basename if frontmatter lacks `name`). */ skillName: string; /** Original namespace if discoverable (e.g., "sw" for plugin-cache sources). undefined for personal/project. */ namespace?: string; /** Original version from frontmatter (or "0.0.0" if absent). */ version: string; /** Plugin context — present only for cache-located skills. */ plugin?: { pluginNamespace: string; pluginName: string; pluginVersion: string; pluginRoot: string; }; /** Existing provenance read from .vskill-meta.json (null if no sidecar). */ existingProvenance: Provenance | null; } /** Where the cloned skill should be written. */ export type CloneTargetKind = "standalone" | "plugin" | "new-plugin"; export interface CloneTarget { kind: CloneTargetKind; /** Absolute path to the final skill directory (where files end up after atomic rename). */ targetSkillDir: string; /** For "plugin" kind: absolute path to the existing plugin's .claude-plugin/plugin.json. */ existingPluginManifestPath?: string; /** For "new-plugin" kind: absolute path to the plugin root being scaffolded. */ newPluginRoot?: string; /** For "new-plugin" kind: name to use in the new plugin manifest. */ newPluginName?: string; } export interface CloneOptions { /** New namespace for the cloned skill (e.g., "anton"). Required. */ namespace: string; /** New author name. Required. */ author: string; /** When true, overwrite existing target without confirmation. */ force: boolean; /** When true, after files land, scaffold a GitHub repo via gh. */ github: boolean; /** When true, do not write any files — just print the planned actions. */ dryRun: boolean; } /** Result returned by the clone orchestrator. */ export interface CloneResult { source: SkillSource; target: CloneTarget; /** Final skill name written (e.g., "anton/ado-mapper"). */ finalSkillName: string; /** Number of files copied. */ filesCopied: number; /** Cross-skill references found in the body (informational, not auto-rewritten). */ referenceReport: ReferenceMatch[]; /** Self-name occurrences in prose (informational). */ selfNameMatches: ReferenceMatch[]; /** GitHub repo URL if --github was used and succeeded; null if skipped. */ githubRepoUrl: string | null; /** Provenance written to the cloned skill. */ provenance: Provenance; } export interface ReferenceMatch { /** Path of the file the match was found in (relative to skill root). */ file: string; /** Line number (1-indexed). */ line: number; /** The matched text (e.g., "sw:ado-mapper"). */ match: string; /** Pattern category. */ kind: "backtick" | "skill-call" | "slash-command" | "self-name"; } /** Fork provenance metadata written to the cloned skill's .vskill-meta.json. */ export interface ForkProvenance { source: string; version: string; clonedAt: string; }