{"owner":"apache","repo":"dolphinscheduler","hasSkills":true,"totalSkillsCount":31,"totalTokensCount":16018,"categories":["claude-rule","root-instruction","plugin-manifest"],"hasMcp":false,"mcpConfig":null,"found":["dolphinscheduler-alert/CLAUDE.md","dolphinscheduler-authentication/CLAUDE.md","dolphinscheduler-api-test/CLAUDE.md","AGENTS.md","dolphinscheduler-api/CLAUDE.md","CLAUDE.md","dolphinscheduler-bom/CLAUDE.md","dolphinscheduler-dao/CLAUDE.md","dolphinscheduler-datasource-plugin/CLAUDE.md","dolphinscheduler-dao-plugin/CLAUDE.md","dolphinscheduler-dist/CLAUDE.md","dolphinscheduler-common/CLAUDE.md","dolphinscheduler-e2e/CLAUDE.md","dolphinscheduler-eventbus/CLAUDE.md","dolphinscheduler-extract/CLAUDE.md","dolphinscheduler-master/CLAUDE.md","dolphinscheduler-meter/CLAUDE.md","dolphinscheduler-microbench/CLAUDE.md","dolphinscheduler-registry/CLAUDE.md","dolphinscheduler-scheduler-plugin/CLAUDE.md","dolphinscheduler-service/CLAUDE.md","dolphinscheduler-spi/CLAUDE.md","dolphinscheduler-standalone-server/CLAUDE.md","dolphinscheduler-storage-plugin/CLAUDE.md","dolphinscheduler-task-executor/CLAUDE.md","dolphinscheduler-task-plugin/CLAUDE.md","dolphinscheduler-tools/CLAUDE.md","dolphinscheduler-ui/CLAUDE.md","dolphinscheduler-worker/CLAUDE.md","dolphinscheduler-yarn-aop/CLAUDE.md","tools/release/README.md"],"skills":{"dolphinscheduler-alert/CLAUDE.md":"# CLAUDE.md — dolphinscheduler-alert\n\nAlert / notification subsystem. Master and worker publish alert events (task failure, timeout, SLA breach, …); this subsystem evaluates them and dispatches via configured channel plugins (email, webhook, Feishu, DingTalk, PagerDuty, …).\n\n**This directory is a Maven parent POM.**\n\n## Sub-modules\n\n- **`dolphinscheduler-alert-server`** — the runnable alert server. `@SpringBootApplication` `AlertServer` + HA coordinator (`AlertHAServer`) + RPC server (`AlertRpcServer`) + event loop.\n- **`dolphinscheduler-alert-plugins`** — parent of the concrete channel plugins:\n  - `dolphinscheduler-alert-email`, `-http`, `-feishu`, `-dingtalk`, `-wechat`, `-webexteams`, `-pagerduty`, `-telegram`, `-slack`, `-script`, etc. (see directory listing for the current set). Each plugin implements the `AlertPlugin` SPI and is loaded dynamically at runtime.\n\n## How alerting works (end-to-end)\n\n1. Master/worker calls into `dolphinscheduler-extract-alert` RPC with an `AlertRequest`.\n2. `AlertRpcServer` receives it, persists/enqueues onto `AlertEventPendingQueue`.\n3. `AlertEventFetcher` pulls pending events in `AlertEventLoop`.\n4. `AlertSender` looks up the alert group's configured plugins, invokes each.\n5. Delivery result is recorded to the DB for audit.\n\n## Extension points\n\n- **`AlertPlugin` SPI** — new channel? Implement the interface in a new sub-module of `dolphinscheduler-alert-plugins` and it will be discovered by `AlertPluginManager`.\n- Alert rule logic is currently fixed (type-based); extending rules means editing `AlertEventLoop` / `AlertSender`.\n\n## Gotchas\n\n- **Alert server is separate from master/worker** by design. Running it as an embedded part of master is not supported — it has its own HA, its own port, its own `application.yaml`.\n- **`AlertEventPendingQueue` is DB-backed** (not just in-memory) so restarting the alert server does not lose queued alerts.\n- **HA pattern mirrors master/worker**: only the leader pulls from the queue; others stand by.\n- **Plugin config is per-alert-group**, stored in the DB. Adding a plugin implementation does not enable it for anyone until an admin creates an alert group referencing it.\n- **Channel-specific rate limits / retries** live *inside* each plugin, not in the server. Don't add a global retry loop in `AlertSender`.\n\n## Tests\n\n- `alert-server/src/test/java` — unit tests for config, RPC, event queue, sender.\n- Each plugin has its own `src/test/java` with mocked channel calls.\n\n## Related modules\n\n- `dolphinscheduler-extract-alert` — RPC contracts this server implements.\n- `dolphinscheduler-dao` — persists alert events + audit.\n- `dolphinscheduler-registry-all`, `dolphinscheduler-meter`, `dolphinscheduler-spi`.\n- Callers: `dolphinscheduler-master`, `dolphinscheduler-worker`.\n","dolphinscheduler-authentication/CLAUDE.md":"# CLAUDE.md — dolphinscheduler-authentication\n\nParent POM grouping two unrelated authentication helpers. They share no code — they're bundled here because both are about injecting security behavior into the server stack.\n\n**This directory is a Maven parent POM.**\n\n## Sub-modules\n\n- **`dolphinscheduler-actuator-authentication`** — Secures Spring Boot Actuator endpoints (`/actuator/**` and `/dolphinscheduler/actuator/**`) with HTTP Basic auth. Ships `ActuatorAuthenticationAutoConfiguration` + `ActuatorSecurityProperties` (`management.security.*` properties). Enabled when `management.security.enabled=true`. Excludable endpoints (health/info) via config list.\n- **`dolphinscheduler-aws-authentication`** — AWS credential provider abstraction used by AWS-based datasource/task plugins (EMR, S3, SageMaker, DMS, DataSync, etc.). Exposes `AWSCredentialsProviderFactor` with two strategies: `STATIC` (access key + secret) and `INSTANCE_PROFILE` (EC2/EKS IAM role).\n\n## Gotchas\n\n- **These two sub-modules are unrelated.** Don't treat \"authentication\" as a coherent module — the actuator one is about operator access; the AWS one is about cloud-task credentials. They don't share any class.\n- **API login auth is NOT here**. Session/password/LDAP/OIDC/CASDOOR login for the main API lives in `dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/security/`. If a user says \"auth\", check which one they mean first.\n- Actuator: the sample config uses `{noop}` password encoder. This is **development-only**; production must switch to `{bcrypt}` or an external IdP.\n- AWS: `STATIC` credentials sit in plaintext config. Always prefer `INSTANCE_PROFILE` on real infrastructure. When reading code that takes an `AwsConfig` map, expect either style.\n\n## Tests\n\nMinimal — auto-config wiring only. End-to-end auth is covered by `dolphinscheduler-api-test`.\n\n## Related modules\n\n- `dolphinscheduler-meter` — exposes the actuator endpoints that `-actuator-authentication` secures.\n- `dolphinscheduler-task-plugin` / `-datasource-plugin` AWS members — consume `-aws-authentication`.\n- `dolphinscheduler-api` — for the real user-login code path (separate from this module).\n","dolphinscheduler-api-test/CLAUDE.md":"# CLAUDE.md — dolphinscheduler-api-test\n\nIntegration test harness for the REST API. **Not** bundled into the release — this module exists to run curl-style black-box tests against a full DolphinScheduler stack booted via Docker Compose + Testcontainers.\n\n**This is a Maven parent POM.** This module is **not** declared in the root `pom.xml` `<modules>` — run it explicitly (e.g. `mvn -pl dolphinscheduler-api-test test -am`) or via CI workflows.\n\n## Sub-modules\n\n- **`dolphinscheduler-api-test-core`** — the reusable framework:\n  - `@DolphinScheduler` annotation (marks a test class, accepts `composeFiles`).\n  - `DolphinSchedulerExtension` — JUnit 5 extension that starts the Compose stack, injects `RequestClient` and page objects.\n  - `RequestClient` — thin HTTP client with session handling.\n  - Page-object base classes (`LoginPage`, `WorkflowDefinitionPage`, `ProjectPage`, `TenantPage`, `UserPage`, `WorkerGroupPage`).\n- **`dolphinscheduler-api-test-case`** — the actual test classes. `WorkflowDefinitionAPITest`, `TenantAPITest`, `SchedulerAPITest`, etc. Each class uses `@DolphinScheduler(composeFiles = { \"docker/basic/docker-compose.yaml\" })` to declare its environment.\n\n## Stack bootstrap\n\nCompose files live under `src/test/resources/docker/<scenario>/docker-compose.yaml`:\n\n- `basic/` — standard API + Postgres.\n- `tenant/` — scenario with multi-tenant configuration.\n- `oidc-login/` — API with Keycloak for OIDC flow (`realm-export.json` alongside).\n\nThe JUnit extension uses Testcontainers Compose to wait for port readiness before returning.\n\n## Running\n\n```\n# Full suite\nmvn -pl dolphinscheduler-api-test/dolphinscheduler-api-test-case test\n\n# Single class (Mac M1)\nmvn -pl dolphinscheduler-api-test/dolphinscheduler-api-test-case test \\\n    -Dtest=WorkflowDefinitionAPITest -Dm1_chip=true\n```\n\nFlags:\n\n- `-Dm1_chip=true` — forces `arm64/v8` platform for Docker on Apple Silicon.\n- `-Dlocal=true` — skips Testcontainers and points at a locally-running DolphinScheduler instead.\n\n## Gotchas\n\n- **Java 11 required** to compile this module (rest of the repo targets 1.8).\n- **`@Order` is mandatory** on test methods within a class — tests are state-dependent and must run in declared order.\n- **`@DisableIfTestFails` (from junit-pioneer)** cascades a failure to dependent tests in the same class; don't silently disable without understanding the chain.\n- **`sessionId` is threaded through page objects**: `LoginPage.login(...)` returns a session ID that subsequent page objects must receive. Don't instantiate page objects without first logging in.\n- **This module is excluded from the root reactor build** — CI drives it via a dedicated workflow. Check `.github/workflows/` before assuming a PR runs these.\n\n## Related modules\n\n- `dolphinscheduler-api` — the system under test.\n- `dolphinscheduler-dao` — depended on to reuse entity DTOs.\n- `dolphinscheduler-e2e` — complementary browser-level tests (selenium against UI).\n","AGENTS.md":"<!--\nSPDX-License-Identifier: Apache-2.0\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    https://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n-->\n\n# Agent Guide for dolphinscheduler\n\nThis file is read by automated agents (security scanners, code\nanalyzers, AI assistants) operating on this repository.\n\n## Security\n\nSecurity model: [SECURITY.md](./SECURITY.md)\n\nAgents that scan this repository should consult `SECURITY.md` and the\nthreat model it links before reporting issues.\n\nDolphinScheduler's security model defines user roles, trust boundaries, and known non-findings.\n","dolphinscheduler-api/CLAUDE.md":"# CLAUDE.md — dolphinscheduler-api\n\nREST API server. Entry point for the UI and external clients (curl, Python SDK). Uses Spring Boot with **Jetty** (not Tomcat) and springdoc-openapi for Swagger UI.\n\n## Main package\n\n`org.apache.dolphinscheduler.api`\n\n## Entry point\n\n`ApiApplicationServer` — `@SpringBootApplication`. On startup it:\n1. Loads `DataSourcePluginManager` and `TaskPluginManager` (plugin discovery).\n2. Binds to the port in `server.port` (default 12345).\n3. Starts the Py4J gateway used by the Python SDK.\n\n## Key sub-packages\n\n- `api.controller` — 30+ `@RestController` classes, one per domain (workflows, tasks, users, projects, tenants, resources, data sources, alerts, monitoring, …). All URLs rooted at `/dolphinscheduler/*`.\n- `api.service` / `api.service.impl` — business-logic layer wrapping `dolphinscheduler-service` and adding API-level concerns (auth checks, DTO mapping).\n- `api.security` — pluggable authenticators: `PASSWORD` (default), `LDAP`, `OIDC`, `CASDOOR`, `SSO`. Selected by `security.authentication.type`.\n- `api.interceptor` — `LoginHandlerInterceptor` (session cookie check), `RateLimitInterceptor`, `LocaleChangeInterceptor`.\n- `api.configuration` — Spring config beans: Swagger, OAuth2, task-type catalog.\n- `api.dto` — request/response DTOs.\n- `api.exceptions` — `ApiExceptionHandler` (`@RestControllerAdvice`) maps exceptions → structured JSON responses.\n\n## Extension points\n\n- `Authenticator` — implement a new one to support additional login backends (added cases go into `AuthenticationType` enum + registered in `SecurityConfig`).\n- Controllers auto-pick up new task types via `TaskTypeConfiguration` reading `task-type-config.yaml` / `dynamic-task-type-config.yaml`.\n\n## Configuration\n\n`src/main/resources`:\n\n- `application.yaml` — server port, datasource, registry, security mode, CORS, OpenAPI.\n- `task-type-config.yaml`, `dynamic-task-type-config.yaml` — the catalog of task types exposed to the UI.\n- `i18n/messages_*.properties` — English + Simplified Chinese server-side messages.\n- `swagger.properties` — springdoc config (UI lives at `/dolphinscheduler/swagger-ui/index.html`).\n- `logback-spring.xml` — logging.\n\n## Gotchas\n\n- **Jetty, not Tomcat**. `spring-boot-starter-tomcat` is excluded transitively via `dolphinscheduler-meter`. Avoid accidentally pulling Tomcat in.\n- **Session-based auth**: `LoginHandlerInterceptor` reads the `sessionId` cookie. There is no JWT by default. OIDC/CASDOOR paths still set a session.\n- **OIDC requires `casdoor-spring-boot-starter`**; `OAuth2Configuration` is `@ConditionalOnProperty(security.authentication.type = OIDC|CASDOOR)`.\n- **Python SDK integration** uses Py4J gateway, not REST. If a Python SDK change misbehaves, check `api-server` logs for Py4J init messages.\n- **Controllers mix `@PostMapping` with form params and JSON bodies inconsistently** — this is legacy. Follow whatever shape the adjacent endpoint uses rather than converting to JSON across the board.\n- **Swagger annotations are required** on new endpoints (`@Operation`, `@Parameter`). Missing ones break auto-generated docs the UI team consumes.\n\n## Tests\n\nUnit tests live in `src/test/java`. **Integration tests live in `dolphinscheduler-api-test`** (separate module, Docker Compose + Testcontainers).\n\n### Running unit tests from the command line\n\nThe CI flow (`.github/workflows/unit-test.yml`) runs in two phases. Mirror it locally:\n\n**One-time setup** — install BOM + upstream deps to local m2:\n\n```bash\nexport MAVEN_OPTS=\"-Xmx4g -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=1024m\"\n./mvnw install -B \\\n  -pl \"dolphinscheduler-bom,dolphinscheduler-api\" \\\n  -am -DskipTests=true -Dspotless.skip=true -DskipUT=true \\\n  -Djacoco.skip=true -Danalyze.skip=true\n```\n\n**Run tests** — use `verify` (NOT `test`), no `-am`, no `clean`:\n\n```bash\n./mvnw verify -B -pl \"dolphinscheduler-api\" \\\n  -Dmaven.test.skip=false -Dspotless.skip=true -DskipUT=false -Danalyze.skip=true \\\n  -Dsurefire.printSummary=true -Dsurefire.useFile=false \\\n  -Dsurefire.reportFormat=plain -Dsurefire.redirectTestOutputToFile=false \\\n  -Dsurefire.failIfNoSpecifiedTests=false \\\n  -Dtest='EnvironmentServiceTest#testVerifyEnvironment'\n```\n\nDrop the `-Dtest=...` filter to run the whole module.\n\n### Why the unusual flags\n\n- **`verify` not `test`** — root pom uses `jacoco-maven-plugin` in offline-instrument + restore-instrumented-classes mode. Only the `verify` lifecycle runs the `restore` goal, so `test` alone leaves `target/classes` instrumented and the next build fails with \"Cannot process instrumented class\".\n- **`dolphinscheduler-bom` must be in the install `-pl`** — without it, the installed pom lacks effective dependencyManagement and downstream compile/test classpaths drop transitive deps like `commons-collections4` and `oshi-core`.\n- **`-DskipTests=true` (not `-Dmaven.test.skip=true`) during install** — `maven.test.skip` skips test-source attach which breaks downstream modules that depend on the test-jar.\n- **No `-am` on the test run** — `-am` re-instruments upstream modules with jacoco and triggers the same \"Cannot process instrumented class\" failure.\n- **No `clean` between `install` and `verify`** — clean wipes `target/classes` and the next compile re-resolves transitive deps from the (still installed) pom; some resolutions fail with `[WARNING] The POM for ... is invalid` and the build can't see `commons-collections4` etc.\n\n### If things go sideways\n\n- `Cannot process instrumented class` — re-run with `-Djacoco.skip=true`, or wipe `target/` for the affected module and re-run.\n- `NoClassDefFoundError: oshi/SystemInfo` or `commons-collections4/CollectionUtils` at test runtime — the bom didn't get installed; redo the setup step including `dolphinscheduler-bom` in `-pl`.\n- `class file contains wrong class` — local `~/.m2/.../dolphinscheduler-*-dev-SNAPSHOT.jar` is stale/corrupt. Delete the offending `dev-SNAPSHOT` directory under `~/.m2/repository/org/apache/dolphinscheduler/` and re-run install.\n\nSurefire XML reports land at `target/surefire-reports/TEST-<class>.xml` for the per-test counts.\n\n## Related modules\n\n- `dolphinscheduler-service`, `dolphinscheduler-dao` — primary deps.\n- `dolphinscheduler-extract-master` / `-worker` / `-alert` — RPC into servers.\n- `dolphinscheduler-authentication` (actuator sub-module) — secures `/actuator/**`.\n- `dolphinscheduler-ui` — primary consumer.\n- `dolphinscheduler-api-test` — integration harness.\n","CLAUDE.md":"# CLAUDE.md — Apache DolphinScheduler\n\nApache DolphinScheduler is a distributed, visual DAG workflow-scheduling platform. This is the monorepo: backend servers (master / worker / api / alert), a Vue 3 frontend, plugin families for tasks / datasources / storage / alerting / scheduling, and the release tooling.\n\n**This file is an index.** Each module has its own `CLAUDE.md` with the details — do not duplicate module contents here.\n\n---\n\n## Tech stack (project-wide)\n\n- **Java 1.8** (do not assume 11+ APIs; `dolphinscheduler-api-test` is the only Java 11 island).\n- **Spring Boot 2.6.1** across servers, **Jetty** (Tomcat is excluded transitively).\n- **MyBatis-Plus** for ORM; **HikariCP** for the metadata DB pool, **Druid** inside user-facing datasource plugins.\n- **Quartz** for cron scheduling (via `scheduler-plugin`).\n- **Netty / gRPC** for inter-server RPC (see `extract-base`).\n- **Vue 3 + Vite + TypeScript + Naive UI** for the frontend.\n- **Maven** multi-module reactor (26 modules in root `pom.xml` + 2 test modules).\n- **Zookeeper 3.8** by default for the registry (Etcd and JDBC also supported).\n\n## Runnable services\n\nA production deployment runs **four independent services** (plus an external registry and metadata DB). A fifth entry point — `StandaloneServer` — embeds all four in one JVM for development.\n\n| Service | Module | Main class | Default ports |\n|---------|--------|------------|---------------|\n| **API** | [`dolphinscheduler-api`](dolphinscheduler-api/CLAUDE.md) | `org.apache.dolphinscheduler.api.ApiApplicationServer` | `12345` (HTTP / UI + REST) |\n| **Master** | [`dolphinscheduler-master`](dolphinscheduler-master/CLAUDE.md) | `org.apache.dolphinscheduler.server.master.MasterServer` | `5679` (RPC) |\n| **Worker** | [`dolphinscheduler-worker`](dolphinscheduler-worker/CLAUDE.md) | `org.apache.dolphinscheduler.server.worker.WorkerServer` | `1235` (RPC) |\n| **Alert** | [`dolphinscheduler-alert`](dolphinscheduler-alert/CLAUDE.md) (→ `-alert-server`) | `org.apache.dolphinscheduler.alert.AlertServer` | `50053` (HTTP), `50052` (RPC) |\n| Standalone (dev only) | [`dolphinscheduler-standalone-server`](dolphinscheduler-standalone-server/CLAUDE.md) | `org.apache.dolphinscheduler.StandaloneServer` | `12345` + `50052` (API + alert; master/worker use in-JVM calls) |\n\nEvery service is a `@SpringBootApplication` on Jetty and implements `IStoppable`. Scale Master / Worker / Alert horizontally; coordination happens via the registry (Zookeeper by default). API is stateless and also scales horizontally behind a load balancer.\n\nPorts are overridable via `server.port` / service-specific keys in each service's `application.yaml`.\n\n## Build & run\n\n```bash\n# Full build (release profile; produces dist tarball)\n./mvnw clean install -Prelease\n\n# Zookeeper 3.4 legacy\n./mvnw clean install -Prelease -Dzk-3.4\n\n# Skip UI build (faster iteration on backend only)\n./mvnw -pl '!dolphinscheduler-ui' clean install\n\n# Build one module (+ its required siblings)\n./mvnw -pl dolphinscheduler-master -am clean install\n\n# Format (Spotless is configured)\n./mvnw spotless:apply\n\n# Standalone server (after building)\ncd dolphinscheduler-standalone-server/target && ./bin/start.sh\n```\n\nBinary artifact: `dolphinscheduler-dist/target/apache-dolphinscheduler-*-bin.tar.gz`.\n\n## Test\n\n```bash\n# Unit tests for one module\n./mvnw -pl dolphinscheduler-master test\n\n# API integration tests (separate reactor, requires Docker)\nmvn -pl dolphinscheduler-api-test/dolphinscheduler-api-test-case test\n\n# E2E browser tests (Selenium + Docker)\nmvn -pl dolphinscheduler-e2e/dolphinscheduler-e2e-case test\n\n# Apple Silicon: add -Dm1_chip=true to the Docker-driven suites\n```\n\n---\n\n## Module index\n\nClick into a module's `CLAUDE.md` for details. Each description is one line here on purpose.\n\n### Core execution\n\n- [`dolphinscheduler-master`](dolphinscheduler-master/CLAUDE.md) — workflow orchestration engine; consumes `Command`s, runs the DAG state machine, dispatches to workers.\n- [`dolphinscheduler-worker`](dolphinscheduler-worker/CLAUDE.md) — runs physical tasks dispatched from master; hosts task plugins.\n- [`dolphinscheduler-task-executor`](dolphinscheduler-task-executor/CLAUDE.md) — reusable task-lifecycle framework embedded by the worker.\n- [`dolphinscheduler-alert`](dolphinscheduler-alert/CLAUDE.md) — alert server + channel plugins (email, Feishu, DingTalk, …).\n\n### API layer\n\n- [`dolphinscheduler-api`](dolphinscheduler-api/CLAUDE.md) — REST API server (entry point for UI, Python SDK, external clients).\n- [`dolphinscheduler-api-test`](dolphinscheduler-api-test/CLAUDE.md) — integration tests against the REST API (Docker Compose + Testcontainers).\n- [`dolphinscheduler-authentication`](dolphinscheduler-authentication/CLAUDE.md) — Actuator-endpoint auth + AWS credential helpers (NOT the main login path).\n\n### Shared libraries\n\n- [`dolphinscheduler-common`](dolphinscheduler-common/CLAUDE.md) — foundation utilities (everything depends on this).\n- [`dolphinscheduler-dao`](dolphinscheduler-dao/CLAUDE.md) — MyBatis DAO layer + SQL migration scripts.\n- [`dolphinscheduler-service`](dolphinscheduler-service/CLAUDE.md) — business logic between DAO and the servers.\n- [`dolphinscheduler-spi`](dolphinscheduler-spi/CLAUDE.md) — Service-Provider Interface root (every plugin depends on this).\n- [`dolphinscheduler-extract`](dolphinscheduler-extract/CLAUDE.md) — RPC interface contracts between servers.\n- [`dolphinscheduler-eventbus`](dolphinscheduler-eventbus/CLAUDE.md) — in-process event-bus abstractions.\n- [`dolphinscheduler-registry`](dolphinscheduler-registry/CLAUDE.md) — pluggable registry (Zookeeper / Etcd / JDBC).\n- [`dolphinscheduler-meter`](dolphinscheduler-meter/CLAUDE.md) — metrics (Prometheus) + server load-protection primitives.\n\n### Plugin families\n\n- [`dolphinscheduler-task-plugin`](dolphinscheduler-task-plugin/CLAUDE.md) — task-type plugins (shell, SQL, Spark, Flink, K8s, EMR, …). 33 concrete plugins.\n- [`dolphinscheduler-datasource-plugin`](dolphinscheduler-datasource-plugin/CLAUDE.md) — user-facing datasource plugins (MySQL, Hive, Trino, Snowflake, …). 28 concrete plugins.\n- [`dolphinscheduler-storage-plugin`](dolphinscheduler-storage-plugin/CLAUDE.md) — resource storage (S3, HDFS, OSS, GCS, ABS, OBS, COS).\n- [`dolphinscheduler-scheduler-plugin`](dolphinscheduler-scheduler-plugin/CLAUDE.md) — cron scheduler (Quartz today).\n- [`dolphinscheduler-dao-plugin`](dolphinscheduler-dao-plugin/CLAUDE.md) — metadata-DB dialect support (MySQL / PostgreSQL / H2).\n\n### Build, ops, tools\n\n- [`dolphinscheduler-bom`](dolphinscheduler-bom/CLAUDE.md) — Maven BOM; central dependency version pinning.\n- [`dolphinscheduler-dist`](dolphinscheduler-dist/CLAUDE.md) — assembles the release tarball + Docker images.\n- [`dolphinscheduler-standalone-server`](dolphinscheduler-standalone-server/CLAUDE.md) — all-in-one JVM with H2 (dev / smoke tests).\n- [`dolphinscheduler-tools`](dolphinscheduler-tools/CLAUDE.md) — CLIs for schema upgrade + resource / lineage migration.\n- [`dolphinscheduler-microbench`](dolphinscheduler-microbench/CLAUDE.md) — JMH micro-benchmarks.\n- [`dolphinscheduler-yarn-aop`](dolphinscheduler-yarn-aop/CLAUDE.md) — AspectJ weaver capturing YARN ApplicationIds.\n\n### Frontend & E2E\n\n- [`dolphinscheduler-ui`](dolphinscheduler-ui/CLAUDE.md) — Vue 3 frontend.\n- [`dolphinscheduler-e2e`](dolphinscheduler-e2e/CLAUDE.md) — Selenium browser tests.\n\n---\n\n## Architecture overview (one paragraph)\n\nA **user** hits the UI, which calls the API server. The API server writes to the **metadata DB** and, for runtime operations (start / kill / pause workflow), talks to the **master** over RPC. The master consumes `t_ds_command` rows, runs the workflow state machine, and dispatches tasks to **workers**. Workers execute task plugins (shell, SQL, Spark, …) and stream lifecycle events back to master. Failures and SLA breaches flow to the **alert server**, which fans out through alert plugins. **Registry** (Zookeeper / Etcd / JDBC) provides service discovery, leader election, and distributed locks. **Storage plugins** back the resource center and distributed-task artifacts. **Quartz** (via scheduler plugin) fires scheduled workflows, which become new `Command` rows.\n\n## Where things live (quick lookup)\n\n| Looking for… | Start here |\n|--------------|------------|\n| A REST endpoint | `dolphinscheduler-api/src/main/java/.../api/controller/` |\n| Workflow execution logic | `dolphinscheduler-master/src/main/java/.../server/master/engine/` |\n| Task execution logic | `dolphinscheduler-worker` + the specific `task-plugin/<type>` |\n| How \"X\" is stored | `dolphinscheduler-dao/src/main/java/.../dao/entity/` |\n| SQL schema / upgrade | `dolphinscheduler-dao/src/main/resources/sql/` |\n| RPC contract between servers | `dolphinscheduler-extract/dolphinscheduler-extract-<role>` |\n| UI page source | `dolphinscheduler-ui/src/views/<feature>/` |\n| API call in the UI | `dolphinscheduler-ui/src/service/modules/<resource>.ts` |\n| Version of a dependency | `dolphinscheduler-bom/pom.xml` |\n\n## Project-wide conventions\n\n- **Formatting**: Run `./mvnw spotless:apply` before every commit/push. Spotless covers Java sources, `pom.xml`, and Markdown files (yes, including the docs); CI runs `./mvnw spotless:check` and will fail PRs that aren't formatted. Java imports are ordered; license headers are enforced.\n- **Commit style**: `[Type-ISSUE_ID][Scope] Subject`, e.g. `[Fix-18168][Worker] ...`. All types except `Chore` require an issue ID. See [commit-message.md](docs/docs/en/contribute/join/commit-message.md) for the full convention.\n- **Branching**: `dev` is the main integration branch (not `main`/`master`).\n- **PRs must link a GitHub issue** and keep their scope tight — one module / one concern.\n- **Do not break wire / DB compatibility** silently. Changes to `extract-*` RPC interfaces, `dao` entities, enum values, and `spi.DbType` ripple to deployed clusters mid-upgrade.\n- **Only one registry / storage / DB dialect is active at runtime**. Code paths that check \"which one\" belong inside the plugin SPI, not sprinkled through services.\n\n## External references\n\n- Release docs (version-specific): https://dolphinscheduler.apache.org/en-us/docs\n- GitHub issues: https://github.com/apache/dolphinscheduler/issues\n- Python SDK: https://dolphinscheduler.apache.org/python/\n- Contribution guide: [`docs/docs/en/contribute/join/contribute.md`](docs/docs/en/contribute/join/contribute.md)\n","dolphinscheduler-bom/CLAUDE.md":"# CLAUDE.md — dolphinscheduler-bom\n\nMaven **Bill of Materials**. Pins versions for every third-party library the project uses, so individual modules can `<dependency>` without specifying a version.\n\n## What goes here, what does NOT\n\n**Goes here**:\n- `<dependencyManagement>` entries for any lib used in more than one module.\n- `<properties>` pinning version numbers with consistent naming (`<netty.version>`, `<hadoop.version>`, …).\n- Profile-controlled version switches (e.g. `zk-3.8` vs `zk-3.4`).\n\n**Does NOT go here**:\n- Plugin versions (those live in the root `pom.xml`).\n- Dependencies specific to one plugin (e.g. Spark client version → stays in `task-spark/pom.xml`).\n- Anything the module defines for itself.\n\n## Key version properties (rough guide)\n\n- Spring Boot: 2.7.x (pinned by root pom, referenced here).\n- MyBatis Plus: 3.5.2.\n- gRPC: 1.41.0.\n- Netty: 4.1.53.\n- Hadoop: 3.2.4 (client side).\n- AspectJ: 1.9.7.\n- JDBC drivers: MySQL, PostgreSQL, Oracle, SQL Server, Snowflake, Databend, …\n\nWhen in doubt, **grep here first** for a dependency's current version before searching individual `pom.xml` files.\n\n## Profiles\n\n- `zk-3.8` (default) vs `zk-3.4` — switches Zookeeper + Curator versions. Active at build time via `-Pzk-3.4` if a legacy ZK cluster is targeted.\n\n## Gotchas\n\n- **`htrace-core` is explicitly excluded** from the Hadoop transitive graph as a CVE mitigation. Keep the exclusion even if someone reports the dep is \"missing\".\n- **Duplicate property bug**: `zeppelin-client.version` was historically defined twice (lines ~120 and ~123 of an older revision). If you see a similar duplication when editing, consolidate — the last one wins silently.\n- **No Java code** — `packaging: pom`. Don't add a `src/` directory.\n- **Version bumps here ripple to every module**; bump deliberately and prefer one-dep-at-a-time commits for bisect-ability.\n\n## Related modules\n\nEvery module that needs a pinned version imports this BOM in its own `<dependencyManagement>`.\n","dolphinscheduler-dao/CLAUDE.md":"# CLAUDE.md — dolphinscheduler-dao\n\nMyBatis-based data-access layer. Holds every entity, mapper, repository, and the SQL migration scripts shipped with a release.\n\n## Main package\n\n`org.apache.dolphinscheduler.dao`\n\n## Key sub-packages\n\n- `dao.entity` — persistence POJOs (`Command`, `WorkflowInstance`, `TaskInstance`, `User`, `Project`, `Tenant`, `DataSource`, `Cluster`, etc.). These map 1:1 to DB tables.\n- `dao.mapper` — MyBatis `@Mapper` interfaces. One per table/entity (`CommandMapper`, `WorkflowInstanceMapper`, `TaskInstanceMapper`, …).\n- `dao.repository` — higher-level repository abstractions wrapping mappers; what `service`/`master` layers should call, **not** the mappers directly.\n- `dao.model` — DAO-specific DTOs (query projections, aggregates).\n- `dao.utils` — SQL helpers.\n\n## SQL schema\n\n`src/main/resources/sql/`:\n\n- `dolphinscheduler_mysql.sql`, `dolphinscheduler_postgresql.sql`, `dolphinscheduler_h2.sql` — fresh install.\n- `upgrade/<version>/` — version-to-version migration DDL. Pairs with the upgraders in `dolphinscheduler-tools`.\n\n## Gotchas\n\n- **Mappers are not enough**: new code should go through `dao.repository`. Calling mappers directly from `master`/`service` is legacy and should not spread.\n- **Three DB dialects supported** (MySQL, PostgreSQL, H2). Any mapper XML must be dialect-neutral or rely on the dialect abstraction in `dolphinscheduler-dao-plugin`. Grep for `<if test=\"databaseType == ...\">` when in doubt — avoid adding more of those.\n- **Entity field renames are breaking**: MyBatis maps DB columns to field names via `@TableField` / naming conventions. Rename the column OR the field — never only one.\n- **Schema file excluded from jar**: `*.sql` is excluded from the built jar to keep it small; `dolphinscheduler-tools` repackages the SQL separately for the upgrade CLI.\n- `HikariCP` is the pool. Don't switch to Druid — datasource-plugin uses Druid internally for its own plugin connections, but the core DolphinScheduler metadata DB uses HikariCP.\n\n## Tests\n\n`src/test/java` — a mix of unit and Testcontainers-based integration tests. The database-dialect-specific paths are also exercised by `dolphinscheduler-dao-plugin/*/src/test`.\n\n## Related modules\n\n- `dolphinscheduler-dao-plugin` — dialect implementations; depended on here as `dolphinscheduler-dao-plugin-all`.\n- `dolphinscheduler-common` — utilities.\n- `dolphinscheduler-task-api` — task-related entities cross-reference it.\n- `dolphinscheduler-tools` — reads the SQL files here to run schema upgrades.\n","dolphinscheduler-datasource-plugin/CLAUDE.md":"# CLAUDE.md — dolphinscheduler-datasource-plugin\n\nPlugin family for **datasources** — the configurable DB/warehouse/query-engine connections a user can register (MySQL, PostgreSQL, Hive, Trino, Redshift, Snowflake, …). Used by the SQL-style task plugins, the API for connection testing, and the data-lineage tool.\n\n**This directory is a Maven parent POM.**\n\n## Sub-modules\n\n### Framework\n\n- **`dolphinscheduler-datasource-api`** — SPI and base types: `DataSourceProcessor`, `AbstractDataSourceProcessor`, `BaseDataSourceParamDTO`, `BaseHdfsConnectionParam`, and the `DataSourcePluginManager` that loads plugins.\n- **`dolphinscheduler-datasource-all`** — uber module bundling every plugin; depended on by `master`, `worker`, `api` so they can use any datasource at runtime.\n\n### Concrete plugins (28 sub-modules)\n\nRelational: `-mysql`, `-postgresql`, `-oracle`, `-sqlserver`, `-db2`, `-oceanbase`, `-dameng`, `-hana`, `-azure-sql`, `-vertica`.\n\nOLAP / warehouses: `-clickhouse`, `-doris`, `-starrocks`, `-redshift`, `-snowflake`, `-databend`, `-dolphindb`.\n\nBig-data engines: `-hive`, `-spark`, `-presto`, `-trino`, `-kyuubi`, `-athena`.\n\nCloud / other: `-sagemaker`, `-k8s`, `-aliyunserverlessspark`, `-ssh`, `-zeppelin`.\n\n## SPI contract\n\nTwo interfaces are **both** implemented by each plugin:\n\n1. `DataSourceChannelFactory` (from `dolphinscheduler-spi`, loaded via `PrioritySPIFactory`) — creates `DataSourceChannel`s for low-level connection handling.\n2. `DataSourceProcessor` (from `datasource-api`, loaded via standard `ServiceLoader`) — validates + builds connection params, handles the UI-form contract.\n\nBoth are wired into plugins with `@AutoService(...)`. Discovery happens in `DataSourcePluginManager`.\n\n## How it plugs into the rest of the system\n\n- **API**: when the user opens the \"Create Datasource\" dialog, the API asks each `DataSourceProcessor` for its param descriptor and serves it to the UI.\n- **Worker**: SQL-family task plugins (`task-sql`, `task-procedure`, `task-datax`, …) look up the configured datasource by id, ask `datasource-api` for a JDBC connection via the channel, run the statement.\n\n## Gotchas\n\n- **Dual SPI loading is intentional**: channels are priority-ordered (multiple providers can coexist); processors are keyed by `DbType` (one per type). Don't merge them.\n- **`DbType` enum lives in `dolphinscheduler-spi`**. Adding a new datasource means: new enum value in spi + new plugin sub-module. Leaving the enum unchanged will cause `DataSourcePluginManager` to silently ignore the plugin.\n- **Passwords are encrypted** via `PasswordUtils` in `common`. Never store or log the plaintext form; always go through `PasswordUtils.encodePassword` / `decodePassword`.\n- **JDBC connection pooling** is **Druid** (not HikariCP). This is different from the metadata DB (`dolphinscheduler-dao` uses HikariCP). Be careful with which you're tuning.\n- **Hive / Spark / Presto plugins pull massive dep trees** — exclusions in their poms are load-bearing. Adding a new version bump here can blow up the classpath.\n\n## Tests\n\nEach plugin has `src/test/java`. Most use an embedded H2 or a mocked driver; a few use Testcontainers (e.g. `-postgresql`, `-mysql`).\n\n## Related modules\n\n- `dolphinscheduler-spi` — base SPI (`DataSourceChannelFactory`, `DbType`).\n- `dolphinscheduler-task-plugin` — primary consumer (SQL family plugins).\n- `dolphinscheduler-api`, `dolphinscheduler-service` — consumers for configuration + validation.\n- `dolphinscheduler-common` — `PasswordUtils`.\n","dolphinscheduler-dao-plugin/CLAUDE.md":"# CLAUDE.md — dolphinscheduler-dao-plugin\n\nPlugin family for **database dialects** supporting the core DolphinScheduler metadata DB. Handles dialect-specific SQL generation, MyBatis-Plus `DbType` selection, and schema monitoring.\n\n**This directory is a Maven parent POM.** Not to be confused with `dolphinscheduler-datasource-plugin`, which is about *user-configured* external datasources — this module is about the *internal* metadata DB.\n\n## Sub-modules\n\n- **`dolphinscheduler-dao-api`** — SPI: `DaoPluginConfiguration`, `DatabaseDialect`, `DatabaseMonitor`, `DatabaseEnvironmentCondition`.\n- **`dolphinscheduler-dao-plugin-all`** — uber bundle depended on by `dolphinscheduler-dao`.\n- Concrete dialects:\n  - `dolphinscheduler-dao-mysql` — MySQL 5.7+ (production).\n  - `dolphinscheduler-dao-postgresql` — PostgreSQL 9.6+ (production).\n  - `dolphinscheduler-dao-h2` — H2 (dev / tests / standalone server).\n\n## How the right dialect is picked\n\nEach sub-module registers a `@AutoConfiguration` class (Spring Boot 2.7 style) that is `@Conditional(DatabaseEnvironmentCondition.class)`. `DatabaseEnvironmentCondition` looks at `spring.datasource.driver-class-name` and matches it to the dialect.\n\nSwitching the DB type therefore only requires changing the driver + URL in `application.yaml` — no pom changes.\n\n## Gotchas\n\n- **This is not a user-facing SPI**. There are exactly three supported internal DBs; adding a fourth (e.g. MariaDB, OceanBase for the metadata DB) requires coordinated changes in `dolphinscheduler-dao` SQL scripts and `dolphinscheduler-tools` upgraders.\n- **MyBatis-Plus `DbType` (`com.baomidou.mybatisplus.annotation.DbType`) is NOT the same enum as `dolphinscheduler-spi`'s `DbType`**. Internal DB uses the MyBatis-Plus one; external datasources use the spi one. When editing code here, make sure you're importing the right one.\n- **Dialect-specific SQL**: pagination (MySQL `LIMIT` vs PostgreSQL `OFFSET … LIMIT`), upsert behavior, JSON column handling. The `DatabaseDialect` interface is the authoritative place to vary SQL between backends — don't add `if (dbType == X)` branches in mappers.\n- **H2 is only for dev/test**. Production deployments should not run on H2. The standalone server is the only shipping configuration that uses it.\n\n## Tests\n\nEach dialect sub-module has its own `src/test/java` exercising the dialect behavior, typically against an embedded driver or Testcontainers.\n\n## Related modules\n\n- `dolphinscheduler-dao` — primary consumer (depends on `dao-plugin-all`).\n- `dolphinscheduler-tools` — DB schema upgrader; knows about the same three dialects.\n- `dolphinscheduler-standalone-server` — uses `-dao-h2` by default.\n","dolphinscheduler-dist/CLAUDE.md":"# CLAUDE.md — dolphinscheduler-dist\n\nThe **release assembler**. Produces the binary tarball (`apache-dolphinscheduler-<version>-bin.tar.gz`) and the source tarball, optionally a Docker image. Has no Java code — it is a Maven assembly + shell-script orchestration module.\n\n## Artifacts produced\n\n- `apache-dolphinscheduler-${version}-bin.tar.gz` — standalone-server + master + worker + api + alert + UI + tools + plugin jars + scripts + configs.\n- `apache-dolphinscheduler-${version}-src.tar.gz` — ASF-compliant source tarball.\n- Docker images — when built with `-P docker`.\n\n## Assembly descriptors\n\n`src/main/assembly/`:\n\n- `dolphinscheduler-bin.xml` — file layout of the binary tarball.\n- `dolphinscheduler-src.xml` — file layout of the source tarball.\n\n## Scripts\n\n`src/main/scripts/` (approx):\n\n- `assembly-plugins.sh` — copies plugin jars into the right `lib/plugin/` subdirectories.\n- `docker-build.sh` — builds Docker images (invoked when `-P docker` and Docker CLI available).\n\n## Build\n\n```\n# Binary tarball (from repo root)\n./mvnw -pl dolphinscheduler-dist -am clean package\n\n# With Docker images\n./mvnw -pl dolphinscheduler-dist -am -P docker clean package\n```\n\nOutput lands in `dolphinscheduler-dist/target/`.\n\n## Gotchas\n\n- **`-P docker` requires a working Docker CLI + BuildKit**. CI sets `DOCKER_BUILDKIT=1` explicitly.\n- **`-am` is almost always needed** (`also make`) — this module reaches into every server, plugin, UI, and tool, so their sibling modules must be built first.\n- **The binary tarball layout is operator-facing**. Operators depend on `bin/`, `conf/`, `lib/`, `libs/plugin/` existing at known paths. Don't reorganize without announcing it.\n- **UI is built inside `dolphinscheduler-ui`** (Node / pnpm) during `./mvnw package`; this module picks up the `dist/` folder. A broken UI build breaks the dist build.\n- **Plugin jars are sorted into `libs/plugin/<family>/` by `assembly-plugins.sh`** — new plugin families need to be added to this script.\n- Source tarball rules are **ASF-compliant**: excludes binaries, `.git*`, etc. Don't introduce large binaries into the repo.\n\n## Tests\n\nNone. Verification is end-to-end via `dolphinscheduler-e2e` which runs against a built tarball.\n\n## Related modules\n\n- Dependencies at package-time: `dolphinscheduler-standalone-server`, `-api`, `-alert-server`, `-ui`, `-tools`.\n- Plugin families are picked up transitively via the `-all` uber modules (`task-all`, `datasource-all`, `storage-all`, `alert-all`, `scheduler-all`, `registry-all`, `dao-plugin-all`).\n","dolphinscheduler-common/CLAUDE.md":"# CLAUDE.md — dolphinscheduler-common\n\nFoundation utility library. Every other backend module in the repo transitively depends on this one, so treat it as the lowest layer: no internal dependencies, minimal behavior, stable API.\n\n## What lives here\n\n- Shared utilities: string / date / file / map / JSON helpers, SSL, encryption, thread helpers.\n- Global enums and constants (workflow status, task types, flag values, date formats).\n- Shell command execution primitives (`ShellExecutor`, `AbstractShell`).\n- Property delegation layer (`IPropertyDelegate`, `ImmutablePropertyDelegate`) used to read YAML/properties uniformly.\n- Generic DAG data structure (`common.graph.DAG`) — used by master to traverse workflow graphs.\n- Lifecycle interface (`IStoppable`) — implemented by every long-lived server (Master, Worker, Alert, API).\n\n## Main package\n\n`org.apache.dolphinscheduler.common`\n\n## Key sub-packages\n\n- `common.utils` — stateless helpers; the most-touched package in the module.\n- `common.constants` — `Constants`, `TenantConstants`, `DateConstants`.\n- `common.enums` — `WorkflowExecutionStatus`, `TaskExecutionStatus`, `Flag`, etc. Changes here ripple across every module — be careful when renaming.\n- `common.config` — property-source abstractions consumed by Spring `@ConfigurationProperties` classes elsewhere.\n- `common.shell` — blocking shell executor, used by task plugins.\n- `common.graph` — generic DAG; not workflow-specific despite the usage.\n- `common.lifecycle` — `IStoppable` only.\n\n## Extension points\n\nNone. This module exposes no SPI; it is a leaf utility library.\n\n## Configuration\n\n`src/main/resources`:\n\n- `common.properties` — logging + cloud-storage credentials read by services.\n- `remote-logging.yaml` — config for remote log fetch.\n- `resource-center.yaml` — resource-center defaults.\n\n## Gotchas\n\n- Cloud-storage SDKs (Aliyun OSS, Huawei OBS, Tencent COS, Azure Blob) are declared with `<optional>true</optional>` / broad exclusions. Do **not** rely on them being on the classpath from here — the concrete storage plugins in `dolphinscheduler-storage-plugin` bring them in.\n- Enum renames are breaking: workflow/task status enums are serialized into the database via MyBatis type handlers in `dolphinscheduler-dao`. Always grep for the enum value before renaming.\n- `IStoppable` is the canonical shutdown contract across every server; do not invent a new lifecycle interface.\n\n## Tests\n\nStandard `src/test/java`. No special infra.\n\n## Related modules\n\n- `dolphinscheduler-spi` — uses `common` as `provided`; keep new SPI-facing types minimal here.\n- Every `server-*` / `dao` / `service` / `plugin` module depends on this.\n","dolphinscheduler-e2e/CLAUDE.md":"# dolphinscheduler-e2e - Claude Agent Guidelines & System Prompt\n\nPath: `dolphinscheduler-e2e/CLAUDE.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-e2e/CLAUDE.md)","dolphinscheduler-eventbus/CLAUDE.md":"# dolphinscheduler-eventbus - Claude Agent Guidelines & System Prompt\n\nPath: `dolphinscheduler-eventbus/CLAUDE.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-eventbus/CLAUDE.md)","dolphinscheduler-extract/CLAUDE.md":"# dolphinscheduler-extract - Claude Agent Guidelines & System Prompt\n\nPath: `dolphinscheduler-extract/CLAUDE.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-extract/CLAUDE.md)","dolphinscheduler-master/CLAUDE.md":"# dolphinscheduler-master - Claude Agent Guidelines & System Prompt\n\nPath: `dolphinscheduler-master/CLAUDE.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-master/CLAUDE.md)","dolphinscheduler-meter/CLAUDE.md":"# dolphinscheduler-meter - Claude Agent Guidelines & System Prompt\n\nPath: `dolphinscheduler-meter/CLAUDE.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-meter/CLAUDE.md)","dolphinscheduler-microbench/CLAUDE.md":"# dolphinscheduler-microbench - Claude Agent Guidelines & System Prompt\n\nPath: `dolphinscheduler-microbench/CLAUDE.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-microbench/CLAUDE.md)","dolphinscheduler-registry/CLAUDE.md":"# dolphinscheduler-registry - Claude Agent Guidelines & System Prompt\n\nPath: `dolphinscheduler-registry/CLAUDE.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-registry/CLAUDE.md)","dolphinscheduler-scheduler-plugin/CLAUDE.md":"# dolphinscheduler-scheduler-plugin - Claude Agent Guidelines & System Prompt\n\nPath: `dolphinscheduler-scheduler-plugin/CLAUDE.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-scheduler-plugin/CLAUDE.md)","dolphinscheduler-service/CLAUDE.md":"# dolphinscheduler-service - Claude Agent Guidelines & System Prompt\n\nPath: `dolphinscheduler-service/CLAUDE.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-service/CLAUDE.md)","dolphinscheduler-spi/CLAUDE.md":"# dolphinscheduler-spi - Claude Agent Guidelines & System Prompt\n\nPath: `dolphinscheduler-spi/CLAUDE.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-spi/CLAUDE.md)","dolphinscheduler-standalone-server/CLAUDE.md":"# dolphinscheduler-standalone-server - Claude Agent Guidelines & System Prompt\n\nPath: `dolphinscheduler-standalone-server/CLAUDE.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-standalone-server/CLAUDE.md)","dolphinscheduler-storage-plugin/CLAUDE.md":"# dolphinscheduler-storage-plugin - Claude Agent Guidelines & System Prompt\n\nPath: `dolphinscheduler-storage-plugin/CLAUDE.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-storage-plugin/CLAUDE.md)","dolphinscheduler-task-executor/CLAUDE.md":"# dolphinscheduler-task-executor - Claude Agent Guidelines & System Prompt\n\nPath: `dolphinscheduler-task-executor/CLAUDE.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-task-executor/CLAUDE.md)","dolphinscheduler-task-plugin/CLAUDE.md":"# dolphinscheduler-task-plugin - Claude Agent Guidelines & System Prompt\n\nPath: `dolphinscheduler-task-plugin/CLAUDE.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-task-plugin/CLAUDE.md)","dolphinscheduler-tools/CLAUDE.md":"# dolphinscheduler-tools - Claude Agent Guidelines & System Prompt\n\nPath: `dolphinscheduler-tools/CLAUDE.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-tools/CLAUDE.md)","dolphinscheduler-ui/CLAUDE.md":"# dolphinscheduler-ui - Claude Agent Guidelines & System Prompt\n\nPath: `dolphinscheduler-ui/CLAUDE.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-ui/CLAUDE.md)","dolphinscheduler-worker/CLAUDE.md":"# dolphinscheduler-worker - Claude Agent Guidelines & System Prompt\n\nPath: `dolphinscheduler-worker/CLAUDE.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-worker/CLAUDE.md)","dolphinscheduler-yarn-aop/CLAUDE.md":"# dolphinscheduler-yarn-aop - Claude Agent Guidelines & System Prompt\n\nPath: `dolphinscheduler-yarn-aop/CLAUDE.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-yarn-aop/CLAUDE.md)","tools/release/README.md":"# release Documentation\n\nPath: `tools/release/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/tools/release/README.md)"},"files":{"dolphinscheduler-alert/CLAUDE.md":"# CLAUDE.md — dolphinscheduler-alert\n\nAlert / notification subsystem. Master and worker publish alert events (task failure, timeout, SLA breach, …); this subsystem evaluates them and dispatches via configured channel plugins (email, webhook, Feishu, DingTalk, PagerDuty, …).\n\n**This directory is a Maven parent POM.**\n\n## Sub-modules\n\n- **`dolphinscheduler-alert-server`** — the runnable alert server. `@SpringBootApplication` `AlertServer` + HA coordinator (`AlertHAServer`) + RPC server (`AlertRpcServer`) + event loop.\n- **`dolphinscheduler-alert-plugins`** — parent of the concrete channel plugins:\n  - `dolphinscheduler-alert-email`, `-http`, `-feishu`, `-dingtalk`, `-wechat`, `-webexteams`, `-pagerduty`, `-telegram`, `-slack`, `-script`, etc. (see directory listing for the current set). Each plugin implements the `AlertPlugin` SPI and is loaded dynamically at runtime.\n\n## How alerting works (end-to-end)\n\n1. Master/worker calls into `dolphinscheduler-extract-alert` RPC with an `AlertRequest`.\n2. `AlertRpcServer` receives it, persists/enqueues onto `AlertEventPendingQueue`.\n3. `AlertEventFetcher` pulls pending events in `AlertEventLoop`.\n4. `AlertSender` looks up the alert group's configured plugins, invokes each.\n5. Delivery result is recorded to the DB for audit.\n\n## Extension points\n\n- **`AlertPlugin` SPI** — new channel? Implement the interface in a new sub-module of `dolphinscheduler-alert-plugins` and it will be discovered by `AlertPluginManager`.\n- Alert rule logic is currently fixed (type-based); extending rules means editing `AlertEventLoop` / `AlertSender`.\n\n## Gotchas\n\n- **Alert server is separate from master/worker** by design. Running it as an embedded part of master is not supported — it has its own HA, its own port, its own `application.yaml`.\n- **`AlertEventPendingQueue` is DB-backed** (not just in-memory) so restarting the alert server does not lose queued alerts.\n- **HA pattern mirrors master/worker**: only the leader pulls from the queue; others stand by.\n- **Plugin config is per-alert-group**, stored in the DB. Adding a plugin implementation does not enable it for anyone until an admin creates an alert group referencing it.\n- **Channel-specific rate limits / retries** live *inside* each plugin, not in the server. Don't add a global retry loop in `AlertSender`.\n\n## Tests\n\n- `alert-server/src/test/java` — unit tests for config, RPC, event queue, sender.\n- Each plugin has its own `src/test/java` with mocked channel calls.\n\n## Related modules\n\n- `dolphinscheduler-extract-alert` — RPC contracts this server implements.\n- `dolphinscheduler-dao` — persists alert events + audit.\n- `dolphinscheduler-registry-all`, `dolphinscheduler-meter`, `dolphinscheduler-spi`.\n- Callers: `dolphinscheduler-master`, `dolphinscheduler-worker`.\n","dolphinscheduler-authentication/CLAUDE.md":"# CLAUDE.md — dolphinscheduler-authentication\n\nParent POM grouping two unrelated authentication helpers. They share no code — they're bundled here because both are about injecting security behavior into the server stack.\n\n**This directory is a Maven parent POM.**\n\n## Sub-modules\n\n- **`dolphinscheduler-actuator-authentication`** — Secures Spring Boot Actuator endpoints (`/actuator/**` and `/dolphinscheduler/actuator/**`) with HTTP Basic auth. Ships `ActuatorAuthenticationAutoConfiguration` + `ActuatorSecurityProperties` (`management.security.*` properties). Enabled when `management.security.enabled=true`. Excludable endpoints (health/info) via config list.\n- **`dolphinscheduler-aws-authentication`** — AWS credential provider abstraction used by AWS-based datasource/task plugins (EMR, S3, SageMaker, DMS, DataSync, etc.). Exposes `AWSCredentialsProviderFactor` with two strategies: `STATIC` (access key + secret) and `INSTANCE_PROFILE` (EC2/EKS IAM role).\n\n## Gotchas\n\n- **These two sub-modules are unrelated.** Don't treat \"authentication\" as a coherent module — the actuator one is about operator access; the AWS one is about cloud-task credentials. They don't share any class.\n- **API login auth is NOT here**. Session/password/LDAP/OIDC/CASDOOR login for the main API lives in `dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/security/`. If a user says \"auth\", check which one they mean first.\n- Actuator: the sample config uses `{noop}` password encoder. This is **development-only**; production must switch to `{bcrypt}` or an external IdP.\n- AWS: `STATIC` credentials sit in plaintext config. Always prefer `INSTANCE_PROFILE` on real infrastructure. When reading code that takes an `AwsConfig` map, expect either style.\n\n## Tests\n\nMinimal — auto-config wiring only. End-to-end auth is covered by `dolphinscheduler-api-test`.\n\n## Related modules\n\n- `dolphinscheduler-meter` — exposes the actuator endpoints that `-actuator-authentication` secures.\n- `dolphinscheduler-task-plugin` / `-datasource-plugin` AWS members — consume `-aws-authentication`.\n- `dolphinscheduler-api` — for the real user-login code path (separate from this module).\n","dolphinscheduler-api-test/CLAUDE.md":"# CLAUDE.md — dolphinscheduler-api-test\n\nIntegration test harness for the REST API. **Not** bundled into the release — this module exists to run curl-style black-box tests against a full DolphinScheduler stack booted via Docker Compose + Testcontainers.\n\n**This is a Maven parent POM.** This module is **not** declared in the root `pom.xml` `<modules>` — run it explicitly (e.g. `mvn -pl dolphinscheduler-api-test test -am`) or via CI workflows.\n\n## Sub-modules\n\n- **`dolphinscheduler-api-test-core`** — the reusable framework:\n  - `@DolphinScheduler` annotation (marks a test class, accepts `composeFiles`).\n  - `DolphinSchedulerExtension` — JUnit 5 extension that starts the Compose stack, injects `RequestClient` and page objects.\n  - `RequestClient` — thin HTTP client with session handling.\n  - Page-object base classes (`LoginPage`, `WorkflowDefinitionPage`, `ProjectPage`, `TenantPage`, `UserPage`, `WorkerGroupPage`).\n- **`dolphinscheduler-api-test-case`** — the actual test classes. `WorkflowDefinitionAPITest`, `TenantAPITest`, `SchedulerAPITest`, etc. Each class uses `@DolphinScheduler(composeFiles = { \"docker/basic/docker-compose.yaml\" })` to declare its environment.\n\n## Stack bootstrap\n\nCompose files live under `src/test/resources/docker/<scenario>/docker-compose.yaml`:\n\n- `basic/` — standard API + Postgres.\n- `tenant/` — scenario with multi-tenant configuration.\n- `oidc-login/` — API with Keycloak for OIDC flow (`realm-export.json` alongside).\n\nThe JUnit extension uses Testcontainers Compose to wait for port readiness before returning.\n\n## Running\n\n```\n# Full suite\nmvn -pl dolphinscheduler-api-test/dolphinscheduler-api-test-case test\n\n# Single class (Mac M1)\nmvn -pl dolphinscheduler-api-test/dolphinscheduler-api-test-case test \\\n    -Dtest=WorkflowDefinitionAPITest -Dm1_chip=true\n```\n\nFlags:\n\n- `-Dm1_chip=true` — forces `arm64/v8` platform for Docker on Apple Silicon.\n- `-Dlocal=true` — skips Testcontainers and points at a locally-running DolphinScheduler instead.\n\n## Gotchas\n\n- **Java 11 required** to compile this module (rest of the repo targets 1.8).\n- **`@Order` is mandatory** on test methods within a class — tests are state-dependent and must run in declared order.\n- **`@DisableIfTestFails` (from junit-pioneer)** cascades a failure to dependent tests in the same class; don't silently disable without understanding the chain.\n- **`sessionId` is threaded through page objects**: `LoginPage.login(...)` returns a session ID that subsequent page objects must receive. Don't instantiate page objects without first logging in.\n- **This module is excluded from the root reactor build** — CI drives it via a dedicated workflow. Check `.github/workflows/` before assuming a PR runs these.\n\n## Related modules\n\n- `dolphinscheduler-api` — the system under test.\n- `dolphinscheduler-dao` — depended on to reuse entity DTOs.\n- `dolphinscheduler-e2e` — complementary browser-level tests (selenium against UI).\n","AGENTS.md":"<!--\nSPDX-License-Identifier: Apache-2.0\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    https://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n-->\n\n# Agent Guide for dolphinscheduler\n\nThis file is read by automated agents (security scanners, code\nanalyzers, AI assistants) operating on this repository.\n\n## Security\n\nSecurity model: [SECURITY.md](./SECURITY.md)\n\nAgents that scan this repository should consult `SECURITY.md` and the\nthreat model it links before reporting issues.\n\nDolphinScheduler's security model defines user roles, trust boundaries, and known non-findings.\n","dolphinscheduler-api/CLAUDE.md":"# CLAUDE.md — dolphinscheduler-api\n\nREST API server. Entry point for the UI and external clients (curl, Python SDK). Uses Spring Boot with **Jetty** (not Tomcat) and springdoc-openapi for Swagger UI.\n\n## Main package\n\n`org.apache.dolphinscheduler.api`\n\n## Entry point\n\n`ApiApplicationServer` — `@SpringBootApplication`. On startup it:\n1. Loads `DataSourcePluginManager` and `TaskPluginManager` (plugin discovery).\n2. Binds to the port in `server.port` (default 12345).\n3. Starts the Py4J gateway used by the Python SDK.\n\n## Key sub-packages\n\n- `api.controller` — 30+ `@RestController` classes, one per domain (workflows, tasks, users, projects, tenants, resources, data sources, alerts, monitoring, …). All URLs rooted at `/dolphinscheduler/*`.\n- `api.service` / `api.service.impl` — business-logic layer wrapping `dolphinscheduler-service` and adding API-level concerns (auth checks, DTO mapping).\n- `api.security` — pluggable authenticators: `PASSWORD` (default), `LDAP`, `OIDC`, `CASDOOR`, `SSO`. Selected by `security.authentication.type`.\n- `api.interceptor` — `LoginHandlerInterceptor` (session cookie check), `RateLimitInterceptor`, `LocaleChangeInterceptor`.\n- `api.configuration` — Spring config beans: Swagger, OAuth2, task-type catalog.\n- `api.dto` — request/response DTOs.\n- `api.exceptions` — `ApiExceptionHandler` (`@RestControllerAdvice`) maps exceptions → structured JSON responses.\n\n## Extension points\n\n- `Authenticator` — implement a new one to support additional login backends (added cases go into `AuthenticationType` enum + registered in `SecurityConfig`).\n- Controllers auto-pick up new task types via `TaskTypeConfiguration` reading `task-type-config.yaml` / `dynamic-task-type-config.yaml`.\n\n## Configuration\n\n`src/main/resources`:\n\n- `application.yaml` — server port, datasource, registry, security mode, CORS, OpenAPI.\n- `task-type-config.yaml`, `dynamic-task-type-config.yaml` — the catalog of task types exposed to the UI.\n- `i18n/messages_*.properties` — English + Simplified Chinese server-side messages.\n- `swagger.properties` — springdoc config (UI lives at `/dolphinscheduler/swagger-ui/index.html`).\n- `logback-spring.xml` — logging.\n\n## Gotchas\n\n- **Jetty, not Tomcat**. `spring-boot-starter-tomcat` is excluded transitively via `dolphinscheduler-meter`. Avoid accidentally pulling Tomcat in.\n- **Session-based auth**: `LoginHandlerInterceptor` reads the `sessionId` cookie. There is no JWT by default. OIDC/CASDOOR paths still set a session.\n- **OIDC requires `casdoor-spring-boot-starter`**; `OAuth2Configuration` is `@ConditionalOnProperty(security.authentication.type = OIDC|CASDOOR)`.\n- **Python SDK integration** uses Py4J gateway, not REST. If a Python SDK change misbehaves, check `api-server` logs for Py4J init messages.\n- **Controllers mix `@PostMapping` with form params and JSON bodies inconsistently** — this is legacy. Follow whatever shape the adjacent endpoint uses rather than converting to JSON across the board.\n- **Swagger annotations are required** on new endpoints (`@Operation`, `@Parameter`). Missing ones break auto-generated docs the UI team consumes.\n\n## Tests\n\nUnit tests live in `src/test/java`. **Integration tests live in `dolphinscheduler-api-test`** (separate module, Docker Compose + Testcontainers).\n\n### Running unit tests from the command line\n\nThe CI flow (`.github/workflows/unit-test.yml`) runs in two phases. Mirror it locally:\n\n**One-time setup** — install BOM + upstream deps to local m2:\n\n```bash\nexport MAVEN_OPTS=\"-Xmx4g -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=1024m\"\n./mvnw install -B \\\n  -pl \"dolphinscheduler-bom,dolphinscheduler-api\" \\\n  -am -DskipTests=true -Dspotless.skip=true -DskipUT=true \\\n  -Djacoco.skip=true -Danalyze.skip=true\n```\n\n**Run tests** — use `verify` (NOT `test`), no `-am`, no `clean`:\n\n```bash\n./mvnw verify -B -pl \"dolphinscheduler-api\" \\\n  -Dmaven.test.skip=false -Dspotless.skip=true -DskipUT=false -Danalyze.skip=true \\\n  -Dsurefire.printSummary=true -Dsurefire.useFile=false \\\n  -Dsurefire.reportFormat=plain -Dsurefire.redirectTestOutputToFile=false \\\n  -Dsurefire.failIfNoSpecifiedTests=false \\\n  -Dtest='EnvironmentServiceTest#testVerifyEnvironment'\n```\n\nDrop the `-Dtest=...` filter to run the whole module.\n\n### Why the unusual flags\n\n- **`verify` not `test`** — root pom uses `jacoco-maven-plugin` in offline-instrument + restore-instrumented-classes mode. Only the `verify` lifecycle runs the `restore` goal, so `test` alone leaves `target/classes` instrumented and the next build fails with \"Cannot process instrumented class\".\n- **`dolphinscheduler-bom` must be in the install `-pl`** — without it, the installed pom lacks effective dependencyManagement and downstream compile/test classpaths drop transitive deps like `commons-collections4` and `oshi-core`.\n- **`-DskipTests=true` (not `-Dmaven.test.skip=true`) during install** — `maven.test.skip` skips test-source attach which breaks downstream modules that depend on the test-jar.\n- **No `-am` on the test run** — `-am` re-instruments upstream modules with jacoco and triggers the same \"Cannot process instrumented class\" failure.\n- **No `clean` between `install` and `verify`** — clean wipes `target/classes` and the next compile re-resolves transitive deps from the (still installed) pom; some resolutions fail with `[WARNING] The POM for ... is invalid` and the build can't see `commons-collections4` etc.\n\n### If things go sideways\n\n- `Cannot process instrumented class` — re-run with `-Djacoco.skip=true`, or wipe `target/` for the affected module and re-run.\n- `NoClassDefFoundError: oshi/SystemInfo` or `commons-collections4/CollectionUtils` at test runtime — the bom didn't get installed; redo the setup step including `dolphinscheduler-bom` in `-pl`.\n- `class file contains wrong class` — local `~/.m2/.../dolphinscheduler-*-dev-SNAPSHOT.jar` is stale/corrupt. Delete the offending `dev-SNAPSHOT` directory under `~/.m2/repository/org/apache/dolphinscheduler/` and re-run install.\n\nSurefire XML reports land at `target/surefire-reports/TEST-<class>.xml` for the per-test counts.\n\n## Related modules\n\n- `dolphinscheduler-service`, `dolphinscheduler-dao` — primary deps.\n- `dolphinscheduler-extract-master` / `-worker` / `-alert` — RPC into servers.\n- `dolphinscheduler-authentication` (actuator sub-module) — secures `/actuator/**`.\n- `dolphinscheduler-ui` — primary consumer.\n- `dolphinscheduler-api-test` — integration harness.\n","CLAUDE.md":"# CLAUDE.md — Apache DolphinScheduler\n\nApache DolphinScheduler is a distributed, visual DAG workflow-scheduling platform. This is the monorepo: backend servers (master / worker / api / alert), a Vue 3 frontend, plugin families for tasks / datasources / storage / alerting / scheduling, and the release tooling.\n\n**This file is an index.** Each module has its own `CLAUDE.md` with the details — do not duplicate module contents here.\n\n---\n\n## Tech stack (project-wide)\n\n- **Java 1.8** (do not assume 11+ APIs; `dolphinscheduler-api-test` is the only Java 11 island).\n- **Spring Boot 2.6.1** across servers, **Jetty** (Tomcat is excluded transitively).\n- **MyBatis-Plus** for ORM; **HikariCP** for the metadata DB pool, **Druid** inside user-facing datasource plugins.\n- **Quartz** for cron scheduling (via `scheduler-plugin`).\n- **Netty / gRPC** for inter-server RPC (see `extract-base`).\n- **Vue 3 + Vite + TypeScript + Naive UI** for the frontend.\n- **Maven** multi-module reactor (26 modules in root `pom.xml` + 2 test modules).\n- **Zookeeper 3.8** by default for the registry (Etcd and JDBC also supported).\n\n## Runnable services\n\nA production deployment runs **four independent services** (plus an external registry and metadata DB). A fifth entry point — `StandaloneServer` — embeds all four in one JVM for development.\n\n| Service | Module | Main class | Default ports |\n|---------|--------|------------|---------------|\n| **API** | [`dolphinscheduler-api`](dolphinscheduler-api/CLAUDE.md) | `org.apache.dolphinscheduler.api.ApiApplicationServer` | `12345` (HTTP / UI + REST) |\n| **Master** | [`dolphinscheduler-master`](dolphinscheduler-master/CLAUDE.md) | `org.apache.dolphinscheduler.server.master.MasterServer` | `5679` (RPC) |\n| **Worker** | [`dolphinscheduler-worker`](dolphinscheduler-worker/CLAUDE.md) | `org.apache.dolphinscheduler.server.worker.WorkerServer` | `1235` (RPC) |\n| **Alert** | [`dolphinscheduler-alert`](dolphinscheduler-alert/CLAUDE.md) (→ `-alert-server`) | `org.apache.dolphinscheduler.alert.AlertServer` | `50053` (HTTP), `50052` (RPC) |\n| Standalone (dev only) | [`dolphinscheduler-standalone-server`](dolphinscheduler-standalone-server/CLAUDE.md) | `org.apache.dolphinscheduler.StandaloneServer` | `12345` + `50052` (API + alert; master/worker use in-JVM calls) |\n\nEvery service is a `@SpringBootApplication` on Jetty and implements `IStoppable`. Scale Master / Worker / Alert horizontally; coordination happens via the registry (Zookeeper by default). API is stateless and also scales horizontally behind a load balancer.\n\nPorts are overridable via `server.port` / service-specific keys in each service's `application.yaml`.\n\n## Build & run\n\n```bash\n# Full build (release profile; produces dist tarball)\n./mvnw clean install -Prelease\n\n# Zookeeper 3.4 legacy\n./mvnw clean install -Prelease -Dzk-3.4\n\n# Skip UI build (faster iteration on backend only)\n./mvnw -pl '!dolphinscheduler-ui' clean install\n\n# Build one module (+ its required siblings)\n./mvnw -pl dolphinscheduler-master -am clean install\n\n# Format (Spotless is configured)\n./mvnw spotless:apply\n\n# Standalone server (after building)\ncd dolphinscheduler-standalone-server/target && ./bin/start.sh\n```\n\nBinary artifact: `dolphinscheduler-dist/target/apache-dolphinscheduler-*-bin.tar.gz`.\n\n## Test\n\n```bash\n# Unit tests for one module\n./mvnw -pl dolphinscheduler-master test\n\n# API integration tests (separate reactor, requires Docker)\nmvn -pl dolphinscheduler-api-test/dolphinscheduler-api-test-case test\n\n# E2E browser tests (Selenium + Docker)\nmvn -pl dolphinscheduler-e2e/dolphinscheduler-e2e-case test\n\n# Apple Silicon: add -Dm1_chip=true to the Docker-driven suites\n```\n\n---\n\n## Module index\n\nClick into a module's `CLAUDE.md` for details. Each description is one line here on purpose.\n\n### Core execution\n\n- [`dolphinscheduler-master`](dolphinscheduler-master/CLAUDE.md) — workflow orchestration engine; consumes `Command`s, runs the DAG state machine, dispatches to workers.\n- [`dolphinscheduler-worker`](dolphinscheduler-worker/CLAUDE.md) — runs physical tasks dispatched from master; hosts task plugins.\n- [`dolphinscheduler-task-executor`](dolphinscheduler-task-executor/CLAUDE.md) — reusable task-lifecycle framework embedded by the worker.\n- [`dolphinscheduler-alert`](dolphinscheduler-alert/CLAUDE.md) — alert server + channel plugins (email, Feishu, DingTalk, …).\n\n### API layer\n\n- [`dolphinscheduler-api`](dolphinscheduler-api/CLAUDE.md) — REST API server (entry point for UI, Python SDK, external clients).\n- [`dolphinscheduler-api-test`](dolphinscheduler-api-test/CLAUDE.md) — integration tests against the REST API (Docker Compose + Testcontainers).\n- [`dolphinscheduler-authentication`](dolphinscheduler-authentication/CLAUDE.md) — Actuator-endpoint auth + AWS credential helpers (NOT the main login path).\n\n### Shared libraries\n\n- [`dolphinscheduler-common`](dolphinscheduler-common/CLAUDE.md) — foundation utilities (everything depends on this).\n- [`dolphinscheduler-dao`](dolphinscheduler-dao/CLAUDE.md) — MyBatis DAO layer + SQL migration scripts.\n- [`dolphinscheduler-service`](dolphinscheduler-service/CLAUDE.md) — business logic between DAO and the servers.\n- [`dolphinscheduler-spi`](dolphinscheduler-spi/CLAUDE.md) — Service-Provider Interface root (every plugin depends on this).\n- [`dolphinscheduler-extract`](dolphinscheduler-extract/CLAUDE.md) — RPC interface contracts between servers.\n- [`dolphinscheduler-eventbus`](dolphinscheduler-eventbus/CLAUDE.md) — in-process event-bus abstractions.\n- [`dolphinscheduler-registry`](dolphinscheduler-registry/CLAUDE.md) — pluggable registry (Zookeeper / Etcd / JDBC).\n- [`dolphinscheduler-meter`](dolphinscheduler-meter/CLAUDE.md) — metrics (Prometheus) + server load-protection primitives.\n\n### Plugin families\n\n- [`dolphinscheduler-task-plugin`](dolphinscheduler-task-plugin/CLAUDE.md) — task-type plugins (shell, SQL, Spark, Flink, K8s, EMR, …). 33 concrete plugins.\n- [`dolphinscheduler-datasource-plugin`](dolphinscheduler-datasource-plugin/CLAUDE.md) — user-facing datasource plugins (MySQL, Hive, Trino, Snowflake, …). 28 concrete plugins.\n- [`dolphinscheduler-storage-plugin`](dolphinscheduler-storage-plugin/CLAUDE.md) — resource storage (S3, HDFS, OSS, GCS, ABS, OBS, COS).\n- [`dolphinscheduler-scheduler-plugin`](dolphinscheduler-scheduler-plugin/CLAUDE.md) — cron scheduler (Quartz today).\n- [`dolphinscheduler-dao-plugin`](dolphinscheduler-dao-plugin/CLAUDE.md) — metadata-DB dialect support (MySQL / PostgreSQL / H2).\n\n### Build, ops, tools\n\n- [`dolphinscheduler-bom`](dolphinscheduler-bom/CLAUDE.md) — Maven BOM; central dependency version pinning.\n- [`dolphinscheduler-dist`](dolphinscheduler-dist/CLAUDE.md) — assembles the release tarball + Docker images.\n- [`dolphinscheduler-standalone-server`](dolphinscheduler-standalone-server/CLAUDE.md) — all-in-one JVM with H2 (dev / smoke tests).\n- [`dolphinscheduler-tools`](dolphinscheduler-tools/CLAUDE.md) — CLIs for schema upgrade + resource / lineage migration.\n- [`dolphinscheduler-microbench`](dolphinscheduler-microbench/CLAUDE.md) — JMH micro-benchmarks.\n- [`dolphinscheduler-yarn-aop`](dolphinscheduler-yarn-aop/CLAUDE.md) — AspectJ weaver capturing YARN ApplicationIds.\n\n### Frontend & E2E\n\n- [`dolphinscheduler-ui`](dolphinscheduler-ui/CLAUDE.md) — Vue 3 frontend.\n- [`dolphinscheduler-e2e`](dolphinscheduler-e2e/CLAUDE.md) — Selenium browser tests.\n\n---\n\n## Architecture overview (one paragraph)\n\nA **user** hits the UI, which calls the API server. The API server writes to the **metadata DB** and, for runtime operations (start / kill / pause workflow), talks to the **master** over RPC. The master consumes `t_ds_command` rows, runs the workflow state machine, and dispatches tasks to **workers**. Workers execute task plugins (shell, SQL, Spark, …) and stream lifecycle events back to master. Failures and SLA breaches flow to the **alert server**, which fans out through alert plugins. **Registry** (Zookeeper / Etcd / JDBC) provides service discovery, leader election, and distributed locks. **Storage plugins** back the resource center and distributed-task artifacts. **Quartz** (via scheduler plugin) fires scheduled workflows, which become new `Command` rows.\n\n## Where things live (quick lookup)\n\n| Looking for… | Start here |\n|--------------|------------|\n| A REST endpoint | `dolphinscheduler-api/src/main/java/.../api/controller/` |\n| Workflow execution logic | `dolphinscheduler-master/src/main/java/.../server/master/engine/` |\n| Task execution logic | `dolphinscheduler-worker` + the specific `task-plugin/<type>` |\n| How \"X\" is stored | `dolphinscheduler-dao/src/main/java/.../dao/entity/` |\n| SQL schema / upgrade | `dolphinscheduler-dao/src/main/resources/sql/` |\n| RPC contract between servers | `dolphinscheduler-extract/dolphinscheduler-extract-<role>` |\n| UI page source | `dolphinscheduler-ui/src/views/<feature>/` |\n| API call in the UI | `dolphinscheduler-ui/src/service/modules/<resource>.ts` |\n| Version of a dependency | `dolphinscheduler-bom/pom.xml` |\n\n## Project-wide conventions\n\n- **Formatting**: Run `./mvnw spotless:apply` before every commit/push. Spotless covers Java sources, `pom.xml`, and Markdown files (yes, including the docs); CI runs `./mvnw spotless:check` and will fail PRs that aren't formatted. Java imports are ordered; license headers are enforced.\n- **Commit style**: `[Type-ISSUE_ID][Scope] Subject`, e.g. `[Fix-18168][Worker] ...`. All types except `Chore` require an issue ID. See [commit-message.md](docs/docs/en/contribute/join/commit-message.md) for the full convention.\n- **Branching**: `dev` is the main integration branch (not `main`/`master`).\n- **PRs must link a GitHub issue** and keep their scope tight — one module / one concern.\n- **Do not break wire / DB compatibility** silently. Changes to `extract-*` RPC interfaces, `dao` entities, enum values, and `spi.DbType` ripple to deployed clusters mid-upgrade.\n- **Only one registry / storage / DB dialect is active at runtime**. Code paths that check \"which one\" belong inside the plugin SPI, not sprinkled through services.\n\n## External references\n\n- Release docs (version-specific): https://dolphinscheduler.apache.org/en-us/docs\n- GitHub issues: https://github.com/apache/dolphinscheduler/issues\n- Python SDK: https://dolphinscheduler.apache.org/python/\n- Contribution guide: [`docs/docs/en/contribute/join/contribute.md`](docs/docs/en/contribute/join/contribute.md)\n","dolphinscheduler-bom/CLAUDE.md":"# CLAUDE.md — dolphinscheduler-bom\n\nMaven **Bill of Materials**. Pins versions for every third-party library the project uses, so individual modules can `<dependency>` without specifying a version.\n\n## What goes here, what does NOT\n\n**Goes here**:\n- `<dependencyManagement>` entries for any lib used in more than one module.\n- `<properties>` pinning version numbers with consistent naming (`<netty.version>`, `<hadoop.version>`, …).\n- Profile-controlled version switches (e.g. `zk-3.8` vs `zk-3.4`).\n\n**Does NOT go here**:\n- Plugin versions (those live in the root `pom.xml`).\n- Dependencies specific to one plugin (e.g. Spark client version → stays in `task-spark/pom.xml`).\n- Anything the module defines for itself.\n\n## Key version properties (rough guide)\n\n- Spring Boot: 2.7.x (pinned by root pom, referenced here).\n- MyBatis Plus: 3.5.2.\n- gRPC: 1.41.0.\n- Netty: 4.1.53.\n- Hadoop: 3.2.4 (client side).\n- AspectJ: 1.9.7.\n- JDBC drivers: MySQL, PostgreSQL, Oracle, SQL Server, Snowflake, Databend, …\n\nWhen in doubt, **grep here first** for a dependency's current version before searching individual `pom.xml` files.\n\n## Profiles\n\n- `zk-3.8` (default) vs `zk-3.4` — switches Zookeeper + Curator versions. Active at build time via `-Pzk-3.4` if a legacy ZK cluster is targeted.\n\n## Gotchas\n\n- **`htrace-core` is explicitly excluded** from the Hadoop transitive graph as a CVE mitigation. Keep the exclusion even if someone reports the dep is \"missing\".\n- **Duplicate property bug**: `zeppelin-client.version` was historically defined twice (lines ~120 and ~123 of an older revision). If you see a similar duplication when editing, consolidate — the last one wins silently.\n- **No Java code** — `packaging: pom`. Don't add a `src/` directory.\n- **Version bumps here ripple to every module**; bump deliberately and prefer one-dep-at-a-time commits for bisect-ability.\n\n## Related modules\n\nEvery module that needs a pinned version imports this BOM in its own `<dependencyManagement>`.\n","dolphinscheduler-dao/CLAUDE.md":"# CLAUDE.md — dolphinscheduler-dao\n\nMyBatis-based data-access layer. Holds every entity, mapper, repository, and the SQL migration scripts shipped with a release.\n\n## Main package\n\n`org.apache.dolphinscheduler.dao`\n\n## Key sub-packages\n\n- `dao.entity` — persistence POJOs (`Command`, `WorkflowInstance`, `TaskInstance`, `User`, `Project`, `Tenant`, `DataSource`, `Cluster`, etc.). These map 1:1 to DB tables.\n- `dao.mapper` — MyBatis `@Mapper` interfaces. One per table/entity (`CommandMapper`, `WorkflowInstanceMapper`, `TaskInstanceMapper`, …).\n- `dao.repository` — higher-level repository abstractions wrapping mappers; what `service`/`master` layers should call, **not** the mappers directly.\n- `dao.model` — DAO-specific DTOs (query projections, aggregates).\n- `dao.utils` — SQL helpers.\n\n## SQL schema\n\n`src/main/resources/sql/`:\n\n- `dolphinscheduler_mysql.sql`, `dolphinscheduler_postgresql.sql`, `dolphinscheduler_h2.sql` — fresh install.\n- `upgrade/<version>/` — version-to-version migration DDL. Pairs with the upgraders in `dolphinscheduler-tools`.\n\n## Gotchas\n\n- **Mappers are not enough**: new code should go through `dao.repository`. Calling mappers directly from `master`/`service` is legacy and should not spread.\n- **Three DB dialects supported** (MySQL, PostgreSQL, H2). Any mapper XML must be dialect-neutral or rely on the dialect abstraction in `dolphinscheduler-dao-plugin`. Grep for `<if test=\"databaseType == ...\">` when in doubt — avoid adding more of those.\n- **Entity field renames are breaking**: MyBatis maps DB columns to field names via `@TableField` / naming conventions. Rename the column OR the field — never only one.\n- **Schema file excluded from jar**: `*.sql` is excluded from the built jar to keep it small; `dolphinscheduler-tools` repackages the SQL separately for the upgrade CLI.\n- `HikariCP` is the pool. Don't switch to Druid — datasource-plugin uses Druid internally for its own plugin connections, but the core DolphinScheduler metadata DB uses HikariCP.\n\n## Tests\n\n`src/test/java` — a mix of unit and Testcontainers-based integration tests. The database-dialect-specific paths are also exercised by `dolphinscheduler-dao-plugin/*/src/test`.\n\n## Related modules\n\n- `dolphinscheduler-dao-plugin` — dialect implementations; depended on here as `dolphinscheduler-dao-plugin-all`.\n- `dolphinscheduler-common` — utilities.\n- `dolphinscheduler-task-api` — task-related entities cross-reference it.\n- `dolphinscheduler-tools` — reads the SQL files here to run schema upgrades.\n","dolphinscheduler-datasource-plugin/CLAUDE.md":"# CLAUDE.md — dolphinscheduler-datasource-plugin\n\nPlugin family for **datasources** — the configurable DB/warehouse/query-engine connections a user can register (MySQL, PostgreSQL, Hive, Trino, Redshift, Snowflake, …). Used by the SQL-style task plugins, the API for connection testing, and the data-lineage tool.\n\n**This directory is a Maven parent POM.**\n\n## Sub-modules\n\n### Framework\n\n- **`dolphinscheduler-datasource-api`** — SPI and base types: `DataSourceProcessor`, `AbstractDataSourceProcessor`, `BaseDataSourceParamDTO`, `BaseHdfsConnectionParam`, and the `DataSourcePluginManager` that loads plugins.\n- **`dolphinscheduler-datasource-all`** — uber module bundling every plugin; depended on by `master`, `worker`, `api` so they can use any datasource at runtime.\n\n### Concrete plugins (28 sub-modules)\n\nRelational: `-mysql`, `-postgresql`, `-oracle`, `-sqlserver`, `-db2`, `-oceanbase`, `-dameng`, `-hana`, `-azure-sql`, `-vertica`.\n\nOLAP / warehouses: `-clickhouse`, `-doris`, `-starrocks`, `-redshift`, `-snowflake`, `-databend`, `-dolphindb`.\n\nBig-data engines: `-hive`, `-spark`, `-presto`, `-trino`, `-kyuubi`, `-athena`.\n\nCloud / other: `-sagemaker`, `-k8s`, `-aliyunserverlessspark`, `-ssh`, `-zeppelin`.\n\n## SPI contract\n\nTwo interfaces are **both** implemented by each plugin:\n\n1. `DataSourceChannelFactory` (from `dolphinscheduler-spi`, loaded via `PrioritySPIFactory`) — creates `DataSourceChannel`s for low-level connection handling.\n2. `DataSourceProcessor` (from `datasource-api`, loaded via standard `ServiceLoader`) — validates + builds connection params, handles the UI-form contract.\n\nBoth are wired into plugins with `@AutoService(...)`. Discovery happens in `DataSourcePluginManager`.\n\n## How it plugs into the rest of the system\n\n- **API**: when the user opens the \"Create Datasource\" dialog, the API asks each `DataSourceProcessor` for its param descriptor and serves it to the UI.\n- **Worker**: SQL-family task plugins (`task-sql`, `task-procedure`, `task-datax`, …) look up the configured datasource by id, ask `datasource-api` for a JDBC connection via the channel, run the statement.\n\n## Gotchas\n\n- **Dual SPI loading is intentional**: channels are priority-ordered (multiple providers can coexist); processors are keyed by `DbType` (one per type). Don't merge them.\n- **`DbType` enum lives in `dolphinscheduler-spi`**. Adding a new datasource means: new enum value in spi + new plugin sub-module. Leaving the enum unchanged will cause `DataSourcePluginManager` to silently ignore the plugin.\n- **Passwords are encrypted** via `PasswordUtils` in `common`. Never store or log the plaintext form; always go through `PasswordUtils.encodePassword` / `decodePassword`.\n- **JDBC connection pooling** is **Druid** (not HikariCP). This is different from the metadata DB (`dolphinscheduler-dao` uses HikariCP). Be careful with which you're tuning.\n- **Hive / Spark / Presto plugins pull massive dep trees** — exclusions in their poms are load-bearing. Adding a new version bump here can blow up the classpath.\n\n## Tests\n\nEach plugin has `src/test/java`. Most use an embedded H2 or a mocked driver; a few use Testcontainers (e.g. `-postgresql`, `-mysql`).\n\n## Related modules\n\n- `dolphinscheduler-spi` — base SPI (`DataSourceChannelFactory`, `DbType`).\n- `dolphinscheduler-task-plugin` — primary consumer (SQL family plugins).\n- `dolphinscheduler-api`, `dolphinscheduler-service` — consumers for configuration + validation.\n- `dolphinscheduler-common` — `PasswordUtils`.\n","dolphinscheduler-dao-plugin/CLAUDE.md":"# CLAUDE.md — dolphinscheduler-dao-plugin\n\nPlugin family for **database dialects** supporting the core DolphinScheduler metadata DB. Handles dialect-specific SQL generation, MyBatis-Plus `DbType` selection, and schema monitoring.\n\n**This directory is a Maven parent POM.** Not to be confused with `dolphinscheduler-datasource-plugin`, which is about *user-configured* external datasources — this module is about the *internal* metadata DB.\n\n## Sub-modules\n\n- **`dolphinscheduler-dao-api`** — SPI: `DaoPluginConfiguration`, `DatabaseDialect`, `DatabaseMonitor`, `DatabaseEnvironmentCondition`.\n- **`dolphinscheduler-dao-plugin-all`** — uber bundle depended on by `dolphinscheduler-dao`.\n- Concrete dialects:\n  - `dolphinscheduler-dao-mysql` — MySQL 5.7+ (production).\n  - `dolphinscheduler-dao-postgresql` — PostgreSQL 9.6+ (production).\n  - `dolphinscheduler-dao-h2` — H2 (dev / tests / standalone server).\n\n## How the right dialect is picked\n\nEach sub-module registers a `@AutoConfiguration` class (Spring Boot 2.7 style) that is `@Conditional(DatabaseEnvironmentCondition.class)`. `DatabaseEnvironmentCondition` looks at `spring.datasource.driver-class-name` and matches it to the dialect.\n\nSwitching the DB type therefore only requires changing the driver + URL in `application.yaml` — no pom changes.\n\n## Gotchas\n\n- **This is not a user-facing SPI**. There are exactly three supported internal DBs; adding a fourth (e.g. MariaDB, OceanBase for the metadata DB) requires coordinated changes in `dolphinscheduler-dao` SQL scripts and `dolphinscheduler-tools` upgraders.\n- **MyBatis-Plus `DbType` (`com.baomidou.mybatisplus.annotation.DbType`) is NOT the same enum as `dolphinscheduler-spi`'s `DbType`**. Internal DB uses the MyBatis-Plus one; external datasources use the spi one. When editing code here, make sure you're importing the right one.\n- **Dialect-specific SQL**: pagination (MySQL `LIMIT` vs PostgreSQL `OFFSET … LIMIT`), upsert behavior, JSON column handling. The `DatabaseDialect` interface is the authoritative place to vary SQL between backends — don't add `if (dbType == X)` branches in mappers.\n- **H2 is only for dev/test**. Production deployments should not run on H2. The standalone server is the only shipping configuration that uses it.\n\n## Tests\n\nEach dialect sub-module has its own `src/test/java` exercising the dialect behavior, typically against an embedded driver or Testcontainers.\n\n## Related modules\n\n- `dolphinscheduler-dao` — primary consumer (depends on `dao-plugin-all`).\n- `dolphinscheduler-tools` — DB schema upgrader; knows about the same three dialects.\n- `dolphinscheduler-standalone-server` — uses `-dao-h2` by default.\n","dolphinscheduler-dist/CLAUDE.md":"# CLAUDE.md — dolphinscheduler-dist\n\nThe **release assembler**. Produces the binary tarball (`apache-dolphinscheduler-<version>-bin.tar.gz`) and the source tarball, optionally a Docker image. Has no Java code — it is a Maven assembly + shell-script orchestration module.\n\n## Artifacts produced\n\n- `apache-dolphinscheduler-${version}-bin.tar.gz` — standalone-server + master + worker + api + alert + UI + tools + plugin jars + scripts + configs.\n- `apache-dolphinscheduler-${version}-src.tar.gz` — ASF-compliant source tarball.\n- Docker images — when built with `-P docker`.\n\n## Assembly descriptors\n\n`src/main/assembly/`:\n\n- `dolphinscheduler-bin.xml` — file layout of the binary tarball.\n- `dolphinscheduler-src.xml` — file layout of the source tarball.\n\n## Scripts\n\n`src/main/scripts/` (approx):\n\n- `assembly-plugins.sh` — copies plugin jars into the right `lib/plugin/` subdirectories.\n- `docker-build.sh` — builds Docker images (invoked when `-P docker` and Docker CLI available).\n\n## Build\n\n```\n# Binary tarball (from repo root)\n./mvnw -pl dolphinscheduler-dist -am clean package\n\n# With Docker images\n./mvnw -pl dolphinscheduler-dist -am -P docker clean package\n```\n\nOutput lands in `dolphinscheduler-dist/target/`.\n\n## Gotchas\n\n- **`-P docker` requires a working Docker CLI + BuildKit**. CI sets `DOCKER_BUILDKIT=1` explicitly.\n- **`-am` is almost always needed** (`also make`) — this module reaches into every server, plugin, UI, and tool, so their sibling modules must be built first.\n- **The binary tarball layout is operator-facing**. Operators depend on `bin/`, `conf/`, `lib/`, `libs/plugin/` existing at known paths. Don't reorganize without announcing it.\n- **UI is built inside `dolphinscheduler-ui`** (Node / pnpm) during `./mvnw package`; this module picks up the `dist/` folder. A broken UI build breaks the dist build.\n- **Plugin jars are sorted into `libs/plugin/<family>/` by `assembly-plugins.sh`** — new plugin families need to be added to this script.\n- Source tarball rules are **ASF-compliant**: excludes binaries, `.git*`, etc. Don't introduce large binaries into the repo.\n\n## Tests\n\nNone. Verification is end-to-end via `dolphinscheduler-e2e` which runs against a built tarball.\n\n## Related modules\n\n- Dependencies at package-time: `dolphinscheduler-standalone-server`, `-api`, `-alert-server`, `-ui`, `-tools`.\n- Plugin families are picked up transitively via the `-all` uber modules (`task-all`, `datasource-all`, `storage-all`, `alert-all`, `scheduler-all`, `registry-all`, `dao-plugin-all`).\n","dolphinscheduler-common/CLAUDE.md":"# CLAUDE.md — dolphinscheduler-common\n\nFoundation utility library. Every other backend module in the repo transitively depends on this one, so treat it as the lowest layer: no internal dependencies, minimal behavior, stable API.\n\n## What lives here\n\n- Shared utilities: string / date / file / map / JSON helpers, SSL, encryption, thread helpers.\n- Global enums and constants (workflow status, task types, flag values, date formats).\n- Shell command execution primitives (`ShellExecutor`, `AbstractShell`).\n- Property delegation layer (`IPropertyDelegate`, `ImmutablePropertyDelegate`) used to read YAML/properties uniformly.\n- Generic DAG data structure (`common.graph.DAG`) — used by master to traverse workflow graphs.\n- Lifecycle interface (`IStoppable`) — implemented by every long-lived server (Master, Worker, Alert, API).\n\n## Main package\n\n`org.apache.dolphinscheduler.common`\n\n## Key sub-packages\n\n- `common.utils` — stateless helpers; the most-touched package in the module.\n- `common.constants` — `Constants`, `TenantConstants`, `DateConstants`.\n- `common.enums` — `WorkflowExecutionStatus`, `TaskExecutionStatus`, `Flag`, etc. Changes here ripple across every module — be careful when renaming.\n- `common.config` — property-source abstractions consumed by Spring `@ConfigurationProperties` classes elsewhere.\n- `common.shell` — blocking shell executor, used by task plugins.\n- `common.graph` — generic DAG; not workflow-specific despite the usage.\n- `common.lifecycle` — `IStoppable` only.\n\n## Extension points\n\nNone. This module exposes no SPI; it is a leaf utility library.\n\n## Configuration\n\n`src/main/resources`:\n\n- `common.properties` — logging + cloud-storage credentials read by services.\n- `remote-logging.yaml` — config for remote log fetch.\n- `resource-center.yaml` — resource-center defaults.\n\n## Gotchas\n\n- Cloud-storage SDKs (Aliyun OSS, Huawei OBS, Tencent COS, Azure Blob) are declared with `<optional>true</optional>` / broad exclusions. Do **not** rely on them being on the classpath from here — the concrete storage plugins in `dolphinscheduler-storage-plugin` bring them in.\n- Enum renames are breaking: workflow/task status enums are serialized into the database via MyBatis type handlers in `dolphinscheduler-dao`. Always grep for the enum value before renaming.\n- `IStoppable` is the canonical shutdown contract across every server; do not invent a new lifecycle interface.\n\n## Tests\n\nStandard `src/test/java`. No special infra.\n\n## Related modules\n\n- `dolphinscheduler-spi` — uses `common` as `provided`; keep new SPI-facing types minimal here.\n- Every `server-*` / `dao` / `service` / `plugin` module depends on this.\n","dolphinscheduler-e2e/CLAUDE.md":"# dolphinscheduler-e2e - Claude Agent Guidelines & System Prompt\n\nPath: `dolphinscheduler-e2e/CLAUDE.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-e2e/CLAUDE.md)","dolphinscheduler-eventbus/CLAUDE.md":"# dolphinscheduler-eventbus - Claude Agent Guidelines & System Prompt\n\nPath: `dolphinscheduler-eventbus/CLAUDE.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-eventbus/CLAUDE.md)","dolphinscheduler-extract/CLAUDE.md":"# dolphinscheduler-extract - Claude Agent Guidelines & System Prompt\n\nPath: `dolphinscheduler-extract/CLAUDE.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-extract/CLAUDE.md)","dolphinscheduler-master/CLAUDE.md":"# dolphinscheduler-master - Claude Agent Guidelines & System Prompt\n\nPath: `dolphinscheduler-master/CLAUDE.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-master/CLAUDE.md)","dolphinscheduler-meter/CLAUDE.md":"# dolphinscheduler-meter - Claude Agent Guidelines & System Prompt\n\nPath: `dolphinscheduler-meter/CLAUDE.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-meter/CLAUDE.md)","dolphinscheduler-microbench/CLAUDE.md":"# dolphinscheduler-microbench - Claude Agent Guidelines & System Prompt\n\nPath: `dolphinscheduler-microbench/CLAUDE.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-microbench/CLAUDE.md)","dolphinscheduler-registry/CLAUDE.md":"# dolphinscheduler-registry - Claude Agent Guidelines & System Prompt\n\nPath: `dolphinscheduler-registry/CLAUDE.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-registry/CLAUDE.md)","dolphinscheduler-scheduler-plugin/CLAUDE.md":"# dolphinscheduler-scheduler-plugin - Claude Agent Guidelines & System Prompt\n\nPath: `dolphinscheduler-scheduler-plugin/CLAUDE.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-scheduler-plugin/CLAUDE.md)","dolphinscheduler-service/CLAUDE.md":"# dolphinscheduler-service - Claude Agent Guidelines & System Prompt\n\nPath: `dolphinscheduler-service/CLAUDE.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-service/CLAUDE.md)","dolphinscheduler-spi/CLAUDE.md":"# dolphinscheduler-spi - Claude Agent Guidelines & System Prompt\n\nPath: `dolphinscheduler-spi/CLAUDE.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-spi/CLAUDE.md)","dolphinscheduler-standalone-server/CLAUDE.md":"# dolphinscheduler-standalone-server - Claude Agent Guidelines & System Prompt\n\nPath: `dolphinscheduler-standalone-server/CLAUDE.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-standalone-server/CLAUDE.md)","dolphinscheduler-storage-plugin/CLAUDE.md":"# dolphinscheduler-storage-plugin - Claude Agent Guidelines & System Prompt\n\nPath: `dolphinscheduler-storage-plugin/CLAUDE.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-storage-plugin/CLAUDE.md)","dolphinscheduler-task-executor/CLAUDE.md":"# dolphinscheduler-task-executor - Claude Agent Guidelines & System Prompt\n\nPath: `dolphinscheduler-task-executor/CLAUDE.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-task-executor/CLAUDE.md)","dolphinscheduler-task-plugin/CLAUDE.md":"# dolphinscheduler-task-plugin - Claude Agent Guidelines & System Prompt\n\nPath: `dolphinscheduler-task-plugin/CLAUDE.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-task-plugin/CLAUDE.md)","dolphinscheduler-tools/CLAUDE.md":"# dolphinscheduler-tools - Claude Agent Guidelines & System Prompt\n\nPath: `dolphinscheduler-tools/CLAUDE.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-tools/CLAUDE.md)","dolphinscheduler-ui/CLAUDE.md":"# dolphinscheduler-ui - Claude Agent Guidelines & System Prompt\n\nPath: `dolphinscheduler-ui/CLAUDE.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-ui/CLAUDE.md)","dolphinscheduler-worker/CLAUDE.md":"# dolphinscheduler-worker - Claude Agent Guidelines & System Prompt\n\nPath: `dolphinscheduler-worker/CLAUDE.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-worker/CLAUDE.md)","dolphinscheduler-yarn-aop/CLAUDE.md":"# dolphinscheduler-yarn-aop - Claude Agent Guidelines & System Prompt\n\nPath: `dolphinscheduler-yarn-aop/CLAUDE.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-yarn-aop/CLAUDE.md)","tools/release/README.md":"# release Documentation\n\nPath: `tools/release/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/tools/release/README.md)"},"items":[{"name":"AGENTS.md","path":"AGENTS.md","rawUrl":"https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/AGENTS.md","title":"AI Agent Protocol & Instructions","category":"root-instruction","format":"markdown","content":"<!--\nSPDX-License-Identifier: Apache-2.0\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    https://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n-->\n\n# Agent Guide for dolphinscheduler\n\nThis file is read by automated agents (security scanners, code\nanalyzers, AI assistants) operating on this repository.\n\n## Security\n\nSecurity model: [SECURITY.md](./SECURITY.md)\n\nAgents that scan this repository should consult `SECURITY.md` and the\nthreat model it links before reporting issues.\n\nDolphinScheduler's security model defines user roles, trust boundaries, and known non-findings.\n","isInternal":false,"tokens":211,"sizeBytes":1001},{"name":"CLAUDE.md","path":"CLAUDE.md","rawUrl":"https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/CLAUDE.md","title":"Claude Agent Guidelines & System Prompt","category":"claude-rule","format":"markdown","content":"# CLAUDE.md — Apache DolphinScheduler\n\nApache DolphinScheduler is a distributed, visual DAG workflow-scheduling platform. This is the monorepo: backend servers (master / worker / api / alert), a Vue 3 frontend, plugin families for tasks / datasources / storage / alerting / scheduling, and the release tooling.\n\n**This file is an index.** Each module has its own `CLAUDE.md` with the details — do not duplicate module contents here.\n\n---\n\n## Tech stack (project-wide)\n\n- **Java 1.8** (do not assume 11+ APIs; `dolphinscheduler-api-test` is the only Java 11 island).\n- **Spring Boot 2.6.1** across servers, **Jetty** (Tomcat is excluded transitively).\n- **MyBatis-Plus** for ORM; **HikariCP** for the metadata DB pool, **Druid** inside user-facing datasource plugins.\n- **Quartz** for cron scheduling (via `scheduler-plugin`).\n- **Netty / gRPC** for inter-server RPC (see `extract-base`).\n- **Vue 3 + Vite + TypeScript + Naive UI** for the frontend.\n- **Maven** multi-module reactor (26 modules in root `pom.xml` + 2 test modules).\n- **Zookeeper 3.8** by default for the registry (Etcd and JDBC also supported).\n\n## Runnable services\n\nA production deployment runs **four independent services** (plus an external registry and metadata DB). A fifth entry point — `StandaloneServer` — embeds all four in one JVM for development.\n\n| Service | Module | Main class | Default ports |\n|---------|--------|------------|---------------|\n| **API** | [`dolphinscheduler-api`](dolphinscheduler-api/CLAUDE.md) | `org.apache.dolphinscheduler.api.ApiApplicationServer` | `12345` (HTTP / UI + REST) |\n| **Master** | [`dolphinscheduler-master`](dolphinscheduler-master/CLAUDE.md) | `org.apache.dolphinscheduler.server.master.MasterServer` | `5679` (RPC) |\n| **Worker** | [`dolphinscheduler-worker`](dolphinscheduler-worker/CLAUDE.md) | `org.apache.dolphinscheduler.server.worker.WorkerServer` | `1235` (RPC) |\n| **Alert** | [`dolphinscheduler-alert`](dolphinscheduler-alert/CLAUDE.md) (→ `-alert-server`) | `org.apache.dolphinscheduler.alert.AlertServer` | `50053` (HTTP), `50052` (RPC) |\n| Standalone (dev only) | [`dolphinscheduler-standalone-server`](dolphinscheduler-standalone-server/CLAUDE.md) | `org.apache.dolphinscheduler.StandaloneServer` | `12345` + `50052` (API + alert; master/worker use in-JVM calls) |\n\nEvery service is a `@SpringBootApplication` on Jetty and implements `IStoppable`. Scale Master / Worker / Alert horizontally; coordination happens via the registry (Zookeeper by default). API is stateless and also scales horizontally behind a load balancer.\n\nPorts are overridable via `server.port` / service-specific keys in each service's `application.yaml`.\n\n## Build & run\n\n```bash\n# Full build (release profile; produces dist tarball)\n./mvnw clean install -Prelease\n\n# Zookeeper 3.4 legacy\n./mvnw clean install -Prelease -Dzk-3.4\n\n# Skip UI build (faster iteration on backend only)\n./mvnw -pl '!dolphinscheduler-ui' clean install\n\n# Build one module (+ its required siblings)\n./mvnw -pl dolphinscheduler-master -am clean install\n\n# Format (Spotless is configured)\n./mvnw spotless:apply\n\n# Standalone server (after building)\ncd dolphinscheduler-standalone-server/target && ./bin/start.sh\n```\n\nBinary artifact: `dolphinscheduler-dist/target/apache-dolphinscheduler-*-bin.tar.gz`.\n\n## Test\n\n```bash\n# Unit tests for one module\n./mvnw -pl dolphinscheduler-master test\n\n# API integration tests (separate reactor, requires Docker)\nmvn -pl dolphinscheduler-api-test/dolphinscheduler-api-test-case test\n\n# E2E browser tests (Selenium + Docker)\nmvn -pl dolphinscheduler-e2e/dolphinscheduler-e2e-case test\n\n# Apple Silicon: add -Dm1_chip=true to the Docker-driven suites\n```\n\n---\n\n## Module index\n\nClick into a module's `CLAUDE.md` for details. Each description is one line here on purpose.\n\n### Core execution\n\n- [`dolphinscheduler-master`](dolphinscheduler-master/CLAUDE.md) — workflow orchestration engine; consumes `Command`s, runs the DAG state machine, dispatches to workers.\n- [`dolphinscheduler-worker`](dolphinscheduler-worker/CLAUDE.md) — runs physical tasks dispatched from master; hosts task plugins.\n- [`dolphinscheduler-task-executor`](dolphinscheduler-task-executor/CLAUDE.md) — reusable task-lifecycle framework embedded by the worker.\n- [`dolphinscheduler-alert`](dolphinscheduler-alert/CLAUDE.md) — alert server + channel plugins (email, Feishu, DingTalk, …).\n\n### API layer\n\n- [`dolphinscheduler-api`](dolphinscheduler-api/CLAUDE.md) — REST API server (entry point for UI, Python SDK, external clients).\n- [`dolphinscheduler-api-test`](dolphinscheduler-api-test/CLAUDE.md) — integration tests against the REST API (Docker Compose + Testcontainers).\n- [`dolphinscheduler-authentication`](dolphinscheduler-authentication/CLAUDE.md) — Actuator-endpoint auth + AWS credential helpers (NOT the main login path).\n\n### Shared libraries\n\n- [`dolphinscheduler-common`](dolphinscheduler-common/CLAUDE.md) — foundation utilities (everything depends on this).\n- [`dolphinscheduler-dao`](dolphinscheduler-dao/CLAUDE.md) — MyBatis DAO layer + SQL migration scripts.\n- [`dolphinscheduler-service`](dolphinscheduler-service/CLAUDE.md) — business logic between DAO and the servers.\n- [`dolphinscheduler-spi`](dolphinscheduler-spi/CLAUDE.md) — Service-Provider Interface root (every plugin depends on this).\n- [`dolphinscheduler-extract`](dolphinscheduler-extract/CLAUDE.md) — RPC interface contracts between servers.\n- [`dolphinscheduler-eventbus`](dolphinscheduler-eventbus/CLAUDE.md) — in-process event-bus abstractions.\n- [`dolphinscheduler-registry`](dolphinscheduler-registry/CLAUDE.md) — pluggable registry (Zookeeper / Etcd / JDBC).\n- [`dolphinscheduler-meter`](dolphinscheduler-meter/CLAUDE.md) — metrics (Prometheus) + server load-protection primitives.\n\n### Plugin families\n\n- [`dolphinscheduler-task-plugin`](dolphinscheduler-task-plugin/CLAUDE.md) — task-type plugins (shell, SQL, Spark, Flink, K8s, EMR, …). 33 concrete plugins.\n- [`dolphinscheduler-datasource-plugin`](dolphinscheduler-datasource-plugin/CLAUDE.md) — user-facing datasource plugins (MySQL, Hive, Trino, Snowflake, …). 28 concrete plugins.\n- [`dolphinscheduler-storage-plugin`](dolphinscheduler-storage-plugin/CLAUDE.md) — resource storage (S3, HDFS, OSS, GCS, ABS, OBS, COS).\n- [`dolphinscheduler-scheduler-plugin`](dolphinscheduler-scheduler-plugin/CLAUDE.md) — cron scheduler (Quartz today).\n- [`dolphinscheduler-dao-plugin`](dolphinscheduler-dao-plugin/CLAUDE.md) — metadata-DB dialect support (MySQL / PostgreSQL / H2).\n\n### Build, ops, tools\n\n- [`dolphinscheduler-bom`](dolphinscheduler-bom/CLAUDE.md) — Maven BOM; central dependency version pinning.\n- [`dolphinscheduler-dist`](dolphinscheduler-dist/CLAUDE.md) — assembles the release tarball + Docker images.\n- [`dolphinscheduler-standalone-server`](dolphinscheduler-standalone-server/CLAUDE.md) — all-in-one JVM with H2 (dev / smoke tests).\n- [`dolphinscheduler-tools`](dolphinscheduler-tools/CLAUDE.md) — CLIs for schema upgrade + resource / lineage migration.\n- [`dolphinscheduler-microbench`](dolphinscheduler-microbench/CLAUDE.md) — JMH micro-benchmarks.\n- [`dolphinscheduler-yarn-aop`](dolphinscheduler-yarn-aop/CLAUDE.md) — AspectJ weaver capturing YARN ApplicationIds.\n\n### Frontend & E2E\n\n- [`dolphinscheduler-ui`](dolphinscheduler-ui/CLAUDE.md) — Vue 3 frontend.\n- [`dolphinscheduler-e2e`](dolphinscheduler-e2e/CLAUDE.md) — Selenium browser tests.\n\n---\n\n## Architecture overview (one paragraph)\n\nA **user** hits the UI, which calls the API server. The API server writes to the **metadata DB** and, for runtime operations (start / kill / pause workflow), talks to the **master** over RPC. The master consumes `t_ds_command` rows, runs the workflow state machine, and dispatches tasks to **workers**. Workers execute task plugins (shell, SQL, Spark, …) and stream lifecycle events back to master. Failures and SLA breaches flow to the **alert server**, which fans out through alert plugins. **Registry** (Zookeeper / Etcd / JDBC) provides service discovery, leader election, and distributed locks. **Storage plugins** back the resource center and distributed-task artifacts. **Quartz** (via scheduler plugin) fires scheduled workflows, which become new `Command` rows.\n\n## Where things live (quick lookup)\n\n| Looking for… | Start here |\n|--------------|------------|\n| A REST endpoint | `dolphinscheduler-api/src/main/java/.../api/controller/` |\n| Workflow execution logic | `dolphinscheduler-master/src/main/java/.../server/master/engine/` |\n| Task execution logic | `dolphinscheduler-worker` + the specific `task-plugin/<type>` |\n| How \"X\" is stored | `dolphinscheduler-dao/src/main/java/.../dao/entity/` |\n| SQL schema / upgrade | `dolphinscheduler-dao/src/main/resources/sql/` |\n| RPC contract between servers | `dolphinscheduler-extract/dolphinscheduler-extract-<role>` |\n| UI page source | `dolphinscheduler-ui/src/views/<feature>/` |\n| API call in the UI | `dolphinscheduler-ui/src/service/modules/<resource>.ts` |\n| Version of a dependency | `dolphinscheduler-bom/pom.xml` |\n\n## Project-wide conventions\n\n- **Formatting**: Run `./mvnw spotless:apply` before every commit/push. Spotless covers Java sources, `pom.xml`, and Markdown files (yes, including the docs); CI runs `./mvnw spotless:check` and will fail PRs that aren't formatted. Java imports are ordered; license headers are enforced.\n- **Commit style**: `[Type-ISSUE_ID][Scope] Subject`, e.g. `[Fix-18168][Worker] ...`. All types except `Chore` require an issue ID. See [commit-message.md](docs/docs/en/contribute/join/commit-message.md) for the full convention.\n- **Branching**: `dev` is the main integration branch (not `main`/`master`).\n- **PRs must link a GitHub issue** and keep their scope tight — one module / one concern.\n- **Do not break wire / DB compatibility** silently. Changes to `extract-*` RPC interfaces, `dao` entities, enum values, and `spi.DbType` ripple to deployed clusters mid-upgrade.\n- **Only one registry / storage / DB dialect is active at runtime**. Code paths that check \"which one\" belong inside the plugin SPI, not sprinkled through services.\n\n## External references\n\n- Release docs (version-specific): https://dolphinscheduler.apache.org/en-us/docs\n- GitHub issues: https://github.com/apache/dolphinscheduler/issues\n- Python SDK: https://dolphinscheduler.apache.org/python/\n- Contribution guide: [`docs/docs/en/contribute/join/contribute.md`](docs/docs/en/contribute/join/contribute.md)\n","isInternal":false,"tokens":2721,"sizeBytes":10505},{"name":"CLAUDE.md","path":"dolphinscheduler-alert/CLAUDE.md","rawUrl":"https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-alert/CLAUDE.md","title":"dolphinscheduler-alert - Claude Agent Guidelines & System Prompt","category":"claude-rule","format":"markdown","content":"# CLAUDE.md — dolphinscheduler-alert\n\nAlert / notification subsystem. Master and worker publish alert events (task failure, timeout, SLA breach, …); this subsystem evaluates them and dispatches via configured channel plugins (email, webhook, Feishu, DingTalk, PagerDuty, …).\n\n**This directory is a Maven parent POM.**\n\n## Sub-modules\n\n- **`dolphinscheduler-alert-server`** — the runnable alert server. `@SpringBootApplication` `AlertServer` + HA coordinator (`AlertHAServer`) + RPC server (`AlertRpcServer`) + event loop.\n- **`dolphinscheduler-alert-plugins`** — parent of the concrete channel plugins:\n  - `dolphinscheduler-alert-email`, `-http`, `-feishu`, `-dingtalk`, `-wechat`, `-webexteams`, `-pagerduty`, `-telegram`, `-slack`, `-script`, etc. (see directory listing for the current set). Each plugin implements the `AlertPlugin` SPI and is loaded dynamically at runtime.\n\n## How alerting works (end-to-end)\n\n1. Master/worker calls into `dolphinscheduler-extract-alert` RPC with an `AlertRequest`.\n2. `AlertRpcServer` receives it, persists/enqueues onto `AlertEventPendingQueue`.\n3. `AlertEventFetcher` pulls pending events in `AlertEventLoop`.\n4. `AlertSender` looks up the alert group's configured plugins, invokes each.\n5. Delivery result is recorded to the DB for audit.\n\n## Extension points\n\n- **`AlertPlugin` SPI** — new channel? Implement the interface in a new sub-module of `dolphinscheduler-alert-plugins` and it will be discovered by `AlertPluginManager`.\n- Alert rule logic is currently fixed (type-based); extending rules means editing `AlertEventLoop` / `AlertSender`.\n\n## Gotchas\n\n- **Alert server is separate from master/worker** by design. Running it as an embedded part of master is not supported — it has its own HA, its own port, its own `application.yaml`.\n- **`AlertEventPendingQueue` is DB-backed** (not just in-memory) so restarting the alert server does not lose queued alerts.\n- **HA pattern mirrors master/worker**: only the leader pulls from the queue; others stand by.\n- **Plugin config is per-alert-group**, stored in the DB. Adding a plugin implementation does not enable it for anyone until an admin creates an alert group referencing it.\n- **Channel-specific rate limits / retries** live *inside* each plugin, not in the server. Don't add a global retry loop in `AlertSender`.\n\n## Tests\n\n- `alert-server/src/test/java` — unit tests for config, RPC, event queue, sender.\n- Each plugin has its own `src/test/java` with mocked channel calls.\n\n## Related modules\n\n- `dolphinscheduler-extract-alert` — RPC contracts this server implements.\n- `dolphinscheduler-dao` — persists alert events + audit.\n- `dolphinscheduler-registry-all`, `dolphinscheduler-meter`, `dolphinscheduler-spi`.\n- Callers: `dolphinscheduler-master`, `dolphinscheduler-worker`.\n","isInternal":false,"tokens":665,"sizeBytes":2803},{"name":"CLAUDE.md","path":"dolphinscheduler-api-test/CLAUDE.md","rawUrl":"https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-api-test/CLAUDE.md","title":"dolphinscheduler-api-test - Claude Agent Guidelines & System Prompt","category":"claude-rule","format":"markdown","content":"# CLAUDE.md — dolphinscheduler-api-test\n\nIntegration test harness for the REST API. **Not** bundled into the release — this module exists to run curl-style black-box tests against a full DolphinScheduler stack booted via Docker Compose + Testcontainers.\n\n**This is a Maven parent POM.** This module is **not** declared in the root `pom.xml` `<modules>` — run it explicitly (e.g. `mvn -pl dolphinscheduler-api-test test -am`) or via CI workflows.\n\n## Sub-modules\n\n- **`dolphinscheduler-api-test-core`** — the reusable framework:\n  - `@DolphinScheduler` annotation (marks a test class, accepts `composeFiles`).\n  - `DolphinSchedulerExtension` — JUnit 5 extension that starts the Compose stack, injects `RequestClient` and page objects.\n  - `RequestClient` — thin HTTP client with session handling.\n  - Page-object base classes (`LoginPage`, `WorkflowDefinitionPage`, `ProjectPage`, `TenantPage`, `UserPage`, `WorkerGroupPage`).\n- **`dolphinscheduler-api-test-case`** — the actual test classes. `WorkflowDefinitionAPITest`, `TenantAPITest`, `SchedulerAPITest`, etc. Each class uses `@DolphinScheduler(composeFiles = { \"docker/basic/docker-compose.yaml\" })` to declare its environment.\n\n## Stack bootstrap\n\nCompose files live under `src/test/resources/docker/<scenario>/docker-compose.yaml`:\n\n- `basic/` — standard API + Postgres.\n- `tenant/` — scenario with multi-tenant configuration.\n- `oidc-login/` — API with Keycloak for OIDC flow (`realm-export.json` alongside).\n\nThe JUnit extension uses Testcontainers Compose to wait for port readiness before returning.\n\n## Running\n\n```\n# Full suite\nmvn -pl dolphinscheduler-api-test/dolphinscheduler-api-test-case test\n\n# Single class (Mac M1)\nmvn -pl dolphinscheduler-api-test/dolphinscheduler-api-test-case test \\\n    -Dtest=WorkflowDefinitionAPITest -Dm1_chip=true\n```\n\nFlags:\n\n- `-Dm1_chip=true` — forces `arm64/v8` platform for Docker on Apple Silicon.\n- `-Dlocal=true` — skips Testcontainers and points at a locally-running DolphinScheduler instead.\n\n## Gotchas\n\n- **Java 11 required** to compile this module (rest of the repo targets 1.8).\n- **`@Order` is mandatory** on test methods within a class — tests are state-dependent and must run in declared order.\n- **`@DisableIfTestFails` (from junit-pioneer)** cascades a failure to dependent tests in the same class; don't silently disable without understanding the chain.\n- **`sessionId` is threaded through page objects**: `LoginPage.login(...)` returns a session ID that subsequent page objects must receive. Don't instantiate page objects without first logging in.\n- **This module is excluded from the root reactor build** — CI drives it via a dedicated workflow. Check `.github/workflows/` before assuming a PR runs these.\n\n## Related modules\n\n- `dolphinscheduler-api` — the system under test.\n- `dolphinscheduler-dao` — depended on to reuse entity DTOs.\n- `dolphinscheduler-e2e` — complementary browser-level tests (selenium against UI).\n","isInternal":false,"tokens":715,"sizeBytes":2974},{"name":"CLAUDE.md","path":"dolphinscheduler-api/CLAUDE.md","rawUrl":"https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-api/CLAUDE.md","title":"dolphinscheduler-api - Claude Agent Guidelines & System Prompt","category":"claude-rule","format":"markdown","content":"# CLAUDE.md — dolphinscheduler-api\n\nREST API server. Entry point for the UI and external clients (curl, Python SDK). Uses Spring Boot with **Jetty** (not Tomcat) and springdoc-openapi for Swagger UI.\n\n## Main package\n\n`org.apache.dolphinscheduler.api`\n\n## Entry point\n\n`ApiApplicationServer` — `@SpringBootApplication`. On startup it:\n1. Loads `DataSourcePluginManager` and `TaskPluginManager` (plugin discovery).\n2. Binds to the port in `server.port` (default 12345).\n3. Starts the Py4J gateway used by the Python SDK.\n\n## Key sub-packages\n\n- `api.controller` — 30+ `@RestController` classes, one per domain (workflows, tasks, users, projects, tenants, resources, data sources, alerts, monitoring, …). All URLs rooted at `/dolphinscheduler/*`.\n- `api.service` / `api.service.impl` — business-logic layer wrapping `dolphinscheduler-service` and adding API-level concerns (auth checks, DTO mapping).\n- `api.security` — pluggable authenticators: `PASSWORD` (default), `LDAP`, `OIDC`, `CASDOOR`, `SSO`. Selected by `security.authentication.type`.\n- `api.interceptor` — `LoginHandlerInterceptor` (session cookie check), `RateLimitInterceptor`, `LocaleChangeInterceptor`.\n- `api.configuration` — Spring config beans: Swagger, OAuth2, task-type catalog.\n- `api.dto` — request/response DTOs.\n- `api.exceptions` — `ApiExceptionHandler` (`@RestControllerAdvice`) maps exceptions → structured JSON responses.\n\n## Extension points\n\n- `Authenticator` — implement a new one to support additional login backends (added cases go into `AuthenticationType` enum + registered in `SecurityConfig`).\n- Controllers auto-pick up new task types via `TaskTypeConfiguration` reading `task-type-config.yaml` / `dynamic-task-type-config.yaml`.\n\n## Configuration\n\n`src/main/resources`:\n\n- `application.yaml` — server port, datasource, registry, security mode, CORS, OpenAPI.\n- `task-type-config.yaml`, `dynamic-task-type-config.yaml` — the catalog of task types exposed to the UI.\n- `i18n/messages_*.properties` — English + Simplified Chinese server-side messages.\n- `swagger.properties` — springdoc config (UI lives at `/dolphinscheduler/swagger-ui/index.html`).\n- `logback-spring.xml` — logging.\n\n## Gotchas\n\n- **Jetty, not Tomcat**. `spring-boot-starter-tomcat` is excluded transitively via `dolphinscheduler-meter`. Avoid accidentally pulling Tomcat in.\n- **Session-based auth**: `LoginHandlerInterceptor` reads the `sessionId` cookie. There is no JWT by default. OIDC/CASDOOR paths still set a session.\n- **OIDC requires `casdoor-spring-boot-starter`**; `OAuth2Configuration` is `@ConditionalOnProperty(security.authentication.type = OIDC|CASDOOR)`.\n- **Python SDK integration** uses Py4J gateway, not REST. If a Python SDK change misbehaves, check `api-server` logs for Py4J init messages.\n- **Controllers mix `@PostMapping` with form params and JSON bodies inconsistently** — this is legacy. Follow whatever shape the adjacent endpoint uses rather than converting to JSON across the board.\n- **Swagger annotations are required** on new endpoints (`@Operation`, `@Parameter`). Missing ones break auto-generated docs the UI team consumes.\n\n## Tests\n\nUnit tests live in `src/test/java`. **Integration tests live in `dolphinscheduler-api-test`** (separate module, Docker Compose + Testcontainers).\n\n### Running unit tests from the command line\n\nThe CI flow (`.github/workflows/unit-test.yml`) runs in two phases. Mirror it locally:\n\n**One-time setup** — install BOM + upstream deps to local m2:\n\n```bash\nexport MAVEN_OPTS=\"-Xmx4g -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=1024m\"\n./mvnw install -B \\\n  -pl \"dolphinscheduler-bom,dolphinscheduler-api\" \\\n  -am -DskipTests=true -Dspotless.skip=true -DskipUT=true \\\n  -Djacoco.skip=true -Danalyze.skip=true\n```\n\n**Run tests** — use `verify` (NOT `test`), no `-am`, no `clean`:\n\n```bash\n./mvnw verify -B -pl \"dolphinscheduler-api\" \\\n  -Dmaven.test.skip=false -Dspotless.skip=true -DskipUT=false -Danalyze.skip=true \\\n  -Dsurefire.printSummary=true -Dsurefire.useFile=false \\\n  -Dsurefire.reportFormat=plain -Dsurefire.redirectTestOutputToFile=false \\\n  -Dsurefire.failIfNoSpecifiedTests=false \\\n  -Dtest='EnvironmentServiceTest#testVerifyEnvironment'\n```\n\nDrop the `-Dtest=...` filter to run the whole module.\n\n### Why the unusual flags\n\n- **`verify` not `test`** — root pom uses `jacoco-maven-plugin` in offline-instrument + restore-instrumented-classes mode. Only the `verify` lifecycle runs the `restore` goal, so `test` alone leaves `target/classes` instrumented and the next build fails with \"Cannot process instrumented class\".\n- **`dolphinscheduler-bom` must be in the install `-pl`** — without it, the installed pom lacks effective dependencyManagement and downstream compile/test classpaths drop transitive deps like `commons-collections4` and `oshi-core`.\n- **`-DskipTests=true` (not `-Dmaven.test.skip=true`) during install** — `maven.test.skip` skips test-source attach which breaks downstream modules that depend on the test-jar.\n- **No `-am` on the test run** — `-am` re-instruments upstream modules with jacoco and triggers the same \"Cannot process instrumented class\" failure.\n- **No `clean` between `install` and `verify`** — clean wipes `target/classes` and the next compile re-resolves transitive deps from the (still installed) pom; some resolutions fail with `[WARNING] The POM for ... is invalid` and the build can't see `commons-collections4` etc.\n\n### If things go sideways\n\n- `Cannot process instrumented class` — re-run with `-Djacoco.skip=true`, or wipe `target/` for the affected module and re-run.\n- `NoClassDefFoundError: oshi/SystemInfo` or `commons-collections4/CollectionUtils` at test runtime — the bom didn't get installed; redo the setup step including `dolphinscheduler-bom` in `-pl`.\n- `class file contains wrong class` — local `~/.m2/.../dolphinscheduler-*-dev-SNAPSHOT.jar` is stale/corrupt. Delete the offending `dev-SNAPSHOT` directory under `~/.m2/repository/org/apache/dolphinscheduler/` and re-run install.\n\nSurefire XML reports land at `target/surefire-reports/TEST-<class>.xml` for the per-test counts.\n\n## Related modules\n\n- `dolphinscheduler-service`, `dolphinscheduler-dao` — primary deps.\n- `dolphinscheduler-extract-master` / `-worker` / `-alert` — RPC into servers.\n- `dolphinscheduler-authentication` (actuator sub-module) — secures `/actuator/**`.\n- `dolphinscheduler-ui` — primary consumer.\n- `dolphinscheduler-api-test` — integration harness.\n","isInternal":false,"tokens":1628,"sizeBytes":6487},{"name":"CLAUDE.md","path":"dolphinscheduler-authentication/CLAUDE.md","rawUrl":"https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-authentication/CLAUDE.md","title":"dolphinscheduler-authentication - Claude Agent Guidelines & System Prompt","category":"claude-rule","format":"markdown","content":"# CLAUDE.md — dolphinscheduler-authentication\n\nParent POM grouping two unrelated authentication helpers. They share no code — they're bundled here because both are about injecting security behavior into the server stack.\n\n**This directory is a Maven parent POM.**\n\n## Sub-modules\n\n- **`dolphinscheduler-actuator-authentication`** — Secures Spring Boot Actuator endpoints (`/actuator/**` and `/dolphinscheduler/actuator/**`) with HTTP Basic auth. Ships `ActuatorAuthenticationAutoConfiguration` + `ActuatorSecurityProperties` (`management.security.*` properties). Enabled when `management.security.enabled=true`. Excludable endpoints (health/info) via config list.\n- **`dolphinscheduler-aws-authentication`** — AWS credential provider abstraction used by AWS-based datasource/task plugins (EMR, S3, SageMaker, DMS, DataSync, etc.). Exposes `AWSCredentialsProviderFactor` with two strategies: `STATIC` (access key + secret) and `INSTANCE_PROFILE` (EC2/EKS IAM role).\n\n## Gotchas\n\n- **These two sub-modules are unrelated.** Don't treat \"authentication\" as a coherent module — the actuator one is about operator access; the AWS one is about cloud-task credentials. They don't share any class.\n- **API login auth is NOT here**. Session/password/LDAP/OIDC/CASDOOR login for the main API lives in `dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/security/`. If a user says \"auth\", check which one they mean first.\n- Actuator: the sample config uses `{noop}` password encoder. This is **development-only**; production must switch to `{bcrypt}` or an external IdP.\n- AWS: `STATIC` credentials sit in plaintext config. Always prefer `INSTANCE_PROFILE` on real infrastructure. When reading code that takes an `AwsConfig` map, expect either style.\n\n## Tests\n\nMinimal — auto-config wiring only. End-to-end auth is covered by `dolphinscheduler-api-test`.\n\n## Related modules\n\n- `dolphinscheduler-meter` — exposes the actuator endpoints that `-actuator-authentication` secures.\n- `dolphinscheduler-task-plugin` / `-datasource-plugin` AWS members — consume `-aws-authentication`.\n- `dolphinscheduler-api` — for the real user-login code path (separate from this module).\n","isInternal":false,"tokens":504,"sizeBytes":2191},{"name":"CLAUDE.md","path":"dolphinscheduler-bom/CLAUDE.md","rawUrl":"https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-bom/CLAUDE.md","title":"dolphinscheduler-bom - Claude Agent Guidelines & System Prompt","category":"claude-rule","format":"markdown","content":"# CLAUDE.md — dolphinscheduler-bom\n\nMaven **Bill of Materials**. Pins versions for every third-party library the project uses, so individual modules can `<dependency>` without specifying a version.\n\n## What goes here, what does NOT\n\n**Goes here**:\n- `<dependencyManagement>` entries for any lib used in more than one module.\n- `<properties>` pinning version numbers with consistent naming (`<netty.version>`, `<hadoop.version>`, …).\n- Profile-controlled version switches (e.g. `zk-3.8` vs `zk-3.4`).\n\n**Does NOT go here**:\n- Plugin versions (those live in the root `pom.xml`).\n- Dependencies specific to one plugin (e.g. Spark client version → stays in `task-spark/pom.xml`).\n- Anything the module defines for itself.\n\n## Key version properties (rough guide)\n\n- Spring Boot: 2.7.x (pinned by root pom, referenced here).\n- MyBatis Plus: 3.5.2.\n- gRPC: 1.41.0.\n- Netty: 4.1.53.\n- Hadoop: 3.2.4 (client side).\n- AspectJ: 1.9.7.\n- JDBC drivers: MySQL, PostgreSQL, Oracle, SQL Server, Snowflake, Databend, …\n\nWhen in doubt, **grep here first** for a dependency's current version before searching individual `pom.xml` files.\n\n## Profiles\n\n- `zk-3.8` (default) vs `zk-3.4` — switches Zookeeper + Curator versions. Active at build time via `-Pzk-3.4` if a legacy ZK cluster is targeted.\n\n## Gotchas\n\n- **`htrace-core` is explicitly excluded** from the Hadoop transitive graph as a CVE mitigation. Keep the exclusion even if someone reports the dep is \"missing\".\n- **Duplicate property bug**: `zeppelin-client.version` was historically defined twice (lines ~120 and ~123 of an older revision). If you see a similar duplication when editing, consolidate — the last one wins silently.\n- **No Java code** — `packaging: pom`. Don't add a `src/` directory.\n- **Version bumps here ripple to every module**; bump deliberately and prefer one-dep-at-a-time commits for bisect-ability.\n\n## Related modules\n\nEvery module that needs a pinned version imports this BOM in its own `<dependencyManagement>`.\n","isInternal":false,"tokens":524,"sizeBytes":1997},{"name":"CLAUDE.md","path":"dolphinscheduler-common/CLAUDE.md","rawUrl":"https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-common/CLAUDE.md","title":"dolphinscheduler-common - Claude Agent Guidelines & System Prompt","category":"claude-rule","format":"markdown","content":"# CLAUDE.md — dolphinscheduler-common\n\nFoundation utility library. Every other backend module in the repo transitively depends on this one, so treat it as the lowest layer: no internal dependencies, minimal behavior, stable API.\n\n## What lives here\n\n- Shared utilities: string / date / file / map / JSON helpers, SSL, encryption, thread helpers.\n- Global enums and constants (workflow status, task types, flag values, date formats).\n- Shell command execution primitives (`ShellExecutor`, `AbstractShell`).\n- Property delegation layer (`IPropertyDelegate`, `ImmutablePropertyDelegate`) used to read YAML/properties uniformly.\n- Generic DAG data structure (`common.graph.DAG`) — used by master to traverse workflow graphs.\n- Lifecycle interface (`IStoppable`) — implemented by every long-lived server (Master, Worker, Alert, API).\n\n## Main package\n\n`org.apache.dolphinscheduler.common`\n\n## Key sub-packages\n\n- `common.utils` — stateless helpers; the most-touched package in the module.\n- `common.constants` — `Constants`, `TenantConstants`, `DateConstants`.\n- `common.enums` — `WorkflowExecutionStatus`, `TaskExecutionStatus`, `Flag`, etc. Changes here ripple across every module — be careful when renaming.\n- `common.config` — property-source abstractions consumed by Spring `@ConfigurationProperties` classes elsewhere.\n- `common.shell` — blocking shell executor, used by task plugins.\n- `common.graph` — generic DAG; not workflow-specific despite the usage.\n- `common.lifecycle` — `IStoppable` only.\n\n## Extension points\n\nNone. This module exposes no SPI; it is a leaf utility library.\n\n## Configuration\n\n`src/main/resources`:\n\n- `common.properties` — logging + cloud-storage credentials read by services.\n- `remote-logging.yaml` — config for remote log fetch.\n- `resource-center.yaml` — resource-center defaults.\n\n## Gotchas\n\n- Cloud-storage SDKs (Aliyun OSS, Huawei OBS, Tencent COS, Azure Blob) are declared with `<optional>true</optional>` / broad exclusions. Do **not** rely on them being on the classpath from here — the concrete storage plugins in `dolphinscheduler-storage-plugin` bring them in.\n- Enum renames are breaking: workflow/task status enums are serialized into the database via MyBatis type handlers in `dolphinscheduler-dao`. Always grep for the enum value before renaming.\n- `IStoppable` is the canonical shutdown contract across every server; do not invent a new lifecycle interface.\n\n## Tests\n\nStandard `src/test/java`. No special infra.\n\n## Related modules\n\n- `dolphinscheduler-spi` — uses `common` as `provided`; keep new SPI-facing types minimal here.\n- Every `server-*` / `dao` / `service` / `plugin` module depends on this.\n","isInternal":false,"tokens":589,"sizeBytes":2685},{"name":"CLAUDE.md","path":"dolphinscheduler-dao-plugin/CLAUDE.md","rawUrl":"https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-dao-plugin/CLAUDE.md","title":"dolphinscheduler-dao-plugin - Claude Agent Guidelines & System Prompt","category":"claude-rule","format":"markdown","content":"# CLAUDE.md — dolphinscheduler-dao-plugin\n\nPlugin family for **database dialects** supporting the core DolphinScheduler metadata DB. Handles dialect-specific SQL generation, MyBatis-Plus `DbType` selection, and schema monitoring.\n\n**This directory is a Maven parent POM.** Not to be confused with `dolphinscheduler-datasource-plugin`, which is about *user-configured* external datasources — this module is about the *internal* metadata DB.\n\n## Sub-modules\n\n- **`dolphinscheduler-dao-api`** — SPI: `DaoPluginConfiguration`, `DatabaseDialect`, `DatabaseMonitor`, `DatabaseEnvironmentCondition`.\n- **`dolphinscheduler-dao-plugin-all`** — uber bundle depended on by `dolphinscheduler-dao`.\n- Concrete dialects:\n  - `dolphinscheduler-dao-mysql` — MySQL 5.7+ (production).\n  - `dolphinscheduler-dao-postgresql` — PostgreSQL 9.6+ (production).\n  - `dolphinscheduler-dao-h2` — H2 (dev / tests / standalone server).\n\n## How the right dialect is picked\n\nEach sub-module registers a `@AutoConfiguration` class (Spring Boot 2.7 style) that is `@Conditional(DatabaseEnvironmentCondition.class)`. `DatabaseEnvironmentCondition` looks at `spring.datasource.driver-class-name` and matches it to the dialect.\n\nSwitching the DB type therefore only requires changing the driver + URL in `application.yaml` — no pom changes.\n\n## Gotchas\n\n- **This is not a user-facing SPI**. There are exactly three supported internal DBs; adding a fourth (e.g. MariaDB, OceanBase for the metadata DB) requires coordinated changes in `dolphinscheduler-dao` SQL scripts and `dolphinscheduler-tools` upgraders.\n- **MyBatis-Plus `DbType` (`com.baomidou.mybatisplus.annotation.DbType`) is NOT the same enum as `dolphinscheduler-spi`'s `DbType`**. Internal DB uses the MyBatis-Plus one; external datasources use the spi one. When editing code here, make sure you're importing the right one.\n- **Dialect-specific SQL**: pagination (MySQL `LIMIT` vs PostgreSQL `OFFSET … LIMIT`), upsert behavior, JSON column handling. The `DatabaseDialect` interface is the authoritative place to vary SQL between backends — don't add `if (dbType == X)` branches in mappers.\n- **H2 is only for dev/test**. Production deployments should not run on H2. The standalone server is the only shipping configuration that uses it.\n\n## Tests\n\nEach dialect sub-module has its own `src/test/java` exercising the dialect behavior, typically against an embedded driver or Testcontainers.\n\n## Related modules\n\n- `dolphinscheduler-dao` — primary consumer (depends on `dao-plugin-all`).\n- `dolphinscheduler-tools` — DB schema upgrader; knows about the same three dialects.\n- `dolphinscheduler-standalone-server` — uses `-dao-h2` by default.\n","isInternal":false,"tokens":649,"sizeBytes":2690},{"name":"CLAUDE.md","path":"dolphinscheduler-dao/CLAUDE.md","rawUrl":"https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-dao/CLAUDE.md","title":"dolphinscheduler-dao - Claude Agent Guidelines & System Prompt","category":"claude-rule","format":"markdown","content":"# CLAUDE.md — dolphinscheduler-dao\n\nMyBatis-based data-access layer. Holds every entity, mapper, repository, and the SQL migration scripts shipped with a release.\n\n## Main package\n\n`org.apache.dolphinscheduler.dao`\n\n## Key sub-packages\n\n- `dao.entity` — persistence POJOs (`Command`, `WorkflowInstance`, `TaskInstance`, `User`, `Project`, `Tenant`, `DataSource`, `Cluster`, etc.). These map 1:1 to DB tables.\n- `dao.mapper` — MyBatis `@Mapper` interfaces. One per table/entity (`CommandMapper`, `WorkflowInstanceMapper`, `TaskInstanceMapper`, …).\n- `dao.repository` — higher-level repository abstractions wrapping mappers; what `service`/`master` layers should call, **not** the mappers directly.\n- `dao.model` — DAO-specific DTOs (query projections, aggregates).\n- `dao.utils` — SQL helpers.\n\n## SQL schema\n\n`src/main/resources/sql/`:\n\n- `dolphinscheduler_mysql.sql`, `dolphinscheduler_postgresql.sql`, `dolphinscheduler_h2.sql` — fresh install.\n- `upgrade/<version>/` — version-to-version migration DDL. Pairs with the upgraders in `dolphinscheduler-tools`.\n\n## Gotchas\n\n- **Mappers are not enough**: new code should go through `dao.repository`. Calling mappers directly from `master`/`service` is legacy and should not spread.\n- **Three DB dialects supported** (MySQL, PostgreSQL, H2). Any mapper XML must be dialect-neutral or rely on the dialect abstraction in `dolphinscheduler-dao-plugin`. Grep for `<if test=\"databaseType == ...\">` when in doubt — avoid adding more of those.\n- **Entity field renames are breaking**: MyBatis maps DB columns to field names via `@TableField` / naming conventions. Rename the column OR the field — never only one.\n- **Schema file excluded from jar**: `*.sql` is excluded from the built jar to keep it small; `dolphinscheduler-tools` repackages the SQL separately for the upgrade CLI.\n- `HikariCP` is the pool. Don't switch to Druid — datasource-plugin uses Druid internally for its own plugin connections, but the core DolphinScheduler metadata DB uses HikariCP.\n\n## Tests\n\n`src/test/java` — a mix of unit and Testcontainers-based integration tests. The database-dialect-specific paths are also exercised by `dolphinscheduler-dao-plugin/*/src/test`.\n\n## Related modules\n\n- `dolphinscheduler-dao-plugin` — dialect implementations; depended on here as `dolphinscheduler-dao-plugin-all`.\n- `dolphinscheduler-common` — utilities.\n- `dolphinscheduler-task-api` — task-related entities cross-reference it.\n- `dolphinscheduler-tools` — reads the SQL files here to run schema upgrades.\n","isInternal":false,"tokens":614,"sizeBytes":2551},{"name":"CLAUDE.md","path":"dolphinscheduler-datasource-plugin/CLAUDE.md","rawUrl":"https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-datasource-plugin/CLAUDE.md","title":"dolphinscheduler-datasource-plugin - Claude Agent Guidelines & System Prompt","category":"claude-rule","format":"markdown","content":"# CLAUDE.md — dolphinscheduler-datasource-plugin\n\nPlugin family for **datasources** — the configurable DB/warehouse/query-engine connections a user can register (MySQL, PostgreSQL, Hive, Trino, Redshift, Snowflake, …). Used by the SQL-style task plugins, the API for connection testing, and the data-lineage tool.\n\n**This directory is a Maven parent POM.**\n\n## Sub-modules\n\n### Framework\n\n- **`dolphinscheduler-datasource-api`** — SPI and base types: `DataSourceProcessor`, `AbstractDataSourceProcessor`, `BaseDataSourceParamDTO`, `BaseHdfsConnectionParam`, and the `DataSourcePluginManager` that loads plugins.\n- **`dolphinscheduler-datasource-all`** — uber module bundling every plugin; depended on by `master`, `worker`, `api` so they can use any datasource at runtime.\n\n### Concrete plugins (28 sub-modules)\n\nRelational: `-mysql`, `-postgresql`, `-oracle`, `-sqlserver`, `-db2`, `-oceanbase`, `-dameng`, `-hana`, `-azure-sql`, `-vertica`.\n\nOLAP / warehouses: `-clickhouse`, `-doris`, `-starrocks`, `-redshift`, `-snowflake`, `-databend`, `-dolphindb`.\n\nBig-data engines: `-hive`, `-spark`, `-presto`, `-trino`, `-kyuubi`, `-athena`.\n\nCloud / other: `-sagemaker`, `-k8s`, `-aliyunserverlessspark`, `-ssh`, `-zeppelin`.\n\n## SPI contract\n\nTwo interfaces are **both** implemented by each plugin:\n\n1. `DataSourceChannelFactory` (from `dolphinscheduler-spi`, loaded via `PrioritySPIFactory`) — creates `DataSourceChannel`s for low-level connection handling.\n2. `DataSourceProcessor` (from `datasource-api`, loaded via standard `ServiceLoader`) — validates + builds connection params, handles the UI-form contract.\n\nBoth are wired into plugins with `@AutoService(...)`. Discovery happens in `DataSourcePluginManager`.\n\n## How it plugs into the rest of the system\n\n- **API**: when the user opens the \"Create Datasource\" dialog, the API asks each `DataSourceProcessor` for its param descriptor and serves it to the UI.\n- **Worker**: SQL-family task plugins (`task-sql`, `task-procedure`, `task-datax`, …) look up the configured datasource by id, ask `datasource-api` for a JDBC connection via the channel, run the statement.\n\n## Gotchas\n\n- **Dual SPI loading is intentional**: channels are priority-ordered (multiple providers can coexist); processors are keyed by `DbType` (one per type). Don't merge them.\n- **`DbType` enum lives in `dolphinscheduler-spi`**. Adding a new datasource means: new enum value in spi + new plugin sub-module. Leaving the enum unchanged will cause `DataSourcePluginManager` to silently ignore the plugin.\n- **Passwords are encrypted** via `PasswordUtils` in `common`. Never store or log the plaintext form; always go through `PasswordUtils.encodePassword` / `decodePassword`.\n- **JDBC connection pooling** is **Druid** (not HikariCP). This is different from the metadata DB (`dolphinscheduler-dao` uses HikariCP). Be careful with which you're tuning.\n- **Hive / Spark / Presto plugins pull massive dep trees** — exclusions in their poms are load-bearing. Adding a new version bump here can blow up the classpath.\n\n## Tests\n\nEach plugin has `src/test/java`. Most use an embedded H2 or a mocked driver; a few use Testcontainers (e.g. `-postgresql`, `-mysql`).\n\n## Related modules\n\n- `dolphinscheduler-spi` — base SPI (`DataSourceChannelFactory`, `DbType`).\n- `dolphinscheduler-task-plugin` — primary consumer (SQL family plugins).\n- `dolphinscheduler-api`, `dolphinscheduler-service` — consumers for configuration + validation.\n- `dolphinscheduler-common` — `PasswordUtils`.\n","isInternal":false,"tokens":860,"sizeBytes":3523},{"name":"CLAUDE.md","path":"dolphinscheduler-dist/CLAUDE.md","rawUrl":"https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-dist/CLAUDE.md","title":"dolphinscheduler-dist - Claude Agent Guidelines & System Prompt","category":"claude-rule","format":"markdown","content":"# CLAUDE.md — dolphinscheduler-dist\n\nThe **release assembler**. Produces the binary tarball (`apache-dolphinscheduler-<version>-bin.tar.gz`) and the source tarball, optionally a Docker image. Has no Java code — it is a Maven assembly + shell-script orchestration module.\n\n## Artifacts produced\n\n- `apache-dolphinscheduler-${version}-bin.tar.gz` — standalone-server + master + worker + api + alert + UI + tools + plugin jars + scripts + configs.\n- `apache-dolphinscheduler-${version}-src.tar.gz` — ASF-compliant source tarball.\n- Docker images — when built with `-P docker`.\n\n## Assembly descriptors\n\n`src/main/assembly/`:\n\n- `dolphinscheduler-bin.xml` — file layout of the binary tarball.\n- `dolphinscheduler-src.xml` — file layout of the source tarball.\n\n## Scripts\n\n`src/main/scripts/` (approx):\n\n- `assembly-plugins.sh` — copies plugin jars into the right `lib/plugin/` subdirectories.\n- `docker-build.sh` — builds Docker images (invoked when `-P docker` and Docker CLI available).\n\n## Build\n\n```\n# Binary tarball (from repo root)\n./mvnw -pl dolphinscheduler-dist -am clean package\n\n# With Docker images\n./mvnw -pl dolphinscheduler-dist -am -P docker clean package\n```\n\nOutput lands in `dolphinscheduler-dist/target/`.\n\n## Gotchas\n\n- **`-P docker` requires a working Docker CLI + BuildKit**. CI sets `DOCKER_BUILDKIT=1` explicitly.\n- **`-am` is almost always needed** (`also make`) — this module reaches into every server, plugin, UI, and tool, so their sibling modules must be built first.\n- **The binary tarball layout is operator-facing**. Operators depend on `bin/`, `conf/`, `lib/`, `libs/plugin/` existing at known paths. Don't reorganize without announcing it.\n- **UI is built inside `dolphinscheduler-ui`** (Node / pnpm) during `./mvnw package`; this module picks up the `dist/` folder. A broken UI build breaks the dist build.\n- **Plugin jars are sorted into `libs/plugin/<family>/` by `assembly-plugins.sh`** — new plugin families need to be added to this script.\n- Source tarball rules are **ASF-compliant**: excludes binaries, `.git*`, etc. Don't introduce large binaries into the repo.\n\n## Tests\n\nNone. Verification is end-to-end via `dolphinscheduler-e2e` which runs against a built tarball.\n\n## Related modules\n\n- Dependencies at package-time: `dolphinscheduler-standalone-server`, `-api`, `-alert-server`, `-ui`, `-tools`.\n- Plugin families are picked up transitively via the `-all` uber modules (`task-all`, `datasource-all`, `storage-all`, `alert-all`, `scheduler-all`, `registry-all`, `dao-plugin-all`).\n","isInternal":false,"tokens":638,"sizeBytes":2548},{"name":"CLAUDE.md","path":"dolphinscheduler-e2e/CLAUDE.md","rawUrl":"https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-e2e/CLAUDE.md","title":"dolphinscheduler-e2e - Claude Agent Guidelines & System Prompt","category":"claude-rule","format":"markdown","content":"# dolphinscheduler-e2e - Claude Agent Guidelines & System Prompt\n\nPath: `dolphinscheduler-e2e/CLAUDE.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-e2e/CLAUDE.md)","tokens":300,"sizeBytes":229},{"name":"CLAUDE.md","path":"dolphinscheduler-eventbus/CLAUDE.md","rawUrl":"https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-eventbus/CLAUDE.md","title":"dolphinscheduler-eventbus - Claude Agent Guidelines & System Prompt","category":"claude-rule","format":"markdown","content":"# dolphinscheduler-eventbus - Claude Agent Guidelines & System Prompt\n\nPath: `dolphinscheduler-eventbus/CLAUDE.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-eventbus/CLAUDE.md)","tokens":300,"sizeBytes":244},{"name":"CLAUDE.md","path":"dolphinscheduler-extract/CLAUDE.md","rawUrl":"https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-extract/CLAUDE.md","title":"dolphinscheduler-extract - Claude Agent Guidelines & System Prompt","category":"claude-rule","format":"markdown","content":"# dolphinscheduler-extract - Claude Agent Guidelines & System Prompt\n\nPath: `dolphinscheduler-extract/CLAUDE.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-extract/CLAUDE.md)","tokens":300,"sizeBytes":241},{"name":"CLAUDE.md","path":"dolphinscheduler-master/CLAUDE.md","rawUrl":"https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-master/CLAUDE.md","title":"dolphinscheduler-master - Claude Agent Guidelines & System Prompt","category":"claude-rule","format":"markdown","content":"# dolphinscheduler-master - Claude Agent Guidelines & System Prompt\n\nPath: `dolphinscheduler-master/CLAUDE.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-master/CLAUDE.md)","tokens":300,"sizeBytes":238},{"name":"CLAUDE.md","path":"dolphinscheduler-meter/CLAUDE.md","rawUrl":"https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-meter/CLAUDE.md","title":"dolphinscheduler-meter - Claude Agent Guidelines & System Prompt","category":"claude-rule","format":"markdown","content":"# dolphinscheduler-meter - Claude Agent Guidelines & System Prompt\n\nPath: `dolphinscheduler-meter/CLAUDE.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-meter/CLAUDE.md)","tokens":300,"sizeBytes":235},{"name":"CLAUDE.md","path":"dolphinscheduler-microbench/CLAUDE.md","rawUrl":"https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-microbench/CLAUDE.md","title":"dolphinscheduler-microbench - Claude Agent Guidelines & System Prompt","category":"claude-rule","format":"markdown","content":"# dolphinscheduler-microbench - Claude Agent Guidelines & System Prompt\n\nPath: `dolphinscheduler-microbench/CLAUDE.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-microbench/CLAUDE.md)","tokens":300,"sizeBytes":250},{"name":"CLAUDE.md","path":"dolphinscheduler-registry/CLAUDE.md","rawUrl":"https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-registry/CLAUDE.md","title":"dolphinscheduler-registry - Claude Agent Guidelines & System Prompt","category":"claude-rule","format":"markdown","content":"# dolphinscheduler-registry - Claude Agent Guidelines & System Prompt\n\nPath: `dolphinscheduler-registry/CLAUDE.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-registry/CLAUDE.md)","tokens":300,"sizeBytes":244},{"name":"CLAUDE.md","path":"dolphinscheduler-scheduler-plugin/CLAUDE.md","rawUrl":"https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-scheduler-plugin/CLAUDE.md","title":"dolphinscheduler-scheduler-plugin - Claude Agent Guidelines & System Prompt","category":"claude-rule","format":"markdown","content":"# dolphinscheduler-scheduler-plugin - Claude Agent Guidelines & System Prompt\n\nPath: `dolphinscheduler-scheduler-plugin/CLAUDE.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-scheduler-plugin/CLAUDE.md)","tokens":300,"sizeBytes":268},{"name":"CLAUDE.md","path":"dolphinscheduler-service/CLAUDE.md","rawUrl":"https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-service/CLAUDE.md","title":"dolphinscheduler-service - Claude Agent Guidelines & System Prompt","category":"claude-rule","format":"markdown","content":"# dolphinscheduler-service - Claude Agent Guidelines & System Prompt\n\nPath: `dolphinscheduler-service/CLAUDE.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-service/CLAUDE.md)","tokens":300,"sizeBytes":241},{"name":"CLAUDE.md","path":"dolphinscheduler-spi/CLAUDE.md","rawUrl":"https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-spi/CLAUDE.md","title":"dolphinscheduler-spi - Claude Agent Guidelines & System Prompt","category":"claude-rule","format":"markdown","content":"# dolphinscheduler-spi - Claude Agent Guidelines & System Prompt\n\nPath: `dolphinscheduler-spi/CLAUDE.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-spi/CLAUDE.md)","tokens":300,"sizeBytes":229},{"name":"CLAUDE.md","path":"dolphinscheduler-standalone-server/CLAUDE.md","rawUrl":"https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-standalone-server/CLAUDE.md","title":"dolphinscheduler-standalone-server - Claude Agent Guidelines & System Prompt","category":"claude-rule","format":"markdown","content":"# dolphinscheduler-standalone-server - Claude Agent Guidelines & System Prompt\n\nPath: `dolphinscheduler-standalone-server/CLAUDE.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-standalone-server/CLAUDE.md)","tokens":300,"sizeBytes":271},{"name":"CLAUDE.md","path":"dolphinscheduler-storage-plugin/CLAUDE.md","rawUrl":"https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-storage-plugin/CLAUDE.md","title":"dolphinscheduler-storage-plugin - Claude Agent Guidelines & System Prompt","category":"claude-rule","format":"markdown","content":"# dolphinscheduler-storage-plugin - Claude Agent Guidelines & System Prompt\n\nPath: `dolphinscheduler-storage-plugin/CLAUDE.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-storage-plugin/CLAUDE.md)","tokens":300,"sizeBytes":262},{"name":"CLAUDE.md","path":"dolphinscheduler-task-executor/CLAUDE.md","rawUrl":"https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-task-executor/CLAUDE.md","title":"dolphinscheduler-task-executor - Claude Agent Guidelines & System Prompt","category":"claude-rule","format":"markdown","content":"# dolphinscheduler-task-executor - Claude Agent Guidelines & System Prompt\n\nPath: `dolphinscheduler-task-executor/CLAUDE.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-task-executor/CLAUDE.md)","tokens":300,"sizeBytes":259},{"name":"CLAUDE.md","path":"dolphinscheduler-task-plugin/CLAUDE.md","rawUrl":"https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-task-plugin/CLAUDE.md","title":"dolphinscheduler-task-plugin - Claude Agent Guidelines & System Prompt","category":"claude-rule","format":"markdown","content":"# dolphinscheduler-task-plugin - Claude Agent Guidelines & System Prompt\n\nPath: `dolphinscheduler-task-plugin/CLAUDE.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-task-plugin/CLAUDE.md)","tokens":300,"sizeBytes":253},{"name":"CLAUDE.md","path":"dolphinscheduler-tools/CLAUDE.md","rawUrl":"https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-tools/CLAUDE.md","title":"dolphinscheduler-tools - Claude Agent Guidelines & System Prompt","category":"claude-rule","format":"markdown","content":"# dolphinscheduler-tools - Claude Agent Guidelines & System Prompt\n\nPath: `dolphinscheduler-tools/CLAUDE.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-tools/CLAUDE.md)","tokens":300,"sizeBytes":235},{"name":"CLAUDE.md","path":"dolphinscheduler-ui/CLAUDE.md","rawUrl":"https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-ui/CLAUDE.md","title":"dolphinscheduler-ui - Claude Agent Guidelines & System Prompt","category":"claude-rule","format":"markdown","content":"# dolphinscheduler-ui - Claude Agent Guidelines & System Prompt\n\nPath: `dolphinscheduler-ui/CLAUDE.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-ui/CLAUDE.md)","tokens":300,"sizeBytes":226},{"name":"CLAUDE.md","path":"dolphinscheduler-worker/CLAUDE.md","rawUrl":"https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-worker/CLAUDE.md","title":"dolphinscheduler-worker - Claude Agent Guidelines & System Prompt","category":"claude-rule","format":"markdown","content":"# dolphinscheduler-worker - Claude Agent Guidelines & System Prompt\n\nPath: `dolphinscheduler-worker/CLAUDE.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-worker/CLAUDE.md)","tokens":300,"sizeBytes":238},{"name":"CLAUDE.md","path":"dolphinscheduler-yarn-aop/CLAUDE.md","rawUrl":"https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-yarn-aop/CLAUDE.md","title":"dolphinscheduler-yarn-aop - Claude Agent Guidelines & System Prompt","category":"claude-rule","format":"markdown","content":"# dolphinscheduler-yarn-aop - Claude Agent Guidelines & System Prompt\n\nPath: `dolphinscheduler-yarn-aop/CLAUDE.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-yarn-aop/CLAUDE.md)","tokens":300,"sizeBytes":244},{"name":"README.md","path":"tools/release/README.md","rawUrl":"https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/tools/release/README.md","title":"release Documentation","category":"plugin-manifest","format":"markdown","content":"# release Documentation\n\nPath: `tools/release/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/tools/release/README.md)","tokens":300,"sizeBytes":174}],"systemPromptSnippet":"<yakaai_skills repo=\"apache/dolphinscheduler\">\n<!-- File: AGENTS.md (Tokens: ~211 | Category: root-instruction) -->\n<!--\nSPDX-License-Identifier: Apache-2.0\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    https://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n-->\n\n# Agent Guide for dolphinscheduler\n\nThis file is read by automated agents (security scanners, code\nanalyzers, AI assistants) operating on this repository.\n\n## Security\n\nSecurity model: [SECURITY.md](./SECURITY.md)\n\nAgents that scan this repository should consult `SECURITY.md` and the\nthreat model it links before reporting issues.\n\nDolphinScheduler's security model defines user roles, trust boundaries, and known non-findings.\n\n<!-- File: CLAUDE.md (Tokens: ~2721 | Category: claude-rule) -->\n# CLAUDE.md — Apache DolphinScheduler\n\nApache DolphinScheduler is a distributed, visual DAG workflow-scheduling platform. This is the monorepo: backend servers (master / worker / api / alert), a Vue 3 frontend, plugin families for tasks / datasources / storage / alerting / scheduling, and the release tooling.\n\n**This file is an index.** Each module has its own `CLAUDE.md` with the details — do not duplicate module contents here.\n\n---\n\n## Tech stack (project-wide)\n\n- **Java 1.8** (do not assume 11+ APIs; `dolphinscheduler-api-test` is the only Java 11 island).\n- **Spring Boot 2.6.1** across servers, **Jetty** (Tomcat is excluded transitively).\n- **MyBatis-Plus** for ORM; **HikariCP** for the metadata DB pool, **Druid** inside user-facing datasource plugins.\n- **Quartz** for cron scheduling (via `scheduler-plugin`).\n- **Netty / gRPC** for inter-server RPC (see `extract-base`).\n- **Vue 3 + Vite + TypeScript + Naive UI** for the frontend.\n- **Maven** multi-module reactor (26 modules in root `pom.xml` + 2 test modules).\n- **Zookeeper 3.8** by default for the registry (Etcd and JDBC also supported).\n\n## Runnable services\n\nA production deployment runs **four independent services** (plus an external registry and metadata DB). A fifth entry point — `StandaloneServer` — embeds all four in one JVM for development.\n\n| Service | Module | Main class | Default ports |\n|---------|--------|------------|---------------|\n| **API** | [`dolphinscheduler-api`](dolphinscheduler-api/CLAUDE.md) | `org.apache.dolphinscheduler.api.ApiApplicationServer` | `12345` (HTTP / UI + REST) |\n| **Master** | [`dolphinscheduler-master`](dolphinscheduler-master/CLAUDE.md) | `org.apache.dolphinscheduler.server.master.MasterServer` | `5679` (RPC) |\n| **Worker** | [`dolphinscheduler-worker`](dolphinscheduler-worker/CLAUDE.md) | `org.apache.dolphinscheduler.server.worker.WorkerServer` | `1235` (RPC) |\n| **Alert** | [`dolphinscheduler-alert`](dolphinscheduler-alert/CLAUDE.md) (→ `-alert-server`) | `org.apache.dolphinscheduler.alert.AlertServer` | `50053` (HTTP), `50052` (RPC) |\n| Standalone (dev only) | [`dolphinscheduler-standalone-server`](dolphinscheduler-standalone-server/CLAUDE.md) | `org.apache.dolphinscheduler.StandaloneServer` | `12345` + `50052` (API + alert; master/worker use in-JVM calls) |\n\nEvery service is a `@SpringBootApplication` on Jetty and implements `IStoppable`. Scale Master / Worker / Alert horizontally; coordination happens via the registry (Zookeeper by default). API is stateless and also scales horizontally behind a load balancer.\n\nPorts are overridable via `server.port` / service-specific keys in each service's `application.yaml`.\n\n## Build & run\n\n```bash\n# Full build (release profile; produces dist tarball)\n./mvnw clean install -Prelease\n\n# Zookeeper 3.4 legacy\n./mvnw clean install -Prelease -Dzk-3.4\n\n# Skip UI build (faster iteration on backend only)\n./mvnw -pl '!dolphinscheduler-ui' clean install\n\n# Build one module (+ its required siblings)\n./mvnw -pl dolphinscheduler-master -am clean install\n\n# Format (Spotless is configured)\n./mvnw spotless:apply\n\n# Standalone server (after building)\ncd dolphinscheduler-standalone-server/target && ./bin/start.sh\n```\n\nBinary artifact: `dolphinscheduler-dist/target/apache-dolphinscheduler-*-bin.tar.gz`.\n\n## Test\n\n```bash\n# Unit tests for one module\n./mvnw -pl dolphinscheduler-master test\n\n# API integration tests (separate reactor, requires Docker)\nmvn -pl dolphinscheduler-api-test/dolphinscheduler-api-test-case test\n\n# E2E browser tests (Selenium + Docker)\nmvn -pl dolphinscheduler-e2e/dolphinscheduler-e2e-case test\n\n# Apple Silicon: add -Dm1_chip=true to the Docker-driven suites\n```\n\n---\n\n## Module index\n\nClick into a module's `CLAUDE.md` for details. Each description is one line here on purpose.\n\n### Core execution\n\n- [`dolphinscheduler-master`](dolphinscheduler-master/CLAUDE.md) — workflow orchestration engine; consumes `Command`s, runs the DAG state machine, dispatches to workers.\n- [`dolphinscheduler-worker`](dolphinscheduler-worker/CLAUDE.md) — runs physical tasks dispatched from master; hosts task plugins.\n- [`dolphinscheduler-task-executor`](dolphinscheduler-task-executor/CLAUDE.md) — reusable task-lifecycle framework embedded by the worker.\n- [`dolphinscheduler-alert`](dolphinscheduler-alert/CLAUDE.md) — alert server + channel plugins (email, Feishu, DingTalk, …).\n\n### API layer\n\n- [`dolphinscheduler-api`](dolphinscheduler-api/CLAUDE.md) — REST API server (entry point for UI, Python SDK, external clients).\n- [`dolphinscheduler-api-test`](dolphinscheduler-api-test/CLAUDE.md) — integration tests against the REST API (Docker Compose + Testcontainers).\n- [`dolphinscheduler-authentication`](dolphinscheduler-authentication/CLAUDE.md) — Actuator-endpoint auth + AWS credential helpers (NOT the main login path).\n\n### Shared libraries\n\n- [`dolphinscheduler-common`](dolphinscheduler-common/CLAUDE.md) — foundation utilities (everything depends on this).\n- [`dolphinscheduler-dao`](dolphinscheduler-dao/CLAUDE.md) — MyBatis DAO layer + SQL migration scripts.\n- [`dolphinscheduler-service`](dolphinscheduler-service/CLAUDE.md) — business logic between DAO and the servers.\n- [`dolphinscheduler-spi`](dolphinscheduler-spi/CLAUDE.md) — Service-Provider Interface root (every plugin depends on this).\n- [`dolphinscheduler-extract`](dolphinscheduler-extract/CLAUDE.md) — RPC interface contracts between servers.\n- [`dolphinscheduler-eventbus`](dolphinscheduler-eventbus/CLAUDE.md) — in-process event-bus abstractions.\n- [`dolphinscheduler-registry`](dolphinscheduler-registry/CLAUDE.md) — pluggable registry (Zookeeper / Etcd / JDBC).\n- [`dolphinscheduler-meter`](dolphinscheduler-meter/CLAUDE.md) — metrics (Prometheus) + server load-protection primitives.\n\n### Plugin families\n\n- [`dolphinscheduler-task-plugin`](dolphinscheduler-task-plugin/CLAUDE.md) — task-type plugins (shell, SQL, Spark, Flink, K8s, EMR, …). 33 concrete plugins.\n- [`dolphinscheduler-datasource-plugin`](dolphinscheduler-datasource-plugin/CLAUDE.md) — user-facing datasource plugins (MySQL, Hive, Trino, Snowflake, …). 28 concrete plugins.\n- [`dolphinscheduler-storage-plugin`](dolphinscheduler-storage-plugin/CLAUDE.md) — resource storage (S3, HDFS, OSS, GCS, ABS, OBS, COS).\n- [`dolphinscheduler-scheduler-plugin`](dolphinscheduler-scheduler-plugin/CLAUDE.md) — cron scheduler (Quartz today).\n- [`dolphinscheduler-dao-plugin`](dolphinscheduler-dao-plugin/CLAUDE.md) — metadata-DB dialect support (MySQL / PostgreSQL / H2).\n\n### Build, ops, tools\n\n- [`dolphinscheduler-bom`](dolphinscheduler-bom/CLAUDE.md) — Maven BOM; central dependency version pinning.\n- [`dolphinscheduler-dist`](dolphinscheduler-dist/CLAUDE.md) — assembles the release tarball + Docker images.\n- [`dolphinscheduler-standalone-server`](dolphinscheduler-standalone-server/CLAUDE.md) — all-in-one JVM with H2 (dev / smoke tests).\n- [`dolphinscheduler-tools`](dolphinscheduler-tools/CLAUDE.md) — CLIs for schema upgrade + resource / lineage migration.\n- [`dolphinscheduler-microbench`](dolphinscheduler-microbench/CLAUDE.md) — JMH micro-benchmarks.\n- [`dolphinscheduler-yarn-aop`](dolphinscheduler-yarn-aop/CLAUDE.md) — AspectJ weaver capturing YARN ApplicationIds.\n\n### Frontend & E2E\n\n- [`dolphinscheduler-ui`](dolphinscheduler-ui/CLAUDE.md) — Vue 3 frontend.\n- [`dolphinscheduler-e2e`](dolphinscheduler-e2e/CLAUDE.md) — Selenium browser tests.\n\n---\n\n## Architecture overview (one paragraph)\n\nA **user** hits the UI, which calls the API server. The API server writes to the **metadata DB** and, for runtime operations (start / kill / pause workflow), talks to the **master** over RPC. The master consumes `t_ds_command` rows, runs the workflow state machine, and dispatches tasks to **workers**. Workers execute task plugins (shell, SQL, Spark, …) and stream lifecycle events back to master. Failures and SLA breaches flow to the **alert server**, which fans out through alert plugins. **Registry** (Zookeeper / Etcd / JDBC) provides service discovery, leader election, and distributed locks. **Storage plugins** back the resource center and distributed-task artifacts. **Quartz** (via scheduler plugin) fires scheduled workflows, which become new `Command` rows.\n\n## Where things live (quick lookup)\n\n| Looking for… | Start here |\n|--------------|------------|\n| A REST endpoint | `dolphinscheduler-api/src/main/java/.../api/controller/` |\n| Workflow execution logic | `dolphinscheduler-master/src/main/java/.../server/master/engine/` |\n| Task execution logic | `dolphinscheduler-worker` + the specific `task-plugin/<type>` |\n| How \"X\" is stored | `dolphinscheduler-dao/src/main/java/.../dao/entity/` |\n| SQL schema / upgrade | `dolphinscheduler-dao/src/main/resources/sql/` |\n| RPC contract between servers | `dolphinscheduler-extract/dolphinscheduler-extract-<role>` |\n| UI page source | `dolphinscheduler-ui/src/views/<feature>/` |\n| API call in the UI | `dolphinscheduler-ui/src/service/modules/<resource>.ts` |\n| Version of a dependency | `dolphinscheduler-bom/pom.xml` |\n\n## Project-wide conventions\n\n- **Formatting**: Run `./mvnw spotless:apply` before every commit/push. Spotless covers Java sources, `pom.xml`, and Markdown files (yes, including the docs); CI runs `./mvnw spotless:check` and will fail PRs that aren't formatted. Java imports are ordered; license headers are enforced.\n- **Commit style**: `[Type-ISSUE_ID][Scope] Subject`, e.g. `[Fix-18168][Worker] ...`. All types except `Chore` require an issue ID. See [commit-message.md](docs/docs/en/contribute/join/commit-message.md) for the full convention.\n- **Branching**: `dev` is the main integration branch (not `main`/`master`).\n- **PRs must link a GitHub issue** and keep their scope tight — one module / one concern.\n- **Do not break wire / DB compatibility** silently. Changes to `extract-*` RPC interfaces, `dao` entities, enum values, and `spi.DbType` ripple to deployed clusters mid-upgrade.\n- **Only one registry / storage / DB dialect is active at runtime**. Code paths that check \"which one\" belong inside the plugin SPI, not sprinkled through services.\n\n## External references\n\n- Release docs (version-specific): https://dolphinscheduler.apache.org/en-us/docs\n- GitHub issues: https://github.com/apache/dolphinscheduler/issues\n- Python SDK: https://dolphinscheduler.apache.org/python/\n- Contribution guide: [`docs/docs/en/contribute/join/contribute.md`](docs/docs/en/contribute/join/contribute.md)\n\n<!-- File: dolphinscheduler-alert/CLAUDE.md (Tokens: ~665 | Category: claude-rule) -->\n# CLAUDE.md — dolphinscheduler-alert\n\nAlert / notification subsystem. Master and worker publish alert events (task failure, timeout, SLA breach, …); this subsystem evaluates them and dispatches via configured channel plugins (email, webhook, Feishu, DingTalk, PagerDuty, …).\n\n**This directory is a Maven parent POM.**\n\n## Sub-modules\n\n- **`dolphinscheduler-alert-server`** — the runnable alert server. `@SpringBootApplication` `AlertServer` + HA coordinator (`AlertHAServer`) + RPC server (`AlertRpcServer`) + event loop.\n- **`dolphinscheduler-alert-plugins`** — parent of the concrete channel plugins:\n  - `dolphinscheduler-alert-email`, `-http`, `-feishu`, `-dingtalk`, `-wechat`, `-webexteams`, `-pagerduty`, `-telegram`, `-slack`, `-script`, etc. (see directory listing for the current set). Each plugin implements the `AlertPlugin` SPI and is loaded dynamically at runtime.\n\n## How alerting works (end-to-end)\n\n1. Master/worker calls into `dolphinscheduler-extract-alert` RPC with an `AlertRequest`.\n2. `AlertRpcServer` receives it, persists/enqueues onto `AlertEventPendingQueue`.\n3. `AlertEventFetcher` pulls pending events in `AlertEventLoop`.\n4. `AlertSender` looks up the alert group's configured plugins, invokes each.\n5. Delivery result is recorded to the DB for audit.\n\n## Extension points\n\n- **`AlertPlugin` SPI** — new channel? Implement the interface in a new sub-module of `dolphinscheduler-alert-plugins` and it will be discovered by `AlertPluginManager`.\n- Alert rule logic is currently fixed (type-based); extending rules means editing `AlertEventLoop` / `AlertSender`.\n\n## Gotchas\n\n- **Alert server is separate from master/worker** by design. Running it as an embedded part of master is not supported — it has its own HA, its own port, its own `application.yaml`.\n- **`AlertEventPendingQueue` is DB-backed** (not just in-memory) so restarting the alert server does not lose queued alerts.\n- **HA pattern mirrors master/worker**: only the leader pulls from the queue; others stand by.\n- **Plugin config is per-alert-group**, stored in the DB. Adding a plugin implementation does not enable it for anyone until an admin creates an alert group referencing it.\n- **Channel-specific rate limits / retries** live *inside* each plugin, not in the server. Don't add a global retry loop in `AlertSender`.\n\n## Tests\n\n- `alert-server/src/test/java` — unit tests for config, RPC, event queue, sender.\n- Each plugin has its own `src/test/java` with mocked channel calls.\n\n## Related modules\n\n- `dolphinscheduler-extract-alert` — RPC contracts this server implements.\n- `dolphinscheduler-dao` — persists alert events + audit.\n- `dolphinscheduler-registry-all`, `dolphinscheduler-meter`, `dolphinscheduler-spi`.\n- Callers: `dolphinscheduler-master`, `dolphinscheduler-worker`.\n\n<!-- File: dolphinscheduler-api-test/CLAUDE.md (Tokens: ~715 | Category: claude-rule) -->\n# CLAUDE.md — dolphinscheduler-api-test\n\nIntegration test harness for the REST API. **Not** bundled into the release — this module exists to run curl-style black-box tests against a full DolphinScheduler stack booted via Docker Compose + Testcontainers.\n\n**This is a Maven parent POM.** This module is **not** declared in the root `pom.xml` `<modules>` — run it explicitly (e.g. `mvn -pl dolphinscheduler-api-test test -am`) or via CI workflows.\n\n## Sub-modules\n\n- **`dolphinscheduler-api-test-core`** — the reusable framework:\n  - `@DolphinScheduler` annotation (marks a test class, accepts `composeFiles`).\n  - `DolphinSchedulerExtension` — JUnit 5 extension that starts the Compose stack, injects `RequestClient` and page objects.\n  - `RequestClient` — thin HTTP client with session handling.\n  - Page-object base classes (`LoginPage`, `WorkflowDefinitionPage`, `ProjectPage`, `TenantPage`, `UserPage`, `WorkerGroupPage`).\n- **`dolphinscheduler-api-test-case`** — the actual test classes. `WorkflowDefinitionAPITest`, `TenantAPITest`, `SchedulerAPITest`, etc. Each class uses `@DolphinScheduler(composeFiles = { \"docker/basic/docker-compose.yaml\" })` to declare its environment.\n\n## Stack bootstrap\n\nCompose files live under `src/test/resources/docker/<scenario>/docker-compose.yaml`:\n\n- `basic/` — standard API + Postgres.\n- `tenant/` — scenario with multi-tenant configuration.\n- `oidc-login/` — API with Keycloak for OIDC flow (`realm-export.json` alongside).\n\nThe JUnit extension uses Testcontainers Compose to wait for port readiness before returning.\n\n## Running\n\n```\n# Full suite\nmvn -pl dolphinscheduler-api-test/dolphinscheduler-api-test-case test\n\n# Single class (Mac M1)\nmvn -pl dolphinscheduler-api-test/dolphinscheduler-api-test-case test \\\n    -Dtest=WorkflowDefinitionAPITest -Dm1_chip=true\n```\n\nFlags:\n\n- `-Dm1_chip=true` — forces `arm64/v8` platform for Docker on Apple Silicon.\n- `-Dlocal=true` — skips Testcontainers and points at a locally-running DolphinScheduler instead.\n\n## Gotchas\n\n- **Java 11 required** to compile this module (rest of the repo targets 1.8).\n- **`@Order` is mandatory** on test methods within a class — tests are state-dependent and must run in declared order.\n- **`@DisableIfTestFails` (from junit-pioneer)** cascades a failure to dependent tests in the same class; don't silently disable without understanding the chain.\n- **`sessionId` is threaded through page objects**: `LoginPage.login(...)` returns a session ID that subsequent page objects must receive. Don't instantiate page objects without first logging in.\n- **This module is excluded from the root reactor build** — CI drives it via a dedicated workflow. Check `.github/workflows/` before assuming a PR runs these.\n\n## Related modules\n\n- `dolphinscheduler-api` — the system under test.\n- `dolphinscheduler-dao` — depended on to reuse entity DTOs.\n- `dolphinscheduler-e2e` — complementary browser-level tests (selenium against UI).\n\n<!-- File: dolphinscheduler-api/CLAUDE.md (Tokens: ~1628 | Category: claude-rule) -->\n# CLAUDE.md — dolphinscheduler-api\n\nREST API server. Entry point for the UI and external clients (curl, Python SDK). Uses Spring Boot with **Jetty** (not Tomcat) and springdoc-openapi for Swagger UI.\n\n## Main package\n\n`org.apache.dolphinscheduler.api`\n\n## Entry point\n\n`ApiApplicationServer` — `@SpringBootApplication`. On startup it:\n1. Loads `DataSourcePluginManager` and `TaskPluginManager` (plugin discovery).\n2. Binds to the port in `server.port` (default 12345).\n3. Starts the Py4J gateway used by the Python SDK.\n\n## Key sub-packages\n\n- `api.controller` — 30+ `@RestController` classes, one per domain (workflows, tasks, users, projects, tenants, resources, data sources, alerts, monitoring, …). All URLs rooted at `/dolphinscheduler/*`.\n- `api.service` / `api.service.impl` — business-logic layer wrapping `dolphinscheduler-service` and adding API-level concerns (auth checks, DTO mapping).\n- `api.security` — pluggable authenticators: `PASSWORD` (default), `LDAP`, `OIDC`, `CASDOOR`, `SSO`. Selected by `security.authentication.type`.\n- `api.interceptor` — `LoginHandlerInterceptor` (session cookie check), `RateLimitInterceptor`, `LocaleChangeInterceptor`.\n- `api.configuration` — Spring config beans: Swagger, OAuth2, task-type catalog.\n- `api.dto` — request/response DTOs.\n- `api.exceptions` — `ApiExceptionHandler` (`@RestControllerAdvice`) maps exceptions → structured JSON responses.\n\n## Extension points\n\n- `Authenticator` — implement a new one to support additional login backends (added cases go into `AuthenticationType` enum + registered in `SecurityConfig`).\n- Controllers auto-pick up new task types via `TaskTypeConfiguration` reading `task-type-config.yaml` / `dynamic-task-type-config.yaml`.\n\n## Configuration\n\n`src/main/resources`:\n\n- `application.yaml` — server port, datasource, registry, security mode, CORS, OpenAPI.\n- `task-type-config.yaml`, `dynamic-task-type-config.yaml` — the catalog of task types exposed to the UI.\n- `i18n/messages_*.properties` — English + Simplified Chinese server-side messages.\n- `swagger.properties` — springdoc config (UI lives at `/dolphinscheduler/swagger-ui/index.html`).\n- `logback-spring.xml` — logging.\n\n## Gotchas\n\n- **Jetty, not Tomcat**. `spring-boot-starter-tomcat` is excluded transitively via `dolphinscheduler-meter`. Avoid accidentally pulling Tomcat in.\n- **Session-based auth**: `LoginHandlerInterceptor` reads the `sessionId` cookie. There is no JWT by default. OIDC/CASDOOR paths still set a session.\n- **OIDC requires `casdoor-spring-boot-starter`**; `OAuth2Configuration` is `@ConditionalOnProperty(security.authentication.type = OIDC|CASDOOR)`.\n- **Python SDK integration** uses Py4J gateway, not REST. If a Python SDK change misbehaves, check `api-server` logs for Py4J init messages.\n- **Controllers mix `@PostMapping` with form params and JSON bodies inconsistently** — this is legacy. Follow whatever shape the adjacent endpoint uses rather than converting to JSON across the board.\n- **Swagger annotations are required** on new endpoints (`@Operation`, `@Parameter`). Missing ones break auto-generated docs the UI team consumes.\n\n## Tests\n\nUnit tests live in `src/test/java`. **Integration tests live in `dolphinscheduler-api-test`** (separate module, Docker Compose + Testcontainers).\n\n### Running unit tests from the command line\n\nThe CI flow (`.github/workflows/unit-test.yml`) runs in two phases. Mirror it locally:\n\n**One-time setup** — install BOM + upstream deps to local m2:\n\n```bash\nexport MAVEN_OPTS=\"-Xmx4g -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=1024m\"\n./mvnw install -B \\\n  -pl \"dolphinscheduler-bom,dolphinscheduler-api\" \\\n  -am -DskipTests=true -Dspotless.skip=true -DskipUT=true \\\n  -Djacoco.skip=true -Danalyze.skip=true\n```\n\n**Run tests** — use `verify` (NOT `test`), no `-am`, no `clean`:\n\n```bash\n./mvnw verify -B -pl \"dolphinscheduler-api\" \\\n  -Dmaven.test.skip=false -Dspotless.skip=true -DskipUT=false -Danalyze.skip=true \\\n  -Dsurefire.printSummary=true -Dsurefire.useFile=false \\\n  -Dsurefire.reportFormat=plain -Dsurefire.redirectTestOutputToFile=false \\\n  -Dsurefire.failIfNoSpecifiedTests=false \\\n  -Dtest='EnvironmentServiceTest#testVerifyEnvironment'\n```\n\nDrop the `-Dtest=...` filter to run the whole module.\n\n### Why the unusual flags\n\n- **`verify` not `test`** — root pom uses `jacoco-maven-plugin` in offline-instrument + restore-instrumented-classes mode. Only the `verify` lifecycle runs the `restore` goal, so `test` alone leaves `target/classes` instrumented and the next build fails with \"Cannot process instrumented class\".\n- **`dolphinscheduler-bom` must be in the install `-pl`** — without it, the installed pom lacks effective dependencyManagement and downstream compile/test classpaths drop transitive deps like `commons-collections4` and `oshi-core`.\n- **`-DskipTests=true` (not `-Dmaven.test.skip=true`) during install** — `maven.test.skip` skips test-source attach which breaks downstream modules that depend on the test-jar.\n- **No `-am` on the test run** — `-am` re-instruments upstream modules with jacoco and triggers the same \"Cannot process instrumented class\" failure.\n- **No `clean` between `install` and `verify`** — clean wipes `target/classes` and the next compile re-resolves transitive deps from the (still installed) pom; some resolutions fail with `[WARNING] The POM for ... is invalid` and the build can't see `commons-collections4` etc.\n\n### If things go sideways\n\n- `Cannot process instrumented class` — re-run with `-Djacoco.skip=true`, or wipe `target/` for the affected module and re-run.\n- `NoClassDefFoundError: oshi/SystemInfo` or `commons-collections4/CollectionUtils` at test runtime — the bom didn't get installed; redo the setup step including `dolphinscheduler-bom` in `-pl`.\n- `class file contains wrong class` — local `~/.m2/.../dolphinscheduler-*-dev-SNAPSHOT.jar` is stale/corrupt. Delete the offending `dev-SNAPSHOT` directory under `~/.m2/repository/org/apache/dolphinscheduler/` and re-run install.\n\nSurefire XML reports land at `target/surefire-reports/TEST-<class>.xml` for the per-test counts.\n\n## Related modules\n\n- `dolphinscheduler-service`, `dolphinscheduler-dao` — primary deps.\n- `dolphinscheduler-extract-master` / `-worker` / `-alert` — RPC into servers.\n- `dolphinscheduler-authentication` (actuator sub-module) — secures `/actuator/**`.\n- `dolphinscheduler-ui` — primary consumer.\n- `dolphinscheduler-api-test` — integration harness.\n\n<!-- File: dolphinscheduler-authentication/CLAUDE.md (Tokens: ~504 | Category: claude-rule) -->\n# CLAUDE.md — dolphinscheduler-authentication\n\nParent POM grouping two unrelated authentication helpers. They share no code — they're bundled here because both are about injecting security behavior into the server stack.\n\n**This directory is a Maven parent POM.**\n\n## Sub-modules\n\n- **`dolphinscheduler-actuator-authentication`** — Secures Spring Boot Actuator endpoints (`/actuator/**` and `/dolphinscheduler/actuator/**`) with HTTP Basic auth. Ships `ActuatorAuthenticationAutoConfiguration` + `ActuatorSecurityProperties` (`management.security.*` properties). Enabled when `management.security.enabled=true`. Excludable endpoints (health/info) via config list.\n- **`dolphinscheduler-aws-authentication`** — AWS credential provider abstraction used by AWS-based datasource/task plugins (EMR, S3, SageMaker, DMS, DataSync, etc.). Exposes `AWSCredentialsProviderFactor` with two strategies: `STATIC` (access key + secret) and `INSTANCE_PROFILE` (EC2/EKS IAM role).\n\n## Gotchas\n\n- **These two sub-modules are unrelated.** Don't treat \"authentication\" as a coherent module — the actuator one is about operator access; the AWS one is about cloud-task credentials. They don't share any class.\n- **API login auth is NOT here**. Session/password/LDAP/OIDC/CASDOOR login for the main API lives in `dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/security/`. If a user says \"auth\", check which one they mean first.\n- Actuator: the sample config uses `{noop}` password encoder. This is **development-only**; production must switch to `{bcrypt}` or an external IdP.\n- AWS: `STATIC` credentials sit in plaintext config. Always prefer `INSTANCE_PROFILE` on real infrastructure. When reading code that takes an `AwsConfig` map, expect either style.\n\n## Tests\n\nMinimal — auto-config wiring only. End-to-end auth is covered by `dolphinscheduler-api-test`.\n\n## Related modules\n\n- `dolphinscheduler-meter` — exposes the actuator endpoints that `-actuator-authentication` secures.\n- `dolphinscheduler-task-plugin` / `-datasource-plugin` AWS members — consume `-aws-authentication`.\n- `dolphinscheduler-api` — for the real user-login code path (separate from this module).\n\n<!-- File: dolphinscheduler-bom/CLAUDE.md (Tokens: ~524 | Category: claude-rule) -->\n# CLAUDE.md — dolphinscheduler-bom\n\nMaven **Bill of Materials**. Pins versions for every third-party library the project uses, so individual modules can `<dependency>` without specifying a version.\n\n## What goes here, what does NOT\n\n**Goes here**:\n- `<dependencyManagement>` entries for any lib used in more than one module.\n- `<properties>` pinning version numbers with consistent naming (`<netty.version>`, `<hadoop.version>`, …).\n- Profile-controlled version switches (e.g. `zk-3.8` vs `zk-3.4`).\n\n**Does NOT go here**:\n- Plugin versions (those live in the root `pom.xml`).\n- Dependencies specific to one plugin (e.g. Spark client version → stays in `task-spark/pom.xml`).\n- Anything the module defines for itself.\n\n## Key version properties (rough guide)\n\n- Spring Boot: 2.7.x (pinned by root pom, referenced here).\n- MyBatis Plus: 3.5.2.\n- gRPC: 1.41.0.\n- Netty: 4.1.53.\n- Hadoop: 3.2.4 (client side).\n- AspectJ: 1.9.7.\n- JDBC drivers: MySQL, PostgreSQL, Oracle, SQL Server, Snowflake, Databend, …\n\nWhen in doubt, **grep here first** for a dependency's current version before searching individual `pom.xml` files.\n\n## Profiles\n\n- `zk-3.8` (default) vs `zk-3.4` — switches Zookeeper + Curator versions. Active at build time via `-Pzk-3.4` if a legacy ZK cluster is targeted.\n\n## Gotchas\n\n- **`htrace-core` is explicitly excluded** from the Hadoop transitive graph as a CVE mitigation. Keep the exclusion even if someone reports the dep is \"missing\".\n- **Duplicate property bug**: `zeppelin-client.version` was historically defined twice (lines ~120 and ~123 of an older revision). If you see a similar duplication when editing, consolidate — the last one wins silently.\n- **No Java code** — `packaging: pom`. Don't add a `src/` directory.\n- **Version bumps here ripple to every module**; bump deliberately and prefer one-dep-at-a-time commits for bisect-ability.\n\n## Related modules\n\nEvery module that needs a pinned version imports this BOM in its own `<dependencyManagement>`.\n\n<!-- File: dolphinscheduler-common/CLAUDE.md (Tokens: ~589 | Category: claude-rule) -->\n# CLAUDE.md — dolphinscheduler-common\n\nFoundation utility library. Every other backend module in the repo transitively depends on this one, so treat it as the lowest layer: no internal dependencies, minimal behavior, stable API.\n\n## What lives here\n\n- Shared utilities: string / date / file / map / JSON helpers, SSL, encryption, thread helpers.\n- Global enums and constants (workflow status, task types, flag values, date formats).\n- Shell command execution primitives (`ShellExecutor`, `AbstractShell`).\n- Property delegation layer (`IPropertyDelegate`, `ImmutablePropertyDelegate`) used to read YAML/properties uniformly.\n- Generic DAG data structure (`common.graph.DAG`) — used by master to traverse workflow graphs.\n- Lifecycle interface (`IStoppable`) — implemented by every long-lived server (Master, Worker, Alert, API).\n\n## Main package\n\n`org.apache.dolphinscheduler.common`\n\n## Key sub-packages\n\n- `common.utils` — stateless helpers; the most-touched package in the module.\n- `common.constants` — `Constants`, `TenantConstants`, `DateConstants`.\n- `common.enums` — `WorkflowExecutionStatus`, `TaskExecutionStatus`, `Flag`, etc. Changes here ripple across every module — be careful when renaming.\n- `common.config` — property-source abstractions consumed by Spring `@ConfigurationProperties` classes elsewhere.\n- `common.shell` — blocking shell executor, used by task plugins.\n- `common.graph` — generic DAG; not workflow-specific despite the usage.\n- `common.lifecycle` — `IStoppable` only.\n\n## Extension points\n\nNone. This module exposes no SPI; it is a leaf utility library.\n\n## Configuration\n\n`src/main/resources`:\n\n- `common.properties` — logging + cloud-storage credentials read by services.\n- `remote-logging.yaml` — config for remote log fetch.\n- `resource-center.yaml` — resource-center defaults.\n\n## Gotchas\n\n- Cloud-storage SDKs (Aliyun OSS, Huawei OBS, Tencent COS, Azure Blob) are declared with `<optional>true</optional>` / broad exclusions. Do **not** rely on them being on the classpath from here — the concrete storage plugins in `dolphinscheduler-storage-plugin` bring them in.\n- Enum renames are breaking: workflow/task status enums are serialized into the database via MyBatis type handlers in `dolphinscheduler-dao`. Always grep for the enum value before renaming.\n- `IStoppable` is the canonical shutdown contract across every server; do not invent a new lifecycle interface.\n\n## Tests\n\nStandard `src/test/java`. No special infra.\n\n## Related modules\n\n- `dolphinscheduler-spi` — uses `common` as `provided`; keep new SPI-facing types minimal here.\n- Every `server-*` / `dao` / `service` / `plugin` module depends on this.\n\n<!-- File: dolphinscheduler-dao-plugin/CLAUDE.md (Tokens: ~649 | Category: claude-rule) -->\n# CLAUDE.md — dolphinscheduler-dao-plugin\n\nPlugin family for **database dialects** supporting the core DolphinScheduler metadata DB. Handles dialect-specific SQL generation, MyBatis-Plus `DbType` selection, and schema monitoring.\n\n**This directory is a Maven parent POM.** Not to be confused with `dolphinscheduler-datasource-plugin`, which is about *user-configured* external datasources — this module is about the *internal* metadata DB.\n\n## Sub-modules\n\n- **`dolphinscheduler-dao-api`** — SPI: `DaoPluginConfiguration`, `DatabaseDialect`, `DatabaseMonitor`, `DatabaseEnvironmentCondition`.\n- **`dolphinscheduler-dao-plugin-all`** — uber bundle depended on by `dolphinscheduler-dao`.\n- Concrete dialects:\n  - `dolphinscheduler-dao-mysql` — MySQL 5.7+ (production).\n  - `dolphinscheduler-dao-postgresql` — PostgreSQL 9.6+ (production).\n  - `dolphinscheduler-dao-h2` — H2 (dev / tests / standalone server).\n\n## How the right dialect is picked\n\nEach sub-module registers a `@AutoConfiguration` class (Spring Boot 2.7 style) that is `@Conditional(DatabaseEnvironmentCondition.class)`. `DatabaseEnvironmentCondition` looks at `spring.datasource.driver-class-name` and matches it to the dialect.\n\nSwitching the DB type therefore only requires changing the driver + URL in `application.yaml` — no pom changes.\n\n## Gotchas\n\n- **This is not a user-facing SPI**. There are exactly three supported internal DBs; adding a fourth (e.g. MariaDB, OceanBase for the metadata DB) requires coordinated changes in `dolphinscheduler-dao` SQL scripts and `dolphinscheduler-tools` upgraders.\n- **MyBatis-Plus `DbType` (`com.baomidou.mybatisplus.annotation.DbType`) is NOT the same enum as `dolphinscheduler-spi`'s `DbType`**. Internal DB uses the MyBatis-Plus one; external datasources use the spi one. When editing code here, make sure you're importing the right one.\n- **Dialect-specific SQL**: pagination (MySQL `LIMIT` vs PostgreSQL `OFFSET … LIMIT`), upsert behavior, JSON column handling. The `DatabaseDialect` interface is the authoritative place to vary SQL between backends — don't add `if (dbType == X)` branches in mappers.\n- **H2 is only for dev/test**. Production deployments should not run on H2. The standalone server is the only shipping configuration that uses it.\n\n## Tests\n\nEach dialect sub-module has its own `src/test/java` exercising the dialect behavior, typically against an embedded driver or Testcontainers.\n\n## Related modules\n\n- `dolphinscheduler-dao` — primary consumer (depends on `dao-plugin-all`).\n- `dolphinscheduler-tools` — DB schema upgrader; knows about the same three dialects.\n- `dolphinscheduler-standalone-server` — uses `-dao-h2` by default.\n\n<!-- File: dolphinscheduler-dao/CLAUDE.md (Tokens: ~614 | Category: claude-rule) -->\n# CLAUDE.md — dolphinscheduler-dao\n\nMyBatis-based data-access layer. Holds every entity, mapper, repository, and the SQL migration scripts shipped with a release.\n\n## Main package\n\n`org.apache.dolphinscheduler.dao`\n\n## Key sub-packages\n\n- `dao.entity` — persistence POJOs (`Command`, `WorkflowInstance`, `TaskInstance`, `User`, `Project`, `Tenant`, `DataSource`, `Cluster`, etc.). These map 1:1 to DB tables.\n- `dao.mapper` — MyBatis `@Mapper` interfaces. One per table/entity (`CommandMapper`, `WorkflowInstanceMapper`, `TaskInstanceMapper`, …).\n- `dao.repository` — higher-level repository abstractions wrapping mappers; what `service`/`master` layers should call, **not** the mappers directly.\n- `dao.model` — DAO-specific DTOs (query projections, aggregates).\n- `dao.utils` — SQL helpers.\n\n## SQL schema\n\n`src/main/resources/sql/`:\n\n- `dolphinscheduler_mysql.sql`, `dolphinscheduler_postgresql.sql`, `dolphinscheduler_h2.sql` — fresh install.\n- `upgrade/<version>/` — version-to-version migration DDL. Pairs with the upgraders in `dolphinscheduler-tools`.\n\n## Gotchas\n\n- **Mappers are not enough**: new code should go through `dao.repository`. Calling mappers directly from `master`/`service` is legacy and should not spread.\n- **Three DB dialects supported** (MySQL, PostgreSQL, H2). Any mapper XML must be dialect-neutral or rely on the dialect abstraction in `dolphinscheduler-dao-plugin`. Grep for `<if test=\"databaseType == ...\">` when in doubt — avoid adding more of those.\n- **Entity field renames are breaking**: MyBatis maps DB columns to field names via `@TableField` / naming conventions. Rename the column OR the field — never only one.\n- **Schema file excluded from jar**: `*.sql` is excluded from the built jar to keep it small; `dolphinscheduler-tools` repackages the SQL separately for the upgrade CLI.\n- `HikariCP` is the pool. Don't switch to Druid — datasource-plugin uses Druid internally for its own plugin connections, but the core DolphinScheduler metadata DB uses HikariCP.\n\n## Tests\n\n`src/test/java` — a mix of unit and Testcontainers-based integration tests. The database-dialect-specific paths are also exercised by `dolphinscheduler-dao-plugin/*/src/test`.\n\n## Related modules\n\n- `dolphinscheduler-dao-plugin` — dialect implementations; depended on here as `dolphinscheduler-dao-plugin-all`.\n- `dolphinscheduler-common` — utilities.\n- `dolphinscheduler-task-api` — task-related entities cross-reference it.\n- `dolphinscheduler-tools` — reads the SQL files here to run schema upgrades.\n\n<!-- File: dolphinscheduler-datasource-plugin/CLAUDE.md (Tokens: ~860 | Category: claude-rule) -->\n# CLAUDE.md — dolphinscheduler-datasource-plugin\n\nPlugin family for **datasources** — the configurable DB/warehouse/query-engine connections a user can register (MySQL, PostgreSQL, Hive, Trino, Redshift, Snowflake, …). Used by the SQL-style task plugins, the API for connection testing, and the data-lineage tool.\n\n**This directory is a Maven parent POM.**\n\n## Sub-modules\n\n### Framework\n\n- **`dolphinscheduler-datasource-api`** — SPI and base types: `DataSourceProcessor`, `AbstractDataSourceProcessor`, `BaseDataSourceParamDTO`, `BaseHdfsConnectionParam`, and the `DataSourcePluginManager` that loads plugins.\n- **`dolphinscheduler-datasource-all`** — uber module bundling every plugin; depended on by `master`, `worker`, `api` so they can use any datasource at runtime.\n\n### Concrete plugins (28 sub-modules)\n\nRelational: `-mysql`, `-postgresql`, `-oracle`, `-sqlserver`, `-db2`, `-oceanbase`, `-dameng`, `-hana`, `-azure-sql`, `-vertica`.\n\nOLAP / warehouses: `-clickhouse`, `-doris`, `-starrocks`, `-redshift`, `-snowflake`, `-databend`, `-dolphindb`.\n\nBig-data engines: `-hive`, `-spark`, `-presto`, `-trino`, `-kyuubi`, `-athena`.\n\nCloud / other: `-sagemaker`, `-k8s`, `-aliyunserverlessspark`, `-ssh`, `-zeppelin`.\n\n## SPI contract\n\nTwo interfaces are **both** implemented by each plugin:\n\n1. `DataSourceChannelFactory` (from `dolphinscheduler-spi`, loaded via `PrioritySPIFactory`) — creates `DataSourceChannel`s for low-level connection handling.\n2. `DataSourceProcessor` (from `datasource-api`, loaded via standard `ServiceLoader`) — validates + builds connection params, handles the UI-form contract.\n\nBoth are wired into plugins with `@AutoService(...)`. Discovery happens in `DataSourcePluginManager`.\n\n## How it plugs into the rest of the system\n\n- **API**: when the user opens the \"Create Datasource\" dialog, the API asks each `DataSourceProcessor` for its param descriptor and serves it to the UI.\n- **Worker**: SQL-family task plugins (`task-sql`, `task-procedure`, `task-datax`, …) look up the configured datasource by id, ask `datasource-api` for a JDBC connection via the channel, run the statement.\n\n## Gotchas\n\n- **Dual SPI loading is intentional**: channels are priority-ordered (multiple providers can coexist); processors are keyed by `DbType` (one per type). Don't merge them.\n- **`DbType` enum lives in `dolphinscheduler-spi`**. Adding a new datasource means: new enum value in spi + new plugin sub-module. Leaving the enum unchanged will cause `DataSourcePluginManager` to silently ignore the plugin.\n- **Passwords are encrypted** via `PasswordUtils` in `common`. Never store or log the plaintext form; always go through `PasswordUtils.encodePassword` / `decodePassword`.\n- **JDBC connection pooling** is **Druid** (not HikariCP). This is different from the metadata DB (`dolphinscheduler-dao` uses HikariCP). Be careful with which you're tuning.\n- **Hive / Spark / Presto plugins pull massive dep trees** — exclusions in their poms are load-bearing. Adding a new version bump here can blow up the classpath.\n\n## Tests\n\nEach plugin has `src/test/java`. Most use an embedded H2 or a mocked driver; a few use Testcontainers (e.g. `-postgresql`, `-mysql`).\n\n## Related modules\n\n- `dolphinscheduler-spi` — base SPI (`DataSourceChannelFactory`, `DbType`).\n- `dolphinscheduler-task-plugin` — primary consumer (SQL family plugins).\n- `dolphinscheduler-api`, `dolphinscheduler-service` — consumers for configuration + validation.\n- `dolphinscheduler-common` — `PasswordUtils`.\n\n<!-- File: dolphinscheduler-dist/CLAUDE.md (Tokens: ~638 | Category: claude-rule) -->\n# CLAUDE.md — dolphinscheduler-dist\n\nThe **release assembler**. Produces the binary tarball (`apache-dolphinscheduler-<version>-bin.tar.gz`) and the source tarball, optionally a Docker image. Has no Java code — it is a Maven assembly + shell-script orchestration module.\n\n## Artifacts produced\n\n- `apache-dolphinscheduler-${version}-bin.tar.gz` — standalone-server + master + worker + api + alert + UI + tools + plugin jars + scripts + configs.\n- `apache-dolphinscheduler-${version}-src.tar.gz` — ASF-compliant source tarball.\n- Docker images — when built with `-P docker`.\n\n## Assembly descriptors\n\n`src/main/assembly/`:\n\n- `dolphinscheduler-bin.xml` — file layout of the binary tarball.\n- `dolphinscheduler-src.xml` — file layout of the source tarball.\n\n## Scripts\n\n`src/main/scripts/` (approx):\n\n- `assembly-plugins.sh` — copies plugin jars into the right `lib/plugin/` subdirectories.\n- `docker-build.sh` — builds Docker images (invoked when `-P docker` and Docker CLI available).\n\n## Build\n\n```\n# Binary tarball (from repo root)\n./mvnw -pl dolphinscheduler-dist -am clean package\n\n# With Docker images\n./mvnw -pl dolphinscheduler-dist -am -P docker clean package\n```\n\nOutput lands in `dolphinscheduler-dist/target/`.\n\n## Gotchas\n\n- **`-P docker` requires a working Docker CLI + BuildKit**. CI sets `DOCKER_BUILDKIT=1` explicitly.\n- **`-am` is almost always needed** (`also make`) — this module reaches into every server, plugin, UI, and tool, so their sibling modules must be built first.\n- **The binary tarball layout is operator-facing**. Operators depend on `bin/`, `conf/`, `lib/`, `libs/plugin/` existing at known paths. Don't reorganize without announcing it.\n- **UI is built inside `dolphinscheduler-ui`** (Node / pnpm) during `./mvnw package`; this module picks up the `dist/` folder. A broken UI build breaks the dist build.\n- **Plugin jars are sorted into `libs/plugin/<family>/` by `assembly-plugins.sh`** — new plugin families need to be added to this script.\n- Source tarball rules are **ASF-compliant**: excludes binaries, `.git*`, etc. Don't introduce large binaries into the repo.\n\n## Tests\n\nNone. Verification is end-to-end via `dolphinscheduler-e2e` which runs against a built tarball.\n\n## Related modules\n\n- Dependencies at package-time: `dolphinscheduler-standalone-server`, `-api`, `-alert-server`, `-ui`, `-tools`.\n- Plugin families are picked up transitively via the `-all` uber modules (`task-all`, `datasource-all`, `storage-all`, `alert-all`, `scheduler-all`, `registry-all`, `dao-plugin-all`).\n\n<!-- File: dolphinscheduler-e2e/CLAUDE.md (Tokens: ~300 | Category: claude-rule) -->\n# dolphinscheduler-e2e - Claude Agent Guidelines & System Prompt\n\nPath: `dolphinscheduler-e2e/CLAUDE.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-e2e/CLAUDE.md)\n\n<!-- File: dolphinscheduler-eventbus/CLAUDE.md (Tokens: ~300 | Category: claude-rule) -->\n# dolphinscheduler-eventbus - Claude Agent Guidelines & System Prompt\n\nPath: `dolphinscheduler-eventbus/CLAUDE.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-eventbus/CLAUDE.md)\n\n<!-- File: dolphinscheduler-extract/CLAUDE.md (Tokens: ~300 | Category: claude-rule) -->\n# dolphinscheduler-extract - Claude Agent Guidelines & System Prompt\n\nPath: `dolphinscheduler-extract/CLAUDE.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-extract/CLAUDE.md)\n\n<!-- File: dolphinscheduler-master/CLAUDE.md (Tokens: ~300 | Category: claude-rule) -->\n# dolphinscheduler-master - Claude Agent Guidelines & System Prompt\n\nPath: `dolphinscheduler-master/CLAUDE.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-master/CLAUDE.md)\n\n<!-- File: dolphinscheduler-meter/CLAUDE.md (Tokens: ~300 | Category: claude-rule) -->\n# dolphinscheduler-meter - Claude Agent Guidelines & System Prompt\n\nPath: `dolphinscheduler-meter/CLAUDE.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-meter/CLAUDE.md)\n\n<!-- File: dolphinscheduler-microbench/CLAUDE.md (Tokens: ~300 | Category: claude-rule) -->\n# dolphinscheduler-microbench - Claude Agent Guidelines & System Prompt\n\nPath: `dolphinscheduler-microbench/CLAUDE.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-microbench/CLAUDE.md)\n\n<!-- File: dolphinscheduler-registry/CLAUDE.md (Tokens: ~300 | Category: claude-rule) -->\n# dolphinscheduler-registry - Claude Agent Guidelines & System Prompt\n\nPath: `dolphinscheduler-registry/CLAUDE.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-registry/CLAUDE.md)\n\n<!-- File: dolphinscheduler-scheduler-plugin/CLAUDE.md (Tokens: ~300 | Category: claude-rule) -->\n# dolphinscheduler-scheduler-plugin - Claude Agent Guidelines & System Prompt\n\nPath: `dolphinscheduler-scheduler-plugin/CLAUDE.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-scheduler-plugin/CLAUDE.md)\n\n<!-- File: dolphinscheduler-service/CLAUDE.md (Tokens: ~300 | Category: claude-rule) -->\n# dolphinscheduler-service - Claude Agent Guidelines & System Prompt\n\nPath: `dolphinscheduler-service/CLAUDE.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-service/CLAUDE.md)\n\n<!-- File: dolphinscheduler-spi/CLAUDE.md (Tokens: ~300 | Category: claude-rule) -->\n# dolphinscheduler-spi - Claude Agent Guidelines & System Prompt\n\nPath: `dolphinscheduler-spi/CLAUDE.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-spi/CLAUDE.md)\n\n<!-- File: dolphinscheduler-standalone-server/CLAUDE.md (Tokens: ~300 | Category: claude-rule) -->\n# dolphinscheduler-standalone-server - Claude Agent Guidelines & System Prompt\n\nPath: `dolphinscheduler-standalone-server/CLAUDE.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-standalone-server/CLAUDE.md)\n\n<!-- File: dolphinscheduler-storage-plugin/CLAUDE.md (Tokens: ~300 | Category: claude-rule) -->\n# dolphinscheduler-storage-plugin - Claude Agent Guidelines & System Prompt\n\nPath: `dolphinscheduler-storage-plugin/CLAUDE.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-storage-plugin/CLAUDE.md)\n\n<!-- File: dolphinscheduler-task-executor/CLAUDE.md (Tokens: ~300 | Category: claude-rule) -->\n# dolphinscheduler-task-executor - Claude Agent Guidelines & System Prompt\n\nPath: `dolphinscheduler-task-executor/CLAUDE.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-task-executor/CLAUDE.md)\n\n<!-- File: dolphinscheduler-task-plugin/CLAUDE.md (Tokens: ~300 | Category: claude-rule) -->\n# dolphinscheduler-task-plugin - Claude Agent Guidelines & System Prompt\n\nPath: `dolphinscheduler-task-plugin/CLAUDE.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-task-plugin/CLAUDE.md)\n\n<!-- File: dolphinscheduler-tools/CLAUDE.md (Tokens: ~300 | Category: claude-rule) -->\n# dolphinscheduler-tools - Claude Agent Guidelines & System Prompt\n\nPath: `dolphinscheduler-tools/CLAUDE.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-tools/CLAUDE.md)\n\n<!-- File: dolphinscheduler-ui/CLAUDE.md (Tokens: ~300 | Category: claude-rule) -->\n# dolphinscheduler-ui - Claude Agent Guidelines & System Prompt\n\nPath: `dolphinscheduler-ui/CLAUDE.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-ui/CLAUDE.md)\n\n<!-- File: dolphinscheduler-worker/CLAUDE.md (Tokens: ~300 | Category: claude-rule) -->\n# dolphinscheduler-worker - Claude Agent Guidelines & System Prompt\n\nPath: `dolphinscheduler-worker/CLAUDE.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-worker/CLAUDE.md)\n\n<!-- File: dolphinscheduler-yarn-aop/CLAUDE.md (Tokens: ~300 | Category: claude-rule) -->\n# dolphinscheduler-yarn-aop - Claude Agent Guidelines & System Prompt\n\nPath: `dolphinscheduler-yarn-aop/CLAUDE.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/apache/dolphinscheduler/HEAD/dolphinscheduler-yarn-aop/CLAUDE.md)\n\n<!-- ... +1 more modular skills available via /api/skills/apache/dolphinscheduler?path={path} -->\n</yakaai_skills>"}