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
|
@@ -1,821 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* dimension-sop.js — 维度级 SOP (Standard Operating Procedure)
|
|
3
|
-
*
|
|
4
|
-
* 为每个维度定义结构化分析步骤,替代 enrichDimensionTask() 中
|
|
5
|
-
* 原有的通用 analysisGuide 字符串。
|
|
6
|
-
*
|
|
7
|
-
* 参考:
|
|
8
|
-
* - MetaGPT SOP 驱动模式 (docs/design/external-agent-quality-gap.md §4.2)
|
|
9
|
-
* - 内部 Agent 的 PipelineStrategy (Analyze → QualityGate → Produce → RejectionGate)
|
|
10
|
-
*
|
|
11
|
-
* 设计原则:
|
|
12
|
-
* - 每个维度 4 个阶段: 扫描 → 验证 → 异常检测 → 提交
|
|
13
|
-
* - steps[].tools 仅为建议,外部 Agent 可用自身原生能力替代
|
|
14
|
-
* - commonMistakes 来自实际 cold start 观察到的低质量模式
|
|
15
|
-
*
|
|
16
|
-
* @module bootstrap/shared/dimension-sop
|
|
17
|
-
*/
|
|
18
|
-
// ═══════════════════════════════════════════════════════════
|
|
19
|
-
// 维度 SOP 注册表
|
|
20
|
-
// ═══════════════════════════════════════════════════════════
|
|
21
|
-
export const DIMENSION_SOP = {
|
|
22
|
-
// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
23
|
-
// 通用维度
|
|
24
|
-
// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
25
|
-
'code-standard': {
|
|
26
|
-
focusKeywords: [
|
|
27
|
-
'命名约定',
|
|
28
|
-
'类名前缀',
|
|
29
|
-
'方法签名',
|
|
30
|
-
'注释风格',
|
|
31
|
-
'文件组织',
|
|
32
|
-
'camelCase',
|
|
33
|
-
'PascalCase',
|
|
34
|
-
'代码规范',
|
|
35
|
-
],
|
|
36
|
-
steps: [
|
|
37
|
-
{
|
|
38
|
-
phase: '1. 全局扫描',
|
|
39
|
-
action: '搜索项目中出现频率最高的类名前缀/后缀、方法命名模式',
|
|
40
|
-
expectedOutput: '识别 3-5 个主要命名模式及其出现频率统计',
|
|
41
|
-
tools: ['grep_search 搜索类定义/接口定义', '浏览核心目录下的文件列表'],
|
|
42
|
-
},
|
|
43
|
-
{
|
|
44
|
-
phase: '2. 深度验证',
|
|
45
|
-
action: '阅读 5+ 个核心类文件,验证命名模式、注释风格、文件组织方式是否一致',
|
|
46
|
-
expectedOutput: '每个模式至少有 3 个文件证据,含具体行号',
|
|
47
|
-
tools: ['read_file 逐个阅读核心类/模块'],
|
|
48
|
-
},
|
|
49
|
-
{
|
|
50
|
-
phase: '3. 异常检测',
|
|
51
|
-
action: '搜索不符合主流命名模式的例外,确认是否为已废弃写法或特殊例外',
|
|
52
|
-
expectedOutput: '识别例外模式及其原因(历史遗留/第三方要求等)',
|
|
53
|
-
},
|
|
54
|
-
{
|
|
55
|
-
phase: '4. 提交',
|
|
56
|
-
action: '按项目特写格式提交知识候选(**最少 3 条,目标 5 条**),每个候选聚焦一种具体代码规范(如命名约定、注释风格、文件组织分别独立提交)',
|
|
57
|
-
qualityChecklist: [
|
|
58
|
-
'每个 content ≥200 字符',
|
|
59
|
-
'每个候选引用 ≥3 个文件路径',
|
|
60
|
-
'doClause 用英文祈使句,具体到命名模式',
|
|
61
|
-
'coreCode 提供可复制的完整代码骨架',
|
|
62
|
-
],
|
|
63
|
-
},
|
|
64
|
-
],
|
|
65
|
-
timeEstimate: '1-5 min',
|
|
66
|
-
commonMistakes: [
|
|
67
|
-
'不要只扫描 1 个文件就提交 — 至少读 5+ 个文件验证模式一致性',
|
|
68
|
-
'不要把"类名前缀"和"方法签名风格"合并成一个候选 — 每种规范应独立成条',
|
|
69
|
-
'不要写空泛的规范如"use camelCase" — 必须写明项目特定的前缀/后缀/风格',
|
|
70
|
-
'content 中必须有 (来源: FileName.ext:行号) 标注具体出处',
|
|
71
|
-
],
|
|
72
|
-
},
|
|
73
|
-
'code-pattern': {
|
|
74
|
-
focusKeywords: [
|
|
75
|
-
'设计模式',
|
|
76
|
-
'单例',
|
|
77
|
-
'Singleton',
|
|
78
|
-
'工厂',
|
|
79
|
-
'Factory',
|
|
80
|
-
'委托',
|
|
81
|
-
'Delegate',
|
|
82
|
-
'观察者',
|
|
83
|
-
'Observer',
|
|
84
|
-
'Builder',
|
|
85
|
-
'继承',
|
|
86
|
-
'Extension',
|
|
87
|
-
'Category',
|
|
88
|
-
],
|
|
89
|
-
steps: [
|
|
90
|
-
{
|
|
91
|
-
phase: '1. 模式识别',
|
|
92
|
-
action: '搜索常见设计模式关键词: Singleton/shared/default, Factory/create/build, Delegate/protocol, Observer/notify',
|
|
93
|
-
expectedOutput: '列出项目中使用的设计模式类型及代表性实现',
|
|
94
|
-
tools: ['grep_search 搜索单例、工厂、委托、观察者等关键词'],
|
|
95
|
-
},
|
|
96
|
-
{
|
|
97
|
-
phase: '2. 实现验证',
|
|
98
|
-
action: '阅读每种模式的 2-3 个实现,记录实现方式是否统一',
|
|
99
|
-
expectedOutput: '每种模式的标准实现写法 + 文件证据 + 变体说明',
|
|
100
|
-
tools: ['read_file 阅读模式实现类'],
|
|
101
|
-
},
|
|
102
|
-
{
|
|
103
|
-
phase: '3. 继承与组合分析',
|
|
104
|
-
action: '追踪核心基类的继承链,分析"基类-子类"和"接口-实现"关系',
|
|
105
|
-
expectedOutput: '核心继承图、关键基类的扩展约束',
|
|
106
|
-
},
|
|
107
|
-
{
|
|
108
|
-
phase: '4. 提交',
|
|
109
|
-
action: '每种设计模式单独提交候选(**整体最少 3 条,目标 5 条**),包含标准实现代码和使用约束',
|
|
110
|
-
qualityChecklist: [
|
|
111
|
-
'候选数量 ≥3(将不同模式拆分为独立候选,如 Singleton 一条、Factory 一条、Delegate 一条)',
|
|
112
|
-
'每个候选只聚焦一种设计模式',
|
|
113
|
-
'content 包含 ✅ 正确写法 和 ❌ 禁止写法',
|
|
114
|
-
'coreCode 是可复制的模式骨架代码',
|
|
115
|
-
'说明何时应使用此模式(whenClause)',
|
|
116
|
-
],
|
|
117
|
-
},
|
|
118
|
-
],
|
|
119
|
-
timeEstimate: '1-5 min',
|
|
120
|
-
commonMistakes: [
|
|
121
|
-
'不要只列出模式名称而不分析实现 — 必须展示项目的具体实现代码',
|
|
122
|
-
'不要把 Singleton 和 Factory 合并成一个候选 — 每种模式独立提交',
|
|
123
|
-
'不要忽略项目中模式的变体 — 如果项目的 Singleton 不用标准 dispatch_once,要说明其特殊写法',
|
|
124
|
-
],
|
|
125
|
-
},
|
|
126
|
-
architecture: {
|
|
127
|
-
steps: [
|
|
128
|
-
{
|
|
129
|
-
phase: '1. 目录结构分析',
|
|
130
|
-
action: '浏览项目根目录和核心子目录,识别分层结构(Controller/View/Model/Service 等)',
|
|
131
|
-
expectedOutput: '项目的分层架构图和模块划分',
|
|
132
|
-
tools: ['list_dir 浏览项目目录结构'],
|
|
133
|
-
},
|
|
134
|
-
{
|
|
135
|
-
phase: '2. 依赖关系分析',
|
|
136
|
-
action: '阅读核心模块的 import/include,追踪模块间依赖方向',
|
|
137
|
-
expectedOutput: '模块间通信方式清单(Protocol/Delegate/Notification/DI 等)',
|
|
138
|
-
tools: ['grep_search 搜索 import/include/require 语句'],
|
|
139
|
-
},
|
|
140
|
-
{
|
|
141
|
-
phase: '3. 边界约束验证',
|
|
142
|
-
action: '确认是否存在分层约束(如 View 不直接访问 Model),搜索违反约束的例外',
|
|
143
|
-
expectedOutput: '架构约束规则 + 违规例外及原因',
|
|
144
|
-
},
|
|
145
|
-
{
|
|
146
|
-
phase: '4. 提交',
|
|
147
|
-
action: '分别提交分层架构、模块通信、依赖管理等知识候选(**最少 3 条,目标 5 条**)',
|
|
148
|
-
qualityChecklist: [
|
|
149
|
-
'候选数量 ≥3(分层结构、通信方式、依赖管理应分别提交)',
|
|
150
|
-
'content 包含架构层次图或文字描述',
|
|
151
|
-
'引用具体目录路径和核心文件',
|
|
152
|
-
'doClause 表达架构约束规则',
|
|
153
|
-
'dontClause 表达禁止的跨层调用',
|
|
154
|
-
],
|
|
155
|
-
},
|
|
156
|
-
],
|
|
157
|
-
timeEstimate: '1-5 min',
|
|
158
|
-
commonMistakes: [
|
|
159
|
-
'不要只描述目录名 — 要分析每层的职责和通信方式',
|
|
160
|
-
'不要忽略依赖方向 — 是 Controller→Service 还是双向依赖?',
|
|
161
|
-
'不要把整个架构写进一个候选 — 分层结构、通信方式、依赖管理应分别提交',
|
|
162
|
-
],
|
|
163
|
-
},
|
|
164
|
-
'best-practice': {
|
|
165
|
-
focusKeywords: [
|
|
166
|
-
'错误处理',
|
|
167
|
-
'Error Handling',
|
|
168
|
-
'并发安全',
|
|
169
|
-
'线程安全',
|
|
170
|
-
'内存管理',
|
|
171
|
-
'日志',
|
|
172
|
-
'测试',
|
|
173
|
-
'logging',
|
|
174
|
-
'concurrency',
|
|
175
|
-
],
|
|
176
|
-
steps: [
|
|
177
|
-
{
|
|
178
|
-
phase: '1. 错误处理扫描',
|
|
179
|
-
action: '搜索 try/catch/throw、Error/Exception、错误码定义,分析错误处理策略',
|
|
180
|
-
expectedOutput: '错误处理模式分类 + 统计分布',
|
|
181
|
-
tools: ['grep_search 搜索错误处理关键词'],
|
|
182
|
-
},
|
|
183
|
-
{
|
|
184
|
-
phase: '2. 并发与安全分析',
|
|
185
|
-
action: '搜索锁/队列/线程相关代码(dispatch_queue/mutex/synchronized/async-await),分析并发安全策略',
|
|
186
|
-
expectedOutput: '并发模式 + 线程安全约束',
|
|
187
|
-
tools: ['grep_search 搜索并发相关关键词'],
|
|
188
|
-
},
|
|
189
|
-
{
|
|
190
|
-
phase: '3. 日志与调试',
|
|
191
|
-
action: '搜索日志框架使用(NSLog/Logger/print/console.log),分析日志规范',
|
|
192
|
-
expectedOutput: '日志级别使用惯例 + 调试基础设施',
|
|
193
|
-
},
|
|
194
|
-
{
|
|
195
|
-
phase: '4. 提交',
|
|
196
|
-
action: '每种最佳实践独立提交(**整体最少 3 条,目标 5 条**),包含正反面代码示例',
|
|
197
|
-
qualityChecklist: [
|
|
198
|
-
'候选数量 ≥3(错误处理、并发安全、日志规范等应分别提交)',
|
|
199
|
-
'每个候选聚焦一种实践(如"错误处理"或"并发安全")',
|
|
200
|
-
'content 包含 ✅ 推荐写法 和 ❌ 反模式',
|
|
201
|
-
'提供具体的统计数据(如"项目中 80% 的错误处理使用 Result 类型")',
|
|
202
|
-
'coreCode 展示推荐的代码模板',
|
|
203
|
-
],
|
|
204
|
-
},
|
|
205
|
-
],
|
|
206
|
-
timeEstimate: '1-5 min',
|
|
207
|
-
commonMistakes: [
|
|
208
|
-
'不要笼统写"项目有错误处理" — 必须说明具体的处理策略(Result/throw/错误码)',
|
|
209
|
-
'不要忽略反模式 — dontClause 要具体说明禁止的做法',
|
|
210
|
-
'不要遗漏并发安全 — 这是代码补全时最容易出错的地方',
|
|
211
|
-
],
|
|
212
|
-
},
|
|
213
|
-
'event-and-data-flow': {
|
|
214
|
-
focusKeywords: [
|
|
215
|
-
'事件',
|
|
216
|
-
'Delegate',
|
|
217
|
-
'Notification',
|
|
218
|
-
'Block',
|
|
219
|
-
'Closure',
|
|
220
|
-
'callback',
|
|
221
|
-
'数据流',
|
|
222
|
-
'状态管理',
|
|
223
|
-
'KVO',
|
|
224
|
-
'响应式',
|
|
225
|
-
'持久化',
|
|
226
|
-
'Observable',
|
|
227
|
-
],
|
|
228
|
-
steps: [
|
|
229
|
-
{
|
|
230
|
-
phase: '1. 事件机制扫描',
|
|
231
|
-
action: '搜索 Delegate/Protocol、Notification、Callback/Closure/Block、EventEmitter 等事件传播机制',
|
|
232
|
-
expectedOutput: '事件传播机制清单 + 各机制使用频率统计',
|
|
233
|
-
tools: ['grep_search 搜索事件相关关键词'],
|
|
234
|
-
},
|
|
235
|
-
{
|
|
236
|
-
phase: '2. 数据流追踪',
|
|
237
|
-
action: '选取 2-3 个核心业务流程,追踪数据从输入到持久化的完整路径',
|
|
238
|
-
expectedOutput: '数据流转路径图 + 状态管理方式',
|
|
239
|
-
tools: ['read_file 阅读核心业务流程入口'],
|
|
240
|
-
},
|
|
241
|
-
{
|
|
242
|
-
phase: '3. 持久化方案',
|
|
243
|
-
action: '搜索数据库/缓存/文件存储相关代码,分析数据持久化方案',
|
|
244
|
-
expectedOutput: '持久化技术栈 + 数据访问模式',
|
|
245
|
-
},
|
|
246
|
-
{
|
|
247
|
-
phase: '4. 提交',
|
|
248
|
-
action: '事件传播和数据流分别提交候选(**最少 3 条,目标 5 条**,将不同机制拆为独立候选)',
|
|
249
|
-
qualityChecklist: [
|
|
250
|
-
'候选数量 ≥3(Delegate、Notification、Callback 等每种机制独立提交)',
|
|
251
|
-
'每个候选聚焦一种事件/数据流模式',
|
|
252
|
-
'content 描述具体的事件传播链路(从触发到响应)',
|
|
253
|
-
'whenClause 描述何时使用此事件/数据模式',
|
|
254
|
-
'引用具体的文件路径和代码行',
|
|
255
|
-
],
|
|
256
|
-
},
|
|
257
|
-
],
|
|
258
|
-
timeEstimate: '1-5 min',
|
|
259
|
-
commonMistakes: [
|
|
260
|
-
'不要只列出"项目使用 Notification" — 要说明具体的通知名、发送者、接收者',
|
|
261
|
-
'不要混淆事件传播和数据流 — Delegate 是事件机制,CoreData 是数据流',
|
|
262
|
-
'应关注跨模块的事件链路 — 单模块内的方法调用不算事件传播',
|
|
263
|
-
],
|
|
264
|
-
},
|
|
265
|
-
'project-profile': {
|
|
266
|
-
focusKeywords: [
|
|
267
|
-
'技术栈',
|
|
268
|
-
'目录结构',
|
|
269
|
-
'三方依赖',
|
|
270
|
-
'基础设施',
|
|
271
|
-
'生命周期',
|
|
272
|
-
'启动流程',
|
|
273
|
-
'Runtime',
|
|
274
|
-
'入口点',
|
|
275
|
-
],
|
|
276
|
-
steps: [
|
|
277
|
-
{
|
|
278
|
-
phase: '1. 项目结构概览',
|
|
279
|
-
action: '浏览根目录和核心子目录,识别模块划分和技术栈',
|
|
280
|
-
expectedOutput: '技术栈清单、目录结构图、模块列表',
|
|
281
|
-
tools: [
|
|
282
|
-
'list_dir 浏览目录',
|
|
283
|
-
'read_file 阅读配置文件(Package.swift/Podfile/package.json 等)',
|
|
284
|
-
],
|
|
285
|
-
},
|
|
286
|
-
{
|
|
287
|
-
phase: '2. 依赖与基础设施',
|
|
288
|
-
action: '阅读依赖配置文件,识别三方库及其用途;搜索基础设施服务(网络/存储/日志)',
|
|
289
|
-
expectedOutput: '三方依赖清单 + 基础设施服务注册表',
|
|
290
|
-
tools: ['read_file 阅读依赖配置', 'grep_search 搜索服务注册/初始化代码'],
|
|
291
|
-
},
|
|
292
|
-
{
|
|
293
|
-
phase: '3. 入口与生命周期',
|
|
294
|
-
action: '找到应用入口点,分析启动流程和生命周期 hook',
|
|
295
|
-
expectedOutput: '启动流程链路 + 核心生命周期回调',
|
|
296
|
-
tools: ['grep_search 搜索 main/AppDelegate/Application 等入口关键词'],
|
|
297
|
-
},
|
|
298
|
-
{
|
|
299
|
-
phase: '4. 提交',
|
|
300
|
-
action: '分模块提交项目特征候选(**最少 3 条,目标 5 条**:技术栈、依赖、入口点、基础设施等分别提交)',
|
|
301
|
-
qualityChecklist: [
|
|
302
|
-
'候选数量 ≥3(技术栈、三方依赖、启动流程等应独立成条)',
|
|
303
|
-
'content 包含具体的技术栈版本和依赖列表',
|
|
304
|
-
'引用配置文件和入口文件路径',
|
|
305
|
-
'每个候选只关注一个方面(如"三方依赖"或"启动流程")',
|
|
306
|
-
'coreCode 展示关键的配置或初始化代码',
|
|
307
|
-
],
|
|
308
|
-
},
|
|
309
|
-
],
|
|
310
|
-
timeEstimate: '1-5 min',
|
|
311
|
-
commonMistakes: [
|
|
312
|
-
'不要直接复制依赖列表 — 要说明每个关键依赖的用途和版本',
|
|
313
|
-
'不要只写"项目使用 MVC" — 要说明具体的分层职责和文件组织方式',
|
|
314
|
-
'不要遗漏项目的自定义基类和全局定义 — 这些是开发时最容易忽略的',
|
|
315
|
-
],
|
|
316
|
-
},
|
|
317
|
-
'agent-guidelines': {
|
|
318
|
-
focusKeywords: [
|
|
319
|
-
'强制规范',
|
|
320
|
-
'约束',
|
|
321
|
-
'废弃 API',
|
|
322
|
-
'deprecated',
|
|
323
|
-
'线程安全',
|
|
324
|
-
'内存约束',
|
|
325
|
-
'TODO',
|
|
326
|
-
'FIXME',
|
|
327
|
-
'架构约束',
|
|
328
|
-
],
|
|
329
|
-
steps: [
|
|
330
|
-
{
|
|
331
|
-
phase: '1. 综合前序维度发现',
|
|
332
|
-
action: '回顾之前所有维度分析的结果,提取项目开发中最重要的强制约束规则',
|
|
333
|
-
expectedOutput: '关键约束规则清单(命名、线程、内存、已废弃 API)',
|
|
334
|
-
},
|
|
335
|
-
{
|
|
336
|
-
phase: '2. 搜索显式约束',
|
|
337
|
-
action: '搜索 TODO/FIXME/DEPRECATED/WARNING 注释,以及 lint 配置中的强制规则',
|
|
338
|
-
expectedOutput: '项目显式标注的约束和已废弃 API 列表',
|
|
339
|
-
tools: ['grep_search 搜索 TODO/FIXME/DEPRECATED/WARNING'],
|
|
340
|
-
},
|
|
341
|
-
{
|
|
342
|
-
phase: '3. 推导隐式约束',
|
|
343
|
-
action: '从代码模式中推导隐式约束(如"所有 Manager 必须是单例"、"网络请求必须通过 BaseRequest")',
|
|
344
|
-
expectedOutput: '隐式约束规则 + 代码证据',
|
|
345
|
-
},
|
|
346
|
-
{
|
|
347
|
-
phase: '4. 提交',
|
|
348
|
-
action: '每条开发约束单独提交(**最少 3 条,目标 5 条**),确保 doClause 表达清晰的强制规则',
|
|
349
|
-
qualityChecklist: [
|
|
350
|
-
'候选数量 ≥3(命名约束、线程约束、废弃 API 等应分别提交)',
|
|
351
|
-
'每个候选是一条明确的项目开发规则',
|
|
352
|
-
'doClause 以动词开头,表达强制性要求',
|
|
353
|
-
'dontClause 明确禁止的做法',
|
|
354
|
-
'content 说明规则来源和违反后果',
|
|
355
|
-
'【禁止】标题和内容中不要出现 "Agent" 字样 — 应写为项目规范/开发规范',
|
|
356
|
-
],
|
|
357
|
-
},
|
|
358
|
-
],
|
|
359
|
-
timeEstimate: '1-5 min',
|
|
360
|
-
commonMistakes: [
|
|
361
|
-
'【重要】不要在标题或内容中使用 "Agent" 字样 — 这是项目编码规范,不是 Agent 说明书',
|
|
362
|
-
'不要只写通用编程建议 — 必须是此项目特有的约束',
|
|
363
|
-
'不要遗漏线程安全约束 — 这是代码补全时最容易犯的错误',
|
|
364
|
-
'本维度应在最后分析 — 需要综合前序维度的发现',
|
|
365
|
-
'不要把所有规则写进一个候选 — 每条约束独立成条',
|
|
366
|
-
],
|
|
367
|
-
},
|
|
368
|
-
// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
369
|
-
// 语言条件维度
|
|
370
|
-
// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
371
|
-
'objc-deep-scan': {
|
|
372
|
-
focusKeywords: [
|
|
373
|
-
'#define',
|
|
374
|
-
'宏',
|
|
375
|
-
'macro',
|
|
376
|
-
'extern',
|
|
377
|
-
'static',
|
|
378
|
-
'常量',
|
|
379
|
-
'Swizzling',
|
|
380
|
-
'hook',
|
|
381
|
-
'Method Swizzling',
|
|
382
|
-
],
|
|
383
|
-
steps: [
|
|
384
|
-
{
|
|
385
|
-
phase: '1. 宏定义扫描',
|
|
386
|
-
action: '搜索 #define 值宏和函数宏,分类统计常量宏 vs 功能宏',
|
|
387
|
-
expectedOutput: '宏定义分类清单 + 使用频率统计',
|
|
388
|
-
tools: ['grep_search 搜索 #define'],
|
|
389
|
-
},
|
|
390
|
-
{
|
|
391
|
-
phase: '2. 常量定义扫描',
|
|
392
|
-
action: '搜索 extern/static 常量定义、NS_ENUM/NS_OPTIONS 类型定义',
|
|
393
|
-
expectedOutput: '常量定义清单 + 命名约定分析',
|
|
394
|
-
tools: ['grep_search 搜索 extern/static const'],
|
|
395
|
-
},
|
|
396
|
-
{
|
|
397
|
-
phase: '3. Method Swizzling 扫描',
|
|
398
|
-
action: '搜索 method_exchangeImplementations、class_addMethod、+load、+initialize',
|
|
399
|
-
expectedOutput: 'Hook 清单(原方法→替换方法映射)+ 执行时机',
|
|
400
|
-
tools: ['grep_search 搜索 swizzl/method_exchange/class_addMethod'],
|
|
401
|
-
},
|
|
402
|
-
{
|
|
403
|
-
phase: '4. 提交',
|
|
404
|
-
action: '宏定义、常量、Hook 分别提交候选(**最少 3 条,目标 5 条**),确保包含完整实现代码',
|
|
405
|
-
qualityChecklist: [
|
|
406
|
-
'候选数量 ≥3(宏定义、常量定义、Method Swizzling 等应分别提交)',
|
|
407
|
-
'coreCode 包含完整的宏/常量/Hook 实现',
|
|
408
|
-
'content 包含使用频率和场景说明',
|
|
409
|
-
'Hook 候选必须说明原方法和替换方法的对应关系',
|
|
410
|
-
'常量候选必须包含 extern 声明和值定义',
|
|
411
|
-
],
|
|
412
|
-
},
|
|
413
|
-
],
|
|
414
|
-
timeEstimate: '1-5 min',
|
|
415
|
-
commonMistakes: [
|
|
416
|
-
'不要只列出宏名 — 必须包含宏定义的完整值和使用场景',
|
|
417
|
-
'Hook 必须说明 hook 的目的和潜在风险',
|
|
418
|
-
'常量必须说明值和使用位置 — Agent 需要知道用哪个常量替代硬编码',
|
|
419
|
-
],
|
|
420
|
-
},
|
|
421
|
-
'category-scan': {
|
|
422
|
-
focusKeywords: [
|
|
423
|
-
'Category',
|
|
424
|
-
'Extension',
|
|
425
|
-
'Foundation',
|
|
426
|
-
'UIKit',
|
|
427
|
-
'分类方法',
|
|
428
|
-
'NSString',
|
|
429
|
-
'UIView',
|
|
430
|
-
'NSArray',
|
|
431
|
-
],
|
|
432
|
-
steps: [
|
|
433
|
-
{
|
|
434
|
-
phase: '1. Category 文件定位',
|
|
435
|
-
action: '搜索 Foundation/UIKit 基础类的 Category 文件(NSString+/UIView+/NSDictionary+ 等)',
|
|
436
|
-
expectedOutput: 'Category 文件列表 + 基类分类统计',
|
|
437
|
-
tools: [
|
|
438
|
-
'file_search 搜索 +Extension/+Category 文件',
|
|
439
|
-
'grep_search 搜索 @interface.*Category',
|
|
440
|
-
],
|
|
441
|
-
},
|
|
442
|
-
{
|
|
443
|
-
phase: '2. 逐方法分析',
|
|
444
|
-
action: '阅读每个 Category,记录方法签名、实现代码和使用场景',
|
|
445
|
-
expectedOutput: '每个 Category 的方法清单 + 核心方法实现代码',
|
|
446
|
-
tools: ['read_file 逐个阅读 Category 文件'],
|
|
447
|
-
},
|
|
448
|
-
{
|
|
449
|
-
phase: '3. 使用频率验证',
|
|
450
|
-
action: '搜索核心 Category 方法在项目中的调用频率',
|
|
451
|
-
expectedOutput: '高频使用的 Category 方法排行',
|
|
452
|
-
tools: ['grep_search 搜索 Category 方法名'],
|
|
453
|
-
},
|
|
454
|
-
{
|
|
455
|
-
phase: '4. 提交',
|
|
456
|
-
action: '按基类分组提交候选(**最少 3 条,目标 5 条**:NSString Category 一条、UIView Category 一条等)',
|
|
457
|
-
qualityChecklist: [
|
|
458
|
-
'候选数量 ≥3(不同基类的 Category 独立提交)',
|
|
459
|
-
'content 包含完整的方法签名列表',
|
|
460
|
-
'coreCode 包含最常用方法的实现代码',
|
|
461
|
-
'doClause 强制要求使用已有 Category 方法',
|
|
462
|
-
'dontClause 禁止重复实现同功能方法',
|
|
463
|
-
],
|
|
464
|
-
},
|
|
465
|
-
],
|
|
466
|
-
timeEstimate: '1-5 min',
|
|
467
|
-
commonMistakes: [
|
|
468
|
-
'不要遗漏任何 Category 方法 — 要做到全量扫描',
|
|
469
|
-
'不要只列出方法名不含实现 — Agent 需要实现代码才能正确使用',
|
|
470
|
-
'不要把业务代码 Category 混入基础类 Category',
|
|
471
|
-
],
|
|
472
|
-
},
|
|
473
|
-
'module-export-scan': {
|
|
474
|
-
focusKeywords: [
|
|
475
|
-
'export',
|
|
476
|
-
'barrel',
|
|
477
|
-
're-export',
|
|
478
|
-
'index.ts',
|
|
479
|
-
'public API',
|
|
480
|
-
'tree-shaking',
|
|
481
|
-
'import',
|
|
482
|
-
],
|
|
483
|
-
steps: [
|
|
484
|
-
{
|
|
485
|
-
phase: '1. barrel export 扫描',
|
|
486
|
-
action: '搜索 index.ts/index.js 文件,分析 re-export 结构',
|
|
487
|
-
expectedOutput: 'barrel export 结构图 + public API surface',
|
|
488
|
-
tools: ['file_search 搜索 index.ts/index.js', 'grep_search 搜索 export.*from'],
|
|
489
|
-
},
|
|
490
|
-
{
|
|
491
|
-
phase: '2. 导出模式分析',
|
|
492
|
-
action: '统计 named export vs default export 使用比例,分析导出命名约定',
|
|
493
|
-
expectedOutput: '导出模式统计 + 命名约定',
|
|
494
|
-
tools: ['grep_search 搜索 export default/export const/export function'],
|
|
495
|
-
},
|
|
496
|
-
{
|
|
497
|
-
phase: '3. 循环依赖检测',
|
|
498
|
-
action: '追踪 import 链路,检查模块间是否存在循环依赖',
|
|
499
|
-
expectedOutput: '循环依赖列表(如有)+ 模块依赖方向约束',
|
|
500
|
-
},
|
|
501
|
-
{
|
|
502
|
-
phase: '4. 提交',
|
|
503
|
-
action: '分别提交 barrel export 结构、导出约定、依赖约束等候选(**最少 3 条,目标 5 条**)',
|
|
504
|
-
qualityChecklist: [
|
|
505
|
-
'候选数量 ≥3(barrel export、命名导出约定、依赖方向约束等独立提交)',
|
|
506
|
-
'content 包含具体的 import/export 代码示例',
|
|
507
|
-
'引用 index.ts 和核心模块文件路径',
|
|
508
|
-
'doClause 表达导出约定规则',
|
|
509
|
-
'coreCode 展示标准的 export 写法',
|
|
510
|
-
],
|
|
511
|
-
},
|
|
512
|
-
],
|
|
513
|
-
timeEstimate: '1-5 min',
|
|
514
|
-
commonMistakes: [
|
|
515
|
-
'不要只说"项目使用 named export" — 要展示具体的 export 模式和约定',
|
|
516
|
-
'不要忽略 re-export 链路 — barrel export 结构对项目维护很重要',
|
|
517
|
-
'如果项目有 tree-shaking 相关配置,需要特别说明',
|
|
518
|
-
],
|
|
519
|
-
},
|
|
520
|
-
'framework-convention-scan': {
|
|
521
|
-
focusKeywords: [
|
|
522
|
-
'组件',
|
|
523
|
-
'component',
|
|
524
|
-
'状态管理',
|
|
525
|
-
'store',
|
|
526
|
-
'路由',
|
|
527
|
-
'router',
|
|
528
|
-
'样式',
|
|
529
|
-
'CSS',
|
|
530
|
-
'data fetching',
|
|
531
|
-
],
|
|
532
|
-
steps: [
|
|
533
|
-
{
|
|
534
|
-
phase: '1. 组件结构分析',
|
|
535
|
-
action: '浏览组件目录,分析组件文件组织方式(单文件/目录组件/atoms-molecules 等)',
|
|
536
|
-
expectedOutput: '组件目录结构约定 + 命名约定',
|
|
537
|
-
tools: ['list_dir 浏览组件目录', 'read_file 阅读代表性组件'],
|
|
538
|
-
},
|
|
539
|
-
{
|
|
540
|
-
phase: '2. 状态管理分析',
|
|
541
|
-
action: '搜索状态管理相关代码(store/reducer/action/mutation/atom 等)',
|
|
542
|
-
expectedOutput: '状态管理方案 + 使用模式 + 约定',
|
|
543
|
-
tools: ['grep_search 搜索 store/useStore/createSlice/defineStore 等'],
|
|
544
|
-
},
|
|
545
|
-
{
|
|
546
|
-
phase: '3. 路由与数据获取',
|
|
547
|
-
action: '分析路由配置和数据获取模式(SSR/CSR/ISR 等)',
|
|
548
|
-
expectedOutput: '路由约定 + 数据获取模式',
|
|
549
|
-
tools: ['grep_search 搜索 router/route/fetch/loader/getServerSideProps'],
|
|
550
|
-
},
|
|
551
|
-
{
|
|
552
|
-
phase: '4. 提交',
|
|
553
|
-
action: '组件约定、状态管理、路由模式分别提交候选(**最少 3 条,目标 5 条**)',
|
|
554
|
-
qualityChecklist: [
|
|
555
|
-
'候选数量 ≥3(组件结构、状态管理、路由配置等独立提交)',
|
|
556
|
-
'content 包含组件/状态/路由的代码示例',
|
|
557
|
-
'引用具体框架版本和配置文件',
|
|
558
|
-
'coreCode 是可复制的标准写法模板',
|
|
559
|
-
'whenClause 描述何时使用此约定',
|
|
560
|
-
],
|
|
561
|
-
},
|
|
562
|
-
],
|
|
563
|
-
timeEstimate: '1-5 min',
|
|
564
|
-
commonMistakes: [
|
|
565
|
-
'不要假设框架版本 — 从 package.json 确认具体版本再分析',
|
|
566
|
-
'不要只分析组件结构忽略状态管理 — 状态管理模式对项目开发至关重要',
|
|
567
|
-
'不要混淆 SSR 和 CSR 数据获取模式',
|
|
568
|
-
],
|
|
569
|
-
},
|
|
570
|
-
'python-package-scan': {
|
|
571
|
-
focusKeywords: [
|
|
572
|
-
'__init__',
|
|
573
|
-
'import',
|
|
574
|
-
'type hints',
|
|
575
|
-
'decorator',
|
|
576
|
-
'__all__',
|
|
577
|
-
'package',
|
|
578
|
-
'module',
|
|
579
|
-
],
|
|
580
|
-
steps: [
|
|
581
|
-
{
|
|
582
|
-
phase: '1. 包结构分析',
|
|
583
|
-
action: '浏览包目录,分析 __init__.py 内容和 __all__ 定义',
|
|
584
|
-
expectedOutput: '__init__.py 导出策略 + 包层级结构',
|
|
585
|
-
tools: ['file_search 搜索 __init__.py', 'read_file 阅读 __init__.py 文件'],
|
|
586
|
-
},
|
|
587
|
-
{
|
|
588
|
-
phase: '2. 导入风格分析',
|
|
589
|
-
action: '统计相对导入 vs 绝对导入使用比例,分析导入约定',
|
|
590
|
-
expectedOutput: '导入风格统计 + 项目约定',
|
|
591
|
-
tools: ['grep_search 搜索 from . import/from .. import/import xxx'],
|
|
592
|
-
},
|
|
593
|
-
{
|
|
594
|
-
phase: '3. 类型标注与装饰器',
|
|
595
|
-
action: '分析 type hints 覆盖率、Protocol 使用、decorator 模式',
|
|
596
|
-
expectedOutput: '类型标注覆盖率 + 常用装饰器清单',
|
|
597
|
-
tools: ['grep_search 搜索 -> /: str/: int/Protocol/@decorator'],
|
|
598
|
-
},
|
|
599
|
-
{
|
|
600
|
-
phase: '4. 提交',
|
|
601
|
-
action: '包结构、导入约定、类型标注分别提交候选(**最少 3 条,目标 5 条**)',
|
|
602
|
-
qualityChecklist: [
|
|
603
|
-
'候选数量 ≥3(包结构、导入风格、类型标注约定独立提交)',
|
|
604
|
-
'content 包含具体的 import/type hint 代码示例',
|
|
605
|
-
'引用 __init__.py 和核心模块路径',
|
|
606
|
-
'coreCode 展示标准的导入和类型标注写法',
|
|
607
|
-
'doClause 表达导入和类型标注约定',
|
|
608
|
-
],
|
|
609
|
-
},
|
|
610
|
-
],
|
|
611
|
-
timeEstimate: '1-5 min',
|
|
612
|
-
commonMistakes: [
|
|
613
|
-
'不要忽略 __all__ 定义 — 它决定了 from pkg import * 的行为',
|
|
614
|
-
'不要假设所有包都有 type hints — 先统计覆盖率再分析',
|
|
615
|
-
'不要遗漏 decorator 模式 — 自定义 decorator 是项目的重要约定',
|
|
616
|
-
],
|
|
617
|
-
},
|
|
618
|
-
'jvm-annotation-scan': {
|
|
619
|
-
focusKeywords: [
|
|
620
|
-
'@Inject',
|
|
621
|
-
'@Autowired',
|
|
622
|
-
'@Component',
|
|
623
|
-
'@Entity',
|
|
624
|
-
'@Table',
|
|
625
|
-
'@RestController',
|
|
626
|
-
'annotation',
|
|
627
|
-
'DI',
|
|
628
|
-
'ORM',
|
|
629
|
-
],
|
|
630
|
-
steps: [
|
|
631
|
-
{
|
|
632
|
-
phase: '1. DI 注解扫描',
|
|
633
|
-
action: '搜索 @Inject/@Autowired/@Component/@Service/@Repository 等 DI 注解',
|
|
634
|
-
expectedOutput: 'DI 注解使用模式 + 统计',
|
|
635
|
-
tools: ['grep_search 搜索 @Inject/@Autowired/@Component'],
|
|
636
|
-
},
|
|
637
|
-
{
|
|
638
|
-
phase: '2. ORM 注解扫描',
|
|
639
|
-
action: '搜索 @Entity/@Table/@Column/@ManyToOne 等 ORM 注解',
|
|
640
|
-
expectedOutput: 'ORM 映射模式 + 实体关系图',
|
|
641
|
-
tools: ['grep_search 搜索 @Entity/@Table/@Column'],
|
|
642
|
-
},
|
|
643
|
-
{
|
|
644
|
-
phase: '3. API 与自定义注解',
|
|
645
|
-
action: '搜索 @RestController/@RequestMapping/@GetMapping + 自定义注解定义',
|
|
646
|
-
expectedOutput: 'API 路由约定 + 自定义注解清单及用途',
|
|
647
|
-
tools: ['grep_search 搜索 @RestController/@interface (annotation 定义)'],
|
|
648
|
-
},
|
|
649
|
-
{
|
|
650
|
-
phase: '4. 提交',
|
|
651
|
-
action: 'DI、ORM、API、自定义注解分别提交候选(**最少 3 条,目标 5 条**)',
|
|
652
|
-
qualityChecklist: [
|
|
653
|
-
'候选数量 ≥3(DI 注解、ORM 注解、API 注解等独立提交)',
|
|
654
|
-
'content 包含注解的完整使用示例',
|
|
655
|
-
'引用具体的类文件和配置',
|
|
656
|
-
'coreCode 展示标准的注解使用骨架',
|
|
657
|
-
'doClause 表达注解使用的强制规则',
|
|
658
|
-
],
|
|
659
|
-
},
|
|
660
|
-
],
|
|
661
|
-
timeEstimate: '1-5 min',
|
|
662
|
-
commonMistakes: [
|
|
663
|
-
'不要只扫描 Spring 注解 — 项目可能使用 Guice/Dagger/Hilt',
|
|
664
|
-
'不要忽略自定义注解 — 它们编码了项目特有的规则',
|
|
665
|
-
'区分 field injection 和 constructor injection — 项目通常有明确偏好',
|
|
666
|
-
],
|
|
667
|
-
},
|
|
668
|
-
'go-module-scan': {
|
|
669
|
-
focusKeywords: ['go.mod', 'internal', 'cmd', 'build tags', 'interface', 'init()', 'package'],
|
|
670
|
-
steps: [
|
|
671
|
-
{
|
|
672
|
-
phase: '1. 模块结构分析',
|
|
673
|
-
action: '阅读 go.mod,浏览 cmd/ 目录和 internal/ 目录',
|
|
674
|
-
expectedOutput: 'go.mod 依赖图 + 入口点枚举 + internal 包边界',
|
|
675
|
-
tools: ['read_file 阅读 go.mod', 'list_dir 浏览 cmd/ 和 internal/'],
|
|
676
|
-
},
|
|
677
|
-
{
|
|
678
|
-
phase: '2. 接口分布分析',
|
|
679
|
-
action: '搜索 interface 定义和实现,分析接口设计模式',
|
|
680
|
-
expectedOutput: '核心接口清单 + 实现关系',
|
|
681
|
-
tools: ['grep_search 搜索 type.*interface'],
|
|
682
|
-
},
|
|
683
|
-
{
|
|
684
|
-
phase: '3. 初始化与构建',
|
|
685
|
-
action: '搜索 init() 函数、build tags,分析初始化链路',
|
|
686
|
-
expectedOutput: 'init() 执行链路 + build tags 约束',
|
|
687
|
-
tools: ['grep_search 搜索 func init()/go:build'],
|
|
688
|
-
},
|
|
689
|
-
{
|
|
690
|
-
phase: '4. 提交',
|
|
691
|
-
action: '模块结构、接口约定、初始化模式分别提交候选(**最少 3 条,目标 5 条**)',
|
|
692
|
-
qualityChecklist: [
|
|
693
|
-
'候选数量 ≥3(模块结构、接口约定、初始化模式独立提交)',
|
|
694
|
-
'content 包含模块依赖关系和接口设计',
|
|
695
|
-
'引用 go.mod 和核心包路径',
|
|
696
|
-
'coreCode 展示标准的接口定义和使用',
|
|
697
|
-
'doClause 表达模块边界和导入约束',
|
|
698
|
-
],
|
|
699
|
-
},
|
|
700
|
-
],
|
|
701
|
-
timeEstimate: '1-5 min',
|
|
702
|
-
commonMistakes: [
|
|
703
|
-
'不要忽略 internal/ 包的隔离边界 — 这是 Go 的强制约束',
|
|
704
|
-
'不要只列出依赖不说明用途',
|
|
705
|
-
'注意区分项目自有模块和第三方模块',
|
|
706
|
-
],
|
|
707
|
-
},
|
|
708
|
-
};
|
|
709
|
-
// ═══════════════════════════════════════════════════════════
|
|
710
|
-
// Quality Checklist (提交前自检清单)
|
|
711
|
-
// ═══════════════════════════════════════════════════════════
|
|
712
|
-
export const PRE_SUBMIT_CHECKLIST = {
|
|
713
|
-
MUST: [
|
|
714
|
-
'content.markdown ≥ 200 字符(含 ## 标题 + 正文 + 代码块 + 来源标注)',
|
|
715
|
-
'引用 ≥ 3 个项目真实文件路径(不得编造文件路径)',
|
|
716
|
-
'至少 1 个 ```代码块``` + 来源标注「(来源: FileName.ext:行号)」',
|
|
717
|
-
'doClause 英文祈使句 + 以动词开头 + ≤60 tokens + 包含项目特定信息',
|
|
718
|
-
'dontClause 英文反向约束 + 描述具体的禁止做法',
|
|
719
|
-
'whenClause 英文触发场景 + 描述具体的适用条件',
|
|
720
|
-
'trigger 唯一 + @kebab-case 格式',
|
|
721
|
-
'coreCode 3-8 行可复制纯代码骨架(语法完整、括号配对)',
|
|
722
|
-
'kind 正确分类: rule=强制约束 | pattern=实现模式 | fact=项目事实',
|
|
723
|
-
'usageGuide ### 章节格式使用指南 — 描述何时使用此模式、步骤和注意事项',
|
|
724
|
-
'标题和正文禁止出现 "Agent" 字样 — 所有候选必须以项目规范/开发规范视角撰写',
|
|
725
|
-
],
|
|
726
|
-
SHOULD: [
|
|
727
|
-
'每个候选聚焦单一知识点 — 不要把多种模式合并成一个候选',
|
|
728
|
-
'content 包含统计数据(数量、占比、频率)',
|
|
729
|
-
'content 包含 ✅ 正确写法 和 ❌ 禁止写法的对比',
|
|
730
|
-
'reasoning.whyStandard 解释为什么这是项目标准(含统计证据)',
|
|
731
|
-
'reasoning.sources 列出 ≥2 个文件路径作为证据来源',
|
|
732
|
-
'reasoning.confidence ≥ 0.8',
|
|
733
|
-
],
|
|
734
|
-
FAIL_EXAMPLES: [
|
|
735
|
-
{
|
|
736
|
-
bad: {
|
|
737
|
-
content: '项目使用 Swift 语言开发',
|
|
738
|
-
doClause: 'use swift',
|
|
739
|
-
coreCode: '// swift code',
|
|
740
|
-
},
|
|
741
|
-
why: 'content 太短且无项目特征 — 没有展示任何具体的代码模式或约定; doClause 不是祈使句且无具体规则; coreCode 不是可复制的代码骨架',
|
|
742
|
-
good: {
|
|
743
|
-
content: '## BD 前缀单例管理类\n\n项目中所有 Manager 单例类使用 BD 前缀 + sharedInstance 模式...\n\n### 项目选择了什么\n18 个 Manager 类中 16 个使用此模式...\n\n```objc\n@interface BDVideoManager : NSObject\n+ (instancetype)sharedInstance;\n@end\n```\n(来源: BDVideoManager.h:12)',
|
|
744
|
-
doClause: 'Use BD prefix and sharedInstance class method for all singleton Manager classes',
|
|
745
|
-
coreCode: '+ (instancetype)sharedInstance {\n static id instance;\n static dispatch_once_t onceToken;\n dispatch_once(&onceToken, ^{ instance = [[self alloc] init]; });\n return instance;\n}',
|
|
746
|
-
},
|
|
747
|
-
},
|
|
748
|
-
{
|
|
749
|
-
bad: {
|
|
750
|
-
content: '## 网络请求\n\n项目有网络请求功能。使用了 URLSession。',
|
|
751
|
-
doClause: 'Make network requests using URLSession',
|
|
752
|
-
coreCode: 'URLSession.shared.dataTask(url)',
|
|
753
|
-
},
|
|
754
|
-
why: 'content 虽有标题但只有两句话 — 缺少项目特有的封装/约定/统计; doClause 是 iOS 通用知识非项目特有; coreCode 不是项目封装的调用方式',
|
|
755
|
-
good: {
|
|
756
|
-
content: '## BDBaseRequest 网络请求封装\n\n项目所有网络请求必须通过 BDBaseRequest 子类发起...\n\n### 项目选择了什么\n47 个 API 请求全部继承自 BDBaseRequest,使用 BDNetworkManager 调度...\n\n```objc\n@interface BDUserInfoRequest : BDBaseRequest\n- (void)startWithSuccess:(BDRequestSuccess)success failure:(BDRequestFailure)failure;\n@end\n```\n(来源: BDUserInfoRequest.h:8)\n\n### 新代码怎么写\n继承 BDBaseRequest,覆写 requestUrl 和 requestMethod...',
|
|
757
|
-
doClause: 'Subclass BDBaseRequest for all network requests and use BDNetworkManager for dispatch',
|
|
758
|
-
coreCode: '@interface MyRequest : BDBaseRequest\n- (NSString *)requestUrl { return @"/api/v2/xxx"; }\n- (BDRequestMethod)requestMethod { return BDRequestMethodGET; }\n@end',
|
|
759
|
-
},
|
|
760
|
-
},
|
|
761
|
-
],
|
|
762
|
-
};
|
|
763
|
-
// ═══════════════════════════════════════════════════════════
|
|
764
|
-
// SOP 查询辅助函数
|
|
765
|
-
// ═══════════════════════════════════════════════════════════
|
|
766
|
-
/**
|
|
767
|
-
* 获取维度的 SOP 配置
|
|
768
|
-
* @param dimId 维度 ID
|
|
769
|
-
* @returns SOP 配置,未定义时返回 null
|
|
770
|
-
*/
|
|
771
|
-
export function getDimensionSOP(dimId) {
|
|
772
|
-
return (DIMENSION_SOP[dimId] || null);
|
|
773
|
-
}
|
|
774
|
-
/**
|
|
775
|
-
* 获取维度的关键关注域词汇(用于 EpisodicMemory 跨维度 findings 相关性匹配)
|
|
776
|
-
*
|
|
777
|
-
* 优先使用 SOP 中显式定义的 focusKeywords;
|
|
778
|
-
* 若无,则从 baseDimension.guide 按中文顿号/逗号/斜杠拆分。
|
|
779
|
-
*
|
|
780
|
-
* @param dimId 维度 ID
|
|
781
|
-
* @param [guideText] fallback: baseDimension.guide 文本
|
|
782
|
-
* @returns 关键词列表(短语级,用于 includes() 匹配)
|
|
783
|
-
*/
|
|
784
|
-
export function getDimensionFocusKeywords(dimId, guideText = '') {
|
|
785
|
-
const sop = DIMENSION_SOP[dimId];
|
|
786
|
-
if (sop?.focusKeywords && sop.focusKeywords.length > 0) {
|
|
787
|
-
return sop.focusKeywords;
|
|
788
|
-
}
|
|
789
|
-
// fallback: 从 guide 文本按常见分隔符拆分
|
|
790
|
-
if (guideText) {
|
|
791
|
-
return guideText
|
|
792
|
-
.split(/[、,,/·]/) // 中文顿号、逗号、英文逗号、斜杠、中文间隔号
|
|
793
|
-
.map((s) => s.trim())
|
|
794
|
-
.filter((s) => s.length >= 2 && s.length <= 30);
|
|
795
|
-
}
|
|
796
|
-
return [];
|
|
797
|
-
}
|
|
798
|
-
/**
|
|
799
|
-
* 将 SOP 步骤序列化为紧凑文本(用于体积紧张时的降级)
|
|
800
|
-
* @param sop SOP 配置
|
|
801
|
-
* @returns 紧凑的文本表示
|
|
802
|
-
*/
|
|
803
|
-
export function sopToCompactText(sop) {
|
|
804
|
-
if (!sop?.steps) {
|
|
805
|
-
return '';
|
|
806
|
-
}
|
|
807
|
-
const lines = [];
|
|
808
|
-
for (const step of sop.steps) {
|
|
809
|
-
lines.push(`${step.phase}: ${step.action}`);
|
|
810
|
-
if (step.expectedOutput) {
|
|
811
|
-
lines.push(` → 预期产出: ${step.expectedOutput}`);
|
|
812
|
-
}
|
|
813
|
-
}
|
|
814
|
-
if (sop.commonMistakes && sop.commonMistakes.length > 0) {
|
|
815
|
-
lines.push('\n⚠ 常见错误:');
|
|
816
|
-
for (const m of sop.commonMistakes) {
|
|
817
|
-
lines.push(` - ${m}`);
|
|
818
|
-
}
|
|
819
|
-
}
|
|
820
|
-
return lines.join('\n');
|
|
821
|
-
}
|