@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.
- package/CHANGELOG.md +43 -0
- package/dist/scripts/config-global.d.ts +10 -0
- package/dist/scripts/config-global.d.ts.map +1 -0
- package/dist/scripts/config-global.js +111 -0
- package/dist/scripts/config-global.js.map +1 -0
- package/dist/scripts/confluence-sync.d.ts +22 -4
- package/dist/scripts/confluence-sync.d.ts.map +1 -1
- package/dist/scripts/confluence-sync.js +22 -12
- package/dist/scripts/confluence-sync.js.map +1 -1
- package/dist/scripts/jira-sync.d.ts.map +1 -1
- package/dist/scripts/jira-sync.js +201 -167
- package/dist/scripts/jira-sync.js.map +1 -1
- package/dist/scripts/list-projects.js.map +1 -1
- package/dist/scripts/multi-project-estimate.js.map +1 -1
- package/dist/scripts/phase-runner.d.ts +1 -1
- package/dist/scripts/phase-runner.d.ts.map +1 -1
- package/dist/scripts/phase-runner.js +295 -522
- package/dist/scripts/phase-runner.js.map +1 -1
- package/dist/scripts/pre-flight-check.d.ts.map +1 -1
- package/dist/scripts/pre-flight-check.js +10 -6
- package/dist/scripts/pre-flight-check.js.map +1 -1
- package/dist/scripts/resource-dashboard.js.map +1 -1
- package/dist/scripts/spec-impl-workflow.js +1 -1
- package/dist/scripts/spec-impl-workflow.js.map +1 -1
- package/dist/scripts/template/renderer.d.ts +1 -1
- package/dist/scripts/template/renderer.d.ts.map +1 -1
- package/dist/scripts/test-interactive.d.ts.map +1 -1
- package/dist/scripts/test-interactive.js +0 -15
- package/dist/scripts/test-interactive.js.map +1 -1
- package/dist/scripts/test-new-features.js +6 -3
- package/dist/scripts/test-new-features.js.map +1 -1
- package/dist/scripts/test-spec-generator.d.ts.map +1 -1
- package/dist/scripts/test-spec-generator.js +1 -2
- package/dist/scripts/test-spec-generator.js.map +1 -1
- package/dist/scripts/utils/config-loader.d.ts +7 -2
- package/dist/scripts/utils/config-loader.d.ts.map +1 -1
- package/dist/scripts/utils/config-loader.js +79 -8
- package/dist/scripts/utils/config-loader.js.map +1 -1
- package/dist/scripts/utils/config-sections.d.ts +54 -0
- package/dist/scripts/utils/config-sections.d.ts.map +1 -0
- package/dist/scripts/utils/config-sections.js +178 -0
- package/dist/scripts/utils/config-sections.js.map +1 -0
- package/dist/scripts/utils/config-validator.d.ts +4 -0
- package/dist/scripts/utils/config-validator.d.ts.map +1 -1
- package/dist/scripts/utils/config-validator.js +57 -1
- package/dist/scripts/utils/config-validator.js.map +1 -1
- package/dist/scripts/utils/confluence-approval.d.ts.map +1 -1
- package/dist/scripts/utils/confluence-approval.js +5 -3
- package/dist/scripts/utils/confluence-approval.js.map +1 -1
- package/dist/scripts/utils/confluence-hierarchy.d.ts.map +1 -1
- package/dist/scripts/utils/confluence-hierarchy.js.map +1 -1
- package/dist/scripts/utils/interactive-helpers.d.ts +32 -0
- package/dist/scripts/utils/interactive-helpers.d.ts.map +1 -0
- package/dist/scripts/utils/interactive-helpers.js +92 -0
- package/dist/scripts/utils/interactive-helpers.js.map +1 -0
- package/dist/scripts/utils/jira-issue-type-fetcher.d.ts.map +1 -1
- package/dist/scripts/utils/jira-issue-type-fetcher.js +27 -18
- package/dist/scripts/utils/jira-issue-type-fetcher.js.map +1 -1
- package/dist/scripts/utils/release-notes-generator.d.ts.map +1 -1
- package/dist/scripts/utils/release-notes-generator.js +2 -1
- package/dist/scripts/utils/release-notes-generator.js.map +1 -1
- package/dist/scripts/utils/spec-updater.d.ts +19 -0
- package/dist/scripts/utils/spec-updater.d.ts.map +1 -1
- package/dist/scripts/utils/spec-updater.js.map +1 -1
- package/dist/scripts/utils/tasks-converter.d.ts.map +1 -1
- package/dist/scripts/utils/tasks-converter.js +2 -2
- package/dist/scripts/utils/tasks-converter.js.map +1 -1
- package/dist/scripts/utils/tasks-format-validator.d.ts.map +1 -1
- package/dist/scripts/utils/tasks-format-validator.js +0 -12
- package/dist/scripts/utils/tasks-format-validator.js.map +1 -1
- package/dist/scripts/utils/test-runner.d.ts.map +1 -1
- package/dist/scripts/utils/test-runner.js +3 -2
- package/dist/scripts/utils/test-runner.js.map +1 -1
- package/dist/scripts/validate-phase.d.ts +1 -1
- package/dist/scripts/validate-phase.d.ts.map +1 -1
- package/dist/scripts/validate-phase.js +12 -62
- package/dist/scripts/validate-phase.js.map +1 -1
- package/dist/scripts/workflow-orchestrator.d.ts.map +1 -1
- package/dist/scripts/workflow-orchestrator.js +11 -16
- package/dist/scripts/workflow-orchestrator.js.map +1 -1
- package/dist/src/__tests__/integration/setup/init.test.d.ts +5 -0
- package/dist/src/__tests__/integration/setup/init.test.d.ts.map +1 -0
- package/dist/src/__tests__/integration/setup/init.test.js +352 -0
- package/dist/src/__tests__/integration/setup/init.test.js.map +1 -0
- package/dist/src/cli.d.ts.map +1 -1
- package/dist/src/cli.js +28 -20
- package/dist/src/cli.js.map +1 -1
- package/dist/src/commands/init.d.ts +28 -0
- package/dist/src/commands/init.d.ts.map +1 -0
- package/dist/src/commands/init.js +490 -0
- package/dist/src/commands/init.js.map +1 -0
- package/docs/user-guide/getting-started/setup.md +31 -3
- package/docs/user-guide/guides/customization.md +64 -11
- package/docs/user-guide/guides/workflow.md +35 -21
- package/docs/user-guide/reference/config.md +30 -5
- package/docs/user-guide/reference/quick-reference.md +68 -74
- package/docs/user-guide/testing/test-planning-flow.md +4 -0
- package/package.json +2 -4
- package/scripts/config-global.ts +160 -0
- package/scripts/confluence-sync.ts +91 -27
- package/scripts/jira-sync.ts +284 -218
- package/scripts/list-projects.ts +2 -2
- package/scripts/multi-project-estimate.ts +3 -3
- package/scripts/phase-runner.ts +391 -594
- package/scripts/pre-flight-check.ts +20 -9
- package/scripts/pre-publish-check.sh +3 -34
- package/scripts/resource-dashboard.ts +4 -4
- package/scripts/spec-impl-workflow.ts +1 -1
- package/scripts/template/renderer.ts +1 -1
- package/scripts/test-interactive.ts +0 -19
- package/scripts/test-new-features.ts +10 -7
- package/scripts/test-npm-package.sh +3 -34
- package/scripts/test-spec-generator.ts +3 -7
- package/scripts/utils/config-loader.ts +107 -26
- package/scripts/utils/config-sections.ts +316 -0
- package/scripts/utils/config-validator.ts +66 -1
- package/scripts/utils/confluence-approval.ts +8 -6
- package/scripts/utils/confluence-hierarchy.ts +27 -27
- package/scripts/utils/interactive-helpers.ts +135 -0
- package/scripts/utils/jira-issue-type-fetcher.ts +29 -21
- package/scripts/utils/release-notes-generator.ts +3 -2
- package/scripts/utils/spec-updater.ts +37 -15
- package/scripts/utils/tasks-converter.ts +4 -6
- package/scripts/utils/tasks-format-validator.ts +0 -13
- package/scripts/utils/test-runner.ts +4 -3
- package/scripts/validate-phase.ts +21 -80
- package/scripts/workflow-orchestrator.ts +16 -25
- package/templates/claude/commands/kiro/kiro-spec-impl.md +4 -0
- package/templates/claude/commands/kiro/kiro-spec-tasks.md +3 -1
- package/templates/claude/commands/michi/confluence-sync.md +8 -2
- package/templates/claude/commands/michi/design-review.md +4 -0
- package/templates/claude/commands/michi/e2e-plan.md +4 -0
- package/templates/claude/commands/michi/license-check.md +4 -0
- package/templates/claude/commands/michi/pr-resolve.md +4 -0
- package/templates/claude/commands/michi/project-switch.md +8 -2
- package/templates/claude/commands/michi/spec-design.md +78 -0
- package/templates/claude/commands/michi/spec-impl.md +716 -0
- package/templates/claude/commands/michi/test-planning.md +174 -0
- package/templates/claude/commands/michi/validate-design.md +58 -0
- package/templates/claude/commands/michi/version-audit.md +4 -0
- package/templates/michi/cc-sdd-overrides/README.md +8 -0
- package/templates/michi/cc-sdd-overrides/settings/rules/design-review-michi.md +53 -0
- package/dist/scripts/config-interactive.d.ts +0 -10
- package/dist/scripts/config-interactive.d.ts.map +0 -1
- package/dist/scripts/config-interactive.js +0 -372
- package/dist/scripts/config-interactive.js.map +0 -1
- package/dist/scripts/setup-existing-project.d.ts +0 -15
- package/dist/scripts/setup-existing-project.d.ts.map +0 -1
- package/dist/scripts/setup-existing-project.js +0 -455
- package/dist/scripts/setup-existing-project.js.map +0 -1
- package/dist/scripts/setup-interactive.d.ts +0 -10
- package/dist/scripts/setup-interactive.d.ts.map +0 -1
- package/dist/scripts/setup-interactive.js +0 -413
- package/dist/scripts/setup-interactive.js.map +0 -1
- package/scripts/config-interactive.ts +0 -550
- package/scripts/setup-existing-project.ts +0 -585
- package/scripts/setup-interactive.ts +0 -565
|
@@ -0,0 +1,490 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* init command
|
|
3
|
+
* プロジェクト初期設定を統合したコマンド
|
|
4
|
+
*
|
|
5
|
+
* 使い方:
|
|
6
|
+
* michi init [options]
|
|
7
|
+
*/
|
|
8
|
+
import { cpSync, existsSync, mkdirSync, writeFileSync, readFileSync, readdirSync, chmodSync, } from 'fs';
|
|
9
|
+
import { join, basename, dirname } from 'path';
|
|
10
|
+
import { fileURLToPath } from 'url';
|
|
11
|
+
import { execSync } from 'child_process';
|
|
12
|
+
import { findRepositoryRoot } from '../../scripts/utils/project-finder.js';
|
|
13
|
+
import { getEnvironmentConfig, } from '../../scripts/constants/environments.js';
|
|
14
|
+
import { isSupportedLanguage, } from '../../scripts/constants/languages.js';
|
|
15
|
+
import { createTemplateContext, renderTemplate, } from '../../scripts/template/renderer.js';
|
|
16
|
+
import * as readline from 'readline';
|
|
17
|
+
import { getConfluenceConfig, getJiraConfig, getWorkflowConfig, } from '../../scripts/utils/config-sections.js';
|
|
18
|
+
import { getGlobalConfigPath } from '../../scripts/utils/config-loader.js';
|
|
19
|
+
// ES module で __dirname を取得
|
|
20
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
21
|
+
const __dirname = dirname(__filename);
|
|
22
|
+
/**
|
|
23
|
+
* プロジェクトIDのバリデーション
|
|
24
|
+
*/
|
|
25
|
+
function validateProjectId(projectId) {
|
|
26
|
+
if (!projectId.trim() || /^\s+$/.test(projectId)) {
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
if (projectId.includes('..') || projectId.includes('/') || projectId.includes('\\')) {
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
return /^[A-Za-z0-9_-]+$/.test(projectId);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* プロジェクト名のバリデーション
|
|
36
|
+
*/
|
|
37
|
+
function validateProjectName(name) {
|
|
38
|
+
const trimmed = name.trim();
|
|
39
|
+
if (!trimmed || trimmed.length === 0) {
|
|
40
|
+
throw new Error('プロジェクト名が空です');
|
|
41
|
+
}
|
|
42
|
+
if (trimmed.length > 100) {
|
|
43
|
+
throw new Error('プロジェクト名が長すぎます(最大100文字)');
|
|
44
|
+
}
|
|
45
|
+
if (/[/\\]/.test(trimmed)) {
|
|
46
|
+
throw new Error('プロジェクト名にパス区切り文字(/ または \\)は使用できません');
|
|
47
|
+
}
|
|
48
|
+
if (/^\.\.?$|^\.\.?\//.test(trimmed)) {
|
|
49
|
+
throw new Error('プロジェクト名に相対パス(. または ..)は使用できません');
|
|
50
|
+
}
|
|
51
|
+
// eslint-disable-next-line no-control-regex
|
|
52
|
+
if (/[\x00-\x1F\x7F]/.test(trimmed)) {
|
|
53
|
+
throw new Error('プロジェクト名に制御文字は使用できません');
|
|
54
|
+
}
|
|
55
|
+
return trimmed;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* JIRAキーのバリデーション
|
|
59
|
+
*/
|
|
60
|
+
function validateJiraKey(key) {
|
|
61
|
+
const trimmed = key.trim().toUpperCase();
|
|
62
|
+
if (!/^[A-Z]{2,10}$/.test(trimmed)) {
|
|
63
|
+
throw new Error('JIRAキーの形式が不正です(2-10文字の大文字英字のみ、例: PRJA)');
|
|
64
|
+
}
|
|
65
|
+
return trimmed;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* 対話的にユーザー入力を取得
|
|
69
|
+
*/
|
|
70
|
+
async function prompt(question) {
|
|
71
|
+
const rl = readline.createInterface({
|
|
72
|
+
input: process.stdin,
|
|
73
|
+
output: process.stdout,
|
|
74
|
+
});
|
|
75
|
+
try {
|
|
76
|
+
return await new Promise((resolve) => {
|
|
77
|
+
rl.question(question, (answer) => {
|
|
78
|
+
resolve(answer.trim());
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
finally {
|
|
83
|
+
rl.close();
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* 環境を決定(オプションまたは対話的)
|
|
88
|
+
*/
|
|
89
|
+
async function determineEnvironment(options) {
|
|
90
|
+
if (options.cursor)
|
|
91
|
+
return 'cursor';
|
|
92
|
+
if (options.claude)
|
|
93
|
+
return 'claude';
|
|
94
|
+
if (options.claudeAgent)
|
|
95
|
+
return 'claude-agent';
|
|
96
|
+
if (options.gemini)
|
|
97
|
+
return 'gemini';
|
|
98
|
+
if (options.codex)
|
|
99
|
+
return 'codex';
|
|
100
|
+
if (options.cline)
|
|
101
|
+
return 'cline';
|
|
102
|
+
console.log('');
|
|
103
|
+
console.log('環境を選択してください:');
|
|
104
|
+
console.log(' 1) Cursor IDE (推奨)');
|
|
105
|
+
console.log(' 2) Claude Code');
|
|
106
|
+
console.log(' 3) Claude Code Subagents');
|
|
107
|
+
console.log(' 4) Gemini CLI');
|
|
108
|
+
console.log(' 5) Codex CLI');
|
|
109
|
+
console.log(' 6) Cline');
|
|
110
|
+
console.log('');
|
|
111
|
+
const choice = await prompt('選択 [1-6] (デフォルト: 1): ');
|
|
112
|
+
switch (choice || '1') {
|
|
113
|
+
case '1':
|
|
114
|
+
return 'cursor';
|
|
115
|
+
case '2':
|
|
116
|
+
return 'claude';
|
|
117
|
+
case '3':
|
|
118
|
+
return 'claude-agent';
|
|
119
|
+
case '4':
|
|
120
|
+
return 'gemini';
|
|
121
|
+
case '5':
|
|
122
|
+
return 'codex';
|
|
123
|
+
case '6':
|
|
124
|
+
return 'cline';
|
|
125
|
+
default:
|
|
126
|
+
console.log('無効な選択です。Cursor IDEを使用します。');
|
|
127
|
+
return 'cursor';
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* オプションから設定を構築(対話的プロンプトを含む)
|
|
132
|
+
*/
|
|
133
|
+
async function buildConfig(options, currentDir) {
|
|
134
|
+
// 環境を決定
|
|
135
|
+
const environment = await determineEnvironment(options);
|
|
136
|
+
// 言語コード
|
|
137
|
+
const langCode = (options.lang || 'ja');
|
|
138
|
+
if (!isSupportedLanguage(langCode)) {
|
|
139
|
+
throw new Error(`Unsupported language: ${langCode}`);
|
|
140
|
+
}
|
|
141
|
+
const projectIdDefault = options.name || basename(currentDir);
|
|
142
|
+
// プロジェクトID
|
|
143
|
+
let projectId = options.name;
|
|
144
|
+
if (!projectId && !options.yes) {
|
|
145
|
+
console.log('');
|
|
146
|
+
projectId = await prompt(`プロジェクトID [${projectIdDefault}]: `);
|
|
147
|
+
}
|
|
148
|
+
projectId = projectId || projectIdDefault;
|
|
149
|
+
if (!validateProjectId(projectId)) {
|
|
150
|
+
throw new Error('無効なプロジェクトIDです。英数字、ハイフン、アンダースコアのみ使用できます。');
|
|
151
|
+
}
|
|
152
|
+
// プロジェクト名
|
|
153
|
+
let projectName = options.projectName;
|
|
154
|
+
if (!projectName && !options.yes) {
|
|
155
|
+
projectName = await prompt('プロジェクト名(例: プロジェクトA): ');
|
|
156
|
+
}
|
|
157
|
+
if (!projectName) {
|
|
158
|
+
throw new Error('プロジェクト名は必須です');
|
|
159
|
+
}
|
|
160
|
+
projectName = validateProjectName(projectName);
|
|
161
|
+
// JIRAキー
|
|
162
|
+
let jiraKey = options.jiraKey;
|
|
163
|
+
if (!jiraKey && !options.yes) {
|
|
164
|
+
jiraKey = await prompt('JIRAプロジェクトキー(例: PRJA): ');
|
|
165
|
+
}
|
|
166
|
+
if (!jiraKey) {
|
|
167
|
+
throw new Error('JIRAプロジェクトキーは必須です');
|
|
168
|
+
}
|
|
169
|
+
jiraKey = validateJiraKey(jiraKey);
|
|
170
|
+
// 確認
|
|
171
|
+
if (!options.yes) {
|
|
172
|
+
console.log('');
|
|
173
|
+
console.log('✅ 設定:');
|
|
174
|
+
console.log(` プロジェクトID: ${projectId}`);
|
|
175
|
+
console.log(` プロジェクト名: ${projectName}`);
|
|
176
|
+
console.log(` JIRA: ${jiraKey}`);
|
|
177
|
+
console.log(` 環境: ${environment}`);
|
|
178
|
+
console.log(` 言語: ${langCode}`);
|
|
179
|
+
console.log('');
|
|
180
|
+
const confirm = await prompt('この設定で続行しますか? [Y/n]: ');
|
|
181
|
+
if (confirm.toLowerCase() === 'n') {
|
|
182
|
+
throw new Error('ユーザーによりキャンセルされました');
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
return {
|
|
186
|
+
projectId,
|
|
187
|
+
projectName,
|
|
188
|
+
jiraKey,
|
|
189
|
+
michiPath: options.michiPath,
|
|
190
|
+
environment,
|
|
191
|
+
langCode,
|
|
192
|
+
skipWorkflowConfig: options.skipConfig || false,
|
|
193
|
+
interactive: !options.yes,
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* テンプレートディレクトリのパスを解決
|
|
198
|
+
*/
|
|
199
|
+
function resolveTemplatesDir(michiPath) {
|
|
200
|
+
if (michiPath && existsSync(join(michiPath, 'templates'))) {
|
|
201
|
+
return join(michiPath, 'templates');
|
|
202
|
+
}
|
|
203
|
+
const candidates = [
|
|
204
|
+
{
|
|
205
|
+
path: join(__dirname, '..', '..', '..', 'templates'),
|
|
206
|
+
description: 'Production (compiled)',
|
|
207
|
+
},
|
|
208
|
+
{
|
|
209
|
+
path: join(__dirname, '..', '..', 'templates'),
|
|
210
|
+
description: 'Development (source)',
|
|
211
|
+
},
|
|
212
|
+
];
|
|
213
|
+
for (const candidate of candidates) {
|
|
214
|
+
if (existsSync(candidate.path)) {
|
|
215
|
+
return candidate.path;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
const triedPaths = candidates
|
|
219
|
+
.map((c) => ` - ${c.path} (${c.description})`)
|
|
220
|
+
.join('\n');
|
|
221
|
+
throw new Error(`Templates directory not found. Tried:\n${triedPaths}`);
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* テンプレートをコピーしてレンダリング
|
|
225
|
+
*/
|
|
226
|
+
function copyAndRenderTemplates(sourceDir, destDir, context) {
|
|
227
|
+
const entries = readdirSync(sourceDir, { withFileTypes: true });
|
|
228
|
+
for (const entry of entries) {
|
|
229
|
+
const sourcePath = join(sourceDir, entry.name);
|
|
230
|
+
const destPath = join(destDir, entry.name);
|
|
231
|
+
if (entry.isDirectory()) {
|
|
232
|
+
mkdirSync(destPath, { recursive: true });
|
|
233
|
+
copyAndRenderTemplates(sourcePath, destPath, context);
|
|
234
|
+
}
|
|
235
|
+
else if (entry.isFile()) {
|
|
236
|
+
const content = readFileSync(sourcePath, 'utf-8');
|
|
237
|
+
const rendered = renderTemplate(content, context);
|
|
238
|
+
writeFileSync(destPath, rendered, 'utf-8');
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* ワークフロー設定を作成
|
|
244
|
+
*/
|
|
245
|
+
async function setupWorkflowConfig(config, repoRoot) {
|
|
246
|
+
const globalConfigPath = getGlobalConfigPath();
|
|
247
|
+
const projectConfigPath = join(repoRoot, '.michi', 'config.json');
|
|
248
|
+
// グローバル設定が存在する場合
|
|
249
|
+
if (existsSync(globalConfigPath)) {
|
|
250
|
+
mkdirSync(dirname(projectConfigPath), { recursive: true });
|
|
251
|
+
cpSync(globalConfigPath, projectConfigPath);
|
|
252
|
+
console.log(' ✅ グローバル設定をコピーしました: ~/.michi/config.json → .michi/config.json');
|
|
253
|
+
console.log(' プロジェクト固有のカスタマイズが必要な場合は .michi/config.json を編集してください。');
|
|
254
|
+
return;
|
|
255
|
+
}
|
|
256
|
+
// グローバル設定がない場合
|
|
257
|
+
console.log(' ℹ️ グローバル設定が見つかりません。');
|
|
258
|
+
if (config.interactive) {
|
|
259
|
+
// 対話的に設定を作成
|
|
260
|
+
console.log(' 対話的に設定を作成します。');
|
|
261
|
+
const rl = readline.createInterface({
|
|
262
|
+
input: process.stdin,
|
|
263
|
+
output: process.stdout,
|
|
264
|
+
});
|
|
265
|
+
try {
|
|
266
|
+
const confluenceConfig = await getConfluenceConfig(rl);
|
|
267
|
+
const jiraConfig = await getJiraConfig(rl);
|
|
268
|
+
const workflowConfig = await getWorkflowConfig(rl);
|
|
269
|
+
const projectConfig = {
|
|
270
|
+
confluence: confluenceConfig,
|
|
271
|
+
jira: jiraConfig,
|
|
272
|
+
workflow: workflowConfig,
|
|
273
|
+
};
|
|
274
|
+
mkdirSync(dirname(projectConfigPath), { recursive: true });
|
|
275
|
+
writeFileSync(projectConfigPath, JSON.stringify(projectConfig, null, 2) + '\n', 'utf-8');
|
|
276
|
+
console.log(' ✅ .michi/config.json created');
|
|
277
|
+
}
|
|
278
|
+
finally {
|
|
279
|
+
rl.close();
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
else {
|
|
283
|
+
// デフォルト設定で作成
|
|
284
|
+
const defaultConfig = {
|
|
285
|
+
confluence: {
|
|
286
|
+
pageCreationGranularity: 'single',
|
|
287
|
+
},
|
|
288
|
+
jira: {
|
|
289
|
+
createEpic: true,
|
|
290
|
+
storyCreationGranularity: 'all',
|
|
291
|
+
storyPoints: 'auto',
|
|
292
|
+
},
|
|
293
|
+
workflow: {
|
|
294
|
+
enabledPhases: ['requirements', 'design', 'tasks'],
|
|
295
|
+
},
|
|
296
|
+
};
|
|
297
|
+
mkdirSync(dirname(projectConfigPath), { recursive: true });
|
|
298
|
+
writeFileSync(projectConfigPath, JSON.stringify(defaultConfig, null, 2) + '\n', 'utf-8');
|
|
299
|
+
console.log(' ✅ .michi/config.json created (default settings)');
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* init コマンドのメイン処理
|
|
304
|
+
*/
|
|
305
|
+
export async function initProject(options) {
|
|
306
|
+
console.log('🚀 プロジェクト初期設定');
|
|
307
|
+
console.log('');
|
|
308
|
+
const currentDir = process.cwd();
|
|
309
|
+
// 設定を構築(対話的プロンプトを含む)
|
|
310
|
+
const config = await buildConfig(options, currentDir);
|
|
311
|
+
console.log(`📁 現在のディレクトリ: ${currentDir}`);
|
|
312
|
+
console.log(`📦 プロジェクトID: ${config.projectId}`);
|
|
313
|
+
console.log('');
|
|
314
|
+
// リポジトリルートを検出
|
|
315
|
+
const repoRoot = findRepositoryRoot(currentDir);
|
|
316
|
+
console.log(`📁 リポジトリルート: ${repoRoot}`);
|
|
317
|
+
if (!repoRoot || !existsSync(repoRoot)) {
|
|
318
|
+
throw new Error('リポジトリルートが見つかりません');
|
|
319
|
+
}
|
|
320
|
+
// Step 1: .kiro ディレクトリ作成
|
|
321
|
+
console.log('\n📁 Step 1: Creating .kiro directory structure...');
|
|
322
|
+
mkdirSync('.kiro/settings/templates', { recursive: true });
|
|
323
|
+
mkdirSync('.kiro/steering', { recursive: true });
|
|
324
|
+
mkdirSync('.kiro/specs', { recursive: true });
|
|
325
|
+
console.log(' ✅ Directory structure created');
|
|
326
|
+
// Step 2: プロジェクトメタデータ作成
|
|
327
|
+
console.log('\n📝 Step 2: Creating project metadata...');
|
|
328
|
+
// GitHub URLを取得
|
|
329
|
+
let repoUrl = '';
|
|
330
|
+
try {
|
|
331
|
+
repoUrl = execSync('git config --get remote.origin.url', {
|
|
332
|
+
encoding: 'utf-8',
|
|
333
|
+
cwd: repoRoot,
|
|
334
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
335
|
+
}).trim();
|
|
336
|
+
if (repoUrl.startsWith('git@github.com:')) {
|
|
337
|
+
repoUrl = repoUrl
|
|
338
|
+
.replace('git@github.com:', 'https://github.com/')
|
|
339
|
+
.replace('.git', '');
|
|
340
|
+
}
|
|
341
|
+
else if (repoUrl.endsWith('.git')) {
|
|
342
|
+
repoUrl = repoUrl.replace('.git', '');
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
catch {
|
|
346
|
+
repoUrl = `https://github.com/org/${config.projectId}`;
|
|
347
|
+
}
|
|
348
|
+
// Confluenceラベル生成
|
|
349
|
+
const labels = (() => {
|
|
350
|
+
const projectLabel = config.projectId.toLowerCase().replace(/[^a-z0-9-]/g, '');
|
|
351
|
+
const labelSet = new Set([`project:${projectLabel}`]);
|
|
352
|
+
if (config.projectId.includes('-')) {
|
|
353
|
+
const parts = config.projectId.split('-');
|
|
354
|
+
const servicePart = parts[parts.length - 1];
|
|
355
|
+
const serviceLabel = servicePart.toLowerCase().replace(/[^a-z0-9-]/g, '');
|
|
356
|
+
if (serviceLabel !== projectLabel) {
|
|
357
|
+
labelSet.add(`service:${serviceLabel}`);
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
return Array.from(labelSet);
|
|
361
|
+
})();
|
|
362
|
+
const projectJson = {
|
|
363
|
+
projectId: config.projectId,
|
|
364
|
+
projectName: config.projectName,
|
|
365
|
+
language: config.langCode,
|
|
366
|
+
jiraProjectKey: config.jiraKey,
|
|
367
|
+
confluenceLabels: labels,
|
|
368
|
+
status: 'active',
|
|
369
|
+
team: [],
|
|
370
|
+
stakeholders: ['@企画', '@部長'],
|
|
371
|
+
repository: repoUrl,
|
|
372
|
+
description: `${config.projectName}の開発`,
|
|
373
|
+
};
|
|
374
|
+
writeFileSync('.kiro/project.json', JSON.stringify(projectJson, null, 2) + '\n', 'utf-8');
|
|
375
|
+
console.log(' ✅ project.json created');
|
|
376
|
+
// Step 3: .env テンプレート作成
|
|
377
|
+
console.log('\n🔐 Step 3: Creating .env template...');
|
|
378
|
+
const envTemplate = `# Atlassian設定(MCP + REST API共通)
|
|
379
|
+
ATLASSIAN_URL=https://your-domain.atlassian.net
|
|
380
|
+
ATLASSIAN_EMAIL=your-email@company.com
|
|
381
|
+
ATLASSIAN_API_TOKEN=your-token-here
|
|
382
|
+
|
|
383
|
+
# GitHub設定
|
|
384
|
+
GITHUB_ORG=your-org
|
|
385
|
+
GITHUB_TOKEN=ghp_xxx
|
|
386
|
+
GITHUB_REPO=${repoUrl.replace('https://github.com/', '')}
|
|
387
|
+
|
|
388
|
+
# Confluence共有スペース
|
|
389
|
+
CONFLUENCE_PRD_SPACE=PRD
|
|
390
|
+
CONFLUENCE_QA_SPACE=QA
|
|
391
|
+
CONFLUENCE_RELEASE_SPACE=RELEASE
|
|
392
|
+
|
|
393
|
+
# JIRAプロジェクトキー
|
|
394
|
+
JIRA_PROJECT_KEYS=${config.jiraKey}
|
|
395
|
+
|
|
396
|
+
# JIRA Issue Type IDs(JIRAインスタンス固有 - 必須)
|
|
397
|
+
JIRA_ISSUE_TYPE_STORY=10036
|
|
398
|
+
JIRA_ISSUE_TYPE_SUBTASK=10037
|
|
399
|
+
`;
|
|
400
|
+
if (!existsSync('.env')) {
|
|
401
|
+
writeFileSync('.env', envTemplate, 'utf-8');
|
|
402
|
+
chmodSync('.env', 0o600);
|
|
403
|
+
console.log(' ✅ .env template created (permissions: 600)');
|
|
404
|
+
}
|
|
405
|
+
else {
|
|
406
|
+
console.log(' ℹ️ .env already exists (skipped)');
|
|
407
|
+
}
|
|
408
|
+
// Step 4: テンプレート/ルールのコピー(--michi-path 指定時のみ)
|
|
409
|
+
if (config.michiPath) {
|
|
410
|
+
console.log('\n📋 Step 4: Copying templates and rules...');
|
|
411
|
+
const templatesDir = resolveTemplatesDir(config.michiPath);
|
|
412
|
+
const envConfig = getEnvironmentConfig(config.environment);
|
|
413
|
+
const templateContext = createTemplateContext(config.langCode, '.kiro', envConfig.rulesDir.startsWith('.')
|
|
414
|
+
? envConfig.rulesDir.substring(1, envConfig.rulesDir.indexOf('/', 1))
|
|
415
|
+
: envConfig.rulesDir.split('/')[0]);
|
|
416
|
+
const templateSourceDir = join(templatesDir, envConfig.templateSource);
|
|
417
|
+
if (existsSync(templateSourceDir)) {
|
|
418
|
+
// rulesディレクトリ
|
|
419
|
+
const templateDirName = config.environment === 'claude-agent' ? 'agents' : 'rules';
|
|
420
|
+
const rulesTemplateDir = join(templateSourceDir, templateDirName);
|
|
421
|
+
const rulesDestDir = join(currentDir, envConfig.rulesDir);
|
|
422
|
+
if (existsSync(rulesTemplateDir)) {
|
|
423
|
+
mkdirSync(rulesDestDir, { recursive: true });
|
|
424
|
+
copyAndRenderTemplates(rulesTemplateDir, rulesDestDir, templateContext);
|
|
425
|
+
console.log(` ✅ Rules copied to ${envConfig.rulesDir}`);
|
|
426
|
+
}
|
|
427
|
+
// commandsディレクトリ
|
|
428
|
+
const commandsTemplateDir = join(templateSourceDir, 'commands');
|
|
429
|
+
const commandsDestDir = join(currentDir, envConfig.commandsDir);
|
|
430
|
+
if (existsSync(commandsTemplateDir)) {
|
|
431
|
+
mkdirSync(commandsDestDir, { recursive: true });
|
|
432
|
+
copyAndRenderTemplates(commandsTemplateDir, commandsDestDir, templateContext);
|
|
433
|
+
console.log(` ✅ Commands copied to ${envConfig.commandsDir}`);
|
|
434
|
+
}
|
|
435
|
+
// Steeringテンプレート
|
|
436
|
+
const michiSteeringDir = join(templatesDir, '..', '.kiro', 'steering');
|
|
437
|
+
if (existsSync(michiSteeringDir)) {
|
|
438
|
+
cpSync(michiSteeringDir, join(currentDir, '.kiro/steering'), {
|
|
439
|
+
recursive: true,
|
|
440
|
+
});
|
|
441
|
+
console.log(' ✅ Steering templates copied');
|
|
442
|
+
}
|
|
443
|
+
// Specテンプレート
|
|
444
|
+
const michiSpecTemplatesDir = join(templatesDir, '..', '.kiro', 'settings', 'templates');
|
|
445
|
+
if (existsSync(michiSpecTemplatesDir)) {
|
|
446
|
+
cpSync(michiSpecTemplatesDir, join(currentDir, '.kiro/settings/templates'), { recursive: true });
|
|
447
|
+
console.log(' ✅ Spec templates copied');
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
else {
|
|
452
|
+
console.log('\n⚠️ Step 4: Skipped (--michi-path not specified)');
|
|
453
|
+
console.log(' テンプレートをコピーするには --michi-path オプションを指定してください');
|
|
454
|
+
}
|
|
455
|
+
// Step 5: ワークフロー設定
|
|
456
|
+
if (!config.skipWorkflowConfig) {
|
|
457
|
+
console.log('\n⚙️ Step 5: Setting up workflow configuration...');
|
|
458
|
+
await setupWorkflowConfig(config, repoRoot);
|
|
459
|
+
}
|
|
460
|
+
else {
|
|
461
|
+
console.log('\n⚠️ Step 5: Skipped (--skip-config specified)');
|
|
462
|
+
}
|
|
463
|
+
// 完了メッセージ
|
|
464
|
+
console.log('\n');
|
|
465
|
+
console.log('🎉 セットアップ完了!');
|
|
466
|
+
console.log('');
|
|
467
|
+
console.log('次のステップ:');
|
|
468
|
+
console.log(' 1. .env ファイルの内容を確認・編集');
|
|
469
|
+
if (!config.skipWorkflowConfig) {
|
|
470
|
+
console.log(' 2. .michi/config.json の内容を確認(必要に応じて編集)');
|
|
471
|
+
}
|
|
472
|
+
switch (config.environment) {
|
|
473
|
+
case 'cursor':
|
|
474
|
+
console.log(' 3. Cursor で開く: cursor .');
|
|
475
|
+
console.log(' 4. /kiro:spec-init <機能説明> で開発開始');
|
|
476
|
+
break;
|
|
477
|
+
case 'claude':
|
|
478
|
+
case 'claude-agent':
|
|
479
|
+
console.log(' 3. Claude Code で開く');
|
|
480
|
+
console.log(' 4. /kiro:spec-init <機能説明> で開発開始');
|
|
481
|
+
break;
|
|
482
|
+
default:
|
|
483
|
+
console.log(' 3. AI開発環境で開く');
|
|
484
|
+
console.log(' 4. 開発開始');
|
|
485
|
+
}
|
|
486
|
+
console.log('');
|
|
487
|
+
console.log('詳細: https://github.com/sk8metalme/michi');
|
|
488
|
+
console.log('');
|
|
489
|
+
}
|
|
490
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -186,10 +186,37 @@ curl -o .env https://raw.githubusercontent.com/sk8metalme/michi/main/env.example
|
|
|
186
186
|
wget -O .env https://raw.githubusercontent.com/sk8metalme/michi/main/env.example
|
|
187
187
|
```
|
|
188
188
|
|
|
189
|
-
**注意**:
|
|
189
|
+
**注意**:
|
|
190
190
|
- `.env` ファイルは作業するプロジェクトのルートディレクトリに作成されます
|
|
191
191
|
- 別のディレクトリにいる場合は、まずプロジェクトルートに移動してください
|
|
192
192
|
|
|
193
|
+
## Step 3.5: 設定の作成と管理
|
|
194
|
+
|
|
195
|
+
Michiには2段階の設定があります。
|
|
196
|
+
|
|
197
|
+
| 設定レベル | コマンド | 出力先 | タイミング |
|
|
198
|
+
|---------|---------|--------|-----------|
|
|
199
|
+
| **グローバル設定** | `npm run config:global` | `~/.michi/config.json` | 初回セットアップ時(推奨) |
|
|
200
|
+
| **プロジェクト設定** | `michi init` または手動作成 | `.michi/config.json` | プロジェクトごとのカスタマイズ時 |
|
|
201
|
+
|
|
202
|
+
### グローバル設定のメリット
|
|
203
|
+
|
|
204
|
+
`npm run config:global` を使用すると、以下の設定を全プロジェクトで共有できます:
|
|
205
|
+
- Confluence階層構造設定
|
|
206
|
+
- JIRA Story作成粒度
|
|
207
|
+
- ワークフロー承認ゲート
|
|
208
|
+
|
|
209
|
+
### プロジェクト固有の設定
|
|
210
|
+
|
|
211
|
+
プロジェクト固有の設定は以下の方法で作成できます:
|
|
212
|
+
1. **自動コピー**: `michi init` 実行時にグローバル設定から自動コピー
|
|
213
|
+
2. **手動作成**: グローバル設定をコピーして `.michi/config.json` として編集
|
|
214
|
+
|
|
215
|
+
**推奨フロー:**
|
|
216
|
+
1. 初回: `npm run config:global` でグローバル設定を作成
|
|
217
|
+
2. プロジェクトごと: `michi init` で初期化(グローバル設定を自動コピー)
|
|
218
|
+
3. カスタマイズ: 必要に応じて `.michi/config.json` を手動編集
|
|
219
|
+
|
|
193
220
|
### 3-2. 認証情報の設定
|
|
194
221
|
|
|
195
222
|
`.env` ファイルを編集して、実際の認証情報を設定します:
|
|
@@ -783,8 +810,9 @@ APPROVAL_GATES_RELEASE=リリースマネージャー,QAリード,部長
|
|
|
783
810
|
|
|
784
811
|
1. **`spec.json`**: 機能固有の設定(最優先)
|
|
785
812
|
2. **`.michi/config.json`**: プロジェクト固有の設定
|
|
786
|
-
3.
|
|
787
|
-
4.
|
|
813
|
+
3. **`~/.michi/config.json`**: グローバル設定
|
|
814
|
+
4. **環境変数**: システム環境変数または`.env`ファイル
|
|
815
|
+
5. **デフォルト値**: スキーマで定義されたデフォルト値
|
|
788
816
|
|
|
789
817
|
#### よくある設定パターン
|
|
790
818
|
|
|
@@ -43,7 +43,7 @@ Michiは[cc-sdd](https://github.com/gotalab/cc-sdd)をベースとしており
|
|
|
43
43
|
| カスタマイズ種類 | 対象 | 設定場所 | コマンド |
|
|
44
44
|
|----------------|------|---------|---------|
|
|
45
45
|
| **cc-sdd** | ドキュメント構造・AI判断基準 | `.kiro/settings/templates/`, `.kiro/settings/rules/`, `.kiro/steering/` | `/kiro:steering-custom` |
|
|
46
|
-
| **Michi** | Confluence/JIRA作成方法 | `.michi/config.json` |
|
|
46
|
+
| **Michi** | Confluence/JIRA作成方法 | `.michi/config.json` | 手動編集または`npm run config:global` |
|
|
47
47
|
|
|
48
48
|
**例**:
|
|
49
49
|
- 要件定義書の見出しを「要件 N:」から「REQ-N:」に変更 → **cc-sddのカスタマイズ**(`templates/requirements.md`を編集)
|
|
@@ -357,28 +357,81 @@ Confluenceスペース
|
|
|
357
357
|
}
|
|
358
358
|
```
|
|
359
359
|
|
|
360
|
-
##
|
|
360
|
+
## グローバル設定
|
|
361
361
|
|
|
362
|
-
|
|
362
|
+
全プロジェクトで共通の設定は、グローバル設定として保存できます。
|
|
363
363
|
|
|
364
|
-
|
|
365
|
-
# 対話式設定ツールを実行
|
|
366
|
-
npx @sk8metal/michi-cli config:interactive
|
|
364
|
+
### グローバル設定の作成
|
|
367
365
|
|
|
368
|
-
|
|
369
|
-
|
|
366
|
+
```bash
|
|
367
|
+
npm run config:global
|
|
370
368
|
```
|
|
371
369
|
|
|
370
|
+
このツールで `~/.michi/config.json` を作成できます。
|
|
371
|
+
|
|
372
|
+
### グローバル設定のメリット
|
|
373
|
+
|
|
374
|
+
- 新規プロジェクトごとに同じ設定を繰り返し入力する必要がない
|
|
375
|
+
- 組織標準の設定を統一できる
|
|
376
|
+
- プロジェクト固有の設定で上書き可能
|
|
377
|
+
|
|
378
|
+
### 設定の優先順位
|
|
379
|
+
|
|
380
|
+
設定値は以下の優先順位で決定されます:
|
|
381
|
+
|
|
382
|
+
1. **`spec.json`**: 機能固有の設定(最優先)
|
|
383
|
+
2. **`.michi/config.json`**: プロジェクト固有の設定
|
|
384
|
+
3. **`~/.michi/config.json`**: グローバル設定
|
|
385
|
+
4. **環境変数**: システム環境変数または`.env`ファイル
|
|
386
|
+
5. **デフォルト値**: スキーマで定義されたデフォルト値
|
|
387
|
+
|
|
372
388
|
### 使い方
|
|
373
389
|
|
|
374
|
-
1. **コマンド実行**: `
|
|
375
|
-
2. **設定項目を選択**:
|
|
390
|
+
1. **コマンド実行**: `npm run config:global`
|
|
391
|
+
2. **設定項目を選択**:
|
|
376
392
|
- Confluence設定のカスタマイズ
|
|
377
393
|
- JIRA設定のカスタマイズ
|
|
378
394
|
- ワークフロー設定のカスタマイズ
|
|
379
395
|
3. **各設定を対話的に入力**: プロンプトに従って選択・入力
|
|
380
396
|
4. **設定を確認**: 最終的な設定内容を確認
|
|
381
|
-
5. **保存**:
|
|
397
|
+
5. **保存**: 設定ファイルを`~/.michi/config.json`に保存
|
|
398
|
+
|
|
399
|
+
### プロジェクト設定との使い分け
|
|
400
|
+
|
|
401
|
+
- **グローバル設定(`~/.michi/config.json`)**: 組織全体で共通の設定(Confluence階層構造、JIRA Story作成粒度など)
|
|
402
|
+
- **プロジェクト設定(`.michi/config.json`)**: プロジェクト固有の設定(特定プロジェクトのみカスタマイズが必要な場合)
|
|
403
|
+
|
|
404
|
+
**推奨フロー**:
|
|
405
|
+
1. 初回: `npm run config:global` でグローバル設定を作成
|
|
406
|
+
2. プロジェクトごと: `michi init` で初期化(グローバル設定を自動コピー)
|
|
407
|
+
3. カスタマイズ: 必要に応じて `.michi/config.json` を手動編集
|
|
408
|
+
|
|
409
|
+
## プロジェクト固有の設定
|
|
410
|
+
|
|
411
|
+
プロジェクト固有の`.michi/config.json`は以下の方法で作成できます:
|
|
412
|
+
|
|
413
|
+
### 自動作成(推奨)
|
|
414
|
+
|
|
415
|
+
```bash
|
|
416
|
+
# プロジェクト初期化時にグローバル設定から自動コピー
|
|
417
|
+
michi init
|
|
418
|
+
```
|
|
419
|
+
|
|
420
|
+
### 手動作成
|
|
421
|
+
|
|
422
|
+
1. グローバル設定をコピー:
|
|
423
|
+
```bash
|
|
424
|
+
cp ~/.michi/config.json .michi/config.json
|
|
425
|
+
```
|
|
426
|
+
|
|
427
|
+
2. プロジェクト固有のカスタマイズを適用:
|
|
428
|
+
- Confluence設定のカスタマイズ
|
|
429
|
+
- JIRA設定のカスタマイズ
|
|
430
|
+
- ワークフロー設定のカスタマイズ
|
|
431
|
+
|
|
432
|
+
3. 設定ファイルを保存
|
|
433
|
+
|
|
434
|
+
**注意**: グローバル設定(`~/.michi/config.json`)を作成する場合は、`npm run config:global` を使用してください。
|
|
382
435
|
|
|
383
436
|
### 設定項目
|
|
384
437
|
|