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,112 @@
1
+ /**
2
+ * Spring Enhancement Pack
3
+ * 条件: { languages: ['java', 'kotlin'], frameworks: ['spring'] }
4
+ */
5
+
6
+ import { EnhancementPack } from './EnhancementPack.js';
7
+
8
+ class SpringEnhancement extends EnhancementPack {
9
+ get id() {
10
+ return 'spring';
11
+ }
12
+ get displayName() {
13
+ return 'Spring Boot Enhancement';
14
+ }
15
+ get conditions() {
16
+ return { languages: ['java', 'kotlin'], frameworks: ['spring'] };
17
+ }
18
+
19
+ getExtraDimensions() {
20
+ return [
21
+ {
22
+ id: 'spring-di-scan',
23
+ label: 'Spring DI 分析',
24
+ guide:
25
+ 'DI 容器依赖注入拓扑分析、@Component/@Service/@Repository 分层、@Configuration + @Bean 工厂',
26
+ knowledgeTypes: ['architecture', 'code-pattern'],
27
+ skillWorthy: true,
28
+ dualOutput: true,
29
+ skillMeta: {
30
+ name: 'project-spring-di',
31
+ description:
32
+ 'Spring dependency injection topology and bean configuration (auto-generated by enhancement)',
33
+ },
34
+ },
35
+ {
36
+ id: 'spring-api-scan',
37
+ label: 'REST API 分析',
38
+ guide: '@RestController + @RequestMapping endpoint 清单、请求/响应 DTO、异常处理策略',
39
+ knowledgeTypes: ['architecture'],
40
+ skillWorthy: true,
41
+ dualOutput: true,
42
+ skillMeta: {
43
+ name: 'project-spring-api',
44
+ description:
45
+ 'Spring REST API endpoints, DTOs and error handling (auto-generated by enhancement)',
46
+ },
47
+ },
48
+ ];
49
+ }
50
+
51
+ getGuardRules() {
52
+ return [
53
+ {
54
+ ruleId: 'spring-field-injection',
55
+ severity: 'warning',
56
+ languages: ['java', 'kotlin'],
57
+ pattern: /@Autowired\s+(?:private|protected)\s/,
58
+ message: '建议使用构造函数注入替代字段注入(@Autowired on field)',
59
+ },
60
+ ];
61
+ }
62
+
63
+ detectPatterns(astSummary) {
64
+ const patterns = [];
65
+ for (const cls of astSummary.classes || []) {
66
+ const annos = cls.annotations || [];
67
+ if (annos.some((a) => /@RestController/.test(a))) {
68
+ patterns.push({
69
+ type: 'spring-rest-controller',
70
+ className: cls.name,
71
+ line: cls.line,
72
+ confidence: 0.95,
73
+ });
74
+ }
75
+ if (annos.some((a) => /@Service/.test(a))) {
76
+ patterns.push({
77
+ type: 'spring-service',
78
+ className: cls.name,
79
+ line: cls.line,
80
+ confidence: 0.95,
81
+ });
82
+ }
83
+ if (annos.some((a) => /@Repository/.test(a))) {
84
+ patterns.push({
85
+ type: 'spring-repository',
86
+ className: cls.name,
87
+ line: cls.line,
88
+ confidence: 0.95,
89
+ });
90
+ }
91
+ if (annos.some((a) => /@Entity/.test(a))) {
92
+ patterns.push({
93
+ type: 'jpa-entity',
94
+ className: cls.name,
95
+ line: cls.line,
96
+ confidence: 0.95,
97
+ });
98
+ }
99
+ if (annos.some((a) => /@Configuration/.test(a))) {
100
+ patterns.push({
101
+ type: 'spring-configuration',
102
+ className: cls.name,
103
+ line: cls.line,
104
+ confidence: 0.95,
105
+ });
106
+ }
107
+ }
108
+ return patterns;
109
+ }
110
+ }
111
+
112
+ export const pack = new SpringEnhancement();
@@ -0,0 +1,96 @@
1
+ /**
2
+ * Vue Enhancement Pack
3
+ * 条件: { languages: ['typescript', 'javascript'], frameworks: ['vue', 'nuxt'] }
4
+ */
5
+
6
+ import { EnhancementPack } from './EnhancementPack.js';
7
+
8
+ class VueEnhancement extends EnhancementPack {
9
+ get id() {
10
+ return 'vue';
11
+ }
12
+ get displayName() {
13
+ return 'Vue / Nuxt Enhancement';
14
+ }
15
+ get conditions() {
16
+ return { languages: ['typescript', 'javascript'], frameworks: ['vue', 'nuxt'] };
17
+ }
18
+
19
+ getExtraDimensions() {
20
+ return [
21
+ {
22
+ id: 'composable-scan',
23
+ label: 'Composable 函数分析',
24
+ guide: 'Composable 函数(useXxx)+ 内部 ref/computed/watch 调用、provide/inject 模式',
25
+ knowledgeTypes: ['code-pattern'],
26
+ skillWorthy: true,
27
+ dualOutput: true,
28
+ skillMeta: {
29
+ name: 'project-vue-composables',
30
+ description:
31
+ 'Vue Composable patterns and composition API usage (auto-generated by enhancement)',
32
+ },
33
+ },
34
+ ];
35
+ }
36
+
37
+ getGuardRules() {
38
+ return [
39
+ {
40
+ ruleId: 'vue-no-v-html',
41
+ severity: 'warning',
42
+ languages: ['typescript', 'javascript'],
43
+ pattern: /v-html/,
44
+ message: '避免使用 v-html,存在 XSS 风险',
45
+ },
46
+ {
47
+ ruleId: 'vue-composable-naming',
48
+ severity: 'info',
49
+ languages: ['typescript', 'javascript'],
50
+ pattern: /export\s+function\s+(?!use)[a-z]/,
51
+ message: 'Composable 函数建议以 use 前缀命名',
52
+ },
53
+ ];
54
+ }
55
+
56
+ /**
57
+ * .vue SFC 预处理 → 提取 <script> / <script setup> 块
58
+ */
59
+ preprocessFile(content, ext) {
60
+ if (ext !== '.vue') {
61
+ return null;
62
+ }
63
+ // 优先提取 <script setup>
64
+ const setupMatch = content.match(
65
+ /<script\s+setup(?:\s+lang="(ts|typescript)")?\s*>([\s\S]*?)<\/script>/i
66
+ );
67
+ if (setupMatch) {
68
+ return { content: setupMatch[2], lang: setupMatch[1] ? 'typescript' : 'javascript' };
69
+ }
70
+ // 退 fallback 到普通 <script>
71
+ const scriptMatch = content.match(
72
+ /<script(?:\s+lang="(ts|typescript)")?\s*>([\s\S]*?)<\/script>/i
73
+ );
74
+ if (scriptMatch) {
75
+ return { content: scriptMatch[2], lang: scriptMatch[1] ? 'typescript' : 'javascript' };
76
+ }
77
+ return null;
78
+ }
79
+
80
+ detectPatterns(astSummary) {
81
+ const patterns = [];
82
+ for (const m of astSummary.methods || []) {
83
+ if (m.name && /^use[A-Z]/.test(m.name) && !m.className) {
84
+ patterns.push({
85
+ type: 'vue-composable',
86
+ methodName: m.name,
87
+ line: m.line,
88
+ confidence: 0.9,
89
+ });
90
+ }
91
+ }
92
+ return patterns;
93
+ }
94
+ }
95
+
96
+ export const pack = new VueEnhancement();
@@ -1,4 +1,4 @@
1
- import EventEmitter from 'events';
1
+ import EventEmitter from 'node:events';
2
2
  import { v4 as uuidv4 } from 'uuid';
3
3
  import Logger from '../../infrastructure/logging/Logger.js';
4
4
  import { InternalError } from '../../shared/errors/BaseError.js';
@@ -28,12 +28,7 @@ export class Gateway extends EventEmitter {
28
28
  /**
29
29
  * 设置依赖
30
30
  */
31
- setDependencies({
32
- constitution,
33
- constitutionValidator,
34
- permissionManager,
35
- auditLogger,
36
- }) {
31
+ setDependencies({ constitution, constitutionValidator, permissionManager, auditLogger }) {
37
32
  this.constitution = constitution;
38
33
  this.constitutionValidator = constitutionValidator;
39
34
  this.permissionManager = permissionManager;
@@ -218,7 +213,9 @@ export class Gateway extends EventEmitter {
218
213
  * audit — 记录成功
219
214
  */
220
215
  async auditSuccess(context, result) {
221
- if (!this.auditLogger) return;
216
+ if (!this.auditLogger) {
217
+ return;
218
+ }
222
219
 
223
220
  const entry = {
224
221
  requestId: context.requestId,
@@ -242,7 +239,9 @@ export class Gateway extends EventEmitter {
242
239
  * audit — 记录失败
243
240
  */
244
241
  async auditFailure(context, error) {
245
- if (!this.auditLogger) return;
242
+ if (!this.auditLogger) {
243
+ return;
244
+ }
246
245
 
247
246
  const entry = {
248
247
  requestId: context.requestId,
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * GatewayActionRegistry - 将所有服务操作注册为 Gateway 路由
3
- *
3
+ *
4
4
  * 这是连接 Gateway ↔ Service 的桥梁:
5
5
  * - 路由层格式化 Gateway 请求 {actor, action, resource, data}
6
6
  * - Gateway 执行权限/宪法/审计
@@ -1,5 +1,5 @@
1
- import { PermissionDenied } from '../../shared/errors/BaseError.js';
2
1
  import Logger from '../../infrastructure/logging/Logger.js';
2
+ import { PermissionDenied } from '../../shared/errors/BaseError.js';
3
3
 
4
4
  /**
5
5
  * PermissionManager - 权限管理器
@@ -43,10 +43,10 @@ export class PermissionManager {
43
43
  const normalizedAction = action.includes(':') ? action : this._normalizeAction(action);
44
44
 
45
45
  // 4. 检查精确匹配:action:resource
46
- const requiredPermission = normalizedAction.includes(':')
47
- ? normalizedAction
46
+ const requiredPermission = normalizedAction.includes(':')
47
+ ? normalizedAction
48
48
  : `${normalizedAction}:${resourceType}`;
49
-
49
+
50
50
  if (permissions.includes(requiredPermission)) {
51
51
  return {
52
52
  allowed: true,
@@ -140,7 +140,7 @@ export class PermissionManager {
140
140
  // 尝试找到 action 部分(常见的 action 包括 read, create, delete, submit, approve, reject)
141
141
  const commonActions = ['read', 'create', 'delete', 'submit', 'approve', 'reject', 'write'];
142
142
  const actionIndex = parts.findIndex((p, i) => i > 1 && commonActions.includes(p));
143
-
143
+
144
144
  if (actionIndex !== -1) {
145
145
  // 提取从 action 开始的部分,用冒号连接
146
146
  const actionParts = parts.slice(actionIndex);
@@ -151,7 +151,7 @@ export class PermissionManager {
151
151
 
152
152
  // 仅将第一个下划线替换为冒号
153
153
  // read_recipes -> read:recipes
154
- // create_candidate -> create:candidate
154
+ // create_candidate -> create:candidate
155
155
  return action.replace('_', ':');
156
156
  }
157
157
 
@@ -180,9 +180,13 @@ export class PermissionManager {
180
180
  if (typeof resource === 'string') {
181
181
  // 处理路径: /recipes/123 → recipes
182
182
  const match = resource.match(/^\/([^/]+)/);
183
- if (match) return match[1];
183
+ if (match) {
184
+ return match[1];
185
+ }
184
186
  // 处理纯字符串资源名:candidates, guard_rules 等
185
- if (resource && !resource.includes('/')) return resource;
187
+ if (resource && !resource.includes('/')) {
188
+ return resource;
189
+ }
186
190
  return 'unknown';
187
191
  }
188
192
 
@@ -5,21 +5,25 @@
5
5
 
6
6
  // Knowledge 统一知识实体 (V3)
7
7
  export {
8
- KnowledgeEntry,
9
- Lifecycle,
10
- isValidTransition,
11
- isValidLifecycle,
12
- isCandidate as isLifecycleCandidate,
13
8
  CANDIDATE_STATES,
14
9
  inferKind as inferKindV3,
10
+ isCandidate as isLifecycleCandidate,
11
+ isValidLifecycle,
12
+ isValidTransition,
13
+ KnowledgeEntry,
14
+ Lifecycle,
15
15
  } from './knowledge/index.js';
16
- export { Content } from './knowledge/values/Content.js';
17
- export { Relations, RELATION_BUCKETS, RELATION_BUCKETS as RelationType } from './knowledge/values/Relations.js';
16
+ export { KnowledgeRepository } from './knowledge/KnowledgeRepository.js';
18
17
  export { Constraints } from './knowledge/values/Constraints.js';
19
- export { Reasoning as ReasoningV3 } from './knowledge/values/Reasoning.js';
18
+ export { Content } from './knowledge/values/Content.js';
20
19
  export { Quality } from './knowledge/values/Quality.js';
20
+ export { Reasoning as ReasoningV3 } from './knowledge/values/Reasoning.js';
21
+ export {
22
+ RELATION_BUCKETS,
23
+ RELATION_BUCKETS as RelationType,
24
+ Relations,
25
+ } from './knowledge/values/Relations.js';
21
26
  export { Stats } from './knowledge/values/Stats.js';
22
- export { KnowledgeRepository } from './knowledge/KnowledgeRepository.js';
23
27
 
24
28
  // Snippet 相关
25
29
  export { Snippet } from './snippet/Snippet.js';
@@ -1,6 +1,12 @@
1
1
  import { v4 as uuidv4 } from 'uuid';
2
- import { Lifecycle, isValidTransition, isCandidate as isLifecycleCandidate, inferKind, normalizeLifecycle } from './Lifecycle.js';
3
- import { Content, Relations, Constraints, Reasoning, Quality, Stats } from './values/index.js';
2
+ import {
3
+ inferKind,
4
+ isCandidate as isLifecycleCandidate,
5
+ isValidTransition,
6
+ Lifecycle,
7
+ normalizeLifecycle,
8
+ } from './Lifecycle.js';
9
+ import { Constraints, Content, Quality, Reasoning, Relations, Stats } from './values/index.js';
4
10
 
5
11
  /* ═══════════════════════════════════════════════════════════
6
12
  * KnowledgeEntry — 统一知识实体
@@ -17,65 +23,65 @@ export class KnowledgeEntry {
17
23
  */
18
24
  constructor(props = {}) {
19
25
  // ── 标识 ──
20
- this.id = props.id || uuidv4();
21
- this.title = props.title || '';
26
+ this.id = props.id || uuidv4();
27
+ this.title = props.title || '';
22
28
  this.description = props.description || '';
23
29
 
24
30
  // ── 生命周期 ──
25
- this.lifecycle = normalizeLifecycle(props.lifecycle || Lifecycle.PENDING);
26
- this.lifecycleHistory = props.lifecycleHistory || [];
27
- this.autoApprovable = props.autoApprovable ?? false;
31
+ this.lifecycle = normalizeLifecycle(props.lifecycle || Lifecycle.PENDING);
32
+ this.lifecycleHistory = props.lifecycleHistory || [];
33
+ this.autoApprovable = props.autoApprovable ?? false;
28
34
 
29
35
  // ── 语言与分类 ──
30
- this.language = props.language || '';
31
- this.category = props.category || '';
32
- this.knowledgeType = props.knowledgeType || 'code-pattern';
33
- this.kind = props.kind || inferKind(this.knowledgeType);
34
- this.complexity = props.complexity || 'intermediate';
35
- this.scope = props.scope || 'universal';
36
- this.difficulty = props.difficulty || null;
37
- this.tags = props.tags || [];
36
+ this.language = props.language || '';
37
+ this.category = props.category || '';
38
+ this.knowledgeType = props.knowledgeType || 'code-pattern';
39
+ this.kind = props.kind || inferKind(this.knowledgeType);
40
+ this.complexity = props.complexity || 'intermediate';
41
+ this.scope = props.scope || 'universal';
42
+ this.difficulty = props.difficulty || null;
43
+ this.tags = props.tags || [];
38
44
 
39
45
  // ── Cursor 交付字段(AI 直接产出)──
40
- this.trigger = props.trigger || '';
41
- this.topicHint = props.topicHint || '';
42
- this.whenClause = props.whenClause || '';
43
- this.doClause = props.doClause || '';
44
- this.dontClause = props.dontClause || '';
45
- this.coreCode = props.coreCode || '';
46
+ this.trigger = props.trigger || '';
47
+ this.topicHint = props.topicHint || '';
48
+ this.whenClause = props.whenClause || '';
49
+ this.doClause = props.doClause || '';
50
+ this.dontClause = props.dontClause || '';
51
+ this.coreCode = props.coreCode || '';
46
52
 
47
53
  // ── 值对象 ──
48
- this.content = Content.from(props.content);
49
- this.relations = Relations.from(props.relations);
54
+ this.content = Content.from(props.content);
55
+ this.relations = Relations.from(props.relations);
50
56
  this.constraints = Constraints.from(props.constraints);
51
- this.reasoning = Reasoning.from(props.reasoning);
52
- this.quality = Quality.from(props.quality);
53
- this.stats = Stats.from(props.stats);
57
+ this.reasoning = Reasoning.from(props.reasoning);
58
+ this.quality = Quality.from(props.quality);
59
+ this.stats = Stats.from(props.stats);
54
60
 
55
61
  // ── 代码头文件 (ObjC/Swift) ──
56
- this.headers = props.headers || [];
57
- this.headerPaths = props.headerPaths || [];
58
- this.moduleName = props.moduleName || '';
62
+ this.headers = props.headers || [];
63
+ this.headerPaths = props.headerPaths || [];
64
+ this.moduleName = props.moduleName || '';
59
65
  this.includeHeaders = props.includeHeaders ?? false;
60
66
 
61
67
  // ── AI 润色 ──
62
68
  this.agentNotes = props.agentNotes || null;
63
- this.aiInsight = props.aiInsight || null;
69
+ this.aiInsight = props.aiInsight || null;
64
70
 
65
71
  // ── 审核 ──
66
- this.reviewedBy = props.reviewedBy || null;
67
- this.reviewedAt = props.reviewedAt || null;
68
- this.rejectionReason = props.rejectionReason || null;
72
+ this.reviewedBy = props.reviewedBy || null;
73
+ this.reviewedAt = props.reviewedAt || null;
74
+ this.rejectionReason = props.rejectionReason || null;
69
75
 
70
76
  // ── 来源 ──
71
- this.source = props.source || 'manual';
72
- this.sourceFile = props.sourceFile || null;
77
+ this.source = props.source || 'manual';
78
+ this.sourceFile = props.sourceFile || null;
73
79
  this.sourceCandidateId = props.sourceCandidateId || null;
74
80
 
75
81
  // ── 时间 ──
76
- this.createdBy = props.createdBy || 'system';
77
- this.createdAt = props.createdAt || Math.floor(Date.now() / 1000);
78
- this.updatedAt = props.updatedAt || Math.floor(Date.now() / 1000);
82
+ this.createdBy = props.createdBy || 'system';
83
+ this.createdAt = props.createdAt || Math.floor(Date.now() / 1000);
84
+ this.updatedAt = props.updatedAt || Math.floor(Date.now() / 1000);
79
85
  this.publishedAt = props.publishedAt || null;
80
86
  this.publishedBy = props.publishedBy || null;
81
87
  }
@@ -165,29 +171,31 @@ export class KnowledgeEntry {
165
171
  * @returns {Array<Object>}
166
172
  */
167
173
  getGuardRules() {
168
- if (!this.isActive() || !this.isRule()) return [];
169
-
170
- const regexRules = this.constraints.getRegexGuards().map(g => ({
171
- id: g.id || this.id,
172
- type: 'regex',
173
- name: g.message || this.title,
174
- message: g.message || this.description || this.title,
175
- pattern: g.pattern,
176
- languages: this.language ? [this.language] : [],
177
- severity: g.severity || 'warning',
178
- source: 'knowledge_entry',
174
+ if (!this.isActive() || !this.isRule()) {
175
+ return [];
176
+ }
177
+
178
+ const regexRules = this.constraints.getRegexGuards().map((g) => ({
179
+ id: g.id || this.id,
180
+ type: 'regex',
181
+ name: g.message || this.title,
182
+ message: g.message || this.description || this.title,
183
+ pattern: g.pattern,
184
+ languages: this.language ? [this.language] : [],
185
+ severity: g.severity || 'warning',
186
+ source: 'knowledge_entry',
179
187
  fixSuggestion: g.fix_suggestion || null,
180
188
  }));
181
189
 
182
- const astRules = this.constraints.getAstGuards().map(g => ({
183
- id: g.id || `${this.id}:ast`,
184
- type: 'ast',
185
- name: g.message || this.title,
186
- message: g.message,
187
- astQuery: g.ast_query,
188
- languages: g.ast_query?.language ? [g.ast_query.language] : [],
189
- severity: g.severity || 'warning',
190
- source: 'knowledge_entry',
190
+ const astRules = this.constraints.getAstGuards().map((g) => ({
191
+ id: g.id || `${this.id}:ast`,
192
+ type: 'ast',
193
+ name: g.message || this.title,
194
+ message: g.message,
195
+ astQuery: g.ast_query,
196
+ languages: g.ast_query?.language ? [g.ast_query.language] : [],
197
+ severity: g.severity || 'warning',
198
+ source: 'knowledge_entry',
191
199
  fixSuggestion: g.fix_suggestion || null,
192
200
  }));
193
201
 
@@ -201,49 +209,49 @@ export class KnowledgeEntry {
201
209
  */
202
210
  toJSON() {
203
211
  return {
204
- id: this.id,
205
- title: this.title,
206
- description: this.description,
207
- lifecycle: this.lifecycle,
208
- lifecycleHistory: this.lifecycleHistory,
209
- autoApprovable: this.autoApprovable,
210
- language: this.language,
211
- category: this.category,
212
- kind: this.kind,
213
- knowledgeType: this.knowledgeType,
214
- complexity: this.complexity,
215
- scope: this.scope,
216
- difficulty: this.difficulty,
217
- tags: this.tags,
218
- trigger: this.trigger,
219
- topicHint: this.topicHint,
220
- whenClause: this.whenClause,
221
- doClause: this.doClause,
222
- dontClause: this.dontClause,
223
- coreCode: this.coreCode,
224
- content: this.content.toJSON(),
225
- relations: this.relations.toJSON(),
226
- constraints: this.constraints.toJSON(),
227
- reasoning: this.reasoning.toJSON(),
228
- quality: this.quality.toJSON(),
229
- stats: this.stats.toJSON(),
230
- headers: this.headers,
231
- headerPaths: this.headerPaths,
232
- moduleName: this.moduleName,
233
- includeHeaders: this.includeHeaders,
234
- agentNotes: this.agentNotes,
235
- aiInsight: this.aiInsight,
236
- reviewedBy: this.reviewedBy,
237
- reviewedAt: this.reviewedAt,
238
- rejectionReason: this.rejectionReason,
239
- source: this.source,
240
- sourceFile: this.sourceFile,
212
+ id: this.id,
213
+ title: this.title,
214
+ description: this.description,
215
+ lifecycle: this.lifecycle,
216
+ lifecycleHistory: this.lifecycleHistory,
217
+ autoApprovable: this.autoApprovable,
218
+ language: this.language,
219
+ category: this.category,
220
+ kind: this.kind,
221
+ knowledgeType: this.knowledgeType,
222
+ complexity: this.complexity,
223
+ scope: this.scope,
224
+ difficulty: this.difficulty,
225
+ tags: this.tags,
226
+ trigger: this.trigger,
227
+ topicHint: this.topicHint,
228
+ whenClause: this.whenClause,
229
+ doClause: this.doClause,
230
+ dontClause: this.dontClause,
231
+ coreCode: this.coreCode,
232
+ content: this.content.toJSON(),
233
+ relations: this.relations.toJSON(),
234
+ constraints: this.constraints.toJSON(),
235
+ reasoning: this.reasoning.toJSON(),
236
+ quality: this.quality.toJSON(),
237
+ stats: this.stats.toJSON(),
238
+ headers: this.headers,
239
+ headerPaths: this.headerPaths,
240
+ moduleName: this.moduleName,
241
+ includeHeaders: this.includeHeaders,
242
+ agentNotes: this.agentNotes,
243
+ aiInsight: this.aiInsight,
244
+ reviewedBy: this.reviewedBy,
245
+ reviewedAt: this.reviewedAt,
246
+ rejectionReason: this.rejectionReason,
247
+ source: this.source,
248
+ sourceFile: this.sourceFile,
241
249
  sourceCandidateId: this.sourceCandidateId,
242
- createdBy: this.createdBy,
243
- createdAt: this.createdAt,
244
- updatedAt: this.updatedAt,
245
- publishedAt: this.publishedAt,
246
- publishedBy: this.publishedBy,
250
+ createdBy: this.createdBy,
251
+ createdAt: this.createdAt,
252
+ updatedAt: this.updatedAt,
253
+ publishedAt: this.publishedAt,
254
+ publishedBy: this.publishedBy,
247
255
  };
248
256
  }
249
257
 
@@ -253,7 +261,9 @@ export class KnowledgeEntry {
253
261
  * @returns {KnowledgeEntry}
254
262
  */
255
263
  static fromJSON(data) {
256
- if (!data) return new KnowledgeEntry();
264
+ if (!data) {
265
+ return new KnowledgeEntry();
266
+ }
257
267
  return new KnowledgeEntry(data);
258
268
  }
259
269
 
@@ -5,7 +5,6 @@
5
5
  * 实现类见 lib/repository/knowledge/KnowledgeRepository.impl.js
6
6
  */
7
7
  export class KnowledgeRepository {
8
-
9
8
  /**
10
9
  * 创建 KnowledgeEntry
11
10
  * @param {import('./KnowledgeEntry.js').KnowledgeEntry} entry