@sk8metal/michi-cli 0.3.0 → 0.4.0

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 (157) hide show
  1. package/CHANGELOG.md +43 -0
  2. package/dist/scripts/config-global.d.ts +10 -0
  3. package/dist/scripts/config-global.d.ts.map +1 -0
  4. package/dist/scripts/config-global.js +111 -0
  5. package/dist/scripts/config-global.js.map +1 -0
  6. package/dist/scripts/confluence-sync.d.ts +22 -4
  7. package/dist/scripts/confluence-sync.d.ts.map +1 -1
  8. package/dist/scripts/confluence-sync.js +22 -12
  9. package/dist/scripts/confluence-sync.js.map +1 -1
  10. package/dist/scripts/jira-sync.d.ts.map +1 -1
  11. package/dist/scripts/jira-sync.js +201 -167
  12. package/dist/scripts/jira-sync.js.map +1 -1
  13. package/dist/scripts/list-projects.js.map +1 -1
  14. package/dist/scripts/multi-project-estimate.js.map +1 -1
  15. package/dist/scripts/phase-runner.d.ts +1 -1
  16. package/dist/scripts/phase-runner.d.ts.map +1 -1
  17. package/dist/scripts/phase-runner.js +295 -522
  18. package/dist/scripts/phase-runner.js.map +1 -1
  19. package/dist/scripts/pre-flight-check.d.ts.map +1 -1
  20. package/dist/scripts/pre-flight-check.js +10 -6
  21. package/dist/scripts/pre-flight-check.js.map +1 -1
  22. package/dist/scripts/resource-dashboard.js.map +1 -1
  23. package/dist/scripts/spec-impl-workflow.js +1 -1
  24. package/dist/scripts/spec-impl-workflow.js.map +1 -1
  25. package/dist/scripts/template/renderer.d.ts +1 -1
  26. package/dist/scripts/template/renderer.d.ts.map +1 -1
  27. package/dist/scripts/test-interactive.d.ts.map +1 -1
  28. package/dist/scripts/test-interactive.js +0 -15
  29. package/dist/scripts/test-interactive.js.map +1 -1
  30. package/dist/scripts/test-new-features.js +6 -3
  31. package/dist/scripts/test-new-features.js.map +1 -1
  32. package/dist/scripts/test-spec-generator.d.ts.map +1 -1
  33. package/dist/scripts/test-spec-generator.js +1 -2
  34. package/dist/scripts/test-spec-generator.js.map +1 -1
  35. package/dist/scripts/utils/config-loader.d.ts +7 -2
  36. package/dist/scripts/utils/config-loader.d.ts.map +1 -1
  37. package/dist/scripts/utils/config-loader.js +79 -8
  38. package/dist/scripts/utils/config-loader.js.map +1 -1
  39. package/dist/scripts/utils/config-sections.d.ts +54 -0
  40. package/dist/scripts/utils/config-sections.d.ts.map +1 -0
  41. package/dist/scripts/utils/config-sections.js +178 -0
  42. package/dist/scripts/utils/config-sections.js.map +1 -0
  43. package/dist/scripts/utils/config-validator.d.ts +4 -0
  44. package/dist/scripts/utils/config-validator.d.ts.map +1 -1
  45. package/dist/scripts/utils/config-validator.js +57 -1
  46. package/dist/scripts/utils/config-validator.js.map +1 -1
  47. package/dist/scripts/utils/confluence-approval.d.ts.map +1 -1
  48. package/dist/scripts/utils/confluence-approval.js +5 -3
  49. package/dist/scripts/utils/confluence-approval.js.map +1 -1
  50. package/dist/scripts/utils/confluence-hierarchy.d.ts.map +1 -1
  51. package/dist/scripts/utils/confluence-hierarchy.js.map +1 -1
  52. package/dist/scripts/utils/interactive-helpers.d.ts +32 -0
  53. package/dist/scripts/utils/interactive-helpers.d.ts.map +1 -0
  54. package/dist/scripts/utils/interactive-helpers.js +92 -0
  55. package/dist/scripts/utils/interactive-helpers.js.map +1 -0
  56. package/dist/scripts/utils/jira-issue-type-fetcher.d.ts.map +1 -1
  57. package/dist/scripts/utils/jira-issue-type-fetcher.js +27 -18
  58. package/dist/scripts/utils/jira-issue-type-fetcher.js.map +1 -1
  59. package/dist/scripts/utils/release-notes-generator.d.ts.map +1 -1
  60. package/dist/scripts/utils/release-notes-generator.js +2 -1
  61. package/dist/scripts/utils/release-notes-generator.js.map +1 -1
  62. package/dist/scripts/utils/spec-updater.d.ts +19 -0
  63. package/dist/scripts/utils/spec-updater.d.ts.map +1 -1
  64. package/dist/scripts/utils/spec-updater.js.map +1 -1
  65. package/dist/scripts/utils/tasks-converter.d.ts.map +1 -1
  66. package/dist/scripts/utils/tasks-converter.js +2 -2
  67. package/dist/scripts/utils/tasks-converter.js.map +1 -1
  68. package/dist/scripts/utils/tasks-format-validator.d.ts.map +1 -1
  69. package/dist/scripts/utils/tasks-format-validator.js +0 -12
  70. package/dist/scripts/utils/tasks-format-validator.js.map +1 -1
  71. package/dist/scripts/utils/test-runner.d.ts.map +1 -1
  72. package/dist/scripts/utils/test-runner.js +3 -2
  73. package/dist/scripts/utils/test-runner.js.map +1 -1
  74. package/dist/scripts/validate-phase.d.ts +1 -1
  75. package/dist/scripts/validate-phase.d.ts.map +1 -1
  76. package/dist/scripts/validate-phase.js +12 -62
  77. package/dist/scripts/validate-phase.js.map +1 -1
  78. package/dist/scripts/workflow-orchestrator.d.ts.map +1 -1
  79. package/dist/scripts/workflow-orchestrator.js +11 -16
  80. package/dist/scripts/workflow-orchestrator.js.map +1 -1
  81. package/dist/src/__tests__/integration/setup/init.test.d.ts +5 -0
  82. package/dist/src/__tests__/integration/setup/init.test.d.ts.map +1 -0
  83. package/dist/src/__tests__/integration/setup/init.test.js +352 -0
  84. package/dist/src/__tests__/integration/setup/init.test.js.map +1 -0
  85. package/dist/src/cli.d.ts.map +1 -1
  86. package/dist/src/cli.js +28 -20
  87. package/dist/src/cli.js.map +1 -1
  88. package/dist/src/commands/init.d.ts +28 -0
  89. package/dist/src/commands/init.d.ts.map +1 -0
  90. package/dist/src/commands/init.js +490 -0
  91. package/dist/src/commands/init.js.map +1 -0
  92. package/docs/user-guide/getting-started/setup.md +31 -3
  93. package/docs/user-guide/guides/customization.md +64 -11
  94. package/docs/user-guide/guides/workflow.md +35 -21
  95. package/docs/user-guide/reference/config.md +30 -5
  96. package/docs/user-guide/reference/quick-reference.md +68 -74
  97. package/docs/user-guide/testing/test-planning-flow.md +4 -0
  98. package/package.json +2 -4
  99. package/scripts/config-global.ts +160 -0
  100. package/scripts/confluence-sync.ts +91 -27
  101. package/scripts/jira-sync.ts +284 -218
  102. package/scripts/list-projects.ts +2 -2
  103. package/scripts/multi-project-estimate.ts +3 -3
  104. package/scripts/phase-runner.ts +391 -594
  105. package/scripts/pre-flight-check.ts +20 -9
  106. package/scripts/pre-publish-check.sh +3 -34
  107. package/scripts/resource-dashboard.ts +4 -4
  108. package/scripts/spec-impl-workflow.ts +1 -1
  109. package/scripts/template/renderer.ts +1 -1
  110. package/scripts/test-interactive.ts +0 -19
  111. package/scripts/test-new-features.ts +10 -7
  112. package/scripts/test-npm-package.sh +3 -34
  113. package/scripts/test-spec-generator.ts +3 -7
  114. package/scripts/utils/config-loader.ts +107 -26
  115. package/scripts/utils/config-sections.ts +316 -0
  116. package/scripts/utils/config-validator.ts +66 -1
  117. package/scripts/utils/confluence-approval.ts +8 -6
  118. package/scripts/utils/confluence-hierarchy.ts +27 -27
  119. package/scripts/utils/interactive-helpers.ts +135 -0
  120. package/scripts/utils/jira-issue-type-fetcher.ts +29 -21
  121. package/scripts/utils/release-notes-generator.ts +3 -2
  122. package/scripts/utils/spec-updater.ts +37 -15
  123. package/scripts/utils/tasks-converter.ts +4 -6
  124. package/scripts/utils/tasks-format-validator.ts +0 -13
  125. package/scripts/utils/test-runner.ts +4 -3
  126. package/scripts/validate-phase.ts +21 -80
  127. package/scripts/workflow-orchestrator.ts +16 -25
  128. package/templates/claude/commands/kiro/kiro-spec-impl.md +4 -0
  129. package/templates/claude/commands/kiro/kiro-spec-tasks.md +3 -1
  130. package/templates/claude/commands/michi/confluence-sync.md +8 -2
  131. package/templates/claude/commands/michi/design-review.md +4 -0
  132. package/templates/claude/commands/michi/e2e-plan.md +4 -0
  133. package/templates/claude/commands/michi/license-check.md +4 -0
  134. package/templates/claude/commands/michi/pr-resolve.md +4 -0
  135. package/templates/claude/commands/michi/project-switch.md +8 -2
  136. package/templates/claude/commands/michi/spec-design.md +78 -0
  137. package/templates/claude/commands/michi/spec-impl.md +716 -0
  138. package/templates/claude/commands/michi/test-planning.md +174 -0
  139. package/templates/claude/commands/michi/validate-design.md +58 -0
  140. package/templates/claude/commands/michi/version-audit.md +4 -0
  141. package/templates/michi/cc-sdd-overrides/README.md +8 -0
  142. package/templates/michi/cc-sdd-overrides/settings/rules/design-review-michi.md +53 -0
  143. package/dist/scripts/config-interactive.d.ts +0 -10
  144. package/dist/scripts/config-interactive.d.ts.map +0 -1
  145. package/dist/scripts/config-interactive.js +0 -372
  146. package/dist/scripts/config-interactive.js.map +0 -1
  147. package/dist/scripts/setup-existing-project.d.ts +0 -15
  148. package/dist/scripts/setup-existing-project.d.ts.map +0 -1
  149. package/dist/scripts/setup-existing-project.js +0 -455
  150. package/dist/scripts/setup-existing-project.js.map +0 -1
  151. package/dist/scripts/setup-interactive.d.ts +0 -10
  152. package/dist/scripts/setup-interactive.d.ts.map +0 -1
  153. package/dist/scripts/setup-interactive.js +0 -413
  154. package/dist/scripts/setup-interactive.js.map +0 -1
  155. package/scripts/config-interactive.ts +0 -550
  156. package/scripts/setup-existing-project.ts +0 -585
  157. package/scripts/setup-interactive.ts +0 -565
@@ -1,585 +0,0 @@
1
- #!/usr/bin/env tsx
2
- /**
3
- * 既存プロジェクトにMichiワークフローを追加するスクリプト
4
- *
5
- * 使い方:
6
- * cd /path/to/existing-repo
7
- * npx tsx /path/to/michi/scripts/setup-existing-project.ts \
8
- * --michi-path /path/to/michi \
9
- * --project-name "既存プロジェクト" \
10
- * --jira-key "EXIST" \
11
- * --environment cursor \
12
- * --lang ja
13
- */
14
-
15
- import {
16
- cpSync,
17
- existsSync,
18
- mkdirSync,
19
- writeFileSync,
20
- readFileSync,
21
- readdirSync,
22
- } from 'fs';
23
- import { resolve, join, basename, dirname } from 'path';
24
- import { fileURLToPath } from 'url';
25
- import { execSync } from 'child_process';
26
- import { findRepositoryRoot } from './utils/project-finder.js';
27
- import {
28
- type Environment,
29
- getEnvironmentConfig,
30
- isSupportedEnvironment,
31
- } from './constants/environments.js';
32
- import {
33
- type SupportedLanguage,
34
- isSupportedLanguage,
35
- } from './constants/languages.js';
36
- import { createTemplateContext, renderTemplate } from './template/renderer.js';
37
-
38
- // ES module で __dirname を取得
39
- const __filename = fileURLToPath(import.meta.url);
40
- const __dirname = dirname(__filename);
41
-
42
- interface SetupConfig {
43
- michiPath: string; // Michiリポジトリのパス
44
- projectName: string; // プロジェクト表示名
45
- jiraKey: string; // JIRAプロジェクトキー
46
- labels?: string[]; // Confluenceラベル(オプション)
47
- environment: Environment; // cc-sdd環境: 'claude' | 'claude-agent' | 'cursor'
48
- langCode: SupportedLanguage; // 言語コード: 'ja'
49
- }
50
-
51
- function parseArgs(): SetupConfig {
52
- const args = process.argv.slice(2);
53
- const config: Partial<SetupConfig> = {};
54
-
55
- for (let i = 0; i < args.length; i += 2) {
56
- const key = args[i].replace(/^--/, '');
57
- const value = args[i + 1];
58
-
59
- switch (key) {
60
- case 'michi-path':
61
- config.michiPath = value;
62
- break;
63
- case 'project-name':
64
- config.projectName = value;
65
- break;
66
- case 'jira-key':
67
- config.jiraKey = value;
68
- break;
69
- case 'environment':
70
- config.environment = value as Environment;
71
- break;
72
- case 'lang':
73
- config.langCode = value as SupportedLanguage;
74
- break;
75
- }
76
- }
77
-
78
- // デフォルト値
79
- if (!config.michiPath) {
80
- config.michiPath = resolve(__dirname, '..');
81
- }
82
- if (!config.environment) {
83
- config.environment = 'claude';
84
- }
85
- if (!config.langCode) {
86
- config.langCode = 'ja';
87
- }
88
-
89
- // 必須フィールドチェック
90
- if (!config.projectName || !config.jiraKey) {
91
- console.error('Missing required parameters');
92
- console.error(
93
- 'Usage: tsx setup-existing-project.ts --project-name <name> --jira-key <key> [--michi-path <path>] [--environment <env>] [--lang <code>]',
94
- );
95
- process.exit(1);
96
- }
97
-
98
- // 環境バリデーション
99
- if (!isSupportedEnvironment(config.environment)) {
100
- console.error(`Unsupported environment: ${config.environment}`);
101
- console.error('Supported environments: claude, claude-agent, cursor');
102
- process.exit(1);
103
- }
104
-
105
- // 言語バリデーション
106
- if (!isSupportedLanguage(config.langCode)) {
107
- console.error(`Unsupported language: ${config.langCode}`);
108
- console.error(
109
- 'Supported languages: ja, en, zh-TW, zh, es, pt, de, fr, ru, it, ko, ar',
110
- );
111
- process.exit(1);
112
- }
113
-
114
- return config as SetupConfig;
115
- }
116
-
117
- /**
118
- * Copy and render templates recursively
119
- *
120
- * @param sourceDir - Source directory containing templates
121
- * @param destDir - Destination directory for rendered files
122
- * @param context - Template context for rendering
123
- */
124
- function copyAndRenderTemplates(
125
- sourceDir: string,
126
- destDir: string,
127
- context: ReturnType<typeof createTemplateContext>,
128
- ): void {
129
- const entries = readdirSync(sourceDir, { withFileTypes: true });
130
-
131
- for (const entry of entries) {
132
- const sourcePath = join(sourceDir, entry.name);
133
- const destPath = join(destDir, entry.name);
134
-
135
- if (entry.isDirectory()) {
136
- // ディレクトリは再帰的にコピー
137
- mkdirSync(destPath, { recursive: true });
138
- copyAndRenderTemplates(sourcePath, destPath, context);
139
- } else if (entry.isFile()) {
140
- // ファイルはレンダリングしてコピー
141
- const content = readFileSync(sourcePath, 'utf-8');
142
- const rendered = renderTemplate(content, context);
143
- writeFileSync(destPath, rendered, 'utf-8');
144
- }
145
- }
146
- }
147
-
148
- async function setupExistingProject(config: SetupConfig): Promise<void> {
149
- const currentDir = process.cwd();
150
- const projectId = basename(currentDir);
151
-
152
- console.log('🚀 既存プロジェクトにMichiワークフローを追加');
153
- console.log(` プロジェクト: ${config.projectName}`);
154
- console.log(` ディレクトリ: ${currentDir}`);
155
- console.log(` Michiパス: ${config.michiPath}`);
156
- console.log(` 環境: ${config.environment}`);
157
- console.log(` 言語: ${config.langCode}`);
158
- console.log('');
159
-
160
- // リポジトリルートを検出
161
- const repoRoot = findRepositoryRoot(currentDir);
162
-
163
- // projects/{project-id}/配下にプロジェクトを作成
164
- const projectsDir = join(repoRoot, 'projects');
165
- const projectDir = join(projectsDir, projectId);
166
-
167
- console.log(`📁 リポジトリルート: ${repoRoot}`);
168
- console.log(`📁 プロジェクトディレクトリ: ${projectDir}`);
169
- console.log('');
170
-
171
- // projects/ディレクトリとプロジェクトディレクトリを作成
172
- if (!existsSync(projectsDir)) {
173
- mkdirSync(projectsDir, { recursive: true });
174
- console.log(` ✅ Created: ${projectsDir}`);
175
- }
176
- if (!existsSync(projectDir)) {
177
- mkdirSync(projectDir, { recursive: true });
178
- console.log(` ✅ Created: ${projectDir}`);
179
- }
180
-
181
- // 元の作業ディレクトリを保存
182
- const originalCwd = process.cwd();
183
-
184
- try {
185
- // プロジェクトディレクトリに移動
186
- process.chdir(projectDir);
187
-
188
- // Step 1: cc-sdd導入確認
189
- console.log('\n📦 Step 1: Checking cc-sdd installation...');
190
- if (!existsSync('.cursor/commands/kiro')) {
191
- console.log(' Installing cc-sdd...');
192
- execSync('npx cc-sdd@latest --cursor --lang ja --yes', {
193
- stdio: 'inherit',
194
- });
195
- console.log(' ✅ cc-sdd installed');
196
- } else {
197
- console.log(' ✅ cc-sdd already installed');
198
- }
199
-
200
- // Step 2: .kiro ディレクトリ作成
201
- console.log('\n📁 Step 2: Creating .kiro directory structure...');
202
- mkdirSync('.kiro/settings/templates', { recursive: true });
203
- mkdirSync('.kiro/steering', { recursive: true });
204
- mkdirSync('.kiro/specs', { recursive: true });
205
- console.log(' ✅ Directory structure created');
206
-
207
- // Step 3: プロジェクトメタデータ作成
208
- console.log('\n📝 Step 3: Creating project metadata...');
209
-
210
- // GitHub URLを取得(既存リポジトリから)
211
- let repoUrl = '';
212
- try {
213
- repoUrl = execSync('git config --get remote.origin.url', {
214
- encoding: 'utf-8',
215
- cwd: repoRoot,
216
- }).trim();
217
- // SSH形式をHTTPS形式に変換
218
- if (repoUrl.startsWith('git@github.com:')) {
219
- repoUrl = repoUrl
220
- .replace('git@github.com:', 'https://github.com/')
221
- .replace('.git', '');
222
- }
223
- } catch {
224
- repoUrl = `https://github.com/org/${projectId}`;
225
- }
226
-
227
- const labels =
228
- config.labels ||
229
- (() => {
230
- // プロジェクトIDからプロジェクトラベル生成
231
- const projectLabel = projectId.toLowerCase().replace(/[^a-z0-9-]/g, '');
232
- const labelSet = new Set([`project:${projectLabel}`]);
233
-
234
- // ハイフンが存在する場合のみサービスラベルを生成
235
- if (projectId.includes('-')) {
236
- const parts = projectId.split('-');
237
- const servicePart = parts[parts.length - 1];
238
- const serviceLabel = servicePart
239
- .toLowerCase()
240
- .replace(/[^a-z0-9-]/g, '');
241
-
242
- // サービスラベルがプロジェクトラベルと異なる場合のみ追加
243
- if (serviceLabel !== projectLabel) {
244
- labelSet.add(`service:${serviceLabel}`);
245
- }
246
- }
247
-
248
- return Array.from(labelSet);
249
- })();
250
-
251
- const projectJson = {
252
- projectId,
253
- projectName: config.projectName,
254
- language: config.langCode,
255
- jiraProjectKey: config.jiraKey,
256
- confluenceLabels: labels,
257
- status: 'active',
258
- team: [],
259
- stakeholders: ['@企画', '@部長'],
260
- repository: repoUrl,
261
- description: `${config.projectName}の開発`,
262
- };
263
-
264
- writeFileSync('.kiro/project.json', JSON.stringify(projectJson, null, 2));
265
- console.log(' ✅ project.json created');
266
-
267
- // Step 4: 環境別テンプレートのコピーとレンダリング
268
- console.log('\n📋 Step 4: Copying and rendering templates from Michi...');
269
-
270
- const envConfig = getEnvironmentConfig(config.environment);
271
- const templateContext = createTemplateContext(
272
- config.langCode,
273
- '.kiro',
274
- envConfig.rulesDir.startsWith('.')
275
- ? envConfig.rulesDir.substring(1, envConfig.rulesDir.indexOf('/', 1))
276
- : envConfig.rulesDir.split('/')[0],
277
- );
278
-
279
- // テンプレートソースディレクトリ
280
- const templateSourceDir = join(
281
- config.michiPath,
282
- 'templates',
283
- envConfig.templateSource,
284
- );
285
-
286
- if (!existsSync(templateSourceDir)) {
287
- console.log(` ⚠️ Template source not found: ${templateSourceDir}`);
288
- console.log(' Skipping template copy');
289
- } else {
290
- // rulesディレクトリのコピーとレンダリング(環境別にテンプレートディレクトリ名が異なる)
291
- // cursor/claude: 'rules', claude-agent: 'agents'
292
- const templateDirName =
293
- config.environment === 'claude-agent' ? 'agents' : 'rules';
294
- const rulesTemplateDir = join(templateSourceDir, templateDirName);
295
- const rulesDestDir = join(projectDir, envConfig.rulesDir);
296
-
297
- if (existsSync(rulesTemplateDir)) {
298
- mkdirSync(rulesDestDir, { recursive: true });
299
- copyAndRenderTemplates(rulesTemplateDir, rulesDestDir, templateContext);
300
- console.log(` ✅ Rules copied and rendered to ${envConfig.rulesDir}`);
301
- }
302
-
303
- // commandsディレクトリのコピーとレンダリング
304
- const commandsTemplateDir = join(templateSourceDir, 'commands');
305
- const commandsDestDir = join(projectDir, envConfig.commandsDir);
306
-
307
- if (existsSync(commandsTemplateDir)) {
308
- mkdirSync(commandsDestDir, { recursive: true });
309
- copyAndRenderTemplates(
310
- commandsTemplateDir,
311
- commandsDestDir,
312
- templateContext,
313
- );
314
- console.log(
315
- ` ✅ Commands copied and rendered to ${envConfig.commandsDir}`,
316
- );
317
- }
318
- }
319
-
320
- // Step 5: Steeringテンプレートをコピー
321
- console.log('\n📚 Step 5: Copying steering templates...');
322
-
323
- const steeringDir = join(config.michiPath, '.kiro/steering');
324
- if (existsSync(steeringDir)) {
325
- cpSync(steeringDir, join(projectDir, '.kiro/steering'), {
326
- recursive: true,
327
- });
328
- console.log(' ✅ product.md, tech.md, structure.md');
329
- }
330
-
331
- // Step 6: テンプレートをコピー
332
- console.log('\n📄 Step 6: Copying spec templates...');
333
-
334
- const templatesDir = join(config.michiPath, '.kiro/settings/templates');
335
- if (existsSync(templatesDir)) {
336
- cpSync(templatesDir, join(projectDir, '.kiro/settings/templates'), {
337
- recursive: true,
338
- });
339
- console.log(' ✅ requirements.md, design.md, tasks.md');
340
- }
341
-
342
- // Step 6.1: kiro-spec-tasksテンプレートを上書き(cc-sddのAI-DLC形式をMichiワークフロー形式に置換)
343
- console.log('\n📋 Step 6.1: Overriding kiro-spec-tasks template...');
344
- const kiroSpecTasksSource = join(
345
- config.michiPath,
346
- 'templates',
347
- envConfig.templateSource,
348
- 'commands',
349
- 'kiro',
350
- 'kiro-spec-tasks.md',
351
- );
352
- const kiroSpecTasksDest = join(projectDir, '.kiro', 'commands', 'kiro');
353
-
354
- if (existsSync(kiroSpecTasksSource)) {
355
- mkdirSync(kiroSpecTasksDest, { recursive: true });
356
- cpSync(
357
- kiroSpecTasksSource,
358
- join(kiroSpecTasksDest, 'kiro-spec-tasks.md'),
359
- );
360
- console.log(
361
- ' ✅ kiro-spec-tasks.md overridden with Michi workflow format',
362
- );
363
- console.log(
364
- ' (This ensures /kiro:spec-tasks generates Phase-based tasks.md)',
365
- );
366
- } else {
367
- console.log(
368
- ` ⚠️ kiro-spec-tasks template not found: ${kiroSpecTasksSource}`,
369
- );
370
- console.log(' (cc-sdd default template will be used)');
371
- }
372
-
373
- // Step 7: CLIツールのセットアップ案内
374
- console.log('\n⚙️ Step 7: Setting up Michi CLI...');
375
- console.log(' ✅ Michi CLI setup complete!');
376
- console.log('');
377
- console.log(' 📋 使用方法:');
378
- console.log(' npx @sk8metal/michi-cli jira:sync <feature>');
379
- console.log(
380
- ' npx @sk8metal/michi-cli confluence:sync <feature> requirements',
381
- );
382
- console.log(' npx @sk8metal/michi-cli phase:run <feature> tasks');
383
- console.log('');
384
- console.log(' または、グローバルインストール:');
385
- console.log(' npm install -g @sk8metal/michi-cli');
386
- console.log(' michi jira:sync <feature>');
387
-
388
- // Step 8: package.json と tsconfig.json をリポジトリルートにコピー
389
- console.log('\n📦 Step 8: Setting up package.json and TypeScript...');
390
-
391
- // 既存の package.json があるかチェック(リポジトリルート)
392
- const hasPackageJson = existsSync(join(repoRoot, 'package.json'));
393
-
394
- if (!hasPackageJson) {
395
- // package.json がない場合はリポジトリルートにコピー
396
- const src = join(config.michiPath, 'package.json');
397
- const dest = join(repoRoot, 'package.json');
398
- if (existsSync(src)) {
399
- cpSync(src, dest);
400
- console.log(' ✅ package.json created (in repository root)');
401
- }
402
- } else {
403
- // 既存の package.json にスクリプトを追加
404
- console.log(' ℹ️ Existing package.json found');
405
- console.log(' 📝 手動で以下のスクリプトを追加してください:');
406
- console.log('');
407
- console.log(' "scripts": {');
408
- console.log(' "jira:sync": "npx @sk8metal/michi-cli jira:sync",');
409
- console.log(
410
- ' "confluence:sync": "npx @sk8metal/michi-cli confluence:sync",',
411
- );
412
- console.log(' "phase:run": "npx @sk8metal/michi-cli phase:run",');
413
- console.log(
414
- ' "validate:phase": "npx @sk8metal/michi-cli validate:phase",',
415
- );
416
- console.log(' "preflight": "npx @sk8metal/michi-cli preflight",');
417
- console.log(
418
- ' "project:list": "npx @sk8metal/michi-cli project:list",',
419
- );
420
- console.log(
421
- ' "project:dashboard": "npx @sk8metal/michi-cli project:dashboard",',
422
- );
423
- console.log(
424
- ' "workflow:run": "npx @sk8metal/michi-cli workflow:run"',
425
- );
426
- console.log(' }');
427
- console.log('');
428
- }
429
-
430
- // tsconfig.json をリポジトリルートにコピー
431
- if (!existsSync(join(repoRoot, 'tsconfig.json'))) {
432
- const src = join(config.michiPath, 'tsconfig.json');
433
- const dest = join(repoRoot, 'tsconfig.json');
434
- if (existsSync(src)) {
435
- cpSync(src, dest);
436
- console.log(' ✅ tsconfig.json created (in repository root)');
437
- }
438
- } else {
439
- console.log(' ℹ️ Existing tsconfig.json found (kept)');
440
- }
441
-
442
- // Step 9: .env テンプレート作成(プロジェクトディレクトリに)
443
- console.log('\n🔐 Step 9: Creating .env template...');
444
-
445
- const envTemplate = `# Atlassian設定(MCP + REST API共通)
446
- ATLASSIAN_URL=https://your-domain.atlassian.net
447
- ATLASSIAN_EMAIL=your-email@company.com
448
- ATLASSIAN_API_TOKEN=your-token-here
449
-
450
- # GitHub設定
451
- GITHUB_ORG=your-org
452
- GITHUB_TOKEN=ghp_xxx
453
- GITHUB_REPO=${repoUrl.replace('https://github.com/', '')}
454
-
455
- # Confluence共有スペース
456
- CONFLUENCE_PRD_SPACE=PRD
457
- CONFLUENCE_QA_SPACE=QA
458
- CONFLUENCE_RELEASE_SPACE=RELEASE
459
-
460
- # JIRAプロジェクトキー
461
- JIRA_PROJECT_KEYS=${config.jiraKey}
462
- `;
463
-
464
- if (!existsSync(join(projectDir, '.env'))) {
465
- writeFileSync(join(projectDir, '.env'), envTemplate);
466
- console.log(' ✅ .env template created');
467
- } else {
468
- console.log(' ℹ️ .env already exists (kept)');
469
- }
470
-
471
- // Step 10: README.md を更新(オプション、プロジェクトディレクトリに)
472
- console.log('\n📖 Step 10: Updating documentation...');
473
-
474
- const readmePath = join(projectDir, 'README.md');
475
- if (existsSync(readmePath)) {
476
- const currentReadme = readFileSync(readmePath, 'utf-8');
477
-
478
- // Michiワークフロー情報を追加
479
- const workflowSection = `
480
-
481
- ## AI開発ワークフロー
482
-
483
- このプロジェクトは Michi AI開発フロー自動化システムを使用しています。
484
-
485
- ### 開発フロー
486
-
487
- \`\`\`
488
- /kiro:spec-init <機能説明>
489
- → /kiro:spec-requirements <feature>
490
- → /kiro:spec-design <feature>
491
- → /kiro:spec-tasks <feature>
492
- → /kiro:spec-impl <feature> <tasks>
493
- \`\`\`
494
-
495
- ### Confluence/JIRA連携
496
-
497
- \`\`\`bash
498
- npm run confluence:sync <feature> # Confluence同期
499
- npm run jira:sync <feature> # JIRA連携
500
- npm run github:create-pr <branch> # PR作成
501
- \`\`\`
502
-
503
- 詳細: [Michi Documentation](https://github.com/sk8metalme/michi)
504
- `;
505
-
506
- if (!currentReadme.includes('AI開発ワークフロー')) {
507
- writeFileSync(readmePath, currentReadme + workflowSection);
508
- console.log(' ✅ README.md updated');
509
- } else {
510
- console.log(' ℹ️ README.md already has workflow section');
511
- }
512
- }
513
-
514
- // Step 11: .gitignore 更新(リポジトリルートに)
515
- console.log('\n🚫 Step 11: Updating .gitignore...');
516
-
517
- const gitignoreEntries = [
518
- '# AI Development Workflow',
519
- 'node_modules/',
520
- '.env',
521
- '.env.local',
522
- 'dist/',
523
- '*.log',
524
- ];
525
-
526
- const gitignorePath = join(repoRoot, '.gitignore');
527
- let gitignore = '';
528
- if (existsSync(gitignorePath)) {
529
- gitignore = readFileSync(gitignorePath, 'utf-8');
530
- }
531
-
532
- let updated = false;
533
- for (const entry of gitignoreEntries) {
534
- if (!gitignore.includes(entry)) {
535
- gitignore += `\n${entry}`;
536
- updated = true;
537
- }
538
- }
539
-
540
- if (updated) {
541
- writeFileSync(gitignorePath, gitignore);
542
- console.log(' ✅ .gitignore updated (in repository root)');
543
- } else {
544
- console.log(' ℹ️ .gitignore already up to date');
545
- }
546
-
547
- // 完了メッセージ
548
- console.log('\n');
549
- console.log('🎉 セットアップ完了!');
550
- console.log('');
551
- console.log('次のステップ:');
552
- console.log(` 1. cd ${projectDir}`);
553
- console.log(' 2. .env ファイルを編集して認証情報を設定');
554
- console.log(' 3. package.json が既存の場合、スクリプトを手動追加');
555
- console.log(
556
- ' 4. npm install で依存関係をインストール(リポジトリルートで実行)',
557
- );
558
- console.log(
559
- ` 5. cc-sddを導入: npx cc-sdd@latest --lang ${config.langCode} --${config.environment}`,
560
- );
561
- console.log(' 6. jj commit でセットアップをコミット');
562
- console.log(' 7. Cursor で開く: cursor .');
563
- console.log(' 8. /kiro:spec-init <機能説明> で開発開始');
564
- console.log('');
565
- console.log('作成されたファイル:');
566
- console.log(` - ${projectDir}/.kiro/project.json`);
567
- console.log(` - ${projectDir}/${envConfig.rulesDir}/`);
568
- console.log(` - ${projectDir}/${envConfig.commandsDir}/`);
569
- console.log(` - ${projectDir}/.kiro/steering/ (3ファイル)`);
570
- console.log(` - ${projectDir}/.kiro/settings/templates/ (3ファイル)`);
571
- console.log(` - ${repoRoot}/package.json (新規の場合)`);
572
- console.log(` - ${repoRoot}/tsconfig.json (新規の場合)`);
573
- console.log(` - ${projectDir}/.env (テンプレート)`);
574
- } finally {
575
- // 元の作業ディレクトリに戻る
576
- process.chdir(originalCwd);
577
- }
578
- }
579
-
580
- // 実行
581
- const config = parseArgs();
582
- setupExistingProject(config).catch((error) => {
583
- console.error('❌ Error:', error.message);
584
- process.exit(1);
585
- });