Skip to content

Configuration Schema

This document provides the complete schema for .starlark/config.json, the configuration file for skyls dialect support.

skyls searches for configuration in this order:

  1. .starlark/config.json (preferred)
  2. starlark.config.json (root-level alternative)
  3. Walk up parent directories looking for either file
  4. Fall back to auto-detection
{
"$schema": "https://sky.dev/schemas/starlark-config.json",
"version": 1,
"dialect": "string",
"rules": [
{
"files": ["string"],
"dialect": "string"
}
],
"dialects": {
"dialect-name": {
"builtins": ["string"],
"extends": "string"
}
},
"settings": {
"reportUndefinedNames": true,
"reportUnusedBindings": true,
"checkLoadStatements": false
}
}
PropertyValue
Typestring
RequiredNo
DefaultNone

JSON Schema URL for editor validation and autocompletion.

{
"$schema": "https://sky.dev/schemas/starlark-config.json"
}
PropertyValue
Typenumber
RequiredYes
Valid values1

Schema version number. Currently only version 1 is supported.

{
"version": 1
}
PropertyValue
Typestring
RequiredNo
DefaultAuto-detected or "starlark"

Default dialect for all files not matched by rules.

Built-in dialect values:

  • "starlark" - Core Starlark (no extensions)
  • "bazel" - Bazel build system
  • "bazel-build" - Bazel BUILD files specifically
  • "bazel-bzl" - Bazel .bzl files specifically
  • "buck2" - Buck2 build system
  • "tilt" - Tilt local development

Or any custom dialect name defined in dialects.

{
"dialect": "bazel"
}
PropertyValue
Typearray of rule objects
RequiredNo
Default[]

Ordered list of file pattern rules. First matching rule wins.

{
"rules": [
{
"files": ["Tiltfile"],
"dialect": "tilt"
},
{
"files": ["**/*.bzl"],
"dialect": "bazel-bzl"
}
]
}
FieldTypeRequiredDescription
filesstring[]YesGlob patterns to match
dialectstringYesDialect ID to apply
PropertyValue
Typeobject (map of dialect name to definition)
RequiredNo
Default{}

Custom dialect definitions.

{
"dialects": {
"my-dialect": {
"builtins": [".starlark/builtins/my.builtins.json"],
"extends": "starlark"
}
}
}
FieldTypeRequiredDescription
builtinsstring[]NoPaths to builtin definition files
extendsstringNoParent dialect to inherit from
PropertyValue
Typeobject
RequiredNo
DefaultSee individual settings

Analysis and diagnostic settings.

{
"settings": {
"reportUndefinedNames": true,
"reportUnusedBindings": true,
"checkLoadStatements": false
}
}
SettingTypeDefaultDescription
reportUndefinedNamesbooleantrueReport references to undefined names
reportUnusedBindingsbooleantrueReport unused local variables
checkLoadStatementsbooleanfalseValidate that load targets exist

The files field in rules uses glob patterns:

PatternDescriptionExample
*Match any characters except /*.bzl matches foo.bzl
**Match any characters including /**/*.bzl matches a/b/c.bzl
?Match single charactertest?.star matches test1.star
[abc]Character class[Bb]UILD matches BUILD and bUILD
[a-z]Character range[a-z].star matches a.star
{a,b}Alternatives*.{bzl,star} matches .bzl and .star
{
"rules": [
// Exact filename
{"files": ["Tiltfile"], "dialect": "tilt"},
// Extension match
{"files": ["*.bzl"], "dialect": "bazel-bzl"},
// Recursive match
{"files": ["**/*.star"], "dialect": "starlark"},
// Directory prefix
{"files": ["tilt_modules/**/*.star"], "dialect": "tilt"},
// Multiple patterns
{"files": ["BUILD", "BUILD.bazel"], "dialect": "bazel-build"},
// Alternatives
{"files": ["*.{bzl,bazel}"], "dialect": "bazel"},
// Negation (by ordering - put specific before general)
{"files": ["*_test.star"], "dialect": "test"},
{"files": ["*.star"], "dialect": "starlark"}
]
}

The builtins array supports several path formats:

Relative to the config file location:

{
"builtins": [
"builtins/tilt.builtins.json",
"../shared/common.builtins.json"
]
}

Full filesystem paths:

{
"builtins": [
"/usr/local/share/starlark/tilt.builtins.json"
]
}
{
"builtins": [
"https://example.com/builtins/v1/tilt.builtins.json"
]
}
{
"version": 1,
"dialect": "bazel"
}
{
"version": 1,
"rules": [
{
"files": ["Tiltfile", "tilt_modules/**/*.star"],
"dialect": "tilt"
}
],
"dialects": {
"tilt": {
"builtins": [".starlark/builtins/tilt.builtins.json"],
"extends": "starlark"
}
}
}
{
"version": 1,
"rules": [
{
"files": ["BUILD", "BUILD.bazel", "**/BUILD", "**/BUILD.bazel"],
"dialect": "bazel-build"
},
{
"files": ["**/*.bzl"],
"dialect": "bazel-bzl"
}
],
"dialects": {
"bazel-build": {
"builtins": [".starlark/builtins/internal-rules.builtins.json"],
"extends": "starlark"
},
"bazel-bzl": {
"builtins": [],
"extends": "bazel-build"
}
},
"settings": {
"reportUndefinedNames": true,
"reportUnusedBindings": false
}
}
{
"$schema": "https://sky.dev/schemas/starlark-config.json",
"version": 1,
"rules": [
{
"files": ["Tiltfile"],
"dialect": "tilt"
},
{
"files": ["*.bara.sky"],
"dialect": "copybara"
},
{
"files": ["tools/codegen/**/*.star"],
"dialect": "codegen"
},
{
"files": ["BUILD", "BUILD.bazel", "**/BUILD", "**/BUILD.bazel"],
"dialect": "bazel-build"
},
{
"files": ["**/*.bzl"],
"dialect": "bazel-bzl"
},
{
"files": ["**/*.star"],
"dialect": "starlark"
}
],
"dialects": {
"tilt": {
"builtins": [".starlark/builtins/tilt.builtins.json"],
"extends": "starlark"
},
"copybara": {
"builtins": [".starlark/builtins/copybara.builtins.json"],
"extends": "starlark"
},
"codegen": {
"builtins": [".starlark/builtins/codegen.builtins.json"],
"extends": "starlark"
},
"bazel-build": {
"builtins": [".starlark/builtins/custom-bazel.builtins.json"],
"extends": "starlark"
},
"bazel-bzl": {
"builtins": [],
"extends": "bazel-build"
}
},
"settings": {
"reportUndefinedNames": true,
"reportUnusedBindings": true,
"checkLoadStatements": false
}
}
{
"version": 1,
"dialect": "bazel",
"settings": {
"reportUndefinedNames": false,
"reportUnusedBindings": false
}
}
Terminal window
python3 -m json.tool .starlark/config.json > /dev/null && echo "Valid JSON"

With editors that support JSON Schema (VS Code, JetBrains IDEs), add the $schema field for validation:

{
"$schema": "https://sky.dev/schemas/starlark-config.json",
"version": 1
}

Invalid version:

{"version": 2} // Error: version must be 1

Missing required field:

{} // Error: 'version' is required

Invalid rule (missing files):

{
"rules": [{"dialect": "tilt"}] // Error: 'files' is required
}

Invalid glob pattern:

{
"rules": [{"files": ["[invalid"], "dialect": "x"}] // Error: unclosed bracket
}

If you were using starpls with --ext-paths:

Terminal window
starpls --ext-paths=.starlark/builtins

Create .starlark/config.json:

{
"version": 1,
"dialects": {
"custom": {
"builtins": [".starlark/builtins/custom.builtins.json"]
}
},
"rules": [
{"files": ["**/*.star"], "dialect": "custom"}
]
}

If you have a Hirschgarten config:

{
"version": 1,
"rules": [
{"glob": "Tiltfile", "dialectId": "tilt", "priority": 100}
],
"builtinFilesByDialect": {
"tilt": ["starlark/tilt.builtins.json"]
}
}

Convert to .starlark/config.json:

{
"version": 1,
"rules": [
{"files": ["Tiltfile"], "dialect": "tilt"}
],
"dialects": {
"tilt": {
"builtins": ["starlark/tilt.builtins.json"],
"extends": "starlark"
}
}
}

If you were using Tilt’s starlark-lsp with --builtin-paths:

Terminal window
starlark-lsp --builtin-paths=stubs/

Move stubs to .starlark/builtins/ and create config:

{
"version": 1,
"rules": [
{"files": ["Tiltfile", "**/*.star"], "dialect": "tilt"}
],
"dialects": {
"tilt": {
"builtins": [".starlark/builtins/tilt.builtins.pyi"],
"extends": "starlark"
}
}
}