Skip to content
Open
Show file tree
Hide file tree
Changes from 14 commits
Commits
Show all changes
94 commits
Select commit Hold shift + click to select a range
df2698b
feat(ts-api-extractor): add DeepL + MQM translation pipeline
MaxLee-dev Apr 21, 2026
acdc7bd
feat(ts-api-extractor): add TranslationConfig to schema, defaults, an…
MaxLee-dev Apr 21, 2026
c8fd7d7
feat(ts-api-extractor): wire translation pipeline into extract stage
MaxLee-dev Apr 21, 2026
4a2f225
test(ts-api-extractor): add test suite for translate pipeline (252 te…
MaxLee-dev Apr 21, 2026
8dd74ff
chore(ts-api-extractor): add p-limit, deepl, anthropic-ai/sdk depende…
MaxLee-dev Apr 21, 2026
6f9904d
docs(website): add .env.example with translation env vars
MaxLee-dev Apr 21, 2026
ea3674b
docs(skills): update write-component-jsdocs skill for i18n pipeline i…
MaxLee-dev Apr 21, 2026
acdcc61
fix(ts-api-extractor): add runtime shape guards to MQM validator and …
MaxLee-dev Apr 21, 2026
4496269
fix(ts-api-extractor): harden translation pipeline against adversaria…
MaxLee-dev Apr 21, 2026
ef1a6c8
chore(website): remove .env.example file as it is no longer needed
MaxLee-dev Apr 21, 2026
d384d4b
fix(ts-api-extractor): enhance mergeConfig to handle translation merg…
MaxLee-dev Apr 21, 2026
6cc355c
fix(ts-api-extractor): apply CodeRabbit review fixes for translation …
MaxLee-dev Apr 21, 2026
72a3448
fix(ts-api-extractor): improve mergeConfig to handle translation prop…
MaxLee-dev Apr 21, 2026
9a36b5a
Merge branch 'main' of https://github.com/goorm-dev/vapor-ui into dee…
MaxLee-dev Apr 29, 2026
94840b7
feat: add configuration and error handling for DeepL translation process
MaxLee-dev Apr 29, 2026
dc44d15
fix: apply CodeRabbit auto-fixes
MaxLee-dev Apr 29, 2026
4834439
feat: add verbose logging for translation process and enhance report …
MaxLee-dev Apr 30, 2026
2228418
feat: update MQM taxonomy and improve report structure for translatio…
MaxLee-dev Apr 30, 2026
b2a3995
feat: add skipCache option and refactor flag handling for translation…
MaxLee-dev Apr 30, 2026
72a93bc
feat: validate DEEPL_API_KEY in applyFlagOverrides and add tests for …
MaxLee-dev Apr 30, 2026
36d0e14
feat: refactor CLI options handling and improve error management for …
MaxLee-dev Apr 30, 2026
d14390f
fix: update config option name to config-path for consistency in CLI …
MaxLee-dev Apr 30, 2026
00d6753
feat: update ts-api-extractor to use lodash-es for merging configurat…
MaxLee-dev Apr 30, 2026
46cf601
feat: add find-up dependency and implement monorepo root resolution; …
MaxLee-dev Apr 30, 2026
6d79b15
refactor: replace DeepPartialTranslationConfig with generic DeepParti…
MaxLee-dev Apr 30, 2026
3d67f87
feat: separate LLM models for postprocess and validation to prevent s…
MaxLee-dev May 4, 2026
2d5c98d
feat: export functions and interfaces for no-edit span extraction and…
MaxLee-dev May 4, 2026
5f36d06
fix(schema): add runtime validation for translation config in validat…
MaxLee-dev May 4, 2026
83bb1f7
fix(test): replace RegExp path.sep interpolation with path.resolve fo…
MaxLee-dev May 4, 2026
6fe4a92
refactor(translate): deepen translation pipeline architecture
MaxLee-dev May 6, 2026
2470663
style(translate): apply formatter to translation pipeline files
MaxLee-dev May 6, 2026
cbfe5ac
fix(schema): simplify error message formatting in validatePartialConfig
MaxLee-dev May 6, 2026
a70b50f
refactor(translate): add mt-mqm-pass pipeline stage and remove MQM-le…
MaxLee-dev May 6, 2026
a6ede3b
Merge branch 'main' of https://github.com/goorm-dev/vapor-ui into dee…
MaxLee-dev May 6, 2026
0964d0f
feat: add entry transforms and MQM APE loop for enhanced translation …
MaxLee-dev May 6, 2026
d75e052
fix: reorder import statements for consistency in mqm-ape-loop.ts
MaxLee-dev May 6, 2026
0949c3f
fix: increase timeout duration for LLM API calls to 60 seconds
MaxLee-dev May 6, 2026
48eea39
fix: apply CodeRabbit auto-fixes
MaxLee-dev May 7, 2026
8995621
fix: update ts-api-extractor command to remove config path
MaxLee-dev May 7, 2026
8ed7f94
Merge branch 'main' of https://github.com/goorm-dev/vapor-ui into dee…
MaxLee-dev May 7, 2026
f2c62fb
fix: update cache version and simplify cache entry structure
MaxLee-dev May 7, 2026
1f6c9e4
fix: revert CACHE_VERSION to 'v1' and update LLM postprocessing promp…
MaxLee-dev May 7, 2026
4018ad1
refactor(translate): unify FinalEntry stage types via MqmStageResult
MaxLee-dev May 7, 2026
89b2729
refactor(translate): simplify makeCacheKey to accept TranslationConfig
MaxLee-dev May 7, 2026
87fd2a2
refactor(translate): split entry-transforms into cache + props-projec…
MaxLee-dev May 7, 2026
6d8ede1
refactor(translate): remove ComponentReport alias fields failCount/er…
MaxLee-dev May 7, 2026
1fec000
refactor(cli): separate env guard from mergeFlagOverrides
MaxLee-dev May 7, 2026
bfeade4
refactor(cli): group translation flags into CliTranslationFlags
MaxLee-dev May 7, 2026
8baf22f
docs(breadcrumb): add JSDoc comments to component parts and variants
MaxLee-dev May 7, 2026
8a62f18
style: apply linter auto-formatting
MaxLee-dev May 7, 2026
6a718bc
fix: apply CodeRabbit auto-fixes
MaxLee-dev May 7, 2026
6a44a11
refactor(breadcrumb): remove unnecessary JSDoc comments from components
MaxLee-dev May 7, 2026
b404b92
fix: update MQM validation rules for component and prop names to pres…
MaxLee-dev May 7, 2026
ae7234c
Refactor translation tests and enhance reporting structure
MaxLee-dev May 8, 2026
d0de4f1
feat: enhance translation lifecycle with performance logging and batc…
MaxLee-dev May 8, 2026
81ea3e5
chore: carryover prior-session changes outside PRD scope
MaxLee-dev May 11, 2026
8c020eb
feat(translation-pipeline): introduce standalone translation pipeline…
MaxLee-dev May 11, 2026
b35b6ef
refactor(ts-api-extractor): drop translation responsibility (issue #6)
MaxLee-dev May 11, 2026
751e43e
feat(website): wire translation-pipeline into i18n scripts (issue #7)
MaxLee-dev May 11, 2026
8e65ef7
refactor: clean up code formatting and improve readability in various…
MaxLee-dev May 11, 2026
34198d4
fix: reorder i18n and translate scripts in package.json for clarity
MaxLee-dev May 11, 2026
9bd6f54
revert: restore ts-api-extractor to main branch state
MaxLee-dev May 11, 2026
d499b5f
feat: enhance logging and progress reporting in translation pipeline …
MaxLee-dev May 11, 2026
d64b7ab
refactor(translation-pipeline): restructure src by role and colocate …
MaxLee-dev May 11, 2026
436d9bd
fix: update dependency versions in pnpm-lock.yaml for compatibility
MaxLee-dev May 11, 2026
b76b379
Merge branch 'main' of https://github.com/goorm-dev/vapor-ui into dee…
MaxLee-dev May 11, 2026
41e2b03
refactor(breadcrumb): remove unnecessary comments from breadcrumb com…
MaxLee-dev May 11, 2026
0b6fa28
fix(tests): correct test directory name in tsconfig.json
MaxLee-dev May 11, 2026
531d4dc
fix(translator): remove unused properties from batch MQM response mock
MaxLee-dev May 11, 2026
69dea2d
refactor: remove verbose logging and related metadata from translatio…
MaxLee-dev May 11, 2026
fe55e6e
feat: implement batch lifecycle for translation units
MaxLee-dev May 11, 2026
ae81d21
fix: apply CodeRabbit auto-fixes
MaxLee-dev May 11, 2026
ec4a6d0
fix(translator): remove unused LLM_CONCURRENCY constant and related i…
MaxLee-dev May 11, 2026
1e93ff2
docs(translation-pipeline): add README and CLAUDE.md
MaxLee-dev May 11, 2026
b96d2f4
Merge branch 'main' of https://github.com/goorm-dev/vapor-ui into dee…
MaxLee-dev Jun 17, 2026
f3b57c8
refactor translation pipeline
MaxLee-dev Jun 17, 2026
de03621
chore: pnpm format
MaxLee-dev Jun 17, 2026
d63f6bd
chore: untrack handoff.md (local-only session notes)
MaxLee-dev Jun 17, 2026
54d8547
Merge remote-tracking branch 'origin/main' into deepl-translation-lay…
MaxLee-dev Jul 31, 2026
0d1daa7
feat(translation-pipeline): deterministic preservation gate and cross…
MaxLee-dev Aug 3, 2026
71ef8e4
refactor(translation-pipeline): drop dead telemetry and dedupe shared…
MaxLee-dev Aug 3, 2026
93ad5d2
fix(docs): stop dropping namespaces whose Props is an interface
MaxLee-dev Aug 3, 2026
22f7fc4
docs(website): point props tables at the right components
MaxLee-dev Aug 3, 2026
06f9f02
chore(website): drop generated component JSON from this branch
MaxLee-dev Aug 3, 2026
6fd1bd4
refactor(website): name the ko-to-en doc fallback instead of commenti…
MaxLee-dev Aug 3, 2026
742da0d
chore(website): drop internal gateway details from env example
MaxLee-dev Aug 3, 2026
6ddbf2a
refactor(ts-api-extractor): drop config-file loading and dead plumbing
MaxLee-dev Aug 3, 2026
a4d2797
refactor(translation-pipeline): shrink cache entries and require an e…
MaxLee-dev Aug 3, 2026
91dfc8c
refactor(translation-pipeline): drop dead exports and duplicated erro…
MaxLee-dev Aug 3, 2026
8ac4730
refactor(translation-pipeline): fold two LLM batch-call shells into one
MaxLee-dev Aug 3, 2026
645c3c8
refactor(translation-pipeline): make the directory layout match the s…
MaxLee-dev Aug 3, 2026
7959c8a
chore(translation-pipeline): drop the unused LITELLM_API_KEY
MaxLee-dev Aug 3, 2026
9a8d185
refactor(translation-pipeline): identify translation units by name, not
MaxLee-dev Aug 3, 2026
e75022a
chore: resolve conflict
MaxLee-dev Aug 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 5 additions & 3 deletions .claude/skills/write-component-jsdocs/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,17 +39,19 @@ Placement depends on the component pattern. See [references/guide.md](references
## Component summary rules

1. One single line — no line breaks inside the summary
2. User perspective: what it is → when to use it
2. Pattern by role:
- **Top-level**: `"A [noun] for/that [purpose]. Renders a \`<x>\` element."`
- **Sub-component**: `"A/An [noun] that [role]. Renders a \`<x>\` element."`
- **Root/wrapper (no HTML)**: `"Groups/Assembles [parts]. Doesn't render its own HTML element."`
3. No internal terms (`memoized`, `wrapper`, `token-based`, etc.)
4. End with the rendered HTML element using backticks around the tag: "Renders a `<button>` element." or "Doesn't render its own HTML element.".
4. Always end with the rendered HTML element in backticks, or `Doesn't render its own HTML element.` for Root/Provider components.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Components like Card or Checkbox sometimes have a Root that renders HTML, so we should verify if these parts are being extracted accurately without any discrepancies.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That’s correct. That’s why I’ve included both cases. Furthermore, as basic tag information cannot be extracted statically, I believe this part must always be added via the ‘skill’ feature and then verified by a human.


## Prop description rules

1. Don't repeat the prop name or its type
2. Describe side effects and interactions with other props
3. For numeric props: include unit and valid range
4. For event handlers: specify the exact trigger condition, not just "handler"
Comment on lines 49 to 54

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

기본값 문서화 규칙을 유지하십시오.

@default 사용 규칙을 삭제하면 작성 규칙에는 기본값 표기 방법이 없지만 Line 70 체크리스트에는 해당 요구사항이 남습니다. 규칙 4를 유지하거나 기본값 정책을 두 위치에서 함께 변경하십시오.

🧰 Tools
🪛 SkillSpector (2.4.4)

[warning] 21: [MP2] Context Window Stuffing: Skill attempts to fill the context window with filler content, displacing legitimate instructions and safety constraints. This can degrade agent performance or bypass safety boundaries.

Remediation: Implement context-window management that detects and rejects padding or stuffing attempts. Prioritize system instructions over user-injected content.

(Memory Poisoning (MP2))

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.claude/skills/write-component-jsdocs/SKILL.md around lines 49 - 54, Keep
the default-value documentation requirement consistent between the “Prop
description rules” section and the checklist around the documented default-value
requirement. Restore rule 4 with the established `@default` usage guidance, or
update both locations together if changing the policy; do not leave the
checklist requiring behavior that the rules no longer explain.

5. Use the `@default` JSDoc tag to indicate default values — never write `Default: \`value\`` inline in the description text

## Review checklist

Expand Down
153 changes: 132 additions & 21 deletions .claude/skills/write-component-jsdocs/references/guide.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,6 @@ export const root = componentRecipe({
variants: {
/**
* Visual style of the button.
* @default 'fill'
*/
variant: { fill: {}, outline: {}, ghost: {} },
},
Expand All @@ -60,10 +59,7 @@ When custom props are defined via an `interface`, write JSDoc on the **interface
export interface DialogRootProps
extends DialogVariants, Omit<BaseDialog.Root.Props, 'disablePointerDismissal'> {
/**
*
* Closes the dialog when the overlay is clicked.
* @default true
*/
closeOnClickOverlay?: boolean;
}

Expand Down Expand Up @@ -163,23 +159,58 @@ Do not write content on the line immediately after `/**`. Even single-line comme

The JSDoc block directly above the component declaration. It's the first thing a developer reads on the documentation site.

### Rules
### Wording patterns by component role

**1. Write the summary on a single line**
**Top-level / standalone component** — One sentence: `"A [noun phrase] for/that [purpose]."` Focus on what it is and when to use it. End with the rendered HTML element.

No line breaks inside the summary. Separate sentences with `.` only.
```tsx
/**
* A component for toggling between related panels on the same page. Renders a `<div>` element.
*/

/**
* A popup that opens on top of the entire page. Doesn't render its own HTML element.
*/
```

**Compound sub-component** — One sentence: `"A/An [noun] that [role/behavior]. Renders a \`<x>\` element."`

```tsx
/**
* Button component for user interactions. Use for primary actions such as form submission, dialog triggers, and navigation.
* An individual interactive tab button that toggles the corresponding panel. Renders a `<button>` element.
*/

/**
* A panel displayed when the corresponding tab is active. Renders a `<div>` element.
*/

/**
* An accessible label that is automatically associated with the select trigger. Renders a `<label>` element.
*/
export function Button(props: ButtonProps) { ... }
```

**Root / wrapper (no HTML element)** — Use `"Groups [parts]."` or `"Assembles [parts]."` and end with `"Doesn't render its own HTML element."`

```tsx
/**
* Groups all parts of the dialog. Doesn't render its own HTML element.
*/

/**
* Assembles the tooltip component parts. Doesn't render its own HTML element.
*/
```

### Rules

**1. Write the summary on a single line**

No line breaks inside the summary. Separate sentences with `.` only.

**2. Write for a developer who has never seen this component**

- No internal system names, team slang, or implementation details.
- Order: "what it is" → "when to use it".
- Order: "what it is / what it does" → rendered HTML element.

```tsx
// ❌ implementation detail leaks
Expand All @@ -189,7 +220,7 @@ export function Button(props: ButtonProps) { ... }

// ✅ user perspective
/**
* Button component for user interactions.
* A button that submits forms and triggers actions. Renders a `<button>` element.
*/
```

Expand All @@ -205,23 +236,23 @@ Fragments read poorly when rendered as-is on the documentation site.

// ✅ complete sentence
/**
* Button component for user interactions.
* A button that submits forms and triggers actions. Renders a `<button>` element.
*/
```

**4. State the rendered HTML element**

End the summary with the element the component renders by default. Wrap the HTML tag in backticks. For components that don't render their own HTML element (Providers, Context wrappers), say so explicitly.
End the summary with the element the component renders by default. Wrap the HTML tag in backticks. For components that don't render their own HTML element (Root, Provider, Context wrappers), end with `"Doesn't render its own HTML element."`

```tsx
// renders a specific element
/**
* Button component for user interactions. Renders a `<button>` element.
* A button that submits forms and triggers actions. Renders a `<button>` element.
*/

// renders no HTML element of its own
/**
* Provides theme context to its children. Doesn't render its own HTML element.
* Groups all parts of the dialog. Doesn't render its own HTML element.
*/
```

Expand All @@ -244,6 +275,90 @@ interface ButtonProps {
}
```

### Wording patterns by prop category

Follow these patterns consistently — they match Base UI's documentation style and ensure a uniform developer experience.

**Boolean props** — Use `"Whether [subject] [condition/state]."`:

```tsx
/**
* Whether the component should ignore user interaction.
*/
disabled?: boolean;

/**
* Whether the user should be unable to tick or untick the checkbox.
*/
readOnly?: boolean;

/**
* Whether the checkbox is initially ticked.
*/
defaultChecked?: boolean;
```

**Event handlers** — Use `"Event handler called when [exact condition]."`:

```tsx
// ❌ vague
/**
* Called when the value changes.
*/
onChange?: (value: string) => void;

// ✅ precise trigger
/**
* Event handler called when the value of the select changes.
*/
onValueChange?: (value: string) => void;

/**
* Event handler called when the checkbox is ticked or unticked.
*/
onCheckedChange?: (checked: boolean) => void;

/**
* Event handler called when the dialog is opened or closed.
*/
onOpenChange?: (open: boolean) => void;
```

**Numeric props** — State the unit inline; add range or special values where relevant:

```tsx
/**
* Distance between the anchor and the popup, in pixels.
*/
sideOffset?: number;

/**
* Delay before auto-dismissing, in milliseconds. Set to `0` to disable auto-dismiss.
*/
autoCloseMs?: number;
```

**render / className / style** — Use these fixed phrases verbatim:

```tsx
/**
* Allows you to replace the component's HTML element with a different tag, or compose it with another component.
*/
render?: React.ReactElement | ((props: object) => React.ReactElement);

/**
* CSS class applied to the element, or a function that returns a class based on the component's state.
*/
className?: string | ((state: Root.State) => string);

/**
* Style applied to the element, or a function that returns a style object based on the component's state.
*/
style?: React.CSSProperties | ((state: Root.State) => React.CSSProperties);
```

> Note: `render`, `className`, and `style` are inherited from Base UI primitives in most vapor-ui components. Only write JSDoc on them if your component overrides or extends their behavior.

### Rules

**1. Don't repeat the prop name**
Expand All @@ -270,16 +385,12 @@ Explain what happens when the prop is set — especially when it interacts with

```tsx
/**
*
* Disables the button, blocking all interactions and dimming its appearance. Automatically set to `true` when `loading` is `true`.
* @default false
*/
disabled?: boolean;

/**
*
* Shows a spinner and disables the button while `true`.
* @default false
*/
loading?: boolean;
```
Expand All @@ -295,7 +406,7 @@ autoCloseMs?: number;

**4. Specify the exact trigger condition for event handlers**

Don't stop at "click handler" — say precisely when it fires.
Use the `"Event handler called when …"` pattern. Don't stop at "click handler" — say precisely when it fires.

```tsx
// ❌ vague
Expand All @@ -306,7 +417,7 @@ onClick?: (event: React.MouseEvent<HTMLButtonElement>) => void;

// ✅ exact trigger
/**
* Called when the button is clicked or activated via Enter or Space key.
* Event handler called when the button is clicked or activated via Enter or Space key.
*/
onClick?: (event: React.MouseEvent<HTMLButtonElement>) => void;
```
Expand Down
13 changes: 12 additions & 1 deletion pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions scripts/ts-api-extractor/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
"dependencies": {
"glob": "^10.3.0",
"meow": "^14.0.0",
"p-limit": "^7.3.0",
"ts-morph": "^22.0.0"
},
"devDependencies": {
Expand Down
21 changes: 20 additions & 1 deletion scripts/ts-api-extractor/src/cli/index.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,16 @@
import meow from 'meow';
import path from 'node:path';

import { CliError, resolveOptions } from '~/cli/options';
import { extract } from '~/extract';

// Load .env.local from cwd (website app root when running via turbo)
try {
process.loadEnvFile(path.resolve(process.cwd(), '.env.local'));
} catch {
// File does not exist — proceed without it
}

async function runCli(): Promise<void> {
const cli = meow(

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree that meow is a solid choice for building CLI interfaces. However, I’ve found that manually writing out the interface as a string can be quite tedious and prone to omissions or consistency issues.

Tools like yargs or commander offer a more stable approach in my opinion. Since the user interface (commands, flags, etc.), descriptions, and behaviors are all defined within a single function, the risk of inconsistency is lower, and the overall structure feels more organized.

With that in mind, I was wondering if there was a specific reason you chose to use meow over these other options?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I chose meow because it has the advantage of being able to provide users with help descriptions based on strings. There is no particular reason why I did not use yargs or commander. As there are currently only five flags, I believe there is virtually no risk of omitting any explanations at this scale.

`
Expand All @@ -12,17 +20,23 @@ async function runCli(): Promise<void> {
Options
--component, -n Component name to process (default: all components)
--config Config file path
--translate Enable translation pipeline (outputs en/ and ko/ subfolders)
--skip-cache Skip translation cache (do not read or write cache)

Examples
$ ts-api-extractor
$ ts-api-extractor --component Tabs
$ ts-api-extractor --config ./docs-extractor.config.mjs
$ ts-api-extractor --translate
$ ts-api-extractor --translate --skip-cache
`,
{
importMeta: import.meta,
flags: {
component: { type: 'string', shortFlag: 'n' },
config: { type: 'string' },
translate: { type: 'boolean', default: false },
skipCache: { type: 'boolean', default: false },
},
},
);
Expand All @@ -32,10 +46,15 @@ async function runCli(): Promise<void> {
configPath: cli.flags.config,
});

extract({
if (cli.flags.translate && resolved.config.translation) {
resolved.config.translation.enabled = true;
}

await extract({
tsconfigPath: resolved.tsconfigPath,
targetFiles: resolved.targetFiles,
config: resolved.config,
skipCache: cli.flags.skipCache,
});
}

Expand Down
13 changes: 13 additions & 0 deletions scripts/ts-api-extractor/src/config/defaults.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,4 +21,17 @@ export const defaultExtractorConfig: ExtractorConfig = {
components: {},
all: false,
verbose: false,
translation: {
enabled: false,
targetLocale: 'ko',
llm: {
enabled: true,
},
validation: {
mqm: {
enabled: true,
failOnError: false,
},
},
},
Comment thread
MaxLee-dev marked this conversation as resolved.
Outdated
};
Loading
Loading