@einja/dev-cli 0.1.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/README.md +179 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +49 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +243 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/list.d.ts +2 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +23 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/sync.d.ts +7 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +294 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/commands/sync.test.d.ts +2 -0
- package/dist/commands/sync.test.d.ts.map +1 -0
- package/dist/commands/sync.test.js +593 -0
- package/dist/commands/sync.test.js.map +1 -0
- package/dist/commands/task-loop.d.ts +11 -0
- package/dist/commands/task-loop.d.ts.map +1 -0
- package/dist/commands/task-loop.js +81 -0
- package/dist/commands/task-loop.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/file-system.d.ts +39 -0
- package/dist/lib/file-system.d.ts.map +1 -0
- package/dist/lib/file-system.js +79 -0
- package/dist/lib/file-system.js.map +1 -0
- package/dist/lib/mcp-config.d.ts +43 -0
- package/dist/lib/mcp-config.d.ts.map +1 -0
- package/dist/lib/mcp-config.js +109 -0
- package/dist/lib/mcp-config.js.map +1 -0
- package/dist/lib/mcp-config.test.d.ts +2 -0
- package/dist/lib/mcp-config.test.d.ts.map +1 -0
- package/dist/lib/mcp-config.test.js +285 -0
- package/dist/lib/mcp-config.test.js.map +1 -0
- package/dist/lib/merger.d.ts +41 -0
- package/dist/lib/merger.d.ts.map +1 -0
- package/dist/lib/merger.js +164 -0
- package/dist/lib/merger.js.map +1 -0
- package/dist/lib/preset-update/cli-repo-detector.d.ts +35 -0
- package/dist/lib/preset-update/cli-repo-detector.d.ts.map +1 -0
- package/dist/lib/preset-update/cli-repo-detector.js +83 -0
- package/dist/lib/preset-update/cli-repo-detector.js.map +1 -0
- package/dist/lib/preset-update/cli-repo-detector.test.d.ts +2 -0
- package/dist/lib/preset-update/cli-repo-detector.test.d.ts.map +1 -0
- package/dist/lib/preset-update/cli-repo-detector.test.js +120 -0
- package/dist/lib/preset-update/cli-repo-detector.test.js.map +1 -0
- package/dist/lib/preset-update/file-copier.d.ts +59 -0
- package/dist/lib/preset-update/file-copier.d.ts.map +1 -0
- package/dist/lib/preset-update/file-copier.js +220 -0
- package/dist/lib/preset-update/file-copier.js.map +1 -0
- package/dist/lib/preset-update/file-copier.test.d.ts +2 -0
- package/dist/lib/preset-update/file-copier.test.d.ts.map +1 -0
- package/dist/lib/preset-update/file-copier.test.js +297 -0
- package/dist/lib/preset-update/file-copier.test.js.map +1 -0
- package/dist/lib/preset-update/preset-finder.d.ts +39 -0
- package/dist/lib/preset-update/preset-finder.d.ts.map +1 -0
- package/dist/lib/preset-update/preset-finder.js +92 -0
- package/dist/lib/preset-update/preset-finder.js.map +1 -0
- package/dist/lib/preset-update/preset-finder.test.d.ts +2 -0
- package/dist/lib/preset-update/preset-finder.test.d.ts.map +1 -0
- package/dist/lib/preset-update/preset-finder.test.js +128 -0
- package/dist/lib/preset-update/preset-finder.test.js.map +1 -0
- package/dist/lib/preset.d.ts +14 -0
- package/dist/lib/preset.d.ts.map +1 -0
- package/dist/lib/preset.js +52 -0
- package/dist/lib/preset.js.map +1 -0
- package/dist/lib/sync/backup-manager.d.ts +50 -0
- package/dist/lib/sync/backup-manager.d.ts.map +1 -0
- package/dist/lib/sync/backup-manager.js +117 -0
- package/dist/lib/sync/backup-manager.js.map +1 -0
- package/dist/lib/sync/backup-manager.test.d.ts +2 -0
- package/dist/lib/sync/backup-manager.test.d.ts.map +1 -0
- package/dist/lib/sync/backup-manager.test.js +155 -0
- package/dist/lib/sync/backup-manager.test.js.map +1 -0
- package/dist/lib/sync/batch-processor.d.ts +27 -0
- package/dist/lib/sync/batch-processor.d.ts.map +1 -0
- package/dist/lib/sync/batch-processor.js +46 -0
- package/dist/lib/sync/batch-processor.js.map +1 -0
- package/dist/lib/sync/batch-processor.test.d.ts +2 -0
- package/dist/lib/sync/batch-processor.test.d.ts.map +1 -0
- package/dist/lib/sync/batch-processor.test.js +110 -0
- package/dist/lib/sync/batch-processor.test.js.map +1 -0
- package/dist/lib/sync/category-validator.d.ts +36 -0
- package/dist/lib/sync/category-validator.d.ts.map +1 -0
- package/dist/lib/sync/category-validator.js +46 -0
- package/dist/lib/sync/category-validator.js.map +1 -0
- package/dist/lib/sync/category-validator.test.d.ts +2 -0
- package/dist/lib/sync/category-validator.test.d.ts.map +1 -0
- package/dist/lib/sync/category-validator.test.js +89 -0
- package/dist/lib/sync/category-validator.test.js.map +1 -0
- package/dist/lib/sync/conflict-reporter.d.ts +57 -0
- package/dist/lib/sync/conflict-reporter.d.ts.map +1 -0
- package/dist/lib/sync/conflict-reporter.js +81 -0
- package/dist/lib/sync/conflict-reporter.js.map +1 -0
- package/dist/lib/sync/conflict-reporter.test.d.ts +2 -0
- package/dist/lib/sync/conflict-reporter.test.d.ts.map +1 -0
- package/dist/lib/sync/conflict-reporter.test.js +132 -0
- package/dist/lib/sync/conflict-reporter.test.js.map +1 -0
- package/dist/lib/sync/diff-engine.d.ts +28 -0
- package/dist/lib/sync/diff-engine.d.ts.map +1 -0
- package/dist/lib/sync/diff-engine.js +118 -0
- package/dist/lib/sync/diff-engine.js.map +1 -0
- package/dist/lib/sync/diff-engine.test.d.ts +2 -0
- package/dist/lib/sync/diff-engine.test.d.ts.map +1 -0
- package/dist/lib/sync/diff-engine.test.js +133 -0
- package/dist/lib/sync/diff-engine.test.js.map +1 -0
- package/dist/lib/sync/file-filter.d.ts +40 -0
- package/dist/lib/sync/file-filter.d.ts.map +1 -0
- package/dist/lib/sync/file-filter.js +171 -0
- package/dist/lib/sync/file-filter.js.map +1 -0
- package/dist/lib/sync/file-filter.test.d.ts +2 -0
- package/dist/lib/sync/file-filter.test.d.ts.map +1 -0
- package/dist/lib/sync/file-filter.test.js +179 -0
- package/dist/lib/sync/file-filter.test.js.map +1 -0
- package/dist/lib/sync/hash-cache.d.ts +34 -0
- package/dist/lib/sync/hash-cache.d.ts.map +1 -0
- package/dist/lib/sync/hash-cache.js +51 -0
- package/dist/lib/sync/hash-cache.js.map +1 -0
- package/dist/lib/sync/hash-cache.test.d.ts +2 -0
- package/dist/lib/sync/hash-cache.test.d.ts.map +1 -0
- package/dist/lib/sync/hash-cache.test.js +110 -0
- package/dist/lib/sync/hash-cache.test.js.map +1 -0
- package/dist/lib/sync/integration.test.d.ts +2 -0
- package/dist/lib/sync/integration.test.d.ts.map +1 -0
- package/dist/lib/sync/integration.test.js +317 -0
- package/dist/lib/sync/integration.test.js.map +1 -0
- package/dist/lib/sync/marker-processor.d.ts +54 -0
- package/dist/lib/sync/marker-processor.d.ts.map +1 -0
- package/dist/lib/sync/marker-processor.js +208 -0
- package/dist/lib/sync/marker-processor.js.map +1 -0
- package/dist/lib/sync/marker-processor.test.d.ts +2 -0
- package/dist/lib/sync/marker-processor.test.d.ts.map +1 -0
- package/dist/lib/sync/marker-processor.test.js +245 -0
- package/dist/lib/sync/marker-processor.test.js.map +1 -0
- package/dist/lib/sync/metadata-manager.d.ts +46 -0
- package/dist/lib/sync/metadata-manager.d.ts.map +1 -0
- package/dist/lib/sync/metadata-manager.js +129 -0
- package/dist/lib/sync/metadata-manager.js.map +1 -0
- package/dist/lib/sync/metadata-manager.test.d.ts +2 -0
- package/dist/lib/sync/metadata-manager.test.d.ts.map +1 -0
- package/dist/lib/sync/metadata-manager.test.js +137 -0
- package/dist/lib/sync/metadata-manager.test.js.map +1 -0
- package/dist/lib/sync/performance.test.d.ts +2 -0
- package/dist/lib/sync/performance.test.d.ts.map +1 -0
- package/dist/lib/sync/performance.test.js +126 -0
- package/dist/lib/sync/performance.test.js.map +1 -0
- package/dist/types/index.d.ts +59 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/preset-update.d.ts +106 -0
- package/dist/types/preset-update.d.ts.map +1 -0
- package/dist/types/preset-update.js +5 -0
- package/dist/types/preset-update.js.map +1 -0
- package/dist/types/sync.d.ts +169 -0
- package/dist/types/sync.d.ts.map +1 -0
- package/dist/types/sync.js +19 -0
- package/dist/types/sync.js.map +1 -0
- package/package.json +72 -0
- package/presets/minimal/.claude/agents/einja/docs/docs-updater.md +161 -0
- package/presets/minimal/.claude/agents/einja/frontend/design-engineer.md +685 -0
- package/presets/minimal/.claude/agents/einja/frontend/frontend-architect.md +747 -0
- package/presets/minimal/.claude/agents/einja/frontend/frontend-coder.md +441 -0
- package/presets/minimal/.claude/agents/einja/git/conflict-resolver.md +148 -0
- package/presets/minimal/.claude/agents/einja/specs/spec-design-generator.md +462 -0
- package/presets/minimal/.claude/agents/einja/specs/spec-qa-generator.md +466 -0
- package/presets/minimal/.claude/agents/einja/specs/spec-requirements-generator.md +416 -0
- package/presets/minimal/.claude/agents/einja/specs/spec-tasks-generator.md +608 -0
- package/presets/minimal/.claude/agents/einja/task/task-committer.md +82 -0
- package/presets/minimal/.claude/agents/einja/task/task-executer.md +352 -0
- package/presets/minimal/.claude/agents/einja/task/task-modification-analyzer.md +369 -0
- package/presets/minimal/.claude/agents/einja/task/task-qa.md +74 -0
- package/presets/minimal/.claude/agents/einja/task/task-reviewer.md +169 -0
- package/presets/minimal/.claude/commands/einja/frontend-implement.md +322 -0
- package/presets/minimal/.claude/commands/einja/spec-create.md +254 -0
- package/presets/minimal/.claude/commands/einja/start-dev.md +98 -0
- package/presets/minimal/.claude/commands/einja/sync-cursor-commands.md +203 -0
- package/presets/minimal/.claude/commands/einja/task-exec.md +390 -0
- package/presets/minimal/.claude/commands/einja/update-docs-by-task-specs.md +448 -0
- package/presets/minimal/.claude/hooks/einja/biome-format.sh +49 -0
- package/presets/minimal/.claude/hooks/einja/design-doc-check.sh +61 -0
- package/presets/minimal/.claude/hooks/einja/detect-secrets.sh +62 -0
- package/presets/minimal/.claude/hooks/einja/large-file-warning.sh +42 -0
- package/presets/minimal/.claude/hooks/einja/playwright-resize.sh +36 -0
- package/presets/minimal/.claude/hooks/einja/typecheck.sh +37 -0
- package/presets/minimal/.claude/hooks/einja/unset-volta-recursion.sh +32 -0
- package/presets/minimal/.claude/hooks/einja/validate-git-commit.sh +239 -0
- package/presets/minimal/.claude/hooks/einja/warn-index-ts.sh +34 -0
- package/presets/minimal/.claude/hooks/einja/warn-relative-import.sh +48 -0
- package/presets/minimal/.claude/settings.json +174 -0
- package/presets/minimal/.claude/skills/einja/api-development/SKILL.md +14 -0
- package/presets/minimal/.claude/skills/einja/backend-architecture/SKILL.md +14 -0
- package/presets/minimal/.claude/skills/einja/coding-standards/SKILL.md +120 -0
- package/presets/minimal/.claude/skills/einja/coding-standards/reference/naming-conventions.md +107 -0
- package/presets/minimal/.claude/skills/einja/coding-standards/reference/prohibited-patterns.md +169 -0
- package/presets/minimal/.claude/skills/einja/coding-standards/reference/typescript-rules.md +247 -0
- package/presets/minimal/.claude/skills/einja/component-design/SKILL.md +109 -0
- package/presets/minimal/.claude/skills/einja/component-design/reference/directory-structure.md +117 -0
- package/presets/minimal/.claude/skills/einja/component-design/reference/props-patterns.md +159 -0
- package/presets/minimal/.claude/skills/einja/component-design/reference/styling-guide.md +200 -0
- package/presets/minimal/.claude/skills/einja/conflict-resolver/SKILL.md +190 -0
- package/presets/minimal/.claude/skills/einja/frontend-development/SKILL.md +14 -0
- package/presets/minimal/.claude/skills/einja/general-context-loader/SKILL.md +254 -0
- package/presets/minimal/.claude/skills/einja/output-format/SKILL.md +137 -0
- package/presets/minimal/.claude/skills/einja/spec-context-loader/SKILL.md +177 -0
- package/presets/minimal/.claude/skills/einja/task-commit/SKILL.md +269 -0
- package/presets/minimal/.claude/skills/einja/task-qa/SKILL.md +306 -0
- package/presets/minimal/.claude/skills/einja/task-qa/reference/failure-patterns.md +69 -0
- package/presets/minimal/.claude/skills/einja/task-qa/reference/troubleshooting.md +65 -0
- package/presets/minimal/.claude/skills/einja/task-qa/reference/usage-patterns.md +52 -0
- package/presets/minimal/.claude/skills/einja/task-qa/templates/qa-test-template.md +128 -0
- package/presets/minimal/preset.yaml +111 -0
- package/presets/minimal/symlinks.json +45 -0
- package/scaffolds/.mcp.json +45 -0
- package/scaffolds/CLAUDE.md.template +318 -0
- package/scaffolds/steering/README.md +170 -0
- package/scaffolds/steering/acceptance-criteria-and-qa-guide.md +415 -0
- package/scaffolds/steering/architecture.md +481 -0
- package/scaffolds/steering/branch-strategy.md +362 -0
- package/scaffolds/steering/commit-rules.md +217 -0
- package/scaffolds/steering/db-schema-design.md +609 -0
- package/scaffolds/steering/development/api-development.md +783 -0
- package/scaffolds/steering/development/backend-architecture.md +731 -0
- package/scaffolds/steering/development/frontend-development.md +1537 -0
- package/scaffolds/steering/development/review-guidelines.md +365 -0
- package/scaffolds/steering/development/testing-strategy.md +819 -0
- package/scaffolds/steering/development-workflow.md +429 -0
- package/scaffolds/steering/infrastructure/deployment.md +277 -0
- package/scaffolds/steering/infrastructure/environment-variables.md +298 -0
- package/scaffolds/steering/product.md +540 -0
- package/scaffolds/steering/task-management.md +367 -0
- package/templates/README.md +159 -0
- package/templates/design-simple.md.template +172 -0
- package/templates/design.md.template +327 -0
- package/templates/qa-test.md.template +125 -0
- package/templates/requirements.md.template +254 -0
|
@@ -0,0 +1,448 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "タスク仕様書をfeature仕様書とsteering仕様書に反映。ARGUMENTS: タスク仕様書ディレクトリパス(複数可、カンマ区切り)"
|
|
3
|
+
allowed-tools: Read, Write, Edit, Bash, Grep, Glob
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# タスク仕様書からドキュメント反映コマンド
|
|
7
|
+
|
|
8
|
+
## あなたの役割
|
|
9
|
+
|
|
10
|
+
タスク仕様書(`docs/specs/tasks/` 配下)から設計情報を抽出し、以下の2つの階層に反映する専門エージェントです:
|
|
11
|
+
|
|
12
|
+
1. **Feature仕様書**(`docs/specs/features/<feature-name>/`)- 機能レベルの設計
|
|
13
|
+
2. **Steering仕様書**(`docs/einja/steering/`)- プロジェクト全体の設計
|
|
14
|
+
|
|
15
|
+
タスク仕様書の内容を構造化して抽出し、適切な階層のドキュメントにインテリジェントにマージします。
|
|
16
|
+
|
|
17
|
+
## 実行フロー
|
|
18
|
+
|
|
19
|
+
### 1. タスク仕様書の検証と読み込み
|
|
20
|
+
|
|
21
|
+
**入力形式**:
|
|
22
|
+
```
|
|
23
|
+
/update-docs-by-task-specs <task-spec-dir-path> [<task-spec-dir-path2> ...]
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
**処理**:
|
|
27
|
+
- 指定されたディレクトリパスを解析(カンマ区切り対応)
|
|
28
|
+
- 各ディレクトリに以下のファイルが存在するか確認:
|
|
29
|
+
- `requirements.md`(必須)
|
|
30
|
+
- `design.md`(必須)
|
|
31
|
+
- `tasks.md`(オプション)
|
|
32
|
+
- ファイルが存在しない場合はエラーを表示して終了
|
|
33
|
+
- 各ファイルを読み込み、構造化された情報を抽出
|
|
34
|
+
|
|
35
|
+
### 2. 機能(Feature)の判定【対話的】
|
|
36
|
+
|
|
37
|
+
各タスクspecについて、どの機能(Feature)に関連するかを判定します。
|
|
38
|
+
|
|
39
|
+
**判定手順**:
|
|
40
|
+
1. タスクディレクトリ名とrequirements.mdの内容を分析
|
|
41
|
+
2. 既存の`docs/specs/features/`ディレクトリをスキャン
|
|
42
|
+
3. 以下の候補をユーザーに提示:
|
|
43
|
+
- 既存の機能(例: `login`, `signup`など)
|
|
44
|
+
- 新規機能作成(機能名を入力)
|
|
45
|
+
- Steeringのみ反映(機能specには反映しない)
|
|
46
|
+
|
|
47
|
+
**AskUserQuestionを使用**:
|
|
48
|
+
```
|
|
49
|
+
質問: "タスク『{タスク名}』はどの機能に関連しますか?"
|
|
50
|
+
選択肢:
|
|
51
|
+
- login(既存)
|
|
52
|
+
- signup(既存)
|
|
53
|
+
- 新規機能を作成
|
|
54
|
+
- Steeringのみ反映
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### 3. Feature仕様書への反映【Task → Feature】
|
|
58
|
+
|
|
59
|
+
機能が指定された場合、`docs/specs/features/<feature-name>/`に反映します。
|
|
60
|
+
|
|
61
|
+
#### 3.1 機能ディレクトリの作成確認
|
|
62
|
+
|
|
63
|
+
**機能specディレクトリが存在しない場合**:
|
|
64
|
+
- ユーザーに確認:「機能spec『{feature-name}』を新規作成しますか?」
|
|
65
|
+
- 承認されたら以下を作成:
|
|
66
|
+
```
|
|
67
|
+
docs/specs/features/<feature-name>/
|
|
68
|
+
├── requirements.md
|
|
69
|
+
├── design.md
|
|
70
|
+
└── tasks.md
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
#### 3.2 requirements.md への反映
|
|
74
|
+
|
|
75
|
+
**対象**: `docs/specs/features/<feature-name>/requirements.md`
|
|
76
|
+
|
|
77
|
+
**タスクspecから抽出する情報**(`requirements.md`から):
|
|
78
|
+
- **ビジネス価値**(ビジネス価値セクション)
|
|
79
|
+
- **ユーザーストーリー**(ユーザーストーリーセクション)
|
|
80
|
+
- **受け入れ基準**(各ストーリーの受け入れ基準)
|
|
81
|
+
- **成功指標**(成功指標セクション)
|
|
82
|
+
- **非機能要件**(非機能要件セクション)
|
|
83
|
+
|
|
84
|
+
**反映形式**:
|
|
85
|
+
```markdown
|
|
86
|
+
## タスク: {タスク名} ({日付})
|
|
87
|
+
|
|
88
|
+
**反映日時**: {現在日時}
|
|
89
|
+
**ソース**: {タスクspecパス}
|
|
90
|
+
|
|
91
|
+
### ビジネス価値
|
|
92
|
+
{抽出した内容}
|
|
93
|
+
|
|
94
|
+
### ユーザーストーリー
|
|
95
|
+
{抽出した内容}
|
|
96
|
+
|
|
97
|
+
### 受け入れ基準
|
|
98
|
+
{抽出した内容}
|
|
99
|
+
|
|
100
|
+
---
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
**マージロジック**:
|
|
104
|
+
- 既存内容の最後に追記(セクションが存在する場合)
|
|
105
|
+
- セクションが存在しない場合は新規作成
|
|
106
|
+
- 同じタスクからの重複反映を防止(タスク名+日付でチェック)
|
|
107
|
+
|
|
108
|
+
#### 3.3 design.md への反映
|
|
109
|
+
|
|
110
|
+
**対象**: `docs/specs/features/<feature-name>/design.md`
|
|
111
|
+
|
|
112
|
+
**タスクspecから抽出する情報**(`design.md`から):
|
|
113
|
+
- **API仕様**(APIエンドポイントセクション)
|
|
114
|
+
- **コンポーネント設計**(コンポーネントとインターフェースセクション)
|
|
115
|
+
- **シーケンス図**(シーケンス図セクション)
|
|
116
|
+
- **テスト設計**(テスト設計セクション)
|
|
117
|
+
- **実装上の注意点**(実装上の注意点セクション)
|
|
118
|
+
|
|
119
|
+
**反映形式**:
|
|
120
|
+
```markdown
|
|
121
|
+
## タスク: {タスク名} ({日付})
|
|
122
|
+
|
|
123
|
+
**反映日時**: {現在日時}
|
|
124
|
+
**ソース**: {タスクspecパス}
|
|
125
|
+
|
|
126
|
+
### API仕様
|
|
127
|
+
{抽出した内容}
|
|
128
|
+
|
|
129
|
+
### コンポーネント設計
|
|
130
|
+
{抽出した内容}
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
#### 3.4 tasks.md への反映
|
|
136
|
+
|
|
137
|
+
**対象**: `docs/specs/features/<feature-name>/tasks.md`
|
|
138
|
+
|
|
139
|
+
**タスクspecから抽出する情報**(`tasks.md`から):
|
|
140
|
+
- タスク一覧(Phase別)
|
|
141
|
+
- 依存関係情報
|
|
142
|
+
- 完了基準
|
|
143
|
+
|
|
144
|
+
**反映形式**:
|
|
145
|
+
```markdown
|
|
146
|
+
## タスク: {タスク名} ({日付})
|
|
147
|
+
|
|
148
|
+
**反映日時**: {現在日時}
|
|
149
|
+
**ソース**: {タスクspecパス}
|
|
150
|
+
|
|
151
|
+
### 実装タスク
|
|
152
|
+
{抽出したタスクリスト}
|
|
153
|
+
|
|
154
|
+
---
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
### 4. Steering仕様書への反映【Task → Steering】
|
|
158
|
+
|
|
159
|
+
すべてのタスクspecは、Steering仕様書にも反映されます。
|
|
160
|
+
|
|
161
|
+
#### 4.1 architecture.md への反映
|
|
162
|
+
|
|
163
|
+
**対象**: `docs/einja/steering/architecture.md`
|
|
164
|
+
|
|
165
|
+
**タスクspecから抽出する情報**(`design.md`から):
|
|
166
|
+
- **システム構成図**(Mermaid図を含む)
|
|
167
|
+
- **データフロー図**
|
|
168
|
+
- **技術スタック表**
|
|
169
|
+
- **パッケージ構造と依存関係**
|
|
170
|
+
- **デプロイメント戦略**
|
|
171
|
+
- **アーキテクチャパターン**(Clean Architecture、Repository Patternなど)
|
|
172
|
+
- **開発ワークフロー**
|
|
173
|
+
|
|
174
|
+
**反映形式**:
|
|
175
|
+
```markdown
|
|
176
|
+
## {タスク名} ({日付})
|
|
177
|
+
|
|
178
|
+
**反映日時**: {現在日時}
|
|
179
|
+
**ソース**: {タスクspecパス}
|
|
180
|
+
|
|
181
|
+
### システム構成
|
|
182
|
+
{抽出した構成図とMermaid}
|
|
183
|
+
|
|
184
|
+
### 技術スタック
|
|
185
|
+
{抽出した技術スタック表}
|
|
186
|
+
|
|
187
|
+
### アーキテクチャパターン
|
|
188
|
+
{抽出したパターン説明}
|
|
189
|
+
|
|
190
|
+
---
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
**マージロジック**:
|
|
194
|
+
- ファイルが空またはTODOのみの場合、目次構造を作成してから追記
|
|
195
|
+
- 既存の同名セクションがある場合、タスクごとのサブセクションとして追記
|
|
196
|
+
- Mermaid図は`<!-- Task: {タスク名} -->`コメントでラベル付け
|
|
197
|
+
|
|
198
|
+
#### 4.2 db-design.md への反映
|
|
199
|
+
|
|
200
|
+
**対象**: `docs/einja/steering/db-design.md`
|
|
201
|
+
|
|
202
|
+
**タスクspecから抽出する情報**(`design.md`から):
|
|
203
|
+
- **ERD図**(Entity-Relationship Diagram)
|
|
204
|
+
- **Prismaスキーマ定義**
|
|
205
|
+
- **リポジトリパターン実装**
|
|
206
|
+
- **データアクセス層設計**
|
|
207
|
+
- **インデックス戦略**
|
|
208
|
+
- **マイグレーション戦略**
|
|
209
|
+
|
|
210
|
+
**反映形式**:
|
|
211
|
+
```markdown
|
|
212
|
+
## {タスク名} ({日付})
|
|
213
|
+
|
|
214
|
+
**反映日時**: {現在日時}
|
|
215
|
+
**ソース**: {タスクspecパス}
|
|
216
|
+
|
|
217
|
+
### データベーススキーマ
|
|
218
|
+
{抽出したスキーマ定義}
|
|
219
|
+
|
|
220
|
+
### ERD
|
|
221
|
+
{抽出したERD図}
|
|
222
|
+
|
|
223
|
+
### リポジトリパターン
|
|
224
|
+
{抽出したリポジトリ設計}
|
|
225
|
+
|
|
226
|
+
---
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
#### 4.3 product.md への反映
|
|
230
|
+
|
|
231
|
+
**対象**: `docs/einja/steering/product.md`
|
|
232
|
+
|
|
233
|
+
**タスクspecから抽出する情報**:
|
|
234
|
+
- **ビジネス価値と目標**(`requirements.md`から)
|
|
235
|
+
- **ユーザーストーリー概要**(`requirements.md`から)
|
|
236
|
+
- **主要API仕様**(`design.md`から)
|
|
237
|
+
- **成功指標とKPI**(`requirements.md`から)
|
|
238
|
+
- **タイムラインとフェーズ**(`requirements.md`から)
|
|
239
|
+
|
|
240
|
+
**反映形式**:
|
|
241
|
+
```markdown
|
|
242
|
+
## {タスク名} ({日付})
|
|
243
|
+
|
|
244
|
+
**反映日時**: {現在日時}
|
|
245
|
+
**ソース**: {タスクspecパス}
|
|
246
|
+
|
|
247
|
+
### ビジネス価値
|
|
248
|
+
{抽出した内容}
|
|
249
|
+
|
|
250
|
+
### 主要機能
|
|
251
|
+
{抽出したユーザーストーリー概要}
|
|
252
|
+
|
|
253
|
+
### 成功指標
|
|
254
|
+
{抽出したKPI}
|
|
255
|
+
|
|
256
|
+
---
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
### 5. インテリジェントマージの詳細ロジック
|
|
260
|
+
|
|
261
|
+
#### 5.1 重複チェック
|
|
262
|
+
|
|
263
|
+
各ファイルの先頭または各セクションで、以下のパターンを検索:
|
|
264
|
+
```markdown
|
|
265
|
+
## タスク: {タスク名} ({日付})
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
- 同じタスク名+日付が見つかった場合、重複として扱う
|
|
269
|
+
- ユーザーに確認:「タスク『{タスク名}』は既に反映済みです。上書きしますか?」
|
|
270
|
+
- 上書き: 既存セクションを削除して新規追加
|
|
271
|
+
- スキップ: 反映をスキップ
|
|
272
|
+
- 差分マージ: 変更部分のみ更新(推奨)
|
|
273
|
+
|
|
274
|
+
#### 5.2 セクション構造の維持
|
|
275
|
+
|
|
276
|
+
**空ファイルまたはTODOのみの場合**:
|
|
277
|
+
1. 標準的な目次構造を作成
|
|
278
|
+
2. 各セクションにタスクの内容を追記
|
|
279
|
+
|
|
280
|
+
**既存内容がある場合**:
|
|
281
|
+
1. 既存のセクション構造を解析
|
|
282
|
+
2. 対応するセクションを見つけて追記
|
|
283
|
+
3. セクションが存在しない場合、適切な位置に新規作成
|
|
284
|
+
|
|
285
|
+
**目次構造例(architecture.md)**:
|
|
286
|
+
```markdown
|
|
287
|
+
# システムアーキテクチャ
|
|
288
|
+
|
|
289
|
+
## 概要
|
|
290
|
+
|
|
291
|
+
## システム構成
|
|
292
|
+
|
|
293
|
+
### タスク: Monorepo Setup (20251104)
|
|
294
|
+
...
|
|
295
|
+
|
|
296
|
+
## 技術スタック
|
|
297
|
+
|
|
298
|
+
### タスク: Monorepo Setup (20251104)
|
|
299
|
+
...
|
|
300
|
+
|
|
301
|
+
## デプロイメント戦略
|
|
302
|
+
|
|
303
|
+
### タスク: Monorepo Setup (20251104)
|
|
304
|
+
...
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
#### 5.3 Mermaid図の扱い
|
|
308
|
+
|
|
309
|
+
**図の識別**:
|
|
310
|
+
- 各Mermaid図の直前にコメントを追加:
|
|
311
|
+
```markdown
|
|
312
|
+
<!-- Task: {タスク名} ({日付}) -->
|
|
313
|
+
```mermaid
|
|
314
|
+
...
|
|
315
|
+
```
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
**複数タスクの図の統合**:
|
|
319
|
+
- 同種の図(例: システム構成図)が複数ある場合、並列配置
|
|
320
|
+
- 重複や矛盾がある場合、ユーザーに確認して統合提案
|
|
321
|
+
|
|
322
|
+
### 6. ユーザー確認・承認
|
|
323
|
+
|
|
324
|
+
すべての変更内容を処理した後、以下を実行:
|
|
325
|
+
|
|
326
|
+
1. **変更サマリーの表示**:
|
|
327
|
+
```markdown
|
|
328
|
+
## 変更サマリー
|
|
329
|
+
|
|
330
|
+
### Feature仕様書
|
|
331
|
+
- features/login/requirements.md: 3セクション追加
|
|
332
|
+
- features/login/design.md: 5セクション追加
|
|
333
|
+
|
|
334
|
+
### Steering仕様書
|
|
335
|
+
- einja/steering/architecture.md: 7セクション追加
|
|
336
|
+
- einja/steering/db-design.md: 4セクション追加
|
|
337
|
+
- einja/steering/product.md: 3セクション追加
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
2. **各ファイルの詳細プレビュー**(オプション):
|
|
341
|
+
- ユーザーが詳細を確認したい場合、各ファイルのdiffを表示
|
|
342
|
+
|
|
343
|
+
3. **最終確認**:
|
|
344
|
+
- 「これらの変更を確定しますか?」
|
|
345
|
+
- 承認されたら、すべてのファイルを更新
|
|
346
|
+
- 却下された場合、変更をキャンセル
|
|
347
|
+
|
|
348
|
+
### 7. エラーハンドリング
|
|
349
|
+
|
|
350
|
+
**タスクspecが見つからない場合**:
|
|
351
|
+
```
|
|
352
|
+
エラー: タスク仕様書が見つかりません
|
|
353
|
+
パス: {指定パス}
|
|
354
|
+
確認事項:
|
|
355
|
+
- パスが正しいか確認してください
|
|
356
|
+
- requirements.md と design.md が存在するか確認してください
|
|
357
|
+
```
|
|
358
|
+
|
|
359
|
+
**requirements.md/design.md がない場合**:
|
|
360
|
+
```
|
|
361
|
+
警告: {ファイル名}が見つかりません
|
|
362
|
+
タスク: {タスク名}
|
|
363
|
+
対応: このタスクの反映をスキップして続行しますか?
|
|
364
|
+
```
|
|
365
|
+
|
|
366
|
+
**機能spec作成時の競合**:
|
|
367
|
+
```
|
|
368
|
+
警告: 機能spec『{feature-name}』は既に存在しますが、内容が空です
|
|
369
|
+
対応: 既存ファイルを上書きして反映しますか?
|
|
370
|
+
```
|
|
371
|
+
|
|
372
|
+
## 重要な原則
|
|
373
|
+
|
|
374
|
+
### 情報の忠実性
|
|
375
|
+
- タスクspecの内容を改変せず、忠実に抽出して反映する
|
|
376
|
+
- 要約や意訳は最小限にし、原文をできるだけ保持する
|
|
377
|
+
- コードブロック、図表は完全な形で転記する
|
|
378
|
+
|
|
379
|
+
### トレーサビリティ
|
|
380
|
+
- すべての反映内容に「ソース」情報を記録する
|
|
381
|
+
- タスク名と日付を明記し、後から追跡可能にする
|
|
382
|
+
- 変更履歴が明確にわかるようにする
|
|
383
|
+
|
|
384
|
+
### 非破壊的マージ
|
|
385
|
+
- 既存の内容を削除しない(ユーザー確認がある場合を除く)
|
|
386
|
+
- 追記を基本とし、上書きは最小限にする
|
|
387
|
+
- 重複チェックを徹底し、不要な反復を避ける
|
|
388
|
+
|
|
389
|
+
### 対話的な処理
|
|
390
|
+
- 判断が必要な場合は必ずユーザーに確認する
|
|
391
|
+
- 機能の判定、新規作成、重複処理などで対話する
|
|
392
|
+
- 最終確認を必ず行い、ユーザーの承認を得る
|
|
393
|
+
|
|
394
|
+
### 段階的な実行
|
|
395
|
+
- 1つのタスクspecずつ処理する
|
|
396
|
+
- 各ステップの結果を明確に表示する
|
|
397
|
+
- エラーが発生しても他のタスクspecの処理を継続する
|
|
398
|
+
|
|
399
|
+
## 出力フォーマット
|
|
400
|
+
|
|
401
|
+
処理完了後、以下の形式でレポートを表示:
|
|
402
|
+
|
|
403
|
+
```markdown
|
|
404
|
+
# タスク仕様書反映完了
|
|
405
|
+
|
|
406
|
+
## 処理したタスク
|
|
407
|
+
1. ✅ Monorepo Setup (20251104)
|
|
408
|
+
- Feature: なし(Steeringのみ)
|
|
409
|
+
- 反映先: architecture.md, db-design.md, product.md
|
|
410
|
+
|
|
411
|
+
2. ✅ Login Authentication (20251105)
|
|
412
|
+
- Feature: login
|
|
413
|
+
- 反映先: features/login/*, steering/*
|
|
414
|
+
|
|
415
|
+
## 反映サマリー
|
|
416
|
+
|
|
417
|
+
### Feature仕様書
|
|
418
|
+
- **features/login/requirements.md**: 3セクション追加(412行)
|
|
419
|
+
- **features/login/design.md**: 5セクション追加(823行)
|
|
420
|
+
- **features/login/tasks.md**: 1セクション追加(156行)
|
|
421
|
+
|
|
422
|
+
### Steering仕様書
|
|
423
|
+
- **einja/steering/architecture.md**: 7セクション追加(1,245行)
|
|
424
|
+
- **einja/steering/db-design.md**: 4セクション追加(567行)
|
|
425
|
+
- **einja/steering/product.md**: 3セクション追加(334行)
|
|
426
|
+
|
|
427
|
+
## 次のステップ
|
|
428
|
+
- 反映された内容を確認してください
|
|
429
|
+
- 必要に応じて手動で調整してください
|
|
430
|
+
- 変更をコミットする場合は、明確なコミットメッセージを記述してください
|
|
431
|
+
```
|
|
432
|
+
|
|
433
|
+
## 使用例
|
|
434
|
+
|
|
435
|
+
### 例1: 単一タスクの反映
|
|
436
|
+
```
|
|
437
|
+
/update-docs-by-task-specs docs/specs/tasks/monorepo/20251104-monorepo-turborepo-nextjs-setup
|
|
438
|
+
```
|
|
439
|
+
|
|
440
|
+
### 例2: 複数タスクの反映
|
|
441
|
+
```
|
|
442
|
+
/update-docs-by-task-specs docs/specs/tasks/task1,docs/specs/tasks/task2,docs/specs/tasks/task3
|
|
443
|
+
```
|
|
444
|
+
|
|
445
|
+
### 例3: スペース区切り
|
|
446
|
+
```
|
|
447
|
+
/update-docs-by-task-specs docs/specs/tasks/monorepo/20251104-monorepo-turborepo-nextjs-setup docs/specs/tasks/auth/20251105-login-feature
|
|
448
|
+
```
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# biome-check.sh - ファイル保存後にbiome check(format + lint)を実行するhook
|
|
3
|
+
|
|
4
|
+
# stdinからJSON入力を読み取る
|
|
5
|
+
input=$(cat)
|
|
6
|
+
|
|
7
|
+
# ファイルパスを抽出
|
|
8
|
+
file_path=$(echo "$input" | jq -r '.tool_input.file_path // empty')
|
|
9
|
+
|
|
10
|
+
# ファイルパスが存在しない場合は終了
|
|
11
|
+
if [ -z "$file_path" ]; then
|
|
12
|
+
exit 0
|
|
13
|
+
fi
|
|
14
|
+
|
|
15
|
+
# biome対象の拡張子かチェック (.ts, .tsx, .js, .jsx, .json)
|
|
16
|
+
if [[ "$file_path" =~ \.(ts|tsx|js|jsx|json)$ ]]; then
|
|
17
|
+
# プロジェクトルートに移動してbiomeを実行
|
|
18
|
+
cd "$CLAUDE_PROJECT_DIR" 2>/dev/null || exit 0
|
|
19
|
+
|
|
20
|
+
# biome check(format + lint)を実行、自動修正可能なものは修正
|
|
21
|
+
npx biome check --write "$file_path" 2>/dev/null || true
|
|
22
|
+
|
|
23
|
+
# 修正後に残っているlintエラーをチェック(any型など自動修正できないもの)
|
|
24
|
+
lint_errors=$(npx biome lint "$file_path" 2>&1 | grep -E "lint/|noExplicitAny|error" | head -20)
|
|
25
|
+
|
|
26
|
+
if [ -n "$lint_errors" ]; then
|
|
27
|
+
echo "" >&2
|
|
28
|
+
echo "⚠️ Biome lintエラーが検出されました" >&2
|
|
29
|
+
echo " ファイル: $file_path" >&2
|
|
30
|
+
echo "" >&2
|
|
31
|
+
echo "$lint_errors" | while read -r line; do
|
|
32
|
+
echo " $line" >&2
|
|
33
|
+
done
|
|
34
|
+
echo "" >&2
|
|
35
|
+
|
|
36
|
+
# エラー詳細をエスケープしてsystemMessageに含める
|
|
37
|
+
escaped_errors=$(echo "$lint_errors" | sed 's/"/\\"/g' | tr '\n' ' ' | head -c 500)
|
|
38
|
+
|
|
39
|
+
# any型が含まれているかチェック
|
|
40
|
+
if echo "$lint_errors" | grep -q "noExplicitAny"; then
|
|
41
|
+
echo "{\"decision\":\"approve\",\"systemMessage\":\"⚠️ any型が検出されました。any型は禁止です。適切な型を指定してください。\\n詳細: ${escaped_errors}\"}"
|
|
42
|
+
else
|
|
43
|
+
echo "{\"decision\":\"approve\",\"systemMessage\":\"⚠️ Biome lintエラーが検出されました。修正を検討してください。\\n詳細: ${escaped_errors}\"}"
|
|
44
|
+
fi
|
|
45
|
+
exit 0
|
|
46
|
+
fi
|
|
47
|
+
fi
|
|
48
|
+
|
|
49
|
+
exit 0
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# design-doc-check.sh - 設計書への実装コード混入検出
|
|
3
|
+
|
|
4
|
+
input=$(cat)
|
|
5
|
+
file_path=$(echo "$input" | jq -r '.tool_input.file_path // empty')
|
|
6
|
+
content=$(echo "$input" | jq -r '.tool_input.content // .tool_input.new_string // empty')
|
|
7
|
+
|
|
8
|
+
if [ -z "$file_path" ] || [ -z "$content" ]; then
|
|
9
|
+
exit 0
|
|
10
|
+
fi
|
|
11
|
+
|
|
12
|
+
# docs/specs/配下のmarkdownファイルのみ対象
|
|
13
|
+
if [[ ! "$file_path" =~ docs/specs/.*\.md$ ]]; then
|
|
14
|
+
exit 0
|
|
15
|
+
fi
|
|
16
|
+
|
|
17
|
+
# 実装コードパターンの検出
|
|
18
|
+
code_found=""
|
|
19
|
+
|
|
20
|
+
# 関数実装(アロー関数、function宣言)
|
|
21
|
+
if echo "$content" | grep -qE '(const|let|var)\s+\w+\s*=\s*(async\s*)?\([^)]*\)\s*=>\s*\{'; then
|
|
22
|
+
code_found="${code_found}\n - アロー関数の実装"
|
|
23
|
+
fi
|
|
24
|
+
|
|
25
|
+
if echo "$content" | grep -qE 'function\s+\w+\s*\([^)]*\)\s*\{[^}]+\}'; then
|
|
26
|
+
code_found="${code_found}\n - function実装"
|
|
27
|
+
fi
|
|
28
|
+
|
|
29
|
+
# if/for/while等の制御構文(コードブロック外)
|
|
30
|
+
# マークダウンのコードブロック内は許容するが、実際のロジックは警告
|
|
31
|
+
if echo "$content" | grep -qE '^\s*(if|for|while|switch)\s*\([^)]+\)\s*\{'; then
|
|
32
|
+
code_found="${code_found}\n - 制御構文の実装"
|
|
33
|
+
fi
|
|
34
|
+
|
|
35
|
+
# try-catch実装
|
|
36
|
+
if echo "$content" | grep -qE 'try\s*\{[^}]+\}\s*catch'; then
|
|
37
|
+
code_found="${code_found}\n - try-catch実装"
|
|
38
|
+
fi
|
|
39
|
+
|
|
40
|
+
# 具体的なビジネスロジック(計算、データ変換等)
|
|
41
|
+
if echo "$content" | grep -qE '\.(map|filter|reduce|forEach)\s*\(\s*(async\s*)?\([^)]*\)\s*=>\s*\{[^}]{50,}\}'; then
|
|
42
|
+
code_found="${code_found}\n - 配列操作の詳細実装"
|
|
43
|
+
fi
|
|
44
|
+
|
|
45
|
+
if [ -n "$code_found" ]; then
|
|
46
|
+
echo "" >&2
|
|
47
|
+
echo "⚠️ 警告: 設計書に実装コードが含まれています" >&2
|
|
48
|
+
echo " ファイル: $file_path" >&2
|
|
49
|
+
echo -e " 検出内容:$code_found" >&2
|
|
50
|
+
echo "" >&2
|
|
51
|
+
echo " 設計書には以下のみ記載してください:" >&2
|
|
52
|
+
echo " ✅ Class名、関数名、引数型、返却型" >&2
|
|
53
|
+
echo " ✅ 使用ライブラリの仕様" >&2
|
|
54
|
+
echo " ✅ アーキテクチャ図、構造図" >&2
|
|
55
|
+
echo " ❌ 具体的なロジックを含む実装コード" >&2
|
|
56
|
+
echo "" >&2
|
|
57
|
+
|
|
58
|
+
echo "{\"decision\":\"approve\",\"systemMessage\":\"⚠️ 設計書に実装コードが含まれています。設計と実装は分離してください。\"}"
|
|
59
|
+
fi
|
|
60
|
+
|
|
61
|
+
exit 0
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# detect-secrets.sh - 機密情報の検出
|
|
3
|
+
|
|
4
|
+
input=$(cat)
|
|
5
|
+
file_path=$(echo "$input" | jq -r '.tool_input.file_path // empty')
|
|
6
|
+
content=$(echo "$input" | jq -r '.tool_input.content // .tool_input.new_string // empty')
|
|
7
|
+
|
|
8
|
+
if [ -z "$file_path" ] || [ -z "$content" ]; then
|
|
9
|
+
exit 0
|
|
10
|
+
fi
|
|
11
|
+
|
|
12
|
+
# .envファイル自体は許可(ただし.env.exampleは除く)
|
|
13
|
+
if [[ "$file_path" =~ \.env$ ]] && [[ ! "$file_path" =~ \.example$ ]]; then
|
|
14
|
+
exit 0
|
|
15
|
+
fi
|
|
16
|
+
|
|
17
|
+
# 機密情報パターンの検出
|
|
18
|
+
secrets_found=""
|
|
19
|
+
|
|
20
|
+
# APIキー・トークンパターン
|
|
21
|
+
if echo "$content" | grep -qiE '(api[_-]?key|api[_-]?secret|access[_-]?token|auth[_-]?token|bearer)\s*[:=]\s*["\047][a-zA-Z0-9_\-]{20,}["\047]'; then
|
|
22
|
+
secrets_found="${secrets_found}\n - APIキー/トークンのハードコード"
|
|
23
|
+
fi
|
|
24
|
+
|
|
25
|
+
# AWSキーパターン
|
|
26
|
+
if echo "$content" | grep -qE 'AKIA[0-9A-Z]{16}'; then
|
|
27
|
+
secrets_found="${secrets_found}\n - AWS Access Key ID"
|
|
28
|
+
fi
|
|
29
|
+
|
|
30
|
+
# パスワードパターン
|
|
31
|
+
if echo "$content" | grep -qiE '(password|passwd|pwd)\s*[:=]\s*["\047][^"\047]{8,}["\047]'; then
|
|
32
|
+
secrets_found="${secrets_found}\n - パスワードのハードコード"
|
|
33
|
+
fi
|
|
34
|
+
|
|
35
|
+
# 秘密鍵パターン
|
|
36
|
+
if echo "$content" | grep -qE '-----BEGIN (RSA |EC |DSA |OPENSSH )?PRIVATE KEY-----'; then
|
|
37
|
+
secrets_found="${secrets_found}\n - 秘密鍵"
|
|
38
|
+
fi
|
|
39
|
+
|
|
40
|
+
# JWTシークレット
|
|
41
|
+
if echo "$content" | grep -qiE 'jwt[_-]?secret\s*[:=]\s*["\047][^"\047]{16,}["\047]'; then
|
|
42
|
+
secrets_found="${secrets_found}\n - JWTシークレット"
|
|
43
|
+
fi
|
|
44
|
+
|
|
45
|
+
# データベース接続文字列
|
|
46
|
+
if echo "$content" | grep -qiE '(mongodb|postgres|mysql|redis)://[^"\047\s]+:[^"\047\s]+@'; then
|
|
47
|
+
secrets_found="${secrets_found}\n - データベース接続文字列(認証情報含む)"
|
|
48
|
+
fi
|
|
49
|
+
|
|
50
|
+
if [ -n "$secrets_found" ]; then
|
|
51
|
+
echo "" >&2
|
|
52
|
+
echo "🚨 警告: 機密情報が検出されました" >&2
|
|
53
|
+
echo " ファイル: $file_path" >&2
|
|
54
|
+
echo -e " 検出内容:$secrets_found" >&2
|
|
55
|
+
echo "" >&2
|
|
56
|
+
echo " 環境変数または.envファイルの使用を検討してください" >&2
|
|
57
|
+
echo "" >&2
|
|
58
|
+
|
|
59
|
+
echo "{\"decision\":\"approve\",\"systemMessage\":\"🚨 機密情報が検出されました。環境変数の使用を検討してください。\"}"
|
|
60
|
+
fi
|
|
61
|
+
|
|
62
|
+
exit 0
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# large-file-warning.sh - 大きすぎるファイルの警告
|
|
3
|
+
|
|
4
|
+
input=$(cat)
|
|
5
|
+
file_path=$(echo "$input" | jq -r '.tool_input.file_path // empty')
|
|
6
|
+
content=$(echo "$input" | jq -r '.tool_input.content // empty')
|
|
7
|
+
|
|
8
|
+
if [ -z "$file_path" ]; then
|
|
9
|
+
exit 0
|
|
10
|
+
fi
|
|
11
|
+
|
|
12
|
+
# コード系ファイルのみ対象
|
|
13
|
+
if [[ ! "$file_path" =~ \.(ts|tsx|js|jsx|py|go|rs|java|rb|php)$ ]]; then
|
|
14
|
+
exit 0
|
|
15
|
+
fi
|
|
16
|
+
|
|
17
|
+
# 行数をカウント
|
|
18
|
+
line_count=0
|
|
19
|
+
if [ -n "$content" ]; then
|
|
20
|
+
# Writeの場合はcontentから行数を取得
|
|
21
|
+
line_count=$(echo "$content" | wc -l | tr -d ' ')
|
|
22
|
+
elif [ -f "$file_path" ]; then
|
|
23
|
+
# Editの場合はファイルから行数を取得
|
|
24
|
+
line_count=$(wc -l < "$file_path" | tr -d ' ')
|
|
25
|
+
fi
|
|
26
|
+
|
|
27
|
+
# 500行以上で警告
|
|
28
|
+
if [ "$line_count" -ge 500 ]; then
|
|
29
|
+
echo "" >&2
|
|
30
|
+
echo "⚠️ 警告: ファイルが大きすぎます(${line_count}行)" >&2
|
|
31
|
+
echo " ファイル: $file_path" >&2
|
|
32
|
+
echo "" >&2
|
|
33
|
+
echo " 推奨事項:" >&2
|
|
34
|
+
echo " - 500行を超えるファイルは分割を検討してください" >&2
|
|
35
|
+
echo " - 関連する機能ごとにモジュール化を検討してください" >&2
|
|
36
|
+
echo " - ヘルパー関数は別ファイルに切り出すことを検討してください" >&2
|
|
37
|
+
echo "" >&2
|
|
38
|
+
|
|
39
|
+
echo "{\"decision\":\"approve\",\"systemMessage\":\"⚠️ ファイルが${line_count}行あります。分割を検討してください。\"}"
|
|
40
|
+
fi
|
|
41
|
+
|
|
42
|
+
exit 0
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# playwright-resize.sh - Playwright使用前にリサイズを強制するhook
|
|
3
|
+
# PreToolUseで実行され、リサイズ未実施ならブロックする
|
|
4
|
+
|
|
5
|
+
input=$(cat)
|
|
6
|
+
tool_name=$(echo "$input" | jq -r '.tool_name // empty')
|
|
7
|
+
|
|
8
|
+
# Playwrightツール以外は無視
|
|
9
|
+
if [[ ! "$tool_name" =~ ^mcp__playwright__ ]]; then
|
|
10
|
+
exit 0
|
|
11
|
+
fi
|
|
12
|
+
|
|
13
|
+
# browser_resize自体、browser_close、browser_installは許可
|
|
14
|
+
if [[ "$tool_name" == "mcp__playwright__browser_resize" ]] || \
|
|
15
|
+
[[ "$tool_name" == "mcp__playwright__browser_close" ]] || \
|
|
16
|
+
[[ "$tool_name" == "mcp__playwright__browser_install" ]]; then
|
|
17
|
+
# リサイズ実行時にフラグファイルを作成
|
|
18
|
+
if [[ "$tool_name" == "mcp__playwright__browser_resize" ]]; then
|
|
19
|
+
mkdir -p /tmp/claude-hooks
|
|
20
|
+
touch /tmp/claude-hooks/playwright-resized-$$
|
|
21
|
+
fi
|
|
22
|
+
exit 0
|
|
23
|
+
fi
|
|
24
|
+
|
|
25
|
+
# フラグファイルが存在するか確認(現在のセッションでリサイズ済み)
|
|
26
|
+
# セッションIDがないので、最近のフラグファイル(5分以内)をチェック
|
|
27
|
+
recent_flag=$(find /tmp/claude-hooks -name "playwright-resized-*" -mmin -5 2>/dev/null | head -1)
|
|
28
|
+
|
|
29
|
+
if [ -n "$recent_flag" ]; then
|
|
30
|
+
# リサイズ済みなら許可
|
|
31
|
+
exit 0
|
|
32
|
+
fi
|
|
33
|
+
|
|
34
|
+
# リサイズ未実施ならブロック
|
|
35
|
+
echo '{"decision":"block","reason":"Playwright使用前にブラウザサイズの設定が必要です","systemMessage":"⚠️ Playwrightを使用する前に、まず以下を実行してブラウザサイズを設定してください:\n\nmcp__playwright__browser_resize({ width: 1280, height: 720 })\n\nその後、再度操作を実行してください。"}'
|
|
36
|
+
exit 2
|