/**
 * ============================================================
 *  src/prompts/skillList.ts —— Skill 列表生成（积极使用版）
 * ------------------------------------------------------------
 *  设计原则（v3 重构）：
 *    1. System Prompt 里只注入 frontmatter 元数据轻量列表
 *       → 让 T 阶段的 LLM 知道"有哪些技能可用 + 何时触发 + 是什么类型"
 *       → 不加载完整 SKILL.md（省 token，按需加载）
 *    2. LLM 决定使用某个 skill 时，用 Read 工具读取对应 SKILL.md
 *       → 类似 lazy loading：知道存在 → 需要时才加载详情
 *    3. 格式对齐 Tools 的风格：每个 skill 固定 3 行信息
 *    4. 完全依赖 frontmatter 声明（name / description / type / triggers），
 *       不再做任何启发式推断。新增 skill 时必须在 frontmatter 显式声明
 *       type 和 triggers 字段（缺省时给出占位提示）。
 * ============================================================
 */
import { readFile, readdir } from 'node:fs/promises';
import { join } from 'node:path';
import { getResourceSearchPaths } from '../utils/resourcePaths.js';
function stripQuotes(s) {
    const trimmed = s.trim();
    if ((trimmed.startsWith('"') && trimmed.endsWith('"')) ||
        (trimmed.startsWith("'") && trimmed.endsWith("'"))) {
        return trimmed.slice(1, -1);
    }
    return trimmed;
}
function parseFrontmatter(content, sourceDir) {
    const match = content.match(/^---\n([\s\S]*?)\n---/);
    if (!match)
        return null;
    const frontmatter = match[1];
    const nameMatch = frontmatter.match(/^name:\s*(.+)$/m);
    const descMatch = frontmatter.match(/^description:\s*(.+)$/m);
    const typeMatch = frontmatter.match(/^type:\s*(.+)$/m);
    const triggersMatch = frontmatter.match(/^triggers:\s*(.+)$/m);
    if (!nameMatch || !descMatch)
        return null;
    return {
        name: stripQuotes(nameMatch[1]),
        description: stripQuotes(descMatch[1]),
        type: typeMatch ? stripQuotes(typeMatch[1]) : undefined,
        triggers: triggersMatch ? stripQuotes(triggersMatch[1]) : undefined,
        sourceDir,
    };
}
export async function getSkillList() {
    const skills = [];
    const seenNames = new Set();
    // 双源扫描：cwd 优先 + packageRoot fallback；按数组顺序处理，已注册 name 跳过
    const searchPaths = getResourceSearchPaths('skills', import.meta.url);
    for (const root of searchPaths) {
        try {
            const entries = await readdir(root, { withFileTypes: true });
            for (const entry of entries) {
                if (!entry.isDirectory())
                    continue;
                const sourceDir = join(root, entry.name);
                const skillPath = join(sourceDir, 'SKILL.md');
                try {
                    const content = await readFile(skillPath, 'utf8');
                    const meta = parseFrontmatter(content, sourceDir);
                    if (meta && !seenNames.has(meta.name)) {
                        seenNames.add(meta.name);
                        skills.push(meta);
                    }
                }
                catch {
                }
            }
        }
        catch {
        }
    }
    return skills;
}
/**
 * 生成积极的 skill 列表提示词。
 *
 * 输出格式（每个 skill 固定 3 行）:
 *   ## /skill-name —— 一句话标题
 *   - **触发时机**: 用户说 "xxx"、"yyy" 时使用
 *   - **功能**: 一句话描述这个 skill 做什么
 *   - **类型**: prompt / local / local-jsx
 *
 * 关键设计决策：
 *   - 不加载 SKILL.md 全文（节省 ~1500+ tokens/skill）
 *   - 只输出 name + description（每个 skill ~40 tokens）
 *   - 明确告诉 LLM "决定用时再 Read SKILL.md"
 */
export function formatSkillHint(skills) {
    if (skills.length === 0) {
        return '';
    }
    const lines = [];
    // ---- 标题段 ----
    lines.push('# 可用技能（/命令）');
    lines.push('');
    lines.push('以下是当前可用的技能（**双源**：用户项目目录 + minimal-agent 包目录，同名时项目优先）。**当用户意图匹配某个技能的触发时机时，你应该主动使用它**。');
    lines.push('在使用前，先用 Read 工具读取下方每个技能卡片里的 `**技能目录**` 路径 + `/SKILL.md` 了解完整流程。');
    lines.push('');
    // ---- 每个技能的卡片 ----
    for (const skill of skills) {
        const type = skill.type ?? 'prompt（展开为系统提示词，指导模型执行复杂任务）';
        const triggers = skill.triggers ?? '（详见 SKILL.md）';
        lines.push(`## ${skill.name}`);
        lines.push(`- **触发时机**: ${triggers}`);
        lines.push(`- **功能**: ${skill.description}`);
        lines.push(`- **类型**: ${type}`);
        lines.push(`- **技能目录**: \`${skill.sourceDir}\``);
        lines.push('');
    }
    // ---- 使用流程指引 ----
    lines.push('## 技能调用流程');
    lines.push('');
    lines.push('```');
    lines.push('1. 在 T 阶段判断用户意图是否匹配某个技能的触发时机');
    lines.push('2. 匹配 → 在 A 阶段用 Read 工具读取该技能卡片的"技能目录"/SKILL.md');
    lines.push('3. 按照 SKILL.md 的 Quick Reference 和流程执行');
    lines.push('4. 技能脚本（scripts/）与 SKILL.md 位于同一目录下，用绝对路径执行');
    lines.push('5. 如果技能类型是 prompt，将其内容作为额外上下文指导后续操作');
    lines.push('```');
    lines.push('');
    lines.push('> 💡 技能是工具的组合拳。单个工具是基础操作；技能是针对特定场景的标准化工作流。');
    return lines.join('\n');
}
