@aramassa/ai-rules 0.1.1-npmjs.20250910072942
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/README-npmjs.md +37 -0
- package/README.md +37 -0
- package/artifact/chatmodes/Instruction Improve.md +142 -0
- package/artifact/chatmodes/Planning.md +173 -0
- package/artifact/instructions/git-rules.md +68 -0
- package/artifact/instructions/package-management.md +113 -0
- package/artifact/instructions/planning.md +54 -0
- package/artifact/instructions/python/workspace-management.md +673 -0
- package/artifact/instructions/python-cli.md +261 -0
- package/artifact/instructions/retrospective.md +32 -0
- package/artifact/instructions/rules/coding/nodejs.md +299 -0
- package/artifact/instructions/rules/coding/openai.md +39 -0
- package/artifact/instructions/rules/coding/typescript.md +92 -0
- package/artifact/instructions/rules/development/ansible.md +258 -0
- package/artifact/instructions/rules/development/code-quality-tools.md +181 -0
- package/artifact/instructions/rules/development/github.md +140 -0
- package/artifact/instructions/rules/development/npm-publish.md +108 -0
- package/artifact/instructions/rules/development/typescript-rollup-build.md +249 -0
- package/artifact/instructions/rules/development/typescript.md +46 -0
- package/artifact/instructions/rules/documentation/common.md +16 -0
- package/artifact/instructions/rules/documentation/docs-ai-external.md +12 -0
- package/artifact/instructions/rules/documentation/docs-ai-history.md +46 -0
- package/artifact/instructions/rules/documentation/docs-ai-internal.md +70 -0
- package/artifact/instructions/rules/documentation/docs-ai-learning.md +53 -0
- package/artifact/instructions/rules/documentation/docs.md +41 -0
- package/artifact/instructions/rules/documentation/github-protection.md +122 -0
- package/artifact/instructions/rules/test/e2e-bdd.md +31 -0
- package/artifact/instructions/rules/test/nodejs-test-restrictions.md +101 -0
- package/artifact/instructions/rules/test/timeout-configuration-typescript.md +67 -0
- package/artifact/instructions/rules/test/timeout-configuration.md +89 -0
- package/artifact/instructions/skel/common/change_plans/.gitkeep +0 -0
- package/artifact/instructions/skel/common/docs/.gitkeep +0 -0
- package/artifact/instructions/skel/common/docs_ai/.gitkeep +0 -0
- package/artifact/instructions/skel/common/skel/.gitkeep +0 -0
- package/artifact/instructions/skel/common/todo_plans/.gitkeep +0 -0
- package/artifact/instructions/skel/typescript/tsconfig.build.json +17 -0
- package/artifact/instructions/skel/typescript/tsconfig.json +117 -0
- package/artifact/instructions/skel/typescript/tsdoc.json +4 -0
- package/artifact/instructions/skel.md +88 -0
- package/artifact/instructions/todo_planning.md +25 -0
- package/artifact/instructions/tyding-up.md +30 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +10934 -0
- package/dist/filter.d.ts +8 -0
- package/dist/filter.d.ts.map +1 -0
- package/dist/filter.js +72 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1 -0
- package/dist/optionValidator.d.ts +28 -0
- package/dist/optionValidator.d.ts.map +1 -0
- package/dist/optionValidator.js +29 -0
- package/dist/templateEngine.d.ts +55 -0
- package/dist/templateEngine.d.ts.map +1 -0
- package/dist/templateEngine.js +124 -0
- package/dist/utils/objectUtils.d.ts +11 -0
- package/dist/utils/objectUtils.d.ts.map +1 -0
- package/dist/utils/objectUtils.js +17 -0
- package/dist/utils/test/structureExtractors.d.ts +30 -0
- package/dist/utils/test/structureExtractors.d.ts.map +1 -0
- package/dist/utils/test/structureExtractors.js +164 -0
- package/dist/variableResolver.d.ts +68 -0
- package/dist/variableResolver.d.ts.map +1 -0
- package/dist/variableResolver.js +190 -0
- package/package.json +69 -0
- package/presets/README.md +109 -0
- package/presets/basic.yaml +14 -0
- package/presets/chatmodes.yaml +64 -0
- package/presets/docs-ai.yaml +7 -0
- package/presets/infrastructure-ansible.yaml +19 -0
- package/presets/typescript.yaml +16 -0
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: python-cli
|
|
3
|
+
category: implementation
|
|
4
|
+
focus: cli-development
|
|
5
|
+
language: python
|
|
6
|
+
human-instruction: |-
|
|
7
|
+
## Python CLI 開発のための包括的ガイドライン
|
|
8
|
+
|
|
9
|
+
このガイドラインは、Python CLI アプリケーション開発における
|
|
10
|
+
ライブラリ選択、アーキテクチャ設計、実装パターンを体系化したものです。
|
|
11
|
+
argparse/Click/Typer の比較から実際の実装テクニックまで、
|
|
12
|
+
instruction 改善に活用できる実践的な内容を提供します。
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
# Python CLI 実装ガイドライン
|
|
16
|
+
|
|
17
|
+
## 背景
|
|
18
|
+
|
|
19
|
+
Python CLI 開発においては、適切なライブラリ選択とアーキテクチャ設計が開発効率と保守性に大きく影響します。本ガイドラインは、argparse/Click/Typer の比較分析と実装ベストプラクティスを提供し、instruction 改善の指針として活用できます。
|
|
20
|
+
|
|
21
|
+
## ライブラリ選択の判断基準
|
|
22
|
+
|
|
23
|
+
### argparse を選ぶべき場合
|
|
24
|
+
|
|
25
|
+
- **標準ライブラリのみで完結させたい**
|
|
26
|
+
- **外部依存を追加できない環境制約**
|
|
27
|
+
- **小規模なスクリプト(10個未満のオプション)**
|
|
28
|
+
- **精密な引数制御が必要な特殊ケース**
|
|
29
|
+
|
|
30
|
+
### Click を選ぶべき場合
|
|
31
|
+
|
|
32
|
+
- **実績と安定性を重視する本番環境**
|
|
33
|
+
- **大規模CLIツール(複数階層のサブコマンド)**
|
|
34
|
+
- **チーム開発での標準化済み環境**
|
|
35
|
+
- **マルチプラットフォーム配布が重要**
|
|
36
|
+
|
|
37
|
+
### Typer を選ぶべき場合(推奨)
|
|
38
|
+
|
|
39
|
+
- **開発効率と型安全性を重視**
|
|
40
|
+
- **FastAPI などモダンなPython技術との統合**
|
|
41
|
+
- **プロトタイピングや素早い実装が必要**
|
|
42
|
+
- **美しいUXを提供したい開発者向けツール**
|
|
43
|
+
|
|
44
|
+
### 明らかにTyperに適していない場合
|
|
45
|
+
|
|
46
|
+
- **極めて複雑な引数制御が必要(argparse推奨)**
|
|
47
|
+
- **レガシー環境での長期運用(Click推奨)**
|
|
48
|
+
- **最小限の外部依存が絶対条件(argparse推奨)**
|
|
49
|
+
|
|
50
|
+
## ライブラリ機能比較表
|
|
51
|
+
|
|
52
|
+
| 機能 | argparse | Click | Typer |
|
|
53
|
+
|------|----------|-------|-------|
|
|
54
|
+
| 引数・オプション定義 | 手動(add_argument) | デコレータ | 型注釈 |
|
|
55
|
+
| サブコマンド | add_subparsers | 優秀 | 優秀(Click ベース) |
|
|
56
|
+
| 補完機能 | 外部ライブラリ必要 | Bash/Zsh/Fish | 全シェル対応 |
|
|
57
|
+
| 型注釈対応 | なし | なし | フル対応 |
|
|
58
|
+
| 自動ヘルプ生成 | 基本 | 充実 | 最高 |
|
|
59
|
+
| 学習コスト | 中 | 低-中 | 低 |
|
|
60
|
+
| 実績・安定性 | 高(標準) | 高 | 中(新しい) |
|
|
61
|
+
|
|
62
|
+
## CLI アーキテクチャ設計
|
|
63
|
+
|
|
64
|
+
### エントリポイント設計パターン
|
|
65
|
+
|
|
66
|
+
```python
|
|
67
|
+
# packages/cli/src/rag_pf_cli/main.py
|
|
68
|
+
app = typer.Typer(name="ragly", help="RAG Platform CLI")
|
|
69
|
+
app.add_typer(ingest.app, name="ingest", help="Data ingestion commands")
|
|
70
|
+
app.add_typer(evaluation.app, name="evaluate", help="Evaluation commands")
|
|
71
|
+
app.add_typer(retrieval.app, name="retrieve", help="Retrieval commands")
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### 一貫したエラーハンドリング
|
|
75
|
+
|
|
76
|
+
```python
|
|
77
|
+
@app.command()
|
|
78
|
+
def risky_operation():
|
|
79
|
+
try:
|
|
80
|
+
# 処理実行
|
|
81
|
+
console.print("[green]✓ Operation completed[/green]")
|
|
82
|
+
except Exception as e:
|
|
83
|
+
console.print(f"[red]✗ Operation failed: {e}[/red]")
|
|
84
|
+
raise typer.Exit(1)
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### Rich による美しい出力
|
|
88
|
+
|
|
89
|
+
```python
|
|
90
|
+
# テーブル表示
|
|
91
|
+
table = Table(title="RAG Platform Status")
|
|
92
|
+
table.add_column("Component", style="cyan")
|
|
93
|
+
table.add_column("Status", style="green")
|
|
94
|
+
table.add_row("Database", "✓ Connected")
|
|
95
|
+
console.print(table)
|
|
96
|
+
|
|
97
|
+
# プログレスバー
|
|
98
|
+
with Progress() as progress:
|
|
99
|
+
task = progress.add_task("[green]Processing...", total=items)
|
|
100
|
+
for i in range(items):
|
|
101
|
+
progress.update(task, advance=1)
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
## 実装テクニック
|
|
105
|
+
|
|
106
|
+
### 型安全性とPydantic連携
|
|
107
|
+
|
|
108
|
+
```python
|
|
109
|
+
class AppConfig(BaseModel):
|
|
110
|
+
database: DatabaseConfig
|
|
111
|
+
debug: bool = Field(default=False)
|
|
112
|
+
log_level: str = Field(default="INFO")
|
|
113
|
+
|
|
114
|
+
@classmethod
|
|
115
|
+
def from_env(cls) -> "AppConfig":
|
|
116
|
+
"""Load configuration from environment variables."""
|
|
117
|
+
return cls(
|
|
118
|
+
database=DatabaseConfig(
|
|
119
|
+
host=os.getenv("DB_HOST", "localhost"),
|
|
120
|
+
# ...
|
|
121
|
+
)
|
|
122
|
+
)
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
### ログ設定とデバッグ支援
|
|
126
|
+
|
|
127
|
+
```python
|
|
128
|
+
def setup_logging(level: str = "INFO", rich_output: bool = True):
|
|
129
|
+
"""Set up logging with Rich handler."""
|
|
130
|
+
logging.basicConfig(
|
|
131
|
+
level=getattr(logging, level.upper()),
|
|
132
|
+
format="%(message)s",
|
|
133
|
+
datefmt="[%X]",
|
|
134
|
+
handlers=[RichHandler()] if rich_output else None
|
|
135
|
+
)
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
## テスト戦略
|
|
139
|
+
|
|
140
|
+
### 設定ファイルベースのテスト
|
|
141
|
+
|
|
142
|
+
```python
|
|
143
|
+
@pytest.fixture
|
|
144
|
+
def sample_config():
|
|
145
|
+
return RagConfig(
|
|
146
|
+
database=DatabaseConfig(
|
|
147
|
+
database="test_db",
|
|
148
|
+
username="test_user",
|
|
149
|
+
password="test_password"
|
|
150
|
+
),
|
|
151
|
+
vector_store=VectorStoreConfig(
|
|
152
|
+
provider="memory",
|
|
153
|
+
collection_name="test_collection"
|
|
154
|
+
),
|
|
155
|
+
chunk_size=256,
|
|
156
|
+
chunk_overlap=25,
|
|
157
|
+
debug=True
|
|
158
|
+
)
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
### CLI統合テスト
|
|
162
|
+
|
|
163
|
+
```python
|
|
164
|
+
def test_ingest_command(runner):
|
|
165
|
+
result = runner.invoke(app, [
|
|
166
|
+
"ingest", "run", "test_data.txt",
|
|
167
|
+
"--loader-type", "text",
|
|
168
|
+
"--chunk-size", "256"
|
|
169
|
+
])
|
|
170
|
+
assert result.exit_code == 0
|
|
171
|
+
assert "Ingestion complete" in result.stdout
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
### モックとフィクスチャの活用
|
|
175
|
+
|
|
176
|
+
```python
|
|
177
|
+
@patch('myapp.database.connect')
|
|
178
|
+
def test_database_connection(mock_connect, runner):
|
|
179
|
+
mock_connect.return_value = Mock()
|
|
180
|
+
result = runner.invoke(app, ["db", "status"])
|
|
181
|
+
assert result.exit_code == 0
|
|
182
|
+
mock_connect.assert_called_once()
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
## パッケージ管理(uv ワークスペース)
|
|
186
|
+
|
|
187
|
+
### pyproject.toml の設計
|
|
188
|
+
|
|
189
|
+
```toml
|
|
190
|
+
[project]
|
|
191
|
+
name = "rag-pf-cli"
|
|
192
|
+
dependencies = [
|
|
193
|
+
"typer>=0.9.0",
|
|
194
|
+
"rich>=13.0.0",
|
|
195
|
+
]
|
|
196
|
+
|
|
197
|
+
[tool.uv.sources]
|
|
198
|
+
rag-pf-common = { workspace = true }
|
|
199
|
+
rag-pf-core = { workspace = true }
|
|
200
|
+
|
|
201
|
+
[project.scripts]
|
|
202
|
+
ragly = "rag_pf_cli.main:app"
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
### 開発スクリプトの活用
|
|
206
|
+
|
|
207
|
+
```bash
|
|
208
|
+
# setup-dev.sh での CLI インストール
|
|
209
|
+
uv pip install -e packages/cli
|
|
210
|
+
|
|
211
|
+
# 実行確認
|
|
212
|
+
uv run ragly --help
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
### 品質保証スクリプト
|
|
216
|
+
|
|
217
|
+
```bash
|
|
218
|
+
# 型チェック
|
|
219
|
+
uv run mypy packages/
|
|
220
|
+
|
|
221
|
+
# リンティング
|
|
222
|
+
uv run ruff check packages/
|
|
223
|
+
uv run ruff format packages/
|
|
224
|
+
|
|
225
|
+
# テスト実行
|
|
226
|
+
uv run pytest tests/ --cov=packages
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
## CLI 基本設計原則
|
|
230
|
+
|
|
231
|
+
### サブコマンドベースの構造
|
|
232
|
+
|
|
233
|
+
- **機能別モジュール分割**: 関連機能をサブコマンドでグループ化
|
|
234
|
+
- **直感的な命名**: ユーザーが推測しやすいコマンド名
|
|
235
|
+
- **一貫したインターフェース**: 共通オプションの統一
|
|
236
|
+
|
|
237
|
+
### 設定管理のベストプラクティス
|
|
238
|
+
|
|
239
|
+
- **階層的設定**: 環境変数 → 設定ファイル → CLI引数の優先順位
|
|
240
|
+
- **型安全な設定**: Pydantic による設定値の検証
|
|
241
|
+
- **開発/本番環境の切り分け**: 環境別設定の明確な分離
|
|
242
|
+
|
|
243
|
+
## 追加検討要素
|
|
244
|
+
|
|
245
|
+
### パフォーマンス考慮
|
|
246
|
+
|
|
247
|
+
- **大規模データ処理**: ストリーミング処理とプログレス表示
|
|
248
|
+
- **並列処理**: asyncio や multiprocessing の適切な活用
|
|
249
|
+
- **メモリ効率**: 大量データ処理時のメモリ使用量最適化
|
|
250
|
+
|
|
251
|
+
### セキュリティ
|
|
252
|
+
|
|
253
|
+
- **機密データ処理**: 環境変数やシークレット管理の適切な実装
|
|
254
|
+
- **入力検証**: ユーザー入力の適切なサニタイゼーション
|
|
255
|
+
- **ログ安全性**: 機密情報のログ出力防止
|
|
256
|
+
|
|
257
|
+
### 配布最適化
|
|
258
|
+
|
|
259
|
+
- **バイナリ配布**: PyInstaller や cx_Freeze を使った単体実行ファイル化
|
|
260
|
+
- **Docker コンテナ化**: マルチステージビルドによる軽量化
|
|
261
|
+
- **パッケージ配布**: PyPI 公開時の品質確保
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: retrospective
|
|
3
|
+
title: タスクの振り返り
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
実行したタスクを振り返って、次の遂行時によりよい結果を得られるように改善しましょう
|
|
7
|
+
|
|
8
|
+
## 振り返りの結果得たいこと
|
|
9
|
+
|
|
10
|
+
* instruction ファイル群の改善点をGitHub Issueにする
|
|
11
|
+
* 学習コンテンツを作成する(学習フォルダに作成)
|
|
12
|
+
|
|
13
|
+
### 振り返りのポイント
|
|
14
|
+
|
|
15
|
+
#### 修正指示を受けたこと
|
|
16
|
+
|
|
17
|
+
一度実行したタスクに対して修正指示があった場合、
|
|
18
|
+
|
|
19
|
+
#### コマンドエラー
|
|
20
|
+
|
|
21
|
+
Runner の実行時などでエラーを発生させてしまった場合は、正しいコマンドを選択できるように、
|
|
22
|
+
『いつ、どのコマンドを使用すべきか?』を instruction に追記するようにしましょう。
|
|
23
|
+
|
|
24
|
+
## GitHub Issueの登録方法
|
|
25
|
+
|
|
26
|
+
instruction管理用のリポジトリが指定されている場合は、そのリポジトリに新しくIssueを登録してください。
|
|
27
|
+
リポジトリが指定されていない場合は、確認してください。
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
title: 改善内容を端的に表すもの
|
|
31
|
+
body: 改善内容をできるだけ詳細に記載。実際に遭遇したシチュエーションなどを例として記載してください。
|
|
32
|
+
```
|
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: coding-rules
|
|
3
|
+
language:
|
|
4
|
+
- nodejs
|
|
5
|
+
- typescript
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
このドキュメントでは、Node.js/TypeScript プロジェクトにおけるコーディング規約・スタイルガイドについて説明します。
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## 1. 基本方針
|
|
13
|
+
|
|
14
|
+
### 1.1 言語とモジュール形式
|
|
15
|
+
|
|
16
|
+
- **ESM 形式**で書く(CommonJS は使用しない)
|
|
17
|
+
- **TypeScript** の型システムをフル活用し、型安全なコードを書く
|
|
18
|
+
- 可能な限り **`class`** を利用する
|
|
19
|
+
- メソッドは可能な限りアトミックにし、単一責任を守る
|
|
20
|
+
- メソッドやプロパティの可視性は必ず設定し、不必要に公開範囲を広げない
|
|
21
|
+
|
|
22
|
+
### 1.2 設計原則
|
|
23
|
+
|
|
24
|
+
- **依存性逆転 (DIP)**: Domain から外部サービスに直接依存しない。ポート&アダプター (Hexagonal) を採用する
|
|
25
|
+
- **Config‑as‑Code**: 環境差分は `config/` の設定ファイルに集約し、dotenv で注入する
|
|
26
|
+
- **CQRS / Event‑Driven** を検討し、読み取り専用サービスのスケーラビリティを高める
|
|
27
|
+
- インターフェースを明確にし、共通化できるところは共通化する
|
|
28
|
+
- Factory パターンや Strategy パターンも使えるところでは使う
|
|
29
|
+
- コンポジションを優先し、継承は必要最小限(例: サードパーティ API の拡張)にとどめる
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## 2. コーディングスタイル
|
|
34
|
+
|
|
35
|
+
### ESMファイルの実行制御
|
|
36
|
+
|
|
37
|
+
- CLI用のESMファイル(実行可能ファイル)では、ファイル末尾での実行判定チェック(`if (import.meta.url === \`file://${process.argv[1]}\`)`)は使用しない
|
|
38
|
+
- 代わりに、CLI として設計されたファイルでは常に main 関数を実行するようにする
|
|
39
|
+
- 理由:npx や npm scripts 経由での実行時に判定が正しく動作しない場合があるため
|
|
40
|
+
- 例:
|
|
41
|
+
```typescript
|
|
42
|
+
// ❌ 避ける
|
|
43
|
+
if (import.meta.url === `file://${process.argv[1]}`) {
|
|
44
|
+
main();
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// ✅ 推奨(CLI用ファイルの場合)
|
|
48
|
+
main().catch(console.error);
|
|
49
|
+
|
|
50
|
+
### 2.1 変数と関数
|
|
51
|
+
|
|
52
|
+
- 変数は再代入が不要な限り **`const`** を使用し、`var` は禁止とする
|
|
53
|
+
- **`async/await`** を優先し、Promise チェーンやコールバックの多用を避ける
|
|
54
|
+
- 公開 API(export される関数・クラス メソッド)は必ず戻り値の型を明示する
|
|
55
|
+
- **Top‑level await** はエントリポイント以外で使用しない
|
|
56
|
+
|
|
57
|
+
### 2.2 定数管理
|
|
58
|
+
|
|
59
|
+
- マジックナンバー/マジックストリングを禁止し、`const enum` または設定ファイル・専用の定数オブジェクトに切り出して一元管理する
|
|
60
|
+
- 例: logger 設定値や API エンドポイント、日付パターン、ファイルサイズなどは `src/utils/loggerConfig.ts` のような専用ファイルで管理する
|
|
61
|
+
- 既存コードで直値が使われている場合は、リファクタリング時に必ず定数化・集約を行うこと
|
|
62
|
+
|
|
63
|
+
### 2.3 コード量の目安
|
|
64
|
+
|
|
65
|
+
- 関数は **20 行以内**、クラスは **400 行以内**を目安とする
|
|
66
|
+
- 循環的複雑度 (cyclomatic complexity) は **10 未満**に抑える
|
|
67
|
+
|
|
68
|
+
### 2.4 エラーハンドリング
|
|
69
|
+
|
|
70
|
+
- 非同期エラーは `Result<T, E>` パターンまたは独自の `TypedError` クラスでラップし、`throw` するのは `Error` 派生クラスに限定する
|
|
71
|
+
- エラーハンドリングは `try/catch` または `Error Boundary` で捕捉し、必ず `logger.error` でスタックトレースを出力する
|
|
72
|
+
- `process.exit` の使用は極力避け、正常終了・異常終了の制御は例外処理やエラーハンドリングで行うこと
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## 3. 静的解析・整形(必須設定)
|
|
77
|
+
|
|
78
|
+
### 3.1 ツール構成(必須)
|
|
79
|
+
|
|
80
|
+
- **[ESLint](https://eslint.org/)** + **[@typescript-eslint](https://typescript-eslint.io/)** + **[Prettier](https://prettier.io/)** の導入・設定は**必須**
|
|
81
|
+
- 必須ルール: **Airbnb TypeScript**ベース
|
|
82
|
+
- VSCode使用時は必須設定: `.vscode/settings.json`
|
|
83
|
+
- `.editorconfig` でエディタ横断の整形統一(必須)
|
|
84
|
+
- 新規プロジェクト作成時は必ず設定ファイル(.eslintrc.json, .prettierrc, .editorconfig)を作成すること
|
|
85
|
+
|
|
86
|
+
### 3.2 ESLint設定
|
|
87
|
+
|
|
88
|
+
#### パーサとプラグイン
|
|
89
|
+
- パーサ: `@typescript-eslint/parser`(TypeScript対応)
|
|
90
|
+
- 拡張: `eslint:recommended`, `plugin:@typescript-eslint/recommended`, `prettier`
|
|
91
|
+
- プラグイン: `@typescript-eslint`, `import`, `eslint-plugin-tsdoc`
|
|
92
|
+
|
|
93
|
+
#### 主なルール
|
|
94
|
+
- 未使用変数エラー化、関数戻り値型は警告、TSDoc構文警告など
|
|
95
|
+
- テストコードは一部ルール緩和(`test/**/*`)
|
|
96
|
+
- 除外: `dist/`, `node_modules/`, `*.js`, `*.mjs`
|
|
97
|
+
|
|
98
|
+
#### 必須コマンド(package.json scripts)
|
|
99
|
+
- `npm run lint` で全体Lint(必須設定)
|
|
100
|
+
- `npm run lint:fix` で自動修正(必須設定)
|
|
101
|
+
- VSCode拡張: `dbaeumer.vscode-eslint` で保存時自動整形
|
|
102
|
+
|
|
103
|
+
#### 必須パッケージインストール
|
|
104
|
+
```bash
|
|
105
|
+
npm install --save-dev eslint @typescript-eslint/parser @typescript-eslint/eslint-plugin
|
|
106
|
+
npm install --save-dev prettier eslint-config-prettier eslint-plugin-prettier
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### 3.3 Prettier設定
|
|
110
|
+
|
|
111
|
+
`.prettierrc.yaml` で整形ルールを一元管理:
|
|
112
|
+
|
|
113
|
+
- 最大行長: **100桁**(`printWidth: 100`)
|
|
114
|
+
- シングルクォート: **不使用**(`singleQuote: false`)
|
|
115
|
+
- 末尾カンマ: **ES5互換**(`trailingComma: es5`)
|
|
116
|
+
- セミコロン: **必須**(`semi: true`)
|
|
117
|
+
- アロー関数の括弧: **常に付与**(`arrowParens: always`)
|
|
118
|
+
- マークダウンや文章の折返し: **常に有効**(`proseWrap: always`)
|
|
119
|
+
|
|
120
|
+
### 3.4 EditorConfig設定
|
|
121
|
+
|
|
122
|
+
`.editorconfig` の主なルール:
|
|
123
|
+
|
|
124
|
+
- 文字コード: **UTF-8**
|
|
125
|
+
- インデント: **スペース2**
|
|
126
|
+
- 行末: **LF**
|
|
127
|
+
- ファイル末尾改行: **必須**
|
|
128
|
+
- 末尾空白: **自動削除**
|
|
129
|
+
- 最大行長: **100**(`*.{js,ts,md,yaml}`)
|
|
130
|
+
|
|
131
|
+
### 3.5 VSCode推奨設定
|
|
132
|
+
|
|
133
|
+
`.vscode/settings.json` の主なルール:
|
|
134
|
+
|
|
135
|
+
- 保存時自動整形: 有効(`editor.formatOnSave: true`)
|
|
136
|
+
- タブ幅: **2**
|
|
137
|
+
- ルーラー: **80, 120**
|
|
138
|
+
- 末尾改行・空白削除: 有効
|
|
139
|
+
- 検索除外: `node_modules`, `dist`, `build`
|
|
140
|
+
- ESLint拡張: TypeScriptバリデーション有効
|
|
141
|
+
|
|
142
|
+
---
|
|
143
|
+
|
|
144
|
+
## 4. テスト方針
|
|
145
|
+
|
|
146
|
+
### 4.1 基本方針
|
|
147
|
+
|
|
148
|
+
- **TDD ファースト**: ユースケース単位で `describe → it` を書いてから実装する
|
|
149
|
+
- **Unit Test**: [Vitest](https://vitest.dev/) を利用、**80% 以上**の branch coverage を目標とする
|
|
150
|
+
- テスト用にファイルが必要な場合は、テストケース内で実行時に作るのではなく、予め `test/fixtures/` に作成しておくこと
|
|
151
|
+
- テストは必ず **docker コンテナ上**で実行すること
|
|
152
|
+
|
|
153
|
+
### 4.2 テスト実行環境
|
|
154
|
+
|
|
155
|
+
```sh
|
|
156
|
+
rm -rf node_modules package-lock.json
|
|
157
|
+
docker run --rm -v $(pwd):/app -w /app node:20 npm install
|
|
158
|
+
docker run --rm -v $(pwd):/app -w /app -e NODE_ENV=test node:20 npm run test
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
### 4.3 Vitest設定
|
|
162
|
+
|
|
163
|
+
- 設定: `vitest.config.ts`
|
|
164
|
+
- テストは `test/` 配下に `*.test.ts` で配置
|
|
165
|
+
- テスト用fixtureは `test/fixtures/` にまとめる
|
|
166
|
+
- テスト環境: Node.js(`environment: node`)
|
|
167
|
+
- グローバル: 有効(`globals: true`)
|
|
168
|
+
|
|
169
|
+
### 4.4 推奨コマンド
|
|
170
|
+
|
|
171
|
+
- `npm test` で全テスト実行
|
|
172
|
+
- `npm run test:ui` でUIモード
|
|
173
|
+
- CI/CDで自動実行(`.github/workflows/test.yml`)
|
|
174
|
+
|
|
175
|
+
### 4.5 テストコード制限
|
|
176
|
+
|
|
177
|
+
#### it.each の使用禁止
|
|
178
|
+
|
|
179
|
+
- **`it.each` は使用してはいけない**
|
|
180
|
+
- **理由**: スケルトン構造検証システム(`test/skeleton-structure-validation.test.ts`)が正常に動作しなくなるため
|
|
181
|
+
- `it.each` はテストケースを動的に生成するため、静的解析によるスケルトンファイル(`skel/test/`)との構造比較ができない
|
|
182
|
+
- 代替手段: 複数のテストケースが必要な場合は、個別の `it` ブロックを明示的に記述する
|
|
183
|
+
|
|
184
|
+
```typescript
|
|
185
|
+
// ❌ 禁止: it.each の使用
|
|
186
|
+
it.each([
|
|
187
|
+
{ input: 1, expected: 2 },
|
|
188
|
+
{ input: 2, expected: 4 },
|
|
189
|
+
])('should multiply by 2: $input -> $expected', ({ input, expected }) => {
|
|
190
|
+
expect(multiply(input, 2)).toBe(expected);
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
// ✅ 推奨: 個別の it ブロック
|
|
194
|
+
it('should multiply 1 by 2 to get 2', () => {
|
|
195
|
+
expect(multiply(1, 2)).toBe(2);
|
|
196
|
+
});
|
|
197
|
+
|
|
198
|
+
it('should multiply 2 by 2 to get 4', () => {
|
|
199
|
+
expect(multiply(2, 2)).toBe(4);
|
|
200
|
+
});
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
---
|
|
204
|
+
|
|
205
|
+
## 5. 開発フロー
|
|
206
|
+
|
|
207
|
+
### 5.1 基本ステップ
|
|
208
|
+
|
|
209
|
+
※ 各ステップで開発者に同意を得てから、次のステップに進むこと
|
|
210
|
+
|
|
211
|
+
1. **要件の明確化**
|
|
212
|
+
- 実装する機能を明確に定義する
|
|
213
|
+
- 開発者と合意が取れるまで会話を続ける
|
|
214
|
+
|
|
215
|
+
2. **修正対象の特定**
|
|
216
|
+
- どの部分を修正するかを特定する
|
|
217
|
+
- どの順番で修正していくかを決める
|
|
218
|
+
|
|
219
|
+
3. **テストを書く(TDD)**
|
|
220
|
+
- 修正対象の特定ができたら、テストを書く
|
|
221
|
+
- テストは、修正対象の特定ができた段階で書く
|
|
222
|
+
|
|
223
|
+
4. **修正の実行**
|
|
224
|
+
|
|
225
|
+
5. **テストの実行**(必ず全てのテストを実行)
|
|
226
|
+
|
|
227
|
+
6. **リファクタリングの実施**
|
|
228
|
+
|
|
229
|
+
7. **テストの再実行**(必ず全てのテストを実行)
|
|
230
|
+
|
|
231
|
+
8. **ドキュメントの更新**
|
|
232
|
+
|
|
233
|
+
9. **全体を振り返って、フローに改善の余地があれば `.github/copilot-instructions.md` を更新する**
|
|
234
|
+
|
|
235
|
+
### 5.2 計画管理
|
|
236
|
+
|
|
237
|
+
#### change_plans/ 運用ルール
|
|
238
|
+
|
|
239
|
+
- 機能追加のために不明な点があれば、追加で確認する
|
|
240
|
+
- 開発内容を決めるにあたっては、`change_plans/` ディレクトリにファイルを作成し、修正計画を記載していく
|
|
241
|
+
- ファイル名規則は、`YYYYMMDD_[タイトル].md`
|
|
242
|
+
- 修正計画は、開発の進捗に応じて更新していく
|
|
243
|
+
- 対応が完了した計画ファイルは削除する。Git の履歴で追跡できるため、`done_plans/` への移動は行わずリポジトリを軽量に保つ。
|
|
244
|
+
|
|
245
|
+
#### todo_plans/ 運用ルール
|
|
246
|
+
|
|
247
|
+
- やり残した作業や、将来的に実装が必要な機能がある場合は、`todo_plans/` ディレクトリにMarkdownファイルとして記録する
|
|
248
|
+
- ファイル名は `YYYYMMDD_[タイトル].md` の形式で作成する(例: `20250616_ユーザー認証機能の実装.md`)
|
|
249
|
+
- `todo_plans/` に記録されたタスクに着手する際には、そのファイルを `change_plans/` ディレクトリに移動する
|
|
250
|
+
- 対応が完了したタスクのファイルは削除する。履歴は Git で確認できるため、完了済みの計画を保持する必要はない。
|
|
251
|
+
|
|
252
|
+
### 5.3 スケルトン(skel/ ディレクトリ)運用ルール
|
|
253
|
+
|
|
254
|
+
- `skel/` ディレクトリは、実装ファイルやテストファイルの「構造設計図」を管理するための専用ディレクトリ
|
|
255
|
+
- スケルトンファイルは、**本体のクラス・関数・メソッド・プロパティ構造と厳密に一致**させる
|
|
256
|
+
- メソッド名・引数・戻り値・順序・static/instance区別・プロパティ名なども完全一致が必須
|
|
257
|
+
- 余計な定義や重複定義が混入しないよう注意する
|
|
258
|
+
- スケルトンは「実装詳細を含まず、構造のみ」を記述する
|
|
259
|
+
- コードやテストの追加・修正時は、**必ず skel/ 側も同時に更新**する
|
|
260
|
+
- skel/ 側の構造は `test/skeleton-structure-validation.test.ts` で自動検証される
|
|
261
|
+
- 差分が検出された場合は、skel/ 側を本体に合わせて速やかに修正する
|
|
262
|
+
|
|
263
|
+
#### スケルトンの目的
|
|
264
|
+
- 実装とテストの構造同期・設計意図の明示・自動検証による品質担保
|
|
265
|
+
|
|
266
|
+
#### 運用上の注意
|
|
267
|
+
- skel/ 側の構造不一致はCIで検出される。必ず全テスト合格状態を維持する
|
|
268
|
+
- スケルトンの自動生成・修正時は、不要な重複やゴミ定義が混入しないように注意する
|
|
269
|
+
- ロジックの修正を行う前に、skel/ ディレクトリにあるスケルトンファイルを更新する
|
|
270
|
+
- `test/skeleton-structure-validation.test.ts` だけを実行して、構造が一致していることを確認する
|
|
271
|
+
- テストの実行とコードの修正は同時に行わない
|
|
272
|
+
- テスト失敗した場合は、修正方針について指示を仰ぐこと
|
|
273
|
+
|
|
274
|
+
---
|
|
275
|
+
|
|
276
|
+
## 6. 推奨運用フロー
|
|
277
|
+
|
|
278
|
+
- 仕様・設計・構造は `skel/` で管理し、実装と同期
|
|
279
|
+
- 変更計画・TODOは `change_plans/`, `todo_plans/` で管理
|
|
280
|
+
- コード・テスト・ドキュメント・CI/CD・整形ルールを全てリポジトリに含める
|
|
281
|
+
|
|
282
|
+
## エラー処理とロギング
|
|
283
|
+
|
|
284
|
+
- エラーハンドリングは `try/catch` または `Error Boundary` で捕捉し、必ず `logger.error`
|
|
285
|
+
でスタックトレースを出力する。
|
|
286
|
+
|
|
287
|
+
## テスト方針
|
|
288
|
+
|
|
289
|
+
- **TDD ファースト**: ユースケース単位で `describe → it` を書いてから実装する。
|
|
290
|
+
- **Unit Test**: vitest、80% 以上の branch coverage を目標とする。
|
|
291
|
+
- テスト用にファイルが必要な場合は、テストケース内で実行時に作るのではなく、予め `test/fixtures/`
|
|
292
|
+
に作成しておくこと。
|
|
293
|
+
- テストは必ず docker コンテナ上で実行すること。
|
|
294
|
+
|
|
295
|
+
```sh
|
|
296
|
+
rm -rf node_modules package-lock.json
|
|
297
|
+
docker run --rm -v $(pwd):/app -w /app node:20 npm install
|
|
298
|
+
docker run --rm -v $(pwd):/app -w /app -e NODE_ENV=test node:20 npm run test
|
|
299
|
+
```
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: coding-rules
|
|
3
|
+
category: api-usage
|
|
4
|
+
focus: openai
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# OpenAI API Usage Guidelines
|
|
8
|
+
|
|
9
|
+
## Model Selection for Sample Code
|
|
10
|
+
|
|
11
|
+
When writing sample code or examples that access OpenAI models (such as in the `example/` directory or any demonstration code), **always use `gpt-4.1-mini`** as the default model.
|
|
12
|
+
|
|
13
|
+
### Rationale
|
|
14
|
+
|
|
15
|
+
- `gpt-4.1-mini` provides an optimal balance of performance and cost for sample/demonstration purposes
|
|
16
|
+
- Consistent model usage across examples ensures predictable behavior and costs
|
|
17
|
+
- This model is suitable for most demonstration scenarios while being more cost-effective than larger models
|
|
18
|
+
|
|
19
|
+
### Exceptions
|
|
20
|
+
|
|
21
|
+
The only cases where you should deviate from `gpt-4.1-mini` in sample code:
|
|
22
|
+
|
|
23
|
+
1. **Specific feature demonstrations**: When the example specifically demonstrates features only available in other models
|
|
24
|
+
2. **Performance comparisons**: When comparing different models' capabilities
|
|
25
|
+
3. **Cost optimization examples**: When demonstrating cost-aware model selection
|
|
26
|
+
|
|
27
|
+
In these cases, clearly document why a different model is being used.
|
|
28
|
+
|
|
29
|
+
### Environment Configuration
|
|
30
|
+
|
|
31
|
+
Sample code should allow users to override the model while maintaining `gpt-4.1-mini` as the sensible default through environment variables.
|
|
32
|
+
|
|
33
|
+
## Error Handling
|
|
34
|
+
|
|
35
|
+
Sample code should include appropriate error handling for OpenAI API calls.
|
|
36
|
+
|
|
37
|
+
## API Key Management
|
|
38
|
+
|
|
39
|
+
Always use environment variables for API keys in sample code. Never hardcode API keys in examples.
|