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
@@ -2,11 +2,12 @@
2
2
  * TierScheduler.js — 维度分层并行调度器
3
3
  *
4
4
  * 按维度间信息依赖关系分 3 层执行:
5
- * - Tier 1: 基础数据层 (project-profile, objc-deep-scan, category-scan) — 可并行
5
+ * - Tier 1: 基础数据层 (project-profile, 语言条件扫描) — 可并行
6
6
  * - Tier 2: 规范+架构+模式 (code-standard, architecture, code-pattern) — 依赖 Tier 1
7
7
  * - Tier 3: 流转+实践+总结 (event-and-data-flow, best-practice, agent-guidelines) — 依赖 Tier 2
8
8
  *
9
9
  * 每层内部可并行 (受 concurrency 限制),层间串行。
10
+ * 未在任何 Tier 中定义的维度会自动归入 Tier 1(并行执行)。
10
11
  *
11
12
  * @module TierScheduler
12
13
  */
@@ -20,9 +21,20 @@ const logger = Logger.getInstance();
20
21
  // ──────────────────────────────────────────────────────────────────
21
22
 
22
23
  const DEFAULT_TIERS = [
23
- ['project-profile', 'objc-deep-scan', 'category-scan'], // Tier 1: 基础数据
24
- ['code-standard', 'architecture', 'code-pattern'], // Tier 2: 规范+架构+模式
25
- ['event-and-data-flow', 'best-practice', 'agent-guidelines'], // Tier 3: 流转+实践+总结
24
+ // Tier 1: 基础数据(通用 + 语言条件维度并行执行)
25
+ [
26
+ 'project-profile',
27
+ 'objc-deep-scan',
28
+ 'category-scan',
29
+ 'module-export-scan',
30
+ 'framework-convention-scan',
31
+ 'python-package-scan',
32
+ 'jvm-annotation-scan',
33
+ ],
34
+ // Tier 2: 规范+架构+模式
35
+ ['code-standard', 'architecture', 'code-pattern'],
36
+ // Tier 3: 流转+实践+总结
37
+ ['event-and-data-flow', 'best-practice', 'agent-guidelines'],
26
38
  ];
27
39
 
28
40
  // ──────────────────────────────────────────────────────────────────
@@ -42,7 +54,7 @@ class Semaphore {
42
54
  this.#permits--;
43
55
  return;
44
56
  }
45
- return new Promise(resolve => {
57
+ return new Promise((resolve) => {
46
58
  this.#queue.push(resolve);
47
59
  });
48
60
  }
@@ -80,21 +92,43 @@ export class TierScheduler {
80
92
  * @param {number} [options.concurrency=3] — Tier 内最大并行数
81
93
  * @param {Function} [options.onTierComplete] — (tierIndex, tierResults) => void
82
94
  * @param {Function} [options.shouldAbort] — () => boolean — 外部中止信号
95
+ * @param {string[]} [options.activeDimIds] — 实际要执行的维度 ID 列表(过滤不在列表中的维度)
83
96
  * @returns {Promise<Map<string, any>>} — dimId → result
84
97
  */
85
98
  async execute(executeDimension, options = {}) {
86
- const { concurrency = 3, onTierComplete, shouldAbort } = options;
99
+ const { concurrency = 3, onTierComplete, shouldAbort, activeDimIds } = options;
87
100
  const results = new Map();
88
101
 
89
- for (let tierIndex = 0; tierIndex < this.#tiers.length; tierIndex++) {
90
- const tier = this.#tiers[tierIndex];
102
+ // 如果提供了 activeDimIds,根据它构建实际要执行的 tiers
103
+ // 未在任何 tier 中定义的维度追加到 Tier 1
104
+ let effectiveTiers = this.#tiers;
105
+ if (activeDimIds) {
106
+ const activeSet = new Set(activeDimIds);
107
+ const scheduled = new Set(this.#tiers.flat());
108
+ const unscheduled = activeDimIds.filter((id) => !scheduled.has(id));
109
+ effectiveTiers = this.#tiers.map((tier) => tier.filter((id) => activeSet.has(id)));
110
+ if (unscheduled.length > 0) {
111
+ // 动态维度(Enhancement Pack 追加的)归入 Tier 1
112
+ effectiveTiers[0] = [...effectiveTiers[0], ...unscheduled];
113
+ logger.info(
114
+ `[TierScheduler] Unscheduled dims added to Tier 1: [${unscheduled.join(', ')}]`
115
+ );
116
+ }
117
+ // 移除空 tier
118
+ effectiveTiers = effectiveTiers.filter((t) => t.length > 0);
119
+ }
120
+
121
+ for (let tierIndex = 0; tierIndex < effectiveTiers.length; tierIndex++) {
122
+ const tier = effectiveTiers[tierIndex];
91
123
 
92
124
  if (shouldAbort?.()) {
93
125
  logger.warn(`[TierScheduler] Aborted before Tier ${tierIndex + 1}`);
94
126
  break;
95
127
  }
96
128
 
97
- logger.info(`[TierScheduler] ── Tier ${tierIndex + 1}/${this.#tiers.length}: [${tier.join(', ')}] (concurrency=${concurrency})`);
129
+ logger.info(
130
+ `[TierScheduler] ── Tier ${tierIndex + 1}/${this.#tiers.length}: [${tier.join(', ')}] (concurrency=${concurrency})`
131
+ );
98
132
 
99
133
  const tierResults = await this.#executeTier(tier, executeDimension, concurrency, shouldAbort);
100
134
 
@@ -117,11 +151,15 @@ export class TierScheduler {
117
151
 
118
152
  await Promise.all(
119
153
  dimensionIds.map(async (dimId) => {
120
- if (shouldAbort?.()) return;
154
+ if (shouldAbort?.()) {
155
+ return;
156
+ }
121
157
 
122
158
  await semaphore.acquire();
123
159
  try {
124
- if (shouldAbort?.()) return;
160
+ if (shouldAbort?.()) {
161
+ return;
162
+ }
125
163
  const result = await executeDimension(dimId);
126
164
  results.set(dimId, result);
127
165
  } catch (err) {
@@ -143,7 +181,9 @@ export class TierScheduler {
143
181
  */
144
182
  getTierIndex(dimId) {
145
183
  for (let i = 0; i < this.#tiers.length; i++) {
146
- if (this.#tiers[i].includes(dimId)) return i;
184
+ if (this.#tiers[i].includes(dimId)) {
185
+ return i;
186
+ }
147
187
  }
148
188
  return -1;
149
189
  }
@@ -18,9 +18,14 @@ const SKILLS_DIR = path.resolve(__dirname, '../../../../../skills');
18
18
  * 语言 → Skills 映射(Skills 必须位于内置 skills/ 目录)
19
19
  */
20
20
  const LANG_SKILL_MAP = {
21
- objectivec: ['autosnippet-coldstart', 'reference-objc'],
22
- swift: ['autosnippet-coldstart', 'reference-swift'],
23
- // 未来扩展: kotlin, java, python, typescript ...
21
+ objectivec: ['autosnippet-coldstart', 'autosnippet-reference-objc'],
22
+ swift: ['autosnippet-coldstart', 'autosnippet-reference-swift'],
23
+ typescript: ['autosnippet-coldstart', 'autosnippet-reference-jsts'],
24
+ javascript: ['autosnippet-coldstart', 'autosnippet-reference-jsts'],
25
+ python: ['autosnippet-coldstart', 'autosnippet-reference-python'],
26
+ java: ['autosnippet-coldstart', 'autosnippet-reference-java'],
27
+ kotlin: ['autosnippet-coldstart', 'autosnippet-reference-kotlin'],
28
+ go: ['autosnippet-coldstart', 'autosnippet-reference-go'],
24
29
  };
25
30
 
26
31
  /**
@@ -32,7 +37,8 @@ const LANG_SKILL_MAP = {
32
37
  */
33
38
  export function loadBootstrapSkills(primaryLanguage, logger) {
34
39
  const result = { coldstartSkill: null, languageSkill: null, loaded: [] };
35
- const skillNames = LANG_SKILL_MAP[primaryLanguage] || LANG_SKILL_MAP.swift;
40
+ const skillNames = LANG_SKILL_MAP[primaryLanguage] ||
41
+ LANG_SKILL_MAP.typescript || ['autosnippet-coldstart'];
36
42
 
37
43
  for (const skillName of skillNames) {
38
44
  const skillPath = path.join(SKILLS_DIR, skillName, 'SKILL.md');
@@ -41,7 +47,7 @@ export function loadBootstrapSkills(primaryLanguage, logger) {
41
47
  const content = fs.readFileSync(skillPath, 'utf8');
42
48
  if (skillName.startsWith('autosnippet-coldstart')) {
43
49
  result.coldstartSkill = content;
44
- } else if (skillName.startsWith('reference-')) {
50
+ } else if (skillName.includes('reference-')) {
45
51
  result.languageSkill = content;
46
52
  }
47
53
  result.loaded.push(skillName);
@@ -69,18 +75,22 @@ export function loadBootstrapSkills(primaryLanguage, logger) {
69
75
  * @returns {{ guides: Record<string, string>, sectionMap: Record<string, Array<{title: string, content: string, keywords: string[]}>> }}
70
76
  */
71
77
  export function extractSkillDimensionGuides(skillContext) {
72
- const guides = {}; // dimId → summary guide text
73
- const sectionMap = {}; // dimId → [{title, content, keywords}]
78
+ const guides = {}; // dimId → summary guide text
79
+ const sectionMap = {}; // dimId → [{title, content, keywords}]
74
80
  const hasLanguageSkill = !!skillContext.languageSkill;
75
81
 
76
82
  // ── coldstart 模板: 仅在无语言 Skill 时用作 fallback ──
77
83
  // coldstart 中的 rationale/whyStandard 是 Swift 示例,不适合直接注入其它语言项目
78
84
  if (skillContext.coldstartSkill && !hasLanguageSkill) {
79
85
  const content = skillContext.coldstartSkill;
80
- const dimBlocks = content.matchAll(/###\s+维度\s*\d+\s*[::]\s*(.+?)\s*\(([^)]+)\)\s*[—–-]\s*参考模板\s*\n([\s\S]*?)(?=\n###\s|\n##\s)/g);
86
+ const dimBlocks = content.matchAll(
87
+ /###\s+维度\s*\d+\s*[::]\s*(.+?)\s*\(([^)]+)\)\s*[—–-]\s*参考模板\s*\n([\s\S]*?)(?=\n###\s|\n##\s)/g
88
+ );
81
89
  for (const match of dimBlocks) {
82
90
  let dimId = match[2].trim();
83
- if (/solution|antiPattern|bug/i.test(dimId)) dimId = 'anti-pattern';
91
+ if (/solution|antiPattern|bug/i.test(dimId)) {
92
+ dimId = 'anti-pattern';
93
+ }
84
94
  dimId = dimId.replace(/\s+/g, '-');
85
95
  const block = match[3];
86
96
  const rationaleMatch = block.match(/"rationale"\s*:\s*"([^"]{20,300})"/);
@@ -98,26 +108,86 @@ export function extractSkillDimensionGuides(skillContext) {
98
108
 
99
109
  // heading → dimension(s) + 子主题匹配关键词
100
110
  const HEADING_DIM_MAP = [
101
- { pattern: /命名|naming|前缀|prefix/i, dims: ['code-standard', 'code-pattern'], keywords: ['naming', 'prefix', '命名', '前缀', 'category'] },
102
- { pattern: /属性|propert/i, dims: ['code-standard', 'best-practice', 'anti-pattern'], keywords: ['property', '属性', 'copy', 'weak', 'strong', 'memory', 'retain', 'cycle', 'leak'] },
103
- { pattern: /delegate|委托/i, dims: ['event-and-data-flow', 'code-pattern'], keywords: ['delegate', 'protocol', '委托', '协议'] },
104
- { pattern: /初始化|initializ/i, dims: ['code-pattern'], keywords: ['init', 'initializer', '初始化', 'factory'] },
105
- { pattern: /null|可选/i, dims: ['code-standard'], keywords: ['nullable', 'nonnull', 'nullability'] },
106
- { pattern: /错误处理|error/i, dims: ['best-practice'], keywords: ['error', 'NSError', '错误', 'error-handling'] },
107
- { pattern: /bool|陷阱/i, dims: ['anti-pattern'], keywords: ['BOOL', 'bool', '陷阱', 'trap'] },
108
- { pattern: /gcd|线程|thread|并发|concurrent/i, dims: ['best-practice', 'anti-pattern'], keywords: ['GCD', 'dispatch', 'thread', '线程', 'main', 'concurrency', 'main-thread'] },
109
- { pattern: /泛型|generic/i, dims: ['code-standard'], keywords: ['generics', '泛型', 'generic'] },
110
- { pattern: /import|导入/i, dims: ['code-standard'], keywords: ['import', '#import', '导入', 'file-organization'] },
111
- { pattern: /特有维度|extra.?dim/i, dims: ['agent-guidelines'], keywords: ['agent', '注意', '维度', 'extra'] },
112
- { pattern: /category|扩展(?!.*特有)/i, dims: ['code-pattern'], keywords: ['category', 'extension', '扩展'] },
113
- { pattern: /singleton|单例/i, dims: ['code-pattern'], keywords: ['singleton', '单例', 'dispatch_once'] },
111
+ {
112
+ pattern: /命名|naming|前缀|prefix/i,
113
+ dims: ['code-standard', 'code-pattern'],
114
+ keywords: ['naming', 'prefix', '命名', '前缀', 'category'],
115
+ },
116
+ {
117
+ pattern: /属性|propert/i,
118
+ dims: ['code-standard', 'best-practice', 'anti-pattern'],
119
+ keywords: [
120
+ 'property',
121
+ '属性',
122
+ 'copy',
123
+ 'weak',
124
+ 'strong',
125
+ 'memory',
126
+ 'retain',
127
+ 'cycle',
128
+ 'leak',
129
+ ],
130
+ },
131
+ {
132
+ pattern: /delegate|委托/i,
133
+ dims: ['event-and-data-flow', 'code-pattern'],
134
+ keywords: ['delegate', 'protocol', '委托', '协议'],
135
+ },
136
+ {
137
+ pattern: /初始化|initializ/i,
138
+ dims: ['code-pattern'],
139
+ keywords: ['init', 'initializer', '初始化', 'factory'],
140
+ },
141
+ {
142
+ pattern: /null|可选/i,
143
+ dims: ['code-standard'],
144
+ keywords: ['nullable', 'nonnull', 'nullability'],
145
+ },
146
+ {
147
+ pattern: /错误处理|error/i,
148
+ dims: ['best-practice'],
149
+ keywords: ['error', 'NSError', '错误', 'error-handling'],
150
+ },
151
+ { pattern: /bool|陷阱/i, dims: ['anti-pattern'], keywords: ['BOOL', 'bool', '陷阱', 'trap'] },
152
+ {
153
+ pattern: /gcd|线程|thread|并发|concurrent/i,
154
+ dims: ['best-practice', 'anti-pattern'],
155
+ keywords: ['GCD', 'dispatch', 'thread', '线程', 'main', 'concurrency', 'main-thread'],
156
+ },
157
+ {
158
+ pattern: /泛型|generic/i,
159
+ dims: ['code-standard'],
160
+ keywords: ['generics', '泛型', 'generic'],
161
+ },
162
+ {
163
+ pattern: /import|导入/i,
164
+ dims: ['code-standard'],
165
+ keywords: ['import', '#import', '导入', 'file-organization'],
166
+ },
167
+ {
168
+ pattern: /特有维度|extra.?dim/i,
169
+ dims: ['agent-guidelines'],
170
+ keywords: ['agent', '注意', '维度', 'extra'],
171
+ },
172
+ {
173
+ pattern: /category|扩展(?!.*特有)/i,
174
+ dims: ['code-pattern'],
175
+ keywords: ['category', 'extension', '扩展'],
176
+ },
177
+ {
178
+ pattern: /singleton|单例/i,
179
+ dims: ['code-pattern'],
180
+ keywords: ['singleton', '单例', 'dispatch_once'],
181
+ },
114
182
  ];
115
183
 
116
184
  // 用 --- 分割section,更可靠地提取完整 section body
117
185
  const sectionParts = content.split(/\n---\n/);
118
186
  for (const part of sectionParts) {
119
187
  const headingMatch = part.match(/^##\s+\d+\.\s+(.+?)(?:\s*\(.+\))?\s*$/m);
120
- if (!headingMatch) continue;
188
+ if (!headingMatch) {
189
+ continue;
190
+ }
121
191
 
122
192
  const heading = headingMatch[1].trim();
123
193
  const bodyStart = part.indexOf(headingMatch[0]) + headingMatch[0].length;
@@ -125,7 +195,7 @@ export function extractSkillDimensionGuides(skillContext) {
125
195
 
126
196
  // 查找匹配的 dimension(s)
127
197
  let matchedDims = [];
128
- let matchedKeywords = [];
198
+ const matchedKeywords = [];
129
199
  for (const mapping of HEADING_DIM_MAP) {
130
200
  if (mapping.pattern.test(heading)) {
131
201
  matchedDims.push(...mapping.dims);
@@ -133,7 +203,9 @@ export function extractSkillDimensionGuides(skillContext) {
133
203
  }
134
204
  }
135
205
  matchedDims = [...new Set(matchedDims)];
136
- if (matchedDims.length === 0) continue;
206
+ if (matchedDims.length === 0) {
207
+ continue;
208
+ }
137
209
 
138
210
  // 提取有意义的摘要内容
139
211
  let summary = extractSectionSummary(body);
@@ -141,7 +213,9 @@ export function extractSkillDimensionGuides(skillContext) {
141
213
  if (summary.length < 20) {
142
214
  summary = `${heading}:${summary}`;
143
215
  }
144
- if (summary.length < 10) continue;
216
+ if (summary.length < 10) {
217
+ continue;
218
+ }
145
219
 
146
220
  const sectionData = {
147
221
  title: heading,
@@ -150,7 +224,9 @@ export function extractSkillDimensionGuides(skillContext) {
150
224
  };
151
225
 
152
226
  for (const dimId of matchedDims) {
153
- if (!sectionMap[dimId]) sectionMap[dimId] = [];
227
+ if (!sectionMap[dimId]) {
228
+ sectionMap[dimId] = [];
229
+ }
154
230
  sectionMap[dimId].push(sectionData);
155
231
 
156
232
  const shortContent = summary.substring(0, 120);
@@ -180,25 +256,49 @@ export function extractSectionSummary(body) {
180
256
  const trimmed = line.trim();
181
257
 
182
258
  // 跳过 JSON 模板块(候选格式示例)
183
- if (trimmed.startsWith('```json')) { inJsonBlock = true; continue; }
184
- if (inJsonBlock) { if (trimmed === '```') inJsonBlock = false; continue; }
259
+ if (trimmed.startsWith('```json')) {
260
+ inJsonBlock = true;
261
+ continue;
262
+ }
263
+ if (inJsonBlock) {
264
+ if (trimmed === '```') {
265
+ inJsonBlock = false;
266
+ }
267
+ continue;
268
+ }
185
269
 
186
270
  // 追踪代码块 — 保留 ✅/❌ 关键注释
187
- if (trimmed.startsWith('```')) { inCodeBlock = !inCodeBlock; continue; }
271
+ if (trimmed.startsWith('```')) {
272
+ inCodeBlock = !inCodeBlock;
273
+ continue;
274
+ }
188
275
  if (inCodeBlock) {
189
- if (/[✅❌]/.test(trimmed) && parts.length < 12) parts.push(trimmed);
276
+ if (/[✅❌]/.test(trimmed) && parts.length < 12) {
277
+ parts.push(trimmed);
278
+ }
190
279
  continue;
191
280
  }
192
281
 
193
- if (!trimmed) continue;
194
- if (trimmed.startsWith('###') || trimmed.startsWith('####')) continue;
195
- if (/^\|[-\s|:]+\|$/.test(trimmed)) continue; // 表格分隔线
282
+ if (!trimmed) {
283
+ continue;
284
+ }
285
+ if (trimmed.startsWith('###') || trimmed.startsWith('####')) {
286
+ continue;
287
+ }
288
+ if (/^\|[-\s|:]+\|$/.test(trimmed)) {
289
+ continue; // 表格分隔线
290
+ }
196
291
 
197
292
  parts.push(trimmed);
198
- if (parts.length >= 10) break;
293
+ if (parts.length >= 10) {
294
+ break;
295
+ }
199
296
  }
200
297
 
201
- return parts.join('; ').replace(/\s{2,}/g, ' ').trim();
298
+ return parts
299
+ .join('; ')
300
+ .replace(/\s{2,}/g, ' ')
301
+ .trim();
202
302
  }
203
303
 
204
304
  /**
@@ -210,11 +310,15 @@ export function extractSectionSummary(body) {
210
310
  * @returns {Array} 增强后的维度数组(原数组不变,返回新数组)
211
311
  */
212
312
  export function enhanceDimensions(dimensions, skillGuides, skillSections) {
213
- if (!skillGuides || Object.keys(skillGuides).length === 0) return dimensions;
313
+ if (!skillGuides || Object.keys(skillGuides).length === 0) {
314
+ return dimensions;
315
+ }
214
316
 
215
- return dimensions.map(dim => {
317
+ return dimensions.map((dim) => {
216
318
  const extra = skillGuides[dim.id];
217
- if (!extra) return dim;
319
+ if (!extra) {
320
+ return dim;
321
+ }
218
322
  return {
219
323
  ...dim,
220
324
  guide: `${dim.guide}。[Skill 参考] ${extra}`,