autosnippet
Version:
Extract code patterns into a knowledge base for AI coding assistants
207 lines (206 loc) • 12 kB
JavaScript
/**
* dimension-text.js — 固定文本内容注册表
*
* 从 MissionBriefingBuilder.js 和 bootstrap-internal.js 中抽取的
* 可直接复用的固定文本常量和提示模板。
*
* 集中管理:
* - SUBMISSION_SCHEMA: 提交工具定义和必填字段
* - EXAMPLE_TEMPLATES: 语言自适应示例模板
* - QUALITY_GATES: 提交质量门控描述
* - 完成后提示文本
*
* 调用方:
* - MissionBriefingBuilder.js (外部 Agent) — 构建 Mission Briefing
* - bootstrap-internal.js (内部 Agent) — 响应中的 analysisFramework
* - consolidated.js — 提交校验反馈文本
*
* @module bootstrap/shared/dimension-text
*/
import { getRequiredFieldNames, getRequiredFieldsDescription, } from '#domain/knowledge/FieldSpec.js';
// ═══════════════════════════════════════════════════════════
// 提交 Schema 定义
// ═══════════════════════════════════════════════════════════
/** 知识提交的完整 Schema — 定义必填字段、内容结构、枚举值和质量门控 */
export const SUBMISSION_SCHEMA = {
tool: 'autosnippet_submit_knowledge',
batchTool: 'autosnippet_submit_knowledge_batch',
requiredFields: getRequiredFieldNames(),
contentStructure: {
pattern: '代码片段(可选)',
markdown: 'Markdown 正文(必填,≥200 字符,项目特写风格)',
rationale: '设计原理说明(必填)',
},
categoryEnum: ['View', 'Service', 'Tool', 'Model', 'Network', 'Storage', 'UI', 'Utility'],
kindEnum: ['rule', 'pattern', 'fact'],
reasoning: {
whyStandard: '字符串 — 为什么这是标准做法',
sources: '字符串数组 — 参考的文件名(必须非空)',
confidence: '0.0-1.0(推荐 0.7-0.9)',
},
qualityGates: [
'content.markdown ≥ 200 字符',
'至少包含 1 个代码块 (```)',
'包含来源标注 (来源: FileName:行号)',
'标题使用项目真实类名(不以项目名开头)',
'trigger 必须唯一(同批次内不重复)',
],
};
// ═══════════════════════════════════════════════════════════
// 语言自适应示例模板
// ═══════════════════════════════════════════════════════════
/**
* 按项目主语言提供 few-shot 示例。
* Agent 直接模仿示例格式提交知识。
*/
export const EXAMPLE_TEMPLATES = {
objectivec: {
title: 'BD 前缀命名规范',
language: 'objectivec',
content: {
markdown: '## BD 前缀命名规范\n\n项目中所有类必须使用 `BD` 前缀...\n\n### 项目选择了什么\n全部 85 个类中,83 个使用 BD 前缀...\n\n```objectivec\n// ✅ 正确\n@interface BDVideoPlayer : UIView\n// ❌ 禁止\n@interface VideoPlayer : UIView\n```\n(来源: BDVideoPlayer.h:5)\n\n### 新代码怎么写\n统一使用 BD + 模块缩写 + 功能名',
rationale: '统一前缀便于代码导航和模块归属识别,85/85 类遵循此规范',
},
kind: 'rule',
doClause: 'Prefix all class names with BD for consistent module attribution',
dontClause: 'create classes without BD prefix in any module',
whenClause: 'When creating new Objective-C classes or protocols',
category: 'Tool',
trigger: '@bd-naming-prefix',
description: '所有类名必须使用 BD 前缀,确保模块归属一致性',
headers: [],
usageGuide: '### 何时使用\n创建任何新类时必须遵守\n### 规范\n类名: BD + 模块缩写 + 功能名',
knowledgeType: 'code-standard',
coreCode: '@interface BDVideoPlayer : UIView\n@end\n\n@interface BDNetworkManager : NSObject\n@end',
reasoning: {
whyStandard: '83/85 (97.6%) classes use BD prefix',
sources: ['BDVideoPlayer.h', 'BDBaseRequest.h'],
confidence: 0.95,
},
},
typescript: {
title: 'Service 类统一 Injectable 装饰器',
language: 'typescript',
content: {
markdown: '## Service 类统一 Injectable 装饰器\n\n项目中所有 Service 类必须使用 `@Injectable()` 装饰器...\n\n### 项目选择了什么\n32 个 Service 类中,30 个使用 Injectable 装饰器...\n\n```typescript\n// ✅ 正确\n@Injectable()\nexport class UserService {\n constructor(private readonly db: DatabaseService) {}\n}\n// ❌ 禁止\nexport class UserService {}\n```\n(来源: src/services/UserService.ts:5)\n\n### 新代码怎么写\n...',
rationale: 'DI 容器要求所有 Service 使用 Injectable 装饰器',
},
kind: 'rule',
doClause: 'Use @Injectable() decorator on all service classes',
dontClause: 'Do not create service classes without @Injectable() decorator',
whenClause: 'When creating new service classes in the DI container',
category: 'Service',
trigger: '@injectable-services',
description: '所有 Service 类必须使用 @Injectable() 装饰器',
headers: ["import { Injectable } from '@nestjs/common';"],
usageGuide: '### 何时使用\n创建任何新 Service 类时\n### 规范\n所有 Service 类顶部添加 @Injectable()',
knowledgeType: 'code-standard',
coreCode: '@Injectable()\nexport class UserService {\n constructor(private db: DB) {}\n}',
reasoning: {
whyStandard: '30/32 services use @Injectable()',
sources: ['src/services/UserService.ts', 'src/services/AuthService.ts'],
confidence: 0.9,
},
},
python: {
title: 'Service 层统一异步模式',
language: 'python',
content: {
markdown: '## Service 层统一异步模式\n\n项目中所有 Service 层函数使用 `async def`...\n\n### 项目选择了什么\n全部 28 个 Service 函数中,26 个使用 async def...\n\n```python\n# ✅ 正确\nasync def get_user(db: AsyncSession, user_id: int) -> User:\n result = await db.execute(select(User).filter_by(id=user_id))\n return result.scalar_one_or_none()\n\n# ❌ 禁止\ndef get_user(db, user_id):\n ...\n```\n(来源: services/user_service.py:15)\n\n### 新代码怎么写\n...',
rationale: 'FastAPI 框架要求所有 I/O 操作使用 async/await',
},
kind: 'rule',
doClause: 'Use async def for all service layer functions',
dontClause: 'Do not use synchronous def for service layer I/O operations',
whenClause: 'When creating or modifying service layer functions with I/O',
category: 'Service',
trigger: '@async-service-pattern',
description: '所有 Service 层函数使用 async def',
headers: ['from sqlalchemy.ext.asyncio import AsyncSession'],
usageGuide: '### 何时使用\n创建任何新 Service 函数时\n### 规范\n统一使用 async def + await',
knowledgeType: 'code-standard',
coreCode: 'async def get_user(db: AsyncSession, user_id: int) -> User:\n result = await db.execute(select(User).filter_by(id=user_id))\n return result.scalar_one_or_none()',
reasoning: {
whyStandard: '26/28 service functions use async def',
sources: ['services/user_service.py', 'services/auth_service.py'],
confidence: 0.9,
},
},
// 通用 fallback
_default: {
title: '项目命名规范示例',
language: 'text',
content: {
markdown: '## 项目命名规范\n\n分析项目中的命名约定...\n\n### 项目选择了什么\n描述项目中使用的命名约定...\n\n```\n// ✅ 正确\n示例代码\n// ❌ 禁止\n反面示例\n```\n(来源: path/to/file:行号)\n\n### 新代码怎么写\n...',
rationale: '统一命名便于代码导航',
},
kind: 'rule',
doClause: 'Follow the project naming convention',
dontClause: 'Do not deviate from the established naming pattern',
whenClause: 'When creating new files, classes, functions, or variables',
category: 'Tool',
trigger: '@naming-convention',
description: '遵循项目命名规范',
headers: [],
usageGuide: '### 何时使用\n创建任何新代码时\n### 规范\n遵循已有命名约定',
knowledgeType: 'code-standard',
coreCode: '// 示例代码',
reasoning: {
whyStandard: 'Consistent naming across codebase',
sources: ['example.file'],
confidence: 0.8,
},
},
};
// ═══════════════════════════════════════════════════════════
// 提交必填字段列表 (供拒绝反馈使用)
// ═══════════════════════════════════════════════════════════
/**
* 提交被拒绝时返回的必填字段说明列表
* —— 由 FieldSpec 驱动自动生成
*/
export const REQUIRED_FIELDS_DESCRIPTION = getRequiredFieldsDescription();
// ═══════════════════════════════════════════════════════════
// 完成后提示文本
// ═══════════════════════════════════════════════════════════
/**
* 内部 Agent 完成后的 nextSteps 提示
*
* @param dimensions 激活的维度列表
*/
export function buildInternalNextSteps(dimensions) {
return [
`✅ Bootstrap 骨架已创建,${dimensions.length} 个维度的 AI 分析任务已在后台启动。`,
'',
'== 后台自动执行中 ==',
'后台 AI pipeline 正在逐维度分析代码并创建候选(Analyst → Producer 双 Agent 模式)。',
'进度通过 Dashboard 实时展示,无需手动操作。',
'',
'== 完成后可执行的后续操作 ==',
'1. 调用 autosnippet_enrich_candidates(candidateIds) 补全候选缺失字段',
'2. 使用 autosnippet_submit_knowledge_batch 手动提交更多知识条目',
'3. 使用 autosnippet_submit_knowledge 逐条提交高质量知识',
'4. 使用 autosnippet_skill({ operation: "load", name }) 加载自动生成的 Project Skills',
'',
'== 宏观维度 → Project Skills ==',
`宏观维度(${dimensions
.filter((d) => d.skillWorthy)
.map((d) => d.id)
.join('/')})`,
'自动生成 Project Skill 到 AutoSnippet/skills/,可通过 autosnippet_skill({ operation: "load" }) 加载。',
];
}
/** Bootstrap 全部维度完成后的 nextActions(供外部 Agent 使用) */
export const BOOTSTRAP_COMPLETE_ACTIONS = [
{
action: 'cursor_delivery',
prompt: '知识库初始化完成!Cursor Rules 已自动生成到 .cursor/rules/ 目录。如果生成失败,你可以手动触发 Cursor Delivery。',
tool: 'autosnippet_cursor_delivery',
auto: true, // R4: 已自动触发,此条仅为通知
},
{
action: 'wiki_generate',
prompt: '知识库初始化完成!是否继续生成项目 Wiki 文档?Wiki 将基于刚建立的知识库和项目分析数据自动生成结构化文档。',
tool: 'autosnippet_wiki_plan',
},
];