autosnippet 2.8.3 → 2.10.0

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 (110) hide show
  1. package/README.md +5 -5
  2. package/bin/cli.js +5 -33
  3. package/config/constitution.yaml +9 -2
  4. package/dashboard/dist/assets/{icons-B_Xg4B-s.js → icons-BkT3XrKf.js} +105 -100
  5. package/dashboard/dist/assets/index-BsB7DzW4.css +1 -0
  6. package/dashboard/dist/assets/index-DdmQMrJJ.js +155 -0
  7. package/dashboard/dist/index.html +3 -3
  8. package/lib/cli/AiScanService.js +13 -11
  9. package/lib/cli/KnowledgeSyncService.js +343 -0
  10. package/lib/cli/SetupService.js +9 -27
  11. package/lib/core/ast/ProjectGraph.js +160 -0
  12. package/lib/core/gateway/GatewayActionRegistry.js +48 -58
  13. package/lib/domain/index.js +16 -11
  14. package/lib/domain/knowledge/KnowledgeEntry.js +351 -0
  15. package/lib/domain/knowledge/KnowledgeRepository.js +123 -0
  16. package/lib/domain/knowledge/Lifecycle.js +109 -0
  17. package/lib/domain/knowledge/index.js +27 -0
  18. package/lib/domain/knowledge/values/Constraints.js +125 -0
  19. package/lib/domain/knowledge/values/Content.js +86 -0
  20. package/lib/domain/knowledge/values/Quality.js +93 -0
  21. package/lib/domain/knowledge/values/Reasoning.js +69 -0
  22. package/lib/domain/knowledge/values/Relations.js +168 -0
  23. package/lib/domain/knowledge/values/Stats.js +87 -0
  24. package/lib/domain/knowledge/values/index.js +9 -0
  25. package/lib/external/ai/AiProvider.js +48 -0
  26. package/lib/external/ai/providers/GoogleGeminiProvider.js +12 -3
  27. package/lib/external/mcp/McpServer.js +7 -5
  28. package/lib/external/mcp/handlers/bootstrap/pipeline/orchestrator.js +3 -2
  29. package/lib/external/mcp/handlers/bootstrap.js +121 -12
  30. package/lib/external/mcp/handlers/browse.js +77 -73
  31. package/lib/external/mcp/handlers/candidate.js +29 -276
  32. package/lib/external/mcp/handlers/guard.js +2 -0
  33. package/lib/external/mcp/handlers/knowledge.js +205 -0
  34. package/lib/external/mcp/handlers/skill.js +4 -2
  35. package/lib/external/mcp/handlers/structure.js +25 -23
  36. package/lib/external/mcp/handlers/system.js +10 -12
  37. package/lib/external/mcp/tools.js +125 -138
  38. package/lib/http/HttpServer.js +4 -8
  39. package/lib/http/middleware/requestLogger.js +3 -3
  40. package/lib/http/routes/ai.js +17 -1
  41. package/lib/http/routes/extract.js +48 -4
  42. package/lib/http/routes/knowledge.js +246 -0
  43. package/lib/http/routes/search.js +12 -17
  44. package/lib/http/routes/skills.js +44 -1
  45. package/lib/infrastructure/cache/GraphCache.js +143 -0
  46. package/lib/infrastructure/database/migrations/015_create_token_usage.js +27 -0
  47. package/lib/infrastructure/database/migrations/016_unified_knowledge_entries.js +395 -0
  48. package/lib/infrastructure/external/XcodeAutomation.js +187 -103
  49. package/lib/infrastructure/realtime/RealtimeService.js +14 -2
  50. package/lib/injection/ServiceContainer.js +164 -63
  51. package/lib/repository/knowledge/KnowledgeRepository.impl.js +373 -0
  52. package/lib/repository/token/TokenUsageStore.js +162 -0
  53. package/lib/service/automation/DirectiveDetector.js +2 -3
  54. package/lib/service/automation/FileWatcher.js +67 -28
  55. package/lib/service/automation/XcodeIntegration.js +931 -156
  56. package/lib/service/automation/handlers/AlinkHandler.js +6 -4
  57. package/lib/service/automation/handlers/CreateHandler.js +53 -18
  58. package/lib/service/automation/handlers/GuardHandler.js +183 -20
  59. package/lib/service/automation/handlers/SearchHandler.js +35 -17
  60. package/lib/service/chat/AnalystAgent.js +25 -14
  61. package/lib/service/chat/CandidateGuardrail.js +1 -1
  62. package/lib/service/chat/ChatAgent.js +280 -48
  63. package/lib/service/chat/ContextWindow.js +92 -8
  64. package/lib/service/chat/HandoffProtocol.js +26 -1
  65. package/lib/service/chat/ProducerAgent.js +11 -9
  66. package/lib/service/chat/tools.js +298 -194
  67. package/lib/service/guard/GuardCheckEngine.js +114 -10
  68. package/lib/service/guard/GuardService.js +59 -48
  69. package/lib/service/knowledge/ConfidenceRouter.js +159 -0
  70. package/lib/service/knowledge/KnowledgeFileWriter.js +602 -0
  71. package/lib/service/knowledge/KnowledgeService.js +725 -0
  72. package/lib/service/search/SearchEngine.js +92 -19
  73. package/lib/service/skills/SignalCollector.js +15 -9
  74. package/lib/service/skills/SkillAdvisor.js +13 -11
  75. package/lib/service/snippet/SnippetFactory.js +5 -5
  76. package/lib/service/spm/SpmService.js +119 -18
  77. package/package.json +1 -1
  78. package/scripts/install-cursor-skill.js +0 -6
  79. package/scripts/migrate-md-to-knowledge.mjs +364 -0
  80. package/skills/autosnippet-analysis/SKILL.md +15 -7
  81. package/skills/autosnippet-candidates/SKILL.md +6 -6
  82. package/skills/autosnippet-coldstart/SKILL.md +7 -3
  83. package/skills/autosnippet-concepts/SKILL.md +7 -6
  84. package/skills/autosnippet-create/SKILL.md +13 -13
  85. package/skills/autosnippet-intent/SKILL.md +3 -2
  86. package/skills/autosnippet-lifecycle/SKILL.md +5 -5
  87. package/skills/autosnippet-recipes/SKILL.md +16 -4
  88. package/templates/constitution.yaml +1 -1
  89. package/templates/copilot-instructions.md +6 -6
  90. package/templates/recipes-setup/README.md +3 -3
  91. package/dashboard/dist/assets/index-CkIih2CC.css +0 -1
  92. package/dashboard/dist/assets/index-Duc8Qk-c.js +0 -197
  93. package/lib/cli/CandidateSyncService.js +0 -261
  94. package/lib/cli/SyncService.js +0 -356
  95. package/lib/domain/candidate/Candidate.js +0 -196
  96. package/lib/domain/candidate/CandidateRepository.js +0 -107
  97. package/lib/domain/candidate/Reasoning.js +0 -52
  98. package/lib/domain/recipe/Recipe.js +0 -421
  99. package/lib/domain/recipe/RecipeRepository.js +0 -54
  100. package/lib/domain/types/CandidateStatus.js +0 -52
  101. package/lib/http/routes/candidates.js +0 -559
  102. package/lib/http/routes/recipes.js +0 -397
  103. package/lib/repository/candidate/CandidateRepository.impl.js +0 -230
  104. package/lib/repository/recipe/RecipeRepository.impl.js +0 -498
  105. package/lib/service/candidate/CandidateAggregator.js +0 -52
  106. package/lib/service/candidate/CandidateFileWriter.js +0 -383
  107. package/lib/service/candidate/CandidateService.js +0 -973
  108. package/lib/service/recipe/RecipeFileWriter.js +0 -514
  109. package/lib/service/recipe/RecipeService.js +0 -786
  110. package/lib/service/recipe/RecipeStatsTracker.js +0 -148
package/README.md CHANGED
@@ -86,7 +86,7 @@ asd status # 自检项目根、AI Provider、索引、Dashboard
86
86
 
87
87
  ```
88
88
  用户:「扫描 NetworkModule 这个 Target,提取最佳实践」
89
- Cursor → autosnippet_get_targetsautosnippet_get_target_files → 逐文件提取 → autosnippet_submit_candidates
89
+ Cursor → get_targetsget_target_files → 逐文件提取 → submit_knowledge_batch
90
90
  → Dashboard Candidates 页面审核 → 保存为 Recipe
91
91
  ```
92
92
 
@@ -96,7 +96,7 @@ Cursor → autosnippet_get_targets → autosnippet_get_target_files → 逐文
96
96
 
97
97
  ## Dashboard
98
98
 
99
- `asd ui` 启动后访问 Web 管理后台(默认 http://127.0.0.1:3000):
99
+ `asd ui` 启动后访问 Web 管理后台:
100
100
 
101
101
  ![Dashboard](./resources/ASImage02.png)
102
102
 
@@ -171,14 +171,14 @@ asd install:vscode-copilot # 配置 MCP 和 Copilot 指令
171
171
 
172
172
  ## MCP 工具一览
173
173
 
174
- 38 个 MCP 工具按功能分组:
174
+ 38 个 MCP 工具按功能分组(省略了 **autosnippet_** 前缀):
175
175
 
176
176
  | 分类 | 工具 |
177
177
  |------|------|
178
- | **系统** | `autosnippet_health`、`autosnippet_capabilities` |
178
+ | **系统** | `health`、`autosnippet_capabilities` |
179
179
  | **搜索** | `autosnippet_search`(统合入口)、`autosnippet_context_search`(4 层漏斗)、`autosnippet_keyword_search`、`autosnippet_semantic_search` |
180
180
  | **Recipe 浏览** | `autosnippet_list_recipes`、`autosnippet_get_recipe`、`autosnippet_list_rules`、`autosnippet_list_patterns`、`autosnippet_list_facts`、`autosnippet_recipe_insights`、`autosnippet_confirm_usage` |
181
- | **候选管理** | `autosnippet_validate_candidate`、`autosnippet_check_duplicate`、`autosnippet_submit_candidate`、`autosnippet_submit_candidates`、`autosnippet_submit_draft_recipes`、`autosnippet_enrich_candidates` |
181
+ | **候选管理** | `autosnippet_validate_candidate`、`autosnippet_check_duplicate`、`autosnippet_submit_knowledge`、`autosnippet_submit_knowledge_batch`、`autosnippet_submit_knowledge_batch`、`autosnippet_enrich_candidates` |
182
182
  | **知识图谱** | `autosnippet_graph_query`、`autosnippet_graph_impact`、`autosnippet_graph_path`、`autosnippet_graph_stats` |
183
183
  | **项目结构** | `autosnippet_get_targets`、`autosnippet_get_target_files`、`autosnippet_get_target_metadata` |
184
184
  | **Guard** | `autosnippet_guard_check`、`autosnippet_guard_audit_files`、`autosnippet_scan_project` |
package/bin/cli.js CHANGED
@@ -501,12 +501,10 @@ program
501
501
  .option('--force', '忽略 hash 强制覆盖')
502
502
  .action(async (opts) => {
503
503
  const projectRoot = resolve(opts.dir);
504
- const { SyncService } = await import('../lib/cli/SyncService.js');
505
- const { CandidateSyncService } = await import('../lib/cli/CandidateSyncService.js');
506
- const syncService = new SyncService(projectRoot);
507
- const candidateSyncService = new CandidateSyncService(projectRoot);
504
+ const { KnowledgeSyncService } = await import('../lib/cli/KnowledgeSyncService.js');
505
+ const syncService = new KnowledgeSyncService(projectRoot);
508
506
 
509
- console.log(`\n🔄 AutoSnippet V2 — 同步 recipes + candidates`);
507
+ console.log(`\n🔄 AutoSnippet V3 — 同步 knowledge entries`);
510
508
  console.log(` 项目: ${basename(projectRoot)}`);
511
509
  console.log(` 路径: ${projectRoot}`);
512
510
  if (opts.dryRun) console.log(' 模式: dry-run(仅报告)');
@@ -533,7 +531,7 @@ program
533
531
  });
534
532
 
535
533
  // 输出报告
536
- console.log(`✅ Recipes 同步完成`);
534
+ console.log(`✅ Knowledge 同步完成`);
537
535
  console.log(` 扫描: ${report.synced + report.skipped} 文件`);
538
536
  console.log(` 新增: ${report.created}`);
539
537
  console.log(` 更新: ${report.updated}`);
@@ -547,38 +545,12 @@ program
547
545
  }
548
546
 
549
547
  if (report.orphaned.length > 0) {
550
- console.log(`\n🗑️ ${report.orphaned.length} 个孤儿 Recipe 已标记 deprecated:`);
548
+ console.log(`\n🗑️ ${report.orphaned.length} 个孤儿条目已标记 deprecated:`);
551
549
  for (const id of report.orphaned) {
552
550
  console.log(` - ${id}`);
553
551
  }
554
552
  }
555
553
 
556
- // ── Candidates 同步 ──
557
- const cReport = candidateSyncService.sync(db, {
558
- dryRun: opts.dryRun,
559
- force: opts.force,
560
- });
561
-
562
- console.log(`\n✅ Candidates 同步完成`);
563
- console.log(` 扫描: ${cReport.synced + cReport.skipped} 文件`);
564
- console.log(` 新增: ${cReport.created}`);
565
- console.log(` 更新: ${cReport.updated}`);
566
- console.log(` 跳过: ${cReport.skipped}`);
567
-
568
- if (cReport.violations.length > 0) {
569
- console.log(`\n⚠️ 检测到 ${cReport.violations.length} 个 Candidate 手动编辑:`);
570
- for (const v of cReport.violations) {
571
- console.log(` - ${v}`);
572
- }
573
- }
574
-
575
- if (cReport.orphaned.length > 0) {
576
- console.log(`\n📋 ${cReport.orphaned.length} 个 Candidate 仅存于 DB(无 .md 文件):`);
577
- for (const id of cReport.orphaned) {
578
- console.log(` - ${id}`);
579
- }
580
- }
581
-
582
554
  console.log('');
583
555
  } finally {
584
556
  await bootstrap.shutdown?.();
@@ -32,12 +32,19 @@ roles:
32
32
  - "read:recipes"
33
33
  - "read:guard_rules"
34
34
  - "create:candidates"
35
- - "submit:candidates"
35
+ - "candidate:update"
36
+ - "knowledge:create"
37
+ - "knowledge:update"
38
+ - "submit:knowledge"
36
39
  - "read:audit_logs:self"
37
40
  - "knowledge:bootstrap"
38
41
  - "create:skills"
42
+ - "update:skills"
43
+ - "delete:skills"
39
44
  constraints:
40
- - "cannot modify Recipe directly"
45
+ - "can submit knowledge entries (all go to pending)"
46
+ - "cannot publish/deprecate knowledge — only developer can do that"
47
+ - "can reactivate deprecated entries back to pending"
41
48
  - "cannot modify Guard rules"
42
49
  - "cannot delete any data"
43
50
  - id: "chat_agent"