@sk8metal/michi-cli 0.1.0 → 0.2.1
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 +17 -0
- package/README.md +1 -0
- package/dist/scripts/__tests__/validate-phase.test.js +83 -0
- package/dist/scripts/__tests__/validate-phase.test.js.map +1 -1
- package/dist/scripts/config/config-schema.d.ts +14 -0
- package/dist/scripts/config/config-schema.d.ts.map +1 -1
- package/dist/scripts/config/config-schema.js +9 -0
- package/dist/scripts/config/config-schema.js.map +1 -1
- package/dist/scripts/phase-runner.d.ts.map +1 -1
- package/dist/scripts/phase-runner.js +2 -2
- package/dist/scripts/phase-runner.js.map +1 -1
- package/dist/scripts/validate-phase.d.ts.map +1 -1
- package/dist/scripts/validate-phase.js +18 -3
- package/dist/scripts/validate-phase.js.map +1 -1
- package/dist/src/__tests__/integration/setup/claude.test.js +82 -0
- package/dist/src/__tests__/integration/setup/claude.test.js.map +1 -1
- package/dist/src/cli.d.ts.map +1 -1
- package/dist/src/cli.js +1 -0
- package/dist/src/cli.js.map +1 -1
- package/dist/src/commands/setup-existing.d.ts +1 -0
- package/dist/src/commands/setup-existing.d.ts.map +1 -1
- package/dist/src/commands/setup-existing.js +33 -0
- package/dist/src/commands/setup-existing.js.map +1 -1
- package/docs/user-guide/guides/agent-skills-integration.md +217 -0
- package/docs/user-guide/guides/customization.md +2 -2
- package/docs/user-guide/guides/multi-project.md +2 -2
- package/docs/user-guide/guides/phase-automation.md +25 -25
- package/docs/user-guide/guides/workflow.md +8 -20
- package/docs/user-guide/reference/config.md +2 -2
- package/docs/user-guide/reference/tasks-template.md +2 -2
- package/docs/user-guide/testing/test-planning-flow.md +1 -1
- package/package.json +2 -3
- package/scripts/__tests__/validate-phase.test.ts +100 -0
- package/scripts/config/config-schema.ts +11 -0
- package/scripts/phase-runner.ts +12 -3
- package/scripts/validate-phase.ts +21 -3
- package/templates/claude/agents/design-reviewer/AGENT.md +497 -0
- package/templates/claude/agents/e2e-first-planner/AGENT.md +410 -0
- package/templates/claude/agents/oss-license-checker/AGENT.md +265 -0
- package/templates/claude/agents/pr-resolver/AGENT.md +196 -0
- package/templates/claude/agents/stable-version-auditor/AGENT.md +279 -0
- package/templates/claude/commands/kiro/kiro-spec-impl.md +13 -4
- package/templates/claude/commands/kiro/kiro-spec-tasks.md +17 -3
- package/templates/claude/commands/michi/design-review.md +66 -0
- package/templates/claude/commands/michi/e2e-plan.md +113 -0
- package/templates/claude/commands/michi/license-check.md +80 -0
- package/templates/claude/commands/michi/pr-resolve.md +153 -0
- package/templates/claude/commands/michi/version-audit.md +91 -0
- package/templates/claude/skills/design-review/SKILL.md +648 -0
- package/templates/claude/skills/e2e-first-planning/SKILL.md +360 -0
- package/templates/claude/skills/oss-license/SKILL.md +232 -0
- package/templates/claude/skills/stable-version/SKILL.md +252 -0
|
@@ -33,10 +33,10 @@ AI-DLC(AI Development Life Cycle)の各フェーズで、Confluence/JIRA作
|
|
|
33
33
|
|
|
34
34
|
# Step 2: スクリプトでConfluence作成+バリデーション(必須)
|
|
35
35
|
# 凡例
|
|
36
|
-
|
|
36
|
+
michi phase:run <feature> requirements
|
|
37
37
|
|
|
38
38
|
# 具体例
|
|
39
|
-
|
|
39
|
+
michi phase:run user-auth requirements
|
|
40
40
|
|
|
41
41
|
# 実行内容:
|
|
42
42
|
# ✅ requirements.md 存在確認
|
|
@@ -61,10 +61,10 @@ npm run phase:run user-auth requirements
|
|
|
61
61
|
|
|
62
62
|
# Step 2: スクリプトでConfluence作成+バリデーション(必須)
|
|
63
63
|
# 凡例
|
|
64
|
-
|
|
64
|
+
michi phase:run <feature> design
|
|
65
65
|
|
|
66
66
|
# 具体例
|
|
67
|
-
|
|
67
|
+
michi phase:run user-auth design
|
|
68
68
|
|
|
69
69
|
# 実行内容:
|
|
70
70
|
# ✅ design.md 存在確認
|
|
@@ -90,10 +90,10 @@ npm run phase:run user-auth design
|
|
|
90
90
|
|
|
91
91
|
# Step 2: スクリプトでJIRA作成+バリデーション(必須)
|
|
92
92
|
# 凡例
|
|
93
|
-
|
|
93
|
+
michi phase:run <feature> tasks
|
|
94
94
|
|
|
95
95
|
# 具体例
|
|
96
|
-
|
|
96
|
+
michi phase:run user-auth tasks
|
|
97
97
|
|
|
98
98
|
# 実行内容:
|
|
99
99
|
# ✅ tasks.md 存在確認(営業日表記チェック)
|
|
@@ -115,12 +115,12 @@ npm run phase:run user-auth tasks
|
|
|
115
115
|
|
|
116
116
|
```bash
|
|
117
117
|
# 凡例
|
|
118
|
-
|
|
118
|
+
michi validate:phase <feature> <phase>
|
|
119
119
|
|
|
120
120
|
# 具体例
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
121
|
+
michi validate:phase user-auth requirements # 要件定義のバリデーション
|
|
122
|
+
michi validate:phase user-auth design # 設計のバリデーション
|
|
123
|
+
michi validate:phase user-auth tasks # タスク分割のバリデーション
|
|
124
124
|
```
|
|
125
125
|
|
|
126
126
|
### バリデーション項目
|
|
@@ -179,14 +179,14 @@ CONFLUENCE_PRD_SPACE=Michi # ← 実際に存在するスペース
|
|
|
179
179
|
|
|
180
180
|
```text
|
|
181
181
|
❌ Confluenceページ(要件定義)が作成されていません
|
|
182
|
-
→ 実行:
|
|
182
|
+
→ 実行: michi confluence:sync <feature> requirements
|
|
183
183
|
```
|
|
184
184
|
|
|
185
185
|
**対処**:
|
|
186
186
|
|
|
187
187
|
```bash
|
|
188
188
|
# 個別に実行
|
|
189
|
-
|
|
189
|
+
michi confluence:sync calculator-app requirements
|
|
190
190
|
```
|
|
191
191
|
|
|
192
192
|
### JIRAプロジェクト不在エラー
|
|
@@ -221,14 +221,14 @@ vim .kiro/project.json
|
|
|
221
221
|
|
|
222
222
|
```text
|
|
223
223
|
❌ JIRA Epicが作成されていません
|
|
224
|
-
→ 実行:
|
|
224
|
+
→ 実行: michi jira:sync <feature>
|
|
225
225
|
```
|
|
226
226
|
|
|
227
227
|
**対処**:
|
|
228
228
|
|
|
229
229
|
```bash
|
|
230
230
|
# 個別に実行
|
|
231
|
-
|
|
231
|
+
michi jira:sync calculator-app
|
|
232
232
|
```
|
|
233
233
|
|
|
234
234
|
### 認証エラー
|
|
@@ -251,11 +251,11 @@ Authentication failed: {"code":401,"message":"Unauthorized"}
|
|
|
251
251
|
|
|
252
252
|
# Phase 0.1: 要件定義
|
|
253
253
|
/kiro:spec-requirements calculator-app # AI実行
|
|
254
|
-
|
|
254
|
+
michi phase:run calculator-app requirements # スクリプト実行(必須)
|
|
255
255
|
|
|
256
256
|
# Phase 0.2: 設計
|
|
257
257
|
/kiro:spec-design calculator-app # AI実行
|
|
258
|
-
|
|
258
|
+
michi phase:run calculator-app design # スクリプト実行(必須)
|
|
259
259
|
|
|
260
260
|
# Phase 0.3-0.4: テスト計画(必要に応じて)
|
|
261
261
|
# テストタイプの選択とテスト仕様書作成
|
|
@@ -265,12 +265,12 @@ npm run phase:run calculator-app design # スクリプト実行(必須)
|
|
|
265
265
|
/kiro:spec-tasks calculator-app # AI実行
|
|
266
266
|
|
|
267
267
|
# Phase 0.6: JIRA同期
|
|
268
|
-
|
|
268
|
+
michi phase:run calculator-app tasks # スクリプト実行(必須)
|
|
269
269
|
|
|
270
270
|
# バリデーション(全フェーズ)
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
271
|
+
michi validate:phase calculator-app requirements
|
|
272
|
+
michi validate:phase calculator-app design
|
|
273
|
+
michi validate:phase calculator-app tasks
|
|
274
274
|
|
|
275
275
|
# Phase 1: 環境構築(必要に応じて)
|
|
276
276
|
# テスト環境のセットアップ
|
|
@@ -349,11 +349,11 @@ michi jira:comment MICHI-123 "PRを作成しました: https://github.com/..."
|
|
|
349
349
|
|
|
350
350
|
```bash
|
|
351
351
|
# 1回目
|
|
352
|
-
|
|
352
|
+
michi phase:run calculator-app requirements
|
|
353
353
|
→ Confluenceページ新規作成(version 1)
|
|
354
354
|
|
|
355
355
|
# 2回目(誤って再実行)
|
|
356
|
-
|
|
356
|
+
michi phase:run calculator-app requirements
|
|
357
357
|
→ 既存ページを検索
|
|
358
358
|
→ 既存ページ更新(version 1 → 2)
|
|
359
359
|
→ ✅ 重複なし
|
|
@@ -365,7 +365,7 @@ npm run phase:run calculator-app requirements
|
|
|
365
365
|
|
|
366
366
|
```bash
|
|
367
367
|
# 1回目
|
|
368
|
-
|
|
368
|
+
michi phase:run calculator-app tasks
|
|
369
369
|
→ spec.jsonをチェック(Epic未記録)
|
|
370
370
|
→ JQL検索(既存Epicなし)
|
|
371
371
|
→ Epic作成: MP-1
|
|
@@ -373,7 +373,7 @@ npm run phase:run calculator-app tasks
|
|
|
373
373
|
→ spec.jsonに記録
|
|
374
374
|
|
|
375
375
|
# 2回目(誤って再実行)
|
|
376
|
-
|
|
376
|
+
michi phase:run calculator-app tasks
|
|
377
377
|
→ spec.jsonをチェック(Epic: MP-1記録済み)
|
|
378
378
|
→ 既存Epic検出: MP-1
|
|
379
379
|
→ Epic作成スキップ ✅
|
|
@@ -392,7 +392,7 @@ npm run phase:run calculator-app tasks
|
|
|
392
392
|
# Story 8.1: 新機能を追加
|
|
393
393
|
|
|
394
394
|
# 再実行
|
|
395
|
-
|
|
395
|
+
michi phase:run calculator-app tasks
|
|
396
396
|
→ 既存Epic: MP-1(スキップ)
|
|
397
397
|
→ 既存Story: MP-2〜MP-14(スキップ)
|
|
398
398
|
→ 新しいStory: MP-15(作成) ← 新規のみ作成
|
|
@@ -120,10 +120,10 @@ Cursorで実行:
|
|
|
120
120
|
|
|
121
121
|
```bash
|
|
122
122
|
# 凡例
|
|
123
|
-
|
|
123
|
+
michi confluence:sync <feature> requirements
|
|
124
124
|
|
|
125
125
|
# 具体例
|
|
126
|
-
|
|
126
|
+
michi confluence:sync user-auth requirements
|
|
127
127
|
```
|
|
128
128
|
|
|
129
129
|
AIが自動的に:
|
|
@@ -175,12 +175,10 @@ jj git push
|
|
|
175
175
|
|
|
176
176
|
```bash
|
|
177
177
|
# 凡例
|
|
178
|
-
|
|
179
|
-
npm run excel:sync <feature>
|
|
178
|
+
michi confluence:sync <feature> design
|
|
180
179
|
|
|
181
180
|
# 具体例
|
|
182
|
-
|
|
183
|
-
npm run excel:sync user-auth
|
|
181
|
+
michi confluence:sync user-auth design
|
|
184
182
|
```
|
|
185
183
|
|
|
186
184
|
見積もりExcelファイルが `estimates/<feature>-estimate.xlsx` に出力されます。
|
|
@@ -249,10 +247,10 @@ jj git push
|
|
|
249
247
|
|
|
250
248
|
```bash
|
|
251
249
|
# 凡例
|
|
252
|
-
|
|
250
|
+
michi jira:sync <feature>
|
|
253
251
|
|
|
254
252
|
# 具体例
|
|
255
|
-
|
|
253
|
+
michi jira:sync user-auth
|
|
256
254
|
```
|
|
257
255
|
|
|
258
256
|
自動的に:
|
|
@@ -374,16 +372,6 @@ Phase Aが成功したら、PRを作成します。
|
|
|
374
372
|
|
|
375
373
|
#### Phase A Step 1: PR作成
|
|
376
374
|
|
|
377
|
-
```bash
|
|
378
|
-
# 凡例
|
|
379
|
-
npm run github:create-pr <project-id>/feature/<feature> "[JIRA-XXX] <タイトル>"
|
|
380
|
-
|
|
381
|
-
# 具体例
|
|
382
|
-
npm run github:create-pr michi/feature/user-auth "[MICHI-123] ユーザー認証実装"
|
|
383
|
-
```
|
|
384
|
-
|
|
385
|
-
または手動で:
|
|
386
|
-
|
|
387
375
|
```bash
|
|
388
376
|
# 凡例
|
|
389
377
|
gh pr create --head <project-id>/feature/<feature> --base main \
|
|
@@ -500,10 +488,10 @@ gh release create v1.0.0 --title "Release v1.0.0" --notes-file release-notes.md
|
|
|
500
488
|
|
|
501
489
|
```bash
|
|
502
490
|
# 凡例
|
|
503
|
-
|
|
491
|
+
michi workflow:run --feature <feature>
|
|
504
492
|
|
|
505
493
|
# 具体例
|
|
506
|
-
|
|
494
|
+
michi workflow:run --feature user-auth
|
|
507
495
|
```
|
|
508
496
|
|
|
509
497
|
承認ゲートで一時停止し、承認後に次のフェーズに進みます。
|
|
@@ -543,8 +543,8 @@ project = PROJ AND labels = "release" # リリースタスクのみ
|
|
|
543
543
|
|
|
544
544
|
---
|
|
545
545
|
|
|
546
|
-
**次のステップ**:
|
|
546
|
+
**次のステップ**:
|
|
547
547
|
1. tasks.mdを上記テンプレートに従って作成
|
|
548
|
-
2. `
|
|
548
|
+
2. `michi phase:run <feature> tasks` 実行
|
|
549
549
|
3. JIRAに全フェーズのストーリーが自動作成される
|
|
550
550
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sk8metal/michi-cli",
|
|
3
|
-
"version": "0.1
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"description": "Managed Intelligent Comprehensive Hub for Integration - AI-driven development workflow automation",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -87,7 +87,7 @@
|
|
|
87
87
|
"dotenv": "^17.2.3",
|
|
88
88
|
"exceljs": "^4.4.0",
|
|
89
89
|
"googleapis": "^166.0.0",
|
|
90
|
-
"inquirer": "^
|
|
90
|
+
"inquirer": "^13.0.1",
|
|
91
91
|
"jira-client": "^8.2.2",
|
|
92
92
|
"markdown-it": "^14.0.0",
|
|
93
93
|
"turndown": "^7.1.2",
|
|
@@ -95,7 +95,6 @@
|
|
|
95
95
|
},
|
|
96
96
|
"devDependencies": {
|
|
97
97
|
"@eslint/js": "^9.39.1",
|
|
98
|
-
"@types/inquirer": "^9.0.7",
|
|
99
98
|
"@types/markdown-it": "^14.1.2",
|
|
100
99
|
"@types/node": "^24.10.1",
|
|
101
100
|
"@types/turndown": "^5.0.4",
|
|
@@ -5,6 +5,8 @@
|
|
|
5
5
|
import { describe, it, expect, beforeEach, vi } from 'vitest';
|
|
6
6
|
import { existsSync, readFileSync } from 'fs';
|
|
7
7
|
import { validatePhase } from '../validate-phase.js';
|
|
8
|
+
import { loadConfig } from '../utils/config-loader.js';
|
|
9
|
+
import type { AppConfig } from '../config/config-schema.js';
|
|
8
10
|
|
|
9
11
|
// fsモジュールのモック
|
|
10
12
|
vi.mock('fs', () => ({
|
|
@@ -21,6 +23,17 @@ vi.mock('../utils/project-meta.js', () => ({
|
|
|
21
23
|
})),
|
|
22
24
|
}));
|
|
23
25
|
|
|
26
|
+
// config-loaderのモック
|
|
27
|
+
vi.mock('../utils/config-loader.js', () => ({
|
|
28
|
+
loadConfig: vi.fn(() => ({
|
|
29
|
+
validation: {
|
|
30
|
+
weekdayNotation: true,
|
|
31
|
+
businessDayCount: true,
|
|
32
|
+
weekendExclusion: true,
|
|
33
|
+
},
|
|
34
|
+
})),
|
|
35
|
+
}));
|
|
36
|
+
|
|
24
37
|
describe('validatePhase', () => {
|
|
25
38
|
beforeEach(() => {
|
|
26
39
|
vi.clearAllMocks();
|
|
@@ -162,6 +175,93 @@ describe('validatePhase', () => {
|
|
|
162
175
|
'⚠️ tasks.mdに曜日表記(月、火、水...)が含まれていません',
|
|
163
176
|
);
|
|
164
177
|
});
|
|
178
|
+
|
|
179
|
+
it('tasksフェーズ: 日本語曜日表記を受け入れる', () => {
|
|
180
|
+
// Arrange
|
|
181
|
+
vi.mocked(existsSync).mockReturnValue(true);
|
|
182
|
+
vi.mocked(readFileSync).mockImplementation((path) => {
|
|
183
|
+
if (String(path).includes('tasks.md')) {
|
|
184
|
+
return 'Day 1(月):\n - タスク1\nDay 2(火):\n - タスク2\n土日休み';
|
|
185
|
+
}
|
|
186
|
+
return JSON.stringify({
|
|
187
|
+
milestones: { design: { completed: true } },
|
|
188
|
+
jira: { epicKey: 'TEST-1', storyKeys: ['TEST-2'] },
|
|
189
|
+
});
|
|
190
|
+
});
|
|
191
|
+
vi.mocked(loadConfig).mockReturnValue({
|
|
192
|
+
validation: {
|
|
193
|
+
weekdayNotation: true,
|
|
194
|
+
businessDayCount: true,
|
|
195
|
+
weekendExclusion: true,
|
|
196
|
+
},
|
|
197
|
+
} as Partial<AppConfig> as AppConfig);
|
|
198
|
+
|
|
199
|
+
// Act
|
|
200
|
+
const result = validatePhase('test-feature', 'tasks');
|
|
201
|
+
|
|
202
|
+
// Assert
|
|
203
|
+
expect(result.warnings).not.toContain(
|
|
204
|
+
'⚠️ tasks.mdに曜日表記(月、火、水...)が含まれていません',
|
|
205
|
+
);
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
it('tasksフェーズ: 英語曜日表記を受け入れる', () => {
|
|
209
|
+
// Arrange
|
|
210
|
+
vi.mocked(existsSync).mockReturnValue(true);
|
|
211
|
+
vi.mocked(readFileSync).mockImplementation((path) => {
|
|
212
|
+
if (String(path).includes('tasks.md')) {
|
|
213
|
+
return 'Day 1 (Mon):\n - Task 1\nDay 2 (Tue):\n - Task 2\nWeekends excluded';
|
|
214
|
+
}
|
|
215
|
+
return JSON.stringify({
|
|
216
|
+
milestones: { design: { completed: true } },
|
|
217
|
+
jira: { epicKey: 'TEST-1', storyKeys: ['TEST-2'] },
|
|
218
|
+
});
|
|
219
|
+
});
|
|
220
|
+
vi.mocked(loadConfig).mockReturnValue({
|
|
221
|
+
validation: {
|
|
222
|
+
weekdayNotation: true,
|
|
223
|
+
businessDayCount: true,
|
|
224
|
+
weekendExclusion: true,
|
|
225
|
+
},
|
|
226
|
+
} as Partial<AppConfig> as AppConfig);
|
|
227
|
+
|
|
228
|
+
// Act
|
|
229
|
+
const result = validatePhase('test-feature', 'tasks');
|
|
230
|
+
|
|
231
|
+
// Assert
|
|
232
|
+
expect(result.warnings).not.toContain(
|
|
233
|
+
'⚠️ tasks.mdに曜日表記(月、火、水...)が含まれていません',
|
|
234
|
+
);
|
|
235
|
+
});
|
|
236
|
+
|
|
237
|
+
it('tasksフェーズ: バリデーション無効化設定を尊重する', () => {
|
|
238
|
+
// Arrange
|
|
239
|
+
vi.mocked(existsSync).mockReturnValue(true);
|
|
240
|
+
vi.mocked(readFileSync).mockImplementation((path) => {
|
|
241
|
+
if (String(path).includes('tasks.md')) {
|
|
242
|
+
return 'タスク一覧(曜日表記なし)'; // 営業日表記がない
|
|
243
|
+
}
|
|
244
|
+
return JSON.stringify({
|
|
245
|
+
milestones: { design: { completed: true } },
|
|
246
|
+
jira: { epicKey: 'TEST-1', storyKeys: ['TEST-2'] },
|
|
247
|
+
});
|
|
248
|
+
});
|
|
249
|
+
vi.mocked(loadConfig).mockReturnValue({
|
|
250
|
+
validation: {
|
|
251
|
+
weekdayNotation: false, // バリデーション無効化
|
|
252
|
+
businessDayCount: true,
|
|
253
|
+
weekendExclusion: true,
|
|
254
|
+
},
|
|
255
|
+
} as Partial<AppConfig> as AppConfig);
|
|
256
|
+
|
|
257
|
+
// Act
|
|
258
|
+
const result = validatePhase('test-feature', 'tasks');
|
|
259
|
+
|
|
260
|
+
// Assert
|
|
261
|
+
expect(result.warnings).not.toContain(
|
|
262
|
+
'⚠️ tasks.mdに曜日表記(月、火、水...)が含まれていません',
|
|
263
|
+
);
|
|
264
|
+
});
|
|
165
265
|
});
|
|
166
266
|
|
|
167
267
|
describe('エッジケース', () => {
|
|
@@ -137,6 +137,15 @@ export const WorkflowConfigSchema = z.object({
|
|
|
137
137
|
.optional(),
|
|
138
138
|
});
|
|
139
139
|
|
|
140
|
+
/**
|
|
141
|
+
* バリデーション設定スキーマ
|
|
142
|
+
*/
|
|
143
|
+
export const ValidationConfigSchema = z.object({
|
|
144
|
+
weekdayNotation: z.boolean().default(true),
|
|
145
|
+
businessDayCount: z.boolean().default(true),
|
|
146
|
+
weekendExclusion: z.boolean().default(true),
|
|
147
|
+
});
|
|
148
|
+
|
|
140
149
|
/**
|
|
141
150
|
* 全体設定スキーマ
|
|
142
151
|
*/
|
|
@@ -144,6 +153,7 @@ export const AppConfigSchema = z.object({
|
|
|
144
153
|
confluence: ConfluenceConfigSchema.optional(),
|
|
145
154
|
jira: JiraConfigSchema.optional(),
|
|
146
155
|
workflow: WorkflowConfigSchema.optional(),
|
|
156
|
+
validation: ValidationConfigSchema.optional(),
|
|
147
157
|
});
|
|
148
158
|
|
|
149
159
|
/**
|
|
@@ -166,4 +176,5 @@ export type JiraStoryPoints = z.infer<typeof JiraStoryPointsSchema>;
|
|
|
166
176
|
export type JiraStatusMapping = z.infer<typeof JiraStatusMappingSchema>;
|
|
167
177
|
export type JiraConfig = z.infer<typeof JiraConfigSchema>;
|
|
168
178
|
export type WorkflowConfig = z.infer<typeof WorkflowConfigSchema>;
|
|
179
|
+
export type ValidationConfig = z.infer<typeof ValidationConfigSchema>;
|
|
169
180
|
export type AppConfig = z.infer<typeof AppConfigSchema>;
|
package/scripts/phase-runner.ts
CHANGED
|
@@ -827,9 +827,18 @@ async function runEnvironmentSetupPhase(
|
|
|
827
827
|
? languageAnalysis.language
|
|
828
828
|
: languageMap[detected.language] || 'その他';
|
|
829
829
|
|
|
830
|
-
|
|
830
|
+
// 型定義: promptの回答 + 追加プロパティ
|
|
831
|
+
interface EnvironmentAnswers {
|
|
832
|
+
language: string;
|
|
833
|
+
ciTool: string;
|
|
834
|
+
needsDocker: boolean;
|
|
835
|
+
installDeps?: boolean;
|
|
836
|
+
suggestedServices?: string[];
|
|
837
|
+
}
|
|
838
|
+
|
|
839
|
+
const answers = await inquirer.prompt<EnvironmentAnswers>([
|
|
831
840
|
{
|
|
832
|
-
type: '
|
|
841
|
+
type: 'select',
|
|
833
842
|
name: 'language',
|
|
834
843
|
message:
|
|
835
844
|
languageAnalysis.confidence !== 'low'
|
|
@@ -847,7 +856,7 @@ async function runEnvironmentSetupPhase(
|
|
|
847
856
|
default: defaultLanguage,
|
|
848
857
|
},
|
|
849
858
|
{
|
|
850
|
-
type: '
|
|
859
|
+
type: 'select',
|
|
851
860
|
name: 'ciTool',
|
|
852
861
|
message: 'CI/CDツールを選択してください:',
|
|
853
862
|
choices: ['GitHub Actions', 'Screwdriver', 'GitLab CI', 'なし'],
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
import { existsSync, readFileSync } from 'fs';
|
|
7
7
|
import { join } from 'path';
|
|
8
8
|
import { validateFeatureName } from './utils/feature-name-validator.js';
|
|
9
|
+
import { loadConfig } from './utils/config-loader.js';
|
|
9
10
|
|
|
10
11
|
type Phase =
|
|
11
12
|
| 'requirements'
|
|
@@ -159,11 +160,28 @@ function validateTasks(feature: string): ValidationResult {
|
|
|
159
160
|
if (!existsSync(tasksPath)) {
|
|
160
161
|
errors.push('❌ tasks.md が作成されていません');
|
|
161
162
|
} else {
|
|
162
|
-
//
|
|
163
|
+
// 設定読み込み(バリデーション設定)
|
|
164
|
+
let config;
|
|
165
|
+
try {
|
|
166
|
+
config = loadConfig();
|
|
167
|
+
} catch {
|
|
168
|
+
// 設定ファイルの読み込みエラーは無視(デフォルト設定を使用)
|
|
169
|
+
config = { validation: { weekdayNotation: true } };
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// 営業日表記チェック(設定で無効化可能)
|
|
163
173
|
const tasksContent = readFileSync(tasksPath, 'utf-8');
|
|
164
|
-
|
|
165
|
-
|
|
174
|
+
|
|
175
|
+
if (config.validation?.weekdayNotation !== false) {
|
|
176
|
+
// 日本語または英語の曜日表記をチェック
|
|
177
|
+
const hasJapaneseWeekday = ['(月)', '(火)'].some(p => tasksContent.includes(p));
|
|
178
|
+
const hasEnglishWeekday = ['(Mon)', '(Tue)'].some(p => tasksContent.includes(p));
|
|
179
|
+
|
|
180
|
+
if (!hasJapaneseWeekday && !hasEnglishWeekday) {
|
|
181
|
+
warnings.push('⚠️ tasks.mdに曜日表記(月、火、水...)が含まれていません');
|
|
182
|
+
}
|
|
166
183
|
}
|
|
184
|
+
|
|
167
185
|
if (!tasksContent.includes('Day 1') && !tasksContent.includes('Day1')) {
|
|
168
186
|
warnings.push('⚠️ tasks.mdに営業日カウント(Day 1, Day 2...)が含まれていません');
|
|
169
187
|
}
|