{"id":88365,"plugin_id":"plugin_asdk_app_6aeb84a0215c81918c231637cacd7207","kind":"skill","collection_source":"plugin_package","comparison_source":null,"observed_at":"2026-11-10T00:10:03.852Z","digest":"20fd7f673bcdea58bab11f68bffe83862811736f960cf80db35d0e5fc9e93cf9","against":null,"payload":{"description":"Build or update ToolJet dashboards, internal tools, back-office and team operations apps, including spreadsheet replacements. Requires a ToolJet MCP connection. Excludes one-off spreadsheet analysis, static charts, advice-only comparisons and standalone code projects outside ToolJet.","included_files":[{"relative_path":"references/catalog/Accordion.json","size_in_bytes":5460},{"relative_path":"references/catalog/AudioRecorder.json","size_in_bytes":4356},{"relative_path":"references/catalog/BoundedBox.json","size_in_bytes":2606},{"relative_path":"references/catalog/Button.json","size_in_bytes":7649},{"relative_path":"references/catalog/ButtonGroupV2.json","size_in_bytes":9718},{"relative_path":"references/catalog/Calendar.json","size_in_bytes":7147},{"relative_path":"references/catalog/Camera.json","size_in_bytes":3769},{"relative_path":"references/catalog/Cascader.json","size_in_bytes":13481},{"relative_path":"references/catalog/Chart.json","size_in_bytes":4355},{"relative_path":"references/catalog/Chat.json","size_in_bytes":8776},{"relative_path":"references/catalog/Checkbox.json","size_in_bytes":5622},{"relative_path":"references/catalog/CircularProgressBar.json","size_in_bytes":5073},{"relative_path":"references/catalog/CodeEditor.json","size_in_bytes":2341},{"relative_path":"references/catalog/ColorPicker.json","size_in_bytes":6868},{"relative_path":"references/catalog/Container.json","size_in_bytes":4865},{"relative_path":"references/catalog/CurrencyInput.json","size_in_bytes":7906},{"relative_path":"references/catalog/CustomComponent.json","size_in_bytes":1798},{"relative_path":"references/catalog/DatePickerV2.json","size_in_bytes":9643},{"relative_path":"references/catalog/DaterangePicker.json","size_in_bytes":9628},{"relative_path":"references/catalog/DatetimePickerV2.json","size_in_bytes":10452},{"relative_path":"references/catalog/Divider.json","size_in_bytes":2573},{"relative_path":"references/catalog/DropdownV2.json","size_in_bytes":11024},{"relative_path":"references/catalog/EmailInput.json","size_in_bytes":7584},{"relative_path":"references/catalog/FileButton.json","size_in_bytes":6773},{"relative_path":"references/catalog/FileInput.json","size_in_bytes":7204},{"relative_path":"references/catalog/FilePicker.json","size_in_bytes":7565},{"relative_path":"references/catalog/FlexContainer.json","size_in_bytes":4302},{"relative_path":"references/catalog/Form.json","size_in_bytes":11015},{"relative_path":"references/catalog/Html.json","size_in_bytes":2944},{"relative_path":"references/catalog/IFrame.json","size_in_bytes":3365},{"relative_path":"references/catalog/Icon.json","size_in_bytes":3256},{"relative_path":"references/catalog/Image.json","size_in_bytes":5844},{"relative_path":"references/catalog/JSONEditor.json","size_in_bytes":4945},{"relative_path":"references/catalog/JSONExplorer.json","size_in_bytes":5039},{"relative_path":"references/catalog/Kanban.json","size_in_bytes":9729},{"relative_path":"references/catalog/KeyValuePair.json","size_in_bytes":14424},{"relative_path":"references/catalog/Link.json","size_in_bytes":5363},{"relative_path":"references/catalog/Listview.json","size_in_bytes":8435},{"relative_path":"references/catalog/Map.json","size_in_bytes":4421},{"relative_path":"references/catalog/ModalV2.json","size_in_bytes":12047},{"relative_path":"references/catalog/ModuleContainer.json","size_in_bytes":1099},{"relative_path":"references/catalog/ModuleViewer.json","size_in_bytes":1250},{"relative_path":"references/catalog/MultiselectV2.json","size_in_bytes":11762},{"relative_path":"references/catalog/Navigation.json","size_in_bytes":8303},{"relative_path":"references/catalog/NumberInput.json","size_in_bytes":8821},{"relative_path":"references/catalog/PDF.json","size_in_bytes":1824},{"relative_path":"references/catalog/Pagination.json","size_in_bytes":3342},{"relative_path":"references/catalog/PasswordInput.json","size_in_bytes":7073},{"relative_path":"references/catalog/PhoneInput.json","size_in_bytes":7261},{"relative_path":"references/catalog/PopoverMenu.json","size_in_bytes":7950},{"relative_path":"references/catalog/ProgressBar.json","size_in_bytes":4637},{"relative_path":"references/catalog/QrScanner.json","size_in_bytes":951},{"relative_path":"references/catalog/RadioButtonV2.json","size_in_bytes":8208},{"relative_path":"references/catalog/RangeSliderV2.json","size_in_bytes":6639},{"relative_path":"references/catalog/ReorderableList.json","size_in_bytes":4626},{"relative_path":"references/catalog/RichTextEditor.json","size_in_bytes":2852},{"relative_path":"references/catalog/Spinner.json","size_in_bytes":974},{"relative_path":"references/catalog/StarRating.json","size_in_bytes":6454},{"relative_path":"references/catalog/Statistics.json","size_in_bytes":9071},{"relative_path":"references/catalog/Steps.json","size_in_bytes":6349},{"relative_path":"references/catalog/SvgImage.json","size_in_bytes":1239},{"relative_path":"references/catalog/Table.json","size_in_bytes":29235},{"relative_path":"references/catalog/Tabs.json","size_in_bytes":10506},{"relative_path":"references/catalog/Tags.json","size_in_bytes":6045},{"relative_path":"references/catalog/TagsInput.json","size_in_bytes":9172},{"relative_path":"references/catalog/Text.json","size_in_bytes":7686},{"relative_path":"references/catalog/TextArea.json","size_in_bytes":7835},{"relative_path":"references/catalog/TextInput.json","size_in_bytes":8404},{"relative_path":"references/catalog/TimePicker.json","size_in_bytes":7610},{"relative_path":"references/catalog/Timeline.json","size_in_bytes":2466},{"relative_path":"references/catalog/Timer.json","size_in_bytes":1816},{"relative_path":"references/catalog/ToggleSwitchV2.json","size_in_bytes":5127},{"relative_path":"references/catalog/TreeSelect.json","size_in_bytes":12056},{"relative_path":"references/catalog/VerticalDivider.json","size_in_bytes":1786},{"relative_path":"references/catalog/_index.json","size_in_bytes":6182},{"relative_path":"references/components.md","size_in_bytes":17776},{"relative_path":"references/datasources.md","size_in_bytes":24634},{"relative_path":"references/events.md","size_in_bytes":8848},{"relative_path":"references/forms.md","size_in_bytes":18870},{"relative_path":"references/migration.md","size_in_bytes":5243},{"relative_path":"references/qa.md","size_in_bytes":11750},{"relative_path":"references/security.md","size_in_bytes":3568},{"relative_path":"references/tables.md","size_in_bytes":14366},{"relative_path":"references/themes.md","size_in_bytes":14348},{"relative_path":"references/ui-layout.md","size_in_bytes":35747},{"relative_path":"references/workflow-builder.md","size_in_bytes":5895},{"relative_path":"references/workflows.md","size_in_bytes":48277},{"relative_path":"scripts/browser-audit.js","size_in_bytes":9317}],"name":"tooljet-app-builder","skill_md_contents":"---\nname: tooljet-app-builder\ndescription: \"Build or update ToolJet dashboards, internal tools, back-office and team operations apps, including spreadsheet replacements. Requires a ToolJet MCP connection. Excludes one-off spreadsheet analysis, static charts, advice-only comparisons and standalone code projects outside ToolJet.\"\nmetadata:\n  generated_by: scripts/generate-skill.mjs\n  sources: >-\n    Source-verified component binding rules (22 components);\n    ToolJet WidgetManager catalog (74 built-in components);\n    ToolJet appCanvasConstants (grid mechanics)\n---\n\n<!-- GENERATED FILE — do not edit by hand. Run `node scripts/generate-skill.mjs` to regenerate every host package. -->\n\n# ToolJet app builder\n\nBuild only what ToolJet's real components, connected datasources, and MCP tools support. Never invent a property, action, integration, or successful result. User requirements override the adaptable quality defaults in the references.\n\nUse the selected ToolJet connection's tools; ask if missing or ambiguous. This skill never configures credentials.\n\n## Existing app or website migrations\n\nFor migration/clone/replacement requests, first read `references/migration.md`. Discover expanded states, relationships and read-only journeys—not just screenshots. Map source coverage to ToolJet and report gaps. Skip this workflow for ordinary builds or visual-only inspiration.\n\n## Core workflow\n\n1. Call `list_workspaces`; if several exist, confirm and switch before creating anything. Decide the page architecture before components. A simple single-job app can stay on one page; separate substantial jobs into focused pages; add an overview only when cross-workflow orientation or decisions need it.\n2. Treat 3+ substantive pages, 2+ complex workflows, a multi-table model, or multiple integrations as a large build. Before mutations, show the page/phase plan and rough time ranges, then ask for phased checkpoints (recommended) or the whole app in one run. Do not re-ask if the user already chose.\n3. State the short design brief with the page plan before create_app (references/ui-layout.md): the user's job, dominant surface, relevant emphasis, and theme. Resolve the theme using `references/themes.md`: honor explicit design, selected themes, else derive from brand or use case (short prompts have one); ToolJet Modern only if asked. Pass the resolved `theme` to `create_app`, preserve its ids and links, then call `list_datasources`. Report any `theme.warning`. Fetch only the component, event-action, and datasource contracts needed for the current phase, using one selective batch per contract class, and reuse them. Request exact `sections` and `property_keys`/`style_keys`, not broad full contracts. Confirm a new data model before creating it; ToolJet DB table names are at most 31 characters.\n4. Implement that brief as a complete useful phase with stable `client_ref` values. Root components omit `parent` and `slot_name`; page ids are not component parents. Await `lint_app_spec` as a standalone barrier, fix its errors and review warnings, then pass its one-time `plan_token` to `apply_app_phase`. Never run the linter alongside a write. Put planned persisted component definition patches in `component_updates`; use targeted update tools for ad-hoc repairs, never duplicate resources or rebuild the app. After an error, inspect it and change the repair—never replay an identical mutation.\n5. Verify each completed page/primary flow using `references/qa.md`. For detailed requests, reconcile a compact requirement-to-implementation ledger at these checkpoints (`references/workflows.md`); page count is not feature coverage. Static validation does not prove runtime query behavior, rendering, or event delivery.\n6. Share `editor_url` while authoring. After the first meaningful page works, open `viewer_url` in the built-in browser when available and reuse that tab. The final handoff is at most 120 words: both links, what works, one line of limitations.\n\n## Design quality — required outcomes, flexible composition\n\nBuild a polished, contemporary 2026 product UI even from a short prompt: legible hierarchy, coherent theme surfaces, intentional density, clear actions and complete states. \"Modern\" is a quality bar, not a demand for gradients, glass, oversized cards or a fixed template. Do not claim production readiness from appearance.\n\n- **Resolve the design source:** explicit requirements/design system → existing or selected theme → recognizable brand → use case/industry/audience → ToolJet Modern. Preserve chosen themes, even on empty shells. For brand-led designs, map identity to visible component treatments—not just saved tokens (references/themes.md).\n- **Design the job, not a generic dashboard.** Identify the user's main decision and next action, then choose the dominant surface: agenda, review split-view, queue, map, board, analytics or form. Infer supporting views from the task and available data; a dashboard can need trends without the user naming charts. Do not invent metrics, records, capabilities or unrelated workflows.\n- **Freedom with purpose.** Derive headers, region proportions, typography, accents and density from the work; do not select a palette or composition merely because it appears in an example. ToolJet themes store the resulting design tokens, not a menu of allowed designs. Zero KPIs is valid. No fixed KPI count, root-component budget, mandatory overview, all-white-card rule or universal header position applies. Familiar patterns are welcome when justified; industry identity must affect information hierarchy, not just colour.\n- **HTML where it helps.** Use theme-aware Html for read-only summaries when helpful; headers and KPIs can be native. Keep controls, charts, tables and interactions native. Read references/ui-layout.md for background and escaping safeguards.\n- **Finish the workflow.** Format values for the user's locale, give states readable labels, and provide loading, empty, error and disabled states with useful recovery. Size content to fit; use intentional spacing and accessible contrast. Before handoff, check relevance, hierarchy, interaction and actual rendering—not merely whether lint passed.\n\n## Render safety\n\nDetail: `references/qa.md`.\n\n- Nested canvases have **43 local columns**, regardless of outer width. Container/Form/modal inset left/width:2/39; grid-mode Listview full-row left/width:0/43.\n\n- **One line per binding.** A line break anywhere inside `{{ }}` makes the whole binding render empty. Multi-line logic goes in a JavaScript query; never a literal backslash-n or code outside its braces.\n- **Modal and form children are parented to the modal or form**, never placed at root at its coordinates. `add_components` refuses overlaps.\n- **Navigation is the page menu** (`navigation_position`), never an `Html` sidebar with buttons on it.\n- **Items are authored, never defaulted**: `Tabs` (`tabItems`), `Steps` and `Kanban` without items render placeholders.\n- **Text fits its box**: size labels, values, captions and table columns for their rendered content; keep titles readable and let longer detail wrap within a deliberately sized region. Bind only fields the query returns.\n- **Toolbar buttons align with the field box**: a top-labelled input renders its label in its first 20px, so the row's button sits at the inputs' top + 20, height 40.\n- **Audit every page as rendered before the handoff** with `verify_page_render` (or the `references/qa.md` checks when it is unavailable) and fix everything it names; an unaudited page is not finished.\n\n## Datasource repair handoff\n\n**Sample data source is forbidden for AI**, even on request. Use ToolJet Database; synthetic rows are allowed.\n\nFor absent/failing sources, use `datasources_url`, `settings_url`, or `recovery.url`. Open it in the built-in browser when available; otherwise send the link. Never enter credentials, authorize OAuth, test, or save connections. For `connectable` sources, stop and hand off; if absent, report no connector and suggest REST API. See `references/datasources.md`.\n\n## Load only the references the phase needs\n\n- `references/workflows.md` — tool selection, plan/apply, repair, reuse, deletion, silent-failure guardrails, FX visibility.\n- `references/workflow-builder.md` — link workflows to apps, workflow discovery, authoring, validation, and execution safety.\n- `references/ui-layout.md` — page design, canvas geometry, nested layouts, charts, and visual defaults.\n- `references/tables.md` — Table binding, row actions, sizing, and datasource-neutral server-side pagination.\n- `references/forms.md` — generated-vs-standalone forms, validation, uploads, and modal geometry.\n- `references/events.md` — component/query/page events, mutation lifecycles, loading, empty, error, and success states.\n- `references/datasources.md` — connection recovery, exact query shapes, schema introspection, ToolJet DB, SQL, large reads, and billable reads.\n- `references/security.md` — authorization boundaries, current-user variables, permissions, and sensitive/destructive operations.\n- `references/qa.md` — static checks, safe runtime checks, the browser audit, triage, and confirmation.\n- `references/components.md` — selective component palette and exact binding/rendering rules not covered by Table/Form references.\n- `references/themes.md` — workspace theme creation and management, the exact theme definition structure, app assignment, and token-backed component styling.\n\nTool schemas and warnings are authoritative. Load references as needed. Keep inspection bounded with `get_app_summary` structure or exact fields; use `detail:\"full\"` only after narrowing. Reuse results.\n\n## Non-negotiable safety\n\n- Never author or execute `SELECT *` against an unfamiliar table. Count first when size is unknown; above 1,000 rows prefer server-side pagination. Large and billable reads require separate explicit approvals.\n- Never run mutations, AI, email, OAuth, or other side effects merely to validate. Version changes require explicit intent: create only when asked, pin the returned `version_id`, and release only that exact version with `confirm:true`.\n- Seed writes are insert-only; omit generated serial keys. A duplicate-key failure is never permission to update existing rows.\n- Page/query/component/table/column deletion requires exact-target approval plus `confirm:true`, except for resources this build created itself (a diagnostic query, a scratch page): delete those before finishing rather than renaming or hiding them. Visibility is not authorization.\n- Keep app chrome controls distinct: `hide_header` hides the app header/banner; `navigation_position` places the separate generated navigation menu on the side or top; `navigation_hidden` hides that whole menu in either position; and `update_pages.hidden` hides only one non-Home page. Home cannot be hidden.\n- Batch/phase writes can partially persist. Read reported completed resources and repair in place; never auto-delete or replay the whole batch blindly.\n"},"changes":[],"summary":"First saved snapshot. No earlier version is available for comparison.","summary_kind":"deterministic","summary_metadata":{}}