@sk8metal/michi-cli 0.0.7 → 0.0.9
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 +55 -0
- package/README.md +205 -11
- package/dist/scripts/__tests__/create-project.test.d.ts +2 -0
- package/dist/scripts/__tests__/create-project.test.d.ts.map +1 -0
- package/dist/scripts/__tests__/create-project.test.js +247 -0
- package/dist/scripts/__tests__/create-project.test.js.map +1 -0
- package/dist/scripts/__tests__/multi-project-estimate.test.d.ts +2 -0
- package/dist/scripts/__tests__/multi-project-estimate.test.d.ts.map +1 -0
- package/dist/scripts/__tests__/multi-project-estimate.test.js +119 -0
- package/dist/scripts/__tests__/multi-project-estimate.test.js.map +1 -0
- package/dist/scripts/__tests__/setup-existing-project.test.d.ts +2 -0
- package/dist/scripts/__tests__/setup-existing-project.test.d.ts.map +1 -0
- package/dist/scripts/__tests__/setup-existing-project.test.js +129 -0
- package/dist/scripts/__tests__/setup-existing-project.test.js.map +1 -0
- package/dist/scripts/__tests__/setup-interactive.test.d.ts +2 -0
- package/dist/scripts/__tests__/setup-interactive.test.d.ts.map +1 -0
- package/dist/scripts/__tests__/setup-interactive.test.js +160 -0
- package/dist/scripts/__tests__/setup-interactive.test.js.map +1 -0
- package/dist/scripts/config/default-config.json +57 -0
- package/dist/scripts/confluence-sync.d.ts +4 -0
- package/dist/scripts/confluence-sync.d.ts.map +1 -1
- package/dist/scripts/confluence-sync.js +12 -23
- package/dist/scripts/confluence-sync.js.map +1 -1
- package/dist/scripts/constants/__tests__/environments.test.d.ts +2 -0
- package/dist/scripts/constants/__tests__/environments.test.d.ts.map +1 -0
- package/dist/scripts/constants/__tests__/environments.test.js +91 -0
- package/dist/scripts/constants/__tests__/environments.test.js.map +1 -0
- package/dist/scripts/constants/__tests__/languages.test.d.ts +2 -0
- package/dist/scripts/constants/__tests__/languages.test.d.ts.map +1 -0
- package/dist/scripts/constants/__tests__/languages.test.js +82 -0
- package/dist/scripts/constants/__tests__/languages.test.js.map +1 -0
- package/dist/scripts/constants/environments.d.ts +33 -0
- package/dist/scripts/constants/environments.d.ts.map +1 -0
- package/dist/scripts/constants/environments.js +49 -0
- package/dist/scripts/constants/environments.js.map +1 -0
- package/dist/scripts/constants/languages.d.ts +23 -0
- package/dist/scripts/constants/languages.d.ts.map +1 -0
- package/dist/scripts/constants/languages.js +53 -0
- package/dist/scripts/constants/languages.js.map +1 -0
- package/dist/scripts/create-project.d.ts +4 -0
- package/dist/scripts/create-project.d.ts.map +1 -1
- package/dist/scripts/create-project.js +227 -137
- package/dist/scripts/create-project.js.map +1 -1
- package/dist/scripts/jira-sync.d.ts.map +1 -1
- package/dist/scripts/jira-sync.js +15 -0
- package/dist/scripts/jira-sync.js.map +1 -1
- package/dist/scripts/list-projects.d.ts.map +1 -1
- package/dist/scripts/list-projects.js +42 -15
- package/dist/scripts/list-projects.js.map +1 -1
- package/dist/scripts/multi-project-estimate.d.ts.map +1 -1
- package/dist/scripts/multi-project-estimate.js +56 -21
- package/dist/scripts/multi-project-estimate.js.map +1 -1
- package/dist/scripts/resource-dashboard.d.ts.map +1 -1
- package/dist/scripts/resource-dashboard.js +74 -17
- package/dist/scripts/resource-dashboard.js.map +1 -1
- package/dist/scripts/setup-existing-project.d.ts +3 -1
- package/dist/scripts/setup-existing-project.d.ts.map +1 -1
- package/dist/scripts/setup-existing-project.js +306 -217
- package/dist/scripts/setup-existing-project.js.map +1 -1
- package/dist/scripts/setup-interactive.d.ts +10 -0
- package/dist/scripts/setup-interactive.d.ts.map +1 -0
- package/dist/scripts/setup-interactive.js +413 -0
- package/dist/scripts/setup-interactive.js.map +1 -0
- package/dist/scripts/template/__tests__/renderer.test.d.ts +2 -0
- package/dist/scripts/template/__tests__/renderer.test.d.ts.map +1 -0
- package/dist/scripts/template/__tests__/renderer.test.js +165 -0
- package/dist/scripts/template/__tests__/renderer.test.js.map +1 -0
- package/dist/scripts/template/renderer.d.ts +70 -0
- package/dist/scripts/template/renderer.d.ts.map +1 -0
- package/dist/scripts/template/renderer.js +99 -0
- package/dist/scripts/template/renderer.js.map +1 -0
- package/dist/scripts/utils/__tests__/config-validator.test.js +5 -0
- package/dist/scripts/utils/__tests__/config-validator.test.js.map +1 -1
- package/dist/scripts/utils/__tests__/spec-updater.test.d.ts +5 -0
- package/dist/scripts/utils/__tests__/spec-updater.test.d.ts.map +1 -0
- package/dist/scripts/utils/__tests__/spec-updater.test.js +158 -0
- package/dist/scripts/utils/__tests__/spec-updater.test.js.map +1 -0
- package/dist/scripts/utils/confluence-hierarchy.d.ts +2 -1
- package/dist/scripts/utils/confluence-hierarchy.d.ts.map +1 -1
- package/dist/scripts/utils/confluence-hierarchy.js +5 -0
- package/dist/scripts/utils/confluence-hierarchy.js.map +1 -1
- package/dist/scripts/utils/project-finder.d.ts +30 -0
- package/dist/scripts/utils/project-finder.d.ts.map +1 -0
- package/dist/scripts/utils/project-finder.js +147 -0
- package/dist/scripts/utils/project-finder.js.map +1 -0
- package/dist/scripts/utils/spec-updater.d.ts +72 -0
- package/dist/scripts/utils/spec-updater.d.ts.map +1 -0
- package/dist/scripts/utils/spec-updater.js +141 -0
- package/dist/scripts/utils/spec-updater.js.map +1 -0
- package/dist/scripts/utils/template-finder.d.ts +37 -0
- package/dist/scripts/utils/template-finder.d.ts.map +1 -0
- package/dist/scripts/utils/template-finder.js +63 -0
- package/dist/scripts/utils/template-finder.js.map +1 -0
- package/dist/src/__tests__/integration/setup/claude-agent.test.d.ts +5 -0
- package/dist/src/__tests__/integration/setup/claude-agent.test.d.ts.map +1 -0
- package/dist/src/__tests__/integration/setup/claude-agent.test.js +125 -0
- package/dist/src/__tests__/integration/setup/claude-agent.test.js.map +1 -0
- package/dist/src/__tests__/integration/setup/claude.test.d.ts +5 -0
- package/dist/src/__tests__/integration/setup/claude.test.d.ts.map +1 -0
- package/dist/src/__tests__/integration/setup/claude.test.js +111 -0
- package/dist/src/__tests__/integration/setup/claude.test.js.map +1 -0
- package/dist/src/__tests__/integration/setup/cursor.test.d.ts +5 -0
- package/dist/src/__tests__/integration/setup/cursor.test.d.ts.map +1 -0
- package/dist/src/__tests__/integration/setup/cursor.test.js +162 -0
- package/dist/src/__tests__/integration/setup/cursor.test.js.map +1 -0
- package/dist/src/__tests__/integration/setup/helpers/fs-assertions.d.ts +32 -0
- package/dist/src/__tests__/integration/setup/helpers/fs-assertions.d.ts.map +1 -0
- package/dist/src/__tests__/integration/setup/helpers/fs-assertions.js +72 -0
- package/dist/src/__tests__/integration/setup/helpers/fs-assertions.js.map +1 -0
- package/dist/src/__tests__/integration/setup/helpers/test-project.d.ts +38 -0
- package/dist/src/__tests__/integration/setup/helpers/test-project.d.ts.map +1 -0
- package/dist/src/__tests__/integration/setup/helpers/test-project.js +83 -0
- package/dist/src/__tests__/integration/setup/helpers/test-project.js.map +1 -0
- package/dist/src/__tests__/integration/setup/validation.test.d.ts +5 -0
- package/dist/src/__tests__/integration/setup/validation.test.d.ts.map +1 -0
- package/dist/src/__tests__/integration/setup/validation.test.js +318 -0
- package/dist/src/__tests__/integration/setup/validation.test.js.map +1 -0
- package/dist/src/cli.d.ts.map +1 -1
- package/dist/src/cli.js +20 -0
- package/dist/src/cli.js.map +1 -1
- package/dist/src/commands/setup-existing.d.ts +22 -0
- package/dist/src/commands/setup-existing.d.ts.map +1 -0
- package/dist/src/commands/setup-existing.js +408 -0
- package/dist/src/commands/setup-existing.js.map +1 -0
- package/dist/vitest.config.d.ts.map +1 -1
- package/dist/vitest.config.js +9 -6
- package/dist/vitest.config.js.map +1 -1
- package/docs/README.md +2 -2
- package/docs/contributing/development.md +37 -0
- package/docs/getting-started/{new-project-setup.md → new-repository-setup.md} +165 -38
- package/docs/getting-started/quick-start.md +57 -6
- package/docs/getting-started/setup.md +551 -180
- package/docs/guides/customization.md +4 -4
- package/docs/guides/multi-project.md +12 -9
- package/docs/reference/quick-reference.md +27 -18
- package/docs/testing/integration-tests.md +297 -0
- package/docs/testing-strategy.md +87 -0
- package/package.json +23 -6
- package/scripts/__tests__/create-project.test.ts +292 -0
- package/scripts/__tests__/multi-project-estimate.test.ts +145 -0
- package/scripts/__tests__/setup-existing-project.test.ts +147 -0
- package/scripts/__tests__/setup-interactive.test.ts +199 -0
- package/scripts/confluence-sync.ts +17 -29
- package/scripts/constants/__tests__/environments.test.ts +110 -0
- package/scripts/constants/__tests__/languages.test.ts +100 -0
- package/scripts/constants/environments.ts +61 -0
- package/scripts/constants/languages.ts +70 -0
- package/scripts/copy-static-assets.js +50 -0
- package/scripts/create-project.ts +251 -158
- package/scripts/jira-sync.ts +16 -1
- package/scripts/list-projects.ts +51 -24
- package/scripts/multi-project-estimate.ts +58 -22
- package/scripts/resource-dashboard.ts +91 -26
- package/scripts/setup-existing-project.ts +350 -230
- package/scripts/setup-existing.sh +159 -25
- package/scripts/setup-interactive.ts +565 -0
- package/scripts/template/__tests__/renderer.test.ts +207 -0
- package/scripts/template/renderer.ts +133 -0
- package/scripts/utils/__tests__/config-validator.test.ts +6 -0
- package/scripts/utils/__tests__/spec-updater.test.ts +220 -0
- package/scripts/utils/confluence-hierarchy.ts +7 -1
- package/scripts/utils/project-finder.ts +184 -0
- package/scripts/utils/spec-updater.ts +212 -0
- package/scripts/utils/template-finder.ts +75 -0
- package/templates/claude/commands/michi/confluence-sync.md +38 -0
- package/templates/claude/commands/michi/project-switch.md +36 -0
- package/templates/claude/rules/atlassian-integration.md +35 -0
- package/templates/claude/rules/michi-core.md +54 -0
- package/templates/claude-agent/README.md +25 -0
- package/templates/cursor/commands/michi/confluence-sync.md +76 -0
- package/templates/cursor/commands/michi/project-switch.md +69 -0
- package/templates/cursor/rules/atlassian-mcp.mdc +188 -0
- package/templates/cursor/rules/github-ssot.mdc +151 -0
- package/templates/cursor/rules/multi-project.mdc +81 -0
- package/scripts/setup-env.sh +0 -52
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,61 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [0.0.9] - 2025-11-17
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
- **統合テストスイート**: `setup-existing`コマンドの統合テスト42個を追加(#39)
|
|
12
|
+
- 環境別テスト(Cursor, Claude, Claude Agent)
|
|
13
|
+
- バリデーションテスト(プロジェクト名、JIRAキー、言語サポート)
|
|
14
|
+
- テストヘルパー作成(`test-project.ts`, `fs-assertions.ts`)
|
|
15
|
+
- テストドキュメント(`docs/testing/integration-tests.md`)
|
|
16
|
+
- **CI/CDワークフロー**: 統合テスト用のGitHub Actionsワークフロー(`.github/workflows/test-setup.yml`)を追加
|
|
17
|
+
- Node.js 20.x, 22.xでのマトリックステスト
|
|
18
|
+
- カバレッジレポート(Codecov統合)
|
|
19
|
+
|
|
20
|
+
### Changed
|
|
21
|
+
- **Node.jsサポート範囲を変更**: Node.js 18.xのサポートを削除
|
|
22
|
+
- 理由: Vitest v4が使用する`node:inspector/promises`がNode.js 18.xで利用不可
|
|
23
|
+
- サポート対象: Node.js 20.x, 22.x
|
|
24
|
+
|
|
25
|
+
### Fixed
|
|
26
|
+
- **テンプレートパス解決のバグ修正**: `scripts/setup-existing-project.ts`がテンプレートを正しく見つけられない問題を修正
|
|
27
|
+
- `join(michiPath, templateSource)`から`join(michiPath, 'templates', templateSource)`に変更
|
|
28
|
+
- 影響: スクリプト直接実行時にテンプレートファイルがコピーされなかった
|
|
29
|
+
- **環境定数のテスト修正**: `scripts/constants/__tests__/environments.test.ts`の期待値を更新
|
|
30
|
+
- `templateSource`の値を`'templates/cursor'`から`'cursor'`に修正
|
|
31
|
+
- **誤解を招くテスト記述を修正**: テスト名とコメントを実装と一致させるよう改善
|
|
32
|
+
- JIRA key conversionテスト: 「拒否」から「変換」に記述を変更
|
|
33
|
+
- Cursor flagテスト: 「デフォルト」から「明示的フラグ」に記述を変更
|
|
34
|
+
- **親ディレクトリ取得の実装を修正**: `test-project.ts`の`writeFile`メソッドを改善
|
|
35
|
+
- 不正確な`join(filePath, '..')`から正しい`dirname(filePath)`に変更
|
|
36
|
+
|
|
37
|
+
### Tests
|
|
38
|
+
- **テスト成功率**: 82.4% (42/51テスト成功、9テストスキップ)
|
|
39
|
+
- **スキップされたテスト**: Issue #55(バリデーションエラーハンドリング)とIssue #56(Claude-agentテンプレート構造)で対応予定
|
|
40
|
+
|
|
41
|
+
## [0.0.8] - 2025-11-14
|
|
42
|
+
|
|
43
|
+
### Fixed
|
|
44
|
+
- `create-project.ts`: `.env`ファイルがリポジトリルートではなくプロジェクトディレクトリ(`projects/{id}/`)に作成されるように修正
|
|
45
|
+
- `npm run setup:env`実行時の`cwd`を`projectDir`から`actualProjectDir`に変更
|
|
46
|
+
- `setup-existing-project.ts`: `.cursor/rules`と`.cursor/commands/kiro`ディレクトリが存在しない場合のエラーを修正
|
|
47
|
+
- ファイルコピー前に`mkdirSync`でディレクトリを事前作成するように変更
|
|
48
|
+
- `setup-existing-project.ts`: パッケージ名の表記を統一
|
|
49
|
+
- すべての`@michi/cli`参照を`@sk8metal/michi-cli`に修正(使用例、package.jsonスクリプト例、グローバルインストール例)
|
|
50
|
+
- `setup-existing-project.ts`: 完了メッセージの不整合を修正
|
|
51
|
+
- 実際には作成されない`scripts/`ディレクトリの記述を削除
|
|
52
|
+
- `setup-interactive.ts`: プロジェクトIDのバリデーションを強化
|
|
53
|
+
- `getProjectMetadata`内で`validateProjectId`を呼び出し、パストラバーサル攻撃を防止
|
|
54
|
+
- `setup-interactive.ts`: `process.exit`の直接呼び出しを削除
|
|
55
|
+
- `main`関数が`Promise<number>`を返すように変更し、CLIエントリーポイントでのみ`process.exit`を呼び出すように改善
|
|
56
|
+
- これにより、関数のテスト容易性と再利用性が向上
|
|
57
|
+
|
|
58
|
+
### Added
|
|
59
|
+
- `setup-existing-project.test.ts`: 既存プロジェクトセットアップスクリプトのテストを追加(3テスト)
|
|
60
|
+
- `setup-interactive.test.ts`: 対話式設定ツールのテストを追加(11テスト)
|
|
61
|
+
- `create-project.test.ts`: `.env`作成時の`cwd`修正をテストするケースを追加(2テスト)
|
|
62
|
+
|
|
8
63
|
## [0.0.7] - 2025-11-14
|
|
9
64
|
|
|
10
65
|
### Fixed
|
package/README.md
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
AI駆動開発ワークフロー自動化プラットフォーム
|
|
5
5
|
|
|
6
6
|
[](https://github.com/sk8metalme/michi/actions/workflows/ci.yml)
|
|
7
|
+
[](https://github.com/sk8metalme/michi/actions/workflows/test-setup.yml)
|
|
7
8
|
[](https://github.com/sk8metalme/michi/actions/workflows/security.yml)
|
|
8
9
|
[](https://codecov.io/gh/sk8metalme/michi)
|
|
9
10
|
|
|
@@ -198,6 +199,16 @@ michi/
|
|
|
198
199
|
│ ├── settings/ # テンプレート
|
|
199
200
|
│ ├── specs/ # 機能仕様書(GitHub SSoT)
|
|
200
201
|
│ └── steering/ # AIガイダンス
|
|
202
|
+
├── templates/ # cc-sdd準拠のマルチ環境テンプレート(Issue #35)
|
|
203
|
+
│ ├── cursor/ # Cursor IDE用テンプレート
|
|
204
|
+
│ │ ├── rules/ # ルールファイル(.mdc)
|
|
205
|
+
│ │ └── commands/
|
|
206
|
+
│ │ └── michi/ # Michi専用コマンド
|
|
207
|
+
│ ├── claude/ # Claude Code用テンプレート(プレースホルダー含む)
|
|
208
|
+
│ │ ├── rules/ # ルールファイル(.md、統合版)
|
|
209
|
+
│ │ └── commands/
|
|
210
|
+
│ │ └── michi/ # Michi専用コマンド(言語指示含む)
|
|
211
|
+
│ └── claude-agent/ # Claude Agentテンプレート
|
|
201
212
|
├── scripts/ # 自動化スクリプト
|
|
202
213
|
├── docs/ # ドキュメント
|
|
203
214
|
├── env.example # 環境変数テンプレート
|
|
@@ -205,6 +216,52 @@ michi/
|
|
|
205
216
|
└── package.json # 依存関係
|
|
206
217
|
```
|
|
207
218
|
|
|
219
|
+
### テンプレートアーキテクチャ
|
|
220
|
+
|
|
221
|
+
Michiは**cc-sdd準拠の多環境対応**を目指しています:
|
|
222
|
+
|
|
223
|
+
#### 設計原則
|
|
224
|
+
|
|
225
|
+
1. **単一の英語テンプレート**: 言語別ファイルを作らない
|
|
226
|
+
2. **プレースホルダー使用**: `{{LANG_CODE}}`, `{{DEV_GUIDELINES}}` 等
|
|
227
|
+
3. **AI駆動の多言語生成**: 実行時にAIが指定言語で出力
|
|
228
|
+
4. **セットアップ時は置換しない**: テンプレートをそのままコピー、AIが実行時に解釈
|
|
229
|
+
|
|
230
|
+
#### プレースホルダー一覧
|
|
231
|
+
|
|
232
|
+
| プレースホルダー | 説明 | 例 |
|
|
233
|
+
|----------------|------|-----|
|
|
234
|
+
| `{{LANG_CODE}}` | 言語コード | ja, en |
|
|
235
|
+
| `{{DEV_GUIDELINES}}` | 言語別AI指示 | "Think in English, generate in Japanese" |
|
|
236
|
+
| `{{KIRO_DIR}}` | 仕様書ルート | .kiro |
|
|
237
|
+
| `{{AGENT_DIR}}` | エージェント設定 | .claude |
|
|
238
|
+
| `{{PROJECT_ID}}` | プロジェクトID | michi |
|
|
239
|
+
| `{{FEATURE_NAME}}` | 機能名 | user-auth |
|
|
240
|
+
|
|
241
|
+
#### テンプレート例
|
|
242
|
+
|
|
243
|
+
```markdown
|
|
244
|
+
# Michi Core Principles
|
|
245
|
+
|
|
246
|
+
## Development Guidelines
|
|
247
|
+
{{DEV_GUIDELINES}}
|
|
248
|
+
|
|
249
|
+
## Language
|
|
250
|
+
All generated documents should be in: **{{LANG_CODE}}**
|
|
251
|
+
|
|
252
|
+
## Project Metadata
|
|
253
|
+
- Project ID: {{PROJECT_ID}}
|
|
254
|
+
- Kiro directory: {{KIRO_DIR}}
|
|
255
|
+
- Agent directory: {{AGENT_DIR}}
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
**利点:**
|
|
259
|
+
- ✅ 静的翻訳ファイル不要(メンテナンスコスト削減)
|
|
260
|
+
- ✅ cc-sddとの完全互換
|
|
261
|
+
- ✅ Cursor/Claude両環境で動作
|
|
262
|
+
- ✅ プロジェクト固有値の動的生成
|
|
263
|
+
|
|
264
|
+
|
|
208
265
|
### 設定ファイル
|
|
209
266
|
|
|
210
267
|
OSS公開に対応するため、以下のテンプレートファイルを用意しています:
|
|
@@ -260,24 +317,123 @@ APPROVAL_GATES_RELEASE=SM,部長
|
|
|
260
317
|
|
|
261
318
|
## 他のリポジトリでプロジェクトを進める
|
|
262
319
|
|
|
263
|
-
###
|
|
320
|
+
### 推奨ワークフロー(cc-sdd準拠)
|
|
321
|
+
|
|
322
|
+
既存リポジトリにMichiを導入する標準的な手順です:
|
|
323
|
+
|
|
324
|
+
```bash
|
|
325
|
+
# Step 1: cc-sddで標準ファイル生成
|
|
326
|
+
npx cc-sdd@latest --cursor --lang ja
|
|
327
|
+
|
|
328
|
+
# Step 2: Michi固有ファイルを追加
|
|
329
|
+
npx @sk8metal/michi-cli setup-existing --cursor --lang ja
|
|
330
|
+
|
|
331
|
+
# Step 3: 環境設定
|
|
332
|
+
npm run setup:interactive
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
**ステップの説明**:
|
|
336
|
+
|
|
337
|
+
1. **cc-sdd導入**: AI駆動開発ワークフローのコアフレームワークをインストール
|
|
338
|
+
2. **Michi固有ファイル追加**: Confluence/JIRA連携、マルチプロジェクト管理などのMichi専用機能を追加
|
|
339
|
+
3. **環境設定**: 認証情報とプロジェクトメタデータを対話的に設定
|
|
340
|
+
|
|
341
|
+
### IDE別セットアップ例
|
|
342
|
+
|
|
343
|
+
#### Cursor IDE(推奨)
|
|
344
|
+
|
|
345
|
+
```bash
|
|
346
|
+
# Step 1: cc-sdd導入
|
|
347
|
+
npx cc-sdd@latest --cursor --lang ja
|
|
348
|
+
|
|
349
|
+
# Step 2: Michi固有ファイル追加
|
|
350
|
+
npx @sk8metal/michi-cli setup-existing --cursor --lang ja
|
|
351
|
+
# または npm run michi:setup:cursor
|
|
352
|
+
|
|
353
|
+
# Step 3: 環境設定
|
|
354
|
+
npm run setup:interactive
|
|
355
|
+
```
|
|
356
|
+
|
|
357
|
+
#### Claude Code
|
|
358
|
+
|
|
359
|
+
```bash
|
|
360
|
+
# Step 1: cc-sdd導入
|
|
361
|
+
npx cc-sdd@latest --claude --lang ja
|
|
362
|
+
|
|
363
|
+
# Step 2: Michi固有ファイル追加
|
|
364
|
+
npx @sk8metal/michi-cli setup-existing --claude --lang ja
|
|
365
|
+
# または npm run michi:setup:claude
|
|
366
|
+
|
|
367
|
+
# Step 3: 環境設定
|
|
368
|
+
npm run setup:interactive
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
#### Gemini CLI
|
|
372
|
+
|
|
373
|
+
```bash
|
|
374
|
+
# Step 1: cc-sdd導入
|
|
375
|
+
npx cc-sdd@latest --gemini --lang ja
|
|
376
|
+
|
|
377
|
+
# Step 2: Michi固有ファイル追加(Cursor互換モード)
|
|
378
|
+
npx @sk8metal/michi-cli setup-existing --cursor --lang ja
|
|
379
|
+
|
|
380
|
+
# Step 3: 環境設定
|
|
381
|
+
npm run setup:interactive
|
|
382
|
+
```
|
|
383
|
+
|
|
384
|
+
#### Codex CLI
|
|
385
|
+
|
|
386
|
+
```bash
|
|
387
|
+
# Step 1: cc-sdd導入
|
|
388
|
+
npx cc-sdd@next --codex --lang ja
|
|
389
|
+
|
|
390
|
+
# Step 2: Michi固有ファイル追加(Cursor互換モード)
|
|
391
|
+
npx @sk8metal/michi-cli setup-existing --cursor --lang ja
|
|
392
|
+
|
|
393
|
+
# Step 3: 環境設定
|
|
394
|
+
npm run setup:interactive
|
|
395
|
+
```
|
|
396
|
+
|
|
397
|
+
#### Windsurf IDE
|
|
398
|
+
|
|
399
|
+
```bash
|
|
400
|
+
# Step 1: cc-sdd導入
|
|
401
|
+
npx cc-sdd@next --windsurf --lang ja
|
|
402
|
+
|
|
403
|
+
# Step 2: Michi固有ファイル追加(Cursor互換モード)
|
|
404
|
+
npx @sk8metal/michi-cli setup-existing --cursor --lang ja
|
|
405
|
+
|
|
406
|
+
# Step 3: 環境設定
|
|
407
|
+
npm run setup:interactive
|
|
408
|
+
```
|
|
409
|
+
|
|
410
|
+
### 既存リポジトリ vs 新規リポジトリ
|
|
411
|
+
|
|
412
|
+
#### 既存リポジトリにMichiを追加(推奨)
|
|
413
|
+
|
|
414
|
+
既に稼働しているプロジェクトにMichiを追加する場合:
|
|
264
415
|
|
|
265
416
|
```bash
|
|
266
417
|
# 既存プロジェクトのディレクトリに移動
|
|
267
418
|
cd /path/to/existing-repo
|
|
268
419
|
|
|
269
|
-
#
|
|
270
|
-
|
|
420
|
+
# 推奨ワークフローを実行
|
|
421
|
+
npx cc-sdd@latest --cursor --lang ja
|
|
422
|
+
npx @sk8metal/michi-cli setup-existing --cursor --lang ja
|
|
423
|
+
npm run setup:interactive
|
|
271
424
|
```
|
|
272
425
|
|
|
273
|
-
|
|
274
|
-
-
|
|
275
|
-
-
|
|
276
|
-
-
|
|
426
|
+
**自動的に追加されるもの**:
|
|
427
|
+
- 共通ルール(`.cursor/rules/`または`.claude/rules/`)
|
|
428
|
+
- Michi専用コマンド(`.cursor/commands/michi/`または`.claude/commands/michi/`)
|
|
429
|
+
- Steeringテンプレート(`.kiro/steering/`)
|
|
430
|
+
- Specテンプレート(`.kiro/settings/templates/`)
|
|
431
|
+
- プロジェクトメタデータ(`.kiro/project.json`)
|
|
432
|
+
- 環境変数テンプレート(`.env`)
|
|
277
433
|
|
|
278
|
-
|
|
434
|
+
#### 新規リポジトリを作成してMichiを導入
|
|
279
435
|
|
|
280
|
-
|
|
436
|
+
新しいプロジェクトをゼロから始める場合:
|
|
281
437
|
|
|
282
438
|
```bash
|
|
283
439
|
# Michiディレクトリから実行
|
|
@@ -288,14 +444,19 @@ npm run create-project -- \
|
|
|
288
444
|
--jira-key "PRJA"
|
|
289
445
|
```
|
|
290
446
|
|
|
291
|
-
詳細: [
|
|
447
|
+
詳細: [新規リポジトリセットアップガイド](./docs/getting-started/new-repository-setup.md)
|
|
448
|
+
|
|
449
|
+
**どちらを選ぶべきか?**
|
|
450
|
+
|
|
451
|
+
- ✅ **既存リポジトリに追加**: 既に稼働中のプロジェクトがある場合
|
|
452
|
+
- ✅ **新規リポジトリ作成**: 新しいプロジェクトを始める場合
|
|
292
453
|
|
|
293
454
|
## ドキュメント
|
|
294
455
|
|
|
295
456
|
### はじめに
|
|
296
457
|
- [クイックスタート](./docs/getting-started/quick-start.md) - 5分で始める ⭐
|
|
297
458
|
- [セットアップガイド](./docs/getting-started/setup.md) - インストール・設定手順
|
|
298
|
-
- [
|
|
459
|
+
- [新規リポジトリセットアップ](./docs/getting-started/new-repository-setup.md) - 新規リポジトリでの開始方法
|
|
299
460
|
|
|
300
461
|
### 実践ガイド
|
|
301
462
|
- [ワークフローガイド](./docs/guides/workflow.md) - AI開発フロー ⭐
|
|
@@ -311,6 +472,7 @@ npm run create-project -- \
|
|
|
311
472
|
- [コントリビューションガイド](./CONTRIBUTING.md) - 貢献方法
|
|
312
473
|
- [開発環境セットアップ](./docs/contributing/development.md) - 開発者向けセットアップ
|
|
313
474
|
- [リリース手順](./docs/contributing/release.md) - バージョンアップ・NPM公開手順
|
|
475
|
+
- [テスト戦略](./docs/testing-strategy.md) - テストカバレッジ目標と段階的計画 ⭐
|
|
314
476
|
|
|
315
477
|
すべてのドキュメントは [docs/README.md](./docs/README.md) から参照できます。
|
|
316
478
|
|
|
@@ -481,6 +643,38 @@ feature名は以下の場所で使用されるため、**英語・小文字・
|
|
|
481
643
|
- `-user-auth` - 先頭ハイフン(無効)
|
|
482
644
|
- `very-long-feature-name-for-user-authentication` - 長すぎる
|
|
483
645
|
|
|
646
|
+
## テスト
|
|
647
|
+
|
|
648
|
+
Michiプロジェクトは、統合テストによって品質を保証しています。
|
|
649
|
+
|
|
650
|
+
### テスト実行
|
|
651
|
+
|
|
652
|
+
```bash
|
|
653
|
+
# すべてのテスト実行
|
|
654
|
+
npm test
|
|
655
|
+
|
|
656
|
+
# 統合テストのみ実行
|
|
657
|
+
npm run test:integration:setup
|
|
658
|
+
|
|
659
|
+
# カバレッジ付き実行
|
|
660
|
+
npm run test:coverage:setup
|
|
661
|
+
|
|
662
|
+
# 監視モード
|
|
663
|
+
npm test -- --watch
|
|
664
|
+
|
|
665
|
+
# UIモード
|
|
666
|
+
npm run test:ui
|
|
667
|
+
```
|
|
668
|
+
|
|
669
|
+
### テストカバレッジ
|
|
670
|
+
|
|
671
|
+
- **目標**: 95%以上
|
|
672
|
+
- **現在のカバレッジ**: [](https://codecov.io/gh/sk8metalme/michi)
|
|
673
|
+
|
|
674
|
+
### テストドキュメント
|
|
675
|
+
|
|
676
|
+
詳細なテストガイドは [docs/testing/integration-tests.md](./docs/testing/integration-tests.md) を参照してください。
|
|
677
|
+
|
|
484
678
|
## 参考リンク
|
|
485
679
|
|
|
486
680
|
### AI開発フレームワーク
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-project.test.d.ts","sourceRoot":"","sources":["../../../scripts/__tests__/create-project.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
2
|
+
import { execSync } from 'child_process';
|
|
3
|
+
import { join } from 'path';
|
|
4
|
+
// モジュールのモック
|
|
5
|
+
vi.mock('child_process');
|
|
6
|
+
vi.mock('fs', () => ({
|
|
7
|
+
existsSync: vi.fn(() => true),
|
|
8
|
+
mkdirSync: vi.fn(),
|
|
9
|
+
cpSync: vi.fn(),
|
|
10
|
+
writeFileSync: vi.fn()
|
|
11
|
+
}));
|
|
12
|
+
vi.mock('dotenv', () => ({ config: vi.fn() }));
|
|
13
|
+
describe('create-project.ts パス問題', () => {
|
|
14
|
+
beforeEach(() => {
|
|
15
|
+
vi.clearAllMocks();
|
|
16
|
+
});
|
|
17
|
+
it('.cursor, .kiro, scripts が actualProjectDir にコピーされる', () => {
|
|
18
|
+
const projectDir = '/test/repo';
|
|
19
|
+
const actualProjectDir = '/test/repo/projects/test-project';
|
|
20
|
+
// .cursor/rules のコピー先パスを検証
|
|
21
|
+
const cursorRulesPath = join(actualProjectDir, '.cursor/rules', 'test.mdc');
|
|
22
|
+
expect(cursorRulesPath).toContain('projects/test-project/.cursor/rules');
|
|
23
|
+
expect(cursorRulesPath).not.toContain(join(projectDir, '.cursor'));
|
|
24
|
+
// .cursor/commands のコピー先パスを検証
|
|
25
|
+
const cursorCommandsPath = join(actualProjectDir, '.cursor/commands/kiro', 'test.md');
|
|
26
|
+
expect(cursorCommandsPath).toContain('projects/test-project/.cursor/commands');
|
|
27
|
+
// .kiro/steering のコピー先パスを検証
|
|
28
|
+
const kiroSteeringPath = join(actualProjectDir, '.kiro/steering');
|
|
29
|
+
expect(kiroSteeringPath).toContain('projects/test-project/.kiro/steering');
|
|
30
|
+
// scripts のコピー先パスを検証
|
|
31
|
+
const scriptsPath = join(actualProjectDir, 'scripts', 'test.ts');
|
|
32
|
+
expect(scriptsPath).toContain('projects/test-project/scripts');
|
|
33
|
+
});
|
|
34
|
+
it('package.json と tsconfig.json は projectDir (リポジトリルート) にコピーされる', () => {
|
|
35
|
+
const projectDir = '/test/repo';
|
|
36
|
+
// package.json はリポジトリルート
|
|
37
|
+
const packageJsonPath = join(projectDir, 'package.json');
|
|
38
|
+
expect(packageJsonPath).toBe('/test/repo/package.json');
|
|
39
|
+
expect(packageJsonPath).not.toContain('projects/test-project');
|
|
40
|
+
// tsconfig.json もリポジトリルート
|
|
41
|
+
const tsconfigPath = join(projectDir, 'tsconfig.json');
|
|
42
|
+
expect(tsconfigPath).toBe('/test/repo/tsconfig.json');
|
|
43
|
+
expect(tsconfigPath).not.toContain('projects/test-project');
|
|
44
|
+
});
|
|
45
|
+
it('ディレクトリ作成が actualProjectDir 配下で行われる', () => {
|
|
46
|
+
const actualProjectDir = '/test/repo/projects/test-project';
|
|
47
|
+
const directories = [
|
|
48
|
+
join(actualProjectDir, '.cursor/rules'),
|
|
49
|
+
join(actualProjectDir, '.cursor/commands/kiro'),
|
|
50
|
+
join(actualProjectDir, '.kiro/steering'),
|
|
51
|
+
join(actualProjectDir, '.kiro/settings/templates'),
|
|
52
|
+
join(actualProjectDir, 'scripts/utils')
|
|
53
|
+
];
|
|
54
|
+
// すべてのディレクトリが actualProjectDir 配下にあることを確認
|
|
55
|
+
directories.forEach(dir => {
|
|
56
|
+
expect(dir).toContain('projects/test-project');
|
|
57
|
+
expect(dir.startsWith(actualProjectDir)).toBe(true);
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
describe('create-project.ts jj/git 依存性', () => {
|
|
62
|
+
let mockExecSync;
|
|
63
|
+
beforeEach(() => {
|
|
64
|
+
vi.clearAllMocks();
|
|
65
|
+
mockExecSync = vi.mocked(execSync);
|
|
66
|
+
});
|
|
67
|
+
afterEach(() => {
|
|
68
|
+
vi.restoreAllMocks();
|
|
69
|
+
});
|
|
70
|
+
it('jj が利用可能な場合は jj を使用する', () => {
|
|
71
|
+
// jj --version が成功(文字列を返す)
|
|
72
|
+
mockExecSync.mockImplementationOnce((command) => {
|
|
73
|
+
if (command === 'jj --version') {
|
|
74
|
+
return 'jj 0.15.0';
|
|
75
|
+
}
|
|
76
|
+
throw new Error('Unexpected command');
|
|
77
|
+
});
|
|
78
|
+
// checkDependencies のロジックを再現
|
|
79
|
+
const checkDeps = () => {
|
|
80
|
+
try {
|
|
81
|
+
const jjVersion = execSync('jj --version', {
|
|
82
|
+
encoding: 'utf-8',
|
|
83
|
+
stdio: ['pipe', 'pipe', 'pipe']
|
|
84
|
+
}).trim();
|
|
85
|
+
return { vcs: 'jj', version: jjVersion };
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
return { vcs: 'git', version: 'fallback' };
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
const result = checkDeps();
|
|
92
|
+
expect(result.vcs).toBe('jj');
|
|
93
|
+
expect(mockExecSync).toHaveBeenCalledWith('jj --version', expect.objectContaining({ encoding: 'utf-8' }));
|
|
94
|
+
});
|
|
95
|
+
it('jj 未インストール時は git にフォールバックする', () => {
|
|
96
|
+
// jj --version が失敗、git --version が成功
|
|
97
|
+
mockExecSync.mockImplementation((command) => {
|
|
98
|
+
if (command === 'jj --version') {
|
|
99
|
+
throw new Error('jj not found');
|
|
100
|
+
}
|
|
101
|
+
if (command === 'git --version') {
|
|
102
|
+
return 'git version 2.40.0';
|
|
103
|
+
}
|
|
104
|
+
throw new Error('Unexpected command');
|
|
105
|
+
});
|
|
106
|
+
// checkDependencies のロジックを再現
|
|
107
|
+
const checkDeps = () => {
|
|
108
|
+
try {
|
|
109
|
+
const jjVersion = execSync('jj --version', {
|
|
110
|
+
encoding: 'utf-8',
|
|
111
|
+
stdio: ['pipe', 'pipe', 'pipe']
|
|
112
|
+
}).trim();
|
|
113
|
+
return { vcs: 'jj', version: jjVersion };
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
try {
|
|
117
|
+
const gitVersion = execSync('git --version', {
|
|
118
|
+
encoding: 'utf-8',
|
|
119
|
+
stdio: ['pipe', 'pipe', 'pipe']
|
|
120
|
+
}).trim();
|
|
121
|
+
return { vcs: 'git', version: gitVersion };
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
throw new Error('Neither jj nor git is installed');
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
const result = checkDeps();
|
|
129
|
+
expect(result.vcs).toBe('git');
|
|
130
|
+
expect(mockExecSync).toHaveBeenCalledTimes(2);
|
|
131
|
+
expect(mockExecSync).toHaveBeenNthCalledWith(1, 'jj --version', expect.anything());
|
|
132
|
+
expect(mockExecSync).toHaveBeenNthCalledWith(2, 'git --version', expect.anything());
|
|
133
|
+
});
|
|
134
|
+
it('jj も git も未インストール時はエラーを投げる', () => {
|
|
135
|
+
// 両方とも失敗
|
|
136
|
+
mockExecSync.mockImplementation(() => {
|
|
137
|
+
throw new Error('command not found');
|
|
138
|
+
});
|
|
139
|
+
// checkDependencies のロジックを再現
|
|
140
|
+
const checkDeps = () => {
|
|
141
|
+
try {
|
|
142
|
+
const jjVersion = execSync('jj --version', {
|
|
143
|
+
encoding: 'utf-8',
|
|
144
|
+
stdio: ['pipe', 'pipe', 'pipe']
|
|
145
|
+
}).trim();
|
|
146
|
+
return { vcs: 'jj', version: jjVersion };
|
|
147
|
+
}
|
|
148
|
+
catch {
|
|
149
|
+
try {
|
|
150
|
+
const gitVersion = execSync('git --version', {
|
|
151
|
+
encoding: 'utf-8',
|
|
152
|
+
stdio: ['pipe', 'pipe', 'pipe']
|
|
153
|
+
}).trim();
|
|
154
|
+
return { vcs: 'git', version: gitVersion };
|
|
155
|
+
}
|
|
156
|
+
catch {
|
|
157
|
+
throw new Error('Neither jj nor git is installed');
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
};
|
|
161
|
+
expect(() => checkDeps()).toThrow('Neither jj nor git is installed');
|
|
162
|
+
});
|
|
163
|
+
it('clone コマンドが VCS に応じて切り替わる', () => {
|
|
164
|
+
const repoUrl = 'https://github.com/org/repo';
|
|
165
|
+
const projectDir = '/test/repo';
|
|
166
|
+
// jj の場合
|
|
167
|
+
const jjDeps = { vcs: 'jj', version: 'jj 0.15.0' };
|
|
168
|
+
const jjCommand = jjDeps.vcs === 'jj'
|
|
169
|
+
? `jj git clone ${repoUrl} ${projectDir}`
|
|
170
|
+
: `git clone ${repoUrl} ${projectDir}`;
|
|
171
|
+
expect(jjCommand).toBe(`jj git clone ${repoUrl} ${projectDir}`);
|
|
172
|
+
// git の場合
|
|
173
|
+
const gitDeps = { vcs: 'git', version: 'git version 2.40' };
|
|
174
|
+
const gitCommand = gitDeps.vcs === 'jj'
|
|
175
|
+
? `jj git clone ${repoUrl} ${projectDir}`
|
|
176
|
+
: `git clone ${repoUrl} ${projectDir}`;
|
|
177
|
+
expect(gitCommand).toBe(`git clone ${repoUrl} ${projectDir}`);
|
|
178
|
+
});
|
|
179
|
+
it('commit コマンドが VCS に応じて切り替わる', () => {
|
|
180
|
+
const message = 'chore: initial commit';
|
|
181
|
+
// jj の場合のコマンド群
|
|
182
|
+
const jjDeps = { vcs: 'jj' };
|
|
183
|
+
const jjCommands = jjDeps.vcs === 'jj' ? [
|
|
184
|
+
`jj commit -m "${message}"`,
|
|
185
|
+
'jj bookmark create main -r "@-"'
|
|
186
|
+
] : [
|
|
187
|
+
'git add .',
|
|
188
|
+
`git commit -m "${message}"`,
|
|
189
|
+
'git branch -M main'
|
|
190
|
+
];
|
|
191
|
+
expect(jjCommands).toContain('jj commit -m "chore: initial commit"');
|
|
192
|
+
expect(jjCommands).toContain('jj bookmark create main -r "@-"');
|
|
193
|
+
// git の場合のコマンド群
|
|
194
|
+
const gitDeps = { vcs: 'git' };
|
|
195
|
+
const gitCommands = gitDeps.vcs === 'jj' ? [
|
|
196
|
+
`jj commit -m "${message}"`,
|
|
197
|
+
'jj bookmark create main -r "@-"'
|
|
198
|
+
] : [
|
|
199
|
+
'git add .',
|
|
200
|
+
`git commit -m "${message}"`,
|
|
201
|
+
'git branch -M main'
|
|
202
|
+
];
|
|
203
|
+
expect(gitCommands).toContain('git add .');
|
|
204
|
+
expect(gitCommands).toContain('git commit -m "chore: initial commit"');
|
|
205
|
+
expect(gitCommands).toContain('git branch -M main');
|
|
206
|
+
});
|
|
207
|
+
});
|
|
208
|
+
describe('create-project.ts .env作成時のcwd修正', () => {
|
|
209
|
+
let mockExecSync;
|
|
210
|
+
beforeEach(() => {
|
|
211
|
+
vi.clearAllMocks();
|
|
212
|
+
mockExecSync = vi.mocked(execSync);
|
|
213
|
+
});
|
|
214
|
+
afterEach(() => {
|
|
215
|
+
vi.restoreAllMocks();
|
|
216
|
+
});
|
|
217
|
+
it('.env作成時に actualProjectDir を cwd として使用する', () => {
|
|
218
|
+
const projectDir = '/test/repo';
|
|
219
|
+
const actualProjectDir = '/test/repo/projects/test-project';
|
|
220
|
+
// execSync の呼び出しをモック
|
|
221
|
+
mockExecSync.mockImplementation((command, options) => {
|
|
222
|
+
if (command === 'npm run setup:env') {
|
|
223
|
+
// cwd が actualProjectDir であることを確認
|
|
224
|
+
expect(options?.cwd).toBe(actualProjectDir);
|
|
225
|
+
expect(options?.cwd).not.toBe(projectDir);
|
|
226
|
+
return '';
|
|
227
|
+
}
|
|
228
|
+
return '';
|
|
229
|
+
});
|
|
230
|
+
// .env作成のロジックを再現
|
|
231
|
+
execSync('npm run setup:env', { cwd: actualProjectDir, stdio: 'inherit' });
|
|
232
|
+
expect(mockExecSync).toHaveBeenCalledWith('npm run setup:env', expect.objectContaining({ cwd: actualProjectDir }));
|
|
233
|
+
});
|
|
234
|
+
it('.env が actualProjectDir に作成される(projectDir ではない)', () => {
|
|
235
|
+
const projectDir = '/test/repo';
|
|
236
|
+
const actualProjectDir = '/test/repo/projects/test-project';
|
|
237
|
+
// .env のパスを検証
|
|
238
|
+
const envPathInProjectDir = join(projectDir, '.env');
|
|
239
|
+
const envPathInActualProjectDir = join(actualProjectDir, '.env');
|
|
240
|
+
// .env は actualProjectDir に作成されるべき
|
|
241
|
+
expect(envPathInActualProjectDir).toContain('projects/test-project/.env');
|
|
242
|
+
expect(envPathInActualProjectDir).not.toBe(envPathInProjectDir);
|
|
243
|
+
expect(envPathInProjectDir).toBe('/test/repo/.env');
|
|
244
|
+
expect(envPathInActualProjectDir).toBe('/test/repo/projects/test-project/.env');
|
|
245
|
+
});
|
|
246
|
+
});
|
|
247
|
+
//# sourceMappingURL=create-project.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-project.test.js","sourceRoot":"","sources":["../../../scripts/__tests__/create-project.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multi-project-estimate.test.d.ts","sourceRoot":"","sources":["../../../scripts/__tests__/multi-project-estimate.test.ts"],"names":[],"mappings":""}
|