Integrate Java business systems with ReachAI SDK registration, SDK instance heartbeat, gateway/embed access, and optional API Management handoff. Use when asked to connect a Spring Boot service to ReachAI, add reachai-capability-sdk or reachai-spring-boot2-starter, configure reachai.registry/reachai.project/reachai.capability, prepare @ReachCapability metadata for later manual SDK sync, or verify SDK onboarding from a ReachAI manifest.
npx skills add https://github.com/w8123/EnterpriseAgentFramework --skill reachai-onboarding
Treat the current business repository as the source of truth. Inspect its Maven modules, Java version, Spring Boot version, configuration files, existing controller/service boundaries, and test commands before editing.
凡是写入 ReachAI 或展示给业务用户的名称、标题、描述、说明、System Prompt、节点名称、审计原因、进度和结果,默认使用清晰的简体中文。不要仅因 API、Schema 或字段名为英文就生成英文业务文案。Token、MCP、AI、Agent、Supervisor、Workflow、Tool、API、SDK 等熟知专业术语,以及 keySlug、toolName、代码、路径、枚举值、协议字段和技术标识可保留英文;必要时使用“中文名称(英文术语)”。不要翻译或改写技术标识。
Never paste, print, or commit the registry app secret. Use the environment variable named by the manifest, normally REACHAI_REGISTRY_APP_SECRET.
ReachAI task handoffs use a one-time activation code. Activate it once, keep the returned short-lived task token only in the current process, and call /api/ai-coding/tasks/{taskId}/** with Authorization: Bearer <taskToken>. Never reuse a project-level aiCodingKey on task protocol routes.
Separate project/Workflow AI Coding APIs under /api/ai-coding/projects/ and /api/workflows//ai-coding/** can still use the explicit project aiCodingKey when the user independently supplies one. Send it as X-ReachAI-AiCoding-Key; never put it in a URL, browser bundle, task artifact, or progress event.
Prefer minimal, reviewable changes:
reachai-spring-boot2-starter in the runnable Spring Boot application module.reachai-capability-sdk in modules that declare @ReachCapability methods or DTO field metadata.@ReachCapability is method-level, @ReachParam is parameter/field-level, and @ReachOutput is field-only on response DTO fields. Do not put @ReachOutput on methods.sdkArtifacts, expand {skillExtractDir} in each installCommandTemplate, and run reachai-capability-sdk before reachai-spring-boot2-starter. The bundled scripts/install-java-sdk.ps1 downloads the declared JAR and standalone consumer POM, verifies both declared SHA-256 values, and installs that exact coordinate into the business system's Maven local repository. Fail if a URL or hash is absent or mismatched; do not guess another URL and do not require access to the ReachAI repository.sdkArtifacts for @reachai/embed-chat, extract this Skill zip anywhere, then run the expanded installCommandTemplate from the business frontend directory that contains package.json. The bundled scripts/install-embed-chat.mjs verifies integritySha256, copies the tgz to the stable repo-local vendor/reachai/ directory, replaces the exact installed package directory, and records .reachai-artifact-sha256. Re-run this installer whenever a SNAPSHOT artifact checksum changes; npm install --force alone does not prove that a same-version file dependency was refreshed. reachai-doctor --mode static reports EMBED_SDK_ARTIFACT_MATCH. Never run npm install directly against a temporary Skill extract path, and never leave %TEMP%, .cursor, .trae or another machine-specific absolute path in package.json / lockfiles. Authenticated downloadUrl needs auth headers that npm cannot send, so prefer this Skill-bundled installer./repository/, /maven/, /repository/maven/, /api/embed/sdk, or /npm/. Do not use cd ai-admin-front && npm run build:sdk as the business-project install path.gatewayChecklist object list on the onboarding manifest (id, description, required, verificationHint, failureImpact). See references/java-sdk-access.md.PROJECT_ONBOARDING task may explicitly trigger exactly one audited SDK sync with POST <taskRoot>/verifications/SDK_SYNC; the task token scopes that operation to its own project. The equivalent console action remains API Management(API 管理)手动触发的 SDK 同步. Restrict both paths to business-owned packages and never include framework, platform, third-party, starter, or shared infrastructure controllers as business APIs.GET <taskRoot>/context first. Otherwise read the explicitly supplied onboarding manifest URL.application.yml, bootstrap.yml, profile-specific config, or config-center conventions.sdkArtifacts, references/java-sdk-access.md, and templates/pom-dependencies.xml. Platform artifact links are the default when no corporate Maven publication exists.templates/application-reachai.yml. Do not add any capability startup-sync setting. Replace package placeholders only when preparing the explicit SDK sync boundary. Set reachai.project.base-url to an address reachable from the ReachAI server; use localhost, 127.0.0.1, or ::1 only when ReachAI and the business service actually share the same host or network namespace.@ReachCapability / @ReachParam. Use templates/reach-capability-example.java only as a style example.POST /reachai/registry/capabilities/sync to the Starter service through the configured base-url and context-path.X-ReachAI-Invocation-Token, X-ReachAI-Trace-Id, X-ReachAI-Run-Id, and the business identity headers required by the service.reachai.project.base-url points to a gateway or ingress, route /reachai/registry/** to the business service that contains reachai-spring-boot2-starter. Preserve X-ReachAI-App-Key, X-ReachAI-Timestamp, X-ReachAI-Nonce, and X-ReachAI-Signature.POST /reachai/registry/capabilities/sync bypass normal business login/JWT filters and CSRF so the request reaches the Starter controller. Apply the equivalent exclusion for Spring Security, Sa-Token, Shiro, or custom interceptors. Do not remove authentication from the endpoint: the Starter must still validate the ReachAI registry signature and return 401 for invalid requests./api/reachai/embed-token.ReachAiEmbedTokenClient. Business code maps the current authenticated user to ReachAiEmbedPrincipal and forwards the SDK-owned page identity; the client owns project signing, transport, and wrapped data.token parsing./api/reachai/embed-token on the normal business login token path. It reads the current business user and exchanges that identity for a ReachAI embed token./api/reachai/embed/**. This path carries ReachAI embed tokens, so business OAuth/JWT filters must not validate it as a business login token; forward Authorization: Bearer <embedToken> unchanged to ReachAI.permitAll() on /api/reachai/embed/ is not enough by itself: the resource server can still try to authenticate the Bearer <embedToken> before routing and return 401. Add a higher-priority SecurityWebFilterChain with securityMatcher(ServerWebExchangeMatchers.pathMatchers("/api/reachai/embed/")) that permits all and does not enable oauth2ResourceServer() for that matcher.IgnoreUrlsRemoveJwtFilter, RemoveJwtFilter, RemoveRequestHeader=Authorization, or security filters that call mutate().header("Authorization", ""). Do not apply that header-clearing behavior to /api/reachai/embed/**; skipping business authentication must still preserve the embed token Authorization header./api/reachai/embed/**, dedupe duplicate CORS response headers when both the gateway and ReachAI write them. A typical route filter is DedupeResponseHeader=Access-Control-Allow-Origin Access-Control-Allow-Credentials, RETAIN_FIRST.domainContext.implementationGuidance.projectCopilotKeySlug as the front-end agentId; ReachAI Control owns idempotent Agent/Supervisor provisioning before handoff. Do not request a project key from the user or call project-key provisioning APIs from the task.manifest.agentProvisioning.provisionAgentUrl remains available to an AI coding tool, local shell, or server-side integration. It is idempotent and creates or reuses the project page copilot Agent, selects an active LLM model, and publishes an ACTIVE AgentScope Supervisor config. It does not create a placeholder Workflow.manifest.agentSupervisor.endpoints.workflowToolAttachUrlTemplate; the attach operation publishes the next Agent config version containing that Workflow-as-Tool.replaceWorkflowId; ReachAI removes only that entry and preserves every other Workflow. Never infer replacement from pageKey, name, or display order.PAGE_ASSISTANT for page behavior and a read-only GENERAL Workflow for the API chain. Agent risk is declared per attached Workflow, not per branch inside one mixed graph.aiCodingKey to the business front end.appSecret into browser code.manifest.agentProvisioning.provisionAgentUrl from browser runtime code. Use the already provisioned bare JSON agent.keySlug as agentId (not data.agent.keySlug).@reachai/embed-chat for browser embedding when available. Configure apiBase as the ReachAI platform origin by default; if the browser uses a gateway prefix, set embedPathPrefix such as /api/reachai/embed, or set apiBase directly to a recognized embed root such as /api/reachai/embed.projectCode, agentId, and a tokenProvider that calls the business gateway token broker. Use the already provisioned page copilot Agent keySlug for agentId.pageKey, pageInstanceId, route, and origin from the @reachai/embed-chat tokenProvider context and forward them unchanged through the business token broker. The SDK reuses the same Page Bridge identity for Chat Session creation and page actions.createEafPageBridge({ onNavigate }) adapter. Validate the requested target against the business route registry, use the normal router to navigate, then call chat.rebindPage({ bridge, page }) from the target page only after its actions are registered. Do not register or hard-code the reserved navigation action key, session id, or navigation request id; the public SDK owns those details.pageInstanceId in the token provider or business broker. A replacement UUID may make token exchange pass while causing Chat Session or Page Action identity mismatch.@reachai/embed-chat/style.css, mount one visible global launcher, and keep the SDK's visible-first Token state: Token Broker pending/failure must remain visible and retryable instead of being replaced by a business-side hidden failure./api/reachai/embed/**, /api/embed/chat/sessions, and message APIs.POST /api/embed/chat/sessions/{sessionId}/messages or the /messages/stream variant with body { "message": "..." }.{ "content": "..." }, { "text": "..." }, or { "question": "..." }; map any business UI field to message at the ReachAI API boundary.code/message describe transport status only; never render top-level message: "success" as the assistant reply. Render data.answer first, with old-shape fallback only under data.reply, data.message, or data.content.message.completed; there is no done event.references/platform-apis.md for ApiResult vs bare JSON response shapes and apiBase rules.data.metadata.pageActionQueue as the preferred UI/Page Action queue. Treat data.uiRequest and data.uiRequest.extension.pageActionRequest as compatible single-action instructions. Execute them through the page bridge and report each request id back to /api/embed/chat/sessions/{sessionId}/page-actions/{requestId}/result; do not only render data.answer.references/page-action-contract.md. For Angular, reuse references/angular-page-action.md and templates/angular/ rather than inventing a second bridge protocol.powershell -File scripts/reachai-page-actions.ps1 -Mode scaffold-angular -FrontendRoot <frontend> -PageKey <pageKey>.
Adapt the generated registry example to the page's real component methods. Scaffolding is not runtime verification.
powershell -File scripts/reachai-page-actions.ps1 -Mode verify-static -FrontendRoot <frontend> -PageKey <pageKey> -ActionKeys <keys>.
A static PASS proves only source alignment; use an authenticated browser and a fresh Embed session before reporting runtime PASS. Use only an existing authorized business-system test session or account supplied outside ReachAI. If none is available, keep browserVerification null and report browser acceptance as NOT RUN; never fabricate evidence or place login credentials in task artifacts.
expiresIn boundary. If a session or message request returns embed token is expired, clear the cached embed token, call the broker again, and retry once.10. Run the smallest meaningful verification commands for the touched backend, gateway, and front-end modules.
11. Call the manifest's sdkAccessCheckUrl only after local compile/config succeeds, or explain why a live check cannot run.
CODE_READY requires observed Starter registration, RUNTIME_READY requires a fresh instance heartbeat, and SDK_CALLBACK_READY requires a successful signed callback plus a received capability snapshot.CODE_READY and RUNTIME_READY are observed, explicitly call POST <taskRoot>/verifications/SDK_SYNC with the task Bearer token. No body is required. This operation is project-scoped, succeeds only for a RUNNING onboarding task, and writes a verification event back to the task.E2E_READY remains pending until ReachAI observes an authorized Embed session, user message and assistant reply created after the current task started. The session may come from the real browser SDK or from reachai-doctor --mode e2e using a business-supplied test Authorization/Cookie; doctor never mints or mocks the business identity. This proves only the authorized conversation protocol: declared Workflow capability nodes and Page Actions need their own exact-Trace / real-browser evidence in the Page Workbench. Final launcher visibility and interaction quality remain user acceptance items.12. For a task handoff, follow protocolGuide.eventStateRules and write real STARTED / PROGRESS events to the current task. While the task is WAITING_USER, you may report work that does not depend on the answer with PROGRESS; it preserves WAITING_USER and every open question. Submit blocking ambiguities through /questions, poll for the user's answer, then write RESUMED only after all answers have been read. Before submission, run the Bootstrap-provided Test-ReachAiArtifact -Content <artifact-content> local schema check; Send-ReachAiArtifact runs the same check again before posting. Finish by submitting exactly one artifact matching the JSON Schema in task context; never invent success evidence.
13. Report changed files, commands run, results, SDK sync verification status, the observed SDK sync callback target, its route/login/CSRF handling, optional scan package choices, gateway route/token broker status, front-end integration status, and whether the user-scoped secret still needs to be configured.
references/java-sdk-api-reference.md;then use references/java-sdk-access.md for placement, configuration and
runtime boundaries.
references/platform-apis.md.references/embed-chat-quick-reference.md.references/gateway-examples.md and reuse the copy-ready files under examples/gateway/.references/security.md.references/page-action-contract.md.references/angular-page-action.md.templates/.scripts/verify-reachai-access.py.node scripts/reachai-doctor.mjs --mode static --business-root <repo> and then node scripts/reachai-doctor.mjs --mode runtime --manifest-url <onboardingManifestUrl> after services are available. For /api/ai-coding/projects/**, put the project AI Coding key in the current process environment variable REACHAI_AI_CODING_KEY; never pass the key as a command-line argument. Use --ai-coding-key-env <name> only when the repository already uses another secret environment variable name.REACHAI_E2E_AUTHORIZATION or the business Cookie header in REACHAI_E2E_COOKIE, then run node scripts/reachai-doctor.mjs --mode e2e --broker-url <business-origin>/api/reachai/embed-token --embed-api-base <business-origin>/api/reachai/embed --agent-id <provisioned-key-slug> --page-key <page-key> --route <route>. Never put authorization values on the command line or into task events/artifacts. EMBED_CONVERSATION_E2E=PASS proves only the authorized broker/proxy/session/message protocol; doctor deliberately leaves WORKFLOW_CAPABILITY_E2E and PAGE_ACTION_BROWSER_E2E as PENDING until real intent and real browser evidence are available. It does not prove launcher visibility.scripts/set-reachai-registry-secret.ps1. It stores the value in the current Windows user environment and never prints it; start a new terminal/process before launching the business service.scripts/reachai-page-actions.ps1.End with:
REACHAI_REGISTRY_APP_SECRET still needs to be configured outside the repository.Take w8123/reachai-onboarding from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.
The instructions reference npm.
Without those the skill loads but fails at the first command.