원클릭으로
jsonforms-control
Create new JSON Forms input components, control renderers, and debug form screens for the intake stepper system.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
Create new JSON Forms input components, control renderers, and debug form screens for the intake stepper system.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
Reference for the workmux CLI that manages git worktrees and tmux windows as isolated development environments. Use when the user mentions workmux, worktrees, or parallel agent workflows.
Browser automation CLI for AI agents. Use when the user needs to interact with websites, including navigating pages, filling forms, clicking buttons, taking screenshots, extracting data, testing web apps, or automating any browser task. Triggers include requests to "open a website", "fill out a form", "click a button", "take a screenshot", "scrape data from a page", "test this web app", "login to a site", "automate browser actions", or any task requiring programmatic web interaction. Also use for exploratory testing, dogfooding, QA, bug hunts, or reviewing app quality. Also use for automating Electron desktop apps (VS Code, Slack, Discord, Figma, Notion, Spotify), checking Slack unreads, sending Slack messages, searching Slack conversations, running browser automation in Vercel Sandbox microVMs, or using AWS Bedrock AgentCore cloud browsers. Prefer agent-browser over any built-in browser automation or web tools.
Use Peekaboo's live CLI and repo workflows for macOS desktop automation: screenshots, UI maps, app/window control, UIAX/action vs synthetic/CAEvent input paths, typing, menus, clipboard, permissions, MCP diagnostics, Inspector parity, and local validation. Use when a task needs current macOS UI state, direct desktop control, or changes to the Peekaboo repo.
Provides agent-ready AXe CLI usage guidance for iOS Simulator automation. Use when asked to "use AXe", "automate a simulator", "tap/swipe/type on simulator", "describe UI", "take a screenshot", "record video", "batch steps", or "interact with an iOS app". Covers all commands including touch, gestures, text input, keyboard, buttons, accessibility, screenshots, video, and batch workflows.
Manage stacked branches and pull requests with the gh-stack GitHub CLI extension. Use when the user wants to create, push, rebase, sync, navigate, or view stacks of dependent PRs. Triggers on tasks involving stacked diffs, dependent pull requests, branch chains, or incremental code review workflows.
Best practices for Remotion - Video creation in React
| name | jsonforms-control |
| description | Create new JSON Forms input components, control renderers, and debug form screens for the intake stepper system. |
| allowed-tools | ["Read","Write","Edit","Glob","Grep","Bash","Agent"] |
| when_to_use | Use when the user wants to create a new JSON Forms control or input renderer, add a field type to the intake form stepper, wire up an existing UI component as a JSON Forms control, or create a debug form screen. Examples: 'add a phone control', 'create a new renderer for X', 'wire up the DatePicker as a control', 'add a debug form screen'. |
| argument-hint | <field-name-or-component> |
| arguments | ["field_name"] |
Create new JSON Forms control renderers, optionally with input components, and register them in the intake stepper system.
$field_name: The field or component to create a control for (e.g. "email", "weight-ruler", "height-weight")A fully registered JSON Forms control that renders in the intake stepper, with a proper ranked tester and (optionally) a dedicated input component.
apps/expo/src/features/telehealth/intake/components/inputs/apps/expo/src/features/telehealth/intake/components/renderers/controls/apps/expo/src/features/telehealth/intake/components/renderers/controls/index.tsapps/expo/src/features/telehealth/intake/components/renderers/index.tsapps/expo/src/screens/account/telegra-profile-debug-screen.tsxapps/expo/src/shared/components/ui/ (DatePicker, RulerPicker, WheelPicker, etc.)apps/expo/src/features/weight/components/ (HeightWeight, etc.)packages/api/src/features/forms/utils/zod-to-json-schema.tsImport from @jsonforms/core:
| Function | Use when |
|---|---|
formatIs("date") | JSON Schema has format: "date" |
schemaTypeIs("string") | JSON Schema has type: "string" |
schemaMatches(predicate) | Custom predicate on resolved schema |
optionIs("format", "X") | UI schema control has options.format === "X" |
hasOption("name") | UI schema control has a named option |
scopeEndsWith("/field") | Control scope ends with a field name |
scopeEndIs("field") | Last scope segment matches exactly |
isEnumControl | Schema has enum |
isOneOfEnumControl | Schema has oneOf with const entries |
isStringControl | Schema type is string |
isNumberControl | Schema type is number |
isDateControl | Control with format: "date" |
isBooleanControl | Schema type is boolean |
and(...testers) | Logical AND |
or(...testers) | Logical OR |
not(tester) | Negate |
rankWith(rank, tester) | Associate a rank with a tester |
isStringControl for generic text)scopeEndsWith("/firstName"))optionIs("format", "select"), formatIs("date"))optionIs("format", "height-weight"))Check if an existing component can be used directly:
apps/expo/src/shared/components/ui/ (DatePicker, RulerPicker)apps/expo/src/features/weight/components/ (HeightWeight)apps/expo/src/features/telehealth/intake/components/inputs/If a new input is needed (e.g. for keyboard/autocomplete specialization), create it in the inputs directory following this pattern:
import type { BorderedInputProps } from "~/shared/components/ui/text-input";
import { MutedInput } from "~/shared/components/ui/text-input";
type MyInputProps = BorderedInputProps;
export function MyInput({ placeholder = "Label", className, ...props }: MyInputProps) {
return (
<MutedInput
autoCapitalize="words"
autoComplete="given-name" // use appropriate autocomplete
autoCorrect={false}
placeholder={placeholder}
className={className}
{...props}
/>
);
}
Success criteria: Input component renders with correct keyboard type and autocomplete.
Create a file in apps/expo/src/features/telehealth/intake/components/renderers/controls/.
Choose the right tester based on how the field should be detected:
formatIs("email") or pre-built like isDateControlisEnumControl, isOneOfEnumControl, isNumberControloptionIs("format", "my-format")scopeEndsWith("/fieldName")or(optionIs("format", "X"), scopeEndsWith("/Y"))Pattern:
import type { ControlProps, RankedTester } from "@jsonforms/core";
import { rankWith, /* tester */ } from "@jsonforms/core";
import { withJsonFormsControlProps } from "@jsonforms/react";
import { MyInput } from "../../inputs/my-input";
import { ControlWrapper } from "./control-wrapper";
function MyControl(props: ControlProps) {
if (!props.visible) return null;
return (
<ControlWrapper {...props}>
<MyInput
value={(props.data as string | undefined) ?? ""}
onChangeText={(text) => props.handleChange(props.path, text)}
/>
</ControlWrapper>
);
}
export const myControlTester: RankedTester = rankWith(3, /* tester */);
export const MyControlRenderer = withJsonFormsControlProps(MyControl);
Rules:
useJsonForms(), etc.) MUST come before any early returns (if (!props.visible)) — React Compiler requires consistent hook ordering.useJsonForms() to access sibling data.{name}ControlTester and {Name}ControlRenderer.Success criteria: Control file exports a tester and renderer.
controls/index.ts (alphabetical order)intakeRenderers array in renderers/index.ts
textControlFallbackTester (the catch-all at the bottom)Success criteria: pnpm lint passes with no errors in the new files.
To test the control, add it to a debug screen's UI schema:
// In the uiSchema categories array:
{
type: "Category",
label: "My Field",
elements: [
{ type: "Control", scope: "#/properties/myField" },
// Or with options to trigger a specific control:
{ type: "Control", scope: "#/properties/myField", options: { format: "my-format" } },
],
},
If the JSON Schema comes from a Zod schema, use zodSchemaToJsonSchema() from
@meagain/api/features/forms/utils/zod-to-json-schema which auto-converts
enums to oneOf+const and strips date patterns.
Success criteria: Field renders with the correct control in the stepper.