SKILL.md
$27
- Add support chat to the Customware React Router client-only SPA template.
- Place a floating support launcher in an app shell.
- Place support chat as a full embedded panel in a layout region.
- Allow the support agent to help with visible app UI, such as filling a form on behalf of the user.
- Update an existing support widget placement or styling.
For the exact React implementation patterns, use references/component-usage.md.
When Not To Use
- Do not use this skill for server-side rendering work. The target template is client-only React Router SPA mode.
- Do not use this skill to build a custom chat UI.
- Do not use this skill to iframe the widget.
- Do not use this skill to call support chat endpoints directly.
- Do not use this skill for non-template React apps or non-React apps unless explicitly asked.
- Do not use this skill if
orgIdorprojectIdcannot be determined. Fail the task with a clear reason that the required Customware org/project id is missing.
Non-Negotiables
- Always render the real custom element:
<customware-chat>.
- Always pass both
org-idandproject-id.
- If either id is unavailable, fail the task with a clear missing-id reason instead of rendering placeholders or asking follow-up questions.
- Load
https://app.customware.ai/support-widget/customware-chat.jsonce fromroot.tsxor the template's equivalent React Router root document shell unless an existing app-level loader already does this.
- Do not pass task ids, domain ids, user ids, API tokens, session tokens, auth cookies, or secrets into the component.
- Use
metaonly for optional visitor identity:emailand/orname.
- Use wrapper CSS,
styleOptions, orstyle-optionsfor sizing. Do not use the native DOMstyleproperty as widget configuration.
- Tool calls are compact status badges, not buttons.
- Page operation is handled inside the widget. Do not add custom click/fill/page-control handlers around it.
- Do not hardcode page-operation prompts or values into the host app. The user must type the request into the widget.
Implementation Workflow
- Confirm the React app has
orgIdandprojectId.
- Choose the mode:
chat-bubblefor a floating support launcher/dialog.
fullfor an embedded rail, drawer, split pane, or fixed chat region.
- Add the script tag in
root.tsxor the React Router root file/component that defines the HTML document<head>, unless it already exists.
- Add JSX custom element typings in a
.d.tsfile when the template does not already know<customware-chat>.
- Render
<customware-chat>withorg-idandproject-idin the specific route or layout that needs support.
- Set optional
metaandstyleOptionsthrough a typed React ref when needed.
- For full mode, ensure the wrapper/component has a concrete height and internal scrolling belongs to the widget.
- For bubble mode, ensure the wrapper is not clipped and has an appropriate
z-index.
- Validate the resulting React code syntactically and with
npm run checkwhen available.
Use references/component-usage.md for complete code examples for each mode.
MITB Agent Constraints
- Do not assume access to Playwright, screenshots, browser DevTools, or visual testing.
- Do not claim that the widget was visually tested.
- Do not write user-facing status reports inside the generated app.
- Validate by code inspection, TypeScript/compile checks, and ensuring the generated React Router/Vite code follows the examples in references/component-usage.md.
- If runtime ids are unavailable during generation, fail the task with a clear missing-id reason. If ids are expected to load asynchronously at runtime, gate the component behind
orgId && projectIdso it never renders with placeholders.
Do Not Do
- Do not create an iframe integration.
- Do not rebuild or restyle the widget internals in React.
- Do not reach into Shadow DOM or depend on internal class names.
- Do not expose tool calls as clickable UI controls.
- Do not call the support chat API or page-operation API directly from the host app.
- Do not add fallback embed modes.
- Do not store secrets, access tokens, private payloads, or auth/session data in widget attributes.
- Do not pass arbitrary user/profile objects into
meta; pass only optionalemailandname.
- Do not set a fixed height only on an imagined internal message list. Size the whole full-mode host region.
- Do not place bubble mode inside clipped or transformed containers unless that behavior is intentional.