autosnippet 3.0.0 → 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 +759 -243
- 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
|
@@ -32,7 +32,7 @@ description: Cold-start knowledge base initialization. Full 9-dimension analysis
|
|
|
32
32
|
|
|
33
33
|
| 字段 | 内容 |
|
|
34
34
|
|------|------|
|
|
35
|
-
| `targets` |
|
|
35
|
+
| `targets` | 所有模块 Target(含 `inferredRole`: core/service/ui/networking/…) |
|
|
36
36
|
| `filesByTarget` | 按 Target 分组的文件内容(含 `priority`: high/medium/low) |
|
|
37
37
|
| `dependencyGraph` | `{ nodes, edges }` 模块间依赖关系 |
|
|
38
38
|
| `guardViolationFiles` | Guard 规则违规列表 |
|
|
@@ -48,7 +48,7 @@ description: Cold-start knowledge base initialization. Full 9-dimension analysis
|
|
|
48
48
|
| 字段 | 类型 | 说明 |
|
|
49
49
|
|------|------|------|
|
|
50
50
|
| `language` | string | 主语言名称 |
|
|
51
|
-
| `extraDimensions` | array | 语言特有的额外分析维度(如 Swift Concurrency、ObjC Block
|
|
51
|
+
| `extraDimensions` | array | 语言特有的额外分析维度(如 Swift Concurrency、ObjC Block 模式、Go goroutine/channel、Python async/decorator、Java Stream/Optional、Dart Widget/BLoC/Riverpod 等) |
|
|
52
52
|
| `typicalPatterns` | array | 该语言中典型的代码模式提示 |
|
|
53
53
|
| `commonAntiPatterns` | array | 该语言常见反模式(bad/why/fix) |
|
|
54
54
|
| `suggestedGuardRules` | array | 建议的 Guard 规则(pattern/severity/message) |
|
|
@@ -81,12 +81,22 @@ description: Cold-start knowledge base initialization. Full 9-dimension analysis
|
|
|
81
81
|
```json
|
|
82
82
|
{
|
|
83
83
|
"title": "分层架构: Presentation → Domain → Data",
|
|
84
|
-
"
|
|
85
|
-
"
|
|
86
|
-
|
|
84
|
+
"trigger": "@layered-arch",
|
|
85
|
+
"content": {
|
|
86
|
+
"markdown": "## 分层架构\n\n项目采用三层架构...\n\n```\nPresentation (FeatureA, FeatureB)\n → Domain (UseCases, Entities)\n → Data (Repositories, API, Storage)\n```\n\n### 层级职责\n- **Presentation**: UI + ViewModel\n- **Domain**: UseCase + Entity\n- **Data**: Repository + API + Storage\n\n### 边界约束\n- View 层不直接 import Data 层\n- 所有数据访问通过 Domain 层 UseCase 中转",
|
|
87
|
+
"pattern": "// Presentation → Domain → Data\nPresentation (FeatureA, FeatureB)\n → Domain (UseCases, Entities)\n → Data (Repositories, API, Storage)",
|
|
88
|
+
"rationale": "项目采用三层架构,Presentation 不直接访问 Data 层。所有数据访问通过 Domain 层的 UseCase 中转,保证单向依赖。"
|
|
89
|
+
},
|
|
90
|
+
"description": "三层架构 Presentation → Domain → Data,禁止跨层访问",
|
|
91
|
+
"language": "<primaryLanguage>",
|
|
92
|
+
"headers": [],
|
|
93
|
+
"category": "Service",
|
|
94
|
+
"kind": "rule",
|
|
95
|
+
"doClause": "Follow Presentation → Domain → Data layered architecture with no cross-layer access",
|
|
87
96
|
"knowledgeType": "architecture",
|
|
97
|
+
"usageGuide": "### 何时使用\n- 新建模块时确定放置层级\n- 代码审查检查跨层调用\n\n### 规则\n- View 层只调 Domain\n- Domain 层只调 Data\n- 禁止反向依赖",
|
|
98
|
+
"difficulty": "intermediate",
|
|
88
99
|
"scope": "project-specific",
|
|
89
|
-
"rationale": "项目采用三层架构,Presentation 不直接访问 Data 层。所有数据访问通过 Domain 层的 UseCase 中转。",
|
|
90
100
|
"steps": [
|
|
91
101
|
{ "title": "理解层级", "description": "Presentation 依赖 Domain, Domain 依赖 Data", "code": "" },
|
|
92
102
|
{ "title": "新模块规则", "description": "新功能模块放在 Presentation 层,公共逻辑放 Domain", "code": "" }
|
|
@@ -166,15 +176,20 @@ description: Cold-start knowledge base initialization. Full 9-dimension analysis
|
|
|
166
176
|
```json
|
|
167
177
|
{
|
|
168
178
|
"title": "项目技术特征 — [ProjectName]",
|
|
169
|
-
"
|
|
170
|
-
"
|
|
179
|
+
"trigger": "@projectProfile",
|
|
180
|
+
"code": "techStack:\n primaryLanguage: <language>\n frameworks: [<framework1>, <framework2>]\n minDeployment: <platform version>\n\nprojectStructure:\n pattern: <modular-spm|monorepo|workspace|...>\n keyModules:\n - ModuleA: 核心业务SDK\n - ModuleB: UI组件库\n\ndependencies:\n thirdParty:\n - LibA: 用途\n - LibB: 用途",
|
|
181
|
+
"summary_cn": "项目技术栈全貌:语言、框架、模块结构、三方依赖",
|
|
182
|
+
"summary_en": "Project tech profile: language, frameworks, module structure, dependencies",
|
|
183
|
+
"language": "<primaryLanguage>",
|
|
184
|
+
"headers": [],
|
|
171
185
|
"category": "Architecture",
|
|
172
186
|
"knowledgeType": "architecture",
|
|
187
|
+
"difficulty": "beginner",
|
|
173
188
|
"scope": "project-specific",
|
|
174
189
|
"rationale": "项目技术栈全貌,新人 onboarding 和 Agent 理解项目的基础",
|
|
175
190
|
"reasoning": {
|
|
176
191
|
"whyStandard": "项目技术选型摘要,所有开发决策的基础上下文",
|
|
177
|
-
"sources": ["Package.swift", "languageStats", "dependencyGraph"],
|
|
192
|
+
"sources": ["<project manifest: Package.swift / package.json / go.mod / pom.xml / etc.>", "languageStats", "dependencyGraph"],
|
|
178
193
|
"confidence": 0.95
|
|
179
194
|
}
|
|
180
195
|
}
|
|
@@ -197,26 +212,30 @@ description: Cold-start knowledge base initialization. Full 9-dimension analysis
|
|
|
197
212
|
| 类别 | severity | 示例 |
|
|
198
213
|
|------|----------|------|
|
|
199
214
|
| 命名 (naming) | `must` | "所有 ViewModel 以 VM 结尾" |
|
|
200
|
-
| 线程 (threading) | `must` | "UI
|
|
201
|
-
| 内存 (memory) | `should` | "
|
|
215
|
+
| 线程 (threading) | `must` | "UI 更新必须在主线程/主 Actor" |
|
|
216
|
+
| 内存 (memory) | `should` | "闭包/回调中注意循环引用" |
|
|
202
217
|
| 架构 (architecture) | `must` | "View 层不直接访问 Repository" |
|
|
203
218
|
| 安全 (security) | `must` | "不在代码中硬编码 API key" |
|
|
204
|
-
| 性能 (performance) | `should` | "
|
|
219
|
+
| 性能 (performance) | `should` | "大列表使用虚拟化/懒加载" |
|
|
205
220
|
|
|
206
221
|
### Agent 注意事项候选模板
|
|
207
222
|
|
|
208
223
|
```json
|
|
209
224
|
{
|
|
210
|
-
"title": "[must] UI
|
|
211
|
-
"
|
|
212
|
-
"
|
|
225
|
+
"title": "[must] UI 更新必须在主线程",
|
|
226
|
+
"trigger": "@agent-threading",
|
|
227
|
+
"code": "// ✅ 正确 — 使用语言/框架提供的主线程机制\n// Swift: @MainActor func updateUI() { ... }\n// JS/TS: 无需显式处理(单线程)但 Web Worker 返回需 postMessage\n// Python: 使用 loop.call_soon_threadsafe() 或框架 API\n// Go: 使用 channel 或 sync 包\n// Java/Kotlin: runOnUiThread { ... } 或 Dispatchers.Main\n\n// ❌ 错误 — 在后台线程直接操作 UI",
|
|
228
|
+
"summary_cn": "UI 更新必须在主线程/主 Actor 执行,违反会导致崩溃或数据竞争",
|
|
229
|
+
"summary_en": "UI updates must run on the main thread/actor to prevent crashes and data races",
|
|
230
|
+
"language": "<primaryLanguage>",
|
|
231
|
+
"headers": [],
|
|
213
232
|
"category": "Tool",
|
|
214
233
|
"knowledgeType": "boundary-constraint",
|
|
215
|
-
"
|
|
216
|
-
"rationale": "
|
|
234
|
+
"difficulty": "intermediate",
|
|
235
|
+
"rationale": "UI 框架通常要求在主线程更新界面,违反会导致崩溃或数据竞争",
|
|
217
236
|
"reasoning": {
|
|
218
|
-
"whyStandard": "
|
|
219
|
-
"sources": ["
|
|
237
|
+
"whyStandard": "项目 UI 层需在主线程操作,Agent 新写的代码也必须遵守",
|
|
238
|
+
"sources": ["<relevant source files>"],
|
|
220
239
|
"confidence": 0.9
|
|
221
240
|
}
|
|
222
241
|
}
|
|
@@ -259,21 +278,28 @@ description: Cold-start knowledge base initialization. Full 9-dimension analysis
|
|
|
259
278
|
|
|
260
279
|
## 候选必填字段 Quick Reference
|
|
261
280
|
|
|
262
|
-
|
|
281
|
+
提交每条候选**必须**提供以下全部字段,缺失将被直接拒绝:
|
|
263
282
|
|
|
264
283
|
| 字段 | 必填? | 说明 |
|
|
265
284
|
|------|-------|------|
|
|
266
|
-
| `title` | ★★★ 必填 |
|
|
267
|
-
| `
|
|
268
|
-
| `
|
|
269
|
-
| `
|
|
285
|
+
| `title` | ★★★ 必填 | 简明标题(≤20字) |
|
|
286
|
+
| `trigger` | ★★★ 必填 | @前缀触发词,如 `@swiftNaming` |
|
|
287
|
+
| `content.markdown` | ★★★ 必填 | 项目特写 Markdown(≥200字) |
|
|
288
|
+
| `content.pattern` | ★★★ 必填 | 核心代码片段(3-8行) |
|
|
289
|
+
| `content.rationale` | ★★★ 必填 | 设计原理(为什么这样做) |
|
|
290
|
+
| `description` | ★★★ 必填 | 中文摘要 ≤80字 |
|
|
291
|
+
| `language` | ★★★ 必填 | swift / objectivec / go / python / java / kotlin / dart / javascript / typescript 等 |
|
|
292
|
+
| `headers` | ★★★ 必填 | import 语句数组,如 `["import Foundation"]`;无 import 时传 `[]` |
|
|
293
|
+
| `category` | ★★★ 必填 | View / Service / Tool / Model / Network / Storage / UI / Utility |
|
|
294
|
+
| `kind` | ★★★ 必填 | rule / pattern / fact |
|
|
295
|
+
| `doClause` | ★★★ 必填 | 英文祈使句正向指令(≤60 tokens) |
|
|
270
296
|
| `knowledgeType` | ★★★ 必填 | 见 8 维度清单 |
|
|
297
|
+
| `usageGuide` | ★★★ 必填 | 使用指南(### 章节格式) |
|
|
271
298
|
| `reasoning.whyStandard` | ★★★ 必填 | 为什么值得沉淀 |
|
|
272
299
|
| `reasoning.sources` | ★★★ 必填 | 来源文件路径 |
|
|
273
300
|
| `reasoning.confidence` | ★★★ 必填 | 0-1 置信度 |
|
|
274
|
-
| `
|
|
301
|
+
| `difficulty` | ★★☆ 推荐 | beginner / intermediate / advanced |
|
|
275
302
|
| `scope` | ★★☆ 推荐 | universal / project-specific / target-specific |
|
|
276
|
-
| `complexity` | ★★☆ 推荐 | beginner / intermediate / advanced |
|
|
277
303
|
| `steps` | ★★☆ 推荐 | 实施步骤 |
|
|
278
304
|
| `constraints` | ★★☆ 推荐 | 前置条件/边界/副作用 |
|
|
279
305
|
| `relations` | ★★☆ 推荐 | 依赖/扩展/冲突关系 |
|
|
@@ -297,22 +323,35 @@ description: Cold-start knowledge base initialization. Full 9-dimension analysis
|
|
|
297
323
|
## Per-Dimension Industry Reference Templates
|
|
298
324
|
|
|
299
325
|
> 以下是每个分析维度的**高质量候选模板**,基于业界最佳实践。分析时请以此为参考产出同等质量的候选。
|
|
326
|
+
> **注意**: 每个维度提供多语言示例,实际分析时应使用项目的 `primaryLanguage` 和对应语言的代码示例。
|
|
300
327
|
|
|
301
328
|
### 维度 1: 代码规范 (code-standard) — 参考模板
|
|
302
329
|
|
|
330
|
+
**Swift 示例:**
|
|
331
|
+
|
|
303
332
|
```json
|
|
304
333
|
{
|
|
305
334
|
"title": "命名约定: 类型用 UpperCamelCase, 变量/函数用 lowerCamelCase",
|
|
306
|
-
"
|
|
335
|
+
"trigger": "@swift-naming",
|
|
336
|
+
"content": {
|
|
337
|
+
"markdown": "## Swift 命名约定\n\n遵循 Apple API Design Guidelines:\n\n```swift\n// ✅ 正确\nclass NetworkManager { }\nfunc fetchUserProfile() -> UserProfile { }\nlet currentUser: User\n\n// ❌ 错误\nclass network_manager { }\nfunc FetchUserProfile() -> UserProfile { }\nlet CURRENT_USER: User\n```\n\n### 规则\n- 类型名: UpperCamelCase\n- 变量/函数: lowerCamelCase\n- 缩写: URL/ID 在首位全大写,其他位置 lowerCamelCase\n\n### 反例\n```swift\nlet kMaxRetryCount = 3 // ❌ 匈牙利命名\nclass network_manager { } // ❌ 下划线\n```",
|
|
338
|
+
"pattern": "// ✅ 正确\nclass NetworkManager { }\nfunc fetchUserProfile() -> UserProfile { }\nlet currentUser: User\n\n// ❌ 错误\nclass network_manager { }\nfunc FetchUserProfile() -> UserProfile { }",
|
|
339
|
+
"rationale": "遵循 Apple API Design Guidelines 和 Google Swift Style Guide:类型名用 UpperCamelCase,变量/函数/参数用 lowerCamelCase,全局常量用 lowerCamelCase(不用 k 前缀或 SCREAMING_SNAKE_CASE)"
|
|
340
|
+
},
|
|
341
|
+
"description": "Swift 命名约定:类型 UpperCamelCase,变量/函数 lowerCamelCase",
|
|
307
342
|
"language": "swift",
|
|
343
|
+
"headers": ["import Foundation"],
|
|
308
344
|
"category": "Tool",
|
|
345
|
+
"kind": "rule",
|
|
346
|
+
"doClause": "Use UpperCamelCase for types and lowerCamelCase for variables, functions, and parameters",
|
|
309
347
|
"knowledgeType": "code-standard",
|
|
348
|
+
"usageGuide": "### 何时使用\n- 新建类/结构体/枚举/协议时\n- 命名变量/函数/参数时\n\n### 规则\n- class/struct/enum/protocol: UpperCamelCase\n- 变量/函数/参数: lowerCamelCase\n- 缩写: URL/ID 首位全大写,其他位 lowerCamelCase",
|
|
349
|
+
"difficulty": "beginner",
|
|
310
350
|
"scope": "project-specific",
|
|
311
|
-
"rationale": "遵循 Apple API Design Guidelines 和 Google Swift Style Guide:类型名用 UpperCamelCase,变量/函数/参数用 lowerCamelCase,全局常量用 lowerCamelCase(不用 k 前缀或 SCREAMING_SNAKE_CASE)",
|
|
312
351
|
"steps": [
|
|
313
352
|
{ "title": "类型命名", "description": "class/struct/enum/protocol 用 UpperCamelCase", "code": "struct UserProfile { }" },
|
|
314
353
|
{ "title": "函数命名", "description": "方法名以动词开头,参数标签读起来像句子", "code": "func insert(_ element: Element, at index: Int)" },
|
|
315
|
-
{ "title": "缩写处理", "description": "
|
|
354
|
+
{ "title": "缩写处理", "description": "缩写作为整体大小写", "code": "let urlString = ...\nclass HTMLParser { }" }
|
|
316
355
|
],
|
|
317
356
|
"antiPattern": {
|
|
318
357
|
"bad": "let kMaxRetryCount = 3\nclass network_manager { }",
|
|
@@ -327,17 +366,129 @@ description: Cold-start knowledge base initialization. Full 9-dimension analysis
|
|
|
327
366
|
}
|
|
328
367
|
```
|
|
329
368
|
|
|
369
|
+
**Go 示例:**
|
|
370
|
+
|
|
371
|
+
```json
|
|
372
|
+
{
|
|
373
|
+
"title": "命名约定: 导出用 UpperCamelCase, 内部用 lowerCamelCase",
|
|
374
|
+
"trigger": "@go-naming",
|
|
375
|
+
"content": {
|
|
376
|
+
"markdown": "## Go 命名约定\n\n遵循 Effective Go:\n\n```go\n// ✅ 正确 — 导出名大写开头,内部名小写开头\ntype NetworkManager struct { }\nfunc FetchUserProfile() (*UserProfile, error) { }\nvar currentUser *User\n\n// ❌ 错误\ntype network_manager struct { }\nfunc fetch_user_profile() { }\n```\n\n### 规则\n- 导出标识符: 首字母大写\n- 内部标识符: 首字母小写\n- 缩写: 保持全大写(HTTP、URL、ID)",
|
|
377
|
+
"pattern": "// 导出用 UpperCamelCase\ntype NetworkManager struct { }\nfunc FetchUserProfile() (*UserProfile, error) { }\n// 内部用 lowerCamelCase\nvar currentUser *User",
|
|
378
|
+
"rationale": "遵循 Effective Go:导出标识符首字母大写,内部小写;缩写保持全大写(HTTP、URL、ID)"
|
|
379
|
+
},
|
|
380
|
+
"description": "Go 命名约定:导出标识符大写开头,内部小写开头",
|
|
381
|
+
"language": "go",
|
|
382
|
+
"headers": [],
|
|
383
|
+
"category": "Tool",
|
|
384
|
+
"kind": "rule",
|
|
385
|
+
"doClause": "Use UpperCamelCase for exported identifiers and lowerCamelCase for unexported ones",
|
|
386
|
+
"knowledgeType": "code-standard",
|
|
387
|
+
"usageGuide": "### 何时使用\n- 定义新的类型/函数/变量时\n\n### 规则\n- 导出(大写开头): 提供给外部包使用\n- 未导出(小写开头): 包内私有\n- 缩写全大写: HTTPClient, URL, ID",
|
|
388
|
+
"antiPattern": {
|
|
389
|
+
"bad": "type http_client struct { }\nfunc get_User() { }",
|
|
390
|
+
"why": "下划线和混合大小写不符合 Go 惯例",
|
|
391
|
+
"fix": "type HTTPClient struct { }\nfunc GetUser() { }"
|
|
392
|
+
},
|
|
393
|
+
"reasoning": {
|
|
394
|
+
"whyStandard": "Go 用大小写控制可见性,统一命名是团队协作的基础",
|
|
395
|
+
"sources": ["Effective Go", "Go Code Review Comments"],
|
|
396
|
+
"confidence": 0.95
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
```
|
|
400
|
+
|
|
401
|
+
**Python 示例:**
|
|
402
|
+
|
|
403
|
+
```json
|
|
404
|
+
{
|
|
405
|
+
"title": "命名约定: 类用 PascalCase, 函数/变量用 snake_case",
|
|
406
|
+
"trigger": "@python-naming",
|
|
407
|
+
"content": {
|
|
408
|
+
"markdown": "## Python 命名规范 (PEP 8)\n\n### ✅ 正确示例\n```python\nclass NetworkManager:\n pass\n\ndef fetch_user_profile() -> UserProfile:\n pass\n\ncurrent_user: User\nMAX_RETRY_COUNT = 3 # 常量全大写\n```\n\n### ❌ 错误示例\n```python\nclass network_manager:\n pass\n\ndef FetchUserProfile():\n pass\n```\n\n### 规则总结\n- 类名:PascalCase(如 `NetworkManager`)\n- 函数/变量:snake_case(如 `fetch_user_profile`)\n- 常量:UPPER_SNAKE_CASE(如 `MAX_RETRY_COUNT`)\n- 模块名:全小写 snake_case",
|
|
409
|
+
"pattern": "class NetworkManager:\n pass\n\ndef fetch_user_profile() -> UserProfile:\n pass\n\ncurrent_user: User\nMAX_RETRY_COUNT = 3",
|
|
410
|
+
"rationale": "遵循 PEP 8:类名 PascalCase,函数/变量 snake_case,常量 UPPER_SNAKE_CASE。所有主流 Python 工具(pylint、flake8、black)均强制执行此规范。"
|
|
411
|
+
},
|
|
412
|
+
"description": "Python 命名规范:类 PascalCase,函数/变量 snake_case,常量 UPPER_SNAKE_CASE",
|
|
413
|
+
"kind": "rule",
|
|
414
|
+
"doClause": "Use PascalCase for classes, snake_case for functions and variables, UPPER_SNAKE_CASE for constants",
|
|
415
|
+
"language": "python",
|
|
416
|
+
"headers": [],
|
|
417
|
+
"category": "Tool",
|
|
418
|
+
"knowledgeType": "code-standard",
|
|
419
|
+
"usageGuide": "### 使用场景\n在 Python 项目中创建新类、函数或变量时,触发 `@python-naming` 查阅命名约定,确保符合 PEP 8 标准。",
|
|
420
|
+
"difficulty": "beginner",
|
|
421
|
+
"scope": "project-specific",
|
|
422
|
+
"antiPattern": {
|
|
423
|
+
"bad": "class network_manager:\n def FetchData(self): pass",
|
|
424
|
+
"why": "类名应 PascalCase,方法名应 snake_case,混用降低可读性",
|
|
425
|
+
"fix": "class NetworkManager:\n def fetch_data(self): pass"
|
|
426
|
+
},
|
|
427
|
+
"reasoning": {
|
|
428
|
+
"whyStandard": "PEP 8 是 Python 社区标准,所有主流工具(pylint、flake8、black)均强制执行",
|
|
429
|
+
"sources": ["PEP 8", "Google Python Style Guide"],
|
|
430
|
+
"confidence": 0.95
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
```
|
|
434
|
+
|
|
435
|
+
**Dart (Flutter) 示例:**
|
|
436
|
+
|
|
437
|
+
```json
|
|
438
|
+
{
|
|
439
|
+
"title": "命名约定: 类用 UpperCamelCase, 变量/函数用 lowerCamelCase, 文件名 snake_case",
|
|
440
|
+
"trigger": "@dart-naming",
|
|
441
|
+
"content": {
|
|
442
|
+
"markdown": "## Dart 命名规范 (Effective Dart)\n\n### ✅ 正确示例\n```dart\nclass NetworkManager { }\nvoid fetchUserProfile() { }\nfinal currentUser = User();\nconst defaultTimeout = Duration(seconds: 30);\n\n// 文件名: user_service.dart, home_page.dart\n// 私有成员: _isLoading, _controller\n```\n\n### ❌ 错误示例\n```dart\nconst MAX_RETRY_COUNT = 3; // Dart 不用 SCREAMING_CAPS\nclass user_service { } // 类名应 UpperCamelCase\nString UserName = ''; // 变量应 lowerCamelCase\n```\n\n### 规则总结\n- 类名: UpperCamelCase(如 `UserService`)\n- 变量/函数: lowerCamelCase(如 `fetchData`)\n- 常量: lowerCamelCase(如 `defaultTimeout`,不用 SCREAMING_CAPS)\n- 文件名: snake_case(如 `user_service.dart`)",
|
|
443
|
+
"pattern": "class NetworkManager { }\nvoid fetchUserProfile() { }\nfinal currentUser = User();\nconst defaultTimeout = Duration(seconds: 30);",
|
|
444
|
+
"rationale": "遵循 Effective Dart Style:类名 UpperCamelCase,变量/函数 lowerCamelCase,常量也用 lowerCamelCase(区别于 Java/C++),文件名 snake_case。dart analyze 会强制检查。"
|
|
445
|
+
},
|
|
446
|
+
"description": "Dart 命名规范:类 UpperCamelCase,变量/函数 lowerCamelCase,常量 lowerCamelCase,文件 snake_case",
|
|
447
|
+
"kind": "rule",
|
|
448
|
+
"doClause": "Use UpperCamelCase for types, lowerCamelCase for variables/functions/constants, snake_case for filenames",
|
|
449
|
+
"language": "dart",
|
|
450
|
+
"headers": [],
|
|
451
|
+
"category": "Tool",
|
|
452
|
+
"knowledgeType": "code-standard",
|
|
453
|
+
"usageGuide": "### 使用场景\n在 Dart/Flutter 项目中创建新文件或标识符时,触发 `@dart-naming` 查阅 Effective Dart 命名约定。",
|
|
454
|
+
"difficulty": "beginner",
|
|
455
|
+
"scope": "project-specific",
|
|
456
|
+
"antiPattern": {
|
|
457
|
+
"bad": "const MAX_RETRY = 3;\nclass user_service { }",
|
|
458
|
+
"why": "SCREAMING_CAPS 和下划线类名不符合 Dart 惯例,dart analyze 会警告",
|
|
459
|
+
"fix": "const maxRetry = 3;\nclass UserService { }"
|
|
460
|
+
},
|
|
461
|
+
"reasoning": {
|
|
462
|
+
"whyStandard": "Effective Dart Style 是 Dart 官方规范,dart analyze + flutter_lints 强制执行",
|
|
463
|
+
"sources": ["Effective Dart - Style", "Dart Linter Rules"],
|
|
464
|
+
"confidence": 0.95
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
```
|
|
468
|
+
|
|
330
469
|
### 维度 2: 使用习惯 (code-pattern) — 参考模板
|
|
331
470
|
|
|
471
|
+
**Swift 示例:**
|
|
472
|
+
|
|
332
473
|
```json
|
|
333
474
|
{
|
|
334
475
|
"title": "单例模式: 使用 static let shared",
|
|
335
|
-
"
|
|
476
|
+
"trigger": "@swift-singleton",
|
|
477
|
+
"content": {
|
|
478
|
+
"markdown": "## Swift 单例模式\n\n### ✅ 推荐模式\n```swift\nclass CacheManager {\n static let shared = CacheManager()\n private init() { }\n \n func store(_ data: Data, forKey key: String) { ... }\n}\n\n// 使用\nCacheManager.shared.store(data, forKey: \"user\")\n```\n\n### 要点\n- `static let` 天然线程安全(dispatch_once 语义)\n- `private init()` 防止外部实例化\n- 属性名通常用 `shared` 或 `default`",
|
|
479
|
+
"pattern": "class CacheManager {\n static let shared = CacheManager()\n private init() { }\n}",
|
|
480
|
+
"rationale": "Swift 的 static let 天然线程安全(dispatch_once 语义)。private init() 防止外部实例化。"
|
|
481
|
+
},
|
|
482
|
+
"description": "Swift 单例模式:static let shared + private init(),天然线程安全",
|
|
483
|
+
"kind": "pattern",
|
|
484
|
+
"doClause": "Implement singletons using static let shared with private init for thread safety",
|
|
336
485
|
"language": "swift",
|
|
486
|
+
"headers": ["import Foundation"],
|
|
337
487
|
"category": "Service",
|
|
338
488
|
"knowledgeType": "code-pattern",
|
|
489
|
+
"usageGuide": "### 使用场景\n创建 Manager/Service 类的唯一实例时,触发 `@swift-singleton` 获取标准单例实现模式。",
|
|
490
|
+
"difficulty": "beginner",
|
|
339
491
|
"scope": "universal",
|
|
340
|
-
"rationale": "Swift 的 static let 天然线程安全(dispatch_once 语义)。private init() 防止外部实例化。",
|
|
341
492
|
"steps": [
|
|
342
493
|
{ "title": "声明", "description": "用 static let shared 暴露唯一实例", "code": "static let shared = MyService()" },
|
|
343
494
|
{ "title": "私有初始化", "description": "用 private init() 防止外部创建", "code": "private init() { }" },
|
|
@@ -351,17 +502,116 @@ description: Cold-start knowledge base initialization. Full 9-dimension analysis
|
|
|
351
502
|
}
|
|
352
503
|
```
|
|
353
504
|
|
|
505
|
+
**TypeScript 示例:**
|
|
506
|
+
|
|
507
|
+
```json
|
|
508
|
+
{
|
|
509
|
+
"title": "单例模式: class + private constructor + getInstance()",
|
|
510
|
+
"trigger": "@ts-singleton",
|
|
511
|
+
"content": {
|
|
512
|
+
"markdown": "## TypeScript 单例模式\n\n### ✅ 推荐模式\n```typescript\nclass CacheManager {\n private static instance: CacheManager;\n private constructor() { }\n\n static getInstance(): CacheManager {\n if (!CacheManager.instance) {\n CacheManager.instance = new CacheManager();\n }\n return CacheManager.instance;\n }\n\n store(key: string, data: unknown): void { /* ... */ }\n}\n\n// 使用\nCacheManager.getInstance().store('user', data);\n```\n\n### 要点\n- `private constructor` 阻止外部实例化\n- `getInstance()` 保证返回唯一实例\n- 也可用 ES Module 导出单实例对象作为替代",
|
|
513
|
+
"pattern": "class CacheManager {\n private static instance: CacheManager;\n private constructor() { }\n static getInstance(): CacheManager { ... }\n}",
|
|
514
|
+
"rationale": "TypeScript 用 private constructor 阻止外部实例化,getInstance() 保证唯一。也可用 ES Module 导出单实例对象。"
|
|
515
|
+
},
|
|
516
|
+
"description": "TypeScript 单例模式:private constructor + 静态 getInstance(),保证唯一实例",
|
|
517
|
+
"kind": "pattern",
|
|
518
|
+
"doClause": "Implement singletons using private constructor and static getInstance method",
|
|
519
|
+
"language": "typescript",
|
|
520
|
+
"headers": [],
|
|
521
|
+
"category": "Service",
|
|
522
|
+
"knowledgeType": "code-pattern",
|
|
523
|
+
"usageGuide": "### 使用场景\n创建 TypeScript Manager/Service 单例时,触发 `@ts-singleton` 获取标准实现模式。",
|
|
524
|
+
"difficulty": "beginner",
|
|
525
|
+
"scope": "universal",
|
|
526
|
+
"reasoning": {
|
|
527
|
+
"whyStandard": "项目中 Manager/Service 类使用此模式或 module-level 单例",
|
|
528
|
+
"sources": ["TypeScript Design Patterns"],
|
|
529
|
+
"confidence": 0.9
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
```
|
|
533
|
+
|
|
534
|
+
**Go 示例:**
|
|
535
|
+
|
|
536
|
+
```json
|
|
537
|
+
{
|
|
538
|
+
"title": "单例模式: sync.Once + 包级变量",
|
|
539
|
+
"trigger": "@go-singleton",
|
|
540
|
+
"content": {
|
|
541
|
+
"markdown": "## Go 单例模式\n\n### ✅ 推荐模式\n```go\nvar (\n\tinstance *CacheManager\n\tonce sync.Once\n)\n\nfunc GetCacheManager() *CacheManager {\n\tonce.Do(func() {\n\t\tinstance = &CacheManager{}\n\t})\n\treturn instance\n}\n\ntype CacheManager struct { /* ... */ }\nfunc (c *CacheManager) Store(key string, data []byte) { /* ... */ }\n```\n\n### 要点\n- `sync.Once` 保证初始化函数只执行一次(并发安全)\n- 包级变量 + 导出函数暴露实例\n- 延迟初始化,首次调用时才创建",
|
|
542
|
+
"pattern": "var (\n\tinstance *CacheManager\n\tonce sync.Once\n)\n\nfunc GetCacheManager() *CacheManager {\n\tonce.Do(func() { instance = &CacheManager{} })\n\treturn instance\n}",
|
|
543
|
+
"rationale": "Go 使用 sync.Once 保证线程安全的延迟初始化,是标准单例实现方式。"
|
|
544
|
+
},
|
|
545
|
+
"description": "Go 单例模式:sync.Once 保证线程安全的延迟初始化",
|
|
546
|
+
"kind": "pattern",
|
|
547
|
+
"doClause": "Implement singletons using sync.Once with package-level variable for thread-safe lazy init",
|
|
548
|
+
"language": "go",
|
|
549
|
+
"headers": ["import \"sync\""],
|
|
550
|
+
"category": "Service",
|
|
551
|
+
"knowledgeType": "code-pattern",
|
|
552
|
+
"usageGuide": "### 使用场景\n创建 Go 全局唯一实例时,触发 `@go-singleton` 获取 sync.Once 标准模式。",
|
|
553
|
+
"difficulty": "beginner",
|
|
554
|
+
"scope": "universal",
|
|
555
|
+
"reasoning": {
|
|
556
|
+
"whyStandard": "sync.Once 是 Go 标准库提供的并发安全初始化原语",
|
|
557
|
+
"sources": ["Effective Go", "Go sync package documentation"],
|
|
558
|
+
"confidence": 0.9
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
```
|
|
562
|
+
|
|
563
|
+
**Dart (Flutter) 示例:**
|
|
564
|
+
|
|
565
|
+
```json
|
|
566
|
+
{
|
|
567
|
+
"title": "单例模式: private constructor + static final instance",
|
|
568
|
+
"trigger": "@dart-singleton",
|
|
569
|
+
"content": {
|
|
570
|
+
"markdown": "## Dart 单例模式\n\n### ✅ 推荐模式\n```dart\nclass CacheManager {\n CacheManager._();\n static final CacheManager instance = CacheManager._();\n\n // 或使用 factory 构造函数\n factory CacheManager() => instance;\n\n void store(String key, dynamic data) { /* ... */ }\n}\n\n// 使用\nCacheManager.instance.store('user', data);\n// 或\nCacheManager().store('user', data);\n```\n\n### 要点\n- `ClassName._()` private 命名构造函数阻止外部实例化\n- `static final` 保证唯一实例,Dart 天然线程安全(单隔离区)\n- factory 构造函数可选,让调用更自然",
|
|
571
|
+
"pattern": "class CacheManager {\n CacheManager._();\n static final CacheManager instance = CacheManager._();\n factory CacheManager() => instance;\n}",
|
|
572
|
+
"rationale": "Dart 的 private 命名构造函数 + static final 是标准单例实现,单 Isolate 天然线程安全。"
|
|
573
|
+
},
|
|
574
|
+
"description": "Dart 单例模式:private constructor + static final instance",
|
|
575
|
+
"kind": "pattern",
|
|
576
|
+
"doClause": "Implement singletons using private named constructor with static final instance",
|
|
577
|
+
"language": "dart",
|
|
578
|
+
"headers": [],
|
|
579
|
+
"category": "Service",
|
|
580
|
+
"knowledgeType": "code-pattern",
|
|
581
|
+
"usageGuide": "### 使用场景\n创建 Dart Manager/Service 单例时,触发 `@dart-singleton` 获取标准模式。",
|
|
582
|
+
"difficulty": "beginner",
|
|
583
|
+
"scope": "universal",
|
|
584
|
+
"reasoning": {
|
|
585
|
+
"whyStandard": "Dart 社区通用单例模式,factory 构造函数是语言特性",
|
|
586
|
+
"sources": ["Effective Dart - Design", "Dart Language Tour - Constructors"],
|
|
587
|
+
"confidence": 0.9
|
|
588
|
+
}
|
|
589
|
+
}
|
|
590
|
+
```
|
|
591
|
+
|
|
354
592
|
### 维度 3: 最佳实践 (best-practice) — 参考模板
|
|
355
593
|
|
|
594
|
+
**Swift 示例:**
|
|
595
|
+
|
|
356
596
|
```json
|
|
357
597
|
{
|
|
358
598
|
"title": "错误处理: 用 typed Error enum + do-catch",
|
|
359
|
-
"
|
|
599
|
+
"trigger": "@swift-error-handling",
|
|
600
|
+
"content": {
|
|
601
|
+
"markdown": "## Swift 错误处理最佳实践\n\n### ✅ 推荐:typed Error enum + do-catch\n```swift\nenum NetworkError: Error {\n case invalidURL\n case timeout\n case serverError(statusCode: Int)\n}\n\nfunc fetchData(from url: String) throws -> Data {\n guard let url = URL(string: url) else {\n throw NetworkError.invalidURL\n }\n // ...\n}\n\ndo {\n let data = try fetchData(from: endpoint)\n} catch NetworkError.timeout {\n showRetryAlert()\n} catch {\n log(error)\n}\n```\n\n### 要点\n- 用 typed enum Error 使调用者能精确 catch 不同错误类型\n- 避免 generic Error string\n- throws 优于 Result 混合模型(Google Swift Style Guide)",
|
|
602
|
+
"pattern": "enum NetworkError: Error {\n case invalidURL\n case timeout\n case serverError(statusCode: Int)\n}\n\nfunc fetchData(from url: String) throws -> Data { ... }\n\ndo {\n let data = try fetchData(from: endpoint)\n} catch NetworkError.timeout {\n showRetryAlert()\n}",
|
|
603
|
+
"rationale": "用 typed enum Error 使调用者能精确 catch 不同错误类型。避免 generic Error string。Google Swift Style Guide 明确推荐 throws 而非 Result 混合模型。"
|
|
604
|
+
},
|
|
605
|
+
"description": "Swift 错误处理:typed Error enum + do-catch 精确捕获不同错误类型",
|
|
606
|
+
"kind": "pattern",
|
|
607
|
+
"doClause": "Use typed Error enum with do-catch for precise error handling instead of generic errors",
|
|
360
608
|
"language": "swift",
|
|
609
|
+
"headers": ["import Foundation"],
|
|
361
610
|
"category": "Service",
|
|
362
611
|
"knowledgeType": "best-practice",
|
|
612
|
+
"usageGuide": "### 使用场景\n在 Swift 中处理可能失败的操作时,触发 `@swift-error-handling` 获取标准错误处理模式。",
|
|
613
|
+
"difficulty": "intermediate",
|
|
363
614
|
"scope": "universal",
|
|
364
|
-
"rationale": "用 typed enum Error 使调用者能精确 catch 不同错误类型。避免 generic Error string。Google Swift Style Guide 明确推荐 throws 而非 Result 混合模型",
|
|
365
615
|
"antiPattern": {
|
|
366
616
|
"bad": "func fetchData() -> String? { return nil /* on error */ }",
|
|
367
617
|
"why": "返回 nil 丢失错误信息,调用者无法区分'无数据'和'发生错误'",
|
|
@@ -375,17 +625,126 @@ description: Cold-start knowledge base initialization. Full 9-dimension analysis
|
|
|
375
625
|
}
|
|
376
626
|
```
|
|
377
627
|
|
|
628
|
+
**Go 示例:**
|
|
629
|
+
|
|
630
|
+
```json
|
|
631
|
+
{
|
|
632
|
+
"title": "错误处理: 自定义 error 类型 + errors.Is/As",
|
|
633
|
+
"trigger": "@go-error-handling",
|
|
634
|
+
"content": {
|
|
635
|
+
"markdown": "## Go 错误处理最佳实践\n\n### ✅ 推荐:自定义 error + fmt.Errorf %w + errors.Is/As\n```go\ntype NetworkError struct {\n\tStatusCode int\n\tMessage string\n}\n\nfunc (e *NetworkError) Error() string {\n\treturn fmt.Sprintf(\"network error %d: %s\", e.StatusCode, e.Message)\n}\n\nvar ErrTimeout = errors.New(\"request timeout\")\n\nfunc fetchData(url string) ([]byte, error) {\n\tresp, err := http.Get(url)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"fetch failed: %w\", err)\n\t}\n\tif resp.StatusCode >= 400 {\n\t\treturn nil, &NetworkError{StatusCode: resp.StatusCode}\n\t}\n\treturn io.ReadAll(resp.Body)\n}\n\n// 调用端\ndata, err := fetchData(endpoint)\nif errors.Is(err, ErrTimeout) {\n\t// 重试\n} else if var ne *NetworkError; errors.As(err, &ne) {\n\tlog.Printf(\"server error: %d\", ne.StatusCode)\n}\n```\n\n### 要点\n- 自定义 error 类型实现 `Error()` 接口\n- `fmt.Errorf(\"%w\")` 包装错误链\n- `errors.Is/As` 解包判断错误类型",
|
|
636
|
+
"pattern": "type NetworkError struct {\n\tStatusCode int\n\tMessage string\n}\nfunc (e *NetworkError) Error() string { ... }\nvar ErrTimeout = errors.New(\"request timeout\")\nfunc fetchData(url string) ([]byte, error) { ... }",
|
|
637
|
+
"rationale": "Go 用自定义 error 类型 + fmt.Errorf %w 包装 + errors.Is/As 判断,是官方推荐的错误处理模式。"
|
|
638
|
+
},
|
|
639
|
+
"description": "Go 错误处理:自定义 error 类型 + fmt.Errorf %w 包装 + errors.Is/As",
|
|
640
|
+
"kind": "pattern",
|
|
641
|
+
"doClause": "Use custom error types with fmt.Errorf wrapping and errors.Is/As for structured error handling",
|
|
642
|
+
"language": "go",
|
|
643
|
+
"headers": ["import \"errors\"", "import \"fmt\"", "import \"net/http\""],
|
|
644
|
+
"category": "Service",
|
|
645
|
+
"knowledgeType": "best-practice",
|
|
646
|
+
"usageGuide": "### 使用场景\n在 Go 项目中处理错误时,触发 `@go-error-handling` 获取标准错误处理模式。",
|
|
647
|
+
"difficulty": "intermediate",
|
|
648
|
+
"scope": "universal",
|
|
649
|
+
"antiPattern": {
|
|
650
|
+
"bad": "func fetchData() string { return \"\" /* on error */ }",
|
|
651
|
+
"why": "返回空字符串丢失错误信息,调用者无法区分'空结果'和'出错'",
|
|
652
|
+
"fix": "func fetchData() (string, error) { return \"\", fmt.Errorf(\"timeout\") }"
|
|
653
|
+
},
|
|
654
|
+
"reasoning": {
|
|
655
|
+
"whyStandard": "Go 的多返回值 + error 接口是核心错误处理范式,errors.Is/As 支持错误链解包",
|
|
656
|
+
"sources": ["Effective Go - Errors", "Go Blog: Working with Errors in Go 1.13"],
|
|
657
|
+
"confidence": 0.95
|
|
658
|
+
}
|
|
659
|
+
}
|
|
660
|
+
```
|
|
661
|
+
|
|
662
|
+
**Java 示例:**
|
|
663
|
+
|
|
664
|
+
```json
|
|
665
|
+
{
|
|
666
|
+
"title": "错误处理: 自定义异常层级 + 特定 catch",
|
|
667
|
+
"trigger": "@java-error-handling",
|
|
668
|
+
"content": {
|
|
669
|
+
"markdown": "## Java 错误处理最佳实践\n\n### ✅ 推荐:自定义异常层级 + 特定 catch\n```java\npublic class NetworkException extends RuntimeException {\n private final int statusCode;\n public NetworkException(int statusCode, String message) {\n super(message);\n this.statusCode = statusCode;\n }\n public int getStatusCode() { return statusCode; }\n}\n\npublic class TimeoutException extends NetworkException {\n public TimeoutException() { super(408, \"Request Timeout\"); }\n}\n\n// 调用端\ntry {\n var data = fetchData(endpoint);\n} catch (TimeoutException e) {\n retryLater();\n} catch (NetworkException e) {\n log.error(\"Server error: {}\", e.getStatusCode());\n}\n```\n\n### 要点\n- 自定义异常继承层级,精确 catch\n- 避免 `catch (Exception e)` 一揽子处理\n- 携带业务信息(如 statusCode)",
|
|
670
|
+
"pattern": "public class NetworkException extends RuntimeException {\n private final int statusCode;\n ...\n}\npublic class TimeoutException extends NetworkException { ... }\ntry { ... } catch (TimeoutException e) { ... } catch (NetworkException e) { ... }",
|
|
671
|
+
"rationale": "用异常层级使调用者能精确 catch 不同错误类型,避免 catch (Exception e) 一揽子处理。"
|
|
672
|
+
},
|
|
673
|
+
"description": "Java 错误处理:自定义异常层级 + 特定 catch 精确处理",
|
|
674
|
+
"kind": "pattern",
|
|
675
|
+
"doClause": "Use custom exception hierarchy with specific catch blocks for precise error handling",
|
|
676
|
+
"language": "java",
|
|
677
|
+
"headers": [],
|
|
678
|
+
"category": "Service",
|
|
679
|
+
"knowledgeType": "best-practice",
|
|
680
|
+
"usageGuide": "### 使用场景\n在 Java 项目中设计错误处理时,触发 `@java-error-handling` 获取自定义异常层级模式。",
|
|
681
|
+
"difficulty": "intermediate",
|
|
682
|
+
"scope": "universal",
|
|
683
|
+
"reasoning": {
|
|
684
|
+
"whyStandard": "Java 的 checked/unchecked exception 体系要求结构化的错误处理",
|
|
685
|
+
"sources": ["Effective Java - Exceptions", "Google Java Style Guide"],
|
|
686
|
+
"confidence": 0.95
|
|
687
|
+
}
|
|
688
|
+
}
|
|
689
|
+
```
|
|
690
|
+
|
|
691
|
+
**Dart (Flutter) 示例:**
|
|
692
|
+
|
|
693
|
+
```json
|
|
694
|
+
{
|
|
695
|
+
"title": "错误处理: 自定义 Exception + on-catch + Result 模式",
|
|
696
|
+
"trigger": "@dart-error-handling",
|
|
697
|
+
"content": {
|
|
698
|
+
"markdown": "## Dart 错误处理最佳实践\n\n### ✅ 推荐:自定义 Exception + on-catch\n```dart\nclass NetworkException implements Exception {\n final int statusCode;\n final String message;\n const NetworkException(this.statusCode, this.message);\n\n @override\n String toString() => 'NetworkException($statusCode): $message';\n}\n\nclass TimeoutException extends NetworkException {\n const TimeoutException() : super(408, 'Request timeout');\n}\n\nFuture<User> fetchUser(int id) async {\n try {\n return await _api.getUser(id);\n } on TimeoutException {\n return _cache.getUser(id) ?? rethrow;\n } on NetworkException catch (e) {\n _logger.warning('Network error: $e');\n rethrow;\n }\n}\n```\n\n### 要点\n- 自定义 Exception 携带业务信息(如 statusCode)\n- `on Type catch (e)` 精确捕获不同类型\n- `rethrow` 保留原始堆栈信息\n- 避免 `catch (_) { }` 吞掉所有错误",
|
|
699
|
+
"pattern": "class NetworkException implements Exception {\n final int statusCode;\n final String message;\n const NetworkException(this.statusCode, this.message);\n}\n\ntry {\n ...\n} on TimeoutException {\n ...\n} on NetworkException catch (e) {\n rethrow;\n}",
|
|
700
|
+
"rationale": "Dart 用 on .. catch 精确捕获不同异常类型,rethrow 保留原始堆栈。Effective Dart 推荐 implements Exception 而非 extends Error。"
|
|
701
|
+
},
|
|
702
|
+
"description": "Dart 错误处理:自定义 Exception + on-catch 精确捕获",
|
|
703
|
+
"kind": "pattern",
|
|
704
|
+
"doClause": "Use custom Exception types with on-catch blocks for structured error handling",
|
|
705
|
+
"language": "dart",
|
|
706
|
+
"headers": [],
|
|
707
|
+
"category": "Service",
|
|
708
|
+
"knowledgeType": "best-practice",
|
|
709
|
+
"usageGuide": "### 使用场景\n在 Dart/Flutter 项目中设计错误处理时,触发 `@dart-error-handling` 获取自定义 Exception 模式。",
|
|
710
|
+
"difficulty": "intermediate",
|
|
711
|
+
"scope": "universal",
|
|
712
|
+
"antiPattern": {
|
|
713
|
+
"bad": "try { ... } catch (_) { } // 或 throw 'error string'",
|
|
714
|
+
"why": "吞掉所有错误让 bug 难以排查;throw String 丢失堆栈信息",
|
|
715
|
+
"fix": "自定义 Exception + on .. catch + rethrow"
|
|
716
|
+
},
|
|
717
|
+
"reasoning": {
|
|
718
|
+
"whyStandard": "Effective Dart - Error handling; Dart 的 on-catch 支持按类型精确捕获",
|
|
719
|
+
"sources": ["Effective Dart - Usage (Errors)", "Dart Language Tour - Exceptions"],
|
|
720
|
+
"confidence": 0.95
|
|
721
|
+
}
|
|
722
|
+
}
|
|
723
|
+
```
|
|
724
|
+
|
|
378
725
|
### 维度 4: 调用链 (call-chain) — 参考模板
|
|
379
726
|
|
|
727
|
+
**Swift 示例:**
|
|
728
|
+
|
|
380
729
|
```json
|
|
381
730
|
{
|
|
382
731
|
"title": "用户登录调用链: View → ViewModel → AuthService → API",
|
|
383
|
-
"
|
|
732
|
+
"trigger": "@swift-login-chain",
|
|
733
|
+
"content": {
|
|
734
|
+
"markdown": "## Swift 用户登录调用链\n\n### 完整链路\n```\n1. LoginView: Button tap → viewModel.login()\n2. LoginViewModel: @MainActor func login()\n → authService.authenticate(email, password)\n3. AuthService: func authenticate() async throws → Token\n → apiClient.post(\"/auth/login\", body)\n4. APIClient: func post<T>() async throws → T\n → URLSession.shared.data(for: request)\n5. 返回链: Token → AuthService 存 Keychain → ViewModel 更新状态 → View 刷新\n```\n\n### 边界约束\n- AuthService 不直接 import View 层\n- Token 存取只通过 KeychainService",
|
|
735
|
+
"pattern": "LoginView → LoginViewModel → AuthService → APIClient → URLSession\nToken → Keychain → ViewModel state → View refresh",
|
|
736
|
+
"rationale": "登录是最核心的业务流程之一,新人必须理解完整链路才能修改认证逻辑。"
|
|
737
|
+
},
|
|
738
|
+
"description": "Swift 用户登录调用链:View → ViewModel → AuthService → API 四层链路",
|
|
739
|
+
"kind": "fact",
|
|
740
|
+
"doClause": "Follow the View to ViewModel to AuthService to API call chain for login flow",
|
|
384
741
|
"language": "swift",
|
|
385
|
-
"
|
|
742
|
+
"headers": ["import Foundation"],
|
|
743
|
+
"category": "View",
|
|
386
744
|
"knowledgeType": "call-chain",
|
|
745
|
+
"usageGuide": "### 使用场景\n修改登录流程或认证逻辑时,触发 `@swift-login-chain` 查看完整调用链路。",
|
|
746
|
+
"difficulty": "intermediate",
|
|
387
747
|
"scope": "project-specific",
|
|
388
|
-
"rationale": "登录是最核心的业务流程之一,新人必须理解完整链路才能修改认证逻辑",
|
|
389
748
|
"constraints": {
|
|
390
749
|
"boundaries": ["AuthService 不直接 import View 层", "Token 存取只通过 KeychainService"],
|
|
391
750
|
"preconditions": ["网络可用", "API endpoint 已配置"]
|
|
@@ -398,15 +757,61 @@ description: Cold-start knowledge base initialization. Full 9-dimension analysis
|
|
|
398
757
|
}
|
|
399
758
|
```
|
|
400
759
|
|
|
760
|
+
**TypeScript (React) 示例:**
|
|
761
|
+
|
|
762
|
+
```json
|
|
763
|
+
{
|
|
764
|
+
"title": "用户登录调用链: Component → Hook → Service → API",
|
|
765
|
+
"trigger": "@ts-login-chain",
|
|
766
|
+
"content": {
|
|
767
|
+
"markdown": "## TypeScript/React 登录调用链\n\n### 完整链路\n```\n1. LoginPage: form submit → useAuth().login(email, password)\n2. useAuth hook: async login()\n → authService.authenticate(email, password)\n3. AuthService: authenticate() → fetch('/api/auth/login', { method: 'POST', body })\n4. API route: POST /api/auth/login → validate → JWT\n5. 返回链: Token → localStorage.setItem → hook setState → Component re-render\n```\n\n### 边界约束\n- Component 不直接调用 fetch\n- Token 存取只通过 AuthService",
|
|
768
|
+
"pattern": "LoginPage → useAuth() hook → AuthService.authenticate() → fetch('/api/auth/login')\nToken → localStorage → hook setState → Component re-render",
|
|
769
|
+
"rationale": "登录流程是前端核心链路,涉及 UI → Hook → Service → API 四层。"
|
|
770
|
+
},
|
|
771
|
+
"description": "TypeScript/React 登录调用链:Component → Hook → Service → API",
|
|
772
|
+
"kind": "fact",
|
|
773
|
+
"doClause": "Follow the Component to Hook to Service to API call chain for login flow",
|
|
774
|
+
"language": "typescript",
|
|
775
|
+
"headers": ["import { useState } from 'react'"],
|
|
776
|
+
"category": "View",
|
|
777
|
+
"knowledgeType": "call-chain",
|
|
778
|
+
"usageGuide": "### 使用场景\n修改前端登录流程时,触发 `@ts-login-chain` 查看完整调用链路。",
|
|
779
|
+
"difficulty": "intermediate",
|
|
780
|
+
"scope": "project-specific",
|
|
781
|
+
"constraints": {
|
|
782
|
+
"boundaries": ["Component 不直接调用 fetch", "Token 存取只通过 AuthService"],
|
|
783
|
+
"preconditions": ["API 服务可用", "CORS 配置正确"]
|
|
784
|
+
},
|
|
785
|
+
"reasoning": {
|
|
786
|
+
"whyStandard": "前端登录流程涉及多层,清晰的链路文档帮助新人快速理解",
|
|
787
|
+
"sources": ["src/pages/LoginPage.tsx", "src/services/authService.ts"],
|
|
788
|
+
"confidence": 0.85
|
|
789
|
+
}
|
|
790
|
+
}
|
|
791
|
+
```
|
|
792
|
+
|
|
401
793
|
### 维度 7: Bug 修复 (solution + antiPattern) — 参考模板
|
|
402
794
|
|
|
795
|
+
**Swift 示例:**
|
|
796
|
+
|
|
403
797
|
```json
|
|
404
798
|
{
|
|
405
799
|
"title": "[Bug] 闭包中循环引用导致内存泄漏",
|
|
406
|
-
"
|
|
800
|
+
"trigger": "@swift-retain-cycle",
|
|
801
|
+
"content": {
|
|
802
|
+
"markdown": "## Swift 闭包循环引用修复\n\n### ❌ 内存泄漏\n```swift\nclass ViewModel {\n var onComplete: (() -> Void)?\n func start() {\n service.fetch { result in\n self.onComplete?() // strong capture → retain cycle\n }\n }\n}\n```\n\n### ✅ 修复:[weak self]\n```swift\nclass ViewModel {\n var onComplete: (() -> Void)?\n func start() {\n service.fetch { [weak self] result in\n self?.onComplete?()\n }\n }\n}\n```\n\n### 要点\n- 闭包默认 strong capture self\n- 如果 self 也持有 closure(直接或间接),形成 retain cycle\n- 用 `[weak self]` 打破循环",
|
|
803
|
+
"pattern": "service.fetch { [weak self] result in\n self?.onComplete?()\n}",
|
|
804
|
+
"rationale": "Swift 使用 ARC,闭包默认 strong capture。任何可能被持有的闭包都应使用 [weak self] 避免 retain cycle。"
|
|
805
|
+
},
|
|
806
|
+
"description": "Swift 闭包循环引用修复:[weak self] 避免 retain cycle 内存泄漏",
|
|
807
|
+
"kind": "pattern",
|
|
808
|
+
"doClause": "Use [weak self] in closures that may be retained to prevent retain cycle memory leaks",
|
|
407
809
|
"language": "swift",
|
|
810
|
+
"headers": ["import Foundation"],
|
|
408
811
|
"category": "Tool",
|
|
409
812
|
"knowledgeType": "solution",
|
|
813
|
+
"usageGuide": "### 使用场景\n遇到 Swift 闭包中的 self 引用时,触发 `@swift-retain-cycle` 检查是否需要 weak capture。",
|
|
814
|
+
"difficulty": "intermediate",
|
|
410
815
|
"scope": "universal",
|
|
411
816
|
"antiPattern": {
|
|
412
817
|
"bad": "service.fetch { result in self.handle(result) }",
|
|
@@ -421,12 +826,119 @@ description: Cold-start knowledge base initialization. Full 9-dimension analysis
|
|
|
421
826
|
}
|
|
422
827
|
```
|
|
423
828
|
|
|
829
|
+
**Go 示例:**
|
|
830
|
+
|
|
831
|
+
```json
|
|
832
|
+
{
|
|
833
|
+
"title": "[Bug] goroutine 泄漏: 未关闭的 channel 导致 goroutine 永久阻塞",
|
|
834
|
+
"trigger": "@go-goroutine-leak",
|
|
835
|
+
"content": {
|
|
836
|
+
"markdown": "## Go goroutine 泄漏修复\n\n### ❌ goroutine 泄漏\n```go\nfunc fetchAll(urls []string) []string {\n\tch := make(chan string)\n\tfor _, url := range urls {\n\t\tgo func(u string) {\n\t\t\tresp, _ := http.Get(u)\n\t\t\tch <- resp.Status // 如果 fetchAll 提前返回,goroutine 永久阻塞\n\t\t}(url)\n\t}\n\t// 只读取部分结果...\n}\n```\n\n### ✅ 修复: buffered channel + context\n```go\nfunc fetchAll(ctx context.Context, urls []string) []string {\n\tch := make(chan string, len(urls)) // buffered\n\tfor _, url := range urls {\n\t\tgo func(u string) {\n\t\t\treq, _ := http.NewRequestWithContext(ctx, \"GET\", u, nil)\n\t\t\tresp, err := http.DefaultClient.Do(req)\n\t\t\tif err != nil { ch <- \"\"; return }\n\t\t\tch <- resp.Status\n\t\t}(url)\n\t}\n\tresults := make([]string, 0, len(urls))\n\tfor range urls {\n\t\tresults = append(results, <-ch)\n\t}\n\treturn results\n}\n```\n\n### 要点\n- unbuffered channel 在无接收者时阻塞发送方 goroutine\n- 用 buffered channel 或 context 取消避免泄漏",
|
|
837
|
+
"pattern": "ch := make(chan string, len(urls)) // buffered\ngo func(u string) {\n\treq, _ := http.NewRequestWithContext(ctx, \"GET\", u, nil)\n\t...\n\tch <- resp.Status\n}(url)",
|
|
838
|
+
"rationale": "Go goroutine 无自动回收机制,泄漏的 goroutine 会持续占用内存和 CPU。用 buffered channel + context 取消是标准解法。"
|
|
839
|
+
},
|
|
840
|
+
"description": "Go goroutine 泄漏修复:buffered channel + context 取消避免永久阻塞",
|
|
841
|
+
"kind": "pattern",
|
|
842
|
+
"doClause": "Use buffered channels and context cancellation to prevent goroutine leaks from blocking sends",
|
|
843
|
+
"language": "go",
|
|
844
|
+
"headers": ["import \"context\"", "import \"net/http\""],
|
|
845
|
+
"category": "Tool",
|
|
846
|
+
"knowledgeType": "solution",
|
|
847
|
+
"usageGuide": "### 使用场景\n遇到 goroutine 泄漏或 channel 阻塞问题时,触发 `@go-goroutine-leak` 获取修复模式。",
|
|
848
|
+
"difficulty": "intermediate",
|
|
849
|
+
"scope": "universal",
|
|
850
|
+
"antiPattern": {
|
|
851
|
+
"bad": "ch := make(chan string)\ngo func() { ch <- result }()\n// caller 不再读取 → goroutine 永久阻塞",
|
|
852
|
+
"why": "unbuffered channel 在无接收者时阻塞发送方 goroutine,造成泄漏",
|
|
853
|
+
"fix": "ch := make(chan string, 1) // buffered,或用 context 取消"
|
|
854
|
+
},
|
|
855
|
+
"reasoning": {
|
|
856
|
+
"whyStandard": "Go goroutine 无自动回收机制,泄漏的 goroutine 会持续占用内存和 CPU",
|
|
857
|
+
"sources": ["Concurrency in Go", "Go Blog: Go Concurrency Patterns"],
|
|
858
|
+
"confidence": 0.95
|
|
859
|
+
}
|
|
860
|
+
}
|
|
861
|
+
```
|
|
862
|
+
|
|
863
|
+
**JavaScript 示例:**
|
|
864
|
+
|
|
865
|
+
```json
|
|
866
|
+
{
|
|
867
|
+
"title": "[Bug] async 函数中未 await 的 Promise 导致静默失败",
|
|
868
|
+
"trigger": "@js-foreach-async",
|
|
869
|
+
"content": {
|
|
870
|
+
"markdown": "## JS forEach + async 陷阱修复\n\n### ❌ 静默失败 — 未 await\n```javascript\nasync function processItems(items) {\n items.forEach(async (item) => {\n await saveToDatabase(item); // forEach 不等待 async 回调!\n });\n console.log('Done'); // 实际上 save 还没完成\n}\n```\n\n### ✅ 修复: Promise.all + map\n```javascript\nasync function processItems(items) {\n await Promise.all(\n items.map(item => saveToDatabase(item))\n );\n console.log('Done'); // 所有 save 完成后才执行\n}\n```\n\n### 要点\n- `Array.forEach` 不处理 async 回调的返回值(Promise)\n- 导致并发不可控且错误被吞\n- 用 `Promise.all + map` 或 `for...of` 替代",
|
|
871
|
+
"pattern": "await Promise.all(\n items.map(item => saveToDatabase(item))\n);",
|
|
872
|
+
"rationale": "Array.forEach 不处理 async 回调的返回值(Promise),导致并发不可控且错误被吞。用 Promise.all + map 替代。"
|
|
873
|
+
},
|
|
874
|
+
"description": "JS forEach+async 陷阱修复:用 Promise.all + map 替代 forEach",
|
|
875
|
+
"kind": "pattern",
|
|
876
|
+
"doClause": "Replace forEach with Promise.all and map when iterating with async operations",
|
|
877
|
+
"language": "javascript",
|
|
878
|
+
"headers": [],
|
|
879
|
+
"category": "Tool",
|
|
880
|
+
"knowledgeType": "solution",
|
|
881
|
+
"usageGuide": "### 使用场景\n遇到 forEach + async 组合时,触发 `@js-foreach-async` 获取正确的异步迭代模式。",
|
|
882
|
+
"difficulty": "intermediate",
|
|
883
|
+
"scope": "universal",
|
|
884
|
+
"antiPattern": {
|
|
885
|
+
"bad": "items.forEach(async (item) => { await doSomething(item); })",
|
|
886
|
+
"why": "Array.forEach 不处理 async 回调的返回值(Promise),导致并发不可控且错误被吞",
|
|
887
|
+
"fix": "await Promise.all(items.map(item => doSomething(item)))"
|
|
888
|
+
},
|
|
889
|
+
"reasoning": {
|
|
890
|
+
"whyStandard": "forEach + async 是 JS 中最常见的异步陷阱之一,ESLint 有专门规则检测",
|
|
891
|
+
"sources": ["MDN: Array.forEach", "ESLint: no-await-in-loop"],
|
|
892
|
+
"confidence": 0.95
|
|
893
|
+
}
|
|
894
|
+
}
|
|
895
|
+
```
|
|
896
|
+
|
|
897
|
+
**Dart (Flutter) 示例:**
|
|
898
|
+
|
|
899
|
+
```json
|
|
900
|
+
{
|
|
901
|
+
"title": "[Bug] BuildContext 跨越 async gap 导致引用已卸载的 Widget",
|
|
902
|
+
"trigger": "@dart-context-async",
|
|
903
|
+
"content": {
|
|
904
|
+
"markdown": "## Flutter BuildContext 跨 async gap 修复\n\n### ❌ 错误: BuildContext 跨越 async gap\n```dart\nFuture<void> _handleTap(BuildContext context) async {\n final data = await fetchData();\n // ⚠️ await 后 context 可能已失效(Widget 已卸载)\n Navigator.of(context).push(...); // 可能崩溃\n ScaffoldMessenger.of(context).showSnackBar(...); // 可能崩溃\n}\n```\n\n### ✅ 修复: 在 await 前缓存所需对象\n```dart\nFuture<void> _handleTap(BuildContext context) async {\n final navigator = Navigator.of(context); // await 前缓存\n final messenger = ScaffoldMessenger.of(context);\n\n final data = await fetchData();\n\n navigator.push(...); // 安全\n messenger.showSnackBar(...); // 安全\n}\n\n// ✅ 或在 StatefulWidget 中检查 mounted\nFuture<void> _handleTap() async {\n final data = await fetchData();\n if (!mounted) return; // Widget 已卸载则退出\n Navigator.of(context).push(...);\n}\n```\n\n### 要点\n- `BuildContext` 绑定到 Widget Element,Widget 卸载后 context 失效\n- `await` 之后当前 Widget 可能已被 dispose\n- 在 `await` 前缓存 `Navigator.of(context)` 等引用,或在 `await` 后检查 `mounted`",
|
|
905
|
+
"pattern": "final navigator = Navigator.of(context); // await 前缓存\nfinal data = await fetchData();\nnavigator.push(...); // 安全",
|
|
906
|
+
"rationale": "Flutter 的 BuildContext 绑定到 Widget Element 生命周期,await 后 Widget 可能已卸载导致 context 失效。use_build_context_synchronously lint 规则检测此问题。"
|
|
907
|
+
},
|
|
908
|
+
"description": "Flutter BuildContext 跨 async gap 修复:await 前缓存或 await 后检查 mounted",
|
|
909
|
+
"kind": "pattern",
|
|
910
|
+
"doClause": "Cache context-dependent references before await or check mounted after await",
|
|
911
|
+
"language": "dart",
|
|
912
|
+
"headers": ["import 'package:flutter/material.dart';"],
|
|
913
|
+
"category": "Tool",
|
|
914
|
+
"knowledgeType": "solution",
|
|
915
|
+
"usageGuide": "### 使用场景\n在 Flutter 中使用 BuildContext + async/await 时,触发 `@dart-context-async` 获取安全使用模式。",
|
|
916
|
+
"difficulty": "intermediate",
|
|
917
|
+
"scope": "universal",
|
|
918
|
+
"antiPattern": {
|
|
919
|
+
"bad": "await fetchData();\nNavigator.of(context).push(...);",
|
|
920
|
+
"why": "await 后 Widget 可能已卸载,context 失效,导致运行时异常",
|
|
921
|
+
"fix": "final nav = Navigator.of(context); await fetchData(); nav.push(...);"
|
|
922
|
+
},
|
|
923
|
+
"reasoning": {
|
|
924
|
+
"whyStandard": "Flutter use_build_context_synchronously lint 规则;官方异步最佳实践",
|
|
925
|
+
"sources": ["Flutter Lint: use_build_context_synchronously", "Effective Dart - Usage"],
|
|
926
|
+
"confidence": 0.95
|
|
927
|
+
}
|
|
928
|
+
}
|
|
929
|
+
```
|
|
930
|
+
|
|
424
931
|
### 更多语言参考
|
|
425
932
|
|
|
426
933
|
> 本 Skill 侧重通用流程。**语言专属的详细最佳实践参考**,请查阅以下 Companion Skills:
|
|
427
934
|
> - **autosnippet-reference-swift** — Swift 专属:Concurrency/SwiftUI/ARC/Protocol 模式/Apple 命名规范
|
|
428
935
|
> - **autosnippet-reference-objc** — Objective-C 专属:ARC/Block/Delegate/Prefix/NSError/GCD 模式
|
|
429
936
|
> - **autosnippet-reference-jsts** — JavaScript/TypeScript 专属:async-await/React/Node.js/ESM/类型系统
|
|
937
|
+
> - **autosnippet-reference-python** — Python 专属:类型提示/异步/推导式/上下文管理/数据类
|
|
938
|
+
> - **autosnippet-reference-java** — Java 专属:泛型/Optional/Stream/Record/并发/DI
|
|
939
|
+
> - **autosnippet-reference-kotlin** — Kotlin 专属:空安全/协程/Flow/sealed class/DSL/Compose
|
|
940
|
+
> - **autosnippet-reference-go** — Go 专属:错误处理/接口组合/goroutine/channel/Context/测试
|
|
941
|
+
> - **autosnippet-reference-dart** — Dart (Flutter) 专属:空安全/Widget 设计/状态管理(BLoC/Riverpod)/Freezed/Clean Architecture/测试
|
|
430
942
|
|
|
431
943
|
---
|
|
432
944
|
|
|
@@ -439,7 +951,7 @@ description: Cold-start knowledge base initialization. Full 9-dimension analysis
|
|
|
439
951
|
| 分析质量不高 | 切换 `aiMode="internal"` 使用内置 AI |
|
|
440
952
|
| Guard 违规太多 | 先处理 Guard 违规,再做知识分析 |
|
|
441
953
|
| 提交后候选在哪里 | Dashboard → Candidates 页面审核 |
|
|
442
|
-
| 不知道该语言的最佳实践 | 查阅 autosnippet-reference-
|
|
954
|
+
| 不知道该语言的最佳实践 | 查阅 autosnippet-reference-{lang} Skill |
|
|
443
955
|
|
|
444
956
|
---
|
|
445
957
|
|
|
@@ -465,3 +977,8 @@ description: Cold-start knowledge base initialization. Full 9-dimension analysis
|
|
|
465
977
|
- **autosnippet-reference-swift**: Swift 业界最佳实践参考(命名/并发/错误处理/内存/设计模式)
|
|
466
978
|
- **autosnippet-reference-objc**: Objective-C 业界最佳实践参考(ARC/Block/Delegate/Prefix/GCD)
|
|
467
979
|
- **autosnippet-reference-jsts**: JavaScript/TypeScript 业界最佳实践参考(async/React/Node/ESM/类型系统)
|
|
980
|
+
- **autosnippet-reference-python**: Python 业界最佳实践参考(类型提示/异步/推导式/上下文管理/数据类)
|
|
981
|
+
- **autosnippet-reference-java**: Java 业界最佳实践参考(泛型/Optional/Stream/Record/并发/DI)
|
|
982
|
+
- **autosnippet-reference-kotlin**: Kotlin 业界最佳实践参考(空安全/协程/Flow/sealed class/DSL/Compose)
|
|
983
|
+
- **autosnippet-reference-go**: Go 业界最佳实践参考(错误处理/接口组合/goroutine/channel/Context/测试)
|
|
984
|
+
- **autosnippet-reference-dart**: Dart (Flutter) 业界最佳实践参考(空安全/Widget 设计/BLoC/Riverpod/Freezed/Clean Architecture/测试)
|