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.
Files changed (290) hide show
  1. package/README.md +230 -324
  2. package/bin/api-server.js +1 -1
  3. package/bin/cli.js +204 -244
  4. package/bin/mcp-server.js +5 -3
  5. package/config/knowledge-base.config.js +132 -132
  6. package/dashboard/dist/assets/{icons-CEfgGaZi.js → icons-Cdq22n2i.js} +95 -100
  7. package/dashboard/dist/assets/index-ClkyPkDX.js +133 -0
  8. package/dashboard/dist/assets/index-t4QrJwv1.css +1 -0
  9. package/dashboard/dist/index.html +3 -3
  10. package/lib/bootstrap.js +8 -8
  11. package/lib/cli/AiScanService.js +86 -40
  12. package/lib/cli/KnowledgeSyncService.js +113 -74
  13. package/lib/cli/SetupService.js +439 -277
  14. package/lib/cli/UpgradeService.js +63 -100
  15. package/lib/core/AstAnalyzer.js +276 -597
  16. package/lib/core/ast/ProjectGraph.js +101 -40
  17. package/lib/core/ast/ensure-grammars.js +232 -0
  18. package/lib/core/ast/index.js +115 -0
  19. package/lib/core/ast/lang-dart.js +661 -0
  20. package/lib/core/ast/lang-go.js +530 -0
  21. package/lib/core/ast/lang-java.js +435 -0
  22. package/lib/core/ast/lang-javascript.js +272 -0
  23. package/lib/core/ast/lang-kotlin.js +423 -0
  24. package/lib/core/ast/lang-objc.js +388 -0
  25. package/lib/core/ast/lang-python.js +371 -0
  26. package/lib/core/ast/lang-swift.js +337 -0
  27. package/lib/core/ast/lang-typescript.js +503 -0
  28. package/lib/core/capability/CapabilityProbe.js +18 -9
  29. package/lib/core/constitution/Constitution.js +2 -3
  30. package/lib/core/constitution/ConstitutionValidator.js +65 -24
  31. package/lib/core/discovery/DartDiscoverer.js +534 -0
  32. package/lib/core/discovery/DiscovererRegistry.js +83 -0
  33. package/lib/core/discovery/GenericDiscoverer.js +225 -0
  34. package/lib/core/discovery/GoDiscoverer.js +541 -0
  35. package/lib/core/discovery/JvmDiscoverer.js +506 -0
  36. package/lib/core/discovery/NodeDiscoverer.js +466 -0
  37. package/lib/core/discovery/ProjectDiscoverer.js +93 -0
  38. package/lib/core/discovery/PythonDiscoverer.js +338 -0
  39. package/lib/core/discovery/SpmDiscoverer.js +5 -0
  40. package/lib/core/discovery/index.js +53 -0
  41. package/lib/core/enhancement/EnhancementPack.js +71 -0
  42. package/lib/core/enhancement/EnhancementRegistry.js +47 -0
  43. package/lib/core/enhancement/android-enhancement.js +102 -0
  44. package/lib/core/enhancement/django-enhancement.js +70 -0
  45. package/lib/core/enhancement/fastapi-enhancement.js +63 -0
  46. package/lib/core/enhancement/go-grpc-enhancement.js +152 -0
  47. package/lib/core/enhancement/go-web-enhancement.js +201 -0
  48. package/lib/core/enhancement/index.js +65 -0
  49. package/lib/core/enhancement/node-server-enhancement.js +88 -0
  50. package/lib/core/enhancement/react-enhancement.js +86 -0
  51. package/lib/core/enhancement/spring-enhancement.js +112 -0
  52. package/lib/core/enhancement/vue-enhancement.js +96 -0
  53. package/lib/core/gateway/Gateway.js +8 -9
  54. package/lib/core/gateway/GatewayActionRegistry.js +1 -1
  55. package/lib/core/permission/PermissionManager.js +12 -8
  56. package/lib/domain/index.js +13 -9
  57. package/lib/domain/knowledge/KnowledgeEntry.js +111 -101
  58. package/lib/domain/knowledge/KnowledgeRepository.js +0 -1
  59. package/lib/domain/knowledge/Lifecycle.js +22 -22
  60. package/lib/domain/knowledge/index.js +9 -12
  61. package/lib/domain/knowledge/values/Constraints.js +31 -21
  62. package/lib/domain/knowledge/values/Content.js +21 -13
  63. package/lib/domain/knowledge/values/Quality.js +31 -18
  64. package/lib/domain/knowledge/values/Reasoning.js +20 -12
  65. package/lib/domain/knowledge/values/Relations.js +37 -25
  66. package/lib/domain/knowledge/values/Stats.js +18 -12
  67. package/lib/domain/knowledge/values/index.js +4 -3
  68. package/lib/domain/snippet/Snippet.js +35 -10
  69. package/lib/external/ai/AiFactory.js +48 -16
  70. package/lib/external/ai/AiProvider.js +184 -90
  71. package/lib/external/ai/providers/ClaudeProvider.js +25 -12
  72. package/lib/external/ai/providers/GoogleGeminiProvider.js +59 -30
  73. package/lib/external/ai/providers/MockProvider.js +9 -3
  74. package/lib/external/ai/providers/OpenAiProvider.js +51 -29
  75. package/lib/external/mcp/McpServer.js +66 -36
  76. package/lib/external/mcp/errorHandler.js +23 -11
  77. package/lib/external/mcp/handlers/LanguageExtensions.js +138 -53
  78. package/lib/external/mcp/handlers/TargetClassifier.js +52 -16
  79. package/lib/external/mcp/handlers/bootstrap/pipeline/BootstrapSnapshot.js +81 -20
  80. package/lib/external/mcp/handlers/bootstrap/pipeline/EpisodicMemory.js +71 -42
  81. package/lib/external/mcp/handlers/bootstrap/pipeline/IncrementalBootstrap.js +9 -17
  82. package/lib/external/mcp/handlers/bootstrap/pipeline/ToolResultCache.js +14 -9
  83. package/lib/external/mcp/handlers/bootstrap/pipeline/dimension-context.js +15 -7
  84. package/lib/external/mcp/handlers/bootstrap/pipeline/orchestrator.js +352 -153
  85. package/lib/external/mcp/handlers/bootstrap/pipeline/tier-scheduler.js +52 -12
  86. package/lib/external/mcp/handlers/bootstrap/skills.js +143 -39
  87. package/lib/external/mcp/handlers/bootstrap.js +691 -168
  88. package/lib/external/mcp/handlers/browse.js +66 -22
  89. package/lib/external/mcp/handlers/candidate.js +118 -35
  90. package/lib/external/mcp/handlers/consolidated.js +49 -17
  91. package/lib/external/mcp/handlers/guard.js +104 -39
  92. package/lib/external/mcp/handlers/knowledge.js +60 -36
  93. package/lib/external/mcp/handlers/search.js +43 -14
  94. package/lib/external/mcp/handlers/skill.js +120 -45
  95. package/lib/external/mcp/handlers/structure.js +240 -86
  96. package/lib/external/mcp/handlers/system.js +42 -12
  97. package/lib/external/mcp/handlers/wiki.js +58 -33
  98. package/lib/external/mcp/tools.js +306 -123
  99. package/lib/http/HttpServer.js +72 -47
  100. package/lib/http/middleware/RateLimiter.js +5 -3
  101. package/lib/http/middleware/errorHandler.js +6 -1
  102. package/lib/http/middleware/requestLogger.js +14 -3
  103. package/lib/http/middleware/roleResolver.js +30 -23
  104. package/lib/http/routes/ai.js +387 -265
  105. package/lib/http/routes/auth.js +81 -61
  106. package/lib/http/routes/candidates.js +430 -320
  107. package/lib/http/routes/commands.js +289 -189
  108. package/lib/http/routes/extract.js +158 -125
  109. package/lib/http/routes/guardRules.js +309 -217
  110. package/lib/http/routes/knowledge.js +213 -154
  111. package/lib/http/routes/modules.js +578 -0
  112. package/lib/http/routes/monitoring.js +6 -6
  113. package/lib/http/routes/recipes.js +104 -93
  114. package/lib/http/routes/search.js +361 -305
  115. package/lib/http/routes/skills.js +145 -98
  116. package/lib/http/routes/snippets.js +42 -30
  117. package/lib/http/routes/spm.js +3 -405
  118. package/lib/http/routes/violations.js +113 -93
  119. package/lib/http/routes/wiki.js +211 -170
  120. package/lib/http/utils/routeHelpers.js +3 -1
  121. package/lib/http/utils/sse-sessions.js +16 -6
  122. package/lib/http/utils/sse.js +15 -5
  123. package/lib/infrastructure/audit/AuditLogger.js +5 -2
  124. package/lib/infrastructure/audit/AuditStore.js +10 -7
  125. package/lib/infrastructure/cache/CacheService.js +3 -1
  126. package/lib/infrastructure/cache/GraphCache.js +8 -4
  127. package/lib/infrastructure/cache/UnifiedCacheAdapter.js +1 -1
  128. package/lib/infrastructure/config/ConfigLoader.js +9 -5
  129. package/lib/infrastructure/config/Defaults.js +30 -10
  130. package/lib/infrastructure/config/Paths.js +28 -8
  131. package/lib/infrastructure/config/TriggerSymbol.js +22 -10
  132. package/lib/infrastructure/database/DatabaseConnection.js +15 -10
  133. package/lib/infrastructure/database/migrations/001_initial_schema.js +0 -1
  134. package/lib/infrastructure/external/ClipboardManager.js +6 -2
  135. package/lib/infrastructure/external/NativeUi.js +50 -43
  136. package/lib/infrastructure/external/OpenBrowser.js +14 -17
  137. package/lib/infrastructure/external/XcodeAutomation.js +14 -258
  138. package/lib/infrastructure/logging/Logger.js +46 -30
  139. package/lib/infrastructure/monitoring/ErrorTracker.js +7 -5
  140. package/lib/infrastructure/monitoring/PerformanceMonitor.js +12 -4
  141. package/lib/infrastructure/paths/HeaderResolver.js +25 -9
  142. package/lib/infrastructure/paths/PathFinder.js +34 -12
  143. package/lib/infrastructure/plugin/PluginManager.js +26 -8
  144. package/lib/infrastructure/realtime/RealtimeService.js +2 -2
  145. package/lib/infrastructure/vector/Chunker.js +22 -7
  146. package/lib/infrastructure/vector/IndexingPipeline.js +46 -22
  147. package/lib/infrastructure/vector/JsonVectorAdapter.js +90 -53
  148. package/lib/infrastructure/vector/VectorStore.js +28 -10
  149. package/lib/injection/ServiceContainer.js +247 -93
  150. package/lib/platform/ios/index.js +63 -0
  151. package/lib/platform/ios/routes/spm.js +437 -0
  152. package/lib/platform/ios/snippet/PlaceholderConverter.js +55 -0
  153. package/lib/platform/ios/snippet/XcodeCodec.js +112 -0
  154. package/lib/{service → platform/ios}/spm/DependencyGraph.js +41 -17
  155. package/lib/{service → platform/ios}/spm/PackageSwiftParser.js +41 -14
  156. package/lib/{service → platform/ios}/spm/PolicyEngine.js +9 -4
  157. package/lib/platform/ios/spm/SpmDiscoverer.js +122 -0
  158. package/lib/{service → platform/ios}/spm/SpmService.js +385 -127
  159. package/lib/{service/automation → platform/ios/xcode}/SaveEventFilter.js +8 -7
  160. package/lib/platform/ios/xcode/XcodeAutomation.js +350 -0
  161. package/lib/{service/automation → platform/ios/xcode}/XcodeIntegration.js +325 -145
  162. package/lib/repository/base/BaseRepository.js +7 -9
  163. package/lib/repository/knowledge/KnowledgeRepository.impl.js +98 -75
  164. package/lib/repository/token/TokenUsageStore.js +4 -2
  165. package/lib/service/automation/ActionPipeline.js +1 -1
  166. package/lib/service/automation/AutomationOrchestrator.js +8 -4
  167. package/lib/service/automation/ContextCollector.js +7 -5
  168. package/lib/service/automation/DirectiveDetector.js +23 -16
  169. package/lib/service/automation/FileWatcher.js +112 -56
  170. package/lib/service/automation/TriggerResolver.js +6 -4
  171. package/lib/service/automation/handlers/AlinkHandler.js +24 -12
  172. package/lib/service/automation/handlers/CreateHandler.js +19 -20
  173. package/lib/service/automation/handlers/DraftHandler.js +14 -8
  174. package/lib/service/automation/handlers/GuardHandler.js +93 -63
  175. package/lib/service/automation/handlers/HeaderHandler.js +1 -6
  176. package/lib/service/automation/handlers/SearchHandler.js +155 -88
  177. package/lib/service/bootstrap/BootstrapTaskManager.js +77 -35
  178. package/lib/service/candidate/SimilarityService.js +25 -9
  179. package/lib/service/chat/AnalystAgent.js +50 -24
  180. package/lib/service/chat/CandidateGuardrail.js +143 -17
  181. package/lib/service/chat/ChatAgent.js +759 -243
  182. package/lib/service/chat/ContextWindow.js +116 -71
  183. package/lib/service/chat/ConversationStore.js +77 -36
  184. package/lib/service/chat/EpisodicConsolidator.js +47 -23
  185. package/lib/service/chat/HandoffProtocol.js +98 -22
  186. package/lib/service/chat/Memory.js +34 -14
  187. package/lib/service/chat/ProducerAgent.js +40 -20
  188. package/lib/service/chat/ProjectSemanticMemory.js +109 -78
  189. package/lib/service/chat/ReasoningLayer.js +148 -70
  190. package/lib/service/chat/ReasoningTrace.js +44 -32
  191. package/lib/service/chat/TaskPipeline.js +39 -19
  192. package/lib/service/chat/ToolRegistry.js +48 -29
  193. package/lib/service/chat/WorkingMemory.js +44 -18
  194. package/lib/service/chat/tools.js +1096 -494
  195. package/lib/service/context/RecipeExtractor.js +132 -51
  196. package/lib/service/cursor/CursorDeliveryPipeline.js +82 -37
  197. package/lib/service/cursor/KnowledgeCompressor.js +25 -22
  198. package/lib/service/cursor/RulesGenerator.js +13 -7
  199. package/lib/service/cursor/SkillsSyncer.js +77 -27
  200. package/lib/service/cursor/TokenBudget.js +2 -2
  201. package/lib/service/cursor/TopicClassifier.js +54 -20
  202. package/lib/service/guard/ComplianceReporter.js +55 -43
  203. package/lib/service/guard/ExclusionManager.js +67 -29
  204. package/lib/service/guard/GuardCheckEngine.js +381 -86
  205. package/lib/service/guard/GuardFeedbackLoop.js +22 -10
  206. package/lib/service/guard/GuardService.js +29 -19
  207. package/lib/service/guard/RuleLearner.js +55 -23
  208. package/lib/service/guard/SourceFileCollector.js +27 -20
  209. package/lib/service/guard/ViolationsStore.js +43 -38
  210. package/lib/service/knowledge/CodeEntityGraph.js +147 -82
  211. package/lib/service/knowledge/ConfidenceRouter.js +12 -10
  212. package/lib/service/knowledge/KnowledgeFileWriter.js +147 -56
  213. package/lib/service/knowledge/KnowledgeGraphService.js +81 -34
  214. package/lib/service/knowledge/KnowledgeService.js +222 -112
  215. package/lib/service/module/ModuleService.js +969 -0
  216. package/lib/service/quality/FeedbackCollector.js +27 -15
  217. package/lib/service/quality/QualityScorer.js +78 -24
  218. package/lib/service/recipe/RecipeCandidateValidator.js +110 -44
  219. package/lib/service/recipe/RecipeParser.js +78 -45
  220. package/lib/service/search/CoarseRanker.js +43 -28
  221. package/lib/service/search/CrossEncoderReranker.js +32 -21
  222. package/lib/service/search/InvertedIndex.js +21 -7
  223. package/lib/service/search/MultiSignalRanker.js +90 -28
  224. package/lib/service/search/RetrievalFunnel.js +45 -24
  225. package/lib/service/search/SearchEngine.js +255 -103
  226. package/lib/service/skills/EventAggregator.js +32 -15
  227. package/lib/service/skills/SignalCollector.js +140 -64
  228. package/lib/service/skills/SkillAdvisor.js +79 -42
  229. package/lib/service/skills/SkillHooks.js +16 -14
  230. package/lib/service/snippet/PlaceholderConverter.js +5 -0
  231. package/lib/service/snippet/SnippetFactory.js +116 -99
  232. package/lib/service/snippet/SnippetInstaller.js +234 -62
  233. package/lib/service/snippet/codecs/SnippetCodec.js +67 -0
  234. package/lib/service/snippet/codecs/VSCodeCodec.js +102 -0
  235. package/lib/service/snippet/codecs/XcodeCodec.js +5 -0
  236. package/lib/service/wiki/WikiGenerator.js +637 -263
  237. package/lib/shared/DimensionCopyRegistry.js +472 -0
  238. package/lib/shared/LanguageService.js +399 -0
  239. package/lib/shared/PathGuard.js +45 -28
  240. package/lib/shared/RecipeReadinessChecker.js +72 -12
  241. package/lib/shared/constants.js +41 -41
  242. package/lib/shared/errors/BaseError.js +2 -2
  243. package/lib/shared/errors/index.js +4 -4
  244. package/lib/shared/similarity.js +25 -8
  245. package/lib/shared/token-utils.js +6 -2
  246. package/lib/shared/utils/common.js +12 -4
  247. package/package.json +49 -13
  248. package/scripts/bench-real-projects.mjs +256 -0
  249. package/scripts/build-native-ui.js +30 -30
  250. package/scripts/clear-old-vector-index.js +5 -35
  251. package/scripts/clear-vector-cache.js +7 -37
  252. package/scripts/collect-test-project-stats.mjs +160 -0
  253. package/scripts/diagnose-mcp.js +41 -32
  254. package/scripts/ensure-parse-package.js +6 -9
  255. package/scripts/generate-recipe-drafts.js +116 -77
  256. package/scripts/init-db.js +3 -20
  257. package/scripts/init-snippets.js +305 -0
  258. package/scripts/init-vector-db.js +173 -170
  259. package/scripts/install-cursor-skill.js +148 -104
  260. package/scripts/install-full.js +8 -21
  261. package/scripts/install-vscode-copilot.js +146 -145
  262. package/scripts/migrate-md-to-knowledge.mjs +139 -151
  263. package/scripts/postinstall-safe.js +5 -17
  264. package/scripts/recipe-audit.js +106 -82
  265. package/scripts/release.js +283 -323
  266. package/scripts/setup-mcp-config.js +60 -52
  267. package/scripts/verify-context-api.js +20 -20
  268. package/skills/autosnippet-analysis/SKILL.md +10 -6
  269. package/skills/autosnippet-candidates/SKILL.md +27 -26
  270. package/skills/autosnippet-coldstart/SKILL.md +555 -38
  271. package/skills/autosnippet-concepts/SKILL.md +349 -337
  272. package/skills/autosnippet-create/SKILL.md +5 -5
  273. package/skills/autosnippet-reference-dart/SKILL.md +543 -0
  274. package/skills/autosnippet-reference-go/SKILL.md +539 -0
  275. package/skills/autosnippet-reference-java/SKILL.md +534 -0
  276. package/skills/autosnippet-reference-jsts/SKILL.md +41 -9
  277. package/skills/autosnippet-reference-kotlin/SKILL.md +526 -0
  278. package/skills/autosnippet-reference-objc/SKILL.md +29 -6
  279. package/skills/autosnippet-reference-python/SKILL.md +800 -0
  280. package/skills/autosnippet-reference-swift/SKILL.md +70 -14
  281. package/skills/autosnippet-structure/SKILL.md +4 -4
  282. package/templates/cursor-rules/autosnippet-conventions.mdc +2 -2
  283. package/templates/recipes-setup/README.md +2 -2
  284. package/templates/recipes-setup/_template.md +1 -1
  285. package/dashboard/dist/assets/index-Bun3ld_J.css +0 -1
  286. package/dashboard/dist/assets/index-_Sk_Dmg3.js +0 -143
  287. package/resources/asd-entry/main.swift +0 -159
  288. package/scripts/build-asd-entry.js +0 -51
  289. package/scripts/init-xcode-snippets.js +0 -311
  290. package/template.json +0 -39
@@ -0,0 +1,63 @@
1
+ /**
2
+ * FastAPI Enhancement Pack
3
+ * 条件: { languages: ['python'], frameworks: ['fastapi'] }
4
+ */
5
+
6
+ import { EnhancementPack } from './EnhancementPack.js';
7
+
8
+ class FastAPIEnhancement extends EnhancementPack {
9
+ get id() {
10
+ return 'fastapi';
11
+ }
12
+ get displayName() {
13
+ return 'FastAPI Enhancement';
14
+ }
15
+ get conditions() {
16
+ return { languages: ['python'], frameworks: ['fastapi'] };
17
+ }
18
+
19
+ getExtraDimensions() {
20
+ return [
21
+ {
22
+ id: 'fastapi-route-scan',
23
+ label: 'FastAPI 路由分析',
24
+ guide: 'Route 装饰器(@app.get/post/put/delete)、Pydantic Model/Schema、DI (Depends())',
25
+ knowledgeTypes: ['architecture', 'code-pattern'],
26
+ skillWorthy: true,
27
+ dualOutput: true,
28
+ skillMeta: {
29
+ name: 'project-fastapi-routes',
30
+ description:
31
+ 'FastAPI route definitions, Pydantic schemas and dependency injection (auto-generated by enhancement)',
32
+ },
33
+ },
34
+ ];
35
+ }
36
+
37
+ detectPatterns(astSummary) {
38
+ const patterns = [];
39
+ for (const cls of astSummary.classes || []) {
40
+ if (cls.superclass && /BaseModel/.test(cls.superclass)) {
41
+ patterns.push({
42
+ type: 'pydantic-model',
43
+ className: cls.name,
44
+ line: cls.line,
45
+ confidence: 0.9,
46
+ });
47
+ }
48
+ }
49
+ for (const m of astSummary.methods || []) {
50
+ if (m.decorators?.some((d) => /@app\.(get|post|put|delete|patch)/.test(d))) {
51
+ patterns.push({
52
+ type: 'fastapi-route',
53
+ methodName: m.name,
54
+ line: m.line,
55
+ confidence: 0.95,
56
+ });
57
+ }
58
+ }
59
+ return patterns;
60
+ }
61
+ }
62
+
63
+ export const pack = new FastAPIEnhancement();
@@ -0,0 +1,152 @@
1
+ /**
2
+ * Go gRPC Enhancement Pack
3
+ * 条件: { languages: ['go'], frameworks: ['grpc'] }
4
+ *
5
+ * 覆盖 gRPC Go 微服务项目:
6
+ * - protobuf service 实现
7
+ * - Unimplemented*Server 嵌入
8
+ * - 流式/一元 RPC 方法
9
+ * - interceptor 链
10
+ */
11
+
12
+ import { EnhancementPack } from './EnhancementPack.js';
13
+
14
+ class GoGrpcEnhancement extends EnhancementPack {
15
+ get id() {
16
+ return 'go-grpc';
17
+ }
18
+ get displayName() {
19
+ return 'Go gRPC Enhancement';
20
+ }
21
+ get conditions() {
22
+ return { languages: ['go'], frameworks: ['grpc'] };
23
+ }
24
+
25
+ getExtraDimensions() {
26
+ return [
27
+ {
28
+ id: 'go-grpc-service-scan',
29
+ label: 'gRPC Service 分析',
30
+ guide:
31
+ 'gRPC Service 实现分析 — Protobuf 生成代码与手写代码分离、Unimplemented*Server 嵌入、一元/流式方法分布、错误码使用规范',
32
+ knowledgeTypes: ['architecture', 'code-pattern'],
33
+ skillWorthy: true,
34
+ dualOutput: true,
35
+ skillMeta: {
36
+ name: 'project-go-grpc',
37
+ description:
38
+ 'Go gRPC service implementations, streaming patterns and error code usage (auto-generated by enhancement)',
39
+ },
40
+ },
41
+ {
42
+ id: 'go-grpc-interceptor-scan',
43
+ label: 'gRPC Interceptor 分析',
44
+ guide:
45
+ 'gRPC Interceptor 链路分析 — UnaryServerInterceptor / StreamServerInterceptor 注册顺序、日志/认证/限流拦截器',
46
+ knowledgeTypes: ['architecture'],
47
+ skillWorthy: true,
48
+ dualOutput: true,
49
+ skillMeta: {
50
+ name: 'project-go-grpc-interceptors',
51
+ description:
52
+ 'Go gRPC interceptor chain ordering and middleware patterns (auto-generated by enhancement)',
53
+ },
54
+ },
55
+ ];
56
+ }
57
+
58
+ getGuardRules() {
59
+ return [
60
+ {
61
+ ruleId: 'go-grpc-unimplemented-embed',
62
+ severity: 'warning',
63
+ languages: ['go'],
64
+ pattern: /Unimplemented\w+Server\b/,
65
+ message:
66
+ 'gRPC service 应嵌入 Unimplemented*Server 以保证前向兼容(新增 RPC 方法时不会编译失败)',
67
+ },
68
+ {
69
+ ruleId: 'go-grpc-status-error',
70
+ severity: 'info',
71
+ languages: ['go'],
72
+ pattern: /fmt\.Errorf|errors\.New/,
73
+ message:
74
+ 'gRPC handler 中应使用 status.Errorf/status.Error 返回标准 gRPC 错误码,而非 fmt.Errorf',
75
+ },
76
+ ];
77
+ }
78
+
79
+ detectPatterns(astSummary) {
80
+ const patterns = [];
81
+
82
+ // ── gRPC Service Implementations ──
83
+ for (const cls of astSummary.classes || []) {
84
+ if (cls.kind !== 'struct') {
85
+ continue;
86
+ }
87
+ // Structs embedding Unimplemented*Server
88
+ if (cls.embeddedTypes?.some((t) => /^Unimplemented\w+Server$/.test(t))) {
89
+ patterns.push({
90
+ type: 'go-grpc-service-impl',
91
+ className: cls.name,
92
+ embeds: cls.embeddedTypes.filter((t) => /Unimplemented/.test(t)),
93
+ line: cls.line,
94
+ confidence: 0.95,
95
+ });
96
+ }
97
+ // Server structs (name ends with Server)
98
+ if (/Server$/.test(cls.name) && cls.fieldCount > 0) {
99
+ patterns.push({
100
+ type: 'go-grpc-server-struct',
101
+ className: cls.name,
102
+ line: cls.line,
103
+ confidence: 0.6,
104
+ });
105
+ }
106
+ }
107
+
108
+ // ── gRPC Interfaces (generated *Server interfaces) ──
109
+ for (const proto of astSummary.protocols || []) {
110
+ if (/Server$/.test(proto.name) && !proto.name.startsWith('Unimplemented')) {
111
+ patterns.push({
112
+ type: 'go-grpc-service-interface',
113
+ className: proto.name,
114
+ methods: proto.methods,
115
+ line: proto.line,
116
+ confidence: 0.8,
117
+ });
118
+ }
119
+ }
120
+
121
+ // ── Interceptor functions ──
122
+ for (const m of astSummary.methods || []) {
123
+ if (!m.className && m.isExported) {
124
+ const nameLower = m.name.toLowerCase();
125
+ if (nameLower.includes('interceptor') || nameLower.includes('middleware')) {
126
+ patterns.push({
127
+ type: 'go-grpc-interceptor',
128
+ methodName: m.name,
129
+ line: m.line,
130
+ confidence: 0.8,
131
+ });
132
+ }
133
+ }
134
+ }
135
+
136
+ // ── Protobuf imports ──
137
+ const pbImports = (astSummary.imports || []).filter(
138
+ (imp) => imp.includes('/pb') || imp.includes('/proto') || imp.includes('google.golang.org/grpc')
139
+ );
140
+ if (pbImports.length > 0) {
141
+ patterns.push({
142
+ type: 'go-grpc-proto-usage',
143
+ importCount: pbImports.length,
144
+ confidence: 0.85,
145
+ });
146
+ }
147
+
148
+ return patterns;
149
+ }
150
+ }
151
+
152
+ export const pack = new GoGrpcEnhancement();
@@ -0,0 +1,201 @@
1
+ /**
2
+ * Go Web Enhancement Pack
3
+ * 条件: { languages: ['go'], frameworks: ['gin', 'echo', 'fiber', 'chi', 'gorilla', 'beego'] }
4
+ *
5
+ * 覆盖所有主流 Go HTTP 框架:
6
+ * - Gin, Echo, Fiber, Chi, Gorilla Mux, Beego
7
+ */
8
+
9
+ import { EnhancementPack } from './EnhancementPack.js';
10
+
11
+ class GoWebEnhancement extends EnhancementPack {
12
+ get id() {
13
+ return 'go-web';
14
+ }
15
+ get displayName() {
16
+ return 'Go Web (Gin/Echo/Fiber/Chi) Enhancement';
17
+ }
18
+ get conditions() {
19
+ return {
20
+ languages: ['go'],
21
+ frameworks: ['gin', 'echo', 'fiber', 'chi', 'gorilla', 'beego'],
22
+ };
23
+ }
24
+
25
+ getExtraDimensions() {
26
+ return [
27
+ {
28
+ id: 'go-handler-scan',
29
+ label: 'HTTP Handler 分析',
30
+ guide:
31
+ 'Go HTTP Handler 与 Middleware 链路分析 — handler 签名规范、中间件注册顺序、Context 传播、错误级联',
32
+ knowledgeTypes: ['architecture', 'code-pattern'],
33
+ skillWorthy: true,
34
+ dualOutput: true,
35
+ skillMeta: {
36
+ name: 'project-go-handlers',
37
+ description:
38
+ 'Go HTTP handler patterns, middleware chains and context propagation (auto-generated by enhancement)',
39
+ },
40
+ },
41
+ {
42
+ id: 'go-route-scan',
43
+ label: 'API Route 结构',
44
+ guide:
45
+ 'Go 路由结构分析 — 路由分组 (Group)、URI 命名规范、HTTP 方法分布、路由参数与通配符',
46
+ knowledgeTypes: ['architecture'],
47
+ skillWorthy: true,
48
+ dualOutput: true,
49
+ skillMeta: {
50
+ name: 'project-go-routes',
51
+ description:
52
+ 'Go API route structure, grouping and URI naming conventions (auto-generated by enhancement)',
53
+ },
54
+ },
55
+ ];
56
+ }
57
+
58
+ getGuardRules() {
59
+ return [
60
+ {
61
+ ruleId: 'go-handler-abort-return',
62
+ severity: 'warning',
63
+ languages: ['go'],
64
+ pattern: /\.Abort\w*\([^)]*\)[^}]*\n\s*[^}\s/]/,
65
+ message: 'Abort/AbortWithStatus 后应立即 return,否则后续逻辑仍会执行',
66
+ },
67
+ {
68
+ ruleId: 'go-no-naked-goroutine',
69
+ severity: 'warning',
70
+ languages: ['go'],
71
+ pattern: /go\s+func\s*\(/,
72
+ message:
73
+ 'HTTP handler 中启动 goroutine 应包含 recover() 防止 panic 导致整个进程崩溃',
74
+ },
75
+ {
76
+ ruleId: 'go-context-first-param',
77
+ severity: 'info',
78
+ languages: ['go'],
79
+ pattern:
80
+ /func\s+\w+\([^)]*\)\s*\([^)]*context\.Context/,
81
+ message: 'context.Context 应作为函数的第一个参数,而非放在返回值或中间位置',
82
+ },
83
+ ];
84
+ }
85
+
86
+ detectPatterns(astSummary) {
87
+ const patterns = [];
88
+
89
+ // ── Struct-based Handler / Controller ──
90
+ for (const cls of astSummary.classes || []) {
91
+ if (cls.kind !== 'struct') {
92
+ continue;
93
+ }
94
+ const nameLower = cls.name.toLowerCase();
95
+ if (
96
+ nameLower.includes('handler') ||
97
+ nameLower.includes('controller') ||
98
+ nameLower.includes('server') ||
99
+ nameLower.includes('api')
100
+ ) {
101
+ patterns.push({
102
+ type: 'go-handler-struct',
103
+ className: cls.name,
104
+ line: cls.line,
105
+ confidence: 0.8,
106
+ });
107
+ }
108
+ }
109
+
110
+ // ── HTTP Handler Interfaces ──
111
+ for (const proto of astSummary.protocols || []) {
112
+ if (proto.methods?.includes('ServeHTTP')) {
113
+ patterns.push({
114
+ type: 'go-http-handler-interface',
115
+ className: proto.name,
116
+ line: proto.line,
117
+ confidence: 0.95,
118
+ });
119
+ }
120
+ }
121
+
122
+ // ── Handler / Middleware methods ──
123
+ for (const m of astSummary.methods || []) {
124
+ // Exported methods on structs — likely handlers
125
+ if (m.className && m.isExported && !m.isClassMethod) {
126
+ const nameLower = m.name.toLowerCase();
127
+ if (
128
+ nameLower.startsWith('get') ||
129
+ nameLower.startsWith('post') ||
130
+ nameLower.startsWith('put') ||
131
+ nameLower.startsWith('delete') ||
132
+ nameLower.startsWith('patch') ||
133
+ nameLower.startsWith('handle') ||
134
+ nameLower.startsWith('list') ||
135
+ nameLower.startsWith('create') ||
136
+ nameLower.startsWith('update') ||
137
+ nameLower.startsWith('remove')
138
+ ) {
139
+ patterns.push({
140
+ type: 'go-handler-method',
141
+ className: m.className,
142
+ methodName: m.name,
143
+ line: m.line,
144
+ confidence: 0.7,
145
+ });
146
+ }
147
+ }
148
+ // Middleware pattern: package-level function returning HandlerFunc-like
149
+ if (!m.className && m.isClassMethod && m.isExported) {
150
+ const nameLower = m.name.toLowerCase();
151
+ if (
152
+ nameLower.includes('middleware') ||
153
+ nameLower.includes('logger') ||
154
+ nameLower.includes('recovery') ||
155
+ nameLower.includes('cors') ||
156
+ nameLower.includes('auth') ||
157
+ nameLower.includes('ratelimit') ||
158
+ nameLower.includes('timeout')
159
+ ) {
160
+ patterns.push({
161
+ type: 'go-middleware',
162
+ methodName: m.name,
163
+ line: m.line,
164
+ confidence: 0.75,
165
+ });
166
+ }
167
+ }
168
+ }
169
+
170
+ // ── Engine / Router struct (framework core) ──
171
+ for (const cls of astSummary.classes || []) {
172
+ if (cls.kind !== 'struct') {
173
+ continue;
174
+ }
175
+ if (/^(?:Engine|Router|App|Server|Mux|Group)$/.test(cls.name)) {
176
+ patterns.push({
177
+ type: 'go-router-core',
178
+ className: cls.name,
179
+ line: cls.line,
180
+ confidence: 0.85,
181
+ });
182
+ }
183
+ }
184
+
185
+ // ── Concurrency in web context ──
186
+ // goroutine + channel patterns from lang-go.js
187
+ for (const p of astSummary.patterns || []) {
188
+ if (p.type === 'goroutine' && p.count > 0) {
189
+ patterns.push({
190
+ type: 'go-web-concurrency',
191
+ goroutineCount: p.count,
192
+ confidence: 0.7,
193
+ });
194
+ }
195
+ }
196
+
197
+ return patterns;
198
+ }
199
+ }
200
+
201
+ export const pack = new GoWebEnhancement();
@@ -0,0 +1,65 @@
1
+ /**
2
+ * @module enhancement/index
3
+ * @description Enhancement Pack 自动加载器与 Registry 初始化
4
+ *
5
+ * 使用方式:
6
+ * import { getEnhancementRegistry } from '../core/enhancement/index.js';
7
+ * const registry = getEnhancementRegistry();
8
+ * const packs = registry.resolve(primaryLang, detectedFrameworks);
9
+ */
10
+
11
+ import { EnhancementRegistry } from './EnhancementRegistry.js';
12
+
13
+ let _instance = null;
14
+
15
+ /**
16
+ * 获取全局 EnhancementRegistry 单例
17
+ * 注意: 首次访问前必须调用 initEnhancementRegistry() 完成异步加载
18
+ * 如果未初始化, 返回空 Registry(不会抛错, 但 resolve() 结果为空)
19
+ * @returns {EnhancementRegistry}
20
+ */
21
+ export function getEnhancementRegistry() {
22
+ if (_instance) {
23
+ return _instance;
24
+ }
25
+ _instance = new EnhancementRegistry();
26
+ // 同步路径无法加载 ESM 动态 import — 返回空 Registry
27
+ // 使用方应确保先调用 initEnhancementRegistry()
28
+ return _instance;
29
+ }
30
+
31
+ /**
32
+ * 异步初始化 — 加载所有增强包
33
+ * 需要在使用 resolve() 之前调用
34
+ */
35
+ export async function initEnhancementRegistry() {
36
+ if (_instance && _instance.all().length > 0) {
37
+ return _instance;
38
+ }
39
+ _instance = new EnhancementRegistry();
40
+
41
+ const packImports = [
42
+ import('./react-enhancement.js'),
43
+ import('./vue-enhancement.js'),
44
+ import('./node-server-enhancement.js'),
45
+ import('./django-enhancement.js'),
46
+ import('./fastapi-enhancement.js'),
47
+ import('./spring-enhancement.js'),
48
+ import('./android-enhancement.js'),
49
+ import('./go-web-enhancement.js'),
50
+ import('./go-grpc-enhancement.js'),
51
+ ];
52
+
53
+ const results = await Promise.allSettled(packImports);
54
+ for (const result of results) {
55
+ if (result.status === 'fulfilled' && result.value.pack) {
56
+ _instance.register(result.value.pack);
57
+ }
58
+ }
59
+
60
+ return _instance;
61
+ }
62
+
63
+ // Re-exports
64
+ export { EnhancementPack } from './EnhancementPack.js';
65
+ export { EnhancementRegistry } from './EnhancementRegistry.js';
@@ -0,0 +1,88 @@
1
+ /**
2
+ * Node.js Server Enhancement Pack
3
+ * 条件: { languages: ['typescript', 'javascript'], frameworks: ['node-server', 'nestjs'] }
4
+ */
5
+
6
+ import { EnhancementPack } from './EnhancementPack.js';
7
+
8
+ class NodeServerEnhancement extends EnhancementPack {
9
+ get id() {
10
+ return 'node-server';
11
+ }
12
+ get displayName() {
13
+ return 'Node.js Server (Express/NestJS) Enhancement';
14
+ }
15
+ get conditions() {
16
+ return { languages: ['typescript', 'javascript'], frameworks: ['node-server', 'nestjs'] };
17
+ }
18
+
19
+ getExtraDimensions() {
20
+ return [
21
+ {
22
+ id: 'middleware-analysis',
23
+ label: '中间件链分析',
24
+ guide: 'Middleware 链路分析、错误处理中间件、路由守卫、认证/鉴权中间件',
25
+ knowledgeTypes: ['architecture', 'code-pattern'],
26
+ skillWorthy: true,
27
+ dualOutput: true,
28
+ skillMeta: {
29
+ name: 'project-node-middleware',
30
+ description:
31
+ 'Node.js middleware chain and error handling patterns (auto-generated by enhancement)',
32
+ },
33
+ },
34
+ ];
35
+ }
36
+
37
+ getGuardRules() {
38
+ return [
39
+ {
40
+ ruleId: 'node-no-sync-io',
41
+ severity: 'warning',
42
+ languages: ['typescript', 'javascript'],
43
+ pattern:
44
+ /(?:readFileSync|writeFileSync|appendFileSync|mkdirSync|readdirSync|statSync|existsSync|unlinkSync|renameSync|copyFileSync|accessSync)/,
45
+ message: '避免在请求路径中使用同步 IO 操作',
46
+ },
47
+ {
48
+ ruleId: 'node-error-handler',
49
+ severity: 'info',
50
+ languages: ['typescript', 'javascript'],
51
+ pattern: /app\.use\(\s*\(\s*err\s*,\s*req\s*,\s*res\s*,\s*next\s*\)/,
52
+ message: 'Express 应用需要注册 4 参数错误处理中间件',
53
+ },
54
+ ];
55
+ }
56
+
57
+ detectPatterns(astSummary) {
58
+ const patterns = [];
59
+ for (const m of astSummary.methods || []) {
60
+ // Middleware: (req, res, next) => 签名
61
+ if (!m.className && m.paramCount === 3) {
62
+ patterns.push({ type: 'middleware', methodName: m.name, line: m.line, confidence: 0.6 });
63
+ }
64
+ }
65
+ // NestJS decorators
66
+ for (const cls of astSummary.classes || []) {
67
+ if (cls.decorators?.some((d) => /@Controller/.test(d))) {
68
+ patterns.push({
69
+ type: 'nestjs-controller',
70
+ className: cls.name,
71
+ line: cls.line,
72
+ confidence: 0.95,
73
+ });
74
+ }
75
+ if (cls.decorators?.some((d) => /@Injectable/.test(d))) {
76
+ patterns.push({
77
+ type: 'nestjs-injectable',
78
+ className: cls.name,
79
+ line: cls.line,
80
+ confidence: 0.95,
81
+ });
82
+ }
83
+ }
84
+ return patterns;
85
+ }
86
+ }
87
+
88
+ export const pack = new NodeServerEnhancement();
@@ -0,0 +1,86 @@
1
+ /**
2
+ * React Enhancement Pack
3
+ * 条件: { languages: ['typescript', 'javascript'], frameworks: ['react', 'nextjs'] }
4
+ */
5
+
6
+ import { EnhancementPack } from './EnhancementPack.js';
7
+
8
+ class ReactEnhancement extends EnhancementPack {
9
+ get id() {
10
+ return 'react';
11
+ }
12
+ get displayName() {
13
+ return 'React / Next.js Enhancement';
14
+ }
15
+ get conditions() {
16
+ return { languages: ['typescript', 'javascript'], frameworks: ['react', 'nextjs'] };
17
+ }
18
+
19
+ getExtraDimensions() {
20
+ return [
21
+ {
22
+ id: 'hook-pattern-scan',
23
+ label: '自定義 Hook 分析',
24
+ guide:
25
+ '自定义 Hook 提取(useXxx 函数 + 内部状态/副作用分析)、Hook 组合模式、Hook 依赖关系',
26
+ knowledgeTypes: ['code-pattern'],
27
+ skillWorthy: true,
28
+ dualOutput: true,
29
+ skillMeta: {
30
+ name: 'project-react-hooks',
31
+ description: 'Custom React Hook patterns and composition (auto-generated by enhancement)',
32
+ },
33
+ },
34
+ {
35
+ id: 'component-structure-scan',
36
+ label: '组件结构约定',
37
+ guide: '组件目录结构约定(文件组织、barrel export、props/state 命名规范)',
38
+ knowledgeTypes: ['code-standard', 'architecture'],
39
+ skillWorthy: true,
40
+ dualOutput: true,
41
+ skillMeta: {
42
+ name: 'project-react-components',
43
+ description: 'React component structure conventions (auto-generated by enhancement)',
44
+ },
45
+ },
46
+ ];
47
+ }
48
+
49
+ getGuardRules() {
50
+ return [
51
+ {
52
+ ruleId: 'react-no-direct-dom',
53
+ severity: 'warning',
54
+ languages: ['typescript', 'javascript'],
55
+ pattern: /document\.(getElementById|querySelector|getElementsBy)/,
56
+ message: '避免直接 DOM 操作,使用 React ref 或状态管理',
57
+ },
58
+ {
59
+ ruleId: 'react-no-index-key',
60
+ severity: 'warning',
61
+ languages: ['typescript', 'javascript'],
62
+ pattern:
63
+ /\.map\s*\([^)]*,\s*(?:index|i|idx)\s*\)\s*=>\s*[\s\S]*?key\s*=\s*\{?\s*(?:index|i|idx)/,
64
+ message: '避免使用 index 作为 key,使用稳定的唯一标识符',
65
+ },
66
+ ];
67
+ }
68
+
69
+ detectPatterns(astSummary) {
70
+ const patterns = [];
71
+ for (const m of astSummary.methods || []) {
72
+ if (m.name && /^use[A-Z]/.test(m.name) && !m.className) {
73
+ patterns.push({ type: 'custom-hook', methodName: m.name, line: m.line, confidence: 0.9 });
74
+ }
75
+ }
76
+ // HOC: function withXxx(Component)
77
+ for (const m of astSummary.methods || []) {
78
+ if (m.name && /^with[A-Z]/.test(m.name) && !m.className) {
79
+ patterns.push({ type: 'hoc', methodName: m.name, line: m.line, confidence: 0.8 });
80
+ }
81
+ }
82
+ return patterns;
83
+ }
84
+ }
85
+
86
+ export const pack = new ReactEnhancement();