addedInput schema / properties / includeLocales
Added value: +{
+ "description": "Return one row per key and locale — layer, locale, key, value — instead of one row per key. Several times the output for the same findings, so ask for it when the per-locale values are what you are after. Default: false.",
+ "type": "boolean"
+}
changedInput schema / properties / layer / description
Previous value: -"Layer name to search in (e.g., \"root\", \"app-admin\"), or \"*\" for all layers. If omitted, searches all layers. Call discover to discover available layers."New value: +"Layer name to search in (e.g., \"root\", \"app-admin\"), or \"*\" for all layers. If omitted, searches every layer."
addedInput schema / properties / limit
Added value: +{
+ "description": "Maximum number of matching rows to return. Default: 100 for a tool call, unlimited at a terminal. When the cap applies the result carries truncated: true and nextOffset — call again with offset set to that value for the next page, or narrow the request instead.",
+ "maximum": 9007199254740991,
+ "minimum": 1,
+ "type": "integer"
+}
changedInput schema / properties / locale / description
Previous value: -"Locale code to search in (e.g., \"en\", \"de\"). If omitted, searches all locales."New value: +"Locale code to search in (e.g., \"en\", \"de\"). If omitted, searches every locale."
addedInput schema / properties / matchMode
Added value: +{
+ "description": "How query is compared. \"contains\" is a case-insensitive substring, over every locale searched. \"exact\" is the whole string, and \"fuzzy\" also accepts near-misses in wording, both ignoring case, accents, punctuation and whitespace and both comparing against one locale only — locale when given, otherwise the project default. Default: \"contains\".",
+ "enum": [
+ "contains",
+ "exact",
+ "fuzzy"
+ ],
+ "type": "string"
+}
addedInput schema / properties / offset
Added value: +{
+ "description": "Number of matching rows to skip before returning any. Default: 0. Pass the nextOffset of a truncated result to continue where it stopped.",
+ "maximum": 9007199254740991,
+ "minimum": 0,
+ "type": "integer"
+}
changedInput schema / properties / outputFile / description
Previous value: -"Absolute path to write full JSON output. Returns only a compact summary to the caller — use this for large outputs to avoid flooding the conversation context. Example: \"/tmp/search-results.json\""New value: +"Absolute path to write the full JSON output to. Only a compact summary is returned to the caller, which is what you want for a result too large to read in one piece. Example: \".i18n-reports/search-results.json\""
changedInput schema / properties / projectDir / description
Previous value: -"Absolute path to the Nuxt project root. Defaults to I18N_PROJECT_DIR, then server cwd. Example: \"/home/user/my-app\"."New value: +"Absolute path to the project root. Defaults to I18N_PROJECT_DIR, then server cwd. Example: \"/home/user/my-app\"."
changedInput schema / properties / query / description
Previous value: -"Substring to search for. Matched against translation keys and/or string values. Case-insensitive. Example: \"save\" matches key \"common.actions.save\" or value \"Save changes\"."New value: +"Text to search for, matched against keys and/or values. Compared as a case-insensitive substring unless matchMode says otherwise. Example: \"save\" matches the key \"common.actions.save\" and the value \"Save changes\"."
changedInput schema / properties / searchIn / description
Previous value: -"Whether to search in translation keys, values, or both. Default: \"both\"."New value: +"Whether to search translation keys, values, or both. Default: \"both\"."
changedOutput schema / (root)
Previous value: -nullNew value: +{
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "anyOf": [
+ {
+ "additionalProperties": false,
+ "properties": {
+ "matches": {
+ "anyOf": [
+ {
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "key": {
+ "description": "The matching dot-path key.",
+ "type": "string"
+ },
+ "layers": {
+ "description": "Every searched layer that defines it. More than one means the key is duplicated across layers.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "locale": {
+ "description": "Which locale value was read from: the reference locale where it defines the key, otherwise the first searched locale that does.",
+ "type": "string"
+ },
+ "localeCount": {
+ "description": "How many of the searched locales define the key.",
+ "maximum": 9007199254740991,
+ "minimum": -9007199254740991,
+ "type": "integer"
+ },
+ "value": {
+ "description": "What the locale named below holds for the key."
+ }
+ },
+ "required": [
+ "key",
+ "layers",
+ "value",
+ "locale",
+ "localeCount"
+ ],
+ "type": "object"
+ },
+ "type": "array"
+ },
+ {
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "key": {
+ "description": "The matching dot-path key.",
+ "type": "string"
+ },
+ "layer": {
+ "description": "Layer the match was found in.",
+ "type": "string"
+ },
+ "locale": {
+ "description": "Locale the match was found in.",
+ "type": "string"
+ },
+ "value": {
+ "description": "What that locale holds for the key."
+ }
+ },
+ "required": [
+ "layer",
+ "locale",
+ "key",
+ "value"
+ ],
+ "type": "object"
+ },
+ "type": "array"
+ }
+ ],
+ "description": "One row per key by default; one row per key and locale when includeLocales was passed."
+ },
+ "message": {
+ "description": "The step to take next — how to continue a capped read. Present when there is one.",
+ "type": "string"
+ },
+ "nextOffset": {
+ "description": "The offset to pass to continue where this result stopped. Present only when truncated.",
+ "maximum": 9007199254740991,
+ "minimum": -9007199254740991,
+ "type": "integer"
+ },
+ "totalMatches": {
+ "description": "Number of rows the search found, whichever shape they are in — before limit, so it exceeds the rows in matches when truncated.",
+ "maximum": 9007199254740991,
+ "minimum": -9007199254740991,
+ "type": "integer"
+ },
+ "truncated": {
+ "description": "True when limit cut the result short. The totals still count everything.",
+ "type": "boolean"
+ }
+ },
+ "required": [
+ "matches",
+ "totalMatches",
+ "truncated"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "reportFile": {
+ "description": "Absolute path the full JSON result was written to. Read the file for the findings; the summary below is all that came back.",
+ "type": "string"
+ },
+ "summary": {
+ "additionalProperties": false,
+ "description": "The counts from the full result, so a caller can act on them without reading the file.",
+ "properties": {
+ "nextOffset": {
+ "description": "The offset to pass to continue where this result stopped. Present only when truncated.",
+ "maximum": 9007199254740991,
+ "minimum": -9007199254740991,
+ "type": "integer"
+ },
+ "totalMatches": {
+ "description": "Number of rows the search found, whichever shape they are in — before limit, so it exceeds the rows in matches when truncated.",
+ "maximum": 9007199254740991,
+ "minimum": -9007199254740991,
+ "type": "integer"
+ },
+ "truncated": {
+ "const": true,
+ "description": "Present when the diverted search was cut by limit.",
+ "type": "boolean"
+ }
+ },
+ "required": [
+ "totalMatches"
+ ],
+ "type": "object"
+ }
+ },
+ "required": [
+ "reportFile",
+ "summary"
+ ],
+ "type": "object"
+ }
+ ],
+ "type": "object"
+}