Agent skill
creating-a-model
Install this agent skill to your Project
npx add-skill https://github.com/ChromeDevTools/devtools-frontend/tree/main/.agents/skills/creating-a-model
SKILL.md
---
name: devtools-model-management
description: Guidelines for creating, migrating, and registering models in front_end/models/. Covers BUILD.gn, devtools_grd_files.gni, and entrypoints.
---
# Creating or Migrating a Model in DevTools
This guide outlines the standard procedure for creating a new model or migrating an existing one to `front_end/models/`.
## 0. Preparation (Before you start)
* **Baseline:** Run existing tests for the code you are moving to ensure they pass *before* you touch anything.
* `npm run test -- front_end/<old_location>`
* **Impact Analysis:** Search for usages of the class/file to understand the scope of refactoring.
* `grep -r "ClassName" front_end/`
## 1. File Structure
* **Location:** `front_end/models/<model_name>/` (must be lowercase).
* **Entrypoint:** Create a barrel file `front_end/models/<model_name>/<model_name>.ts` that exports the model's public API.
* **Implementation:** The actual logic goes in `<ClassName>.ts`.
* **Tests:** Unit tests go in `<ClassName>.test.ts` alongside the implementation.
## 2. Build Configuration (`BUILD.gn`)
Every model requires a `BUILD.gn` file in its directory with three specific targets:
1. **`devtools_module("<model_name>")`**: Lists implementation source files (`sources`) and dependencies (`deps`).
* **Crucial:** Do NOT include the barrel file (`<model_name>.ts`) in `sources`.
2. **`devtools_entrypoint("bundle")`**: Defines the barrel file (`entrypoint = "<model_name>.ts"`).
* **Crucial:** Must depend on the module target: `deps = [ ":<model_name>" ]`.
3. **`ts_library("unittests")`**: Lists test files and test-only dependencies.
* **Crucial:** Must depend on the bundle: `deps = [ ":bundle" ]`.
## 3. Global Registration (Crucial)
The build system does not auto-detect new modules. You must manually register them in **`config/gni/devtools_grd_files.gni`**:
* **Bundled (Release) Build:** Add the new barrel file path (e.g., `front_end/models/<model_name>/<model_name>.js`) to the `grd_files_bundled_sources` list.
* **Unbundled (Debug) Build:** Add all other implementation files (e.g., `front_end/models/<model_name>/<ClassName>.js`) to the `grd_files_unbundled_sources` list.
* **Test Runner:** Add the new model's unittest target (e.g., `models/<model_name>:unittests`) to the `deps` list in **`front_end/BUILD.gn`**.
## 4. Refactoring Imports & Exports
* **Consumers:** Update all files importing the model to use the new entrypoint:
`import * as ModelName from '../../models/<model_name>/<model_name>.js';`
* **Old Barrel File (Migration only):** If moving a file, **remove** its export from the original directory's barrel file (e.g., `front_end/panels/elements/elements.ts`).
* **Internal Imports:** Files *within* the model directory must import each other via relative paths (e.g., `./OtherClass.js`), **never** via the model's own barrel file.
## 5. Verification Checklist
1. **Build:** `autoninja -C out/Default` (Ensures BUILD.gn and GRD files are correct).
2. **Lint:** `npm run lint` (Checks style and formatting).
3. **Test:**
* `npm run test -- front_end/models/<model_name>` (New tests).
* `npm run test -- front_end/<old_location>` (Regression check for previous owner).
## Common Pitfalls
* **Circular Dependencies:** Occur when internal files import from the directory's own barrel file.
* **Missing Tests:** Failing to add the target to `front_end/BUILD.gn` means tests exist but never run.
* **Legacy Exports:** Forgetting to remove the class from the old location's `files` or `exports` allows old patterns to persist.
* **Build Errors:** Including the barrel file in `devtools_module` sources causes duplicate definition errors.
Recommended Agent Skills
Expand your agent's capabilities with these related and highly-rated skills.
devtools-ui-widgets
Guidelines for building UI widgets using the MVP architecture in DevTools. Covers Widget lifecycle, lit-html views, and state management.
devtools-version-control
Use when managing branches, creating and uploading CLs, or handling stacked changes in the DevTools Gerrit-based workflow.
devtools-imports
Conventions for importing code in Devtools to avoid build errors. Covers cross-module imports, internal imports, and the "import * as" requirement.
devtools-module-merging
Workflow for merging a DevTools submodule into its parent module. Covers BUILD.gn consolidation and updating devtools_grd_files.gni.
verification
memory-leak-debugging
Diagnoses and resolves memory leaks in JavaScript/Node.js applications. Use when a user reports high memory usage, OOM errors, or wants to analyze heapsnapshots or run memory leak detection tools like memlab.
Didn't find tool you were looking for?