From 9a311724df1022a94555536660ee4d9c053bea4f Mon Sep 17 00:00:00 2001 From: ryoppippi <1560508+ryoppippi@users.noreply.github.com> Date: Tue, 9 Dec 2025 16:38:35 +0000 Subject: [PATCH 1/4] refactor(tests): relocate tests to sit alongside implementations Move all test files from src/tests/ to respective implementation directories: - Array, TF-IDF index tests to src/utils/ - Base, StackOne toolset tests to src/toolsets/ - RequestBuilder tests to src/modules/ - Feedback tool tests to src/tools/ - Tool, meta-tools, json-schema tests to src/ - RPC client test remains in src/ Update all relative imports to reflect new file locations. This makes the test file sit horizontally next to its implementation, improving discoverability and maintainability. All tests pass and types are correct. --- src/{tests/exports.spec.ts => index.spec.ts} | 2 +- src/{tests => modules}/requestBuilder.spec.ts | 2 +- src/{tests/json-schema.spec.ts => tool.json-schema.spec.ts} | 2 +- src/{tests/meta-tools.spec.ts => tool.meta-tools.spec.ts} | 4 ++-- src/{tests => }/tool.spec.ts | 6 +++--- src/{tests => }/tool.test-d.ts | 4 ++-- src/{tests => tools}/feedback.spec.ts | 2 +- src/{tests => toolsets}/base.spec.ts | 2 +- src/{tests => toolsets}/stackone.mcp-fetch.spec.ts | 4 ++-- src/{tests => toolsets}/stackone.spec.ts | 4 ++-- src/{tests => utils}/array.spec.ts | 2 +- src/{tests => utils}/tfidf-index.spec.ts | 2 +- 12 files changed, 18 insertions(+), 18 deletions(-) rename src/{tests/exports.spec.ts => index.spec.ts} (94%) rename src/{tests => modules}/requestBuilder.spec.ts (99%) rename src/{tests/json-schema.spec.ts => tool.json-schema.spec.ts} (99%) rename src/{tests/meta-tools.spec.ts => tool.meta-tools.spec.ts} (99%) rename src/{tests => }/tool.spec.ts (99%) rename src/{tests => }/tool.test-d.ts (94%) rename src/{tests => tools}/feedback.spec.ts (99%) rename src/{tests => toolsets}/base.spec.ts (98%) rename src/{tests => toolsets}/stackone.mcp-fetch.spec.ts (99%) rename src/{tests => toolsets}/stackone.spec.ts (97%) rename src/{tests => utils}/array.spec.ts (87%) rename src/{tests => utils}/tfidf-index.spec.ts (99%) diff --git a/src/tests/exports.spec.ts b/src/index.spec.ts similarity index 94% rename from src/tests/exports.spec.ts rename to src/index.spec.ts index ab1676da..a329197f 100644 --- a/src/tests/exports.spec.ts +++ b/src/index.spec.ts @@ -1,4 +1,4 @@ -import * as StackOneAI from '../index'; +import * as StackOneAI from './index'; describe('Module Exports', () => { it('should export main classes and utilities', () => { diff --git a/src/tests/requestBuilder.spec.ts b/src/modules/requestBuilder.spec.ts similarity index 99% rename from src/tests/requestBuilder.spec.ts rename to src/modules/requestBuilder.spec.ts index 848a7b37..d6be823b 100644 --- a/src/tests/requestBuilder.spec.ts +++ b/src/modules/requestBuilder.spec.ts @@ -1,8 +1,8 @@ import { http, HttpResponse } from 'msw'; import { server } from '../../mocks/node'; -import { RequestBuilder } from '../modules/requestBuilder'; import { type HttpExecuteConfig, ParameterLocation } from '../types'; import { StackOneAPIError } from '../utils/errors'; +import { RequestBuilder } from './requestBuilder'; describe('RequestBuilder', () => { let builder: RequestBuilder; diff --git a/src/tests/json-schema.spec.ts b/src/tool.json-schema.spec.ts similarity index 99% rename from src/tests/json-schema.spec.ts rename to src/tool.json-schema.spec.ts index d8c0cf56..751d6a08 100644 --- a/src/tests/json-schema.spec.ts +++ b/src/tool.json-schema.spec.ts @@ -1,6 +1,6 @@ import { jsonSchema } from 'ai'; import type { JSONSchema7 } from 'json-schema'; -import { StackOneTool } from '../tool'; +import { StackOneTool } from './tool'; describe('Schema Validation', () => { describe('Array Items in Schema', () => { diff --git a/src/tests/meta-tools.spec.ts b/src/tool.meta-tools.spec.ts similarity index 99% rename from src/tests/meta-tools.spec.ts rename to src/tool.meta-tools.spec.ts index 4156402f..09530f2b 100644 --- a/src/tests/meta-tools.spec.ts +++ b/src/tool.meta-tools.spec.ts @@ -1,6 +1,6 @@ import { assert } from 'vitest'; -import { BaseTool, type MetaToolSearchResult, Tools } from '../tool'; -import { ParameterLocation } from '../types'; +import { BaseTool, type MetaToolSearchResult, Tools } from './tool'; +import { ParameterLocation } from './types'; // Create mock tools for testing const createMockTools = (): BaseTool[] => { diff --git a/src/tests/tool.spec.ts b/src/tool.spec.ts similarity index 99% rename from src/tests/tool.spec.ts rename to src/tool.spec.ts index 04e49367..5078f4e6 100644 --- a/src/tests/tool.spec.ts +++ b/src/tool.spec.ts @@ -1,6 +1,6 @@ -import { BaseTool, StackOneTool, Tools } from '../tool'; -import { type ExecuteConfig, ParameterLocation, type ToolParameters } from '../types'; -import { StackOneAPIError } from '../utils/errors'; +import { BaseTool, StackOneTool, Tools } from './tool'; +import { type ExecuteConfig, ParameterLocation, type ToolParameters } from './types'; +import { StackOneAPIError } from './utils/errors'; // Create a mock tool for testing const createMockTool = (headers?: Record): BaseTool => { diff --git a/src/tests/tool.test-d.ts b/src/tool.test-d.ts similarity index 94% rename from src/tests/tool.test-d.ts rename to src/tool.test-d.ts index b2cce361..e894bf34 100644 --- a/src/tests/tool.test-d.ts +++ b/src/tool.test-d.ts @@ -1,7 +1,7 @@ import type { ChatCompletionFunctionTool } from 'openai/resources/chat/completions'; import { assertType, test } from 'vitest'; -import { BaseTool, Tools } from '../tool'; -import type { AISDKToolResult } from '../types'; +import { BaseTool, Tools } from './tool'; +import type { AISDKToolResult } from './types'; const tool = new BaseTool( 'test_tool', diff --git a/src/tests/feedback.spec.ts b/src/tools/feedback.spec.ts similarity index 99% rename from src/tests/feedback.spec.ts rename to src/tools/feedback.spec.ts index 6249ae75..b584c4aa 100644 --- a/src/tests/feedback.spec.ts +++ b/src/tools/feedback.spec.ts @@ -1,7 +1,7 @@ import { http, HttpResponse } from 'msw'; import { server } from '../../mocks/node'; -import { createFeedbackTool } from '../tools/feedback'; import { StackOneError } from '../utils/errors'; +import { createFeedbackTool } from './feedback'; interface FeedbackResultItem { account_id: string; diff --git a/src/tests/base.spec.ts b/src/toolsets/base.spec.ts similarity index 98% rename from src/tests/base.spec.ts rename to src/toolsets/base.spec.ts index 3130339e..e300d715 100644 --- a/src/tests/base.spec.ts +++ b/src/toolsets/base.spec.ts @@ -1,4 +1,4 @@ -import { ToolSet } from '../toolsets/base'; +import { ToolSet } from './base'; // Create a concrete implementation of the abstract ToolSet class for testing class TestToolSet extends ToolSet { diff --git a/src/tests/stackone.mcp-fetch.spec.ts b/src/toolsets/stackone.mcp-fetch.spec.ts similarity index 99% rename from src/tests/stackone.mcp-fetch.spec.ts rename to src/toolsets/stackone.mcp-fetch.spec.ts index 034acc08..047158c5 100644 --- a/src/tests/stackone.mcp-fetch.spec.ts +++ b/src/toolsets/stackone.mcp-fetch.spec.ts @@ -7,8 +7,8 @@ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; import { Hono } from 'hono'; import { z } from 'zod'; import { server as mswServer } from '../../mocks/node'; -import { ToolSet } from '../toolsets/base'; -import { StackOneToolSet } from '../toolsets/stackone'; +import { ToolSet } from './base'; +import { StackOneToolSet } from './stackone'; // Bun runtime types for test environment declare const Bun: { diff --git a/src/tests/stackone.spec.ts b/src/toolsets/stackone.spec.ts similarity index 97% rename from src/tests/stackone.spec.ts rename to src/toolsets/stackone.spec.ts index 92794a5d..21770f7c 100644 --- a/src/tests/stackone.spec.ts +++ b/src/toolsets/stackone.spec.ts @@ -1,5 +1,5 @@ -import { ToolSetConfigError } from '../toolsets/base'; -import { StackOneToolSet } from '../toolsets/stackone'; +import { ToolSetConfigError } from './base'; +import { StackOneToolSet } from './stackone'; describe('StackOneToolSet', () => { beforeEach(() => { diff --git a/src/tests/array.spec.ts b/src/utils/array.spec.ts similarity index 87% rename from src/tests/array.spec.ts rename to src/utils/array.spec.ts index 5da3c051..9c42ba76 100644 --- a/src/tests/array.spec.ts +++ b/src/utils/array.spec.ts @@ -1,4 +1,4 @@ -import { toArray } from '../utils/array'; +import { toArray } from './array'; describe('toArray', () => { it.each([ diff --git a/src/tests/tfidf-index.spec.ts b/src/utils/tfidf-index.spec.ts similarity index 99% rename from src/tests/tfidf-index.spec.ts rename to src/utils/tfidf-index.spec.ts index df4d06a3..f6d22de7 100644 --- a/src/tests/tfidf-index.spec.ts +++ b/src/utils/tfidf-index.spec.ts @@ -1,4 +1,4 @@ -import { TfidfIndex } from '../utils/tfidf-index'; +import { TfidfIndex } from './tfidf-index'; describe('TF-IDF Index - Core Functionality', () => { test('ranks documents by cosine similarity with tf-idf weighting', () => { From 8365a8b67dbd6a0c0a449ab620a7f1c4524ae323 Mon Sep 17 00:00:00 2001 From: ryoppippi <1560508+ryoppippi@users.noreply.github.com> Date: Tue, 9 Dec 2025 16:40:14 +0000 Subject: [PATCH 2/4] refactor(tests): rename .spec.ts files to .test.ts Rename all test files from .spec.ts to .test.ts convention for consistency with industry standards. Test files now use a uniform naming scheme across the entire project. --- src/{index.spec.ts => index.test.ts} | 0 src/modules/{requestBuilder.spec.ts => requestBuilder.test.ts} | 0 src/{rpc-client.spec.ts => rpc-client.test.ts} | 0 src/{tool.json-schema.spec.ts => tool.json-schema.test.ts} | 0 src/{tool.meta-tools.spec.ts => tool.meta-tools.test.ts} | 0 src/{tool.spec.ts => tool.test.ts} | 0 src/tools/{feedback.spec.ts => feedback.test.ts} | 0 src/toolsets/{base.spec.ts => base.test.ts} | 0 .../{stackone.mcp-fetch.spec.ts => stackone.mcp-fetch.test.ts} | 0 src/toolsets/{stackone.spec.ts => stackone.test.ts} | 0 src/utils/{array.spec.ts => array.test.ts} | 0 src/utils/{tfidf-index.spec.ts => tfidf-index.test.ts} | 0 12 files changed, 0 insertions(+), 0 deletions(-) rename src/{index.spec.ts => index.test.ts} (100%) rename src/modules/{requestBuilder.spec.ts => requestBuilder.test.ts} (100%) rename src/{rpc-client.spec.ts => rpc-client.test.ts} (100%) rename src/{tool.json-schema.spec.ts => tool.json-schema.test.ts} (100%) rename src/{tool.meta-tools.spec.ts => tool.meta-tools.test.ts} (100%) rename src/{tool.spec.ts => tool.test.ts} (100%) rename src/tools/{feedback.spec.ts => feedback.test.ts} (100%) rename src/toolsets/{base.spec.ts => base.test.ts} (100%) rename src/toolsets/{stackone.mcp-fetch.spec.ts => stackone.mcp-fetch.test.ts} (100%) rename src/toolsets/{stackone.spec.ts => stackone.test.ts} (100%) rename src/utils/{array.spec.ts => array.test.ts} (100%) rename src/utils/{tfidf-index.spec.ts => tfidf-index.test.ts} (100%) diff --git a/src/index.spec.ts b/src/index.test.ts similarity index 100% rename from src/index.spec.ts rename to src/index.test.ts diff --git a/src/modules/requestBuilder.spec.ts b/src/modules/requestBuilder.test.ts similarity index 100% rename from src/modules/requestBuilder.spec.ts rename to src/modules/requestBuilder.test.ts diff --git a/src/rpc-client.spec.ts b/src/rpc-client.test.ts similarity index 100% rename from src/rpc-client.spec.ts rename to src/rpc-client.test.ts diff --git a/src/tool.json-schema.spec.ts b/src/tool.json-schema.test.ts similarity index 100% rename from src/tool.json-schema.spec.ts rename to src/tool.json-schema.test.ts diff --git a/src/tool.meta-tools.spec.ts b/src/tool.meta-tools.test.ts similarity index 100% rename from src/tool.meta-tools.spec.ts rename to src/tool.meta-tools.test.ts diff --git a/src/tool.spec.ts b/src/tool.test.ts similarity index 100% rename from src/tool.spec.ts rename to src/tool.test.ts diff --git a/src/tools/feedback.spec.ts b/src/tools/feedback.test.ts similarity index 100% rename from src/tools/feedback.spec.ts rename to src/tools/feedback.test.ts diff --git a/src/toolsets/base.spec.ts b/src/toolsets/base.test.ts similarity index 100% rename from src/toolsets/base.spec.ts rename to src/toolsets/base.test.ts diff --git a/src/toolsets/stackone.mcp-fetch.spec.ts b/src/toolsets/stackone.mcp-fetch.test.ts similarity index 100% rename from src/toolsets/stackone.mcp-fetch.spec.ts rename to src/toolsets/stackone.mcp-fetch.test.ts diff --git a/src/toolsets/stackone.spec.ts b/src/toolsets/stackone.test.ts similarity index 100% rename from src/toolsets/stackone.spec.ts rename to src/toolsets/stackone.test.ts diff --git a/src/utils/array.spec.ts b/src/utils/array.test.ts similarity index 100% rename from src/utils/array.spec.ts rename to src/utils/array.test.ts diff --git a/src/utils/tfidf-index.spec.ts b/src/utils/tfidf-index.test.ts similarity index 100% rename from src/utils/tfidf-index.spec.ts rename to src/utils/tfidf-index.test.ts From d5d6db96a033a122fc52d7bcc6b49f5c4e1a98e5 Mon Sep 17 00:00:00 2001 From: ryoppippi <1560508+ryoppippi@users.noreply.github.com> Date: Tue, 9 Dec 2025 16:40:18 +0000 Subject: [PATCH 3/4] refactor(config): update vitest configuration for .test.ts naming Update vitest.config.ts to reference .test.ts files instead of .spec.ts: - Change include patterns from *.spec.ts to *.test.ts - Simplify coverage exclude patterns by removing deprecated patterns - Update typecheck include patterns to match new naming convention - Fix outdated path reference in exclude list --- vitest.config.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/vitest.config.ts b/vitest.config.ts index 6ec78a24..7fc06d0e 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -9,7 +9,7 @@ export default defineConfig({ provider: 'v8', reporter: ['text', 'json', 'json-summary', 'html'], include: ['src/**/*.ts', 'examples/**/*.ts'], - exclude: ['**/*.spec.ts', '**/*.test.ts', '**/*.test-d.ts', '**/tests/**'], + exclude: ['**/*.test.ts', '**/*.test-d.ts'], }, projects: [ { @@ -17,12 +17,12 @@ export default defineConfig({ test: { name: 'root', root: '.', - include: ['src/**/*.spec.ts', 'scripts/**/*.spec.ts'], - exclude: ['node_modules', 'dist', 'examples', 'src/toolsets/tests/stackone.mcp-fetch.spec.ts'], + include: ['src/**/*.test.ts', 'scripts/**/*.test.ts'], + exclude: ['node_modules', 'dist', 'examples', 'src/toolsets/stackone.mcp-fetch.test.ts'], setupFiles: ['./vitest.setup.ts'], typecheck: { enabled: true, - include: ['src/**/*.spec.ts', 'src/**/*.test-d.ts'], + include: ['src/**/*.test.ts', 'src/**/*.test-d.ts'], }, }, }, From ae06ad810e3d68e39a20188400c5694e48a6de0f Mon Sep 17 00:00:00 2001 From: ryoppippi <1560508+ryoppippi@users.noreply.github.com> Date: Tue, 9 Dec 2025 16:41:15 +0000 Subject: [PATCH 4/4] refactor(skills): update test file naming from .spec.ts to .test.ts Update Claude Code skill documentation to reflect the new .test.ts naming convention for test files: - Update typescript-testing skill globs from *.spec.ts to *.test.ts - Update example commands to use .test.ts file paths - Remove outdated pnpm test:unit command reference - Update development-workflow skill with new naming convention --- .claude/skills/development-workflow/SKILL.md | 3 +-- .claude/skills/typescript-testing/SKILL.md | 5 ++--- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/.claude/skills/development-workflow/SKILL.md b/.claude/skills/development-workflow/SKILL.md index 39c9e485..ca1c7814 100644 --- a/.claude/skills/development-workflow/SKILL.md +++ b/.claude/skills/development-workflow/SKILL.md @@ -19,8 +19,7 @@ This skill provides all commands and best practices for building, developing, an ## Testing - `pnpm test` - Run all tests (unit, examples, scripts) -- `pnpm test:unit` - Run only unit tests -- `pnpm vitest src/path/to/file.spec.ts` - Run a specific test file +- `pnpm vitest src/path/to/file.test.ts` - Run a specific test file - `pnpm vitest -t "test name"` - Run tests matching a pattern ## Code Quality diff --git a/.claude/skills/typescript-testing/SKILL.md b/.claude/skills/typescript-testing/SKILL.md index 05e4ae74..b13b7087 100644 --- a/.claude/skills/typescript-testing/SKILL.md +++ b/.claude/skills/typescript-testing/SKILL.md @@ -1,7 +1,7 @@ --- name: typescript-testing description: Use when writing or running tests. Covers Vitest commands, MSW HTTP mocking, fs-fixture for file system tests. (project) -globs: "*.spec.ts" +globs: "*.test.ts" alwaysApply: false --- @@ -13,8 +13,7 @@ This skill guides testing practices for the StackOne SDK using Vitest test runne The project uses **Vitest** as the test runner. Run tests with: - `pnpm test` - Run all tests (unit, examples, scripts) -- `pnpm test:unit` - Run only unit tests -- `pnpm vitest src/path/to/file.spec.ts` - Run a specific test file +- `pnpm vitest src/path/to/file.test.ts` - Run a specific test file - `pnpm vitest -t "test name"` - Run tests matching a pattern ### Vitest Globals