autosnippet 3.3.5 → 3.3.7
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/dashboard/dist/assets/icons-FHns2ypa.js +1 -0
- package/dashboard/dist/assets/index-BRJv5Y3r.js +135 -0
- package/dashboard/dist/assets/index-DzoB7kxK.css +1 -0
- package/dashboard/dist/index.html +3 -3
- package/dist/bin/api-server.js +1 -0
- package/dist/bin/cli.d.ts +1 -0
- package/dist/bin/cli.js +137 -9
- package/dist/lib/agent/AgentFactory.d.ts +0 -17
- package/dist/lib/agent/AgentFactory.js +1 -25
- package/dist/lib/agent/AgentRuntime.d.ts +2 -2
- package/dist/lib/agent/AgentRuntime.js +26 -18
- package/dist/lib/agent/capabilities.d.ts +11 -0
- package/dist/lib/agent/capabilities.js +29 -5
- package/dist/lib/agent/context/ExplorationTracker.js +10 -1
- package/dist/lib/agent/context/exploration/ExplorationStrategies.d.ts +2 -0
- package/dist/lib/agent/context/exploration/ExplorationStrategies.js +2 -2
- package/dist/lib/agent/domain/ChatAgentTasks.js +4 -0
- package/dist/lib/agent/domain/insight-analyst.d.ts +47 -3
- package/dist/lib/agent/domain/insight-analyst.js +111 -11
- package/dist/lib/agent/domain/insight-evolver.d.ts +69 -0
- package/dist/lib/agent/domain/insight-evolver.js +230 -0
- package/dist/lib/agent/domain/insight-gate.d.ts +42 -0
- package/dist/lib/agent/domain/insight-gate.js +41 -0
- package/dist/lib/agent/domain/insight-producer.d.ts +27 -2
- package/dist/lib/agent/domain/insight-producer.js +60 -5
- package/dist/lib/agent/domain/scan-prompts.js +10 -7
- package/dist/lib/agent/forced-summary.js +7 -2
- package/dist/lib/agent/memory/ActiveContext.d.ts +2 -28
- package/dist/lib/agent/memory/MemoryCoordinator.d.ts +2 -2
- package/dist/lib/agent/memory/SessionStore.d.ts +6 -12
- package/dist/lib/agent/memory/SessionStore.js +9 -15
- package/dist/lib/agent/memory/memory-flush-contract.d.ts +49 -0
- package/dist/lib/agent/memory/memory-flush-contract.js +16 -0
- package/dist/lib/agent/memory/session-store-schema.d.ts +20 -0
- package/dist/lib/agent/memory/session-store-schema.js +41 -0
- package/dist/lib/agent/presets.d.ts +89 -1
- package/dist/lib/agent/presets.js +53 -5
- package/dist/lib/agent/tools/_shared.d.ts +7 -15
- package/dist/lib/agent/tools/_shared.js +20 -21
- package/dist/lib/agent/tools/composite.d.ts +25 -22
- package/dist/lib/agent/tools/composite.js +108 -109
- package/dist/lib/agent/tools/evolution-tools.d.ts +145 -0
- package/dist/lib/agent/tools/evolution-tools.js +161 -0
- package/dist/lib/agent/tools/index.d.ts +163 -92
- package/dist/lib/agent/tools/index.js +9 -1
- package/dist/lib/agent/tools/lifecycle.d.ts +7 -1
- package/dist/lib/agent/tools/lifecycle.js +59 -75
- package/dist/lib/cli/AiScanService.js +5 -5
- package/dist/lib/cli/KnowledgeSyncService.js +1 -1
- package/dist/lib/core/AstAnalyzer.d.ts +1 -0
- package/dist/lib/core/discovery/ConfigWatcher.d.ts +64 -0
- package/dist/lib/core/discovery/ConfigWatcher.js +336 -0
- package/dist/lib/core/discovery/CustomConfigDiscoverer.d.ts +30 -0
- package/dist/lib/core/discovery/CustomConfigDiscoverer.js +1305 -0
- package/dist/lib/core/discovery/DiscovererPreference.d.ts +44 -0
- package/dist/lib/core/discovery/DiscovererPreference.js +141 -0
- package/dist/lib/core/discovery/DiscovererRegistry.d.ts +10 -1
- package/dist/lib/core/discovery/DiscovererRegistry.js +42 -2
- package/dist/lib/core/discovery/ProjectDiscoverer.d.ts +19 -0
- package/dist/lib/core/discovery/index.d.ts +2 -0
- package/dist/lib/core/discovery/index.js +4 -0
- package/dist/lib/core/discovery/parsers/CMakeParser.d.ts +32 -0
- package/dist/lib/core/discovery/parsers/CMakeParser.js +148 -0
- package/dist/lib/core/discovery/parsers/GradleDslParser.d.ts +43 -0
- package/dist/lib/core/discovery/parsers/GradleDslParser.js +171 -0
- package/dist/lib/core/discovery/parsers/JsonConfigParser.d.ts +45 -0
- package/dist/lib/core/discovery/parsers/JsonConfigParser.js +122 -0
- package/dist/lib/core/discovery/parsers/RubyDslParser.d.ts +49 -0
- package/dist/lib/core/discovery/parsers/RubyDslParser.js +282 -0
- package/dist/lib/core/discovery/parsers/StarlarkParser.d.ts +33 -0
- package/dist/lib/core/discovery/parsers/StarlarkParser.js +229 -0
- package/dist/lib/core/discovery/parsers/YamlConfigParser.d.ts +37 -0
- package/dist/lib/core/discovery/parsers/YamlConfigParser.js +212 -0
- package/dist/lib/{service/bootstrap/DimensionCopyRegistry.d.ts → domain/dimension/DimensionCopy.d.ts} +2 -2
- package/dist/lib/{service/bootstrap/DimensionCopyRegistry.js → domain/dimension/DimensionCopy.js} +22 -72
- package/dist/lib/domain/dimension/DimensionRegistry.d.ts +54 -0
- package/dist/lib/domain/dimension/DimensionRegistry.js +620 -0
- package/dist/lib/domain/dimension/DimensionSop.d.ts +55 -0
- package/dist/lib/domain/dimension/DimensionSop.js +1604 -0
- package/dist/lib/domain/dimension/UnifiedDimension.d.ts +61 -0
- package/dist/lib/domain/dimension/UnifiedDimension.js +53 -0
- package/dist/lib/domain/dimension/index.d.ts +10 -0
- package/dist/lib/domain/dimension/index.js +9 -0
- package/dist/lib/domain/knowledge/FieldSpec.d.ts +1 -1
- package/dist/lib/domain/knowledge/FieldSpec.js +29 -16
- package/dist/lib/domain/knowledge/KnowledgeEntry.d.ts +40 -112
- package/dist/lib/domain/knowledge/KnowledgeEntry.js +44 -9
- package/dist/lib/domain/knowledge/KnowledgeRepository.d.ts +1 -0
- package/dist/lib/domain/knowledge/KnowledgeRepository.js +3 -0
- package/dist/lib/domain/knowledge/Lifecycle.js +1 -1
- package/dist/lib/domain/knowledge/StyleGuide.d.ts +1 -1
- package/dist/lib/domain/knowledge/StyleGuide.js +1 -1
- package/dist/lib/domain/knowledge/UnifiedValidator.js +15 -0
- package/dist/lib/external/ai/AiProvider.d.ts +12 -0
- package/dist/lib/external/ai/AiProvider.js +24 -0
- package/dist/lib/external/ai/AiProviderManager.d.ts +101 -0
- package/dist/lib/external/ai/AiProviderManager.js +193 -0
- package/dist/lib/external/ai/providers/ClaudeProvider.js +11 -0
- package/dist/lib/external/ai/providers/GoogleGeminiProvider.js +18 -0
- package/dist/lib/external/ai/providers/MockProvider.d.ts +21 -3
- package/dist/lib/external/ai/providers/MockProvider.js +290 -14
- package/dist/lib/external/ai/providers/OpenAiProvider.js +16 -0
- package/dist/lib/external/lark/LarkTransport.d.ts +5 -1
- package/dist/lib/external/lark/LarkTransport.js +10 -2
- package/dist/lib/external/mcp/McpServer.js +4 -0
- package/dist/lib/external/mcp/handlers/TargetClassifier.d.ts +1 -1
- package/dist/lib/external/mcp/handlers/bootstrap/BootstrapSession.d.ts +8 -16
- package/dist/lib/external/mcp/handlers/bootstrap/BootstrapSession.js +10 -10
- package/dist/lib/external/mcp/handlers/bootstrap/ExternalSubmissionTracker.d.ts +7 -0
- package/dist/lib/external/mcp/handlers/bootstrap/ExternalSubmissionTracker.js +20 -0
- package/dist/lib/external/mcp/handlers/bootstrap/MissionBriefingBuilder.d.ts +52 -132
- package/dist/lib/external/mcp/handlers/bootstrap/MissionBriefingBuilder.js +204 -17
- package/dist/lib/external/mcp/handlers/bootstrap/base-dimensions.d.ts +11 -75
- package/dist/lib/external/mcp/handlers/bootstrap/base-dimensions.js +40 -191
- package/dist/lib/external/mcp/handlers/bootstrap/pipeline/dimension-configs.d.ts +13 -78
- package/dist/lib/external/mcp/handlers/bootstrap/pipeline/dimension-configs.js +30 -52
- package/dist/lib/external/mcp/handlers/bootstrap/pipeline/dimension-context.d.ts +0 -1
- package/dist/lib/external/mcp/handlers/bootstrap/pipeline/mock-pipeline.d.ts +20 -0
- package/dist/lib/external/mcp/handlers/bootstrap/pipeline/mock-pipeline.js +432 -0
- package/dist/lib/external/mcp/handlers/bootstrap/pipeline/orchestrator.d.ts +99 -12
- package/dist/lib/external/mcp/handlers/bootstrap/pipeline/orchestrator.js +188 -169
- package/dist/lib/external/mcp/handlers/bootstrap/pipeline/tier-scheduler.js +7 -17
- package/dist/lib/external/mcp/handlers/bootstrap/refine.js +8 -0
- package/dist/lib/external/mcp/handlers/bootstrap/shared/async-fill-helpers.d.ts +46 -0
- package/dist/lib/external/mcp/handlers/bootstrap/shared/async-fill-helpers.js +58 -0
- package/dist/lib/external/mcp/handlers/bootstrap/shared/audit-helpers.d.ts +25 -0
- package/dist/lib/external/mcp/handlers/bootstrap/shared/audit-helpers.js +47 -0
- package/dist/lib/external/mcp/handlers/bootstrap/shared/bootstrap-phases.d.ts +50 -12
- package/dist/lib/external/mcp/handlers/bootstrap/shared/bootstrap-phases.js +30 -10
- package/dist/lib/external/mcp/handlers/bootstrap/shared/dimension-text.js +1 -1
- package/dist/lib/external/mcp/handlers/bootstrap/shared/handler-types.d.ts +24 -0
- package/dist/lib/external/mcp/handlers/bootstrap/shared/handler-types.js +14 -0
- package/dist/lib/external/mcp/handlers/bootstrap/shared/panorama-utils.d.ts +14 -0
- package/dist/lib/external/mcp/handlers/bootstrap/shared/panorama-utils.js +48 -0
- package/dist/lib/external/mcp/handlers/bootstrap/shared/session-helpers.d.ts +21 -0
- package/dist/lib/external/mcp/handlers/bootstrap/shared/session-helpers.js +45 -0
- package/dist/lib/external/mcp/handlers/bootstrap/shared/skill-generator.d.ts +1 -1
- package/dist/lib/external/mcp/handlers/bootstrap/shared/target-file-map.d.ts +27 -0
- package/dist/lib/external/mcp/handlers/bootstrap/shared/target-file-map.js +44 -0
- package/dist/lib/external/mcp/handlers/bootstrap-external.d.ts +23 -10
- package/dist/lib/external/mcp/handlers/bootstrap-external.js +41 -51
- package/dist/lib/external/mcp/handlers/bootstrap-internal.d.ts +2 -0
- package/dist/lib/external/mcp/handlers/bootstrap-internal.js +117 -82
- package/dist/lib/external/mcp/handlers/consolidated.d.ts +4 -4
- package/dist/lib/external/mcp/handlers/consolidated.js +108 -332
- package/dist/lib/external/mcp/handlers/dimension-complete-external.js +71 -2
- package/dist/lib/external/mcp/handlers/evolve-external.d.ts +54 -0
- package/dist/lib/external/mcp/handlers/evolve-external.js +229 -0
- package/dist/lib/external/mcp/handlers/knowledge.js +30 -5
- package/dist/lib/external/mcp/handlers/rescan-external.d.ts +76 -0
- package/dist/lib/external/mcp/handlers/rescan-external.js +335 -0
- package/dist/lib/external/mcp/handlers/rescan-internal.d.ts +120 -0
- package/dist/lib/external/mcp/handlers/rescan-internal.js +359 -0
- package/dist/lib/external/mcp/handlers/search.d.ts +6 -5
- package/dist/lib/external/mcp/handlers/search.js +6 -5
- package/dist/lib/external/mcp/handlers/types.d.ts +2 -1
- package/dist/lib/external/mcp/handlers/wiki-external.js +2 -2
- package/dist/lib/external/mcp/tools.d.ts +8 -18
- package/dist/lib/external/mcp/tools.js +58 -2
- package/dist/lib/http/routes/ai.js +111 -30
- package/dist/lib/http/routes/candidates.js +11 -4
- package/dist/lib/http/routes/commands.js +10 -1
- package/dist/lib/http/routes/health.js +11 -0
- package/dist/lib/http/routes/knowledge.js +122 -1
- package/dist/lib/http/routes/modules.js +52 -3
- package/dist/lib/http/routes/panorama.js +16 -4
- package/dist/lib/http/routes/recipes.js +7 -0
- package/dist/lib/http/utils/routeHelpers.js +2 -1
- package/dist/lib/infrastructure/cache/CacheCoordinator.d.ts +41 -0
- package/dist/lib/infrastructure/cache/CacheCoordinator.js +105 -0
- package/dist/lib/infrastructure/database/migrations/006_lifecycle_transition_events.d.ts +7 -0
- package/dist/lib/infrastructure/database/migrations/006_lifecycle_transition_events.js +28 -0
- package/dist/lib/infrastructure/vector/HnswVectorAdapter.js +1 -1
- package/dist/lib/injection/ServiceContainer.d.ts +6 -5
- package/dist/lib/injection/ServiceContainer.js +64 -25
- package/dist/lib/injection/ServiceMap.d.ts +10 -1
- package/dist/lib/injection/modules/AiModule.d.ts +6 -9
- package/dist/lib/injection/modules/AiModule.js +82 -39
- package/dist/lib/injection/modules/KnowledgeModule.js +15 -1
- package/dist/lib/injection/modules/PanoramaModule.js +1 -1
- package/dist/lib/repository/knowledge/KnowledgeRepository.impl.d.ts +4 -0
- package/dist/lib/repository/knowledge/KnowledgeRepository.impl.js +16 -1
- package/dist/lib/service/bootstrap/BootstrapEventEmitter.d.ts +3 -2
- package/dist/lib/service/bootstrap/BootstrapEventEmitter.js +1 -1
- package/dist/lib/service/bootstrap/DeliveryVerifier.d.ts +51 -0
- package/dist/lib/service/bootstrap/DeliveryVerifier.js +163 -0
- package/dist/lib/service/bootstrap/UiStartupTasks.d.ts +5 -0
- package/dist/lib/service/bootstrap/UiStartupTasks.js +20 -0
- package/dist/lib/service/bootstrap/bootstrap-event-types.d.ts +54 -0
- package/dist/lib/service/bootstrap/bootstrap-event-types.js +10 -0
- package/dist/lib/service/cleanup/CleanupService.d.ts +132 -0
- package/dist/lib/service/cleanup/CleanupService.js +571 -0
- package/dist/lib/service/delivery/AgentInstructionsGenerator.js +39 -43
- package/dist/lib/service/delivery/FileProtection.d.ts +20 -0
- package/dist/lib/service/delivery/FileProtection.js +54 -0
- package/dist/lib/service/delivery/SkillsSyncer.js +16 -21
- package/dist/lib/service/evolution/ContentPatcher.d.ts +44 -0
- package/dist/lib/service/evolution/ContentPatcher.js +310 -0
- package/dist/lib/service/evolution/ProposalExecutor.d.ts +4 -0
- package/dist/lib/service/evolution/ProposalExecutor.js +77 -13
- package/dist/lib/service/evolution/RecipeLifecycleSupervisor.d.ts +64 -0
- package/dist/lib/service/evolution/RecipeLifecycleSupervisor.js +458 -0
- package/dist/lib/service/evolution/RecipeRelevanceAuditor.d.ts +89 -0
- package/dist/lib/service/evolution/RecipeRelevanceAuditor.js +492 -0
- package/dist/lib/service/evolution/createSupersedeProposal.d.ts +44 -0
- package/dist/lib/service/evolution/createSupersedeProposal.js +81 -0
- package/dist/lib/service/guard/ComplianceReporter.d.ts +4 -0
- package/dist/lib/service/guard/ComplianceReporter.js +51 -0
- package/dist/lib/service/guard/GuardCheckEngine.js +5 -4
- package/dist/lib/service/knowledge/CodeEntityGraph.d.ts +6 -0
- package/dist/lib/service/knowledge/CodeEntityGraph.js +16 -0
- package/dist/lib/service/knowledge/ConfidenceRouter.js +1 -1
- package/dist/lib/service/knowledge/KnowledgeService.d.ts +11 -1
- package/dist/lib/service/knowledge/KnowledgeService.js +67 -14
- package/dist/lib/service/knowledge/RecipeProductionGateway.d.ts +225 -0
- package/dist/lib/service/knowledge/RecipeProductionGateway.js +384 -0
- package/dist/lib/service/module/ModuleService.js +10 -19
- package/dist/lib/service/panorama/CouplingAnalyzer.d.ts +10 -1
- package/dist/lib/service/panorama/CouplingAnalyzer.js +44 -2
- package/dist/lib/service/panorama/DimensionAnalyzer.d.ts +4 -3
- package/dist/lib/service/panorama/DimensionAnalyzer.js +40 -151
- package/dist/lib/service/panorama/LayerInferrer.d.ts +16 -1
- package/dist/lib/service/panorama/LayerInferrer.js +118 -1
- package/dist/lib/service/panorama/ModuleDiscoverer.d.ts +9 -0
- package/dist/lib/service/panorama/ModuleDiscoverer.js +58 -2
- package/dist/lib/service/panorama/PanoramaAggregator.d.ts +6 -2
- package/dist/lib/service/panorama/PanoramaAggregator.js +84 -6
- package/dist/lib/service/panorama/PanoramaScanner.js +28 -0
- package/dist/lib/service/panorama/PanoramaService.js +10 -5
- package/dist/lib/service/panorama/PanoramaTypes.d.ts +38 -0
- package/dist/lib/service/panorama/RoleRefiner.d.ts +2 -0
- package/dist/lib/service/panorama/RoleRefiner.js +41 -0
- package/dist/lib/service/panorama/TechStackProfiler.d.ts +13 -0
- package/dist/lib/service/panorama/TechStackProfiler.js +191 -0
- package/dist/lib/service/search/BM25Scorer.d.ts +2 -2
- package/dist/lib/service/search/SearchEngine.d.ts +11 -10
- package/dist/lib/service/search/SearchEngine.js +38 -36
- package/dist/lib/service/search/SearchTypes.d.ts +14 -8
- package/dist/lib/service/search/SearchTypes.js +1 -1
- package/dist/lib/service/search/tokenizer.d.ts +1 -1
- package/dist/lib/service/search/tokenizer.js +2 -2
- package/dist/lib/service/skills/SignalCollector.d.ts +1 -0
- package/dist/lib/service/skills/SignalCollector.js +6 -5
- package/dist/lib/service/vector/ContextualEnricher.d.ts +1 -0
- package/dist/lib/service/vector/ContextualEnricher.js +4 -0
- package/dist/lib/shared/LanguageService.js +3 -0
- package/dist/lib/shared/developer-identity.d.ts +18 -0
- package/dist/lib/shared/developer-identity.js +62 -0
- package/dist/lib/shared/schemas/common.d.ts +4 -4
- package/dist/lib/shared/schemas/http-requests.d.ts +20 -18
- package/dist/lib/shared/schemas/http-requests.js +17 -6
- package/dist/lib/shared/schemas/mcp-tools.d.ts +32 -2
- package/dist/lib/shared/schemas/mcp-tools.js +38 -0
- package/dist/lib/types/evolution.d.ts +135 -0
- package/dist/lib/types/evolution.js +6 -0
- package/dist/lib/types/graph-shared.d.ts +25 -0
- package/dist/lib/types/graph-shared.js +7 -0
- package/dist/lib/types/knowledge-wire.d.ts +132 -0
- package/dist/lib/types/knowledge-wire.js +7 -0
- package/dist/lib/types/project-snapshot-builder.d.ts +19 -0
- package/dist/lib/types/project-snapshot-builder.js +189 -0
- package/dist/lib/types/project-snapshot.d.ts +399 -0
- package/dist/lib/types/project-snapshot.js +17 -0
- package/dist/lib/types/search-wire.d.ts +46 -0
- package/dist/lib/types/search-wire.js +7 -0
- package/dist/lib/types/snapshot-views.d.ts +58 -0
- package/dist/lib/types/snapshot-views.js +103 -0
- package/package.json +1 -1
- package/skills/autosnippet-recipes/SKILL.md +1 -1
- package/templates/instructions/agent-static.md +2 -0
- package/templates/instructions/conventions.md +3 -1
- package/templates/recipes-setup/README.md +2 -2
- package/dashboard/dist/assets/icons-BJ2mUBi8.js +0 -1
- package/dashboard/dist/assets/index-B659K9t5.js +0 -128
- package/dashboard/dist/assets/index-NCm40PMD.css +0 -1
- package/dist/lib/external/mcp/handlers/bootstrap/pipeline/noAiFallback.d.ts +0 -169
- package/dist/lib/external/mcp/handlers/bootstrap/pipeline/noAiFallback.js +0 -727
- package/dist/lib/external/mcp/handlers/bootstrap/shared/dimension-sop.d.ts +0 -370
- package/dist/lib/external/mcp/handlers/bootstrap/shared/dimension-sop.js +0 -821
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module StarlarkParser
|
|
3
|
+
* @description Starlark (Python 子集) 轻量解析器 — 从 BUILD / BUILD.bazel / BUCK 文件提取构建目标信息
|
|
4
|
+
*
|
|
5
|
+
* 支持解析:
|
|
6
|
+
* - load() 语句 → 推断语言
|
|
7
|
+
* - 目标声明 (swift_library, cc_binary, java_library 等)
|
|
8
|
+
* - name / deps / srcs / visibility 字段
|
|
9
|
+
*
|
|
10
|
+
* 设计策略: 正则 + 逐行状态机(不做宏展开)
|
|
11
|
+
*/
|
|
12
|
+
export interface StarlarkTarget {
|
|
13
|
+
rule: string;
|
|
14
|
+
name: string;
|
|
15
|
+
srcs: string[];
|
|
16
|
+
deps: string[];
|
|
17
|
+
visibility: string[];
|
|
18
|
+
testonly?: boolean;
|
|
19
|
+
}
|
|
20
|
+
export interface LoadStatement {
|
|
21
|
+
repository: string;
|
|
22
|
+
path: string;
|
|
23
|
+
symbols: string[];
|
|
24
|
+
}
|
|
25
|
+
export interface ParsedBuildFile {
|
|
26
|
+
targets: StarlarkTarget[];
|
|
27
|
+
loads: LoadStatement[];
|
|
28
|
+
}
|
|
29
|
+
export declare const RULE_TO_LANGUAGE: Record<string, string>;
|
|
30
|
+
/**
|
|
31
|
+
* 解析单个 BUILD/BUILD.bazel/BUCK 文件内容
|
|
32
|
+
*/
|
|
33
|
+
export declare function parseStarlarkBuildFile(content: string): ParsedBuildFile;
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module StarlarkParser
|
|
3
|
+
* @description Starlark (Python 子集) 轻量解析器 — 从 BUILD / BUILD.bazel / BUCK 文件提取构建目标信息
|
|
4
|
+
*
|
|
5
|
+
* 支持解析:
|
|
6
|
+
* - load() 语句 → 推断语言
|
|
7
|
+
* - 目标声明 (swift_library, cc_binary, java_library 等)
|
|
8
|
+
* - name / deps / srcs / visibility 字段
|
|
9
|
+
*
|
|
10
|
+
* 设计策略: 正则 + 逐行状态机(不做宏展开)
|
|
11
|
+
*/
|
|
12
|
+
// ── 规则名 → 语言映射 ────────────────────────────────
|
|
13
|
+
export const RULE_TO_LANGUAGE = {
|
|
14
|
+
// Bazel
|
|
15
|
+
swift_library: 'swift',
|
|
16
|
+
swift_binary: 'swift',
|
|
17
|
+
swift_test: 'swift',
|
|
18
|
+
cc_library: 'cpp',
|
|
19
|
+
cc_binary: 'cpp',
|
|
20
|
+
cc_test: 'cpp',
|
|
21
|
+
java_library: 'java',
|
|
22
|
+
java_binary: 'java',
|
|
23
|
+
java_test: 'java',
|
|
24
|
+
kt_jvm_library: 'kotlin',
|
|
25
|
+
kt_jvm_binary: 'kotlin',
|
|
26
|
+
py_library: 'python',
|
|
27
|
+
py_binary: 'python',
|
|
28
|
+
py_test: 'python',
|
|
29
|
+
go_library: 'go',
|
|
30
|
+
go_binary: 'go',
|
|
31
|
+
go_test: 'go',
|
|
32
|
+
rust_library: 'rust',
|
|
33
|
+
rust_binary: 'rust',
|
|
34
|
+
rust_test: 'rust',
|
|
35
|
+
ts_project: 'typescript',
|
|
36
|
+
proto_library: 'protobuf',
|
|
37
|
+
// Buck2
|
|
38
|
+
cxx_library: 'cpp',
|
|
39
|
+
cxx_binary: 'cpp',
|
|
40
|
+
cxx_test: 'cpp',
|
|
41
|
+
android_library: 'kotlin',
|
|
42
|
+
android_binary: 'kotlin',
|
|
43
|
+
apple_library: 'swift',
|
|
44
|
+
apple_binary: 'swift',
|
|
45
|
+
python_library: 'python',
|
|
46
|
+
python_binary: 'python',
|
|
47
|
+
// Pants
|
|
48
|
+
python_source: 'python',
|
|
49
|
+
python_sources: 'python',
|
|
50
|
+
docker_image: 'docker',
|
|
51
|
+
};
|
|
52
|
+
// ── 正则模式 ────────────────────────────────────────
|
|
53
|
+
const LOAD_RE = /^load\(\s*"([^"]+)"\s*,\s*((?:"[^"]+"(?:\s*,\s*)?)+)\s*\)/;
|
|
54
|
+
const RULE_CALL_RE = /^(\w+)\(\s*$/;
|
|
55
|
+
const NAME_RE = /name\s*=\s*"([^"]+)"/;
|
|
56
|
+
const TESTONLY_RE = /testonly\s*=\s*(True|1)/;
|
|
57
|
+
const STRING_LIST_RE = (field) => new RegExp(`${field}\\s*=\\s*(?:glob\\(\\s*)?\\[([^\\]]*)\\]`, 's');
|
|
58
|
+
const DEP_LABEL_RE = /"((?:\/\/[^"]*|:[^"]*))"/g;
|
|
59
|
+
const GLOB_RE = /glob\(\s*\[([^\]]*)\]\s*\)/;
|
|
60
|
+
// ── 公开 API ────────────────────────────────────────
|
|
61
|
+
/**
|
|
62
|
+
* 解析单个 BUILD/BUILD.bazel/BUCK 文件内容
|
|
63
|
+
*/
|
|
64
|
+
export function parseStarlarkBuildFile(content) {
|
|
65
|
+
const result = { targets: [], loads: [] };
|
|
66
|
+
const lines = content.split('\n');
|
|
67
|
+
// Pass 1: 提取 load 语句
|
|
68
|
+
for (const line of lines) {
|
|
69
|
+
const trimmed = line.trim();
|
|
70
|
+
if (trimmed.startsWith('#')) {
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
const loadMatch = trimmed.match(LOAD_RE);
|
|
74
|
+
if (loadMatch) {
|
|
75
|
+
const fullLabel = loadMatch[1];
|
|
76
|
+
const symbolsPart = loadMatch[2];
|
|
77
|
+
// 解析 repository 和 path
|
|
78
|
+
let repository = '';
|
|
79
|
+
let path = fullLabel;
|
|
80
|
+
if (fullLabel.startsWith('@')) {
|
|
81
|
+
const slashIdx = fullLabel.indexOf('//');
|
|
82
|
+
if (slashIdx !== -1) {
|
|
83
|
+
repository = fullLabel.substring(0, slashIdx);
|
|
84
|
+
path = fullLabel.substring(slashIdx);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
const symbols = [];
|
|
88
|
+
const symRe = /"([^"]+)"/g;
|
|
89
|
+
let symMatch;
|
|
90
|
+
while ((symMatch = symRe.exec(symbolsPart)) !== null) {
|
|
91
|
+
symbols.push(symMatch[1]);
|
|
92
|
+
}
|
|
93
|
+
result.loads.push({ repository, path, symbols });
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
// Pass 2: 提取目标声明(逐行状态机)
|
|
97
|
+
let i = 0;
|
|
98
|
+
while (i < lines.length) {
|
|
99
|
+
const trimmed = lines[i].trim();
|
|
100
|
+
// 跳过注释和空行
|
|
101
|
+
if (trimmed.startsWith('#') || trimmed === '') {
|
|
102
|
+
i++;
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
// 检测规则调用开始: rule_name(
|
|
106
|
+
const ruleMatch = trimmed.match(RULE_CALL_RE);
|
|
107
|
+
if (ruleMatch) {
|
|
108
|
+
const rule = ruleMatch[1];
|
|
109
|
+
// 收集整个调用块直到匹配的 )
|
|
110
|
+
const blockLines = [trimmed];
|
|
111
|
+
let depth = 1;
|
|
112
|
+
let j = i + 1;
|
|
113
|
+
while (j < lines.length && depth > 0) {
|
|
114
|
+
const bLine = lines[j];
|
|
115
|
+
for (const ch of bLine) {
|
|
116
|
+
if (ch === '(') {
|
|
117
|
+
depth++;
|
|
118
|
+
}
|
|
119
|
+
if (ch === ')') {
|
|
120
|
+
depth--;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
blockLines.push(bLine);
|
|
124
|
+
j++;
|
|
125
|
+
}
|
|
126
|
+
const block = blockLines.join('\n');
|
|
127
|
+
const target = parseTargetBlock(rule, block);
|
|
128
|
+
if (target) {
|
|
129
|
+
result.targets.push(target);
|
|
130
|
+
}
|
|
131
|
+
i = j;
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
// 也检测单行调用: rule_name(name = "...")
|
|
135
|
+
const inlineMatch = trimmed.match(/^(\w+)\(/);
|
|
136
|
+
if (inlineMatch && RULE_TO_LANGUAGE[inlineMatch[1]]) {
|
|
137
|
+
// 同样收集到闭合 )
|
|
138
|
+
const rule = inlineMatch[1];
|
|
139
|
+
const blockLines = [trimmed];
|
|
140
|
+
let depth = 0;
|
|
141
|
+
for (const ch of trimmed) {
|
|
142
|
+
if (ch === '(') {
|
|
143
|
+
depth++;
|
|
144
|
+
}
|
|
145
|
+
if (ch === ')') {
|
|
146
|
+
depth--;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
let j = i + 1;
|
|
150
|
+
while (j < lines.length && depth > 0) {
|
|
151
|
+
const bLine = lines[j];
|
|
152
|
+
for (const ch of bLine) {
|
|
153
|
+
if (ch === '(') {
|
|
154
|
+
depth++;
|
|
155
|
+
}
|
|
156
|
+
if (ch === ')') {
|
|
157
|
+
depth--;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
blockLines.push(bLine);
|
|
161
|
+
j++;
|
|
162
|
+
}
|
|
163
|
+
const block = blockLines.join('\n');
|
|
164
|
+
const target = parseTargetBlock(rule, block);
|
|
165
|
+
if (target) {
|
|
166
|
+
result.targets.push(target);
|
|
167
|
+
}
|
|
168
|
+
i = j;
|
|
169
|
+
continue;
|
|
170
|
+
}
|
|
171
|
+
i++;
|
|
172
|
+
}
|
|
173
|
+
return result;
|
|
174
|
+
}
|
|
175
|
+
// ── 内部解析函数 ────────────────────────────────────
|
|
176
|
+
function parseTargetBlock(rule, block) {
|
|
177
|
+
const nameMatch = block.match(NAME_RE);
|
|
178
|
+
if (!nameMatch) {
|
|
179
|
+
return null;
|
|
180
|
+
}
|
|
181
|
+
return {
|
|
182
|
+
rule,
|
|
183
|
+
name: nameMatch[1],
|
|
184
|
+
srcs: extractStringList(block, 'srcs'),
|
|
185
|
+
deps: extractDepLabels(block),
|
|
186
|
+
visibility: extractStringList(block, 'visibility'),
|
|
187
|
+
testonly: TESTONLY_RE.test(block) ? true : undefined,
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
function extractStringList(block, field) {
|
|
191
|
+
const listMatch = block.match(STRING_LIST_RE(field));
|
|
192
|
+
if (!listMatch) {
|
|
193
|
+
return [];
|
|
194
|
+
}
|
|
195
|
+
let inner = listMatch[1];
|
|
196
|
+
// 处理 glob() 模式
|
|
197
|
+
const globMatch = inner.match(GLOB_RE);
|
|
198
|
+
if (globMatch) {
|
|
199
|
+
inner = globMatch[1];
|
|
200
|
+
}
|
|
201
|
+
const items = [];
|
|
202
|
+
const strRe = /"([^"]+)"/g;
|
|
203
|
+
let m;
|
|
204
|
+
while ((m = strRe.exec(inner)) !== null) {
|
|
205
|
+
items.push(m[1]);
|
|
206
|
+
}
|
|
207
|
+
return items;
|
|
208
|
+
}
|
|
209
|
+
function extractDepLabels(block) {
|
|
210
|
+
const depsMatch = block.match(STRING_LIST_RE('deps'));
|
|
211
|
+
if (!depsMatch) {
|
|
212
|
+
return [];
|
|
213
|
+
}
|
|
214
|
+
const inner = depsMatch[1];
|
|
215
|
+
const deps = [];
|
|
216
|
+
const re = new RegExp(DEP_LABEL_RE.source, 'g');
|
|
217
|
+
let m;
|
|
218
|
+
while ((m = re.exec(inner)) !== null) {
|
|
219
|
+
deps.push(m[1]);
|
|
220
|
+
}
|
|
221
|
+
// 也捕获非标签格式的字符串依赖
|
|
222
|
+
const strRe = /"([^"]+)"/g;
|
|
223
|
+
while ((m = strRe.exec(inner)) !== null) {
|
|
224
|
+
if (!m[1].startsWith('//') && !m[1].startsWith(':') && !deps.includes(m[1])) {
|
|
225
|
+
deps.push(m[1]);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
return deps;
|
|
229
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module YamlConfigParser
|
|
3
|
+
* @description YAML 配置解析器 — 从 XcodeGen project.yml 中提取项目结构信息
|
|
4
|
+
*
|
|
5
|
+
* 支持解析:
|
|
6
|
+
* - targets(构建目标)及其依赖关系
|
|
7
|
+
* - settings(项目级/目标级构建设置)
|
|
8
|
+
* - schemes(构建方案)
|
|
9
|
+
* - sources(源文件路径)
|
|
10
|
+
*
|
|
11
|
+
* 使用 js-yaml 进行安全解析(禁用危险的 YAML 特性)。
|
|
12
|
+
*/
|
|
13
|
+
import type { ParsedModuleSpec, ParsedProjectConfig } from './RubyDslParser.js';
|
|
14
|
+
/**
|
|
15
|
+
* 解析 XcodeGen project.yml 内容
|
|
16
|
+
* 返回与 RubyDslParser 兼容的 ParsedProjectConfig
|
|
17
|
+
*/
|
|
18
|
+
export declare function parseXcodeGenProject(content: string): ParsedProjectConfig;
|
|
19
|
+
/**
|
|
20
|
+
* 解析单个 target 为 ParsedModuleSpec 格式
|
|
21
|
+
*/
|
|
22
|
+
export declare function parseXcodeGenTarget(targetName: string, content: string): ParsedModuleSpec | null;
|
|
23
|
+
/**
|
|
24
|
+
* 提取所有 target 的依赖图
|
|
25
|
+
* 返回 [from, to][] 形式的有向边列表
|
|
26
|
+
*/
|
|
27
|
+
export declare function extractXcodeGenDependencyEdges(content: string): Array<[string, string]>;
|
|
28
|
+
export interface ParsedMelosProject {
|
|
29
|
+
name: string;
|
|
30
|
+
packageGlobs: string[];
|
|
31
|
+
scripts: string[];
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* 解析 melos.yaml 内容
|
|
35
|
+
* 提取项目名、包路径 glob 模式、scripts 列表
|
|
36
|
+
*/
|
|
37
|
+
export declare function parseMelosProject(content: string): ParsedMelosProject;
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module YamlConfigParser
|
|
3
|
+
* @description YAML 配置解析器 — 从 XcodeGen project.yml 中提取项目结构信息
|
|
4
|
+
*
|
|
5
|
+
* 支持解析:
|
|
6
|
+
* - targets(构建目标)及其依赖关系
|
|
7
|
+
* - settings(项目级/目标级构建设置)
|
|
8
|
+
* - schemes(构建方案)
|
|
9
|
+
* - sources(源文件路径)
|
|
10
|
+
*
|
|
11
|
+
* 使用 js-yaml 进行安全解析(禁用危险的 YAML 特性)。
|
|
12
|
+
*/
|
|
13
|
+
import yaml from 'js-yaml';
|
|
14
|
+
// ── 目标类型 → 层级推断 ────────────────────────────────
|
|
15
|
+
const TARGET_TYPE_LAYER = {
|
|
16
|
+
application: 'App',
|
|
17
|
+
'app-extension': 'Extension',
|
|
18
|
+
framework: 'Framework',
|
|
19
|
+
'static-library': 'Library',
|
|
20
|
+
'dynamic-library': 'Library',
|
|
21
|
+
bundle: 'Resource',
|
|
22
|
+
'unit-test': 'Test',
|
|
23
|
+
'ui-test': 'Test',
|
|
24
|
+
tool: 'Tool',
|
|
25
|
+
};
|
|
26
|
+
// ── 公开 API ────────────────────────────────────────
|
|
27
|
+
/**
|
|
28
|
+
* 解析 XcodeGen project.yml 内容
|
|
29
|
+
* 返回与 RubyDslParser 兼容的 ParsedProjectConfig
|
|
30
|
+
*/
|
|
31
|
+
export function parseXcodeGenProject(content) {
|
|
32
|
+
let doc;
|
|
33
|
+
try {
|
|
34
|
+
doc = yaml.load(content, { schema: yaml.CORE_SCHEMA });
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return { layers: [], globalDependencies: [] };
|
|
38
|
+
}
|
|
39
|
+
if (!doc || typeof doc !== 'object') {
|
|
40
|
+
return { layers: [], globalDependencies: [] };
|
|
41
|
+
}
|
|
42
|
+
const result = {
|
|
43
|
+
layers: [],
|
|
44
|
+
globalDependencies: [],
|
|
45
|
+
};
|
|
46
|
+
// 提取宿主应用
|
|
47
|
+
if (doc.name) {
|
|
48
|
+
result.hostApp = { name: doc.name, version: '0.0.0' };
|
|
49
|
+
}
|
|
50
|
+
if (!doc.targets) {
|
|
51
|
+
return result;
|
|
52
|
+
}
|
|
53
|
+
// 将 targets 按类型分层
|
|
54
|
+
const layerMap = new Map();
|
|
55
|
+
for (const [targetName, target] of Object.entries(doc.targets)) {
|
|
56
|
+
const targetType = target.type ?? 'framework';
|
|
57
|
+
const layerName = TARGET_TYPE_LAYER[targetType] ?? 'Other';
|
|
58
|
+
const isLocal = !isExternalTarget(targetName, doc);
|
|
59
|
+
const mod = {
|
|
60
|
+
name: targetName,
|
|
61
|
+
version: '0.0.0',
|
|
62
|
+
isLocal,
|
|
63
|
+
localPath: extractSourcePath(target),
|
|
64
|
+
group: layerName,
|
|
65
|
+
};
|
|
66
|
+
if (!layerMap.has(layerName)) {
|
|
67
|
+
layerMap.set(layerName, []);
|
|
68
|
+
}
|
|
69
|
+
layerMap.get(layerName)?.push(mod);
|
|
70
|
+
}
|
|
71
|
+
// 转为 ParsedLayer[]
|
|
72
|
+
let order = 0;
|
|
73
|
+
for (const [name, modules] of layerMap.entries()) {
|
|
74
|
+
result.layers.push({
|
|
75
|
+
name,
|
|
76
|
+
order: order++,
|
|
77
|
+
accessibleLayers: [],
|
|
78
|
+
modules,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
// 提取 SPM packages → globalDependencies
|
|
82
|
+
if (doc.packages) {
|
|
83
|
+
for (const [pkgName, pkg] of Object.entries(doc.packages)) {
|
|
84
|
+
result.globalDependencies.push({
|
|
85
|
+
name: pkgName,
|
|
86
|
+
version: pkg.from ?? pkg.version ?? pkg.branch ?? '0.0.0',
|
|
87
|
+
isLocal: !!pkg.path,
|
|
88
|
+
localPath: pkg.path,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return result;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* 解析单个 target 为 ParsedModuleSpec 格式
|
|
96
|
+
*/
|
|
97
|
+
export function parseXcodeGenTarget(targetName, content) {
|
|
98
|
+
let doc;
|
|
99
|
+
try {
|
|
100
|
+
doc = yaml.load(content, { schema: yaml.CORE_SCHEMA });
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
if (!doc?.targets?.[targetName]) {
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
const target = doc.targets[targetName];
|
|
109
|
+
return {
|
|
110
|
+
name: targetName,
|
|
111
|
+
version: '0.0.0',
|
|
112
|
+
sources: extractSourcePath(target) ?? targetName,
|
|
113
|
+
dependencies: extractTargetDependencies(target),
|
|
114
|
+
publicHeaders: [],
|
|
115
|
+
deploymentTarget: extractDeploymentTarget(target),
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* 提取所有 target 的依赖图
|
|
120
|
+
* 返回 [from, to][] 形式的有向边列表
|
|
121
|
+
*/
|
|
122
|
+
export function extractXcodeGenDependencyEdges(content) {
|
|
123
|
+
let doc;
|
|
124
|
+
try {
|
|
125
|
+
doc = yaml.load(content, { schema: yaml.CORE_SCHEMA });
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
return [];
|
|
129
|
+
}
|
|
130
|
+
if (!doc?.targets) {
|
|
131
|
+
return [];
|
|
132
|
+
}
|
|
133
|
+
const edges = [];
|
|
134
|
+
for (const [targetName, target] of Object.entries(doc.targets)) {
|
|
135
|
+
if (!target.dependencies) {
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
for (const dep of target.dependencies) {
|
|
139
|
+
const depName = dep.target ?? dep.framework ?? dep.package ?? dep.carthage;
|
|
140
|
+
if (depName) {
|
|
141
|
+
edges.push([targetName, depName]);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
return edges;
|
|
146
|
+
}
|
|
147
|
+
// ── 内部帮助函数 ────────────────────────────────────
|
|
148
|
+
function extractSourcePath(target) {
|
|
149
|
+
if (!target.sources || target.sources.length === 0) {
|
|
150
|
+
return undefined;
|
|
151
|
+
}
|
|
152
|
+
const first = target.sources[0];
|
|
153
|
+
if (typeof first === 'string') {
|
|
154
|
+
return first;
|
|
155
|
+
}
|
|
156
|
+
return first.path;
|
|
157
|
+
}
|
|
158
|
+
function extractTargetDependencies(target) {
|
|
159
|
+
if (!target.dependencies) {
|
|
160
|
+
return [];
|
|
161
|
+
}
|
|
162
|
+
return target.dependencies
|
|
163
|
+
.map((dep) => dep.target ?? dep.framework ?? dep.package ?? dep.carthage)
|
|
164
|
+
.filter((name) => !!name);
|
|
165
|
+
}
|
|
166
|
+
function extractDeploymentTarget(target) {
|
|
167
|
+
if (!target.deploymentTarget) {
|
|
168
|
+
return undefined;
|
|
169
|
+
}
|
|
170
|
+
if (typeof target.deploymentTarget === 'string') {
|
|
171
|
+
return target.deploymentTarget;
|
|
172
|
+
}
|
|
173
|
+
// Object form: { iOS: "15.0", macOS: "12.0" }
|
|
174
|
+
const values = Object.values(target.deploymentTarget);
|
|
175
|
+
return values[0];
|
|
176
|
+
}
|
|
177
|
+
function isExternalTarget(targetName, doc) {
|
|
178
|
+
// SPM packages referenced as targets are external
|
|
179
|
+
if (doc.packages?.[targetName]) {
|
|
180
|
+
return true;
|
|
181
|
+
}
|
|
182
|
+
// Targets defined in the project are local
|
|
183
|
+
return false;
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* 解析 melos.yaml 内容
|
|
187
|
+
* 提取项目名、包路径 glob 模式、scripts 列表
|
|
188
|
+
*/
|
|
189
|
+
export function parseMelosProject(content) {
|
|
190
|
+
const result = {
|
|
191
|
+
name: '',
|
|
192
|
+
packageGlobs: [],
|
|
193
|
+
scripts: [],
|
|
194
|
+
};
|
|
195
|
+
try {
|
|
196
|
+
const doc = yaml.load(content, { schema: yaml.CORE_SCHEMA });
|
|
197
|
+
if (!doc) {
|
|
198
|
+
return result;
|
|
199
|
+
}
|
|
200
|
+
result.name = doc.name ?? '';
|
|
201
|
+
if (Array.isArray(doc.packages)) {
|
|
202
|
+
result.packageGlobs = doc.packages.filter((p) => typeof p === 'string');
|
|
203
|
+
}
|
|
204
|
+
if (doc.scripts && typeof doc.scripts === 'object') {
|
|
205
|
+
result.scripts = Object.keys(doc.scripts);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
catch {
|
|
209
|
+
// YAML 解析失败时返回空结果
|
|
210
|
+
}
|
|
211
|
+
return result;
|
|
212
|
+
}
|
|
@@ -7,8 +7,8 @@
|
|
|
7
7
|
*
|
|
8
8
|
* ---
|
|
9
9
|
* 使用方式:
|
|
10
|
-
* import { DimensionCopy } from '
|
|
11
|
-
* const copy = DimensionCopy.get('
|
|
10
|
+
* import { DimensionCopy } from '#domain/dimension/DimensionCopy.js';
|
|
11
|
+
* const copy = DimensionCopy.get('design-patterns', 'python');
|
|
12
12
|
* // → { label: '设计模式与代码惯例', guide: '装饰器/描述器/上下文管理器/生成器/ABC 抽象基类/Mixin 模式' }
|
|
13
13
|
*/
|
|
14
14
|
export declare class DimensionCopy {
|
package/dist/lib/{service/bootstrap/DimensionCopyRegistry.js → domain/dimension/DimensionCopy.js}
RENAMED
|
@@ -7,10 +7,11 @@
|
|
|
7
7
|
*
|
|
8
8
|
* ---
|
|
9
9
|
* 使用方式:
|
|
10
|
-
* import { DimensionCopy } from '
|
|
11
|
-
* const copy = DimensionCopy.get('
|
|
10
|
+
* import { DimensionCopy } from '#domain/dimension/DimensionCopy.js';
|
|
11
|
+
* const copy = DimensionCopy.get('design-patterns', 'python');
|
|
12
12
|
* // → { label: '设计模式与代码惯例', guide: '装饰器/描述器/上下文管理器/生成器/ABC 抽象基类/Mixin 模式' }
|
|
13
13
|
*/
|
|
14
|
+
import { getDimension } from './DimensionRegistry.js';
|
|
14
15
|
// ═══════════════════════════════════════════════════════════
|
|
15
16
|
// 语言族定义
|
|
16
17
|
// ═══════════════════════════════════════════════════════════
|
|
@@ -45,11 +46,7 @@ function _langFamily(lang) {
|
|
|
45
46
|
*/
|
|
46
47
|
const COPY_REGISTRY = {
|
|
47
48
|
// ── ① 代码规范 ──────────────────────────────────────
|
|
48
|
-
'
|
|
49
|
-
_default: {
|
|
50
|
-
label: '代码规范',
|
|
51
|
-
guide: '命名约定、注释风格、文件组织规范、代码格式化标准',
|
|
52
|
-
},
|
|
49
|
+
'coding-standards': {
|
|
53
50
|
apple: {
|
|
54
51
|
label: '代码规范',
|
|
55
52
|
guide: '命名约定(类名前缀/方法签名风格/API 命名)、注释风格(语言/格式/MARK 分段)、文件组织规范',
|
|
@@ -80,11 +77,7 @@ const COPY_REGISTRY = {
|
|
|
80
77
|
},
|
|
81
78
|
},
|
|
82
79
|
// ── ② 设计模式与代码惯例 ─────────────────────────────
|
|
83
|
-
'
|
|
84
|
-
_default: {
|
|
85
|
-
label: '设计模式与代码惯例',
|
|
86
|
-
guide: '单例/工厂/观察者/策略/Builder 等设计模式在项目中的使用方式',
|
|
87
|
-
},
|
|
80
|
+
'design-patterns': {
|
|
88
81
|
apple: {
|
|
89
82
|
label: '设计模式与代码惯例',
|
|
90
83
|
guide: '单例/委托/Category·Extension/工厂/Builder/观察者/Coordinator 模式、继承关系',
|
|
@@ -116,10 +109,6 @@ const COPY_REGISTRY = {
|
|
|
116
109
|
},
|
|
117
110
|
// ── ③ 架构模式 ──────────────────────────────────────
|
|
118
111
|
architecture: {
|
|
119
|
-
_default: {
|
|
120
|
-
label: '架构模式',
|
|
121
|
-
guide: '分层架构、模块职责与边界、依赖图、导入约束规则',
|
|
122
|
-
},
|
|
123
112
|
apple: {
|
|
124
113
|
label: '架构模式',
|
|
125
114
|
guide: '分层架构(MVVM/VIPER/TCA)、Package/Target 模块边界、依赖图、import 约束规则',
|
|
@@ -149,12 +138,8 @@ const COPY_REGISTRY = {
|
|
|
149
138
|
guide: '分层架构、Workspace/crate 边界、pub/pub(crate) 可见性、trait object 抽象层',
|
|
150
139
|
},
|
|
151
140
|
},
|
|
152
|
-
// ── ④
|
|
153
|
-
'
|
|
154
|
-
_default: {
|
|
155
|
-
label: '最佳实践',
|
|
156
|
-
guide: '错误处理、并发安全、资源管理、日志规范、测试模式',
|
|
157
|
-
},
|
|
141
|
+
// ── ④ 错误韧性 ──────────────────────────────────────
|
|
142
|
+
'error-resilience': {
|
|
158
143
|
apple: {
|
|
159
144
|
label: '最佳实践',
|
|
160
145
|
guide: '错误处理、并发安全(Swift Concurrency/GCD)、内存管理(ARC/weak/unowned)、日志规范、XCTest 模式',
|
|
@@ -184,12 +169,8 @@ const COPY_REGISTRY = {
|
|
|
184
169
|
guide: '错误处理(Result/? 操作符/thiserror)、并发安全(Send+Sync/Arc/Mutex)、生命周期管理、日志(tracing)、#[test] 模式',
|
|
185
170
|
},
|
|
186
171
|
},
|
|
187
|
-
// ── ⑤
|
|
188
|
-
'event-
|
|
189
|
-
_default: {
|
|
190
|
-
label: '事件与数据流',
|
|
191
|
-
guide: '事件传播机制、状态管理模式、数据流向追踪',
|
|
192
|
-
},
|
|
172
|
+
// ── ⑤ 数据与事件流 ─────────────────────────────────
|
|
173
|
+
'data-event-flow': {
|
|
193
174
|
apple: {
|
|
194
175
|
label: '事件与数据流',
|
|
195
176
|
guide: '事件传播(Delegate/Notification/Block·Closure/Target-Action)、数据状态管理(KVO/属性观察/Combine/SwiftUI State)',
|
|
@@ -219,47 +200,8 @@ const COPY_REGISTRY = {
|
|
|
219
200
|
guide: '事件传播(tokio channel/crossbeam-channel)、Stream trait、Actor 模式(Actix)、状态管理(Arc<RwLock<T>>)',
|
|
220
201
|
},
|
|
221
202
|
},
|
|
222
|
-
// ── ⑥
|
|
223
|
-
'project-profile': {
|
|
224
|
-
_default: {
|
|
225
|
-
label: '项目特征',
|
|
226
|
-
guide: '技术栈、目录结构、三方依赖枚举与用途、基础设施服务注册表',
|
|
227
|
-
},
|
|
228
|
-
apple: {
|
|
229
|
-
label: '项目特征',
|
|
230
|
-
guide: '技术栈、目录结构、三方依赖枚举与用途、Extension/Category 分类聚合、自定义基类层级与全局定义(宏/typealias/PCH)、系统事件 hook 与生命周期入口、基础设施服务注册表、Runtime 与语言互操作',
|
|
231
|
-
},
|
|
232
|
-
js: {
|
|
233
|
-
label: '项目特征',
|
|
234
|
-
guide: '技术栈(框架/构建工具/包管理器)、目录结构、三方依赖枚举与用途、monorepo 配置、环境变量与配置注入、CI/CD 管线',
|
|
235
|
-
},
|
|
236
|
-
jvm: {
|
|
237
|
-
label: '项目特征',
|
|
238
|
-
guide: '技术栈(Spring/Android/Ktor)、module 结构、三方依赖枚举与用途、构建配置(Gradle/Maven)、Profile 环境管理、基础设施服务',
|
|
239
|
-
},
|
|
240
|
-
python: {
|
|
241
|
-
label: '项目特征',
|
|
242
|
-
guide: '技术栈(Django/FastAPI/Flask)、包结构、三方依赖枚举与用途、pyproject.toml/setup.cfg 配置、虚拟环境管理',
|
|
243
|
-
},
|
|
244
|
-
go: {
|
|
245
|
-
label: '项目特征',
|
|
246
|
-
guide: '技术栈、module 结构、go.mod 依赖枚举与用途、internal 包组织、build tags、Makefile 构建',
|
|
247
|
-
},
|
|
248
|
-
dart: {
|
|
249
|
-
label: '项目特征',
|
|
250
|
-
guide: '技术栈(Flutter/Dart Server/CLI)、目录结构(lib/src 分层)、pubspec.yaml 依赖枚举与用途、平台通道(MethodChannel/FFI)、Flavors/多环境配置',
|
|
251
|
-
},
|
|
252
|
-
rust: {
|
|
253
|
-
label: '项目特征',
|
|
254
|
-
guide: '技术栈、Workspace/crate 结构、Cargo.toml 依赖枚举与用途、feature flags、#[cfg] 条件编译',
|
|
255
|
-
},
|
|
256
|
-
},
|
|
257
|
-
// ── ⑦ Agent 开发注意事项 ─────────────────────────────
|
|
203
|
+
// ── ⑥ Agent 开发注意事项 ─────────────────────────────
|
|
258
204
|
'agent-guidelines': {
|
|
259
|
-
_default: {
|
|
260
|
-
label: 'Agent 开发注意事项',
|
|
261
|
-
guide: '三大核心原则(严谨性/深度特征挖掘/完整性)、命名强制、并发安全、资源管理、已废弃 API 标记、架构约束注释、TODO/FIXME',
|
|
262
|
-
},
|
|
263
205
|
apple: {
|
|
264
206
|
label: 'Agent 开发注意事项',
|
|
265
207
|
guide: '三大核心原则(严谨性/深度特征挖掘/完整性)、命名强制、线程安全、内存约束、已废弃 API 标记、架构约束注释、TODO/FIXME',
|
|
@@ -302,11 +244,19 @@ export class DimensionCopy {
|
|
|
302
244
|
*/
|
|
303
245
|
static get(dimId, lang) {
|
|
304
246
|
const entry = COPY_REGISTRY[dimId];
|
|
305
|
-
if (
|
|
306
|
-
|
|
247
|
+
if (entry) {
|
|
248
|
+
const family = _langFamily(lang);
|
|
249
|
+
const match = entry[family] || entry[lang];
|
|
250
|
+
if (match) {
|
|
251
|
+
return match;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
// 回退到 Registry 元数据(消除 _default 双源)
|
|
255
|
+
const dim = getDimension(dimId);
|
|
256
|
+
if (dim) {
|
|
257
|
+
return { label: dim.label, guide: dim.extractionGuide };
|
|
307
258
|
}
|
|
308
|
-
|
|
309
|
-
return entry[family] || entry[lang] || entry._default || null;
|
|
259
|
+
return null;
|
|
310
260
|
}
|
|
311
261
|
/**
|
|
312
262
|
* 批量为维度数组注入语言差异化文案(单语言版本)
|