autosnippet 3.0.1 → 3.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +230 -324
- package/bin/api-server.js +1 -1
- package/bin/cli.js +204 -244
- package/bin/mcp-server.js +5 -3
- package/config/knowledge-base.config.js +132 -132
- package/dashboard/dist/assets/{icons-CEfgGaZi.js → icons-Cdq22n2i.js} +95 -100
- package/dashboard/dist/assets/index-ClkyPkDX.js +133 -0
- package/dashboard/dist/assets/index-t4QrJwv1.css +1 -0
- package/dashboard/dist/index.html +3 -3
- package/lib/bootstrap.js +8 -8
- package/lib/cli/AiScanService.js +86 -40
- package/lib/cli/KnowledgeSyncService.js +113 -74
- package/lib/cli/SetupService.js +439 -277
- package/lib/cli/UpgradeService.js +63 -100
- package/lib/core/AstAnalyzer.js +276 -597
- package/lib/core/ast/ProjectGraph.js +101 -40
- package/lib/core/ast/ensure-grammars.js +232 -0
- package/lib/core/ast/index.js +115 -0
- package/lib/core/ast/lang-dart.js +661 -0
- package/lib/core/ast/lang-go.js +530 -0
- package/lib/core/ast/lang-java.js +435 -0
- package/lib/core/ast/lang-javascript.js +272 -0
- package/lib/core/ast/lang-kotlin.js +423 -0
- package/lib/core/ast/lang-objc.js +388 -0
- package/lib/core/ast/lang-python.js +371 -0
- package/lib/core/ast/lang-swift.js +337 -0
- package/lib/core/ast/lang-typescript.js +503 -0
- package/lib/core/capability/CapabilityProbe.js +18 -9
- package/lib/core/constitution/Constitution.js +2 -3
- package/lib/core/constitution/ConstitutionValidator.js +65 -24
- package/lib/core/discovery/DartDiscoverer.js +534 -0
- package/lib/core/discovery/DiscovererRegistry.js +83 -0
- package/lib/core/discovery/GenericDiscoverer.js +225 -0
- package/lib/core/discovery/GoDiscoverer.js +541 -0
- package/lib/core/discovery/JvmDiscoverer.js +506 -0
- package/lib/core/discovery/NodeDiscoverer.js +466 -0
- package/lib/core/discovery/ProjectDiscoverer.js +93 -0
- package/lib/core/discovery/PythonDiscoverer.js +338 -0
- package/lib/core/discovery/SpmDiscoverer.js +5 -0
- package/lib/core/discovery/index.js +53 -0
- package/lib/core/enhancement/EnhancementPack.js +71 -0
- package/lib/core/enhancement/EnhancementRegistry.js +47 -0
- package/lib/core/enhancement/android-enhancement.js +102 -0
- package/lib/core/enhancement/django-enhancement.js +70 -0
- package/lib/core/enhancement/fastapi-enhancement.js +63 -0
- package/lib/core/enhancement/go-grpc-enhancement.js +152 -0
- package/lib/core/enhancement/go-web-enhancement.js +201 -0
- package/lib/core/enhancement/index.js +65 -0
- package/lib/core/enhancement/node-server-enhancement.js +88 -0
- package/lib/core/enhancement/react-enhancement.js +86 -0
- package/lib/core/enhancement/spring-enhancement.js +112 -0
- package/lib/core/enhancement/vue-enhancement.js +96 -0
- package/lib/core/gateway/Gateway.js +8 -9
- package/lib/core/gateway/GatewayActionRegistry.js +1 -1
- package/lib/core/permission/PermissionManager.js +12 -8
- package/lib/domain/index.js +13 -9
- package/lib/domain/knowledge/KnowledgeEntry.js +111 -101
- package/lib/domain/knowledge/KnowledgeRepository.js +0 -1
- package/lib/domain/knowledge/Lifecycle.js +22 -22
- package/lib/domain/knowledge/index.js +9 -12
- package/lib/domain/knowledge/values/Constraints.js +31 -21
- package/lib/domain/knowledge/values/Content.js +21 -13
- package/lib/domain/knowledge/values/Quality.js +31 -18
- package/lib/domain/knowledge/values/Reasoning.js +20 -12
- package/lib/domain/knowledge/values/Relations.js +37 -25
- package/lib/domain/knowledge/values/Stats.js +18 -12
- package/lib/domain/knowledge/values/index.js +4 -3
- package/lib/domain/snippet/Snippet.js +35 -10
- package/lib/external/ai/AiFactory.js +48 -16
- package/lib/external/ai/AiProvider.js +184 -90
- package/lib/external/ai/providers/ClaudeProvider.js +25 -12
- package/lib/external/ai/providers/GoogleGeminiProvider.js +59 -30
- package/lib/external/ai/providers/MockProvider.js +9 -3
- package/lib/external/ai/providers/OpenAiProvider.js +51 -29
- package/lib/external/mcp/McpServer.js +66 -36
- package/lib/external/mcp/errorHandler.js +23 -11
- package/lib/external/mcp/handlers/LanguageExtensions.js +138 -53
- package/lib/external/mcp/handlers/TargetClassifier.js +52 -16
- package/lib/external/mcp/handlers/bootstrap/pipeline/BootstrapSnapshot.js +81 -20
- package/lib/external/mcp/handlers/bootstrap/pipeline/EpisodicMemory.js +71 -42
- package/lib/external/mcp/handlers/bootstrap/pipeline/IncrementalBootstrap.js +9 -17
- package/lib/external/mcp/handlers/bootstrap/pipeline/ToolResultCache.js +14 -9
- package/lib/external/mcp/handlers/bootstrap/pipeline/dimension-context.js +15 -7
- package/lib/external/mcp/handlers/bootstrap/pipeline/orchestrator.js +352 -153
- package/lib/external/mcp/handlers/bootstrap/pipeline/tier-scheduler.js +52 -12
- package/lib/external/mcp/handlers/bootstrap/skills.js +143 -39
- package/lib/external/mcp/handlers/bootstrap.js +691 -168
- package/lib/external/mcp/handlers/browse.js +66 -22
- package/lib/external/mcp/handlers/candidate.js +118 -35
- package/lib/external/mcp/handlers/consolidated.js +49 -17
- package/lib/external/mcp/handlers/guard.js +104 -39
- package/lib/external/mcp/handlers/knowledge.js +60 -36
- package/lib/external/mcp/handlers/search.js +43 -14
- package/lib/external/mcp/handlers/skill.js +120 -45
- package/lib/external/mcp/handlers/structure.js +240 -86
- package/lib/external/mcp/handlers/system.js +42 -12
- package/lib/external/mcp/handlers/wiki.js +58 -33
- package/lib/external/mcp/tools.js +306 -123
- package/lib/http/HttpServer.js +72 -47
- package/lib/http/middleware/RateLimiter.js +5 -3
- package/lib/http/middleware/errorHandler.js +6 -1
- package/lib/http/middleware/requestLogger.js +14 -3
- package/lib/http/middleware/roleResolver.js +30 -23
- package/lib/http/routes/ai.js +387 -265
- package/lib/http/routes/auth.js +81 -61
- package/lib/http/routes/candidates.js +430 -320
- package/lib/http/routes/commands.js +289 -189
- package/lib/http/routes/extract.js +158 -125
- package/lib/http/routes/guardRules.js +309 -217
- package/lib/http/routes/knowledge.js +213 -154
- package/lib/http/routes/modules.js +578 -0
- package/lib/http/routes/monitoring.js +6 -6
- package/lib/http/routes/recipes.js +104 -93
- package/lib/http/routes/search.js +361 -305
- package/lib/http/routes/skills.js +145 -98
- package/lib/http/routes/snippets.js +42 -30
- package/lib/http/routes/spm.js +3 -405
- package/lib/http/routes/violations.js +113 -93
- package/lib/http/routes/wiki.js +211 -170
- package/lib/http/utils/routeHelpers.js +3 -1
- package/lib/http/utils/sse-sessions.js +16 -6
- package/lib/http/utils/sse.js +15 -5
- package/lib/infrastructure/audit/AuditLogger.js +5 -2
- package/lib/infrastructure/audit/AuditStore.js +10 -7
- package/lib/infrastructure/cache/CacheService.js +3 -1
- package/lib/infrastructure/cache/GraphCache.js +8 -4
- package/lib/infrastructure/cache/UnifiedCacheAdapter.js +1 -1
- package/lib/infrastructure/config/ConfigLoader.js +9 -5
- package/lib/infrastructure/config/Defaults.js +30 -10
- package/lib/infrastructure/config/Paths.js +28 -8
- package/lib/infrastructure/config/TriggerSymbol.js +22 -10
- package/lib/infrastructure/database/DatabaseConnection.js +15 -10
- package/lib/infrastructure/database/migrations/001_initial_schema.js +0 -1
- package/lib/infrastructure/external/ClipboardManager.js +6 -2
- package/lib/infrastructure/external/NativeUi.js +50 -43
- package/lib/infrastructure/external/OpenBrowser.js +14 -17
- package/lib/infrastructure/external/XcodeAutomation.js +14 -258
- package/lib/infrastructure/logging/Logger.js +46 -30
- package/lib/infrastructure/monitoring/ErrorTracker.js +7 -5
- package/lib/infrastructure/monitoring/PerformanceMonitor.js +12 -4
- package/lib/infrastructure/paths/HeaderResolver.js +25 -9
- package/lib/infrastructure/paths/PathFinder.js +34 -12
- package/lib/infrastructure/plugin/PluginManager.js +26 -8
- package/lib/infrastructure/realtime/RealtimeService.js +2 -2
- package/lib/infrastructure/vector/Chunker.js +22 -7
- package/lib/infrastructure/vector/IndexingPipeline.js +46 -22
- package/lib/infrastructure/vector/JsonVectorAdapter.js +90 -53
- package/lib/infrastructure/vector/VectorStore.js +28 -10
- package/lib/injection/ServiceContainer.js +247 -93
- package/lib/platform/ios/index.js +63 -0
- package/lib/platform/ios/routes/spm.js +437 -0
- package/lib/platform/ios/snippet/PlaceholderConverter.js +55 -0
- package/lib/platform/ios/snippet/XcodeCodec.js +112 -0
- package/lib/{service → platform/ios}/spm/DependencyGraph.js +41 -17
- package/lib/{service → platform/ios}/spm/PackageSwiftParser.js +41 -14
- package/lib/{service → platform/ios}/spm/PolicyEngine.js +9 -4
- package/lib/platform/ios/spm/SpmDiscoverer.js +122 -0
- package/lib/{service → platform/ios}/spm/SpmService.js +385 -127
- package/lib/{service/automation → platform/ios/xcode}/SaveEventFilter.js +8 -7
- package/lib/platform/ios/xcode/XcodeAutomation.js +350 -0
- package/lib/{service/automation → platform/ios/xcode}/XcodeIntegration.js +325 -145
- package/lib/repository/base/BaseRepository.js +7 -9
- package/lib/repository/knowledge/KnowledgeRepository.impl.js +98 -75
- package/lib/repository/token/TokenUsageStore.js +4 -2
- package/lib/service/automation/ActionPipeline.js +1 -1
- package/lib/service/automation/AutomationOrchestrator.js +8 -4
- package/lib/service/automation/ContextCollector.js +7 -5
- package/lib/service/automation/DirectiveDetector.js +23 -16
- package/lib/service/automation/FileWatcher.js +112 -56
- package/lib/service/automation/TriggerResolver.js +6 -4
- package/lib/service/automation/handlers/AlinkHandler.js +24 -12
- package/lib/service/automation/handlers/CreateHandler.js +19 -20
- package/lib/service/automation/handlers/DraftHandler.js +14 -8
- package/lib/service/automation/handlers/GuardHandler.js +93 -63
- package/lib/service/automation/handlers/HeaderHandler.js +1 -6
- package/lib/service/automation/handlers/SearchHandler.js +155 -88
- package/lib/service/bootstrap/BootstrapTaskManager.js +77 -35
- package/lib/service/candidate/SimilarityService.js +25 -9
- package/lib/service/chat/AnalystAgent.js +50 -24
- package/lib/service/chat/CandidateGuardrail.js +143 -17
- package/lib/service/chat/ChatAgent.js +655 -260
- package/lib/service/chat/ContextWindow.js +116 -71
- package/lib/service/chat/ConversationStore.js +77 -36
- package/lib/service/chat/EpisodicConsolidator.js +47 -23
- package/lib/service/chat/HandoffProtocol.js +98 -22
- package/lib/service/chat/Memory.js +34 -14
- package/lib/service/chat/ProducerAgent.js +40 -20
- package/lib/service/chat/ProjectSemanticMemory.js +109 -78
- package/lib/service/chat/ReasoningLayer.js +148 -70
- package/lib/service/chat/ReasoningTrace.js +44 -32
- package/lib/service/chat/TaskPipeline.js +39 -19
- package/lib/service/chat/ToolRegistry.js +48 -29
- package/lib/service/chat/WorkingMemory.js +44 -18
- package/lib/service/chat/tools.js +1096 -494
- package/lib/service/context/RecipeExtractor.js +132 -51
- package/lib/service/cursor/CursorDeliveryPipeline.js +82 -37
- package/lib/service/cursor/KnowledgeCompressor.js +25 -22
- package/lib/service/cursor/RulesGenerator.js +13 -7
- package/lib/service/cursor/SkillsSyncer.js +77 -27
- package/lib/service/cursor/TokenBudget.js +2 -2
- package/lib/service/cursor/TopicClassifier.js +54 -20
- package/lib/service/guard/ComplianceReporter.js +55 -43
- package/lib/service/guard/ExclusionManager.js +67 -29
- package/lib/service/guard/GuardCheckEngine.js +381 -86
- package/lib/service/guard/GuardFeedbackLoop.js +22 -10
- package/lib/service/guard/GuardService.js +29 -19
- package/lib/service/guard/RuleLearner.js +55 -23
- package/lib/service/guard/SourceFileCollector.js +27 -20
- package/lib/service/guard/ViolationsStore.js +43 -38
- package/lib/service/knowledge/CodeEntityGraph.js +147 -82
- package/lib/service/knowledge/ConfidenceRouter.js +12 -10
- package/lib/service/knowledge/KnowledgeFileWriter.js +147 -56
- package/lib/service/knowledge/KnowledgeGraphService.js +81 -34
- package/lib/service/knowledge/KnowledgeService.js +222 -112
- package/lib/service/module/ModuleService.js +969 -0
- package/lib/service/quality/FeedbackCollector.js +27 -15
- package/lib/service/quality/QualityScorer.js +78 -24
- package/lib/service/recipe/RecipeCandidateValidator.js +110 -44
- package/lib/service/recipe/RecipeParser.js +78 -45
- package/lib/service/search/CoarseRanker.js +43 -28
- package/lib/service/search/CrossEncoderReranker.js +32 -21
- package/lib/service/search/InvertedIndex.js +21 -7
- package/lib/service/search/MultiSignalRanker.js +90 -28
- package/lib/service/search/RetrievalFunnel.js +45 -24
- package/lib/service/search/SearchEngine.js +255 -103
- package/lib/service/skills/EventAggregator.js +32 -15
- package/lib/service/skills/SignalCollector.js +140 -64
- package/lib/service/skills/SkillAdvisor.js +79 -42
- package/lib/service/skills/SkillHooks.js +16 -14
- package/lib/service/snippet/PlaceholderConverter.js +5 -0
- package/lib/service/snippet/SnippetFactory.js +116 -99
- package/lib/service/snippet/SnippetInstaller.js +234 -62
- package/lib/service/snippet/codecs/SnippetCodec.js +67 -0
- package/lib/service/snippet/codecs/VSCodeCodec.js +102 -0
- package/lib/service/snippet/codecs/XcodeCodec.js +5 -0
- package/lib/service/wiki/WikiGenerator.js +637 -263
- package/lib/shared/DimensionCopyRegistry.js +472 -0
- package/lib/shared/LanguageService.js +399 -0
- package/lib/shared/PathGuard.js +45 -28
- package/lib/shared/RecipeReadinessChecker.js +72 -12
- package/lib/shared/constants.js +41 -41
- package/lib/shared/errors/BaseError.js +2 -2
- package/lib/shared/errors/index.js +4 -4
- package/lib/shared/similarity.js +25 -8
- package/lib/shared/token-utils.js +6 -2
- package/lib/shared/utils/common.js +12 -4
- package/package.json +49 -13
- package/scripts/bench-real-projects.mjs +256 -0
- package/scripts/build-native-ui.js +30 -30
- package/scripts/clear-old-vector-index.js +5 -35
- package/scripts/clear-vector-cache.js +7 -37
- package/scripts/collect-test-project-stats.mjs +160 -0
- package/scripts/diagnose-mcp.js +41 -32
- package/scripts/ensure-parse-package.js +6 -9
- package/scripts/generate-recipe-drafts.js +116 -77
- package/scripts/init-db.js +3 -20
- package/scripts/init-snippets.js +305 -0
- package/scripts/init-vector-db.js +173 -170
- package/scripts/install-cursor-skill.js +148 -104
- package/scripts/install-full.js +8 -21
- package/scripts/install-vscode-copilot.js +146 -145
- package/scripts/migrate-md-to-knowledge.mjs +139 -151
- package/scripts/postinstall-safe.js +5 -17
- package/scripts/recipe-audit.js +106 -82
- package/scripts/release.js +283 -323
- package/scripts/setup-mcp-config.js +60 -52
- package/scripts/verify-context-api.js +20 -20
- package/skills/autosnippet-analysis/SKILL.md +10 -6
- package/skills/autosnippet-candidates/SKILL.md +27 -26
- package/skills/autosnippet-coldstart/SKILL.md +555 -38
- package/skills/autosnippet-concepts/SKILL.md +349 -337
- package/skills/autosnippet-create/SKILL.md +5 -5
- package/skills/autosnippet-reference-dart/SKILL.md +543 -0
- package/skills/autosnippet-reference-go/SKILL.md +539 -0
- package/skills/autosnippet-reference-java/SKILL.md +534 -0
- package/skills/autosnippet-reference-jsts/SKILL.md +41 -9
- package/skills/autosnippet-reference-kotlin/SKILL.md +526 -0
- package/skills/autosnippet-reference-objc/SKILL.md +29 -6
- package/skills/autosnippet-reference-python/SKILL.md +800 -0
- package/skills/autosnippet-reference-swift/SKILL.md +70 -14
- package/skills/autosnippet-structure/SKILL.md +4 -4
- package/templates/cursor-rules/autosnippet-conventions.mdc +2 -2
- package/templates/recipes-setup/README.md +2 -2
- package/templates/recipes-setup/_template.md +1 -1
- package/dashboard/dist/assets/index-Bun3ld_J.css +0 -1
- package/dashboard/dist/assets/index-_Sk_Dmg3.js +0 -143
- package/resources/asd-entry/main.swift +0 -159
- package/scripts/build-asd-entry.js +0 -51
- package/scripts/init-xcode-snippets.js +0 -311
- package/template.json +0 -39
|
@@ -0,0 +1,472 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module DimensionCopyRegistry
|
|
3
|
+
* @description 维度文案注册表 — 按编程语言提供差异化的 label 和 guide
|
|
4
|
+
*
|
|
5
|
+
* Bootstrap 的 baseDimensions 中每个维度的 label/guide 不再硬编码为 ObjC/Swift 视角,
|
|
6
|
+
* 而是通过此注册表按项目主语言动态选择最匹配的文案。
|
|
7
|
+
*
|
|
8
|
+
* ---
|
|
9
|
+
* 使用方式:
|
|
10
|
+
* import { DimensionCopy } from '../shared/DimensionCopyRegistry.js';
|
|
11
|
+
* const copy = DimensionCopy.get('code-pattern', 'python');
|
|
12
|
+
* // → { label: '设计模式与代码惯例', guide: '装饰器/描述器/上下文管理器/生成器/ABC 抽象基类/Mixin 模式' }
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
// ═══════════════════════════════════════════════════════════
|
|
16
|
+
// 语言族定义
|
|
17
|
+
// ═══════════════════════════════════════════════════════════
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* 将具体语言归入语言族(用于文案选择 fallback)
|
|
21
|
+
* @param {string} lang
|
|
22
|
+
* @returns {string} 语言族 ID
|
|
23
|
+
*/
|
|
24
|
+
function _langFamily(lang) {
|
|
25
|
+
switch (lang) {
|
|
26
|
+
case 'swift':
|
|
27
|
+
case 'objectivec':
|
|
28
|
+
return 'apple';
|
|
29
|
+
case 'typescript':
|
|
30
|
+
case 'javascript':
|
|
31
|
+
return 'js';
|
|
32
|
+
case 'java':
|
|
33
|
+
case 'kotlin':
|
|
34
|
+
return 'jvm';
|
|
35
|
+
default:
|
|
36
|
+
return lang; // python, go, rust, ruby 等本身就是族
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// ═══════════════════════════════════════════════════════════
|
|
41
|
+
// 通用维度文案 — 各语言差异化
|
|
42
|
+
// ═══════════════════════════════════════════════════════════
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* 维度文案格式: { label: string, guide: string }
|
|
46
|
+
* - `_default` 为兜底
|
|
47
|
+
* - 按语言族 key (apple/js/jvm/python/go/rust/ruby) 覆盖
|
|
48
|
+
*
|
|
49
|
+
* 注意:条件维度(objc-deep-scan 等)不需要多语言文案,因为它们本身就是特定语言才激活
|
|
50
|
+
*/
|
|
51
|
+
const COPY_REGISTRY = {
|
|
52
|
+
// ── ① 代码规范 ──────────────────────────────────────
|
|
53
|
+
'code-standard': {
|
|
54
|
+
_default: {
|
|
55
|
+
label: '代码规范',
|
|
56
|
+
guide: '命名约定、注释风格、文件组织规范、代码格式化标准',
|
|
57
|
+
},
|
|
58
|
+
apple: {
|
|
59
|
+
label: '代码规范',
|
|
60
|
+
guide:
|
|
61
|
+
'命名约定(类名前缀/方法签名风格/API 命名)、注释风格(语言/格式/MARK 分段)、文件组织规范',
|
|
62
|
+
},
|
|
63
|
+
js: {
|
|
64
|
+
label: '代码规范',
|
|
65
|
+
guide:
|
|
66
|
+
'命名约定(camelCase/PascalCase/UPPER_CASE)、ESLint/Prettier 风格、文件/目录命名、注释与 JSDoc 规范',
|
|
67
|
+
},
|
|
68
|
+
jvm: {
|
|
69
|
+
label: '代码规范',
|
|
70
|
+
guide:
|
|
71
|
+
'命名约定(类名/方法名/常量)、包结构组织、Javadoc/KDoc 注释规范、代码格式化(Checkstyle/ktlint)',
|
|
72
|
+
},
|
|
73
|
+
python: {
|
|
74
|
+
label: '代码规范',
|
|
75
|
+
guide:
|
|
76
|
+
'命名约定(PEP 8 snake_case/PascalCase)、docstring 风格(Google/NumPy/Sphinx)、import 排序、Black/Ruff 格式化',
|
|
77
|
+
},
|
|
78
|
+
go: {
|
|
79
|
+
label: '代码规范',
|
|
80
|
+
guide: '命名约定(exported/unexported、MixedCaps)、gofmt 格式化、注释规范(godoc)、包组织',
|
|
81
|
+
},
|
|
82
|
+
dart: {
|
|
83
|
+
label: '代码规范',
|
|
84
|
+
guide:
|
|
85
|
+
'命名约定(lowerCamelCase/UpperCamelCase/snake_case 文件名)、dart format 格式化、/// 文档注释、library 组织、effective dart 规范',
|
|
86
|
+
},
|
|
87
|
+
rust: {
|
|
88
|
+
label: '代码规范',
|
|
89
|
+
guide:
|
|
90
|
+
'命名约定(snake_case/CamelCase)、rustfmt 格式化、/// 文档注释、模块组织(mod.rs/lib.rs)',
|
|
91
|
+
},
|
|
92
|
+
},
|
|
93
|
+
|
|
94
|
+
// ── ② 设计模式与代码惯例 ─────────────────────────────
|
|
95
|
+
'code-pattern': {
|
|
96
|
+
_default: {
|
|
97
|
+
label: '设计模式与代码惯例',
|
|
98
|
+
guide: '单例/工厂/观察者/策略/Builder 等设计模式在项目中的使用方式',
|
|
99
|
+
},
|
|
100
|
+
apple: {
|
|
101
|
+
label: '设计模式与代码惯例',
|
|
102
|
+
guide: '单例/委托/Category·Extension/工厂/Builder/观察者/Coordinator 模式、继承关系',
|
|
103
|
+
},
|
|
104
|
+
js: {
|
|
105
|
+
label: '设计模式与代码惯例',
|
|
106
|
+
guide:
|
|
107
|
+
'模块模式/工厂函数/观察者(EventEmitter)/中间件/高阶函数/组合模式、框架特有 Hooks/Composition 模式',
|
|
108
|
+
},
|
|
109
|
+
jvm: {
|
|
110
|
+
label: '设计模式与代码惯例',
|
|
111
|
+
guide:
|
|
112
|
+
'Builder/Factory/Singleton/Strategy/Observer 模式、DI 容器注入模式、Repository/Service 分层惯例',
|
|
113
|
+
},
|
|
114
|
+
python: {
|
|
115
|
+
label: '设计模式与代码惯例',
|
|
116
|
+
guide:
|
|
117
|
+
'装饰器/描述器/上下文管理器/生成器/ABC 抽象基类/Mixin 模式、dataclass/Protocol 接口惯例',
|
|
118
|
+
},
|
|
119
|
+
go: {
|
|
120
|
+
label: '设计模式与代码惯例',
|
|
121
|
+
guide:
|
|
122
|
+
'functional options/table-driven tests/interface 消费侧定义/errgroup 并发/middleware 链/构造器函数',
|
|
123
|
+
},
|
|
124
|
+
dart: {
|
|
125
|
+
label: '设计模式与代码惯例',
|
|
126
|
+
guide:
|
|
127
|
+
'Factory/Singleton/Repository/Builder 模式、Widget 组合模式、Mixin 复用、Extension 扩展、Freezed 不可变数据类、Provider/Riverpod 依赖注入',
|
|
128
|
+
},
|
|
129
|
+
rust: {
|
|
130
|
+
label: '设计模式与代码惯例',
|
|
131
|
+
guide:
|
|
132
|
+
'Builder(owned self)/NewType/类型状态/From·Into 转换/Iterator 链/enum 代数类型/derive 宏',
|
|
133
|
+
},
|
|
134
|
+
},
|
|
135
|
+
|
|
136
|
+
// ── ③ 架构模式 ──────────────────────────────────────
|
|
137
|
+
architecture: {
|
|
138
|
+
_default: {
|
|
139
|
+
label: '架构模式',
|
|
140
|
+
guide: '分层架构、模块职责与边界、依赖图、导入约束规则',
|
|
141
|
+
},
|
|
142
|
+
apple: {
|
|
143
|
+
label: '架构模式',
|
|
144
|
+
guide: '分层架构(MVVM/VIPER/TCA)、Package/Target 模块边界、依赖图、import 约束规则',
|
|
145
|
+
},
|
|
146
|
+
js: {
|
|
147
|
+
label: '架构模式',
|
|
148
|
+
guide:
|
|
149
|
+
'分层架构(MVC/MVVM/Hexagonal)、monorepo/package 划分、barrel export 边界、循环依赖检测',
|
|
150
|
+
},
|
|
151
|
+
jvm: {
|
|
152
|
+
label: '架构模式',
|
|
153
|
+
guide:
|
|
154
|
+
'分层架构(Controller→Service→Repository)、模块划分(multi-module/micro-service)、DI 容器组织、依赖反转',
|
|
155
|
+
},
|
|
156
|
+
python: {
|
|
157
|
+
label: '架构模式',
|
|
158
|
+
guide:
|
|
159
|
+
'分层架构(Router→Service→Repository)、包结构(src layout/flat layout)、依赖注入、接口隔离',
|
|
160
|
+
},
|
|
161
|
+
go: {
|
|
162
|
+
label: '架构模式',
|
|
163
|
+
guide:
|
|
164
|
+
'分层架构(Handler→Service→Repository)、internal 包隔离、接口在消费侧定义、依赖注入(wire/fx)',
|
|
165
|
+
},
|
|
166
|
+
dart: {
|
|
167
|
+
label: '架构模式',
|
|
168
|
+
guide:
|
|
169
|
+
'分层架构(Presentation→Domain→Data)、Clean Architecture/MVVM、Package 模块化、Melos monorepo、barrel export 边界、依赖注入(get_it/injectable)',
|
|
170
|
+
},
|
|
171
|
+
rust: {
|
|
172
|
+
label: '架构模式',
|
|
173
|
+
guide: '分层架构、Workspace/crate 边界、pub/pub(crate) 可见性、trait object 抽象层',
|
|
174
|
+
},
|
|
175
|
+
},
|
|
176
|
+
|
|
177
|
+
// ── ④ 最佳实践 ──────────────────────────────────────
|
|
178
|
+
'best-practice': {
|
|
179
|
+
_default: {
|
|
180
|
+
label: '最佳实践',
|
|
181
|
+
guide: '错误处理、并发安全、资源管理、日志规范、测试模式',
|
|
182
|
+
},
|
|
183
|
+
apple: {
|
|
184
|
+
label: '最佳实践',
|
|
185
|
+
guide:
|
|
186
|
+
'错误处理、并发安全(Swift Concurrency/GCD)、内存管理(ARC/weak/unowned)、日志规范、XCTest 模式',
|
|
187
|
+
},
|
|
188
|
+
js: {
|
|
189
|
+
label: '最佳实践',
|
|
190
|
+
guide:
|
|
191
|
+
'错误处理(try-catch/Error 边界)、异步安全(Promise/async-await)、内存泄漏检测、日志规范、Jest/Vitest 测试',
|
|
192
|
+
},
|
|
193
|
+
jvm: {
|
|
194
|
+
label: '最佳实践',
|
|
195
|
+
guide:
|
|
196
|
+
'错误处理(checked/unchecked exception)、并发安全(synchronized/虚拟线程/协程)、连接池管理、日志(SLF4J)、JUnit 测试',
|
|
197
|
+
},
|
|
198
|
+
python: {
|
|
199
|
+
label: '最佳实践',
|
|
200
|
+
guide:
|
|
201
|
+
'错误处理(except Exception/自定义异常)、并发(asyncio/threading/multiprocessing)、资源管理(with 语句)、日志(logging)、pytest 测试',
|
|
202
|
+
},
|
|
203
|
+
go: {
|
|
204
|
+
label: '最佳实践',
|
|
205
|
+
guide:
|
|
206
|
+
'错误处理(error interface/wrapped errors)、并发安全(goroutine/channel/mutex)、defer 资源释放、结构化日志(slog)、table-driven tests',
|
|
207
|
+
},
|
|
208
|
+
dart: {
|
|
209
|
+
label: '最佳实践',
|
|
210
|
+
guide:
|
|
211
|
+
'错误处理(try-catch/自定义 Exception)、异步安全(async-await/Stream/Completer)、内存管理(dispose/mounted 检查)、日志规范(logger 替代 print)、Widget 测试/集成测试/Golden 测试',
|
|
212
|
+
},
|
|
213
|
+
rust: {
|
|
214
|
+
label: '最佳实践',
|
|
215
|
+
guide:
|
|
216
|
+
'错误处理(Result/? 操作符/thiserror)、并发安全(Send+Sync/Arc/Mutex)、生命周期管理、日志(tracing)、#[test] 模式',
|
|
217
|
+
},
|
|
218
|
+
},
|
|
219
|
+
|
|
220
|
+
// ── ⑤ 事件与数据流 ─────────────────────────────────
|
|
221
|
+
'event-and-data-flow': {
|
|
222
|
+
_default: {
|
|
223
|
+
label: '事件与数据流',
|
|
224
|
+
guide: '事件传播机制、状态管理模式、数据流向追踪',
|
|
225
|
+
},
|
|
226
|
+
apple: {
|
|
227
|
+
label: '事件与数据流',
|
|
228
|
+
guide:
|
|
229
|
+
'事件传播(Delegate/Notification/Block·Closure/Target-Action)、数据状态管理(KVO/属性观察/Combine/SwiftUI State)',
|
|
230
|
+
},
|
|
231
|
+
js: {
|
|
232
|
+
label: '事件与数据流',
|
|
233
|
+
guide:
|
|
234
|
+
'事件传播(EventEmitter/DOM Events/Custom Events)、状态管理(Redux/Vuex/Pinia/Zustand/Context)、响应式流(RxJS/Observable)',
|
|
235
|
+
},
|
|
236
|
+
jvm: {
|
|
237
|
+
label: '事件与数据流',
|
|
238
|
+
guide:
|
|
239
|
+
'事件传播(Spring Events/LiveData/StateFlow/EventBus)、状态管理(ViewModel/Repository Cache)、消息队列(Kafka/RabbitMQ)',
|
|
240
|
+
},
|
|
241
|
+
python: {
|
|
242
|
+
label: '事件与数据流',
|
|
243
|
+
guide:
|
|
244
|
+
'事件传播(Signal/Slot/Callback/asyncio Event)、状态管理(Pydantic Model/dataclass)、消息队列(Celery/Redis Pub-Sub)',
|
|
245
|
+
},
|
|
246
|
+
go: {
|
|
247
|
+
label: '事件与数据流',
|
|
248
|
+
guide:
|
|
249
|
+
'事件传播(channel/context)、select 多路复用、fan-out/fan-in 模式、NATS/Redis Pub-Sub',
|
|
250
|
+
},
|
|
251
|
+
dart: {
|
|
252
|
+
label: '事件与数据流',
|
|
253
|
+
guide:
|
|
254
|
+
'事件传播(Stream/StreamController/BroadcastStream)、状态管理(BLoC/Cubit/Provider/Riverpod/GetX/ValueNotifier)、响应式流(RxDart/StreamTransformer)、InheritedWidget 数据传递',
|
|
255
|
+
},
|
|
256
|
+
rust: {
|
|
257
|
+
label: '事件与数据流',
|
|
258
|
+
guide:
|
|
259
|
+
'事件传播(tokio channel/crossbeam-channel)、Stream trait、Actor 模式(Actix)、状态管理(Arc<RwLock<T>>)',
|
|
260
|
+
},
|
|
261
|
+
},
|
|
262
|
+
|
|
263
|
+
// ── ⑥ 项目特征 ──────────────────────────────────────
|
|
264
|
+
'project-profile': {
|
|
265
|
+
_default: {
|
|
266
|
+
label: '项目特征',
|
|
267
|
+
guide: '技术栈、目录结构、三方依赖枚举与用途、基础设施服务注册表',
|
|
268
|
+
},
|
|
269
|
+
apple: {
|
|
270
|
+
label: '项目特征',
|
|
271
|
+
guide:
|
|
272
|
+
'技术栈、目录结构、三方依赖枚举与用途、Extension/Category 分类聚合、自定义基类层级与全局定义(宏/typealias/PCH)、系统事件 hook 与生命周期入口、基础设施服务注册表、Runtime 与语言互操作',
|
|
273
|
+
},
|
|
274
|
+
js: {
|
|
275
|
+
label: '项目特征',
|
|
276
|
+
guide:
|
|
277
|
+
'技术栈(框架/构建工具/包管理器)、目录结构、三方依赖枚举与用途、monorepo 配置、环境变量与配置注入、CI/CD 管线',
|
|
278
|
+
},
|
|
279
|
+
jvm: {
|
|
280
|
+
label: '项目特征',
|
|
281
|
+
guide:
|
|
282
|
+
'技术栈(Spring/Android/Ktor)、module 结构、三方依赖枚举与用途、构建配置(Gradle/Maven)、Profile 环境管理、基础设施服务',
|
|
283
|
+
},
|
|
284
|
+
python: {
|
|
285
|
+
label: '项目特征',
|
|
286
|
+
guide:
|
|
287
|
+
'技术栈(Django/FastAPI/Flask)、包结构、三方依赖枚举与用途、pyproject.toml/setup.cfg 配置、虚拟环境管理',
|
|
288
|
+
},
|
|
289
|
+
go: {
|
|
290
|
+
label: '项目特征',
|
|
291
|
+
guide:
|
|
292
|
+
'技术栈、module 结构、go.mod 依赖枚举与用途、internal 包组织、build tags、Makefile 构建',
|
|
293
|
+
},
|
|
294
|
+
dart: {
|
|
295
|
+
label: '项目特征',
|
|
296
|
+
guide:
|
|
297
|
+
'技术栈(Flutter/Dart Server/CLI)、目录结构(lib/src 分层)、pubspec.yaml 依赖枚举与用途、平台通道(MethodChannel/FFI)、Flavors/多环境配置',
|
|
298
|
+
},
|
|
299
|
+
rust: {
|
|
300
|
+
label: '项目特征',
|
|
301
|
+
guide:
|
|
302
|
+
'技术栈、Workspace/crate 结构、Cargo.toml 依赖枚举与用途、feature flags、#[cfg] 条件编译',
|
|
303
|
+
},
|
|
304
|
+
},
|
|
305
|
+
|
|
306
|
+
// ── ⑦ Agent 开发注意事项 ─────────────────────────────
|
|
307
|
+
'agent-guidelines': {
|
|
308
|
+
_default: {
|
|
309
|
+
label: 'Agent 开发注意事项',
|
|
310
|
+
guide:
|
|
311
|
+
'三大核心原则(严谨性/深度特征挖掘/完整性)、命名强制、并发安全、资源管理、已废弃 API 标记、架构约束注释、TODO/FIXME',
|
|
312
|
+
},
|
|
313
|
+
apple: {
|
|
314
|
+
label: 'Agent 开发注意事项',
|
|
315
|
+
guide:
|
|
316
|
+
'三大核心原则(严谨性/深度特征挖掘/完整性)、命名强制、线程安全、内存约束、已废弃 API 标记、架构约束注释、TODO/FIXME',
|
|
317
|
+
},
|
|
318
|
+
js: {
|
|
319
|
+
label: 'Agent 开发注意事项',
|
|
320
|
+
guide:
|
|
321
|
+
'三大核心原则(严谨性/深度特征挖掘/完整性)、命名约定遵循、类型安全(strict/no-any)、异步错误处理、已废弃 API 标记、ESLint 配置遵循',
|
|
322
|
+
},
|
|
323
|
+
jvm: {
|
|
324
|
+
label: 'Agent 开发注意事项',
|
|
325
|
+
guide:
|
|
326
|
+
'三大核心原则(严谨性/深度特征挖掘/完整性)、命名约定遵循、线程安全、@Deprecated 标记、架构约束注释、Nullable 标注',
|
|
327
|
+
},
|
|
328
|
+
python: {
|
|
329
|
+
label: 'Agent 开发注意事项',
|
|
330
|
+
guide:
|
|
331
|
+
'三大核心原则(严谨性/深度特征挖掘/完整性)、命名约定(PEP 8)、type hints 覆盖、已废弃 API 标记(DeprecationWarning)、docstring 覆盖',
|
|
332
|
+
},
|
|
333
|
+
go: {
|
|
334
|
+
label: 'Agent 开发注意事项',
|
|
335
|
+
guide:
|
|
336
|
+
'三大核心原则(严谨性/深度特征挖掘/完整性)、命名约定遵循、error 必须处理、goroutine 泄漏防护、Deprecated 注释、go vet 通过',
|
|
337
|
+
},
|
|
338
|
+
dart: {
|
|
339
|
+
label: 'Agent 开发注意事项',
|
|
340
|
+
guide:
|
|
341
|
+
'三大核心原则(严谨性/深度特征挖掘/完整性)、命名约定遵循(Effective Dart)、类型安全(避免 dynamic)、Widget 生命周期管理(dispose/mounted)、dart analyze 通过、避免 ! 空断言',
|
|
342
|
+
},
|
|
343
|
+
rust: {
|
|
344
|
+
label: 'Agent 开发注意事项',
|
|
345
|
+
guide:
|
|
346
|
+
'三大核心原则(严谨性/深度特征挖掘/完整性)、命名约定遵循、unsafe 最小化、clippy lint 通过、#[deprecated] 标记、文档注释覆盖',
|
|
347
|
+
},
|
|
348
|
+
},
|
|
349
|
+
};
|
|
350
|
+
|
|
351
|
+
// ═══════════════════════════════════════════════════════════
|
|
352
|
+
// DimensionCopy — 文案查询服务
|
|
353
|
+
// ═══════════════════════════════════════════════════════════
|
|
354
|
+
|
|
355
|
+
export class DimensionCopy {
|
|
356
|
+
/**
|
|
357
|
+
* 获取指定维度在指定语言下的文案
|
|
358
|
+
* @param {string} dimId 维度 ID (如 'code-standard')
|
|
359
|
+
* @param {string} lang 主语言 ID (如 'python', 'typescript')
|
|
360
|
+
* @returns {{ label: string, guide: string } | null}
|
|
361
|
+
*/
|
|
362
|
+
static get(dimId, lang) {
|
|
363
|
+
const entry = COPY_REGISTRY[dimId];
|
|
364
|
+
if (!entry) {
|
|
365
|
+
return null;
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
const family = _langFamily(lang);
|
|
369
|
+
return entry[family] || entry[lang] || entry._default || null;
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
/**
|
|
373
|
+
* 批量为维度数组注入语言差异化文案(单语言版本)
|
|
374
|
+
* 会直接修改维度对象的 label 和 guide 字段
|
|
375
|
+
* @param {Array<{ id: string, label: string, guide: string }>} dimensions
|
|
376
|
+
* @param {string} lang 主语言
|
|
377
|
+
* @returns {Array<{ id: string, label: string, guide: string }>} 原数组引用
|
|
378
|
+
*/
|
|
379
|
+
static apply(dimensions, lang) {
|
|
380
|
+
for (const dim of dimensions) {
|
|
381
|
+
const copy = DimensionCopy.get(dim.id, lang);
|
|
382
|
+
if (copy) {
|
|
383
|
+
dim.label = copy.label;
|
|
384
|
+
dim.guide = copy.guide;
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
return dimensions;
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
/**
|
|
391
|
+
* 多语言版本 — 合并主语言 + 次要语言的 guide 文案
|
|
392
|
+
*
|
|
393
|
+
* 策略:
|
|
394
|
+
* - label 使用主语言的 label(各语言族 label 基本一致)
|
|
395
|
+
* - guide 以主语言为主体,追加次要语言的差异化要点
|
|
396
|
+
* - 如果主语言和次要语言属于同一语言族,跳过(避免重复)
|
|
397
|
+
*
|
|
398
|
+
* @param {Array<{ id: string, label: string, guide: string }>} dimensions
|
|
399
|
+
* @param {string} primary 主语言 ID
|
|
400
|
+
* @param {string[]} secondary 次要语言 ID 列表
|
|
401
|
+
* @returns {Array<{ id: string, label: string, guide: string }>} 原数组引用
|
|
402
|
+
*/
|
|
403
|
+
static applyMulti(dimensions, primary, secondary = []) {
|
|
404
|
+
if (!secondary || secondary.length === 0) {
|
|
405
|
+
return DimensionCopy.apply(dimensions, primary);
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
const primaryFamily = _langFamily(primary);
|
|
409
|
+
|
|
410
|
+
// 过滤掉与主语言同族的次要语言(如 swift + objectivec 同属 apple)
|
|
411
|
+
const effectiveSecondary = secondary.filter((lang) => _langFamily(lang) !== primaryFamily);
|
|
412
|
+
|
|
413
|
+
for (const dim of dimensions) {
|
|
414
|
+
const primaryCopy = DimensionCopy.get(dim.id, primary);
|
|
415
|
+
if (!primaryCopy) {
|
|
416
|
+
continue;
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
dim.label = primaryCopy.label;
|
|
420
|
+
|
|
421
|
+
if (effectiveSecondary.length === 0) {
|
|
422
|
+
dim.guide = primaryCopy.guide;
|
|
423
|
+
continue;
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
// 收集次要语言的差异化 guide 片段
|
|
427
|
+
const secondaryGuides = [];
|
|
428
|
+
const seenFamilies = new Set([primaryFamily]);
|
|
429
|
+
for (const lang of effectiveSecondary) {
|
|
430
|
+
const fam = _langFamily(lang);
|
|
431
|
+
if (seenFamilies.has(fam)) {
|
|
432
|
+
continue;
|
|
433
|
+
} // 同族去重
|
|
434
|
+
seenFamilies.add(fam);
|
|
435
|
+
const copy = DimensionCopy.get(dim.id, lang);
|
|
436
|
+
if (copy && copy.guide !== primaryCopy.guide) {
|
|
437
|
+
const displayName = lang.charAt(0).toUpperCase() + lang.slice(1);
|
|
438
|
+
secondaryGuides.push(`[${displayName}] ${copy.guide}`);
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
dim.guide =
|
|
443
|
+
secondaryGuides.length > 0
|
|
444
|
+
? `${primaryCopy.guide}\n${secondaryGuides.join('\n')}`
|
|
445
|
+
: primaryCopy.guide;
|
|
446
|
+
}
|
|
447
|
+
return dimensions;
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
/**
|
|
451
|
+
* 获取所有已有文案的维度 ID 列表
|
|
452
|
+
* @returns {string[]}
|
|
453
|
+
*/
|
|
454
|
+
static registeredDimIds() {
|
|
455
|
+
return Object.keys(COPY_REGISTRY);
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
/**
|
|
459
|
+
* 获取某维度所有可用语言族
|
|
460
|
+
* @param {string} dimId
|
|
461
|
+
* @returns {string[]}
|
|
462
|
+
*/
|
|
463
|
+
static availableFamilies(dimId) {
|
|
464
|
+
const entry = COPY_REGISTRY[dimId];
|
|
465
|
+
if (!entry) {
|
|
466
|
+
return [];
|
|
467
|
+
}
|
|
468
|
+
return Object.keys(entry).filter((k) => k !== '_default');
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
export default DimensionCopy;
|