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.
- package/README.md +230 -324
- package/bin/api-server.js +1 -1
- package/bin/cli.js +204 -244
- package/bin/mcp-server.js +5 -3
- 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 +439 -277
- package/lib/cli/UpgradeService.js +63 -100
- 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 +759 -243
- 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 +146 -145
- 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 +60 -52
- 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
|
}
|
|
@@ -125,20 +127,20 @@ function getMcpServerPath() {
|
|
|
125
127
|
|
|
126
128
|
function configureVSCodeSettings() {
|
|
127
129
|
log('\n📝 配置 VSCode settings.json...', 'blue');
|
|
128
|
-
|
|
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
137
|
const mcpConfig = {
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
138
|
+
name: 'autosnippet',
|
|
139
|
+
command: 'node',
|
|
140
|
+
args: [mcpServerPath],
|
|
141
|
+
env: {
|
|
142
|
+
ASD_UI_URL: 'http://localhost:3000',
|
|
143
|
+
},
|
|
142
144
|
};
|
|
143
145
|
|
|
144
146
|
let globalConfigured = false;
|
|
@@ -146,63 +148,63 @@ function configureVSCodeSettings() {
|
|
|
146
148
|
|
|
147
149
|
// 全局配置
|
|
148
150
|
if (configGlobal) {
|
|
149
|
-
|
|
150
|
-
|
|
151
|
+
const globalSettingsPath = getVSCodeSettingsPath(true);
|
|
152
|
+
const globalSettings = readJsonFile(globalSettingsPath, {});
|
|
151
153
|
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
154
|
+
if (!globalSettings['github.copilot.mcp']) {
|
|
155
|
+
globalSettings['github.copilot.mcp'] = {};
|
|
156
|
+
}
|
|
157
|
+
if (!globalSettings['github.copilot.mcp'].servers) {
|
|
158
|
+
globalSettings['github.copilot.mcp'].servers = [];
|
|
159
|
+
}
|
|
158
160
|
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
161
|
+
const existingIndex = globalSettings['github.copilot.mcp'].servers.findIndex(
|
|
162
|
+
(s) => s.name === 'autosnippet'
|
|
163
|
+
);
|
|
162
164
|
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
165
|
+
if (existingIndex >= 0) {
|
|
166
|
+
globalSettings['github.copilot.mcp'].servers[existingIndex] = mcpConfig;
|
|
167
|
+
} else {
|
|
168
|
+
globalSettings['github.copilot.mcp'].servers.push(mcpConfig);
|
|
169
|
+
}
|
|
168
170
|
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
171
|
+
// 添加推荐的全局设置
|
|
172
|
+
globalSettings['github.copilot.enable'] = globalSettings['github.copilot.enable'] || {};
|
|
173
|
+
globalSettings['github.copilot.enable']['*'] = true;
|
|
174
|
+
globalSettings['github.copilot.chat.localeOverride'] = 'zh-CN';
|
|
173
175
|
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
176
|
+
if (writeJsonFile(globalSettingsPath, globalSettings)) {
|
|
177
|
+
log(`✅ 全局配置完成: ${globalSettingsPath}`, 'green');
|
|
178
|
+
globalConfigured = true;
|
|
179
|
+
}
|
|
178
180
|
}
|
|
179
181
|
|
|
180
182
|
// 工作区配置
|
|
181
183
|
if (configWorkspace) {
|
|
182
|
-
|
|
183
|
-
|
|
184
|
+
const workspaceSettingsPath = getVSCodeSettingsPath(false);
|
|
185
|
+
const workspaceSettings = readJsonFile(workspaceSettingsPath, {});
|
|
184
186
|
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
187
|
+
if (!workspaceSettings['github.copilot.mcp']) {
|
|
188
|
+
workspaceSettings['github.copilot.mcp'] = {};
|
|
189
|
+
}
|
|
190
|
+
if (!workspaceSettings['github.copilot.mcp'].servers) {
|
|
191
|
+
workspaceSettings['github.copilot.mcp'].servers = [];
|
|
192
|
+
}
|
|
191
193
|
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
194
|
+
const existingIndex = workspaceSettings['github.copilot.mcp'].servers.findIndex(
|
|
195
|
+
(s) => s.name === 'autosnippet'
|
|
196
|
+
);
|
|
195
197
|
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
198
|
+
if (existingIndex >= 0) {
|
|
199
|
+
workspaceSettings['github.copilot.mcp'].servers[existingIndex] = mcpConfig;
|
|
200
|
+
} else {
|
|
201
|
+
workspaceSettings['github.copilot.mcp'].servers.push(mcpConfig);
|
|
202
|
+
}
|
|
201
203
|
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
204
|
+
if (writeJsonFile(workspaceSettingsPath, workspaceSettings)) {
|
|
205
|
+
log(`✅ 工作区配置完成: ${workspaceSettingsPath}`, 'green');
|
|
206
|
+
workspaceConfigured = true;
|
|
207
|
+
}
|
|
206
208
|
}
|
|
207
209
|
|
|
208
210
|
return globalConfigured || workspaceConfigured;
|
|
@@ -215,16 +217,13 @@ function createExtensionsJson() {
|
|
|
215
217
|
|
|
216
218
|
const extensionsPath = path.join(projectPath, '.vscode/extensions.json');
|
|
217
219
|
const extensions = {
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
'GitHub.copilot-chat'
|
|
221
|
-
],
|
|
222
|
-
unwantedRecommendations: []
|
|
220
|
+
recommendations: ['GitHub.copilot', 'GitHub.copilot-chat'],
|
|
221
|
+
unwantedRecommendations: [],
|
|
223
222
|
};
|
|
224
223
|
|
|
225
224
|
if (writeJsonFile(extensionsPath, extensions)) {
|
|
226
|
-
|
|
227
|
-
|
|
225
|
+
log(`✅ 扩展推荐配置完成: ${extensionsPath}`, 'green');
|
|
226
|
+
return true;
|
|
228
227
|
}
|
|
229
228
|
return false;
|
|
230
229
|
}
|
|
@@ -235,95 +234,97 @@ function createCopilotInstructions() {
|
|
|
235
234
|
log('\n📖 生成项目指令 (.github/copilot-instructions.md)...', 'blue');
|
|
236
235
|
|
|
237
236
|
const instructionsPath = path.join(projectPath, '.github/copilot-instructions.md');
|
|
238
|
-
|
|
237
|
+
|
|
239
238
|
// 检查是否已存在
|
|
240
239
|
if (fs.existsSync(instructionsPath)) {
|
|
241
|
-
|
|
242
|
-
|
|
240
|
+
log(`✓ 项目指令已存在,跳过创建`, 'yellow');
|
|
241
|
+
return true;
|
|
243
242
|
}
|
|
244
243
|
|
|
245
244
|
// 从模板文件读取内容
|
|
246
245
|
const templatePath = path.join(__dirname, '..', 'templates', 'copilot-instructions.md');
|
|
247
246
|
if (!fs.existsSync(templatePath)) {
|
|
248
|
-
|
|
249
|
-
|
|
247
|
+
error(`✗ 模板文件不存在: ${templatePath}`);
|
|
248
|
+
return false;
|
|
250
249
|
}
|
|
251
250
|
|
|
252
251
|
const instructions = fs.readFileSync(templatePath, 'utf8');
|
|
253
252
|
|
|
254
253
|
try {
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
254
|
+
fs.mkdirSync(path.dirname(instructionsPath), { recursive: true });
|
|
255
|
+
fs.writeFileSync(instructionsPath, instructions, 'utf8');
|
|
256
|
+
log(`✅ 项目指令生成完成: ${instructionsPath}`, 'green');
|
|
257
|
+
return true;
|
|
259
258
|
} catch (e) {
|
|
260
|
-
|
|
261
|
-
|
|
259
|
+
error(`✗ 生成项目指令失败: ${e.message}`);
|
|
260
|
+
return false;
|
|
262
261
|
}
|
|
263
262
|
}
|
|
264
263
|
|
|
265
264
|
// ============ 验证配置 ============
|
|
266
265
|
|
|
267
266
|
function verifyConfiguration() {
|
|
268
|
-
if (skipVerify)
|
|
267
|
+
if (skipVerify) {
|
|
268
|
+
return;
|
|
269
|
+
}
|
|
269
270
|
|
|
270
271
|
log('\n🔍 验证配置...', 'blue');
|
|
271
272
|
|
|
272
273
|
// 检查全局设置
|
|
273
274
|
if (configGlobal) {
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
275
|
+
const globalSettingsPath = getVSCodeSettingsPath(true);
|
|
276
|
+
if (fs.existsSync(globalSettingsPath)) {
|
|
277
|
+
const settings = readJsonFile(globalSettingsPath, {});
|
|
278
|
+
if (settings['github.copilot.mcp']?.servers) {
|
|
279
|
+
const hasAutosnippet = settings['github.copilot.mcp'].servers.some(
|
|
280
|
+
(s) => s.name === 'autosnippet'
|
|
281
|
+
);
|
|
282
|
+
if (hasAutosnippet) {
|
|
283
|
+
log(`✅ VSCode 全局 MCP 配置验证成功`, 'green');
|
|
284
|
+
} else {
|
|
285
|
+
log(`⚠️ 未在全局设置中找到 autosnippet MCP 服务器`, 'yellow');
|
|
286
|
+
}
|
|
287
|
+
} else {
|
|
288
|
+
log(`⚠️ 全局设置中未找到 MCP 配置`, 'yellow');
|
|
289
|
+
}
|
|
288
290
|
}
|
|
289
291
|
}
|
|
290
|
-
}
|
|
291
292
|
|
|
292
293
|
// 检查工作区设置
|
|
293
294
|
if (configWorkspace) {
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
295
|
+
const workspaceSettingsPath = getVSCodeSettingsPath(false);
|
|
296
|
+
if (fs.existsSync(workspaceSettingsPath)) {
|
|
297
|
+
const settings = readJsonFile(workspaceSettingsPath, {});
|
|
298
|
+
if (settings['github.copilot.mcp']?.servers) {
|
|
299
|
+
const hasAutosnippet = settings['github.copilot.mcp'].servers.some(
|
|
300
|
+
(s) => s.name === 'autosnippet'
|
|
301
|
+
);
|
|
302
|
+
if (hasAutosnippet) {
|
|
303
|
+
log(`✅ VSCode 工作区 MCP 配置验证成功`, 'green');
|
|
304
|
+
} else {
|
|
305
|
+
log(`⚠️ 未在工作区设置中找到 autosnippet MCP 服务器`, 'yellow');
|
|
306
|
+
}
|
|
307
|
+
}
|
|
305
308
|
}
|
|
306
|
-
}
|
|
307
|
-
}
|
|
308
309
|
}
|
|
309
310
|
|
|
310
311
|
// 检查推荐扩展
|
|
311
312
|
const extensionsPath = path.join(projectPath, '.vscode/extensions.json');
|
|
312
313
|
if (fs.existsSync(extensionsPath)) {
|
|
313
|
-
|
|
314
|
+
log(`✅ 推荐扩展配置存在`, 'green');
|
|
314
315
|
}
|
|
315
316
|
|
|
316
317
|
// 检查项目指令
|
|
317
318
|
const instructionsPath = path.join(projectPath, '.github/copilot-instructions.md');
|
|
318
319
|
if (fs.existsSync(instructionsPath)) {
|
|
319
|
-
|
|
320
|
+
log(`✅ 项目指令存在`, 'green');
|
|
320
321
|
}
|
|
321
322
|
}
|
|
322
323
|
|
|
323
324
|
// ============ 提供快速启动指导 ============
|
|
324
325
|
|
|
325
326
|
function printQuickStart() {
|
|
326
|
-
log(
|
|
327
|
+
log(`\n${'='.repeat(60)}`, 'blue');
|
|
327
328
|
log('🎉 VSCode Copilot 配置完成!', 'green');
|
|
328
329
|
log('='.repeat(60), 'blue');
|
|
329
330
|
|
|
@@ -353,10 +354,10 @@ function printQuickStart() {
|
|
|
353
354
|
|
|
354
355
|
log('\n📝 配置位置:');
|
|
355
356
|
if (configGlobal) {
|
|
356
|
-
|
|
357
|
+
log(` 全局: ${getVSCodeSettingsPath(true)}`, 'yellow');
|
|
357
358
|
}
|
|
358
359
|
if (configWorkspace) {
|
|
359
|
-
|
|
360
|
+
log(` 工作区: ${getVSCodeSettingsPath(false)}`, 'yellow');
|
|
360
361
|
}
|
|
361
362
|
|
|
362
363
|
log('\n💡 提示:');
|
|
@@ -365,7 +366,7 @@ function printQuickStart() {
|
|
|
365
366
|
log(' - Dashboard 运行在 http://localhost:3000');
|
|
366
367
|
log(' - 可在 VSCode 设置中搜索 "copilot.mcp" 查看配置\n');
|
|
367
368
|
|
|
368
|
-
log('='.repeat(60)
|
|
369
|
+
log(`${'='.repeat(60)}\n`, 'blue');
|
|
369
370
|
}
|
|
370
371
|
|
|
371
372
|
// ============ 主程序 ============
|
|
@@ -375,9 +376,9 @@ async function main() {
|
|
|
375
376
|
log(`📍 项目路径: ${projectPath}\n`, 'blue');
|
|
376
377
|
|
|
377
378
|
const results = {
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
379
|
+
settings: false,
|
|
380
|
+
extensions: false,
|
|
381
|
+
instructions: false,
|
|
381
382
|
};
|
|
382
383
|
|
|
383
384
|
// 配置 settings.json
|
|
@@ -396,18 +397,18 @@ async function main() {
|
|
|
396
397
|
printQuickStart();
|
|
397
398
|
|
|
398
399
|
// 返回状态
|
|
399
|
-
const allSuccess = Object.values(results).every(v => v);
|
|
400
|
+
const allSuccess = Object.values(results).every((v) => v);
|
|
400
401
|
if (allSuccess) {
|
|
401
|
-
|
|
402
|
-
|
|
402
|
+
log('✅ 所有配置完成!', 'green');
|
|
403
|
+
process.exit(0);
|
|
403
404
|
} else {
|
|
404
|
-
|
|
405
|
-
|
|
405
|
+
log('⚠️ 部分配置可能未完成,请检查上述消息', 'yellow');
|
|
406
|
+
process.exit(1);
|
|
406
407
|
}
|
|
407
408
|
}
|
|
408
409
|
|
|
409
410
|
// 运行
|
|
410
|
-
main().catch(err => {
|
|
411
|
+
main().catch((err) => {
|
|
411
412
|
error(`✗ 配置失败: ${err.message}`);
|
|
412
413
|
process.exit(1);
|
|
413
414
|
});
|