@sk8metal/michi-cli 0.8.5 → 0.8.6

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.
package/CHANGELOG.md CHANGED
@@ -7,6 +7,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.8.6] - 2025-12-22
11
+
12
+ ### Fixed
13
+
14
+ - **Multi-Repo templates not copied to dist during build** (#118)
15
+ - Fixed `michi multi-repo:init` failing with "Multi-Repo template not found" error
16
+ - Added `copyDirectory()` function to `scripts/copy-static-assets.js` to recursively copy template directories
17
+ - `templates/multi-repo/` is now correctly copied to `dist/templates/multi-repo/` during build
18
+ - All Multi-Repo templates (requirements.md, architecture.md, sequence.md, etc.) are now properly included in npm package
19
+
10
20
  ## [0.8.5] - 2025-12-22
11
21
 
12
22
  ### Added
package/README.md CHANGED
@@ -4,6 +4,7 @@
4
4
 
5
5
  AI駆動開発ワークフロー自動化プラットフォーム
6
6
 
7
+ [![npm version](https://badge.fury.io/js/@sk8metal%2Fmichi-cli.svg?icon=si%3Anpm)](https://badge.fury.io/js/@sk8metal%2Fmichi-cli)
7
8
  [![CI](https://github.com/sk8metalme/michi/actions/workflows/ci.yml/badge.svg)](https://github.com/sk8metalme/michi/actions/workflows/ci.yml)
8
9
  [![Test Setup](https://github.com/sk8metalme/michi/actions/workflows/test-setup.yml/badge.svg)](https://github.com/sk8metalme/michi/actions/workflows/test-setup.yml)
9
10
  [![Security](https://github.com/sk8metalme/michi/actions/workflows/security.yml/badge.svg)](https://github.com/sk8metalme/michi/actions/workflows/security.yml)
@@ -0,0 +1,51 @@
1
+ # {{PROJECT_NAME}} - CI Status
2
+
3
+ ## プロジェクト情報
4
+
5
+ - **プロジェクト名**: {{PROJECT_NAME}}
6
+ - **JIRAキー**: {{JIRA_KEY}}
7
+ - **Confluenceスペース**: {{CONFLUENCE_SPACE}}
8
+ - **最終更新**: {{CREATED_AT}}
9
+
10
+ ## CI結果サマリー
11
+
12
+ | リポジトリ名 | ビルドステータス | テストステータス | カバレッジ | 最終実行日時 | 失敗詳細 |
13
+ |------------|---------------|---------------|----------|------------|----------|
14
+ | <!-- リポジトリ名 --> | <!-- ✅/❌/⏳/❓ --> | <!-- ✅/❌/⏳/❓ --> | <!-- XX% --> | <!-- YYYY-MM-DD HH:mm:ss --> | <!-- GitHub URL --> |
15
+
16
+ <!--
17
+ ステータスアイコン:
18
+ - ✅ success: ビルド・テスト成功
19
+ - ❌ failure: ビルド・テスト失敗
20
+ - ⏳ running: 実行中
21
+ - ❓ unknown: 不明・未実行
22
+
23
+ このファイルは `multi-repo:ci-status <project-name>` コマンドで自動更新されます。
24
+ -->
25
+
26
+ ## 統計情報
27
+
28
+ - **総リポジトリ数**: 0
29
+ - **成功**: 0
30
+ - **失敗**: 0
31
+ - **実行中**: 0
32
+ - **不明**: 0
33
+
34
+ ## 注意事項
35
+
36
+ このドキュメントは自動生成されます。手動で編集しないでください。
37
+ 最新のCI結果を取得するには、以下のコマンドを実行してください:
38
+
39
+ ```bash
40
+ npm run michi multi-repo:ci-status {{PROJECT_NAME}}
41
+ ```
42
+
43
+ 差分表示オプション:
44
+
45
+ ```bash
46
+ npm run michi multi-repo:ci-status {{PROJECT_NAME}} --diff
47
+ ```
48
+
49
+ ## 変更履歴
50
+
51
+ 自動生成のため、変更履歴は記録されません。
@@ -0,0 +1,99 @@
1
+ # {{PROJECT_NAME}} - リリースノート
2
+
3
+ ## プロジェクト情報
4
+
5
+ - **プロジェクト名**: {{PROJECT_NAME}}
6
+ - **JIRAキー**: {{JIRA_KEY}}
7
+ - **Confluenceスペース**: {{CONFLUENCE_SPACE}}
8
+ - **作成日時**: {{CREATED_AT}}
9
+
10
+ ## リリースノート一覧
11
+
12
+ ### バージョン 1.0.0 (YYYY-MM-DD)
13
+
14
+ #### 新機能 (New Features)
15
+
16
+ - <!-- 新機能を記述してください -->
17
+
18
+ #### 改善 (Improvements)
19
+
20
+ - <!-- 改善内容を記述してください -->
21
+
22
+ #### バグ修正 (Bug Fixes)
23
+
24
+ - <!-- バグ修正を記述してください -->
25
+
26
+ #### Breaking Changes
27
+
28
+ - <!-- 破壊的変更を記述してください(ない場合は「なし」) -->
29
+
30
+ #### 既知の問題 (Known Issues)
31
+
32
+ - <!-- 既知の問題を記述してください -->
33
+
34
+ ---
35
+
36
+ ## リリースノート作成ガイド
37
+
38
+ ### 新機能 (New Features)
39
+
40
+ ユーザーに提供される新しい機能を記述します。
41
+
42
+ **フォーマット例**:
43
+ ```
44
+ - [機能名] 簡潔な説明 (関連JIRA: {{JIRA_KEY}}-XXX)
45
+ ```
46
+
47
+ ### 改善 (Improvements)
48
+
49
+ 既存機能の改善、パフォーマンス向上、UX改善などを記述します。
50
+
51
+ **フォーマット例**:
52
+ ```
53
+ - [改善内容] 詳細説明 (関連JIRA: {{JIRA_KEY}}-XXX)
54
+ ```
55
+
56
+ ### バグ修正 (Bug Fixes)
57
+
58
+ 修正されたバグを記述します。
59
+
60
+ **フォーマット例**:
61
+ ```
62
+ - [バグの内容] 修正内容 (関連JIRA: {{JIRA_KEY}}-XXX)
63
+ ```
64
+
65
+ ### Breaking Changes
66
+
67
+ 既存の動作を変更する破壊的変更を記述します。
68
+ マイグレーション手順を含めてください。
69
+
70
+ **フォーマット例**:
71
+ ```
72
+ - [変更内容] 影響範囲とマイグレーション手順 (関連JIRA: {{JIRA_KEY}}-XXX)
73
+ ```
74
+
75
+ ### 既知の問題 (Known Issues)
76
+
77
+ リリース時点で既知の問題を記述します。
78
+ 回避策や対応予定を含めてください。
79
+
80
+ **フォーマット例**:
81
+ ```
82
+ - [問題の内容] 回避策または対応予定 (関連JIRA: {{JIRA_KEY}}-XXX)
83
+ ```
84
+
85
+ ---
86
+
87
+ ## Confluence同期
88
+
89
+ このリリースノートをConfluenceに同期するには、以下のコマンドを実行してください:
90
+
91
+ ```bash
92
+ npm run michi multi-repo:sync {{PROJECT_NAME}} --doc release-notes
93
+ ```
94
+
95
+ ## 変更履歴
96
+
97
+ | 日付 | バージョン | 変更内容 | 担当者 |
98
+ |------|-----------|---------|--------|
99
+ | {{CREATED_AT}} | 1.0.0 | 初版作成 | - |
@@ -0,0 +1,183 @@
1
+ # {{PROJECT_NAME}} - アーキテクチャ設計書
2
+
3
+ ## プロジェクト情報
4
+
5
+ - **プロジェクト名**: {{PROJECT_NAME}}
6
+ - **JIRAキー**: {{JIRA_KEY}}
7
+ - **Confluenceスペース**: {{CONFLUENCE_SPACE}}
8
+ - **作成日時**: {{CREATED_AT}}
9
+
10
+ ## システム構成図
11
+
12
+ ```mermaid
13
+ graph TB
14
+ A[クライアント] --> B[APIゲートウェイ]
15
+ B --> C[バックエンドサービス]
16
+ C --> D[データベース]
17
+ C --> E[外部API]
18
+ ```
19
+
20
+ <!-- システム構成図を更新してください -->
21
+
22
+ ## アーキテクチャパターン
23
+
24
+ <!-- 採用するアーキテクチャパターンを記述してください -->
25
+ <!-- 例: マイクロサービス、レイヤードアーキテクチャ、ヘキサゴナルアーキテクチャ -->
26
+
27
+ ### レイヤー構成
28
+
29
+ <!-- レイヤー構成を記述してください -->
30
+
31
+ ## コンポーネント図
32
+
33
+ ```mermaid
34
+ graph LR
35
+ subgraph "プレゼンテーション層"
36
+ A[UI Component]
37
+ end
38
+
39
+ subgraph "ビジネスロジック層"
40
+ B[Service Layer]
41
+ end
42
+
43
+ subgraph "データアクセス層"
44
+ C[Repository]
45
+ end
46
+
47
+ A --> B
48
+ B --> C
49
+ ```
50
+
51
+ <!-- コンポーネント図を更新してください -->
52
+
53
+ ## 技術スタック
54
+
55
+ ### フロントエンド
56
+
57
+ <!-- フロントエンド技術スタックを記述してください -->
58
+
59
+ ### バックエンド
60
+
61
+ <!-- バックエンド技術スタックを記述してください -->
62
+
63
+ ### データベース
64
+
65
+ <!-- データベース技術スタックを記述してください -->
66
+
67
+ ### インフラストラクチャ
68
+
69
+ <!-- インフラストラクチャを記述してください -->
70
+
71
+ ## データモデル
72
+
73
+ <!-- データモデルを記述してください -->
74
+
75
+ ```mermaid
76
+ erDiagram
77
+ USER ||--o{ ORDER : places
78
+ USER {
79
+ string id
80
+ string name
81
+ string email
82
+ }
83
+ ORDER {
84
+ string id
85
+ string userId
86
+ date createdAt
87
+ }
88
+ ```
89
+
90
+ ## セキュリティアーキテクチャ
91
+
92
+ <!-- セキュリティアーキテクチャを記述してください -->
93
+
94
+ ## スケーラビリティ設計
95
+
96
+ <!-- スケーラビリティ設計を記述してください -->
97
+
98
+ ## サービス横断アーキテクチャ
99
+
100
+ <!-- AI生成コマンド(/michi_multi_repo:spec-design)を使用すると、自動的にサービス横断アーキテクチャが挿入されます -->
101
+
102
+ ### C4モデル - システムコンテキスト図
103
+
104
+ ```mermaid
105
+ C4Context
106
+ title System Context Diagram
107
+
108
+ Person(user, "User", "エンドユーザー")
109
+ System(system, "{{PROJECT_NAME}}", "マルチリポジトリシステム")
110
+ System_Ext(external, "External System", "外部システム")
111
+
112
+ Rel(user, system, "Uses", "HTTPS")
113
+ Rel(system, external, "Integrates", "REST/HTTPS")
114
+ ```
115
+
116
+ ### サービス間通信
117
+
118
+ <!-- AI生成コマンドを使用すると、サービス間通信の詳細が自動生成されます -->
119
+
120
+ | 呼び出し元 | 呼び出し先 | 方式 | プロトコル | 用途 |
121
+ |-----------|-----------|------|-----------|------|
122
+ | Frontend | API Gateway | 同期 | REST/HTTPS | ユーザーリクエスト処理 |
123
+ | Service A | Service B | 同期 | gRPC | サービス間通信 |
124
+ | Service B | Service C | 非同期 | Kafka | イベント通知 |
125
+
126
+ ### 共有コンポーネント
127
+
128
+ <!-- AI生成コマンドを使用すると、共有コンポーネントが自動的に抽出されます -->
129
+
130
+ **共通ライブラリ**:
131
+ - `@org/shared-types`: 型定義(全サービスで共有)
132
+ - `@org/logger`: 統一ログライブラリ
133
+
134
+ **共通インフラ**:
135
+ - Elasticsearch: ログ集約
136
+ - Prometheus + Grafana: メトリクス監視
137
+ - 認証基盤: 統合認証サービス
138
+
139
+ ### デプロイメントアーキテクチャ
140
+
141
+ ```mermaid
142
+ graph TB
143
+ subgraph "Production Environment"
144
+ LB[Load Balancer]
145
+ FE1[Frontend Pod 1]
146
+ FE2[Frontend Pod 2]
147
+ BE1[Backend Pod 1]
148
+ BE2[Backend Pod 2]
149
+ DB[(Database)]
150
+
151
+ LB --> FE1
152
+ LB --> FE2
153
+ FE1 --> BE1
154
+ FE2 --> BE2
155
+ BE1 --> DB
156
+ BE2 --> DB
157
+ end
158
+ ```
159
+
160
+ ### データフロー
161
+
162
+ <!-- AI生成コマンドを使用すると、サービス間のデータフローシーケンス図が自動生成されます -->
163
+
164
+ ```mermaid
165
+ sequenceDiagram
166
+ participant User
167
+ participant Frontend
168
+ participant Backend
169
+ participant Database
170
+
171
+ User->>Frontend: リクエスト
172
+ Frontend->>Backend: API呼び出し
173
+ Backend->>Database: クエリ実行
174
+ Database-->>Backend: データ返却
175
+ Backend-->>Frontend: レスポンス
176
+ Frontend-->>User: 表示
177
+ ```
178
+
179
+ ## 変更履歴
180
+
181
+ | 日付 | バージョン | 変更内容 | 担当者 |
182
+ |------|-----------|---------|--------|
183
+ | {{CREATED_AT}} | 1.0.0 | 初版作成 | - |
@@ -0,0 +1,110 @@
1
+ # {{PROJECT_NAME}} - 要件定義書
2
+
3
+ ## プロジェクト情報
4
+
5
+ - **プロジェクト名**: {{PROJECT_NAME}}
6
+ - **JIRAキー**: {{JIRA_KEY}}
7
+ - **Confluenceスペース**: {{CONFLUENCE_SPACE}}
8
+ - **作成日時**: {{CREATED_AT}}
9
+
10
+ ## 概要
11
+
12
+ このドキュメントは、{{PROJECT_NAME}}プロジェクトの要件定義書です。
13
+
14
+ ## ビジネス価値
15
+
16
+ <!-- プロジェクトのビジネス価値を記述してください -->
17
+
18
+ ### 対象ユーザー
19
+
20
+ <!-- 対象ユーザーを記述してください -->
21
+ - プロジェクトリーダー
22
+ - アーキテクト
23
+ - 開発者
24
+ - QAエンジニア
25
+
26
+ ### 主要機能
27
+
28
+ <!-- 主要機能を記述してください -->
29
+
30
+ ## 受入基準(EARS形式)
31
+
32
+ ### 必須要件
33
+
34
+ <!-- EARS形式(Event-Action-Response-System)で受入基準を記述してください -->
35
+ <!-- 例: -->
36
+ <!-- - WHEN ユーザーがプロジェクトを初期化する際、IF プロジェクト名が有効である場合、THEN システムはプロジェクトディレクトリを作成し、成功メッセージを表示する。 -->
37
+
38
+ ### 任意要件
39
+
40
+ <!-- 任意要件を記述してください -->
41
+
42
+ ## 技術的制約
43
+
44
+ <!-- 技術的制約を記述してください -->
45
+
46
+ ## 非機能要件
47
+
48
+ ### パフォーマンス要件
49
+
50
+ <!-- パフォーマンス要件を記述してください -->
51
+
52
+ ### セキュリティ要件
53
+
54
+ <!-- セキュリティ要件を記述してください -->
55
+
56
+ ### 保守性要件
57
+
58
+ <!-- 保守性要件を記述してください -->
59
+
60
+ ## リスクと制限事項
61
+
62
+ <!-- リスクと制限事項を記述してください -->
63
+
64
+ ## サービス構成
65
+
66
+ ### 登録リポジトリ一覧
67
+
68
+ <!-- AI生成コマンド(/michi_multi_repo:spec-requirements)を使用すると、自動的に登録リポジトリ情報が挿入されます -->
69
+
70
+ | サービス名 | リポジトリURL | ブランチ | 役割 | 技術スタック |
71
+ |-----------|---------------|---------|------|-------------|
72
+ | <!-- 例: frontend --> | <!-- 例: https://github.com/org/frontend --> | <!-- 例: main --> | <!-- 例: ユーザーインターフェース --> | <!-- 例: React, TypeScript --> |
73
+
74
+ ### サービス間依存関係
75
+
76
+ <!-- AI生成コマンドを使用すると、サービス間の依存関係図が自動生成されます -->
77
+
78
+ ```mermaid
79
+ graph TB
80
+ A[Service A] -->|API| B[Service B]
81
+ B -->|gRPC| C[Service C]
82
+ ```
83
+
84
+ ## インターフェース要件
85
+
86
+ ### API契約
87
+
88
+ <!-- サービス間のAPI契約を記述してください -->
89
+ <!-- AI生成コマンドを使用すると、要件定義書から自動的にAPI契約が抽出されます -->
90
+
91
+ **サービスA → サービスB**
92
+ - エンドポイント: `POST /api/v1/resource`
93
+ - プロトコル: HTTP/REST
94
+ - データ形式: JSON
95
+
96
+ ### イベント契約
97
+
98
+ <!-- Pub/Subイベントのスキーマを記述してください -->
99
+ <!-- AI生成コマンドを使用すると、イベント駆動設計のスキーマが自動生成されます -->
100
+
101
+ **サービスA → サービスB**
102
+ - イベント: `resource.created`
103
+ - プロトコル: Kafka / RabbitMQ
104
+ - スキーマ: { resourceId, name, createdAt }
105
+
106
+ ## 変更履歴
107
+
108
+ | 日付 | バージョン | 変更内容 | 担当者 |
109
+ |------|-----------|---------|--------|
110
+ | {{CREATED_AT}} | 1.0.0 | 初版作成 | - |
@@ -0,0 +1,79 @@
1
+ # {{PROJECT_NAME}} - シーケンス図
2
+
3
+ ## プロジェクト情報
4
+
5
+ - **プロジェクト名**: {{PROJECT_NAME}}
6
+ - **JIRAキー**: {{JIRA_KEY}}
7
+ - **Confluenceスペース**: {{CONFLUENCE_SPACE}}
8
+ - **作成日時**: {{CREATED_AT}}
9
+
10
+ ## 主要フローのシーケンス図
11
+
12
+ ### ユーザー登録フロー
13
+
14
+ ```mermaid
15
+ sequenceDiagram
16
+ participant U as ユーザー
17
+ participant F as フロントエンド
18
+ participant B as バックエンド
19
+ participant DB as データベース
20
+
21
+ U->>F: 登録情報を入力
22
+ F->>B: POST /api/users
23
+ B->>DB: ユーザー情報を保存
24
+ DB-->>B: 保存成功
25
+ B-->>F: ユーザーID返却
26
+ F-->>U: 登録完了メッセージ表示
27
+ ```
28
+
29
+ <!-- ユーザー登録フローを更新してください -->
30
+
31
+ ### データ取得フロー
32
+
33
+ ```mermaid
34
+ sequenceDiagram
35
+ participant U as ユーザー
36
+ participant F as フロントエンド
37
+ participant B as バックエンド
38
+ participant DB as データベース
39
+ participant C as キャッシュ
40
+
41
+ U->>F: データリクエスト
42
+ F->>B: GET /api/data
43
+ B->>C: キャッシュ確認
44
+ alt キャッシュヒット
45
+ C-->>B: キャッシュデータ返却
46
+ else キャッシュミス
47
+ B->>DB: データクエリ
48
+ DB-->>B: データ返却
49
+ B->>C: キャッシュ保存
50
+ end
51
+ B-->>F: データ返却
52
+ F-->>U: データ表示
53
+ ```
54
+
55
+ <!-- データ取得フローを更新してください -->
56
+
57
+ ### エラーハンドリングフロー
58
+
59
+ ```mermaid
60
+ sequenceDiagram
61
+ participant U as ユーザー
62
+ participant F as フロントエンド
63
+ participant B as バックエンド
64
+ participant L as ログサービス
65
+
66
+ U->>F: リクエスト送信
67
+ F->>B: API呼び出し
68
+ B-->>F: エラーレスポンス(500)
69
+ F->>L: エラーログ記録
70
+ F-->>U: エラーメッセージ表示
71
+ ```
72
+
73
+ <!-- エラーハンドリングフローを更新してください -->
74
+
75
+ ## 変更履歴
76
+
77
+ | 日付 | バージョン | 変更内容 | 担当者 |
78
+ |------|-----------|---------|--------|
79
+ | {{CREATED_AT}} | 1.0.0 | 初版作成 | - |
@@ -0,0 +1,20 @@
1
+ {
2
+ "project_name": "{{PROJECT_NAME}}",
3
+ "created_at": "{{CREATED_AT}}",
4
+ "updated_at": "{{CREATED_AT}}",
5
+ "language": "ja",
6
+ "phase": "initialized",
7
+ "jira_key": "{{JIRA_KEY}}",
8
+ "confluence_space": "{{CONFLUENCE_SPACE}}",
9
+ "approvals": {
10
+ "requirements": {
11
+ "generated": false,
12
+ "approved": false
13
+ },
14
+ "design": {
15
+ "generated": false,
16
+ "approved": false
17
+ }
18
+ },
19
+ "ready_for_implementation": false
20
+ }
@@ -0,0 +1,74 @@
1
+ # {{PROJECT_NAME}} - Multi-Repo プロジェクトステアリング
2
+
3
+ ## プロジェクト情報
4
+
5
+ - **プロジェクト名**: {{PROJECT_NAME}}
6
+ - **JIRAキー**: {{JIRA_KEY}}
7
+ - **Confluenceスペース**: {{CONFLUENCE_SPACE}}
8
+ - **作成日時**: {{CREATED_AT}}
9
+
10
+ ## Multi-Repo 開発ガイドライン
11
+
12
+ ### リポジトリ管理方針
13
+
14
+ <!-- リポジトリ管理方針を記述してください -->
15
+
16
+ #### ブランチ戦略
17
+
18
+ - **main/master**: 本番環境相当(常にデプロイ可能な状態)
19
+ - **develop**: 開発環境(次回リリース予定の機能を統合)
20
+ - **feature/**: 機能開発用
21
+ - **bugfix/**: バグ修正用
22
+ - **hotfix/**: 緊急修正用
23
+
24
+ #### コミットメッセージ規約
25
+
26
+ - `feat:` 新機能
27
+ - `fix:` バグ修正
28
+ - `docs:` ドキュメント
29
+ - `style:` フォーマット
30
+ - `refactor:` リファクタリング
31
+ - `test:` テスト
32
+ - `chore:` その他
33
+
34
+ ### CI/CD パイプライン
35
+
36
+ #### Phase A: PR作成前の自動テスト
37
+
38
+ - 単体テスト実行
39
+ - Lint実行
40
+ - ビルド実行
41
+
42
+ #### Phase B: リリース準備テスト
43
+
44
+ - 統合テスト実行
45
+ - E2Eテスト実行
46
+ - パフォーマンステスト実行
47
+ - セキュリティテスト実行
48
+
49
+ ### コードレビュー基準
50
+
51
+ <!-- コードレビュー基準を記述してください -->
52
+
53
+ ### テスト戦略
54
+
55
+ <!-- テスト戦略を記述してください -->
56
+
57
+ ### セキュリティポリシー
58
+
59
+ <!-- セキュリティポリシーを記述してください -->
60
+
61
+ ### パフォーマンス要件
62
+
63
+ <!-- パフォーマンス要件を記述してください -->
64
+
65
+ ## リポジトリ一覧
66
+
67
+ <!-- このプロジェクトに属するリポジトリを記述してください -->
68
+ <!-- multi-repo:add-repo コマンドでリポジトリを追加できます -->
69
+
70
+ ## 変更履歴
71
+
72
+ | 日付 | バージョン | 変更内容 | 担当者 |
73
+ |------|-----------|---------|--------|
74
+ | {{CREATED_AT}} | 1.0.0 | 初版作成 | - |
@@ -0,0 +1,89 @@
1
+ # {{PROJECT_NAME}} - テスト戦略
2
+
3
+ ## プロジェクト情報
4
+
5
+ - **プロジェクト名**: {{PROJECT_NAME}}
6
+ - **JIRAキー**: {{JIRA_KEY}}
7
+ - **Confluenceスペース**: {{CONFLUENCE_SPACE}}
8
+ - **作成日時**: {{CREATED_AT}}
9
+
10
+ ## テスト戦略概要
11
+
12
+ このドキュメントは、{{PROJECT_NAME}}プロジェクトのテスト戦略を定義します。
13
+
14
+ ## テストタイプ
15
+
16
+ ### 単体テスト (Unit Test)
17
+
18
+ - **実行タイミング**: PR作成前(Phase A)
19
+ - **カバレッジ目標**: 95%以上
20
+ - **実行コマンド**: `npm test`
21
+ - **テストフレームワーク**: <!-- テストフレームワークを記述 -->
22
+
23
+ ### 統合テスト (Integration Test)
24
+
25
+ - **実行タイミング**: リリース準備時(Phase B)
26
+ - **カバレッジ目標**: 主要フローのカバー
27
+ - **実行コマンド**: `npm run test:integration`
28
+ - **テスト対象**: <!-- テスト対象を記述 -->
29
+
30
+ ### E2Eテスト (End-to-End Test)
31
+
32
+ - **実行タイミング**: リリース準備時(Phase B)
33
+ - **カバレッジ目標**: クリティカルユーザーフロー
34
+ - **実行コマンド**: `npm run test:e2e`
35
+ - **テストツール**: <!-- テストツールを記述 -->
36
+
37
+ ### パフォーマンステスト (Performance Test)
38
+
39
+ - **実行タイミング**: リリース準備時(Phase B)
40
+ - **目標**: <!-- パフォーマンス目標を記述 -->
41
+ - **実行コマンド**: `npm run test:performance`
42
+ - **測定項目**: レスポンスタイム、スループット、リソース使用量
43
+
44
+ ### セキュリティテスト (Security Test)
45
+
46
+ - **実行タイミング**: リリース準備時(Phase B)
47
+ - **テスト項目**:
48
+ - パストラバーサル攻撃
49
+ - 制御文字インジェクション
50
+ - コマンドインジェクション
51
+ - SQLインジェクション
52
+ - XSS攻撃
53
+ - **実行コマンド**: `npm run test:security`
54
+
55
+ ## Phase A: PR前自動テスト
56
+
57
+ PR作成前に自動実行されるテスト:
58
+
59
+ - [ ] 単体テスト
60
+ - [ ] Lint
61
+ - [ ] 型チェック
62
+ - [ ] ビルド
63
+
64
+ ## Phase B: リリース準備テスト
65
+
66
+ リリース前に手動実行するテスト:
67
+
68
+ - [ ] 統合テスト
69
+ - [ ] E2Eテスト
70
+ - [ ] パフォーマンステスト
71
+ - [ ] セキュリティテスト
72
+
73
+ ## テストデータ管理
74
+
75
+ <!-- テストデータ管理方針を記述してください -->
76
+
77
+ ## テスト環境
78
+
79
+ <!-- テスト環境を記述してください -->
80
+
81
+ ## 継続的改善
82
+
83
+ <!-- 継続的改善方針を記述してください -->
84
+
85
+ ## 変更履歴
86
+
87
+ | 日付 | バージョン | 変更内容 | 担当者 |
88
+ |------|-----------|---------|--------|
89
+ | {{CREATED_AT}} | 1.0.0 | 初版作成 | - |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sk8metal/michi-cli",
3
- "version": "0.8.5",
3
+ "version": "0.8.6",
4
4
  "description": "Managed Intelligent Comprehensive Hub for Integration - AI-driven development workflow automation",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -1,10 +1,10 @@
1
1
  /**
2
- * ビルド時に静的アセット(JSON等)をdistディレクトリにコピー
3
- * tscはTypeScriptのトランスパイルのみで、JSONファイルは自動コピーされないため
2
+ * ビルド時に静的アセット(JSON等、テンプレート)をdistディレクトリにコピー
3
+ * tscはTypeScriptのトランスパイルのみで、JSONやテンプレートファイルは自動コピーされないため
4
4
  */
5
5
 
6
- import { copyFileSync, mkdirSync, existsSync } from 'fs';
7
- import { dirname, resolve } from 'path';
6
+ import { copyFileSync, mkdirSync, existsSync, readdirSync, statSync } from 'fs';
7
+ import { dirname, resolve, join } from 'path';
8
8
  import { fileURLToPath } from 'url';
9
9
 
10
10
  const __dirname = dirname(fileURLToPath(import.meta.url));
@@ -37,6 +37,51 @@ function copyFile(src, dest) {
37
37
  }
38
38
  }
39
39
 
40
+ /**
41
+ * ディレクトリを再帰的にコピー
42
+ */
43
+ function copyDirectory(srcDir, destDir) {
44
+ const srcPath = resolve(projectRoot, srcDir);
45
+ const destPath = resolve(projectRoot, destDir);
46
+
47
+ if (!existsSync(srcPath)) {
48
+ console.error(`❌ Source directory not found: ${srcPath}`);
49
+ process.exit(1);
50
+ }
51
+
52
+ if (!statSync(srcPath).isDirectory()) {
53
+ console.error(`❌ Source is not a directory: ${srcPath}`);
54
+ process.exit(1);
55
+ }
56
+
57
+ // コピー先のディレクトリを作成
58
+ if (!existsSync(destPath)) {
59
+ mkdirSync(destPath, { recursive: true });
60
+ }
61
+
62
+ try {
63
+ const entries = readdirSync(srcPath, { withFileTypes: true });
64
+
65
+ for (const entry of entries) {
66
+ const srcEntryPath = join(srcPath, entry.name);
67
+ const destEntryPath = join(destPath, entry.name);
68
+
69
+ if (entry.isDirectory()) {
70
+ // ディレクトリの場合は再帰的にコピー
71
+ copyDirectory(srcEntryPath, destEntryPath);
72
+ } else {
73
+ // ファイルの場合はコピー
74
+ copyFileSync(srcEntryPath, destEntryPath);
75
+ console.log(`✅ Copied: ${entry.name}`);
76
+ }
77
+ }
78
+ console.log(`📁 Directory copied: ${srcDir} → ${destDir}`);
79
+ } catch (error) {
80
+ console.error(`❌ Failed to copy directory ${srcDir}:`, error.message);
81
+ process.exit(1);
82
+ }
83
+ }
84
+
40
85
  // コピー対象のファイル一覧
41
86
  const filesToCopy = [
42
87
  {
@@ -45,6 +90,18 @@ const filesToCopy = [
45
90
  }
46
91
  ];
47
92
 
93
+ // コピー対象のディレクトリ一覧
94
+ const directoriesToCopy = [
95
+ {
96
+ src: 'templates/multi-repo',
97
+ dest: 'dist/templates/multi-repo'
98
+ }
99
+ ];
100
+
48
101
  console.log('📦 Copying static assets...');
49
102
  filesToCopy.forEach(({ src, dest }) => copyFile(src, dest));
103
+
104
+ console.log('📁 Copying template directories...');
105
+ directoriesToCopy.forEach(({ src, dest }) => copyDirectory(src, dest));
106
+
50
107
  console.log('✅ All static assets copied successfully.');