本文へ移動
cccskills
無料GitHub で公開

style-guide

TypeScript and test style conventions for the testmex monorepo. Use when writing or reviewing TypeScript types, interfaces, core domain models, or tests in this repository.

インストール方法を見る

含まれるファイル(1)

  • SKILL.md3.8 KB

SKILL.md(原文)

インストールする前に、エージェントに与えられる指示の中身を確認できます。

Style Guide

Module layout: main types first

Put the main exported types and functions at the top of the file. Place the types and helper functions they depend on below, ordered from outer to inner.

// ✅
export class ProgressReporterFake { /* … */ }

export interface PhaseState {
  steps: readonly StepState[];
}

export interface StepState {
  subSteps: readonly SubStepState[];
}

export interface SubStepState {
  message: string;
}

interface MutablePhaseState { /* … */ }

// ❌ — leaf types before the class that exposes them
export interface SubStepState { /* … */ }
export interface StepState { /* … */ }
export class ProgressReporterFake { /* … */ }

Object shapes: prefer interface

Use interface for object shapes. Use type only when interface cannot express the shape (unions, intersections, mapped types, branded primitives).

// ✅
export interface Workspace {
  info: WorkspaceState;
  tree: Tree;
}

// ❌
export type Workspace = { info: WorkspaceState; tree: Tree };

Branded strings

Use a branded string plus a factory function for domain primitives that must not be confused with plain strings.

export type RelativePath = string & { readonly [__relativePathBrand]: true };

export function relativePath(path: string): RelativePath {
  return path as RelativePath;
}

declare const __relativePathBrand: unique symbol;

Apply the same pattern to FindingType and similar domain strings. Use findingType() at call sites.

Module-level constants

Use UPPER_SNAKE_CASE for module-level constant bindings (arrays, config objects, magic strings shared within a file).

// ✅
const EXCLUDED_CODE_FILE_NAMES = [
  'jest.config.ts',
  'vitest.config.ts',
] as const;

// ❌
const excludedCodeFileNames = ['jest.config.ts', 'vitest.config.ts'] as const;

Test names

Start test descriptions in lower case: it('staged write is visible…').

Use Class or function for describe suite names — do not use Class.name or function.name (e.g. describe(Vitestify, …) not describe(Vitestify.name, …)).

Do not use it.each (or describe.each). Repeat the test case with a separate it for each input.

// ✅
it('returns true for src/app.spec.ts', () => {
  expect(isTestFile(relativePath('src/app.spec.ts'))).toBe(true);
});

it('returns true for src/app.test.ts', () => {
  expect(isTestFile(relativePath('src/app.test.ts'))).toBe(true);
});

// ❌
it.each(['src/app.spec.ts', 'src/app.test.ts'])(
  'returns true for %s',
  (path) => {
    expect(isTestFile(relativePath(path))).toBe(true);
  },
);

Assertions

Prefer inlined expected values over variables — the assertion should read as a self-contained statement of what the test checks.

// ✅
expect(await tree.maybeReadFile(mainPath)).toBe('console.log("hello");');
expect(tree.changes()).toEqual([{ type: 'delete', path: 'the/main/path.ts' }]);

// ❌
const expectedContent = 'console.log("hello");';
const expectedChanges = [{ type: 'delete', path: mainPath }];
expect(await tree.maybeReadFile(mainPath)).toBe(expectedContent);
expect(tree.changes()).toEqual(expectedChanges);

When a test has more than one expect, use expect.soft so every assertion runs and failures are reported together.

// ✅
expect.soft(await tree.maybeReadFile(mainPath)).toBeNull();
expect
  .soft(tree.changes())
  .toEqual([{ type: 'delete', path: 'the/main/path.ts' }]);

// ❌
expect(await tree.maybeReadFile(mainPath)).toBeNull();
expect(tree.changes()).toEqual([{ type: 'delete', path: mainPath }]);

A single expect in a test may use plain expect.

レビュー

まだレビューはありません。使ってみた感想をお寄せください。

同じリポジトリのスキル

概要と使いどころ

Continues Charted Coding work for a PR by routing to scaffold, red, or green based on design doc progress. Use when resuming work on a PR, continuing TDD after a break, or when the user invokes charted continue with a design doc and PR number.

日本語の概要は準備中です。原文の説明を表示しています。

testmex/testmex42026年7月23日 更新

Interviews the user section by section to collaboratively produce design documents. Use when creating a design doc, starting feature design, or when the user invokes the design command.

日本語の概要は準備中です。原文の説明を表示しています。

testmex/testmex42026年7月23日 更新

Progressively activates todo tests one at a time, updates implementation code until each passes (verified via Wallaby), checks off matching design doc progress, then moves to the next—following the design doc as the single source of truth.

日本語の概要は準備中です。原文の説明を表示しています。

testmex/testmex42026年7月23日 更新

Runs Charted Coding iterations in a loop — route via charted-continue, batch red or green work for an entire test file, commit, then repeat until the PR is complete. Infers design doc and PR number when omitted. Use when the user invokes charted loop, wants batch TDD for a PR test file, or asks to continue charted work with commits.

日本語の概要は準備中です。原文の説明を表示しています。

testmex/testmex42026年7月23日 更新

Writes the next failing test based on provided design doc and existing todo tests

日本語の概要は準備中です。原文の説明を表示しています。

testmex/testmex42026年7月23日 更新

Reviews a design doc with expert sub-agents

日本語の概要は準備中です。原文の説明を表示しています。

testmex/testmex42026年7月23日 更新

testmex のスキルをすべて見る

このスキルの問題を報告する