UNPKG

autosnippet

Version:

Extract code patterns into a knowledge base for AI coding assistants

88 lines (87 loc) 4.27 kB
/** * Defaults — 项目级默认常量与配置 * 统一管理路径名、存储适配器、索引策略、分类规则等默认值 */ import { SPEC_FILENAME as _SPEC_FILENAME, DEFAULT_KNOWLEDGE_BASE_DIR, DEFAULT_SUB_REPO_DIR, } from '../../shared/ProjectMarkers.js'; // ─── 路径 ──────────────────────────────────────────────────── export const SPEC_FILENAME = _SPEC_FILENAME; export const KNOWLEDGE_BASE_DIR = DEFAULT_KNOWLEDGE_BASE_DIR; export const RECIPES_DIR = `${DEFAULT_KNOWLEDGE_BASE_DIR}/recipes`; export const CANDIDATES_DIR = `${DEFAULT_KNOWLEDGE_BASE_DIR}/candidates`; export const RECIPES_INDEX = `${DEFAULT_KNOWLEDGE_BASE_DIR}/recipes/index.json`; export const SPMMAP_FILENAME = 'AutoSnippet.spmmap.json'; export const SPMMAP_PATH = `${DEFAULT_KNOWLEDGE_BASE_DIR}/${SPMMAP_FILENAME}`; /** 默认子仓库相对路径(相对于 projectRoot) */ export const SUB_REPO_DIR = DEFAULT_SUB_REPO_DIR; // ─── Context 存储 ──────────────────────────────────────────── export const DEFAULT_STORAGE_ADAPTER = 'json'; export const STORAGE_ADAPTERS = ['json']; // ─── Context 索引 ──────────────────────────────────────────── export const SOURCE_TYPES = ['recipe', 'doc', 'target-readme']; export const SOURCE_TYPE_RECIPE = 'recipe'; export const SOURCE_TYPE_TARGET_README = 'target-readme'; export const DEFAULT_SOURCES = [{ path: RECIPES_DIR, type: 'recipe' }]; export const DEFAULT_CHUNKING = { strategy: 'whole' }; export const CHUNKING_STRATEGIES = ['whole', 'section', 'fixed', 'auto']; export const DEFAULT_MAX_CHUNK_TOKENS = 800; export const DEFAULT_OVERLAP_TOKENS = 80; export const CHARS_PER_TOKEN = 3; // ─── Target README ─────────────────────────────────────────── export const README_NAMES = ['README.md', 'README_CN.md', 'readme.md']; // ─── MCP / 连接层 ─────────────────────────────────────────── export const DEFAULT_ASD_UI_URL = 'http://localhost:3000'; // ─── Guard ─────────────────────────────────────────────────── export const GUARD_CONTEXT_EXCERPT_LIMIT = 12000; // ─── Skills / Category ────────────────────────────────────── export const CATEGORY_RULES = [ { pattern: /network|net|请求|api/i, category: 'network' }, { pattern: /video|播放|player/i, category: 'video' }, { pattern: /scheme|url|跳转|router/i, category: 'navigation' }, { pattern: /pyramid|service|服务/i, category: 'foundation' }, { pattern: /ui|view|cell|table/i, category: 'ui' }, ]; export const DEFAULT_CATEGORY = 'general'; /** * 从文件路径和内容推断 category * 优先读取 frontmatter 的 category 字段,其次匹配路径规则 */ export function inferCategory(relPath, content) { const frontMatch = (content || '').match(/^---[\s\S]*?category:\s*["']?([\w-]+)["']?/m); if (frontMatch) { return frontMatch[1]; } const lower = (relPath || '').toLowerCase(); for (const { pattern, category } of CATEGORY_RULES) { if (pattern.test(lower)) { return category; } } return DEFAULT_CATEGORY; } export default { SPEC_FILENAME, KNOWLEDGE_BASE_DIR, RECIPES_DIR, CANDIDATES_DIR, RECIPES_INDEX, SPMMAP_FILENAME, SPMMAP_PATH, SUB_REPO_DIR, DEFAULT_STORAGE_ADAPTER, STORAGE_ADAPTERS, SOURCE_TYPES, SOURCE_TYPE_RECIPE, SOURCE_TYPE_TARGET_README, DEFAULT_SOURCES, DEFAULT_CHUNKING, CHUNKING_STRATEGIES, DEFAULT_MAX_CHUNK_TOKENS, DEFAULT_OVERLAP_TOKENS, CHARS_PER_TOKEN, README_NAMES, DEFAULT_ASD_UI_URL, GUARD_CONTEXT_EXCERPT_LIMIT, CATEGORY_RULES, DEFAULT_CATEGORY, inferCategory, };