SCALE — Build Lab
ロジック · TYPESCRIPT PATTERN

changelog.ts 履歴管理パターン

CATEGORYロジック TYPETypeScript Pattern EFFORT15〜30分 DIFFICULTY
PRIMARY CODE
typescript · lib/changelog.ts
export type ChangeCategory = 'feature' | 'improve' | 'fix' | 'ui' | 'infra' | 'security';

export interface ChangelogEntry {
  id: string;          // ce-YYYY-MM-DD-NN
  date: string;        // YYYY-MM-DD
  time: string;        // HH:MM
  title: string;       // 一行
  category: ChangeCategory;
  scope: string[];     // ['tasks', 'calendar']
  summary: string;     // 1-2行
  details?: string[];
  files?: string[];
  snapshotTs?: string; // 復元用
  href?: string;       // 該当画面URL
  hrefLabel?: string;
}

export const CHANGELOG: ChangelogEntry[] = [
  { /* 最新が先頭 */ },
];

export function getCategoryLabel(c: ChangeCategory) { /* ... */ }
export function getCategoryColor(c: ChangeCategory) { /* ... */ }
USE CASES
  • システム内の変更履歴 UI
  • 更新履歴ページ生成
  • 復元ポイント追跡

changelog.ts 履歴管理パターン

:LiTarget: 用途

配列に「いつ・誰が・何を変えたか」を最上段に append し続けるパターン。/changelog ページで一覧表示。

  • 配列全置換 NG(既存履歴消える事故が起きやすい)
  • 末尾のユーティリティ関数(getCategoryLabel / getCategoryColor)は触らない
  • snapshotTs に紐付けて、その変更前のスナップショットに巻き戻し可能

:LiCode: スキーマ例

export type ChangeCategory = 'feature' | 'improve' | 'fix' | 'ui' | 'infra' | 'security';

export interface ChangelogEntry {
  id: string;          // ce-YYYY-MM-DD-NN
  date: string;        // YYYY-MM-DD
  time: string;        // HH:MM
  title: string;       // 一行
  category: ChangeCategory;
  scope: string[];     // ['tasks', 'calendar']
  summary: string;     // 1-2行
  details?: string[];
  files?: string[];
  snapshotTs?: string; // 復元用
  href?: string;       // 該当画面URL
  hrefLabel?: string;
}

export const CHANGELOG: ChangelogEntry[] = [
  { /* 最新が先頭 */ },
];

export function getCategoryLabel(c: ChangeCategory) { /* ... */ }
export function getCategoryColor(c: ChangeCategory) { /* ... */ }

:LiAlertCircle: 重要ルール(事故から学んだ)

  • 配列全置換禁止(過去の事故: 3049行 → 188行に削減でビルドエラー)
  • 末尾のユーティリティ関数は絶対に触らない(Editold_string で配列内のみ対象に)
  • 編集は最上段への append のみ(既存配列の閉じ括弧 ] より前に新エントリ追加)