@recombine-ai/engine 0.8.1 → 0.8.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -30,3 +30,6 @@ jobs:
30
30
 
31
31
  - name: Run typecheck
32
32
  run: yarn -s typecheck
33
+
34
+ - name: Run tests
35
+ run: yarn test
package/build/index.d.ts CHANGED
@@ -3,4 +3,5 @@ export * from './lib/schedule';
3
3
  export * from './lib/interfaces';
4
4
  export * from './lib/bosun';
5
5
  export * from './lib/prompt-fs';
6
+ export * from './lib/llm-adapters';
6
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAA;AAExB,cAAc,gBAAgB,CAAA;AAE9B,cAAc,kBAAkB,CAAA;AAEhC,cAAc,aAAa,CAAA;AAE3B,cAAc,iBAAiB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAA;AAExB,cAAc,gBAAgB,CAAA;AAE9B,cAAc,kBAAkB,CAAA;AAEhC,cAAc,aAAa,CAAA;AAE3B,cAAc,iBAAiB,CAAA;AAE/B,cAAc,oBAAoB,CAAA"}
package/build/index.js CHANGED
@@ -19,3 +19,4 @@ __exportStar(require("./lib/schedule"), exports);
19
19
  __exportStar(require("./lib/interfaces"), exports);
20
20
  __exportStar(require("./lib/bosun"), exports);
21
21
  __exportStar(require("./lib/prompt-fs"), exports);
22
+ __exportStar(require("./lib/llm-adapters"), exports);
package/build/lib/ai.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { ZodTypeAny } from 'zod';
1
+ import { ZodSchema, ZodTypeAny } from 'zod';
2
2
  import { Logger } from './interfaces';
3
3
  import { SendAction } from './bosun/action';
4
4
  import { PromptFile } from './prompt-fs';
@@ -8,6 +8,11 @@ import { Tracer } from './bosun';
8
8
  * Represents a basic model name for LLMs.
9
9
  */
10
10
  export type BasicModel = 'o3-mini-2025-01-31' | 'o1-preview-2024-09-12' | 'gpt-4o-2024-08-06' | 'gpt-4o-2024-11-20' | 'gpt-4.1-2025-04-14' | 'o1-2024-12-17' | (string & {});
11
+ export interface LlmAdapter {
12
+ generateResponse: (systemPrompt: string, messages: string, schema?: ZodSchema) => Promise<string>;
13
+ /** Returns adapter's configuration/options for tracing */
14
+ getOptions: () => unknown;
15
+ }
11
16
  export interface BasicStep<CTX> {
12
17
  /** Step name */
13
18
  name: string;
@@ -28,8 +33,8 @@ export interface ProgrammaticStep<CTX> extends BasicStep<CTX> {
28
33
  export interface LLMStep<CTX> extends BasicStep<CTX> {
29
34
  /** Determines if the step should be run or not */
30
35
  runIf?: (messages: Conversation, ctx: CTX) => boolean | Promise<boolean>;
31
- /** LLM to use. Defaults to gpt-4o */
32
- model?: BasicModel;
36
+ /** LLM to use. Can be a model name or an adapter. Defaults to gpt-4o */
37
+ model?: BasicModel | LlmAdapter;
33
38
  /**
34
39
  * Prompt can be a simple string or a link to a file, loaded with `loadFile` function which
35
40
  * takes a path to the file relative to `src/use-cases` directory. Should be Nunjucks-compatible.
@@ -300,6 +305,7 @@ export interface EngineConfig {
300
305
  * Optional token storage object that provides access to authentication tokens.
301
306
  * @property {object} tokenStorage - Object containing method to retrieve token.
302
307
  * @property {() => Promise<string | null>} tokenStorage.getToken - Function that returns a promise resolving to an authentication token or null.
308
+ * @deprecated
303
309
  */
304
310
  tokenStorage?: {
305
311
  getToken: () => Promise<string | null>;
@@ -1 +1 @@
1
- {"version":3,"file":"ai.d.ts","sourceRoot":"","sources":["../../src/lib/ai.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ai.d.ts","sourceRoot":"","sources":["../../src/lib/ai.ts"],"names":[],"mappings":"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"}
package/build/lib/ai.js CHANGED
@@ -6,14 +6,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.createAIEngine = createAIEngine;
7
7
  exports.createConversation = createConversation;
8
8
  exports.getStepBuilder = getStepBuilder;
9
- // cspell:words lstripBlocks
10
- const openai_1 = require("openai");
11
9
  const nunjucks_1 = __importDefault(require("nunjucks"));
12
10
  const zod_1 = require("zod");
13
11
  const action_1 = require("./bosun/action");
14
- const core_1 = require("openai/core");
15
12
  const tracer_1 = require("./bosun/tracer");
16
13
  const zod_to_json_schema_1 = require("zod-to-json-schema");
14
+ const openai_1 = require("./llm-adapters/openai");
17
15
  /**
18
16
  * Creates an AI Engine with the given configuration.
19
17
  *
@@ -43,15 +41,7 @@ function createAIEngine(cfg = {}) {
43
41
  const stepTracer = cfg.stepTracer || undefined;
44
42
  const logger = cfg.logger || globalThis.console;
45
43
  const tracer = cfg.tracer || (0, tracer_1.createConsoleTracer)(logger);
46
- let apiKey = null;
47
- const tokenStorage = cfg.tokenStorage || {
48
- async getToken() {
49
- if (process.env.OPENAI_API_KEY) {
50
- return process.env.OPENAI_API_KEY;
51
- }
52
- throw new Error('OpenAI API key is not set');
53
- },
54
- };
44
+ // tokenStorage kept for backward compatibility in config, but API keys are fetched by adapters now
55
45
  function createWorkflow({ onError, steps = [], }) {
56
46
  steps.forEach(addStepToTracer);
57
47
  return {
@@ -95,15 +85,13 @@ function createAIEngine(cfg = {}) {
95
85
  }
96
86
  }
97
87
  async function runStep(step, conversation, ctx, state) {
98
- if (!apiKey) {
99
- apiKey = await tokenStorage.getToken();
100
- }
101
- if (!apiKey) {
102
- throw new Error('LLM API key is not provided');
103
- }
104
88
  const stepTrace = {
105
89
  name: step.name,
106
- model: step.model,
90
+ model: typeof step.model === 'string'
91
+ ? step.model
92
+ : step.model
93
+ ? JSON.stringify(step.model.getOptions())
94
+ : 'default',
107
95
  schema: 'schema' in step
108
96
  ? step.schema instanceof zod_1.ZodSchema
109
97
  ? step.schema
@@ -126,11 +114,11 @@ function createAIEngine(cfg = {}) {
126
114
  stepTrace.stringifiedConversation = stringifiedMessages;
127
115
  stepTracer?.addStepTrace(stepTrace);
128
116
  if ('schema' in step) {
129
- response = await runLLM(apiKey, prompt, stringifiedMessages, step.schema, step.model);
117
+ response = await runLLM(step.model, prompt, stringifiedMessages, step.schema);
130
118
  response = step.schema.parse(JSON.parse(response));
131
119
  }
132
120
  else {
133
- response = await runLLM(apiKey, prompt, stringifiedMessages, undefined, step.model);
121
+ response = await runLLM(step.model, prompt, stringifiedMessages, undefined);
134
122
  }
135
123
  if (!response) {
136
124
  throw new Error('No response from OpenAI');
@@ -142,7 +130,6 @@ function createAIEngine(cfg = {}) {
142
130
  await (step.onError
143
131
  ? step.onError(error.message, ctx)
144
132
  : onError(error.message, ctx));
145
- // FIXME: this doesn't terminate the workflow
146
133
  stepTracer?.addStepTrace(stepTrace);
147
134
  state.terminate();
148
135
  }
@@ -162,30 +149,17 @@ function createAIEngine(cfg = {}) {
162
149
  }
163
150
  }
164
151
  }
165
- async function runLLM(apiKey, systemPrompt, messages, schema, model = 'gpt-4o-2024-08-06') {
166
- logger.debug('AI Engine: model:', model);
152
+ async function runLLM(model, systemPrompt, messages, schema) {
153
+ logger.debug('AI Engine: model:', typeof model === 'string' || model === undefined
154
+ ? model || 'gpt-4o-2024-08-06'
155
+ : '[adapter]');
167
156
  logger.debug('----------- RENDERED PROMPT ---------------');
168
157
  logger.debug(systemPrompt);
169
158
  logger.debug('-------------------------------------------');
170
- if (apiKey === '__TESTING__') {
171
- await (0, core_1.sleep)(100);
172
- if (!schema) {
173
- return 'canned response';
174
- }
175
- return JSON.stringify({ message: 'canned response', reasons: [] });
176
- }
177
- const client = new openai_1.OpenAI({ apiKey });
178
- const response = await client.chat.completions.create({
179
- messages: [
180
- { role: 'system', content: systemPrompt },
181
- { role: 'user', content: messages },
182
- ],
183
- ...getOpenAiOptions(model, schema),
184
- });
185
- if (!response.choices[0].message.content) {
186
- throw new Error('No response from OpenAI');
187
- }
188
- return response.choices[0].message.content;
159
+ const adapter = typeof model === 'string' || model === undefined
160
+ ? (0, openai_1.createOpenAIAdapter)(getOpenAiOptions(model || 'gpt-4o-2024-08-06', schema))
161
+ : model;
162
+ return adapter.generateResponse(systemPrompt, messages, schema);
189
163
  }
190
164
  return {
191
165
  createWorkflow,
@@ -0,0 +1,2 @@
1
+ export * from './openai';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/llm-adapters/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAA"}
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./openai"), exports);
@@ -0,0 +1,5 @@
1
+ import { ChatCompletionCreateParamsBase } from 'openai/resources/chat/completions';
2
+ import type { LlmAdapter } from '../ai';
3
+ export type OpenAIChatOptions = Omit<ChatCompletionCreateParamsBase, 'messages' | 'stream'>;
4
+ export declare function createOpenAIAdapter(options: OpenAIChatOptions): LlmAdapter;
5
+ //# sourceMappingURL=openai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../../src/lib/llm-adapters/openai.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,8BAA8B,EAAE,MAAM,mCAAmC,CAAA;AAElF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,OAAO,CAAA;AAEvC,MAAM,MAAM,iBAAiB,GAAG,IAAI,CAAC,8BAA8B,EAAE,UAAU,GAAG,QAAQ,CAAC,CAAA;AAW3F,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,iBAAiB,GAAG,UAAU,CAiC1E"}
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createOpenAIAdapter = createOpenAIAdapter;
4
+ const openai_1 = require("openai");
5
+ function getApiKey() {
6
+ if (process.env.OPENAI_API_KEY) {
7
+ return process.env.OPENAI_API_KEY;
8
+ }
9
+ throw new Error('OpenAI API key is not set');
10
+ }
11
+ const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
12
+ function createOpenAIAdapter(options) {
13
+ return {
14
+ getOptions: () => options,
15
+ async generateResponse(systemPrompt, messages, _schema) {
16
+ const apiKey = getApiKey();
17
+ if (apiKey === '__TESTING__') {
18
+ await delay(100);
19
+ if (!_schema) {
20
+ return 'canned response';
21
+ }
22
+ return JSON.stringify({ message: 'canned response', reasons: [] });
23
+ }
24
+ const client = new openai_1.OpenAI({ apiKey });
25
+ const response = await client.chat.completions.create({
26
+ messages: [
27
+ { role: 'system', content: systemPrompt },
28
+ { role: 'user', content: messages },
29
+ ],
30
+ ...options,
31
+ });
32
+ const content = response.choices[0]?.message?.content;
33
+ if (!content) {
34
+ throw new Error('No response from OpenAI');
35
+ }
36
+ return content;
37
+ },
38
+ };
39
+ }
package/changelog.md CHANGED
@@ -1,100 +1,105 @@
1
1
  # Changelog
2
2
 
3
+ ### 0.8.1 → 0.8.2 (unstable)
4
+
5
+ - Model now accepts a string or an `LlmAdapter`. Old defaults are used when model is a string.
6
+ - Added OpenAI adapter `createOpenAIAdapter(options)`.
7
+
3
8
  ### 0.8.0 → 0.8.1 (unstable)
4
9
 
5
- - Added prompt context mapping functionality to Context class:
6
- - `setPromptContextMapper(promptMapper: (ctx: T) => object)` - how to map Bosun's context into
7
- prompt context
8
- - `getPromptContextMapper()` - retrieves the current prompt context mapper function
9
- - Default mapper returns the context as-is
10
+ - Added prompt context mapping functionality to Context class:
11
+ - `setPromptContextMapper(promptMapper: (ctx: T) => object)` - how to map Bosun's context into
12
+ prompt context
13
+ - `getPromptContextMapper()` - retrieves the current prompt context mapper function
14
+ - Default mapper returns the context as-is
10
15
 
11
16
  ### 0.7.1 → 0.8.0 (unstable)
12
17
 
13
18
  Breaking changes:
14
19
 
15
- - `WorkflowControls` parameter added to step `execute` methods - all `ProgrammaticStep`,
16
- `StringLLMStep`, and `JsonLLMStep` execute functions now receive workflow controls as the last
17
- parameter,
18
- - `Workflow.terminate()` and `Workflow.rewindTo()` methods removed - use
19
- `WorkflowControls.terminate()` and `WorkflowControls.rewindTo()` from within step execution
20
- instead, note that `WorkflowControls.rewindTo()` accept step name, rather then link to a step,
21
- - `shouldExecute` property removed from `StringLLMStep` and `JsonLLMStep` interfaces - use
22
- conditional logic within the `execute` function.
23
- - `beforeEach` callback also moved into `Workflow.run` as third parameter
20
+ - `WorkflowControls` parameter added to step `execute` methods - all `ProgrammaticStep`,
21
+ `StringLLMStep`, and `JsonLLMStep` execute functions now receive workflow controls as the last
22
+ parameter,
23
+ - `Workflow.terminate()` and `Workflow.rewindTo()` methods removed - use
24
+ `WorkflowControls.terminate()` and `WorkflowControls.rewindTo()` from within step execution
25
+ instead, note that `WorkflowControls.rewindTo()` accept step name, rather then link to a step,
26
+ - `shouldExecute` property removed from `StringLLMStep` and `JsonLLMStep` interfaces - use
27
+ conditional logic within the `execute` function.
28
+ - `beforeEach` callback also moved into `Workflow.run` as third parameter
24
29
 
25
30
  Other changes:
26
31
 
27
- - Added support for additional OpenAI models: `gpt-4o-2024-08-06` and `gpt-4.1-2025-04-14`.
32
+ - Added support for additional OpenAI models: `gpt-4o-2024-08-06` and `gpt-4.1-2025-04-14`.
28
33
 
29
34
  ### 0.7.0 → 0.7.1 (unstable)
30
35
 
31
- - fixed multiple runs on static workflows
36
+ - fixed multiple runs on static workflows
32
37
 
33
38
  ### 0.6.0 → 0.7.0 (unstable)
34
39
 
35
40
  Breaking changes:
36
41
 
37
- - namespaces removed
38
- - `TestAgentFactory` now returns a promise
39
- - `TesAgentFactoryProps` now requires `Tracer` and doesn't require `AIEngine`
40
- - `loadFile` method was removed in favor of `PromptFS`
41
- - `workflow.run` now returns a string instead object as a response
42
+ - namespaces removed
43
+ - `TestAgentFactory` now returns a promise
44
+ - `TesAgentFactoryProps` now requires `Tracer` and doesn't require `AIEngine`
45
+ - `loadFile` method was removed in favor of `PromptFS`
46
+ - `workflow.run` now returns a string instead object as a response
42
47
 
43
48
  Other changes
44
49
 
45
- - interface `TestVoiceAgent` added
46
- - interface `Tracer` added
47
- - interface `PromptFS` and function `createLocalFS` were added
48
- - added `StepTracer` interface
49
- - Engine config now accepts `tracer` and `stepTracer`
50
+ - interface `TestVoiceAgent` added
51
+ - interface `Tracer` added
52
+ - interface `PromptFS` and function `createLocalFS` were added
53
+ - added `StepTracer` interface
54
+ - Engine config now accepts `tracer` and `stepTracer`
50
55
 
51
56
  ### 0.5.0 → 0.6.0 (unstable)
52
57
 
53
58
  Breaking changes:
54
59
 
55
- - `addDirective` is removed. Use `addMessage` with role: 'system' instead.
56
- - `ignoreDirectives` → `ignoreAddedMessages`
60
+ - `addDirective` is removed. Use `addMessage` with role: 'system' instead.
61
+ - `ignoreDirectives` → `ignoreAddedMessages`
57
62
 
58
63
  Other changes:
59
64
 
60
- - `AIEngine.sendMessage` now accepts `Message` rather than a string
65
+ - `AIEngine.sendMessage` now accepts `Message` rather than a string
61
66
 
62
67
  ### 0.4.0 → 0.5.0 (unstable)
63
68
 
64
69
  Breaking changes:
65
70
 
66
- - `schema` property replaced with `json` which can be boolean,
67
- - `setDirectiveFormatter` removed
71
+ - `schema` property replaced with `json` which can be boolean,
72
+ - `setDirectiveFormatter` removed
68
73
 
69
74
  Other changes:
70
75
 
71
- - `renderPrompt` method added
72
- - `addDirective` accepts optional formatter function
73
- - `formatter` optional method added to `Message`
76
+ - `renderPrompt` method added
77
+ - `addDirective` accepts optional formatter function
78
+ - `formatter` optional method added to `Message`
74
79
 
75
80
  ### 0.3.2 → 0.4.0 (unstable)
76
81
 
77
82
  Breaking changes:
78
83
 
79
- - `await workflow.run()` now returns an object with `reply: string` and `trace` object
84
+ - `await workflow.run()` now returns an object with `reply: string` and `trace` object
80
85
 
81
86
  ### 0.3.1 → 0.3.2 (unstable)
82
87
 
83
- - add `ScheduleQuery` class that provides three additional capabilities compared to `delayFactory`:
84
- - `query.nextValidDate(date: Date)` – to find next closest date after a specific date (rather than delay)
85
- - `query.next()` – gets closest date within provided schedule
86
- - `query.isValid(date)` – checks if provided date is within the schedule
88
+ - add `ScheduleQuery` class that provides three additional capabilities compared to `delayFactory`:
89
+ - `query.nextValidDate(date: Date)` – to find next closest date after a specific date (rather than delay)
90
+ - `query.next()` – gets closest date within provided schedule
91
+ - `query.isValid(date)` – checks if provided date is within the schedule
87
92
 
88
93
  ### 0.3.0 → 0.3.1 (unstable)
89
94
 
90
- - Fix: allow other models (as a string)
95
+ - Fix: allow other models (as a string)
91
96
 
92
97
  ### 0.2.0 → 0.3.0 (unstable)
93
98
 
94
99
  Breaking changes:
95
100
 
96
- - Break down the library into namespace: AIEngine, Scheduler
97
- - `Models` → `BasicModel`
98
- - `Step` → `LLMStep` & `ProgrammaticStep`
99
- - `makeMessagesList` → `getConversation`
100
- - Deprecation of `shouldExecute` (discouraged to use if there's no `maxAttempts` in a step)
101
+ - Break down the library into namespace: AIEngine, Scheduler
102
+ - `Models` → `BasicModel`
103
+ - `Step` → `LLMStep` & `ProgrammaticStep`
104
+ - `makeMessagesList` → `getConversation`
105
+ - Deprecation of `shouldExecute` (discouraged to use if there's no `maxAttempts` in a step)
package/eslint.config.mjs CHANGED
@@ -47,7 +47,6 @@ export default tseslint.config(
47
47
  languageOptions: {
48
48
  parserOptions: {
49
49
  projectService: true,
50
- project: './tsconfig.json',
51
50
  },
52
51
  },
53
52
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@recombine-ai/engine",
3
- "version": "0.8.1",
3
+ "version": "0.8.2",
4
4
  "description": "Recombine AI engine for creating conversational AI agents",
5
5
  "main": "build/index.js",
6
6
  "types": "build/index.d.ts",
@@ -35,7 +35,7 @@
35
35
  },
36
36
  "dependencies": {
37
37
  "nunjucks": "^3.2.4",
38
- "openai": "^4.68.4",
38
+ "openai": "^6.8.1",
39
39
  "zod": "3.23.8",
40
40
  "zod-to-json-schema": "^3.24.6"
41
41
  },
package/readme.md CHANGED
@@ -6,13 +6,13 @@ A TypeScript library for building agentic workflows for conversational AI.
6
6
 
7
7
  ## Features
8
8
 
9
- - 🔄 Multi-step agentic workflows
10
- - 🎯 Conditional execution and reviewers
11
- - 📝 Structured responses using Zod schemas
12
- - 🗂️ File-based prompts
13
- - ⚡ Message history management
14
- - 🌍 Context injection using Nunjucks templates
15
- - 👩‍💻 Ready to be integrated with Recombine Bosun prompt-engineering IDE.
9
+ - 🔄 Multi-step agentic workflows
10
+ - 🎯 Conditional execution and reviewers
11
+ - 📝 Structured responses using Zod schemas
12
+ - 🗂️ File-based prompts
13
+ - ⚡ Message history management
14
+ - 🌍 Context injection using Nunjucks templates
15
+ - 👩‍💻 Ready to be integrated with Recombine Bosun prompt-engineering IDE.
16
16
 
17
17
  ## Installation
18
18
 
@@ -123,28 +123,27 @@ To contribute to this project, you'll need to set up your local development envi
123
123
  2. **Set up Git hooks with Husky:**
124
124
 
125
125
  Git hooks are automatically installed when you run `yarn install` (via the `prepare` script). The project uses Husky to manage the following Git hooks:
126
-
127
126
  - **`pre-commit`**: Runs `lint-staged` to format and lint only staged files using Prettier and ESLint
128
127
  - **`pre-push`**: Runs TypeScript type checking to ensure no type errors before pushing
129
128
  - **`post-merge`**: Automatically runs `yarn install` if `package.json` or `yarn.yaml` changed after a merge
130
129
 
131
130
  ### Available Scripts
132
131
 
133
- - **`yarn dev`** - Start TypeScript compiler in watch mode
134
- - **`yarn build`** - Build the project
135
- - **`yarn typecheck`** - Run TypeScript type checking without emitting files
136
- - **`yarn test`** - Run tests with Vitest
137
- - **`yarn lint`** - Lint code with ESLint
138
- - **`yarn lint:fix`** - Lint and automatically fix issues
139
- - **`yarn format`** - Format code with Prettier
140
- - **`yarn format:check`** - Check code formatting without making changes
132
+ - **`yarn dev`** - Start TypeScript compiler in watch mode
133
+ - **`yarn build`** - Build the project
134
+ - **`yarn typecheck`** - Run TypeScript type checking without emitting files
135
+ - **`yarn test`** - Run tests with Vitest
136
+ - **`yarn lint`** - Lint code with ESLint
137
+ - **`yarn lint:fix`** - Lint and automatically fix issues
138
+ - **`yarn format`** - Format code with Prettier
139
+ - **`yarn format:check`** - Check code formatting without making changes
141
140
 
142
141
  ### Code Quality
143
142
 
144
143
  The project maintains code quality through:
145
144
 
146
- - **TypeScript** for type safety
147
- - **ESLint** for code linting
148
- - **Prettier** for consistent code formatting
149
- - **Vitest** for testing
150
- - **Husky + lint-staged** for automated pre-commit checks
145
+ - **TypeScript** for type safety
146
+ - **ESLint** for code linting
147
+ - **Prettier** for consistent code formatting
148
+ - **Vitest** for testing
149
+ - **Husky + lint-staged** for automated pre-commit checks