autosnippet
Version:
Extract code patterns into a knowledge base for AI coding assistants
108 lines (107 loc) • 3.86 kB
JavaScript
/**
* Spring Enhancement Pack
* 条件: { languages: ['java', 'kotlin'], frameworks: ['spring'] }
*/
import { EnhancementPack } from './EnhancementPack.js';
class SpringEnhancement extends EnhancementPack {
get id() {
return 'spring';
}
get displayName() {
return 'Spring Boot Enhancement';
}
get conditions() {
return { languages: ['java', 'kotlin'], frameworks: ['spring'] };
}
getExtraDimensions() {
return [
{
id: 'spring-di-scan',
label: 'Spring DI 分析',
guide: 'DI 容器依赖注入拓扑分析、@Component/@Service/@Repository 分层、@Configuration + @Bean 工厂',
tierHint: 2,
knowledgeTypes: ['architecture', 'code-pattern'],
skillWorthy: true,
dualOutput: true,
skillMeta: {
name: 'project-spring-di',
description: 'Spring dependency injection topology and bean configuration (auto-generated by enhancement)',
},
},
{
id: 'spring-api-scan',
label: 'REST API 分析',
guide: '@RestController + @RequestMapping endpoint 清单、请求/响应 DTO、异常处理策略',
tierHint: 2,
knowledgeTypes: ['architecture'],
skillWorthy: true,
dualOutput: true,
skillMeta: {
name: 'project-spring-api',
description: 'Spring REST API endpoints, DTOs and error handling (auto-generated by enhancement)',
},
},
];
}
getGuardRules() {
return [
{
ruleId: 'spring-field-injection',
category: 'style',
dimension: 'file',
severity: 'warning',
languages: ['java', 'kotlin'],
pattern: /@Autowired\s+(?:private|protected)\s/,
message: '建议使用构造函数注入替代字段注入(@Autowired on field)',
},
];
}
detectPatterns(astSummary) {
const patterns = [];
for (const cls of astSummary.classes || []) {
const annos = cls.annotations || [];
if (annos.some((a) => /@RestController/.test(a))) {
patterns.push({
type: 'spring-rest-controller',
className: cls.name,
line: cls.line,
confidence: 0.95,
});
}
if (annos.some((a) => /@Service/.test(a))) {
patterns.push({
type: 'spring-service',
className: cls.name,
line: cls.line,
confidence: 0.95,
});
}
if (annos.some((a) => /@Repository/.test(a))) {
patterns.push({
type: 'spring-repository',
className: cls.name,
line: cls.line,
confidence: 0.95,
});
}
if (annos.some((a) => /@Entity/.test(a))) {
patterns.push({
type: 'jpa-entity',
className: cls.name,
line: cls.line,
confidence: 0.95,
});
}
if (annos.some((a) => /@Configuration/.test(a))) {
patterns.push({
type: 'spring-configuration',
className: cls.name,
line: cls.line,
confidence: 0.95,
});
}
}
return patterns;
}
}
export const pack = new SpringEnhancement();