@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.
Files changed (52) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/README.md +1 -0
  3. package/dist/scripts/__tests__/validate-phase.test.js +83 -0
  4. package/dist/scripts/__tests__/validate-phase.test.js.map +1 -1
  5. package/dist/scripts/config/config-schema.d.ts +14 -0
  6. package/dist/scripts/config/config-schema.d.ts.map +1 -1
  7. package/dist/scripts/config/config-schema.js +9 -0
  8. package/dist/scripts/config/config-schema.js.map +1 -1
  9. package/dist/scripts/phase-runner.d.ts.map +1 -1
  10. package/dist/scripts/phase-runner.js +2 -2
  11. package/dist/scripts/phase-runner.js.map +1 -1
  12. package/dist/scripts/validate-phase.d.ts.map +1 -1
  13. package/dist/scripts/validate-phase.js +18 -3
  14. package/dist/scripts/validate-phase.js.map +1 -1
  15. package/dist/src/__tests__/integration/setup/claude.test.js +82 -0
  16. package/dist/src/__tests__/integration/setup/claude.test.js.map +1 -1
  17. package/dist/src/cli.d.ts.map +1 -1
  18. package/dist/src/cli.js +1 -0
  19. package/dist/src/cli.js.map +1 -1
  20. package/dist/src/commands/setup-existing.d.ts +1 -0
  21. package/dist/src/commands/setup-existing.d.ts.map +1 -1
  22. package/dist/src/commands/setup-existing.js +33 -0
  23. package/dist/src/commands/setup-existing.js.map +1 -1
  24. package/docs/user-guide/guides/agent-skills-integration.md +217 -0
  25. package/docs/user-guide/guides/customization.md +2 -2
  26. package/docs/user-guide/guides/multi-project.md +2 -2
  27. package/docs/user-guide/guides/phase-automation.md +25 -25
  28. package/docs/user-guide/guides/workflow.md +8 -20
  29. package/docs/user-guide/reference/config.md +2 -2
  30. package/docs/user-guide/reference/tasks-template.md +2 -2
  31. package/docs/user-guide/testing/test-planning-flow.md +1 -1
  32. package/package.json +2 -3
  33. package/scripts/__tests__/validate-phase.test.ts +100 -0
  34. package/scripts/config/config-schema.ts +11 -0
  35. package/scripts/phase-runner.ts +12 -3
  36. package/scripts/validate-phase.ts +21 -3
  37. package/templates/claude/agents/design-reviewer/AGENT.md +497 -0
  38. package/templates/claude/agents/e2e-first-planner/AGENT.md +410 -0
  39. package/templates/claude/agents/oss-license-checker/AGENT.md +265 -0
  40. package/templates/claude/agents/pr-resolver/AGENT.md +196 -0
  41. package/templates/claude/agents/stable-version-auditor/AGENT.md +279 -0
  42. package/templates/claude/commands/kiro/kiro-spec-impl.md +13 -4
  43. package/templates/claude/commands/kiro/kiro-spec-tasks.md +17 -3
  44. package/templates/claude/commands/michi/design-review.md +66 -0
  45. package/templates/claude/commands/michi/e2e-plan.md +113 -0
  46. package/templates/claude/commands/michi/license-check.md +80 -0
  47. package/templates/claude/commands/michi/pr-resolve.md +153 -0
  48. package/templates/claude/commands/michi/version-audit.md +91 -0
  49. package/templates/claude/skills/design-review/SKILL.md +648 -0
  50. package/templates/claude/skills/e2e-first-planning/SKILL.md +360 -0
  51. package/templates/claude/skills/oss-license/SKILL.md +232 -0
  52. 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
- npm run phase:run <feature> requirements
36
+ michi phase:run <feature> requirements
37
37
 
38
38
  # 具体例
39
- npm run phase:run user-auth requirements
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
- npm run phase:run <feature> design
64
+ michi phase:run <feature> design
65
65
 
66
66
  # 具体例
67
- npm run phase:run user-auth design
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
- npm run phase:run <feature> tasks
93
+ michi phase:run <feature> tasks
94
94
 
95
95
  # 具体例
96
- npm run phase:run user-auth tasks
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
- npm run validate:phase <feature> <phase>
118
+ michi validate:phase <feature> <phase>
119
119
 
120
120
  # 具体例
121
- npm run validate:phase user-auth requirements # 要件定義のバリデーション
122
- npm run validate:phase user-auth design # 設計のバリデーション
123
- npm run validate:phase user-auth tasks # タスク分割のバリデーション
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
- → 実行: npm run confluence:sync <feature> requirements
182
+ → 実行: michi confluence:sync <feature> requirements
183
183
  ```
184
184
 
185
185
  **対処**:
186
186
 
187
187
  ```bash
188
188
  # 個別に実行
189
- npm run confluence:sync calculator-app requirements
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
- → 実行: npm run jira:sync <feature>
224
+ → 実行: michi jira:sync <feature>
225
225
  ```
226
226
 
227
227
  **対処**:
228
228
 
229
229
  ```bash
230
230
  # 個別に実行
231
- npm run jira:sync calculator-app
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
- npm run phase:run calculator-app requirements # スクリプト実行(必須)
254
+ michi phase:run calculator-app requirements # スクリプト実行(必須)
255
255
 
256
256
  # Phase 0.2: 設計
257
257
  /kiro:spec-design calculator-app # AI実行
258
- npm run phase:run calculator-app design # スクリプト実行(必須)
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
- npm run phase:run calculator-app tasks # スクリプト実行(必須)
268
+ michi phase:run calculator-app tasks # スクリプト実行(必須)
269
269
 
270
270
  # バリデーション(全フェーズ)
271
- npm run validate:phase calculator-app requirements
272
- npm run validate:phase calculator-app design
273
- npm run validate:phase calculator-app tasks
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
- npm run phase:run calculator-app requirements
352
+ michi phase:run calculator-app requirements
353
353
  → Confluenceページ新規作成(version 1)
354
354
 
355
355
  # 2回目(誤って再実行)
356
- npm run phase:run calculator-app requirements
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
- npm run phase:run calculator-app tasks
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
- npm run phase:run calculator-app tasks
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
- npm run phase:run calculator-app tasks
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
- npm run confluence:sync <feature> requirements
123
+ michi confluence:sync <feature> requirements
124
124
 
125
125
  # 具体例
126
- npm run confluence:sync user-auth requirements
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
- npm run confluence:sync <feature> design
179
- npm run excel:sync <feature>
178
+ michi confluence:sync <feature> design
180
179
 
181
180
  # 具体例
182
- npm run confluence:sync user-auth design
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
- npm run jira:sync <feature>
250
+ michi jira:sync <feature>
253
251
 
254
252
  # 具体例
255
- npm run jira:sync user-auth
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
- npm run workflow:run -- --feature <feature>
491
+ michi workflow:run --feature <feature>
504
492
 
505
493
  # 具体例
506
- npm run workflow:run -- --feature user-auth
494
+ michi workflow:run --feature user-auth
507
495
  ```
508
496
 
509
497
  承認ゲートで一時停止し、承認後に次のフェーズに進みます。
@@ -331,8 +331,8 @@
331
331
  バリデーションを手動で実行する場合:
332
332
 
333
333
  ```bash
334
- # 推奨: npmスクリプト経由
335
- npm run config:validate
334
+ # 推奨: michiコマンド経由
335
+ michi config:validate
336
336
 
337
337
  # または、npx経由
338
338
  npx tsx scripts/utils/config-validator.ts
@@ -543,8 +543,8 @@ project = PROJ AND labels = "release" # リリースタスクのみ
543
543
 
544
544
  ---
545
545
 
546
- **次のステップ**:
546
+ **次のステップ**:
547
547
  1. tasks.mdを上記テンプレートに従って作成
548
- 2. `npm run phase:run <feature> tasks` 実行
548
+ 2. `michi phase:run <feature> tasks` 実行
549
549
  3. JIRAに全フェーズのストーリーが自動作成される
550
550
 
@@ -71,7 +71,7 @@ Phase 0.5で作成したtasks.mdをもとに、JIRAでEpic/Story/Subtaskを作
71
71
 
72
72
  ```bash
73
73
  # JIRAに同期
74
- npm run jira:sync <feature>
74
+ michi jira:sync <feature>
75
75
  ```
76
76
 
77
77
  自動的に:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sk8metal/michi-cli",
3
- "version": "0.1.0",
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": "^9.2.12",
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>;
@@ -827,9 +827,18 @@ async function runEnvironmentSetupPhase(
827
827
  ? languageAnalysis.language
828
828
  : languageMap[detected.language] || 'その他';
829
829
 
830
- const answers = await inquirer.prompt([
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: 'list',
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: 'list',
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
- if (!tasksContent.includes('(月)') && !tasksContent.includes('(火)')) {
165
- warnings.push('⚠️ tasks.mdに曜日表記(月、火、水...)が含まれていません');
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
  }