autosnippet 3.0.1 → 3.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +231 -324
- package/bin/api-server.js +1 -1
- package/bin/cli.js +204 -244
- package/bin/mcp-server.js +17 -4
- package/config/knowledge-base.config.js +132 -132
- package/dashboard/dist/assets/{icons-CEfgGaZi.js → icons-Cdq22n2i.js} +95 -100
- package/dashboard/dist/assets/index-ClkyPkDX.js +133 -0
- package/dashboard/dist/assets/index-t4QrJwv1.css +1 -0
- package/dashboard/dist/index.html +3 -3
- package/lib/bootstrap.js +8 -8
- package/lib/cli/AiScanService.js +86 -40
- package/lib/cli/KnowledgeSyncService.js +113 -74
- package/lib/cli/SetupService.js +441 -282
- package/lib/cli/UpgradeService.js +68 -107
- package/lib/core/AstAnalyzer.js +276 -597
- package/lib/core/ast/ProjectGraph.js +101 -40
- package/lib/core/ast/ensure-grammars.js +232 -0
- package/lib/core/ast/index.js +115 -0
- package/lib/core/ast/lang-dart.js +661 -0
- package/lib/core/ast/lang-go.js +530 -0
- package/lib/core/ast/lang-java.js +435 -0
- package/lib/core/ast/lang-javascript.js +272 -0
- package/lib/core/ast/lang-kotlin.js +423 -0
- package/lib/core/ast/lang-objc.js +388 -0
- package/lib/core/ast/lang-python.js +371 -0
- package/lib/core/ast/lang-swift.js +337 -0
- package/lib/core/ast/lang-typescript.js +503 -0
- package/lib/core/capability/CapabilityProbe.js +18 -9
- package/lib/core/constitution/Constitution.js +2 -3
- package/lib/core/constitution/ConstitutionValidator.js +65 -24
- package/lib/core/discovery/DartDiscoverer.js +534 -0
- package/lib/core/discovery/DiscovererRegistry.js +83 -0
- package/lib/core/discovery/GenericDiscoverer.js +225 -0
- package/lib/core/discovery/GoDiscoverer.js +541 -0
- package/lib/core/discovery/JvmDiscoverer.js +506 -0
- package/lib/core/discovery/NodeDiscoverer.js +466 -0
- package/lib/core/discovery/ProjectDiscoverer.js +93 -0
- package/lib/core/discovery/PythonDiscoverer.js +338 -0
- package/lib/core/discovery/SpmDiscoverer.js +5 -0
- package/lib/core/discovery/index.js +53 -0
- package/lib/core/enhancement/EnhancementPack.js +71 -0
- package/lib/core/enhancement/EnhancementRegistry.js +47 -0
- package/lib/core/enhancement/android-enhancement.js +102 -0
- package/lib/core/enhancement/django-enhancement.js +70 -0
- package/lib/core/enhancement/fastapi-enhancement.js +63 -0
- package/lib/core/enhancement/go-grpc-enhancement.js +152 -0
- package/lib/core/enhancement/go-web-enhancement.js +201 -0
- package/lib/core/enhancement/index.js +65 -0
- package/lib/core/enhancement/node-server-enhancement.js +88 -0
- package/lib/core/enhancement/react-enhancement.js +86 -0
- package/lib/core/enhancement/spring-enhancement.js +112 -0
- package/lib/core/enhancement/vue-enhancement.js +96 -0
- package/lib/core/gateway/Gateway.js +8 -9
- package/lib/core/gateway/GatewayActionRegistry.js +1 -1
- package/lib/core/permission/PermissionManager.js +12 -8
- package/lib/domain/index.js +13 -9
- package/lib/domain/knowledge/KnowledgeEntry.js +111 -101
- package/lib/domain/knowledge/KnowledgeRepository.js +0 -1
- package/lib/domain/knowledge/Lifecycle.js +22 -22
- package/lib/domain/knowledge/index.js +9 -12
- package/lib/domain/knowledge/values/Constraints.js +31 -21
- package/lib/domain/knowledge/values/Content.js +21 -13
- package/lib/domain/knowledge/values/Quality.js +31 -18
- package/lib/domain/knowledge/values/Reasoning.js +20 -12
- package/lib/domain/knowledge/values/Relations.js +37 -25
- package/lib/domain/knowledge/values/Stats.js +18 -12
- package/lib/domain/knowledge/values/index.js +4 -3
- package/lib/domain/snippet/Snippet.js +35 -10
- package/lib/external/ai/AiFactory.js +48 -16
- package/lib/external/ai/AiProvider.js +184 -90
- package/lib/external/ai/providers/ClaudeProvider.js +25 -12
- package/lib/external/ai/providers/GoogleGeminiProvider.js +59 -30
- package/lib/external/ai/providers/MockProvider.js +9 -3
- package/lib/external/ai/providers/OpenAiProvider.js +51 -29
- package/lib/external/mcp/McpServer.js +66 -36
- package/lib/external/mcp/errorHandler.js +23 -11
- package/lib/external/mcp/handlers/LanguageExtensions.js +138 -53
- package/lib/external/mcp/handlers/TargetClassifier.js +52 -16
- package/lib/external/mcp/handlers/bootstrap/pipeline/BootstrapSnapshot.js +81 -20
- package/lib/external/mcp/handlers/bootstrap/pipeline/EpisodicMemory.js +71 -42
- package/lib/external/mcp/handlers/bootstrap/pipeline/IncrementalBootstrap.js +9 -17
- package/lib/external/mcp/handlers/bootstrap/pipeline/ToolResultCache.js +14 -9
- package/lib/external/mcp/handlers/bootstrap/pipeline/dimension-context.js +15 -7
- package/lib/external/mcp/handlers/bootstrap/pipeline/orchestrator.js +352 -153
- package/lib/external/mcp/handlers/bootstrap/pipeline/tier-scheduler.js +52 -12
- package/lib/external/mcp/handlers/bootstrap/skills.js +143 -39
- package/lib/external/mcp/handlers/bootstrap.js +691 -168
- package/lib/external/mcp/handlers/browse.js +66 -22
- package/lib/external/mcp/handlers/candidate.js +118 -35
- package/lib/external/mcp/handlers/consolidated.js +49 -17
- package/lib/external/mcp/handlers/guard.js +104 -39
- package/lib/external/mcp/handlers/knowledge.js +60 -36
- package/lib/external/mcp/handlers/search.js +43 -14
- package/lib/external/mcp/handlers/skill.js +120 -45
- package/lib/external/mcp/handlers/structure.js +240 -86
- package/lib/external/mcp/handlers/system.js +42 -12
- package/lib/external/mcp/handlers/wiki.js +58 -33
- package/lib/external/mcp/tools.js +306 -123
- package/lib/http/HttpServer.js +72 -47
- package/lib/http/middleware/RateLimiter.js +5 -3
- package/lib/http/middleware/errorHandler.js +6 -1
- package/lib/http/middleware/requestLogger.js +14 -3
- package/lib/http/middleware/roleResolver.js +30 -23
- package/lib/http/routes/ai.js +387 -265
- package/lib/http/routes/auth.js +81 -61
- package/lib/http/routes/candidates.js +430 -320
- package/lib/http/routes/commands.js +289 -189
- package/lib/http/routes/extract.js +158 -125
- package/lib/http/routes/guardRules.js +309 -217
- package/lib/http/routes/knowledge.js +213 -154
- package/lib/http/routes/modules.js +578 -0
- package/lib/http/routes/monitoring.js +6 -6
- package/lib/http/routes/recipes.js +104 -93
- package/lib/http/routes/search.js +361 -305
- package/lib/http/routes/skills.js +145 -98
- package/lib/http/routes/snippets.js +42 -30
- package/lib/http/routes/spm.js +3 -405
- package/lib/http/routes/violations.js +113 -93
- package/lib/http/routes/wiki.js +211 -170
- package/lib/http/utils/routeHelpers.js +3 -1
- package/lib/http/utils/sse-sessions.js +16 -6
- package/lib/http/utils/sse.js +15 -5
- package/lib/infrastructure/audit/AuditLogger.js +5 -2
- package/lib/infrastructure/audit/AuditStore.js +10 -7
- package/lib/infrastructure/cache/CacheService.js +3 -1
- package/lib/infrastructure/cache/GraphCache.js +8 -4
- package/lib/infrastructure/cache/UnifiedCacheAdapter.js +1 -1
- package/lib/infrastructure/config/ConfigLoader.js +9 -5
- package/lib/infrastructure/config/Defaults.js +30 -10
- package/lib/infrastructure/config/Paths.js +28 -8
- package/lib/infrastructure/config/TriggerSymbol.js +22 -10
- package/lib/infrastructure/database/DatabaseConnection.js +15 -10
- package/lib/infrastructure/database/migrations/001_initial_schema.js +0 -1
- package/lib/infrastructure/external/ClipboardManager.js +6 -2
- package/lib/infrastructure/external/NativeUi.js +50 -43
- package/lib/infrastructure/external/OpenBrowser.js +14 -17
- package/lib/infrastructure/external/XcodeAutomation.js +14 -258
- package/lib/infrastructure/logging/Logger.js +46 -30
- package/lib/infrastructure/monitoring/ErrorTracker.js +7 -5
- package/lib/infrastructure/monitoring/PerformanceMonitor.js +12 -4
- package/lib/infrastructure/paths/HeaderResolver.js +25 -9
- package/lib/infrastructure/paths/PathFinder.js +34 -12
- package/lib/infrastructure/plugin/PluginManager.js +26 -8
- package/lib/infrastructure/realtime/RealtimeService.js +2 -2
- package/lib/infrastructure/vector/Chunker.js +22 -7
- package/lib/infrastructure/vector/IndexingPipeline.js +46 -22
- package/lib/infrastructure/vector/JsonVectorAdapter.js +90 -53
- package/lib/infrastructure/vector/VectorStore.js +28 -10
- package/lib/injection/ServiceContainer.js +247 -93
- package/lib/platform/ios/index.js +63 -0
- package/lib/platform/ios/routes/spm.js +437 -0
- package/lib/platform/ios/snippet/PlaceholderConverter.js +55 -0
- package/lib/platform/ios/snippet/XcodeCodec.js +112 -0
- package/lib/{service → platform/ios}/spm/DependencyGraph.js +41 -17
- package/lib/{service → platform/ios}/spm/PackageSwiftParser.js +41 -14
- package/lib/{service → platform/ios}/spm/PolicyEngine.js +9 -4
- package/lib/platform/ios/spm/SpmDiscoverer.js +122 -0
- package/lib/{service → platform/ios}/spm/SpmService.js +385 -127
- package/lib/{service/automation → platform/ios/xcode}/SaveEventFilter.js +8 -7
- package/lib/platform/ios/xcode/XcodeAutomation.js +350 -0
- package/lib/{service/automation → platform/ios/xcode}/XcodeIntegration.js +325 -145
- package/lib/repository/base/BaseRepository.js +7 -9
- package/lib/repository/knowledge/KnowledgeRepository.impl.js +98 -75
- package/lib/repository/token/TokenUsageStore.js +4 -2
- package/lib/service/automation/ActionPipeline.js +1 -1
- package/lib/service/automation/AutomationOrchestrator.js +8 -4
- package/lib/service/automation/ContextCollector.js +7 -5
- package/lib/service/automation/DirectiveDetector.js +23 -16
- package/lib/service/automation/FileWatcher.js +112 -56
- package/lib/service/automation/TriggerResolver.js +6 -4
- package/lib/service/automation/handlers/AlinkHandler.js +24 -12
- package/lib/service/automation/handlers/CreateHandler.js +19 -20
- package/lib/service/automation/handlers/DraftHandler.js +14 -8
- package/lib/service/automation/handlers/GuardHandler.js +93 -63
- package/lib/service/automation/handlers/HeaderHandler.js +1 -6
- package/lib/service/automation/handlers/SearchHandler.js +155 -88
- package/lib/service/bootstrap/BootstrapTaskManager.js +77 -35
- package/lib/service/candidate/SimilarityService.js +25 -9
- package/lib/service/chat/AnalystAgent.js +50 -24
- package/lib/service/chat/CandidateGuardrail.js +143 -17
- package/lib/service/chat/ChatAgent.js +655 -260
- package/lib/service/chat/ContextWindow.js +116 -71
- package/lib/service/chat/ConversationStore.js +77 -36
- package/lib/service/chat/EpisodicConsolidator.js +47 -23
- package/lib/service/chat/HandoffProtocol.js +98 -22
- package/lib/service/chat/Memory.js +34 -14
- package/lib/service/chat/ProducerAgent.js +40 -20
- package/lib/service/chat/ProjectSemanticMemory.js +109 -78
- package/lib/service/chat/ReasoningLayer.js +148 -70
- package/lib/service/chat/ReasoningTrace.js +44 -32
- package/lib/service/chat/TaskPipeline.js +39 -19
- package/lib/service/chat/ToolRegistry.js +48 -29
- package/lib/service/chat/WorkingMemory.js +44 -18
- package/lib/service/chat/tools.js +1096 -494
- package/lib/service/context/RecipeExtractor.js +132 -51
- package/lib/service/cursor/CursorDeliveryPipeline.js +82 -37
- package/lib/service/cursor/KnowledgeCompressor.js +25 -22
- package/lib/service/cursor/RulesGenerator.js +13 -7
- package/lib/service/cursor/SkillsSyncer.js +77 -27
- package/lib/service/cursor/TokenBudget.js +2 -2
- package/lib/service/cursor/TopicClassifier.js +54 -20
- package/lib/service/guard/ComplianceReporter.js +55 -43
- package/lib/service/guard/ExclusionManager.js +67 -29
- package/lib/service/guard/GuardCheckEngine.js +381 -86
- package/lib/service/guard/GuardFeedbackLoop.js +22 -10
- package/lib/service/guard/GuardService.js +29 -19
- package/lib/service/guard/RuleLearner.js +55 -23
- package/lib/service/guard/SourceFileCollector.js +27 -20
- package/lib/service/guard/ViolationsStore.js +43 -38
- package/lib/service/knowledge/CodeEntityGraph.js +147 -82
- package/lib/service/knowledge/ConfidenceRouter.js +12 -10
- package/lib/service/knowledge/KnowledgeFileWriter.js +147 -56
- package/lib/service/knowledge/KnowledgeGraphService.js +81 -34
- package/lib/service/knowledge/KnowledgeService.js +222 -112
- package/lib/service/module/ModuleService.js +969 -0
- package/lib/service/quality/FeedbackCollector.js +27 -15
- package/lib/service/quality/QualityScorer.js +78 -24
- package/lib/service/recipe/RecipeCandidateValidator.js +110 -44
- package/lib/service/recipe/RecipeParser.js +78 -45
- package/lib/service/search/CoarseRanker.js +43 -28
- package/lib/service/search/CrossEncoderReranker.js +32 -21
- package/lib/service/search/InvertedIndex.js +21 -7
- package/lib/service/search/MultiSignalRanker.js +90 -28
- package/lib/service/search/RetrievalFunnel.js +45 -24
- package/lib/service/search/SearchEngine.js +255 -103
- package/lib/service/skills/EventAggregator.js +32 -15
- package/lib/service/skills/SignalCollector.js +140 -64
- package/lib/service/skills/SkillAdvisor.js +79 -42
- package/lib/service/skills/SkillHooks.js +16 -14
- package/lib/service/snippet/PlaceholderConverter.js +5 -0
- package/lib/service/snippet/SnippetFactory.js +116 -99
- package/lib/service/snippet/SnippetInstaller.js +234 -62
- package/lib/service/snippet/codecs/SnippetCodec.js +67 -0
- package/lib/service/snippet/codecs/VSCodeCodec.js +102 -0
- package/lib/service/snippet/codecs/XcodeCodec.js +5 -0
- package/lib/service/wiki/WikiGenerator.js +637 -263
- package/lib/shared/DimensionCopyRegistry.js +472 -0
- package/lib/shared/LanguageService.js +399 -0
- package/lib/shared/PathGuard.js +45 -28
- package/lib/shared/RecipeReadinessChecker.js +72 -12
- package/lib/shared/constants.js +41 -41
- package/lib/shared/errors/BaseError.js +2 -2
- package/lib/shared/errors/index.js +4 -4
- package/lib/shared/similarity.js +25 -8
- package/lib/shared/token-utils.js +6 -2
- package/lib/shared/utils/common.js +12 -4
- package/package.json +49 -13
- package/scripts/bench-real-projects.mjs +256 -0
- package/scripts/build-native-ui.js +30 -30
- package/scripts/clear-old-vector-index.js +5 -35
- package/scripts/clear-vector-cache.js +7 -37
- package/scripts/collect-test-project-stats.mjs +160 -0
- package/scripts/diagnose-mcp.js +41 -32
- package/scripts/ensure-parse-package.js +6 -9
- package/scripts/generate-recipe-drafts.js +116 -77
- package/scripts/init-db.js +3 -20
- package/scripts/init-snippets.js +305 -0
- package/scripts/init-vector-db.js +173 -170
- package/scripts/install-cursor-skill.js +148 -104
- package/scripts/install-full.js +8 -21
- package/scripts/install-vscode-copilot.js +106 -170
- package/scripts/migrate-md-to-knowledge.mjs +139 -151
- package/scripts/postinstall-safe.js +5 -17
- package/scripts/recipe-audit.js +106 -82
- package/scripts/release.js +283 -323
- package/scripts/setup-mcp-config.js +62 -72
- package/scripts/verify-context-api.js +20 -20
- package/skills/autosnippet-analysis/SKILL.md +10 -6
- package/skills/autosnippet-candidates/SKILL.md +27 -26
- package/skills/autosnippet-coldstart/SKILL.md +555 -38
- package/skills/autosnippet-concepts/SKILL.md +349 -337
- package/skills/autosnippet-create/SKILL.md +5 -5
- package/skills/autosnippet-reference-dart/SKILL.md +543 -0
- package/skills/autosnippet-reference-go/SKILL.md +539 -0
- package/skills/autosnippet-reference-java/SKILL.md +534 -0
- package/skills/autosnippet-reference-jsts/SKILL.md +41 -9
- package/skills/autosnippet-reference-kotlin/SKILL.md +526 -0
- package/skills/autosnippet-reference-objc/SKILL.md +29 -6
- package/skills/autosnippet-reference-python/SKILL.md +800 -0
- package/skills/autosnippet-reference-swift/SKILL.md +70 -14
- package/skills/autosnippet-structure/SKILL.md +4 -4
- package/templates/cursor-rules/autosnippet-conventions.mdc +2 -2
- package/templates/recipes-setup/README.md +2 -2
- package/templates/recipes-setup/_template.md +1 -1
- package/dashboard/dist/assets/index-Bun3ld_J.css +0 -1
- package/dashboard/dist/assets/index-_Sk_Dmg3.js +0 -143
- package/resources/asd-entry/main.swift +0 -159
- package/scripts/build-asd-entry.js +0 -51
- package/scripts/init-xcode-snippets.js +0 -311
- package/template.json +0 -39
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* AutoSnippet VSCode Copilot 安装脚本
|
|
5
|
-
*
|
|
5
|
+
*
|
|
6
6
|
* 功能:
|
|
7
7
|
* 1. 自动配置 VSCode 全局和工作区 settings.json
|
|
8
8
|
* 2. 创建推荐扩展配置 (.vscode/extensions.json)
|
|
@@ -22,22 +22,25 @@
|
|
|
22
22
|
* --quiet 安静模式(无输出)
|
|
23
23
|
*/
|
|
24
24
|
|
|
25
|
-
import { fileURLToPath } from 'node:url';
|
|
26
25
|
import { dirname } from 'node:path';
|
|
26
|
+
import { fileURLToPath } from 'node:url';
|
|
27
|
+
|
|
27
28
|
const __filename = fileURLToPath(import.meta.url);
|
|
28
29
|
const __dirname = dirname(__filename);
|
|
29
30
|
|
|
30
31
|
import fs from 'node:fs';
|
|
31
|
-
import path from 'node:path';
|
|
32
|
-
import os from 'node:os';
|
|
33
32
|
import { createRequire } from 'node:module';
|
|
33
|
+
import os from 'node:os';
|
|
34
|
+
import path from 'node:path';
|
|
35
|
+
|
|
34
36
|
const require = createRequire(import.meta.url);
|
|
35
37
|
|
|
36
38
|
const args = require('minimist')(process.argv.slice(2));
|
|
37
39
|
const projectPath = args.path || args.p || process.cwd();
|
|
38
40
|
|
|
39
41
|
// 检测是否在 AutoSnippet 仓库内执行
|
|
40
|
-
const isAutoSnippetRepo =
|
|
42
|
+
const isAutoSnippetRepo =
|
|
43
|
+
fs.existsSync(path.join(projectPath, 'bin/mcp-server.js')) &&
|
|
41
44
|
fs.existsSync(path.join(projectPath, 'bin/asd')) &&
|
|
42
45
|
fs.existsSync(path.join(projectPath, 'package.json'));
|
|
43
46
|
|
|
@@ -54,12 +57,11 @@ const colors = {
|
|
|
54
57
|
green: '\x1b[32m',
|
|
55
58
|
yellow: '\x1b[33m',
|
|
56
59
|
blue: '\x1b[34m',
|
|
57
|
-
red: '\x1b[31m'
|
|
60
|
+
red: '\x1b[31m',
|
|
58
61
|
};
|
|
59
62
|
|
|
60
63
|
function log(msg, color = 'reset') {
|
|
61
64
|
if (!isQuiet) {
|
|
62
|
-
console.log(colors[color] + msg + colors.reset);
|
|
63
65
|
}
|
|
64
66
|
}
|
|
65
67
|
|
|
@@ -71,41 +73,41 @@ function error(msg) {
|
|
|
71
73
|
|
|
72
74
|
function getVSCodeSettingsPath(isGlobal = true) {
|
|
73
75
|
const platform = os.platform();
|
|
74
|
-
|
|
76
|
+
|
|
75
77
|
if (isGlobal) {
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
78
|
+
if (platform === 'darwin') {
|
|
79
|
+
return path.join(os.homedir(), 'Library/Application Support/Code/User/settings.json');
|
|
80
|
+
} else if (platform === 'win32') {
|
|
81
|
+
return path.join(os.getenv('APPDATA') || os.homedir(), 'Code/User/settings.json');
|
|
82
|
+
} else {
|
|
83
|
+
return path.join(os.homedir(), '.config/Code/User/settings.json');
|
|
84
|
+
}
|
|
83
85
|
} else {
|
|
84
|
-
|
|
86
|
+
return path.join(projectPath, '.vscode/settings.json');
|
|
85
87
|
}
|
|
86
88
|
}
|
|
87
89
|
|
|
88
90
|
function readJsonFile(filePath, defaultValue = {}) {
|
|
89
91
|
if (!fs.existsSync(filePath)) {
|
|
90
|
-
|
|
92
|
+
return defaultValue;
|
|
91
93
|
}
|
|
92
94
|
try {
|
|
93
|
-
|
|
94
|
-
|
|
95
|
+
const content = fs.readFileSync(filePath, 'utf8');
|
|
96
|
+
return JSON.parse(content);
|
|
95
97
|
} catch (e) {
|
|
96
|
-
|
|
97
|
-
|
|
98
|
+
log(`⚠️ 无法解析 ${filePath}: ${e.message}`, 'yellow');
|
|
99
|
+
return defaultValue;
|
|
98
100
|
}
|
|
99
101
|
}
|
|
100
102
|
|
|
101
103
|
function writeJsonFile(filePath, data) {
|
|
102
104
|
try {
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
105
|
+
fs.mkdirSync(path.dirname(filePath), { recursive: true });
|
|
106
|
+
fs.writeFileSync(filePath, `${JSON.stringify(data, null, 2)}\n`, 'utf8');
|
|
107
|
+
return true;
|
|
106
108
|
} catch (e) {
|
|
107
|
-
|
|
108
|
-
|
|
109
|
+
error(`✗ 无法写入 ${filePath}: ${e.message}`);
|
|
110
|
+
return false;
|
|
109
111
|
}
|
|
110
112
|
}
|
|
111
113
|
|
|
@@ -114,9 +116,9 @@ function writeJsonFile(filePath, data) {
|
|
|
114
116
|
function getMcpServerPath() {
|
|
115
117
|
const scriptPath = path.join(projectPath, 'bin/mcp-server.js');
|
|
116
118
|
if (!fs.existsSync(scriptPath)) {
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
119
|
+
error(`✗ MCP Server 不存在: ${scriptPath}`);
|
|
120
|
+
error(` 请确保在 AutoSnippet 项目目录下运行此脚本`);
|
|
121
|
+
process.exit(1);
|
|
120
122
|
}
|
|
121
123
|
return scriptPath;
|
|
122
124
|
}
|
|
@@ -124,88 +126,49 @@ function getMcpServerPath() {
|
|
|
124
126
|
// ============ 配置 VSCode settings.json ============
|
|
125
127
|
|
|
126
128
|
function configureVSCodeSettings() {
|
|
127
|
-
log('\n📝 配置 VSCode
|
|
128
|
-
|
|
129
|
+
log('\n📝 配置 VSCode MCP 设置...', 'blue');
|
|
130
|
+
|
|
129
131
|
if (isAutoSnippetRepo && !args.path) {
|
|
130
|
-
|
|
131
|
-
|
|
132
|
+
log('ℹ️ 检测到在 AutoSnippet 仓库内执行,仅配置全局设置', 'yellow');
|
|
133
|
+
log(' 如需为其他项目配置,请使用: --path /path/to/project', 'yellow');
|
|
132
134
|
}
|
|
133
|
-
|
|
135
|
+
|
|
134
136
|
const mcpServerPath = getMcpServerPath();
|
|
135
|
-
const
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
137
|
+
const mcpServerConfig = {
|
|
138
|
+
type: 'stdio',
|
|
139
|
+
command: 'node',
|
|
140
|
+
args: [mcpServerPath],
|
|
141
|
+
env: {
|
|
142
|
+
ASD_UI_URL: 'http://localhost:3000',
|
|
143
|
+
},
|
|
142
144
|
};
|
|
143
145
|
|
|
144
|
-
let
|
|
145
|
-
let workspaceConfigured = false;
|
|
146
|
-
|
|
147
|
-
// 全局配置
|
|
148
|
-
if (configGlobal) {
|
|
149
|
-
const globalSettingsPath = getVSCodeSettingsPath(true);
|
|
150
|
-
const globalSettings = readJsonFile(globalSettingsPath, {});
|
|
151
|
-
|
|
152
|
-
if (!globalSettings['github.copilot.mcp']) {
|
|
153
|
-
globalSettings['github.copilot.mcp'] = {};
|
|
154
|
-
}
|
|
155
|
-
if (!globalSettings['github.copilot.mcp'].servers) {
|
|
156
|
-
globalSettings['github.copilot.mcp'].servers = [];
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
const existingIndex = globalSettings['github.copilot.mcp'].servers.findIndex(
|
|
160
|
-
s => s.name === 'autosnippet'
|
|
161
|
-
);
|
|
162
|
-
|
|
163
|
-
if (existingIndex >= 0) {
|
|
164
|
-
globalSettings['github.copilot.mcp'].servers[existingIndex] = mcpConfig;
|
|
165
|
-
} else {
|
|
166
|
-
globalSettings['github.copilot.mcp'].servers.push(mcpConfig);
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
// 添加推荐的全局设置
|
|
170
|
-
globalSettings['github.copilot.enable'] = globalSettings['github.copilot.enable'] || {};
|
|
171
|
-
globalSettings['github.copilot.enable']['*'] = true;
|
|
172
|
-
globalSettings['github.copilot.chat.localeOverride'] = 'zh-CN';
|
|
146
|
+
let configured = false;
|
|
173
147
|
|
|
174
|
-
|
|
175
|
-
log(`✅ 全局配置完成: ${globalSettingsPath}`, 'green');
|
|
176
|
-
globalConfigured = true;
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
// 工作区配置
|
|
148
|
+
// 工作区配置 → .vscode/mcp.json(新标准格式)
|
|
181
149
|
if (configWorkspace) {
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
const existingIndex = workspaceSettings['github.copilot.mcp'].servers.findIndex(
|
|
193
|
-
s => s.name === 'autosnippet'
|
|
194
|
-
);
|
|
150
|
+
const vscodeDir = path.join(projectPath, '.vscode');
|
|
151
|
+
const mcpConfigPath = path.join(vscodeDir, 'mcp.json');
|
|
152
|
+
|
|
153
|
+
let config = {};
|
|
154
|
+
if (fs.existsSync(mcpConfigPath)) {
|
|
155
|
+
try {
|
|
156
|
+
config = JSON.parse(fs.readFileSync(mcpConfigPath, 'utf8'));
|
|
157
|
+
} catch { /* ignore */ }
|
|
158
|
+
}
|
|
195
159
|
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
}
|
|
160
|
+
if (!config.servers) {
|
|
161
|
+
config.servers = {};
|
|
162
|
+
}
|
|
163
|
+
config.servers.autosnippet = mcpServerConfig;
|
|
201
164
|
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
165
|
+
if (writeJsonFile(mcpConfigPath, config)) {
|
|
166
|
+
log(`✅ 工作区 MCP 配置完成: ${mcpConfigPath}`, 'green');
|
|
167
|
+
configured = true;
|
|
168
|
+
}
|
|
206
169
|
}
|
|
207
170
|
|
|
208
|
-
return
|
|
171
|
+
return configured;
|
|
209
172
|
}
|
|
210
173
|
|
|
211
174
|
// ============ 创建推荐扩展配置 ============
|
|
@@ -215,16 +178,13 @@ function createExtensionsJson() {
|
|
|
215
178
|
|
|
216
179
|
const extensionsPath = path.join(projectPath, '.vscode/extensions.json');
|
|
217
180
|
const extensions = {
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
'GitHub.copilot-chat'
|
|
221
|
-
],
|
|
222
|
-
unwantedRecommendations: []
|
|
181
|
+
recommendations: ['GitHub.copilot', 'GitHub.copilot-chat'],
|
|
182
|
+
unwantedRecommendations: [],
|
|
223
183
|
};
|
|
224
184
|
|
|
225
185
|
if (writeJsonFile(extensionsPath, extensions)) {
|
|
226
|
-
|
|
227
|
-
|
|
186
|
+
log(`✅ 扩展推荐配置完成: ${extensionsPath}`, 'green');
|
|
187
|
+
return true;
|
|
228
188
|
}
|
|
229
189
|
return false;
|
|
230
190
|
}
|
|
@@ -235,95 +195,74 @@ function createCopilotInstructions() {
|
|
|
235
195
|
log('\n📖 生成项目指令 (.github/copilot-instructions.md)...', 'blue');
|
|
236
196
|
|
|
237
197
|
const instructionsPath = path.join(projectPath, '.github/copilot-instructions.md');
|
|
238
|
-
|
|
198
|
+
|
|
239
199
|
// 检查是否已存在
|
|
240
200
|
if (fs.existsSync(instructionsPath)) {
|
|
241
|
-
|
|
242
|
-
|
|
201
|
+
log(`✓ 项目指令已存在,跳过创建`, 'yellow');
|
|
202
|
+
return true;
|
|
243
203
|
}
|
|
244
204
|
|
|
245
205
|
// 从模板文件读取内容
|
|
246
206
|
const templatePath = path.join(__dirname, '..', 'templates', 'copilot-instructions.md');
|
|
247
207
|
if (!fs.existsSync(templatePath)) {
|
|
248
|
-
|
|
249
|
-
|
|
208
|
+
error(`✗ 模板文件不存在: ${templatePath}`);
|
|
209
|
+
return false;
|
|
250
210
|
}
|
|
251
211
|
|
|
252
212
|
const instructions = fs.readFileSync(templatePath, 'utf8');
|
|
253
213
|
|
|
254
214
|
try {
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
215
|
+
fs.mkdirSync(path.dirname(instructionsPath), { recursive: true });
|
|
216
|
+
fs.writeFileSync(instructionsPath, instructions, 'utf8');
|
|
217
|
+
log(`✅ 项目指令生成完成: ${instructionsPath}`, 'green');
|
|
218
|
+
return true;
|
|
259
219
|
} catch (e) {
|
|
260
|
-
|
|
261
|
-
|
|
220
|
+
error(`✗ 生成项目指令失败: ${e.message}`);
|
|
221
|
+
return false;
|
|
262
222
|
}
|
|
263
223
|
}
|
|
264
224
|
|
|
265
225
|
// ============ 验证配置 ============
|
|
266
226
|
|
|
267
227
|
function verifyConfiguration() {
|
|
268
|
-
if (skipVerify)
|
|
228
|
+
if (skipVerify) {
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
269
231
|
|
|
270
232
|
log('\n🔍 验证配置...', 'blue');
|
|
271
233
|
|
|
272
|
-
//
|
|
273
|
-
if (configGlobal) {
|
|
274
|
-
const globalSettingsPath = getVSCodeSettingsPath(true);
|
|
275
|
-
if (fs.existsSync(globalSettingsPath)) {
|
|
276
|
-
const settings = readJsonFile(globalSettingsPath, {});
|
|
277
|
-
if (settings['github.copilot.mcp'] && settings['github.copilot.mcp'].servers) {
|
|
278
|
-
const hasAutosnippet = settings['github.copilot.mcp'].servers.some(
|
|
279
|
-
s => s.name === 'autosnippet'
|
|
280
|
-
);
|
|
281
|
-
if (hasAutosnippet) {
|
|
282
|
-
log(`✅ VSCode 全局 MCP 配置验证成功`, 'green');
|
|
283
|
-
} else {
|
|
284
|
-
log(`⚠️ 未在全局设置中找到 autosnippet MCP 服务器`, 'yellow');
|
|
285
|
-
}
|
|
286
|
-
} else {
|
|
287
|
-
log(`⚠️ 全局设置中未找到 MCP 配置`, 'yellow');
|
|
288
|
-
}
|
|
289
|
-
}
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
// 检查工作区设置
|
|
234
|
+
// 检查工作区 MCP 配置(.vscode/mcp.json)
|
|
293
235
|
if (configWorkspace) {
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
log(`✅ VSCode 工作区 MCP 配置验证成功`, 'green');
|
|
236
|
+
const mcpConfigPath = path.join(projectPath, '.vscode/mcp.json');
|
|
237
|
+
if (fs.existsSync(mcpConfigPath)) {
|
|
238
|
+
const config = readJsonFile(mcpConfigPath, {});
|
|
239
|
+
if (config.servers?.autosnippet) {
|
|
240
|
+
log(`✅ VSCode 工作区 MCP 配置验证成功 (.vscode/mcp.json)`, 'green');
|
|
241
|
+
} else {
|
|
242
|
+
log(`⚠️ .vscode/mcp.json 中未找到 autosnippet 服务器`, 'yellow');
|
|
243
|
+
}
|
|
303
244
|
} else {
|
|
304
|
-
log(`⚠️
|
|
305
|
-
}
|
|
245
|
+
log(`⚠️ 未找到 .vscode/mcp.json`, 'yellow');
|
|
306
246
|
}
|
|
307
247
|
}
|
|
308
|
-
}
|
|
309
248
|
|
|
310
249
|
// 检查推荐扩展
|
|
311
250
|
const extensionsPath = path.join(projectPath, '.vscode/extensions.json');
|
|
312
251
|
if (fs.existsSync(extensionsPath)) {
|
|
313
|
-
|
|
252
|
+
log(`✅ 推荐扩展配置存在`, 'green');
|
|
314
253
|
}
|
|
315
254
|
|
|
316
255
|
// 检查项目指令
|
|
317
256
|
const instructionsPath = path.join(projectPath, '.github/copilot-instructions.md');
|
|
318
257
|
if (fs.existsSync(instructionsPath)) {
|
|
319
|
-
|
|
258
|
+
log(`✅ 项目指令存在`, 'green');
|
|
320
259
|
}
|
|
321
260
|
}
|
|
322
261
|
|
|
323
262
|
// ============ 提供快速启动指导 ============
|
|
324
263
|
|
|
325
264
|
function printQuickStart() {
|
|
326
|
-
log(
|
|
265
|
+
log(`\n${'='.repeat(60)}`, 'blue');
|
|
327
266
|
log('🎉 VSCode Copilot 配置完成!', 'green');
|
|
328
267
|
log('='.repeat(60), 'blue');
|
|
329
268
|
|
|
@@ -352,20 +291,17 @@ function printQuickStart() {
|
|
|
352
291
|
log(` ${path.join(projectPath, '.github/copilot-instructions.md')}`, 'yellow');
|
|
353
292
|
|
|
354
293
|
log('\n📝 配置位置:');
|
|
355
|
-
if (configGlobal) {
|
|
356
|
-
log(` 全局: ${getVSCodeSettingsPath(true)}`, 'yellow');
|
|
357
|
-
}
|
|
358
294
|
if (configWorkspace) {
|
|
359
|
-
|
|
295
|
+
log(` MCP: ${path.join(projectPath, '.vscode/mcp.json')}`, 'yellow');
|
|
360
296
|
}
|
|
361
297
|
|
|
362
298
|
log('\n💡 提示:');
|
|
363
299
|
log(' - 首次配置需要重启 VSCode');
|
|
364
300
|
log(' - MCP 服务器需要 Node.js 18.0+');
|
|
365
301
|
log(' - Dashboard 运行在 http://localhost:3000');
|
|
366
|
-
log(' -
|
|
302
|
+
log(' - MCP 配置位于 .vscode/mcp.json(可加入版本控制共享给团队)\n');
|
|
367
303
|
|
|
368
|
-
log('='.repeat(60)
|
|
304
|
+
log(`${'='.repeat(60)}\n`, 'blue');
|
|
369
305
|
}
|
|
370
306
|
|
|
371
307
|
// ============ 主程序 ============
|
|
@@ -375,9 +311,9 @@ async function main() {
|
|
|
375
311
|
log(`📍 项目路径: ${projectPath}\n`, 'blue');
|
|
376
312
|
|
|
377
313
|
const results = {
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
314
|
+
settings: false,
|
|
315
|
+
extensions: false,
|
|
316
|
+
instructions: false,
|
|
381
317
|
};
|
|
382
318
|
|
|
383
319
|
// 配置 settings.json
|
|
@@ -396,18 +332,18 @@ async function main() {
|
|
|
396
332
|
printQuickStart();
|
|
397
333
|
|
|
398
334
|
// 返回状态
|
|
399
|
-
const allSuccess = Object.values(results).every(v => v);
|
|
335
|
+
const allSuccess = Object.values(results).every((v) => v);
|
|
400
336
|
if (allSuccess) {
|
|
401
|
-
|
|
402
|
-
|
|
337
|
+
log('✅ 所有配置完成!', 'green');
|
|
338
|
+
process.exit(0);
|
|
403
339
|
} else {
|
|
404
|
-
|
|
405
|
-
|
|
340
|
+
log('⚠️ 部分配置可能未完成,请检查上述消息', 'yellow');
|
|
341
|
+
process.exit(1);
|
|
406
342
|
}
|
|
407
343
|
}
|
|
408
344
|
|
|
409
345
|
// 运行
|
|
410
|
-
main().catch(err => {
|
|
346
|
+
main().catch((err) => {
|
|
411
347
|
error(`✗ 配置失败: ${err.message}`);
|
|
412
348
|
process.exit(1);
|
|
413
349
|
});
|