This commit is contained in:
cuijiawang 2025-08-01 12:23:08 +08:00
parent feab540ba3
commit 1d53447527
22 changed files with 1021 additions and 151 deletions

Binary file not shown.

View File

@ -1,142 +0,0 @@
2025-08-01 10:09:53:152 [main] INFO c.a.c.a.e.manus.OpenManusSpringBootApplication(StartupInfoLogger.java 53) -Starting OpenManusSpringBootApplication using Java 17.0.2 with PID 23344 (C:\Users\lsdyf\Desktop\spring-ai-alibaba\spring-ai-alibaba-jmanus\target\classes started by lsdyf in C:\Users\lsdyf\Desktop\spring-ai-alibaba\spring-ai-alibaba-jmanus)
2025-08-01 10:09:53:156 [main] INFO c.a.c.a.e.manus.OpenManusSpringBootApplication(SpringApplication.java 658) -The following 1 profile is active: "h2"
2025-08-01 10:09:54:050 [main] INFO o.s.d.r.config.RepositoryConfigurationDelegate(RepositoryConfigurationDelegate.java 143) -Bootstrapping Spring Data JPA repositories in DEFAULT mode.
2025-08-01 10:09:54:288 [main] INFO o.s.d.r.config.RepositoryConfigurationDelegate(RepositoryConfigurationDelegate.java 211) -Finished Spring Data repository scanning in 229 ms. Found 10 JPA repository interfaces.
2025-08-01 10:09:54:868 [main] INFO o.s.boot.web.embedded.tomcat.TomcatWebServer(TomcatWebServer.java 111) -Tomcat initialized with port 18080 (http)
2025-08-01 10:09:54:882 [main] INFO org.apache.coyote.http11.Http11NioProtocol(DirectJDKLog.java 168) -Initializing ProtocolHandler ["http-nio-18080"]
2025-08-01 10:09:54:884 [main] INFO org.apache.catalina.core.StandardService(DirectJDKLog.java 168) -Starting service [Tomcat]
2025-08-01 10:09:54:884 [main] INFO org.apache.catalina.core.StandardEngine(DirectJDKLog.java 168) -Starting Servlet engine: [Apache Tomcat/10.1.40]
2025-08-01 10:09:54:958 [main] INFO o.a.c.core.ContainerBase.[Tomcat].[localhost].[/](DirectJDKLog.java 168) -Initializing Spring embedded WebApplicationContext
2025-08-01 10:09:54:959 [main] INFO o.s.b.w.s.c.ServletWebServerApplicationContext(ServletWebServerApplicationContext.java 301) -Root WebApplicationContext: initialization completed in 1747 ms
2025-08-01 10:09:55:130 [main] INFO org.hibernate.jpa.internal.util.LogHelper(LogHelper.java 31) -HHH000204: Processing PersistenceUnitInfo [name: default]
2025-08-01 10:09:55:212 [main] INFO org.hibernate.Version(Version.java 44) -HHH000412: Hibernate ORM core version 6.6.13.Final
2025-08-01 10:09:55:264 [main] INFO o.hibernate.cache.internal.RegionFactoryInitiator(RegionFactoryInitiator.java 50) -HHH000026: Second-level cache disabled
2025-08-01 10:09:55:596 [main] INFO o.s.o.j.persistenceunit.SpringPersistenceUnitInfo(SpringPersistenceUnitInfo.java 87) -No LoadTimeWeaver setup: ignoring JPA class transformer
2025-08-01 10:09:55:631 [main] INFO com.zaxxer.hikari.HikariDataSource(HikariDataSource.java 109) -Spring-AI-Alibaba-JManus-h2-Pool - Starting...
2025-08-01 10:09:55:898 [main] INFO com.zaxxer.hikari.pool.HikariPool(HikariPool.java 554) -Spring-AI-Alibaba-JManus-h2-Pool - Added connection conn0: url=jdbc:h2:file:./h2-data/openmanus_db user=SA
2025-08-01 10:09:55:901 [main] INFO com.zaxxer.hikari.HikariDataSource(HikariDataSource.java 122) -Spring-AI-Alibaba-JManus-h2-Pool - Start completed.
2025-08-01 10:09:55:959 [main] INFO org.hibernate.orm.connections.pooling(JdbcEnvironmentInitiator.java 157) -HHH10001005: Database info:
Database JDBC URL [Connecting through datasource 'HikariDataSource (Spring-AI-Alibaba-JManus-h2-Pool)']
Database driver: undefined/unknown
Database version: 2.3.232
Autocommit mode: undefined/unknown
Isolation level: undefined/unknown
Minimum pool size: undefined/unknown
Maximum pool size: undefined/unknown
2025-08-01 10:09:56:235 [main] INFO c.a.cloud.ai.example.manus.config.JacksonConfig(JacksonConfig.java 65) -Successfully registered JavaTimeModule to org.springframework.ai.model.ModelOptionsUtils.OBJECT_MAPPER
2025-08-01 10:09:56:236 [main] INFO c.a.cloud.ai.example.manus.config.JacksonConfig(JacksonConfig.java 65) -Successfully registered JavaTimeModule to org.springframework.ai.util.json.JsonParser.OBJECT_MAPPER
2025-08-01 10:09:56:237 [main] INFO c.a.cloud.ai.example.manus.config.JacksonConfig(JacksonConfig.java 38) -Created ObjectMapper with JavaTimeModule registered
2025-08-01 10:09:57:147 [main] INFO o.h.e.t.jta.platform.internal.JtaPlatformInitiator(JtaPlatformInitiator.java 59) -HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration)
2025-08-01 10:09:57:228 [main] INFO o.s.orm.jpa.LocalContainerEntityManagerFactoryBean(AbstractEntityManagerFactoryBean.java 447) -Initialized JPA EntityManagerFactory for persistence unit 'default'
2025-08-01 10:09:57:666 [main] INFO o.s.data.jpa.repository.query.QueryEnhancerFactory(QueryEnhancerFactory.java 49) -Hibernate is in classpath; If applicable, HQL parser will be used.
2025-08-01 10:09:58:590 [main] INFO c.a.c.a.e.m.dynamic.mcp.service.McpCacheManager(McpCacheManager.java 274) -MCP service loader configuration changed, updating thread pool
2025-08-01 10:09:58:593 [main] INFO c.a.c.a.e.m.dynamic.mcp.service.McpCacheManager(McpCacheManager.java 288) -Updated MCP service loader thread pool with max 10 concurrent connections
2025-08-01 10:09:58:594 [main] INFO c.a.c.a.e.m.dynamic.mcp.service.McpCacheManager(McpCacheManager.java 203) -Initializing MCP cache manager with double buffer mechanism
2025-08-01 10:09:58:598 [main] INFO c.a.c.a.e.m.dynamic.mcp.service.McpCacheManager(McpCacheManager.java 344) -No MCP server configurations found
2025-08-01 10:09:58:598 [main] INFO c.a.c.a.e.m.dynamic.mcp.service.McpCacheManager(McpCacheManager.java 214) -Initial cache loaded successfully with 0 services
2025-08-01 10:09:58:599 [main] INFO c.a.c.a.e.m.dynamic.mcp.service.McpCacheManager(McpCacheManager.java 236) -Scheduled cache update task started, interval: 10 minutes
2025-08-01 10:09:58:851 [main] INFO com.alibaba.cloud.ai.example.manus.llm.LlmService(LlmService.java 99) -Checking and init ChatClient instance...
2025-08-01 10:09:58:891 [main] INFO c.a.cloud.ai.example.manus.config.PlaywrightConfig(PlaywrightConfig.java 60) -PLAYWRIGHT_BROWSERS_PATH not set, using default browser path
2025-08-01 10:09:59:729 [main] INFO org.apache.coyote.http11.Http11NioProtocol(DirectJDKLog.java 168) -Starting ProtocolHandler ["http-nio-18080"]
2025-08-01 10:09:59:748 [main] INFO o.s.boot.web.embedded.tomcat.TomcatWebServer(TomcatWebServer.java 243) -Tomcat started on port 18080 (http) with context path '/'
2025-08-01 10:09:59:762 [main] INFO c.a.cloud.ai.example.manus.config.ConfigService(ConfigService.java 70) -Found 29 configuration beans
2025-08-01 10:09:59:764 [main] INFO c.a.cloud.ai.example.manus.config.ConfigService(ConfigService.java 85) -Cleaning up obsolete configurations not defined in ManusProperties...
2025-08-01 10:09:59:769 [main] INFO c.a.cloud.ai.example.manus.config.ConfigService(ConfigService.java 102) -✅ No obsolete configurations found
2025-08-01 10:09:59:945 [main] INFO c.a.c.a.e.manus.OpenManusSpringBootApplication(StartupInfoLogger.java 59) -Started OpenManusSpringBootApplication in 7.527 seconds (process running for 8.344)
2025-08-01 10:09:59:957 [main] INFO c.a.c.a.e.m.c.startUp.ConfigAppStartupListener(ConfigAppStartupListener.java 60) -Configuration system initialized with 17 total configs
2025-08-01 10:09:59:958 [main] INFO c.a.c.a.e.m.c.startUp.ConfigAppStartupListener(ConfigAppStartupListener.java 61) -Group 'manus': 17 configs
2025-08-01 10:09:59:958 [main] INFO c.a.c.a.e.m.c.startUp.ConfigAppStartupListener(ConfigAppStartupListener.java 68) -0 configs are using custom values
2025-08-01 10:09:59:959 [main] INFO c.a.c.a.e.m.c.startUp.ConfigAppStartupListener(ConfigAppStartupListener.java 78) -Starting to initialize dynamic agents...
2025-08-01 10:09:59:964 [main] INFO c.a.c.a.e.m.d.agent.service.DynamicAgentScanner(DynamicAgentScanner.java 93) -Checking for deprecated @DynamicAgentDefinition annotation usage...
2025-08-01 10:10:00:053 [main] INFO c.a.c.a.e.m.d.agent.service.DynamicAgentScanner(DynamicAgentScanner.java 174) -✅ No deprecated @DynamicAgentDefinition annotations found. System can start normally.
2025-08-01 10:10:00:054 [main] INFO c.a.c.a.e.m.d.agent.service.DynamicAgentScanner(DynamicAgentScanner.java 75) -✅ Force override from YAML enabled - Starting to scan and override agents from YAML configuration files...
2025-08-01 10:10:00:054 [main] INFO c.a.c.a.e.m.d.agent.service.DynamicAgentScanner(DynamicAgentScanner.java 181) -🔍 Starting to scan YAML agent configuration files...
2025-08-01 10:10:00:061 [main] INFO c.a.c.a.e.m.d.a.s.StartupAgentConfigLoader(StartupAgentConfigLoader.java 199) -Scanned 0 startup agents: []
2025-08-01 10:10:00:061 [main] INFO c.a.c.a.e.m.d.agent.service.DynamicAgentScanner(DynamicAgentScanner.java 212) -✅ YAML agent configuration scanning completed - Total: 0, Created: 0, Overridden: 0
2025-08-01 10:10:00:062 [main] INFO c.a.c.a.e.m.d.agent.service.DynamicAgentScanner(DynamicAgentScanner.java 81) -✅ Dynamic agent override from YAML files completed
2025-08-01 10:10:00:062 [main] INFO c.a.c.a.e.m.c.startUp.ConfigAppStartupListener(ConfigAppStartupListener.java 80) -Dynamic agents initialization completed
2025-08-01 10:10:00:062 [main] INFO c.a.c.a.e.m.t.database.DatabaseUseStartupListener(DatabaseUseStartupListener.java 48) -Starting to initialize database configurations...
2025-08-01 10:10:00:064 [main] INFO c.a.c.a.e.manus.tool.database.DataSourceService(DataSourceService.java 62) -Added datasource 'amanus' with url: jdbc:mysql://127.0.0.1:3306/amanus?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8 and type: mysql
2025-08-01 10:10:00:065 [main] INFO c.a.c.a.e.m.t.database.DatabaseUseStartupListener(DatabaseUseStartupListener.java 100) -Initialized datasource 'amanus' (type: mysql)
2025-08-01 10:10:00:065 [main] INFO c.a.c.a.e.manus.tool.database.DataSourceService(DataSourceService.java 62) -Added datasource 'testdb' with url: jdbc:h2:file:./h2-data/testdb;MODE=MYSQL;DATABASE_TO_LOWER=TRUE and type: h2
2025-08-01 10:10:00:065 [main] INFO c.a.c.a.e.m.t.database.DatabaseUseStartupListener(DatabaseUseStartupListener.java 100) -Initialized datasource 'testdb' (type: h2)
2025-08-01 10:10:00:065 [main] INFO c.a.c.a.e.m.t.database.DatabaseUseStartupListener(DatabaseUseStartupListener.java 68) -Database configurations initialized with 2 datasources
2025-08-01 10:10:00:066 [main] INFO c.a.c.a.e.m.t.database.DatabaseUseStartupListener(DatabaseUseStartupListener.java 150) -
====================================================================================================
DATABASE DATASOURCE SUMMARY
====================================================================================================
│ Datasource: amanus │ Type: mysql │ Status: ✓ INSTANTIATED │ URL: jdbc:mysql://127.0.0.1:3306/amanus?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8 │
│ Datasource: testdb │ Type: h2 │ Status: ✓ INSTANTIATED │ URL: jdbc:h2:file:./h2-data/testdb;MODE=MYSQL;DATABASE_TO_LOWER=TRUE │
----------------------------------------------------------------------------------------------------
│ SUMMARY: Total=2, Instantiated=2, Disabled=0, Failed=0 │
====================================================================================================
2025-08-01 10:10:00:072 [main] INFO c.a.c.a.e.m.d.cron.scheduler.DynamicCronTaskLoader(DynamicCronTaskLoader.java 92) -Loaded 0 enabled scheduled tasks
2025-08-01 10:10:00:072 [main] INFO c.a.c.a.e.m.d.cron.scheduler.DynamicCronTaskLoader(DynamicCronTaskLoader.java 51) -Scheduled task loading completed
2025-08-01 10:10:00:073 [main] INFO c.a.c.a.e.manus.tool.textOperator.TextFileService(TextFileService.java 76) -TextFileService initialized
2025-08-01 10:10:00:083 [main] INFO c.a.c.a.e.m.d.p.s.PromptInitializationService(PromptInitializationService.java 103) -Created prompt: PLANNING_PLAN_CREATION for namespace: default with language: en
2025-08-01 10:10:00:088 [main] INFO c.a.c.a.e.m.d.p.s.PromptInitializationService(PromptInitializationService.java 103) -Created prompt: AGENT_CURRENT_STEP_ENV for namespace: default with language: en
2025-08-01 10:10:00:092 [main] INFO c.a.c.a.e.m.d.p.s.PromptInitializationService(PromptInitializationService.java 103) -Created prompt: AGENT_STEP_EXECUTION for namespace: default with language: en
2025-08-01 10:10:00:096 [main] INFO c.a.c.a.e.m.d.p.s.PromptInitializationService(PromptInitializationService.java 103) -Created prompt: PLANNING_PLAN_FINALIZER for namespace: default with language: en
2025-08-01 10:10:00:101 [main] INFO c.a.c.a.e.m.d.p.s.PromptInitializationService(PromptInitializationService.java 103) -Created prompt: DIRECT_RESPONSE for namespace: default with language: en
2025-08-01 10:10:00:104 [main] INFO c.a.c.a.e.m.d.p.s.PromptInitializationService(PromptInitializationService.java 103) -Created prompt: AGENT_STUCK_ERROR for namespace: default with language: en
2025-08-01 10:10:00:109 [main] INFO c.a.c.a.e.m.d.p.s.PromptInitializationService(PromptInitializationService.java 103) -Created prompt: SUMMARY_PLAN_TEMPLATE for namespace: default with language: en
2025-08-01 10:10:00:112 [main] INFO c.a.c.a.e.m.d.p.s.PromptInitializationService(PromptInitializationService.java 103) -Created prompt: MAPREDUCE_TOOL_DESCRIPTION for namespace: default with language: en
2025-08-01 10:10:00:117 [main] INFO c.a.c.a.e.m.d.p.s.PromptInitializationService(PromptInitializationService.java 103) -Created prompt: MAPREDUCE_TOOL_PARAMETERS for namespace: default with language: en
2025-08-01 10:10:00:121 [main] INFO c.a.c.a.e.m.d.p.s.PromptInitializationService(PromptInitializationService.java 103) -Created prompt: AGENT_DEBUG_DETAIL_OUTPUT for namespace: default with language: en
2025-08-01 10:10:00:126 [main] INFO c.a.c.a.e.m.d.p.s.PromptInitializationService(PromptInitializationService.java 103) -Created prompt: AGENT_NORMAL_OUTPUT for namespace: default with language: en
2025-08-01 10:10:00:129 [main] INFO c.a.c.a.e.m.d.p.s.PromptInitializationService(PromptInitializationService.java 103) -Created prompt: AGENT_PARALLEL_TOOL_CALLS_RESPONSE for namespace: default with language: en
2025-08-01 10:10:00:133 [main] INFO c.a.c.a.e.m.d.p.s.PromptInitializationService(PromptInitializationService.java 103) -Created prompt: FORM_INPUT_TOOL_DESCRIPTION for namespace: default with language: en
2025-08-01 10:10:00:137 [main] INFO c.a.c.a.e.m.d.p.s.PromptInitializationService(PromptInitializationService.java 103) -Created prompt: FORM_INPUT_TOOL_PARAMETERS for namespace: default with language: en
2025-08-01 10:10:00:159 [main] INFO c.a.c.a.e.m.d.n.s.NamespaceDataInitialization(NamespaceDataInitialization.java 48) -Default namespace initialized successfully
2025-08-01 10:10:00:164 [main] INFO c.a.c.a.e.manus.config.startUp.AppStartupListener(AppStartupListener.java 54) -Application started, attempting to open browser to access: http://localhost:18080/ui/index.html
2025-08-01 10:10:00:246 [main] INFO c.a.c.a.e.manus.config.startUp.AppStartupListener(AppStartupListener.java 80) -Successfully opened browser via Windows command
2025-08-01 10:10:01:200 [http-nio-18080-exec-1] INFO o.a.c.core.ContainerBase.[Tomcat].[localhost].[/](DirectJDKLog.java 168) -Initializing Spring DispatcherServlet 'dispatcherServlet'
2025-08-01 10:10:01:201 [http-nio-18080-exec-1] INFO org.springframework.web.servlet.DispatcherServlet(FrameworkServlet.java 532) -Initializing Servlet 'dispatcherServlet'
2025-08-01 10:10:01:203 [http-nio-18080-exec-1] INFO org.springframework.web.servlet.DispatcherServlet(FrameworkServlet.java 554) -Completed initialization in 2 ms
2025-08-01 10:10:05:466 [http-nio-18080-exec-6] INFO c.a.c.a.e.m.d.a.c.AgentManagementController(AgentManagementController.java 129) -Initializing agents with language: zh for namespace: default
2025-08-01 10:10:05:504 [http-nio-18080-exec-6] INFO c.a.c.a.e.m.d.a.service.AgentInitializationService(AgentInitializationService.java 119) -Created agent: DEFAULT_AGENT for namespace: default with language: zh
2025-08-01 10:10:05:513 [http-nio-18080-exec-6] INFO c.a.c.a.e.m.d.a.service.AgentInitializationService(AgentInitializationService.java 119) -Created agent: BROWSER_AGENT for namespace: default with language: zh
2025-08-01 10:10:05:520 [http-nio-18080-exec-6] INFO c.a.c.a.e.m.d.a.service.AgentInitializationService(AgentInitializationService.java 119) -Created agent: DATABASE_AGENT for namespace: default with language: zh
2025-08-01 10:10:05:527 [http-nio-18080-exec-6] INFO c.a.c.a.e.m.d.a.service.AgentInitializationService(AgentInitializationService.java 119) -Created agent: TEXT_FILE_AGENT for namespace: default with language: zh
2025-08-01 10:10:05:534 [http-nio-18080-exec-6] INFO c.a.c.a.e.m.d.a.service.AgentInitializationService(AgentInitializationService.java 119) -Created agent: CRON_AGENT for namespace: default with language: zh
2025-08-01 10:10:05:540 [http-nio-18080-exec-6] INFO c.a.c.a.e.m.d.a.service.AgentInitializationService(AgentInitializationService.java 119) -Created agent: MAPREDUCE_DATA_PREPARE_AGENT for namespace: default with language: zh
2025-08-01 10:10:05:548 [http-nio-18080-exec-6] INFO c.a.c.a.e.m.d.a.service.AgentInitializationService(AgentInitializationService.java 119) -Created agent: MAPREDUCE_FIN_AGENT for namespace: default with language: zh
2025-08-01 10:10:05:555 [http-nio-18080-exec-6] INFO c.a.c.a.e.m.d.a.service.AgentInitializationService(AgentInitializationService.java 119) -Created agent: MAPREDUCE_MAP_TASK_AGENT for namespace: default with language: zh
2025-08-01 10:10:05:560 [http-nio-18080-exec-6] INFO c.a.c.a.e.m.d.a.service.AgentInitializationService(AgentInitializationService.java 119) -Created agent: MAPREDUCE_REDUCE_TASK_AGENT for namespace: default with language: zh
2025-08-01 10:10:42:883 [http-nio-18080-exec-1] INFO com.alibaba.cloud.ai.example.manus.llm.LlmService(LlmService.java 234) -Build or update dynamic chat client for model: qwen-plus
2025-08-01 10:10:42:883 [http-nio-18080-exec-1] INFO com.alibaba.cloud.ai.example.manus.llm.LlmService(LlmService.java 305) -Model updated
2025-08-01 10:10:42:898 [http-nio-18080-exec-1] INFO com.alibaba.cloud.ai.example.manus.llm.LlmService(LlmService.java 234) -Build or update dynamic chat client for model: qwen-plus
2025-08-01 10:10:42:898 [http-nio-18080-exec-1] INFO c.a.c.a.e.m.dynamic.model.service.ModelServiceImpl(ModelServiceImpl.java 101) -Successfully created new Model: qwen-plus
2025-08-01 10:10:42:899 [http-nio-18080-exec-1] INFO c.a.c.a.e.m.dynamic.model.service.ModelServiceImpl(ModelServiceImpl.java 353) -Set model: 1 as default
2025-08-01 10:10:42:906 [http-nio-18080-exec-1] INFO c.a.c.a.e.m.dynamic.model.service.ModelServiceImpl(ModelServiceImpl.java 360) -Cancel 1 model as default
2025-08-01 10:10:42:916 [http-nio-18080-exec-1] INFO c.a.c.a.e.m.dynamic.model.service.ModelServiceImpl(ModelServiceImpl.java 369) -Set 1 as default
2025-08-01 10:10:42:923 [http-nio-18080-exec-1] INFO com.alibaba.cloud.ai.example.manus.llm.LlmService(LlmService.java 234) -Build or update dynamic chat client for model: qwen-plus
2025-08-01 10:10:42:924 [http-nio-18080-exec-1] INFO com.alibaba.cloud.ai.example.manus.llm.LlmService(LlmService.java 305) -Model updated
2025-08-01 10:10:42:937 [http-nio-18080-exec-1] INFO com.alibaba.cloud.ai.example.manus.llm.LlmService(LlmService.java 234) -Build or update dynamic chat client for model: qwen-plus
2025-08-01 10:10:52:241 [ForkJoinPool.commonPool-worker-10] INFO c.a.c.a.e.m.p.coordinator.PlanningCoordinator(PlanningCoordinator.java 74) -Executing complete plan process for planId: plan-1754014252216
2025-08-01 10:10:52:324 [ForkJoinPool.commonPool-worker-10] INFO c.a.c.a.example.manus.planning.creator.PlanCreator(PlanCreator.java 100) -Attempting to create plan, attempt: 1/3
2025-08-01 10:10:54:681 [boundedElastic-2] INFO c.a.c.a.example.manus.llm.StreamingResponseHandler(StreamingResponseHandler.java 247) -✅ Plan creation - Completed[2313ms]: 1 responses processed, 505 characters, 0 tool calls, 0 prompt tokens, 0 completion tokens, 0 total tokens. Preview: '{"output":"Plan created: null\n- User Original Requirements (This requirement is the user's initial input, information can be referenced, but in the current interaction round only the current step req...'
2025-08-01 10:10:54:681 [ForkJoinPool.commonPool-worker-10] INFO c.a.c.a.example.manus.planning.creator.PlanCreator(PlanCreator.java 128) -Plan created successfully on attempt 1: AbstractExecutionPlan{rootPlanId='null', currentPlanId='null', title='Search Beijing's today weather', planningThinking='null', executionParams='', userRequest='用浏览器,基于百度,查询北京今天的天气'}
2025-08-01 10:10:54:683 [ForkJoinPool.commonPool-worker-10] INFO c.a.c.a.e.m.p.executor.factory.PlanExecutorFactory(PlanExecutorFactory.java 93) -Creating executor for plan type: simple (planId: plan-1754014252216)
2025-08-01 10:10:54:691 [ForkJoinPool.commonPool-worker-10] INFO c.a.c.a.e.m.p.coordinator.PlanningCoordinator(PlanningCoordinator.java 102) -Selected executor: PlanExecutor for plan type: simple (planId: plan-1754014252216)
2025-08-01 10:10:54:695 [ForkJoinPool.commonPool-worker-10] INFO c.a.c.a.e.m.r.RepositoryPlanExecutionRecorder(RepositoryPlanExecutionRecorder.java 491) -Creating root plan with ID: plan-1754014252216
2025-08-01 10:10:54:741 [ForkJoinPool.commonPool-worker-10] INFO c.a.c.a.e.m.dynamic.agent.service.AgentServiceImpl(AgentServiceImpl.java 305) -Create new BaseAgent: BROWSER_AGENT, planId: plan-1754014252216
2025-08-01 10:10:54:772 [ForkJoinPool.commonPool-worker-10] INFO c.a.c.ai.example.manus.planning.PlanningFactory(PlanningFactory.java 260) -Registering tool: browser_use
2025-08-01 10:10:54:774 [ForkJoinPool.commonPool-worker-10] INFO c.a.c.ai.example.manus.planning.PlanningFactory(PlanningFactory.java 260) -Registering tool: database_use
2025-08-01 10:10:54:774 [ForkJoinPool.commonPool-worker-10] INFO c.a.c.ai.example.manus.planning.PlanningFactory(PlanningFactory.java 260) -Registering tool: terminate
2025-08-01 10:10:54:775 [ForkJoinPool.commonPool-worker-10] INFO c.a.c.ai.example.manus.planning.PlanningFactory(PlanningFactory.java 260) -Registering tool: bash
2025-08-01 10:10:54:776 [ForkJoinPool.commonPool-worker-10] INFO c.a.c.ai.example.manus.planning.PlanningFactory(PlanningFactory.java 260) -Registering tool: doc_loader
2025-08-01 10:10:54:777 [ForkJoinPool.commonPool-worker-10] INFO c.a.c.ai.example.manus.planning.PlanningFactory(PlanningFactory.java 260) -Registering tool: text_file_operator
2025-08-01 10:10:54:778 [ForkJoinPool.commonPool-worker-10] INFO c.a.c.ai.example.manus.planning.PlanningFactory(PlanningFactory.java 260) -Registering tool: inner_storage_content_tool
2025-08-01 10:10:54:779 [ForkJoinPool.commonPool-worker-10] INFO c.a.c.ai.example.manus.planning.PlanningFactory(PlanningFactory.java 260) -Registering tool: file_merge_tool
2025-08-01 10:10:54:786 [ForkJoinPool.commonPool-worker-10] INFO c.a.c.ai.example.manus.planning.PlanningFactory(PlanningFactory.java 260) -Registering tool: form_input
2025-08-01 10:10:54:788 [ForkJoinPool.commonPool-worker-10] INFO c.a.c.ai.example.manus.planning.PlanningFactory(PlanningFactory.java 260) -Registering tool: data_split_tool
2025-08-01 10:10:54:789 [ForkJoinPool.commonPool-worker-10] INFO c.a.c.ai.example.manus.planning.PlanningFactory(PlanningFactory.java 260) -Registering tool: map_output_tool
2025-08-01 10:10:54:791 [ForkJoinPool.commonPool-worker-10] INFO c.a.c.ai.example.manus.planning.PlanningFactory(PlanningFactory.java 260) -Registering tool: reduce_operation_tool
2025-08-01 10:10:54:792 [ForkJoinPool.commonPool-worker-10] INFO c.a.c.ai.example.manus.planning.PlanningFactory(PlanningFactory.java 260) -Registering tool: mapreduce_finalize_tool
2025-08-01 10:10:54:794 [ForkJoinPool.commonPool-worker-10] INFO c.a.c.ai.example.manus.planning.PlanningFactory(PlanningFactory.java 260) -Registering tool: cron_tool
2025-08-01 10:10:54:796 [ForkJoinPool.commonPool-worker-10] INFO c.a.c.a.e.m.dynamic.agent.service.AgentServiceImpl(AgentServiceImpl.java 326) -Successfully loaded BaseAgent: BROWSER_AGENT, available tools count: 5
2025-08-01 10:10:54:813 [ForkJoinPool.commonPool-worker-10] INFO c.alibaba.cloud.ai.example.manus.agent.BaseAgent(BaseAgent.java 215) -Executing round 1/20
2025-08-01 10:10:54:814 [ForkJoinPool.commonPool-worker-10] INFO c.a.c.a.e.manus.tool.browser.ChromeDriverService(ChromeDriverService.java 161) -Creating new Playwright Browser instance for planId: plan-1754014252216

View File

@ -1,7 +0,0 @@
2025-08-01 10:09:54:599 [main] WARN o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker(PostProcessorRegistrationDelegate.java 437) -Bean 'jmanusEventPublisher' of type [com.alibaba.cloud.ai.example.manus.event.JmanusEventPublisher] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying). Is this bean getting eagerly injected/applied to a currently created BeanPostProcessor [jmanusListenerRegister]? Check the corresponding BeanPostProcessor declaration and its dependencies/advisors. If this bean does not have to be post-processed, declare it with ROLE_INFRASTRUCTURE.
2025-08-01 10:09:55:934 [main] WARN org.hibernate.orm.deprecation(DialectFactoryImpl.java 153) -HHH90000025: H2Dialect does not need to be specified explicitly using 'hibernate.dialect' (remove the property setting and it will be selected by default)
2025-08-01 10:09:58:879 [main] WARN com.alibaba.cloud.ai.example.manus.llm.LlmService(LlmService.java 118) -Cannot find any modelChatClient will be initialize after model being configured
2025-08-01 10:09:59:282 [main] WARN o.s.b.a.o.j.JpaBaseConfiguration$JpaWebConfiguration(JpaBaseConfiguration.java 258) -spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning
2025-08-01 10:09:59:369 [main] WARN o.s.w.s.m.m.a.RequestMappingHandlerMapping(RequestMappingHandlerMapping.java 358) -Multiple @RequestMapping annotations found on public org.springframework.http.ResponseEntity com.alibaba.cloud.ai.example.manus.dynamic.prompt.controller.PromptAdminController.reinitializePrompts(), but only the first will be used: [@org.springframework.web.bind.annotation.PostMapping(consumes={}, headers={}, name="", params={}, path={"/reinitialize"}, produces={}, value={"/reinitialize"}), @org.springframework.web.bind.annotation.GetMapping(consumes={}, headers={}, name="", params={}, path={}, produces={}, value={})]
2025-08-01 10:10:00:250 [main] WARN c.a.c.a.e.manus.config.ApiKeyConfigurationListener(ApiKeyConfigurationListener.java 48) -⚠️ No DashScope API key found. Please configure it through the web interface at /ui/index.html
2025-08-01 10:10:00:250 [main] WARN c.a.c.a.e.manus.config.ApiKeyConfigurationListener(ApiKeyConfigurationListener.java 50) - The system will not be able to use AI features until an API key is configured.

View File

@ -371,8 +371,8 @@
</dependencies>
<configuration>
<consoleOutput>true</consoleOutput>
<configLocation>../tools/src/checkstyle/checkstyle.xml</configLocation>
<headerLocation>../tools/src/checkstyle/checkstyle-header.txt</headerLocation>
<configLocation>./tools/src/checkstyle/checkstyle.xml</configLocation>
<headerLocation>./tools/src/checkstyle/checkstyle-header.txt</headerLocation>
<includeTestSourceDirectory>true</includeTestSourceDirectory>
</configuration>
<executions>

View File

@ -0,0 +1,86 @@
#
# Copyright 2024-2025 the original author or authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
"area/infra":
- changed-files:
- any-glob-to-any-file:
- ".github/**/*"
- "tools/**/*"
- ".asf.yaml"
- ".gitignore"
- ".licenserc.yaml"
- "SECURITY.md"
- "CODE_OF_CONDUCT.md"
- "CONTRIBUTING.md"
- "CONTRIBUTING-zh.md"
- "GOVERNANCE.md"
"area/docs":
- changed-files:
- any-glob-to-any-file:
- "**/README.md"
- "**/README-zh.md"
- "**/README-ja.md"
- "SECURITY.md"
"area/jmanus":
- changed-files:
- any-glob-to-any-file:
- "spring-ai-alibaba-jmanus/**/*"
"area/graph":
- changed-files:
- any-glob-to-any-file:
- "spring-ai-alibaba-graph/**/*"
"area/core":
- changed-files:
- any-glob-to-any-file:
- "spring-ai-alibaba-core/**/*"
- "spring-ai-alibaba-bom/**/*"
- "auto-configurations/**/*"
- "spring-ai-alibaba-spring-boot-starter/**/*"
"area/studio":
- changed-files:
- any-glob-to-any-file:
- "spring-ai-alibaba-studio/**/*"
"area/mcp":
- changed-files:
- any-glob-to-any-file:
- "spring-ai-alibaba-mcp/**/*"
"area/deepresearch":
- changed-files:
- any-glob-to-any-file:
- "spring-ai-alibaba-deepresearch/**/*"
"area/nl2sql":
- changed-files:
- any-glob-to-any-file:
- "spring-ai-alibaba-nl2sql/**/*"
"area/community":
- changed-files:
- any-glob-to-any-file:
- "community/**/*"
"area/tools":
- changed-files:
- any-glob-to-any-file:
- "community/tool-calls/**/*"
"area/document-reader":
- changed-files:
- any-glob-to-any-file:
- "community/document-readers/**/*"
"area/document-parser":
- changed-files:
- any-glob-to-any-file:
- "community/document-parser/**/*"
"area/memory":
- changed-files:
- any-glob-to-any-file:
- "community/memories/**/*"

View File

@ -0,0 +1,37 @@
#
# Copyright 2024-2026 the original author or authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
name: setup-deps
description: Install host system dependencies
runs:
using: composite
steps:
- uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'
cache: 'maven'
- uses: actions/setup-go@f111f3307d8850f501ac008e886eec1fd1932a34 # v5.0.1
with:
go-version: '1.23'
- uses: actions/setup-python@v5
with:
python-version: '3.13'
- uses: actions/setup-node@v4
with:
node-version: '22'
- name: Pull python:3.10 docker image
shell: bash
run: docker pull python:3.10

View File

@ -0,0 +1,98 @@
AfterAll
varius
Nam
varius
ot
OT
bu
hda
ue
tRU
tE
Te
te
ND
uE
fo
Bu
oNS
iif
OLL
IST
olY
URE
SMLL
thq
afe
Ue
wOh
cNa
hVE
fO
nAx
woUl
HdA
JOO
MYBE
MYU
SEh
udO
aBl
abd
Yuo
OCe
FoT
acI
OCE
Ans
gud
Tje
wHN
mey
eyT
ist
alle
vEw
ans
ser
NIN
NaX
containg
consition
ois
nd
nD
Nd
joo
oNW
CPPP
NwO
Sie
Whe
heL
2Rd
bui
Dum
DuM
GeS
ptd
lKe
ANe
ESY
mye
fwe
ONS
hAX
InE
mIs
wel
als
vAI
hEl
htE
dne
oEN
MoT
planText
addresss
notIn

View File

@ -0,0 +1,13 @@
.git
.idea
./spring-ai-alibaba-jmanus/src/main/resources/static
./spring-ai-alibaba-jmanus/src/main/resources/static_legacy
**/node_modules/**
**/target/**
**/build/**
**/dist/**
**/ui-vue3/ui/assets/**
**/ui/assets/**
**/src/test/resources/*.pdf
**/src/main/resources/static/**
**/pnpm-lock.yaml

View File

@ -0,0 +1,91 @@
# Copyright 2024-2026 the original author or authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
header:
license:
copyright-owner: Spring AI Alibaba Community
software-name: Spring AI Alibaba
copyright-year: '2024-2026'
content: |
Copyright 2024-2026 the original author or authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
https://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
pattern: |
Licensed under the Apache License, Version 2.0 \(the "License"\);
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http[s]?://www\.apache\.org/licenses/LICENSE-2\.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
paths:
- "**"
paths-ignore:
- '.github/ISSUE_TEMPLATE'
- '.github/PULL_REQUEST_TEMPLATE'
- '**/.gitignore'
- '**/.dockerignore'
- '.mvn'
- 'docker/.env'
- 'licenses'
- '**/*.md'
- '**/*.json'
- '**/*.ftl'
- '**/target/**'
- '**/*.iml'
- '**/*.key'
- '**/*.txt'
- 'LICENSE'
- '**/*.imports'
- '**/*.bib'
- '**/*.st'
- '**/*.eml'
- '**/*.mbox'
- '**/resources/**'
- '**/resource/**'
- '**/pom.xml'
- '**/*.less'
- '**/*.browserslistrc'
- '**/*.prettierrc'
- '**/*.lintstagedrc'
- '**/*.npmrc'
- '**/*.mts'
- 'tools/linter/codespell/.codespell.ignorewords'
- 'tools/linter/codespell/.codespell.skip'
- 'community/openmanus/src/main/java/com/alibaba/cloud/ai/example/manus/tool/FileSaver.java'
- 'community/openmanus/src/main/java/com/alibaba/cloud/ai/example/manus/tool/GoogleSearch.java'
- 'community/openmanus/src/main/java/com/alibaba/cloud/ai/example/manus/tool/PlanningTool.java'
- 'community/openmanus/src/main/java/com/alibaba/cloud/ai/example/manus/tool/support/CodeUtils.java'
- 'community/openmanus/src/main/java/com/alibaba/cloud/ai/example/manus/tool/support/IpUtils.java'
- 'community/openmanus/src/main/java/com/alibaba/cloud/ai/example/manus/tool/support/LogIdGenerator.java'
- 'community/openmanus/src/main/java/com/alibaba/cloud/ai/example/manus/tool/support/llmbash/BashProcess.java'
- '**/spring-ai-alibaba-graph/spring-ai-alibaba-graph-example/**'
- 'spring-ai-alibaba-graph/spring-ai-alibaba-graph-example/.mvn/wrapper/maven-wrapper.properties'
- '**/spring-ai-alibaba-deepresearch/ui-vue3/**'
- '**/spring-ai-alibaba-jmanus/ui-vue3/**'
- '.cursorindexingignore'
comment: never

View File

@ -0,0 +1,43 @@
#
# Copyright 2024-2025 the original author or authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# MD009/no-trailing-spaces Trailing spaces
MD009: false
# MD013 Line length
MD013: false
# MD014 Dollar signs used before commands without showing output
MD014: false
# MD024 Multiple headings with the same content
MD024: false
# MD026/no-trailing-punctuation Trailing punctuation in heading
MD026: false
# MD029/ol-prefix Ordered list item prefix
MD029: false
# MD033/no-inline-html
MD033: false
# MD034/no-bare-urls
MD034: false
# MD040/fenced-code-language
MD040: false
# MD041/first-line-heading/first-line-h1 First line in file should be a top level heading
MD041: false
# MD036/emphasis used instead of a header
MD036: false
# MD051/first-heading-h1-first
MD051: false
# MD056/table-column-count Table
MD056: false
# MD055/table-pipe-style
MD055: false

View File

@ -0,0 +1,76 @@
#
# Copyright 2024-2026 the original author or authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
---
ignore: |
# This directory fails checks since many files
# are templated. Instead, we run the linter
# after running `make generate-manifests` which creates
# the Install YAML in bin/
**/node_modules/**
**/target/**
**/build/**
**/dist/**
rules:
braces:
min-spaces-inside: 0
max-spaces-inside: 0
min-spaces-inside-empty: -1
max-spaces-inside-empty: -1
brackets:
min-spaces-inside: 0
max-spaces-inside: 1
min-spaces-inside-empty: -1
max-spaces-inside-empty: -1
colons:
max-spaces-before: 0
max-spaces-after: 1
commas:
max-spaces-before: 1
min-spaces-after: 1
max-spaces-after: 1
comments:
level: warning
require-starting-space: true
min-spaces-from-content: 1
comments-indentation:
level: warning
document-end: disable
document-start: disable
empty-lines:
max: 2
max-start: 0
max-end: 1
empty-values:
forbid-in-block-mappings: false
forbid-in-flow-mappings: true
hyphens:
max-spaces-after: 1
indentation:
spaces: 2
indent-sequences: consistent # be consistent: don't mix indentation styles in one file.
check-multi-line-strings: false
key-duplicates: enable
key-ordering: disable
new-line-at-end-of-file: enable
new-lines:
type: unix
trailing-spaces: enable
truthy:
check-keys: false # GitHub Actions uses "on:" as a key
level: warning

34
tools/make/common.mk Normal file
View File

@ -0,0 +1,34 @@
# Copyright 2024-2025 the original author or authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
SHELL:=/bin/bash
DATETIME = $(shell date +"%Y%m%d%H%M%S")
# Log the running target
LOG_TARGET = echo -e "\033[0;32m==================> Running $@ ============> ... \033[0m"
# Log debugging info
define log
echo -e "\033[36m==================>$1\033[0m"
endef
# Log error info
define errorLog
echo -e "\033[0;31m==================>$1\033[0m"
endef
.PHONY: help
help:
@echo -e "\033[1;3;34mAgentic AI Framework for Java Developers.\033[0m\n"
@echo -e "Usage:\n make \033[36m<Target>\033[0m \033[36m<Option>\033[0m\n\nTargets:"
@awk 'BEGIN {FS = ":.*##"; printf ""} /^[a-zA-Z_0-9-]+:.*?##/ { printf " \033[36m%-15s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST)

46
tools/make/java.mk Normal file
View File

@ -0,0 +1,46 @@
# Copyright 2024-2025 the original author or authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
##@ Java
.PHONY: test
test: ## Run tests
@$(LOG_TARGET)
mvnd test
# Separate build and test to speed up execution
.PHONY: build
build: ## Build the project
@$(LOG_TARGET)
mvnd -Dmvnd.connectTimeout=30000 -B package --file pom.xml -DskipTests=true
.PHONY: format-fix
format-fix: ## Format the code
@$(LOG_TARGET)
mvnd -Dmvnd.connectTimeout=30000 spring-javaformat:apply
.PHONY: format-check
format-check: ## Format Check the code
@$(LOG_TARGET)
mvnd -Dmvnd.connectTimeout=30000 spring-javaformat:validate
.PHONY: spotless-apply
spotless-apply: ## Run spotless and apply changes
@$(LOG_TARGET)
mvnd -Dmvnd.connectTimeout=30000 spotless:apply
.PHONY: checkstyle-check
checkstyle-check: ## Checkstyle Check the code and output to target/checkstyle-report.xml
@$(LOG_TARGET)
mvnd -Dmvnd.connectTimeout=30000 -Dcheckstyle.skip=false -Dcheckstyle.output.file=checkstyle-report.xml checkstyle:check

79
tools/make/linter.mk Normal file
View File

@ -0,0 +1,79 @@
# Copyright 2024-2025 the original author or authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
##@ Linter
.PHONY: lint
lint: ## Check files
# md There are too many file errors, close temporarily
# lint: markdown-lint yaml-lint code-spell newline-check
lint: yaml-lint codespell newline-check
.PHONY: codespell
codespell: CODESPELL_SKIP := $(shell cat tools/linter/codespell/.codespell.skip | tr \\n ',')
codespell: ## Check the code-spell
@$(LOG_TARGET)
codespell --version
codespell --skip "$(CODESPELL_SKIP)" --ignore-words ./tools/linter/codespell/.codespell.ignorewords
.PHONY: yaml-lint
yaml-lint: ## Check the yaml lint
@$(LOG_TARGET)
yamllint --version
yamllint -c ./tools/linter/yamllint/.yamllint .
.PHONY: yaml-lint-fix
yaml-lint-fix: ## Yaml lint fix
@$(LOG_TARGET)
yamlfmt -version
yamlfmt .
.PHONY: licenses-fix
licenses-fix: ## Fix the licenses
@$(LOG_TARGET)
license-eye --version
license-eye -c ./tools/linter/license/.licenserc.yaml header fix
.PHONY: licenses-check
licenses-check: ## Check the licenses
@$(LOG_TARGET)
license-eye --version
license-eye -c ./tools/linter/license/.licenserc.yaml header check
.PHONY: markdown-lint-check
markdown-lint: ## Check the markdown files.
@$(LOG_TARGET)
markdownlint --version
markdownlint --config ./tools/linter/markdownlint/markdown_lint_config.yaml .
.PHONY: markdown-lint-fix
markdown-lint-fix: ## Fix the markdown files style.
@$(LOG_TARGET)
markdownlint --version
markdownlint --config ./tools/linter/markdownlint/markdown_lint_config.yaml --fix .
.PHONY: newline-check
newline-check: ## Check the newline
@$(LOG_TARGET)
python tools/scripts/new-line-check.py check
.PHONY: newline-fix
newline-fix: ## Fix the newline
@$(LOG_TARGET)
python tools/scripts/new-line-check.py fix
.PHONY: secrets-check
secrets-check: ## Check the secrets
@$(LOG_TARGET)
gitleaks dir -v .

60
tools/make/tools.mk Normal file
View File

@ -0,0 +1,60 @@
# Copyright 2024-2025 the original author or authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
##@ Tools
.PHONY: tools
MVND_VERSION := 2.0.0-rc-3
tools: ## Install ci tools
@$(LOG_TARGET)
go version
python --version
node --version
npm --version
@echo "Installing markdownlint-cli"
npm install markdownlint-cli --global
@echo "Installing licenses-eyes"
go install github.com/apache/skywalking-eyes/cmd/license-eye@v0.6.1-0.20250110091440-69f34abb75ec
@echo "Installing codespell"
pip install codespell
@echo "Installing yamllint"
pip install yamllint==1.35.1
@echo "Installing yamlfmt"
go install github.com/google/yamlfmt/cmd/yamlfmt@latest
@echo "Installing gitleaks"
mkdir -p tools/bin && \
cd tools/bin && \
git clone https://github.com/gitleaks/gitleaks && \
cd gitleaks && \
make build && \
chmod +x gitleaks && \
cp gitleaks /usr/local/bin && \
cd .. && rm -rf gitleaks
@echo "Installing mvnd"
curl -sL https://dlcdn.apache.org/maven/mvnd/$(MVND_VERSION)/maven-mvnd-$(MVND_VERSION)-linux-amd64.zip -o mvnd.zip && \
unzip -q mvnd.zip && \
mkdir -p ${HOME}/.local && \
mv maven-mvnd-$(MVND_VERSION)-linux-amd64 ${HOME}/.local/mvnd && \
echo "${HOME}/.local/mvnd/bin" >> ${GITHUB_PATH} && \
echo "MVND_HOME=${HOME}/.local/mvnd" >> ${GITHUB_ENV}

View File

@ -0,0 +1,104 @@
#
# Copyright 2024-2025 the original author or authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
import os
import sys
# Ignored project folders
ignore_dirs = [
"node_modules",
".idea",
".git",
".vscode",
"target",
"static",
"static_legacy"
]
# A list of ignored suffix files
ignore_suffix = [
".png", ".jpg", ".jpeg", ".gif", ".svg", ".ico",
".webp", ".pdf", ".word", ".docx", ".doc", ".ppt",
".xlsx", ".xls", ".exe", "chromedriver", ".pptx", ".jar",
".wav", ".bib", ".cmd", "mvnw", ".bin", ".pcm", ".flac", ".ttf",
".mp4", ".PPT", ".jif", ".zip", ".tar", ".gz", ".rar", ".7z",
".tar.gz", ".tar.bz2", ".tar.xz", ".tgz", ".tbz2", ".txz"
]
# Check if the incoming file ends with a blank line
def check_file(path):
try:
with open(path, 'rb') as f:
f.seek(0, os.SEEK_END)
size = f.tell()
if size == 0:
return None
f.seek(-1, os.SEEK_END)
if f.read(1) != b'\n':
return path
except OSError as e:
print(f"Cannot check file: {path}: {e}")
return None
# Accept a list, check if each file ends with a blank line, and if not, write a new line at the end of the file
def add_newline(file):
print("Fixing: " + file)
with open(file, 'a') as f:
f.write('\n')
# Gets all the files in the current directory and returns a list of files
def get_files():
files_to_check = []
for root, dirs, files in os.walk('.'):
# Ignore the specified directory
dirs[:] = [d for d in dirs if d not in ignore_dirs]
for file in files:
if not any(file.endswith(suffix) for suffix in ignore_suffix):
files_to_check.append(os.path.join(root, file))
return files_to_check
# Run the checks
def run(check_only=False):
files = get_files()
files_to_fix = []
for file in files:
result = check_file(file)
if result:
files_to_fix.append(result)
if files_to_fix:
print("The following files are missing a blank line:")
for file in files_to_fix:
print(file)
if check_only:
print("Error: Some files do not end with a blank line.")
sys.exit(1) # Exit with an error code
else:
for file in files_to_fix:
add_newline(file)
print(f"Added a line break at the end of {file}.")
else:
print("All files have ended with a blank line.")
if __name__ == "__main__":
mode = sys.argv[1] if len(sys.argv) > 1 else 'check'
if mode == 'check':
run(check_only=True)
elif mode == 'fix':
run(check_only=False)
else:
print("Invalid mode. Please use 'check' or 'fix'.")

View File

@ -0,0 +1,17 @@
^\Q/*\E$
^\Q * Copyright \E20\d\d\-20\d\d\Q the original author or authors.\E$
^\Q *\E$
^\Q * Licensed under the Apache License, Version 2.0 (the "License");\E$
^\Q * you may not use this file except in compliance with the License.\E$
^\Q * You may obtain a copy of the License at\E$
^\Q *\E$
^\Q * https://www.apache.org/licenses/LICENSE-2.0\E$
^\Q *\E$
^\Q * Unless required by applicable law or agreed to in writing, software\E$
^\Q * distributed under the License is distributed on an "AS IS" BASIS,\E$
^\Q * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\E$
^\Q * See the License for the specific language governing permissions and\E$
^\Q * limitations under the License.\E$
^\Q */\E$
^$
^.*$

View File

@ -0,0 +1,30 @@
<?xml version="1.0"?>
<!--
~ Copyright 2023-2024 the original author or authors.
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~ You may obtain a copy of the License at
~
~ https://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
-->
<!DOCTYPE suppressions PUBLIC
"-//Checkstyle//DTD SuppressionFilter Configuration 1.2//EN"
"https://checkstyle.org/dtds/suppressions_1_2.dtd">
<suppressions>
<suppress files="[\\/]src[\\/]test[\\/]java[\\/]" checks="Javadoc*" />
<suppress files=".*Tests\.java" checks="Javadoc*" />
<suppress files="generated-sources" checks="[a-zA-Z0-9]*" />
<suppress files="org[\\/]eclipse[\\/]jdt[\\/]internal[\\/]formatter[\\/]linewrap[\\/]WrapPreparator\.java" checks="[a-zA-Z0-9]*" />
<!-- A list of class files that need to be suppressed -->
<suppress files="NacosMcpRegistryProperties.java" checks="FinalClass"/>
</suppressions>

View File

@ -0,0 +1,205 @@
<?xml version="1.0"?>
<!--
~ Copyright 2023-2024 the original author or authors.
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~ You may obtain a copy of the License at
~
~ https://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
-->
<!DOCTYPE module PUBLIC
"-//Checkstyle//DTD Checkstyle Configuration 1.3//EN"
"https://checkstyle.org/dtds/configuration_1_3.dtd">
<module name="com.puppycrawl.tools.checkstyle.Checker">
<!-- &lt;!&ndash; 抑制文件配置 &ndash;&gt;-->
<!-- <module name="SuppressionFilter">-->
<!-- <property name="file" value="tools/src/checkstyle/checkstyle-suppressions.xml"/>-->
<!-- </module>-->
<!-- Root Checks -->
<!-- Contains a line break check at the beginning and end of the file -->
<!-- The License Header that does not use CheckStyle is done using the make command in the project -->
<!--<module name="com.puppycrawl.tools.checkstyle.checks.header.RegexpHeaderCheck">
<property name="headerFile" value="${checkstyle.header.file}" />
<property name="fileExtensions" value="java" />
</module>-->
<module name="com.puppycrawl.tools.checkstyle.checks.NewlineAtEndOfFileCheck" />
<!-- TreeWalker Checks -->
<module name="com.puppycrawl.tools.checkstyle.TreeWalker">
<!-- Annotations -->
<!-- <module name="com.puppycrawl.tools.checkstyle.checks.annotation.AnnotationUseStyleCheck">-->
<!-- <property name="elementStyle" value="compact" />-->
<!-- </module>-->
<!-- <module name="com.puppycrawl.tools.checkstyle.checks.annotation.MissingOverrideCheck" />-->
<!-- <module name="com.puppycrawl.tools.checkstyle.checks.annotation.PackageAnnotationCheck" />-->
<!-- <module name="com.puppycrawl.tools.checkstyle.checks.annotation.AnnotationLocationCheck">-->
<!-- <property name="allowSamelineSingleParameterlessAnnotation"-->
<!-- value="false" />-->
<!-- </module>-->
<!-- &lt;!&ndash; Block Checks &ndash;&gt;-->
<!-- <module name="com.puppycrawl.tools.checkstyle.checks.blocks.EmptyBlockCheck">-->
<!-- <property name="option" value="text" />-->
<!-- </module>-->
<!-- <module name="com.puppycrawl.tools.checkstyle.checks.blocks.LeftCurlyCheck" />-->
<!-- <module name="com.puppycrawl.tools.checkstyle.checks.blocks.RightCurlyCheck">-->
<!-- <property name="option" value="alone" />-->
<!-- </module>-->
<!-- <module name="com.puppycrawl.tools.checkstyle.checks.blocks.NeedBracesCheck" />-->
<!-- <module name="com.puppycrawl.tools.checkstyle.checks.blocks.AvoidNestedBlocksCheck" />-->
<!-- &lt;!&ndash; Class Design &ndash;&gt;-->
<!-- <module name="com.puppycrawl.tools.checkstyle.checks.design.FinalClassCheck" />-->
<!-- <module name="com.puppycrawl.tools.checkstyle.checks.design.InterfaceIsTypeCheck" />-->
<!-- <module name="com.puppycrawl.tools.checkstyle.checks.design.HideUtilityClassConstructorCheck" />-->
<!-- <module name="com.puppycrawl.tools.checkstyle.checks.design.MutableExceptionCheck" />-->
<!-- <module name="com.puppycrawl.tools.checkstyle.checks.design.InnerTypeLastCheck" />-->
<!-- <module name="com.puppycrawl.tools.checkstyle.checks.design.OneTopLevelClassCheck" />-->
<!-- &lt;!&ndash; Coding &ndash;&gt;-->
<!-- <module name="com.puppycrawl.tools.checkstyle.checks.coding.CovariantEqualsCheck" />-->
<!-- <module name="com.puppycrawl.tools.checkstyle.checks.coding.EmptyStatementCheck" />-->
<!-- <module name="com.puppycrawl.tools.checkstyle.checks.coding.EqualsHashCodeCheck" />-->
<!-- <module name="com.puppycrawl.tools.checkstyle.checks.coding.InnerAssignmentCheck" />-->
<!-- <module name="com.puppycrawl.tools.checkstyle.checks.coding.SimplifyBooleanExpressionCheck" />-->
<!-- <module name="com.puppycrawl.tools.checkstyle.checks.coding.SimplifyBooleanReturnCheck" />-->
<!-- <module name="com.puppycrawl.tools.checkstyle.checks.coding.StringLiteralEqualityCheck" />-->
<!-- <module name="com.puppycrawl.tools.checkstyle.checks.coding.NestedForDepthCheck">-->
<!-- <property name="max" value="3" />-->
<!-- </module>-->
<!-- <module name="com.puppycrawl.tools.checkstyle.checks.coding.NestedIfDepthCheck">-->
<!-- <property name="max" value="3" />-->
<!-- </module>-->
<!-- <module name="com.puppycrawl.tools.checkstyle.checks.coding.NestedTryDepthCheck">-->
<!-- <property name="max" value="3" />-->
<!-- </module>-->
<!-- <module name="com.puppycrawl.tools.checkstyle.checks.coding.MultipleVariableDeclarationsCheck" />-->
<!-- <module name="io.spring.javaformat.checkstyle.filter.RequiresOuterThisFilter"/>-->
<!-- <module name="io.spring.javaformat.checkstyle.filter.IdentCheckFilter">-->
<!-- <property name="names" value="logger"/>-->
<!-- <module name="com.puppycrawl.tools.checkstyle.checks.coding.RequireThisCheck">-->
<!-- <property name="checkMethods" value="false"/>-->
<!-- <property name="validateOnlyOverlapping" value="false"/>-->
<!-- </module>-->
<!-- </module>-->
<!-- <module name="io.spring.javaformat.checkstyle.check.SpringNoThisCheck">-->
<!-- <property name="names" value="logger"/>-->
<!-- </module>-->
<!-- <module name="com.puppycrawl.tools.checkstyle.checks.coding.OneStatementPerLineCheck" />-->
<!-- <module name="com.puppycrawl.tools.checkstyle.checks.coding.UnnecessarySemicolonInEnumerationCheck"/>-->
<!-- Imports -->
<!-- <module name="com.puppycrawl.tools.checkstyle.checks.imports.AvoidStarImportCheck" />-->
<!-- <module name="com.puppycrawl.tools.checkstyle.checks.imports.AvoidStaticImportCheck">-->
<!-- <property name="excludes"-->
<!-- value="org.springframework.ai.model.openai.autoconfigure.OpenAIAutoConfigurationUtil.*, org.springframework.ai.openai.api.OpenAiApi.ChatCompletionRequest.AudioParameters.Voice.*, org.springframework.ai.mistralai.api.MistralAiModerationApi.*, org.springframework.ai.util.LoggingMarkers.*, org.springframework.ai.embedding.observation.EmbeddingModelObservationDocumentation.*, org.springframework.ai.test.vectorstore.ObservationTestUtil.*, org.springframework.ai.autoconfigure.vectorstore.observation.ObservationTestUtil.*, org.awaitility.Awaitility.*, org.springframework.ai.aot.AiRuntimeHints.*, org.springframework.ai.openai.metadata.support.OpenAiApiResponseHeaders.*, org.springframework.ai.image.observation.ImageModelObservationDocumentation.*, org.springframework.ai.observation.embedding.EmbeddingModelObservationDocumentation.*, org.springframework.aot.hint.predicate.RuntimeHintsPredicates.*, org.springframework.ai.vectorstore.filter.Filter.ExpressionType.*, org.springframework.ai.chat.observation.ChatModelObservationDocumentation.*, org.assertj.core.groups.Tuple.*, org.assertj.core.api.AssertionsForClassTypes.*, org.junit.jupiter.api.Assertions.*, org.assertj.core.api.Assertions.*, org.junit.Assert.*, org.junit.Assume.*, org.junit.internal.matchers.ThrowableMessageMatcher.*, org.hamcrest.CoreMatchers.*, org.hamcrest.Matchers.*, org.springframework.boot.configurationprocessor.ConfigurationMetadataMatchers.*, org.springframework.boot.configurationprocessor.TestCompiler.*, org.springframework.boot.test.autoconfigure.AutoConfigurationImportedCondition.*, org.mockito.Mockito.*, org.mockito.BDDMockito.*, org.mockito.Matchers.*, org.mockito.ArgumentMatchers.*, org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.*, org.springframework.restdocs.hypermedia.HypermediaDocumentation.*, org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*, org.springframework.test.web.servlet.result.MockMvcResultMatchers.*, org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestBuilders.*, org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.*, org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.*, org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo, org.springframework.test.web.client.match.MockRestRequestMatchers.*, org.springframework.test.web.client.response.MockRestResponseCreators.*, org.springframework.web.reactive.function.server.RequestPredicates.*, org.springframework.web.reactive.function.server.RouterFunctions.*, org.springframework.test.web.servlet.setup.MockMvcBuilders.*"/>-->
<!-- </module>-->
<module name="com.puppycrawl.tools.checkstyle.checks.imports.IllegalImportCheck" />
<module name="com.puppycrawl.tools.checkstyle.checks.imports.RedundantImportCheck" />
<module name="com.puppycrawl.tools.checkstyle.checks.imports.UnusedImportsCheck">
<property name="processJavadoc" value="true" />
</module>
<!-- <module name="ImportOrder">-->
<!-- <property name="groups" value="java,javax,*,org.springframework"/>-->
<!-- <property name="ordered" value="true"/>-->
<!-- <property name="separated" value="true"/>-->
<!-- <property name="option" value="bottom"/>-->
<!-- <property name="sortStaticImportsAlphabetically" value="true"/>-->
<!-- </module>-->
<!-- Javadoc Comments -->
<!-- <module name="com.puppycrawl.tools.checkstyle.checks.javadoc.JavadocTypeCheck">-->
<!-- <property name="scope" value="package"/>-->
<!-- <property name="authorFormat" value=".+\s.+"/>-->
<!-- </module>-->
<!-- <module name="com.puppycrawl.tools.checkstyle.checks.javadoc.JavadocMethodCheck" />-->
<!-- <module name="com.puppycrawl.tools.checkstyle.checks.javadoc.JavadocVariableCheck">-->
<!-- <property name="scope" value="public"/>-->
<!-- </module>-->
<!-- <module name="com.puppycrawl.tools.checkstyle.checks.javadoc.JavadocStyleCheck">-->
<!-- <property name="checkEmptyJavadoc" value="true"/>-->
<!-- </module>-->
<!-- <module name="com.puppycrawl.tools.checkstyle.checks.javadoc.NonEmptyAtclauseDescriptionCheck" />-->
<!-- <module name="com.puppycrawl.tools.checkstyle.checks.javadoc.JavadocTagContinuationIndentationCheck">-->
<!-- <property name="offset" value="0"/>-->
<!-- </module>-->
<!-- <module name="com.puppycrawl.tools.checkstyle.checks.javadoc.AtclauseOrderCheck">-->
<!-- <property name="target" value="CLASS_DEF, INTERFACE_DEF, ENUM_DEF"/>-->
<!-- <property name="tagOrder" value="@param, @author, @since, @see, @version, @serial, @deprecated"/>-->
<!-- </module>-->
<!-- <module name="com.puppycrawl.tools.checkstyle.checks.javadoc.AtclauseOrderCheck">-->
<!-- <property name="target" value="METHOD_DEF, CTOR_DEF, VARIABLE_DEF"/>-->
<!-- <property name="tagOrder" value="@param, @return, @throws, @since, @deprecated, @see"/>-->
<!-- </module>-->
<!-- Miscellaneous -->
<!-- <module name="com.puppycrawl.tools.checkstyle.checks.indentation.CommentsIndentationCheck">-->
<!-- <property name="tokens" value="BLOCK_COMMENT_BEGIN"/>-->
<!-- </module>-->
<!-- <module name="com.puppycrawl.tools.checkstyle.checks.UpperEllCheck" />-->
<!-- <module name="com.puppycrawl.tools.checkstyle.checks.ArrayTypeStyleCheck" />-->
<!-- <module name="com.puppycrawl.tools.checkstyle.checks.OuterTypeFilenameCheck" />-->
<!-- &lt;!&ndash; Modifiers &ndash;&gt;-->
<!-- <module name="com.puppycrawl.tools.checkstyle.checks.modifier.RedundantModifierCheck" />-->
<!-- &lt;!&ndash; Regexp &ndash;&gt;-->
<!-- <module name="com.puppycrawl.tools.checkstyle.checks.regexp.RegexpSinglelineJavaCheck">-->
<!-- <property name="format" value="^\t* +\t*\S" />-->
<!-- <property name="message"-->
<!-- value="Line has leading space characters; indentation should be performed with tabs only." />-->
<!-- <property name="ignoreComments" value="true" />-->
<!-- </module>-->
<!--&lt;!&ndash; <module name="com.puppycrawl.tools.checkstyle.checks.regexp.RegexpSinglelineJavaCheck">&ndash;&gt;-->
<!--&lt;!&ndash; <property name="maximum" value="0"/>&ndash;&gt;-->
<!--&lt;!&ndash; <property name="format" value="org\.mockito\.Mockito\.(when|doThrow|doAnswer)" />&ndash;&gt;-->
<!--&lt;!&ndash; <property name="message"&ndash;&gt;-->
<!--&lt;!&ndash; value="Please use BDDMockito imports." />&ndash;&gt;-->
<!--&lt;!&ndash; <property name="ignoreComments" value="true" />&ndash;&gt;-->
<!--&lt;!&ndash; </module>&ndash;&gt;-->
<!-- <module name="com.puppycrawl.tools.checkstyle.checks.regexp.RegexpSinglelineJavaCheck">-->
<!-- <property name="maximum" value="0"/>-->
<!-- <property name="format" value="org\.junit\.Assert\.assert" />-->
<!-- <property name="message"-->
<!-- value="Please use AssertJ imports." />-->
<!-- <property name="ignoreComments" value="true" />-->
<!-- </module>-->
<!-- <module name="com.puppycrawl.tools.checkstyle.checks.regexp.RegexpCheck">-->
<!-- <property name="format" value="[ \t]+$" />-->
<!-- <property name="illegalPattern" value="true" />-->
<!-- <property name="message" value="Trailing whitespace" />-->
<!-- </module>-->
<!-- &lt;!&ndash; Whitespace &ndash;&gt;-->
<!-- <module name="com.puppycrawl.tools.checkstyle.checks.whitespace.GenericWhitespaceCheck" />-->
<!-- <module name="com.puppycrawl.tools.checkstyle.checks.whitespace.MethodParamPadCheck" />-->
<!-- <module name="com.puppycrawl.tools.checkstyle.checks.whitespace.NoWhitespaceAfterCheck" >-->
<!-- <property name="tokens" value="BNOT, DEC, DOT, INC, LNOT, UNARY_MINUS, UNARY_PLUS, ARRAY_DECLARATOR"/>-->
<!-- </module>-->
<!-- <module name="com.puppycrawl.tools.checkstyle.checks.whitespace.NoWhitespaceBeforeCheck" />-->
<!-- <module name="com.puppycrawl.tools.checkstyle.checks.whitespace.ParenPadCheck" />-->
<!-- <module name="com.puppycrawl.tools.checkstyle.checks.whitespace.TypecastParenPadCheck" />-->
<!-- <module name="com.puppycrawl.tools.checkstyle.checks.whitespace.WhitespaceAfterCheck" />-->
<!-- <module name="com.puppycrawl.tools.checkstyle.checks.whitespace.WhitespaceAroundCheck" />-->
<!-- &lt;!&ndash; Spring Conventions &ndash;&gt;-->
<!-- <module name="io.spring.javaformat.checkstyle.check.SpringLambdaCheck">-->
<!-- <property name="singleArgumentParentheses" value="false"/>-->
<!-- </module>-->
<!-- <module name="io.spring.javaformat.checkstyle.check.SpringCatchCheck"/>-->
<!-- <module name="io.spring.javaformat.checkstyle.check.SpringJavadocCheck"/>-->
<!-- <module name="io.spring.javaformat.checkstyle.check.SpringJUnit5Check"/>-->
</module>
</module>