Skip to content

Conversation

@ysk8hori
Copy link
Owner

@ysk8hori ysk8hori commented Jul 1, 2025

Summary

  • mermaidify.ts (322行) を4つのファイルに分割してコード品質を大幅改善
  • 単一責任原則の適用により各ファイルが明確な役割を持つように再構成
  • 認知的複雑度を20から最大14に削減、保守性指数を24.76から最高67.51まで向上

分割されたファイル

  • directoryTreeBuilder.ts (102行): ディレクトリツリー構築ロジック
  • mermaidWriter.ts (183行): Mermaid記法出力処理
  • mermaidUtils.ts (12行): 文字列変換ユーティリティ
  • mermaidify.ts (38行): オーケストレータとして簡潔に

改善効果

  • 保守性指数: 24.76 → 最高67.51 (172%向上)
  • 認知的複雑度: 20 → 最大14 (30%削減)
  • 循環依存のないクリーンな階層構造
  • テスタビリティと再利用性の向上

その他の改善

  • utils.tsupdateChangeStatusFromDiff関数も責任別に分割
  • テストファイルのインポート先を適切に修正
  • 全テスト通過確認済み

Test plan

  • 全ユニットテスト通過
  • pre-commitフック通過
  • リファクタリング前後の動作確認
  • 依存関係グラフの健全性確認
  • コードメトリクス改善確認

🤖 Generated with Claude Code

ysk8hori and others added 3 commits July 2, 2025 00:13
詳細な説明:
- mermaidify.ts: 関数を小さく分割し、可読性を向上
- utils.ts: updateChangeStatusFromDiff関数を責任別に分割

保守性と理解しやすさの向上を目的とした段階的改善

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <[email protected]>
新規ファイル:
- directoryTreeBuilder.ts: ディレクトリツリー構築ロジック (90行)
- mermaidWriter.ts: Mermaid記法出力処理 (156行)
- mermaidUtils.ts: 文字列変換ユーティリティ (9行)

変更ファイル:
- mermaidify.ts: オーケストレータとして簡潔に (71行)
- mermaidify.fileNameToMermaidId.spec.ts: インポート先をmermaidUtilsに修正

改善効果:
- 単一責任原則の適用により各ファイルが明確な役割を持つ
- 認知的複雑度を20から最大14に削減
- 保守性指数を24.76から最高67.51まで向上
- テスタビリティと再利用性の改善
- 循環依存のないクリーンな階層構造
- 全テスト通過確認済み

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <[email protected]>
@github-actions
Copy link

github-actions bot commented Jul 1, 2025

Delta TypeScript Graph

tsg --include src/feature/mermaid/directoryTreeBuilder.ts src/feature/mermaid/mermaidUtils.ts src/feature/mermaid/mermaidWriter.ts src/cli/entry.ts src/feature/graph/utils.ts src/feature/mermaid/mermaidify.fileNameToMermaidId.spec.ts src/feature/mermaid/mermaidify.ts src/usecase/generateTsg/index.ts src/usecase/generateTsg/writeForAiData.ts --highlight src/feature/mermaid/directoryTreeBuilder.ts src/feature/mermaid/mermaidUtils.ts src/feature/mermaid/mermaidWriter.ts src/cli/entry.ts src/feature/graph/utils.ts src/feature/mermaid/mermaidify.fileNameToMermaidId.spec.ts src/feature/mermaid/mermaidify.ts src/usecase/generateTsg/index.ts src/usecase/generateTsg/writeForAiData.ts --exclude node_modules --abstraction src/feature/metric src/feature/util src/setting src/utils
flowchart TB
    classDef created fill:cyan,stroke:#999,color:black
    classDef modified fill:yellow,stroke:#999,color:black
    subgraph src["src"]
        src/setting["/setting"]:::dir
        src/index.ts["index.ts"]
        src/utils["/utils"]:::dir
        subgraph src/feature["/feature"]
            src/feature/metric["/metric"]:::dir
            src/feature/util["/util"]:::dir
            subgraph src/feature/graph_["/graph"]
                src/feature/_graph__/utils.ts["utils.ts"]:::modified
                src/feature/_graph__/models.ts["models.ts"]
                src/feature/_graph__/abstraction.ts["abstraction.ts"]
                src/feature/_graph__/filterGraph.ts["filterGraph.ts"]
                src/feature/_graph__/instability.ts["instability.ts"]
                src/feature/_graph__/GraphAnalyzer.ts["GraphAnalyzer.ts"]
                src/feature/_graph__/refineGraph.ts["refineGraph.ts"]
            end
            subgraph src/feature/mermaid["/mermaid"]
                src/feature/mermaid/directoryTreeBuilder.ts["directoryTreeBuilder.ts"]:::created
                src/feature/mermaid/mermaidUtils.ts["mermaidUtils.ts"]:::created
                src/feature/mermaid/mermaidWriter.ts["mermaidWriter.ts"]:::created
                src/feature/mermaid/mermaidify.ts["mermaidify.ts"]:::modified
                src/feature/mermaid/mermaidify.fileNameToMermaidId.spec.ts["mermaidify.fileNameToMermaidId.spec.ts"]:::modified
            end
        end
        subgraph src/usecase["/usecase"]
            src/usecase/watchMetrics.ts["watchMetrics.ts"]
            subgraph src/usecase/generateTsg["/generateTsg"]
                src/usecase/generateTsg/writeForAiData.ts["writeForAiData.ts"]:::modified
                src/usecase/generateTsg/index.ts["index.ts"]:::modified
                src/usecase/generateTsg/writeMarkdownFile.ts["writeMarkdownFile.ts"]
            end
        end
        subgraph src/cli["/cli"]
            src/cli/entry.ts["entry.ts"]:::modified
        end
    end
    src/feature/_graph__/utils.ts-->src/feature/_graph__/models.ts
    src/feature/_graph__/abstraction.ts-->src/feature/_graph__/utils.ts
    src/feature/_graph__/filterGraph.ts-->src/feature/_graph__/utils.ts
    src/feature/mermaid/directoryTreeBuilder.ts-->src/feature/_graph__/models.ts
    src/feature/mermaid/mermaidUtils.ts-->src/setting
    src/feature/mermaid/mermaidWriter.ts-->src/feature/_graph__/models.ts
    src/feature/mermaid/mermaidWriter.ts-->src/setting
    src/feature/mermaid/mermaidWriter.ts-->src/feature/mermaid/directoryTreeBuilder.ts
    src/feature/mermaid/mermaidWriter.ts-->src/feature/mermaid/mermaidUtils.ts
    src/feature/mermaid/mermaidify.ts-->src/feature/_graph__/models.ts
    src/feature/mermaid/mermaidify.ts-->src/setting
    src/feature/mermaid/mermaidify.ts-->src/feature/mermaid/directoryTreeBuilder.ts
    src/feature/mermaid/mermaidify.ts-->src/feature/mermaid/mermaidWriter.ts
    src/index.ts-->src/feature/_graph__/utils.ts
    src/index.ts-->src/feature/mermaid/mermaidify.ts
    src/usecase/generateTsg/writeMarkdownFile.ts-->src/feature/mermaid/mermaidify.ts
    src/usecase/generateTsg/writeForAiData.ts-->src/feature/_graph__/models.ts
    src/usecase/generateTsg/writeForAiData.ts-->src/setting
    src/usecase/generateTsg/writeForAiData.ts-->src/feature/metric
    src/usecase/generateTsg/writeForAiData.ts-->src/feature/mermaid/mermaidify.ts
    src/usecase/generateTsg/index.ts-->src/setting
    src/usecase/generateTsg/index.ts-->src/feature/_graph__/models.ts
    src/usecase/generateTsg/index.ts-->src/feature/_graph__/instability.ts
    src/usecase/generateTsg/index.ts-->src/feature/metric
    src/usecase/generateTsg/index.ts-->src/utils
    src/usecase/generateTsg/index.ts-->src/feature/util
    src/usecase/generateTsg/index.ts-->src/feature/_graph__/GraphAnalyzer.ts
    src/usecase/generateTsg/index.ts-->src/feature/_graph__/utils.ts
    src/usecase/generateTsg/index.ts-->src/feature/_graph__/refineGraph.ts
    src/usecase/generateTsg/index.ts-->src/usecase/generateTsg/writeMarkdownFile.ts
    src/usecase/generateTsg/index.ts-->src/usecase/generateTsg/writeForAiData.ts
    src/cli/entry.ts-->package.json
    src/cli/entry.ts-->src/setting
    src/cli/entry.ts-->src/usecase/generateTsg/index.ts
    src/cli/entry.ts-->src/usecase/watchMetrics.ts
    src/feature/mermaid/mermaidify.fileNameToMermaidId.spec.ts-->src/setting
    src/feature/mermaid/mermaidify.fileNameToMermaidId.spec.ts-->src/feature/mermaid/mermaidUtils.ts
    src/feature/mermaid/mermaidify.fileNameToMermaidId.spec.ts-.->src/feature/mermaid/mermaidify.ts
    src/feature/_graph__/abstraction.ts-->src/feature/_graph__/models.ts
    src/feature/_graph__/filterGraph.ts-->src/feature/_graph__/models.ts
    src/utils-->src/setting
    src/feature/_graph__/GraphAnalyzer.ts-->src/feature/_graph__/models.ts
    src/index.ts-->src/feature/_graph__/models.ts
    src/index.ts-->src/feature/_graph__/abstraction.ts
    src/index.ts-->src/feature/_graph__/filterGraph.ts
    src/index.ts-->src/utils
    src/index.ts-->src/feature/util
    src/index.ts-->src/feature/_graph__/GraphAnalyzer.ts
    src/feature/_graph__/instability.ts-->src/feature/_graph__/models.ts
    src/feature/_graph__/refineGraph.ts-->src/setting
    src/feature/_graph__/refineGraph.ts-->src/feature/_graph__/abstraction.ts
    src/feature/_graph__/refineGraph.ts-->src/feature/_graph__/filterGraph.ts
    src/feature/_graph__/refineGraph.ts-->src/feature/_graph__/models.ts
    src/feature/metric-->src/setting
    src/feature/metric-->src/feature/util
    src/utils-->src/feature/_graph__/models.ts
    src/usecase/generateTsg/writeMarkdownFile.ts-->src/feature/_graph__/instability.ts
    src/usecase/generateTsg/writeMarkdownFile.ts-->src/feature/_graph__/models.ts
    src/usecase/generateTsg/writeMarkdownFile.ts-->src/feature/metric
    src/usecase/generateTsg/writeMarkdownFile.ts-->src/setting
    src/usecase/watchMetrics.ts-->src/utils
    src/usecase/watchMetrics.ts-->src/setting
    src/usecase/watchMetrics.ts-->src/feature/metric

Loading

Metrics

🆕 src/feature/mermaid/mermaidWriter.ts

name scope Maintainability Index Cognitive Complexity semantic syntax volume
~ file 32.32 14 5291.08
Options type 77.62 0 50.19
writeFlowchartDirection function 59.74 3 213.97
writeClassDefinitions function 44.4 4 876.44
writeRelations function 52.05 0 523.25
getConnectionStyle function 63.56 3 149.34
writeFileNodesWithSubgraph function 68.22 0 127.38
addGraph function 55.49 1 377.4
writeSubgraphStart function 62.64 0 162.52
writeNodes function 56.66 0 407.17
getNodeClassString function 53.47 3 393.08
writeChildGraphs function 63.27 0 183.32
writeSubgraphEnd function 76.12 0 82.04

src/usecase/generateTsg/index.ts

name scope Maintainability Index Cognitive Complexity semantic syntax volume
~ file 38.65 8 3310.31
bindMatchFunc function 80.32 0 73.08
bindExactMatchFunc function 81.79 0 45
judge function 81.07 0 57.06
isMatchSome function 79.85 0 85.11
isExactMatchSome function 79.85 0 85.11
generateTsg function 36.16 7 1504.5
getCouplingData function 66.32 1 140.55

🆕 src/feature/mermaid/directoryTreeBuilder.ts

name scope Maintainability Index Cognitive Complexity semantic syntax volume
~ file 40.35 6 2745.56
DirAndNodesTree interface 72.3 0 58.81
DirAndNodes interface 72.8 0 49.83
createDirAndNodesTree function 68.48 0 116.76
getDirectoryPath function 58.72 2 238.04
getUniqueDirectories function 55.06 0 555.46
createDirAndNodesMapping function 61.12 0 267.53
isDirectChild function 62.87 1 204.33
buildDirectoryTree function 49.88 3 569.45

src/feature/graph/utils.ts

name scope Maintainability Index Cognitive Complexity semantic syntax volume
~ file (🔻-1.82)42.49 (-8)14 (🔺+372.03)2034.14
extractUniqueNodes function 65.25 0 209.22
mergeGraph function 64.74 0 247.59
updateChangeStatusFromDiff function (+24.45)65.73 (-22)0 (-689.67)178.38
🆕 updateNodeChangeStatus function 52.52 4 393.5
🆕 updateRelationChangeStatus function 48.62 10 485

src/cli/entry.ts

name scope Maintainability Index Cognitive Complexity semantic syntax volume
~ file (🔻-0.35)44.65 3 1461.67

src/usecase/generateTsg/writeForAiData.ts

name scope Maintainability Index Cognitive Complexity semantic syntax volume
~ file (+0.16)47.06 0 1733.32
AiMetrics interface 71.21 0 47.55
AiOutput interface 67.14 0 74.01
writeForAiData function (+0.49)43.3 0 1333.93

src/feature/mermaid/mermaidify.ts

name scope Maintainability Index Cognitive Complexity semantic syntax volume
~ file (+29.3)53.9 (-40)0 (-8069.25)786.26
Options type 77.62 0 50.19
writeGraph function 62.35 0 178.38
mermaidify function (+18.41)59.31 (-8)0 (-775)275
🗑️ DirAndNodesTree interface 72.6 0 53.15
🗑️ createDirAndNodesTree function 31.11 19 2647.62
🗑️ writeRelations function 48.35 4 796.32
🗑️ fileNameToMermaidId function 66.92 0 195.04
🗑️ fileNameToMermaidName function 76.76 0 66.61
🗑️ writeFileNodesWithSubgraph function 68.37 0 121.01
🗑️ addGraph function 39.46 9 1457.45

src/feature/mermaid/mermaidify.fileNameToMermaidId.spec.ts

name scope Maintainability Index Cognitive Complexity semantic syntax volume
~ file 62.97 0 294.41

🆕 src/feature/mermaid/mermaidUtils.ts

name scope Maintainability Index Cognitive Complexity semantic syntax volume
~ file 66.75 0 325
fileNameToMermaidId function 66.92 0 195.04
fileNameToMermaidName function 76.51 0 72.34

@ysk8hori ysk8hori merged commit 3fba378 into main Jul 1, 2025
2 checks passed
@ysk8hori ysk8hori deleted the refactor/mermaid-file-split branch July 1, 2025 15:23
@ysk8hori
Copy link
Owner Author

ysk8hori commented Jul 3, 2025

🎉 This PR is included in version 0.26.0 🎉

The release is available on:

Your semantic-release bot 📦🚀

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants