一键导入
build-app
Create a Datagrok application with routing, views, and data access
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Create a Datagrok application with routing, views, and data access
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Use whenever you need the Datagrok browser to actually execute JavaScript — adding viewers, filtering, modifying the view, or returning a result widget to the chat. Open this skill before calling the datagrok_exec tool.
Filter rows of a Datagrok DataFrame inside a datagrok-exec block through the Filters panel — by range, equals/contains/in-set, multi-value, boolean, free-text row expressions, or substructure (SMILES / SMARTS / molblock). Also covers clearing, inverting, the show-only-filtered vs destructive-drop split, and the filter event lifecycle (onRowsFiltering / onFilterChanged / onRowsFiltered). Use whenever the user says "filter", "show only", "hide rows where", "narrow to subset", "find rows that", "contains", "substructure search", "categorical filter", "range filter", "invert", "clear the filter", "clear filters", "drop rows", or asks for the filtered subset as a new table. Does NOT cover selection (separate skill) or generic DataFrame cloning (datagrok-df-and-columns).
Add a calculated, formula-based column to a dataframe inside a datagrok-exec block. Use whenever the user asks to compute, derive, add, or create a new column from existing columns — LipE, ratios, log/round, heavy atom count, any expression in the Datagrok formula DSL. Replaces hand-written addNewFloat/addNewInt + for-loop with a single formula-attached column that recomputes when source columns change.
Find, describe, add, remove, rename, clone, or set metadata on columns of a Datagrok DataFrame inside a datagrok-exec block. Use whenever the user asks to locate "the X column", summarize a column, add a typed/empty/values-filled/virtual column, set semantic type / units / format / friendly name, apply linear or categorical or conditional color coding, drop or rename columns, or copy a DataFrame. Covers everything in DataFrame.columns and Column.meta — but not row filtering/selection (datagrok-filtering, datagrok-selection) and not formula-only columns (datagrok-calc-column).
Sort, hide, show, reorder, resize, pin, format, and color-code columns in a Datagrok TableView grid from a datagrok-exec block. Use whenever the user asks to sort by a column (any direction), multi-sort, hide / show / reorder / pin / resize columns, freeze the first N columns, change number-format display, color-code cells (defaults and grid-only tint here; full per-type reference in datagrok-df-and-columns), set row height, or reset the grid back to defaults. Distinct from datagrok-df-and-columns (which owns column-level data metadata like semType, units, friendlyName, and is also where canonical color-coding lives) and from datagrok-viewers (which owns scatter plot / histogram / etc.). Does NOT cover filtering (`datagrok-filtering`), selection (`datagrok-selection`), custom cell renderer authoring (`create-cell-renderer`), saving / restoring layouts, or grid event handlers.
Add a viewer, configure a viewer, change viewer options, find viewer, close viewer, view a scatter plot, bar chart, histogram, line chart, box plot, pie chart, heat map, correlation plot, 3D scatter, trellis, density plot, statistics, on a Datagrok TableView inside a datagrok-exec block. Use whenever the user asks to plot, chart, visualize, show a graph, draw a distribution, color by a column, swap a viewer's axis, toggle a legend / regression line / log scale, replace one viewer with another, close every chart, reset the view to just the grid, or find an existing viewer by type. Plugin viewers like "Chem space", "sequence space", "activity cliffs" are NOT viewer types — they're registered functions — route those to `grok.functions.call`. Does NOT cover filtering (separate skill `datagrok-filtering`), selection (`datagrok-selection`), grid cell rendering (`datagrok-grid-customization`), layout save/restore, or custom-viewer authoring.
| name | build-app |
| description | Create a Datagrok application with routing, views, and data access |
| when-to-use | When user asks to create an app, application, or CRUD tool (NOT scientific/simulation apps) |
| effort | high |
Help the user create a full Datagrok application inside a package, with entry points, views, routing, and data access.
/build-app [app-name] [--in-package <package-name>]
If no package exists yet:
grok create <PackageName>
cd <PackageName>
npm install
Add an app to the package:
grok add app <AppName>
Modern Datagrok apps use the @grok.decorators.app decorator on a static method:
import * as grok from 'datagrok-api/grok';
import * as ui from 'datagrok-api/ui';
import * as DG from 'datagrok-api/dg';
export const _package = new DG.Package();
export class PackageFunctions {
@grok.decorators.app({
name: 'MyApp',
description: 'Description of the app',
icon: 'images/icons/app-icon.png',
})
static myApp(
@grok.decorators.param({options: {'meta.url': true, 'optional': true}}) path?: string
): void {
// App initialization logic
}
}
The meta.url parameter captures the URL path after the app name, enabling routing.
For apps with multiple views, define a tree browser linked to the app:
@grok.decorators.appTreeBrowser({app: 'MyApp'})
static async myAppTreeBrowser(treeNode: DG.TreeViewGroup): Promise<void> {
treeNode.item('Home').onSelected.subscribe((_) => { /* show home view */ });
const dataGroup = treeNode.group('Data');
dataGroup.item('View 1').onSelected.subscribe((_) => { /* show view 1 */ });
dataGroup.item('View 2').onSelected.subscribe((_) => { /* show view 2 */ });
}
Two valid shapes — pick one:
A. Return the view (preferred) — declare //output: view result and return it. The host places it (main view, preview tile, etc.). Never call grok.shell.addView / addPreview / set grok.shell.v inside such a function — that forces shell placement and breaks preview tiles. await the real view instead of returning a proxy and adding the real one later.
//name: My App
//output: view result
//meta.role: app
export function myApp(): DG.ViewBase {
const view = DG.View.create();
view.root.appendChild(ui.divV([ui.h1('Welcome')]));
return view;
}
B. Return void and place views yourself — for apps that orchestrate multiple shell placements (table views, dialogs). Then grok.shell.addView(...) / addTableView(...) is required.
//name: My App
//meta.role: app
export function myApp(): void {
const tv = grok.shell.addTableView(await grok.data.demo.demog(100));
tv.addViewer('Scatter plot');
}
Use ui.splitH / ui.splitV for layout.
https://<host>/apps/<APP_NAME>https://<host>/apps/<PACKAGE_NAME>/<APP_NAME>Functions | Apps in the sidebar.Database queries:
const result = await grok.data.query('PackageName:QueryName', {param1: 'value'});
REST endpoints (with CORS proxy):
const response = await grok.dapi.fetchProxy('https://api.example.com/data');
User data storage (persist settings):
await grok.dapi.userDataStorage.postValue('storeName', 'key', 'value');
const val = await grok.dapi.userDataStorage.getValue('storeName', 'key');
npm run build
grok publish dev
meta.url parameter pattern.AppTreeBrowser for apps that need multi-view navigation.grok config if they haven't published before.//meta.role: app + //output: view result functions, grok.shell.addView / addPreview / grok.shell.v = calls are bugs — strip them and return the view directly.