@sk8metal/michi-cli 0.11.0 → 0.12.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/README.md +3 -10
- package/dist/scripts/constants/environments.d.ts +1 -1
- package/dist/scripts/constants/environments.d.ts.map +1 -1
- package/dist/scripts/constants/environments.js +0 -20
- package/dist/scripts/constants/environments.js.map +1 -1
- package/dist/scripts/utils/template-finder.d.ts +2 -2
- package/dist/scripts/utils/template-finder.d.ts.map +1 -1
- package/dist/scripts/utils/template-finder.js +3 -8
- package/dist/scripts/utils/template-finder.js.map +1 -1
- package/dist/src/cli.d.ts.map +1 -1
- package/dist/src/cli.js +0 -8
- package/dist/src/cli.js.map +1 -1
- package/dist/src/commands/init.d.ts +0 -4
- package/dist/src/commands/init.d.ts.map +1 -1
- package/dist/src/commands/init.js +6 -30
- package/dist/src/commands/init.js.map +1 -1
- package/dist/src/commands/setup-existing.d.ts +2 -6
- package/dist/src/commands/setup-existing.d.ts.map +1 -1
- package/dist/src/commands/setup-existing.js +8 -142
- package/dist/src/commands/setup-existing.js.map +1 -1
- package/docs/getting-started/configuration.md +0 -29
- package/docs/getting-started/quick-start.md +2 -2
- package/docs/guides/workflow.md +1 -1
- package/docs/reference/cli.md +0 -4
- package/docs/troubleshooting.md +0 -45
- package/package.json +1 -3
- package/scripts/__tests__/create-project.test.ts +12 -12
- package/scripts/__tests__/setup-existing-project.test.ts +22 -22
- package/scripts/constants/__tests__/environments.test.ts +7 -50
- package/scripts/constants/environments.ts +1 -27
- package/scripts/template/__tests__/renderer.test.ts +21 -21
- package/scripts/utils/template-finder.ts +5 -11
- package/docs/guides/ai-tools.md +0 -311
- package/templates/cline/rules/atlassian-integration.md +0 -36
- package/templates/cline/rules/michi-core.md +0 -56
- package/templates/codex/AGENTS.override.md +0 -277
- package/templates/codex/prompts/confluence-sync.md +0 -177
- package/templates/codex/rules/README.md +0 -210
- package/templates/cursor/commands/kiro/kiro-spec-impl.md +0 -244
- package/templates/cursor/commands/kiro/kiro-spec-tasks.md +0 -354
- package/templates/cursor/commands/michi/confluence-sync.md +0 -76
- package/templates/cursor/commands/michi/project-switch.md +0 -69
- package/templates/cursor/commands/michi/spec-tasks.md +0 -117
- package/templates/cursor/rules/atlassian-mcp.mdc +0 -188
- package/templates/cursor/rules/github-ssot.mdc +0 -151
- package/templates/cursor/rules/multi-project.mdc +0 -81
- package/templates/gemini/commands/README.md +0 -41
- package/templates/gemini/rules/GEMINI.md +0 -80
|
@@ -13,10 +13,6 @@ describe('environments', () => {
|
|
|
13
13
|
it('should have entries for all environments', () => {
|
|
14
14
|
expect(ENV_CONFIG.claude).toBeDefined();
|
|
15
15
|
expect(ENV_CONFIG['claude-agent']).toBeDefined();
|
|
16
|
-
expect(ENV_CONFIG.cursor).toBeDefined();
|
|
17
|
-
expect(ENV_CONFIG.gemini).toBeDefined();
|
|
18
|
-
expect(ENV_CONFIG.codex).toBeDefined();
|
|
19
|
-
expect(ENV_CONFIG.cline).toBeDefined();
|
|
20
16
|
});
|
|
21
17
|
|
|
22
18
|
it('should have correct structure for claude', () => {
|
|
@@ -33,34 +29,6 @@ describe('environments', () => {
|
|
|
33
29
|
expect(config.templateSource).toBe('claude-agent');
|
|
34
30
|
});
|
|
35
31
|
|
|
36
|
-
it('should have correct structure for cursor', () => {
|
|
37
|
-
const config = ENV_CONFIG.cursor;
|
|
38
|
-
expect(config.rulesDir).toBe('.cursor/rules');
|
|
39
|
-
expect(config.commandsDir).toBe('.cursor/commands');
|
|
40
|
-
expect(config.templateSource).toBe('cursor');
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
it('should have correct structure for gemini', () => {
|
|
44
|
-
const config = ENV_CONFIG.gemini;
|
|
45
|
-
expect(config.rulesDir).toBe('.gemini');
|
|
46
|
-
expect(config.commandsDir).toBe('.gemini/extensions');
|
|
47
|
-
expect(config.templateSource).toBe('gemini');
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
it('should have correct structure for codex', () => {
|
|
51
|
-
const config = ENV_CONFIG.codex;
|
|
52
|
-
expect(config.rulesDir).toBe('.codex/docs');
|
|
53
|
-
expect(config.commandsDir).toBe('.codex/docs');
|
|
54
|
-
expect(config.templateSource).toBe('codex');
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
it('should have correct structure for cline', () => {
|
|
58
|
-
const config = ENV_CONFIG.cline;
|
|
59
|
-
expect(config.rulesDir).toBe('.clinerules/rules');
|
|
60
|
-
expect(config.commandsDir).toBe('.clinerules/commands');
|
|
61
|
-
expect(config.templateSource).toBe('cline');
|
|
62
|
-
});
|
|
63
|
-
|
|
64
32
|
it('should have all required properties for each environment', () => {
|
|
65
33
|
for (const env of Object.keys(ENV_CONFIG) as Environment[]) {
|
|
66
34
|
const config = ENV_CONFIG[env];
|
|
@@ -81,14 +49,7 @@ describe('environments', () => {
|
|
|
81
49
|
});
|
|
82
50
|
|
|
83
51
|
it('should return config for all supported environments', () => {
|
|
84
|
-
const environments: Environment[] = [
|
|
85
|
-
'claude',
|
|
86
|
-
'claude-agent',
|
|
87
|
-
'cursor',
|
|
88
|
-
'gemini',
|
|
89
|
-
'codex',
|
|
90
|
-
'cline',
|
|
91
|
-
];
|
|
52
|
+
const environments: Environment[] = ['claude', 'claude-agent'];
|
|
92
53
|
for (const env of environments) {
|
|
93
54
|
const config = getEnvironmentConfig(env);
|
|
94
55
|
expect(config).toBeDefined();
|
|
@@ -101,20 +62,20 @@ describe('environments', () => {
|
|
|
101
62
|
it('should return true for supported environments', () => {
|
|
102
63
|
expect(isSupportedEnvironment('claude')).toBe(true);
|
|
103
64
|
expect(isSupportedEnvironment('claude-agent')).toBe(true);
|
|
104
|
-
expect(isSupportedEnvironment('cursor')).toBe(true);
|
|
105
|
-
expect(isSupportedEnvironment('gemini')).toBe(true);
|
|
106
|
-
expect(isSupportedEnvironment('codex')).toBe(true);
|
|
107
|
-
expect(isSupportedEnvironment('cline')).toBe(true);
|
|
108
65
|
});
|
|
109
66
|
|
|
110
67
|
it('should return false for unsupported environments', () => {
|
|
111
68
|
expect(isSupportedEnvironment('invalid')).toBe(false);
|
|
112
69
|
expect(isSupportedEnvironment('vscode')).toBe(false);
|
|
113
70
|
expect(isSupportedEnvironment('')).toBe(false);
|
|
71
|
+
expect(isSupportedEnvironment('cursor')).toBe(false);
|
|
72
|
+
expect(isSupportedEnvironment('gemini')).toBe(false);
|
|
73
|
+
expect(isSupportedEnvironment('codex')).toBe(false);
|
|
74
|
+
expect(isSupportedEnvironment('cline')).toBe(false);
|
|
114
75
|
});
|
|
115
76
|
|
|
116
77
|
it('should work as type guard', () => {
|
|
117
|
-
const env: string = '
|
|
78
|
+
const env: string = 'claude';
|
|
118
79
|
if (isSupportedEnvironment(env)) {
|
|
119
80
|
// TypeScript should recognize env as Environment here
|
|
120
81
|
const config: EnvironmentConfig = ENV_CONFIG[env];
|
|
@@ -126,13 +87,9 @@ describe('environments', () => {
|
|
|
126
87
|
describe('getSupportedEnvironments', () => {
|
|
127
88
|
it('should return all supported environments', () => {
|
|
128
89
|
const environments = getSupportedEnvironments();
|
|
129
|
-
expect(environments).toHaveLength(
|
|
90
|
+
expect(environments).toHaveLength(2);
|
|
130
91
|
expect(environments).toContain('claude');
|
|
131
92
|
expect(environments).toContain('claude-agent');
|
|
132
|
-
expect(environments).toContain('cursor');
|
|
133
|
-
expect(environments).toContain('gemini');
|
|
134
|
-
expect(environments).toContain('codex');
|
|
135
|
-
expect(environments).toContain('cline');
|
|
136
93
|
});
|
|
137
94
|
|
|
138
95
|
it('should return array with correct type', () => {
|
|
@@ -10,13 +10,7 @@ export interface EnvironmentConfig {
|
|
|
10
10
|
templateSource: string;
|
|
11
11
|
}
|
|
12
12
|
|
|
13
|
-
export type Environment =
|
|
14
|
-
| 'claude'
|
|
15
|
-
| 'claude-agent'
|
|
16
|
-
| 'cursor'
|
|
17
|
-
| 'gemini'
|
|
18
|
-
| 'codex'
|
|
19
|
-
| 'cline';
|
|
13
|
+
export type Environment = 'claude' | 'claude-agent';
|
|
20
14
|
|
|
21
15
|
export const ENV_CONFIG: Record<Environment, EnvironmentConfig> = {
|
|
22
16
|
claude: {
|
|
@@ -29,26 +23,6 @@ export const ENV_CONFIG: Record<Environment, EnvironmentConfig> = {
|
|
|
29
23
|
commandsDir: '.claude/commands',
|
|
30
24
|
templateSource: 'claude-agent',
|
|
31
25
|
},
|
|
32
|
-
cursor: {
|
|
33
|
-
rulesDir: '.cursor/rules',
|
|
34
|
-
commandsDir: '.cursor/commands',
|
|
35
|
-
templateSource: 'cursor',
|
|
36
|
-
},
|
|
37
|
-
gemini: {
|
|
38
|
-
rulesDir: '.gemini',
|
|
39
|
-
commandsDir: '.gemini/extensions',
|
|
40
|
-
templateSource: 'gemini',
|
|
41
|
-
},
|
|
42
|
-
codex: {
|
|
43
|
-
rulesDir: '.codex/docs',
|
|
44
|
-
commandsDir: '.codex/docs',
|
|
45
|
-
templateSource: 'codex',
|
|
46
|
-
},
|
|
47
|
-
cline: {
|
|
48
|
-
rulesDir: '.clinerules/rules',
|
|
49
|
-
commandsDir: '.clinerules/commands',
|
|
50
|
-
templateSource: 'cline',
|
|
51
|
-
},
|
|
52
26
|
};
|
|
53
27
|
|
|
54
28
|
/**
|
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
describe('renderer', () => {
|
|
10
10
|
describe('createTemplateContext', () => {
|
|
11
11
|
it('should create context with all required fields', () => {
|
|
12
|
-
const context = createTemplateContext('ja', '.kiro', '.
|
|
12
|
+
const context = createTemplateContext('ja', '.kiro', '.claude');
|
|
13
13
|
|
|
14
14
|
expect(context).toHaveProperty('LANG_CODE');
|
|
15
15
|
expect(context).toHaveProperty('DEV_GUIDELINES');
|
|
@@ -17,14 +17,14 @@ describe('renderer', () => {
|
|
|
17
17
|
expect(context).toHaveProperty('AGENT_DIR');
|
|
18
18
|
expect(context.LANG_CODE).toBe('ja');
|
|
19
19
|
expect(context.KIRO_DIR).toBe('.kiro');
|
|
20
|
-
expect(context.AGENT_DIR).toBe('.
|
|
20
|
+
expect(context.AGENT_DIR).toBe('.claude');
|
|
21
21
|
});
|
|
22
22
|
|
|
23
23
|
it('should include language-specific guidelines', () => {
|
|
24
|
-
const contextJa = createTemplateContext('ja', '.kiro', '.
|
|
24
|
+
const contextJa = createTemplateContext('ja', '.kiro', '.claude');
|
|
25
25
|
expect(contextJa.DEV_GUIDELINES).toContain('日本語');
|
|
26
26
|
|
|
27
|
-
const contextEn = createTemplateContext('en', '.kiro', '.
|
|
27
|
+
const contextEn = createTemplateContext('en', '.kiro', '.claude');
|
|
28
28
|
expect(contextEn.DEV_GUIDELINES).toContain('English');
|
|
29
29
|
});
|
|
30
30
|
});
|
|
@@ -32,7 +32,7 @@ describe('renderer', () => {
|
|
|
32
32
|
describe('renderTemplate', () => {
|
|
33
33
|
it('should replace single placeholder', () => {
|
|
34
34
|
const template = 'Language: {{LANG_CODE}}';
|
|
35
|
-
const context = createTemplateContext('ja', '.kiro', '.
|
|
35
|
+
const context = createTemplateContext('ja', '.kiro', '.claude');
|
|
36
36
|
const result = renderTemplate(template, context);
|
|
37
37
|
|
|
38
38
|
expect(result).toBe('Language: ja');
|
|
@@ -48,7 +48,7 @@ describe('renderer', () => {
|
|
|
48
48
|
|
|
49
49
|
it('should replace same placeholder multiple times', () => {
|
|
50
50
|
const template = '{{LANG_CODE}} is {{LANG_CODE}}';
|
|
51
|
-
const context = createTemplateContext('ja', '.kiro', '.
|
|
51
|
+
const context = createTemplateContext('ja', '.kiro', '.claude');
|
|
52
52
|
const result = renderTemplate(template, context);
|
|
53
53
|
|
|
54
54
|
expect(result).toBe('ja is ja');
|
|
@@ -56,7 +56,7 @@ describe('renderer', () => {
|
|
|
56
56
|
|
|
57
57
|
it('should leave unknown placeholders unchanged', () => {
|
|
58
58
|
const template = 'Known: {{LANG_CODE}}, Unknown: {{UNKNOWN}}';
|
|
59
|
-
const context = createTemplateContext('ja', '.kiro', '.
|
|
59
|
+
const context = createTemplateContext('ja', '.kiro', '.claude');
|
|
60
60
|
const result = renderTemplate(template, context);
|
|
61
61
|
|
|
62
62
|
expect(result).toBe('Known: ja, Unknown: {{UNKNOWN}}');
|
|
@@ -64,7 +64,7 @@ describe('renderer', () => {
|
|
|
64
64
|
|
|
65
65
|
it('should handle DEV_GUIDELINES placeholder', () => {
|
|
66
66
|
const template = '{{DEV_GUIDELINES}}';
|
|
67
|
-
const context = createTemplateContext('ja', '.kiro', '.
|
|
67
|
+
const context = createTemplateContext('ja', '.kiro', '.claude');
|
|
68
68
|
const result = renderTemplate(template, context);
|
|
69
69
|
|
|
70
70
|
expect(result).toContain('Think in English');
|
|
@@ -73,7 +73,7 @@ describe('renderer', () => {
|
|
|
73
73
|
|
|
74
74
|
it('should handle empty template', () => {
|
|
75
75
|
const template = '';
|
|
76
|
-
const context = createTemplateContext('ja', '.kiro', '.
|
|
76
|
+
const context = createTemplateContext('ja', '.kiro', '.claude');
|
|
77
77
|
const result = renderTemplate(template, context);
|
|
78
78
|
|
|
79
79
|
expect(result).toBe('');
|
|
@@ -81,7 +81,7 @@ describe('renderer', () => {
|
|
|
81
81
|
|
|
82
82
|
it('should handle template with no placeholders', () => {
|
|
83
83
|
const template = 'No placeholders here';
|
|
84
|
-
const context = createTemplateContext('ja', '.kiro', '.
|
|
84
|
+
const context = createTemplateContext('ja', '.kiro', '.claude');
|
|
85
85
|
const result = renderTemplate(template, context);
|
|
86
86
|
|
|
87
87
|
expect(result).toBe('No placeholders here');
|
|
@@ -91,19 +91,19 @@ describe('renderer', () => {
|
|
|
91
91
|
const template = `Line 1: {{LANG_CODE}}
|
|
92
92
|
Line 2: {{KIRO_DIR}}
|
|
93
93
|
Line 3: {{AGENT_DIR}}`;
|
|
94
|
-
const context = createTemplateContext('en', '.kiro', '.
|
|
94
|
+
const context = createTemplateContext('en', '.kiro', '.claude');
|
|
95
95
|
const result = renderTemplate(template, context);
|
|
96
96
|
|
|
97
97
|
expect(result).toBe(`Line 1: en
|
|
98
98
|
Line 2: .kiro
|
|
99
|
-
Line 3: .
|
|
99
|
+
Line 3: .claude`);
|
|
100
100
|
});
|
|
101
101
|
});
|
|
102
102
|
|
|
103
103
|
describe('renderJsonTemplate', () => {
|
|
104
104
|
it('should render and parse JSON template', () => {
|
|
105
105
|
const template = '{"lang": "{{LANG_CODE}}", "dir": "{{KIRO_DIR}}"}';
|
|
106
|
-
const context = createTemplateContext('ja', '.kiro', '.
|
|
106
|
+
const context = createTemplateContext('ja', '.kiro', '.claude');
|
|
107
107
|
const result = renderJsonTemplate(template, context);
|
|
108
108
|
|
|
109
109
|
expect(result).toEqual({ lang: 'ja', dir: '.kiro' });
|
|
@@ -126,22 +126,22 @@ Line 3: .cursor`);
|
|
|
126
126
|
|
|
127
127
|
it('should handle JSON arrays', () => {
|
|
128
128
|
const template = '["{{LANG_CODE}}", "{{KIRO_DIR}}", "{{AGENT_DIR}}"]';
|
|
129
|
-
const context = createTemplateContext('ja', '.kiro', '.
|
|
129
|
+
const context = createTemplateContext('ja', '.kiro', '.claude');
|
|
130
130
|
const result = renderJsonTemplate(template, context);
|
|
131
131
|
|
|
132
|
-
expect(result).toEqual(['ja', '.kiro', '.
|
|
132
|
+
expect(result).toEqual(['ja', '.kiro', '.claude']);
|
|
133
133
|
});
|
|
134
134
|
|
|
135
135
|
it('should throw on invalid JSON', () => {
|
|
136
136
|
const template = 'invalid json {{LANG_CODE}}';
|
|
137
|
-
const context = createTemplateContext('ja', '.kiro', '.
|
|
137
|
+
const context = createTemplateContext('ja', '.kiro', '.claude');
|
|
138
138
|
|
|
139
139
|
expect(() => renderJsonTemplate(template, context)).toThrow();
|
|
140
140
|
});
|
|
141
141
|
|
|
142
142
|
it('should throw with descriptive error for invalid JSON', () => {
|
|
143
143
|
const template = '{"incomplete": {{LANG_CODE}}';
|
|
144
|
-
const context = createTemplateContext('ja', '.kiro', '.
|
|
144
|
+
const context = createTemplateContext('ja', '.kiro', '.claude');
|
|
145
145
|
|
|
146
146
|
try {
|
|
147
147
|
renderJsonTemplate(template, context);
|
|
@@ -162,7 +162,7 @@ Line 3: .cursor`);
|
|
|
162
162
|
|
|
163
163
|
it('should preserve original error stack', () => {
|
|
164
164
|
const template = '{invalid json}';
|
|
165
|
-
const context = createTemplateContext('en', '.kiro', '.
|
|
165
|
+
const context = createTemplateContext('en', '.kiro', '.claude');
|
|
166
166
|
|
|
167
167
|
try {
|
|
168
168
|
renderJsonTemplate(template, context);
|
|
@@ -184,19 +184,19 @@ Line 3: .cursor`);
|
|
|
184
184
|
template2: 'Dir: {{KIRO_DIR}}',
|
|
185
185
|
template3: 'Agent: {{AGENT_DIR}}'
|
|
186
186
|
};
|
|
187
|
-
const context = createTemplateContext('ja', '.kiro', '.
|
|
187
|
+
const context = createTemplateContext('ja', '.kiro', '.claude');
|
|
188
188
|
const results = renderTemplates(templates, context);
|
|
189
189
|
|
|
190
190
|
expect(results).toEqual({
|
|
191
191
|
template1: 'Lang: ja',
|
|
192
192
|
template2: 'Dir: .kiro',
|
|
193
|
-
template3: 'Agent: .
|
|
193
|
+
template3: 'Agent: .claude'
|
|
194
194
|
});
|
|
195
195
|
});
|
|
196
196
|
|
|
197
197
|
it('should handle empty templates object', () => {
|
|
198
198
|
const templates = {};
|
|
199
|
-
const context = createTemplateContext('ja', '.kiro', '.
|
|
199
|
+
const context = createTemplateContext('ja', '.kiro', '.claude');
|
|
200
200
|
const results = renderTemplates(templates, context);
|
|
201
201
|
|
|
202
202
|
expect(results).toEqual({});
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* テンプレートファイル検索ユーティリティ
|
|
3
|
-
*
|
|
3
|
+
*
|
|
4
4
|
* Issue #35: cc-sdd準拠のテンプレート検索
|
|
5
|
-
*
|
|
5
|
+
* Claude環境のテンプレートを検索
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
import { existsSync } from 'fs';
|
|
@@ -18,22 +18,16 @@ import { join } from 'path';
|
|
|
18
18
|
* @example
|
|
19
19
|
* ```typescript
|
|
20
20
|
* const path = findTemplateFile('/path/to/michi', 'rules/github-ssot.mdc');
|
|
21
|
-
* // returns: '/path/to/michi/templates/
|
|
21
|
+
* // returns: '/path/to/michi/templates/claude/rules/github-ssot.mdc'
|
|
22
22
|
* ```
|
|
23
23
|
*/
|
|
24
24
|
export function findTemplateFile(michiPath: string, relativePath: string): string | null {
|
|
25
|
-
//
|
|
26
|
-
const cursorPath = join(michiPath, 'templates/cursor', relativePath);
|
|
27
|
-
if (existsSync(cursorPath)) {
|
|
28
|
-
return cursorPath;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
// 優先順位2: templates/claude/
|
|
25
|
+
// templates/claude/
|
|
32
26
|
const claudePath = join(michiPath, 'templates/claude', relativePath);
|
|
33
27
|
if (existsSync(claudePath)) {
|
|
34
28
|
return claudePath;
|
|
35
29
|
}
|
|
36
|
-
|
|
30
|
+
|
|
37
31
|
return null;
|
|
38
32
|
}
|
|
39
33
|
|
package/docs/guides/ai-tools.md
DELETED
|
@@ -1,311 +0,0 @@
|
|
|
1
|
-
# AIツール統合ガイド
|
|
2
|
-
|
|
3
|
-
Michiは、Claude Code以外のAI開発ツールもサポートしています。
|
|
4
|
-
このガイドでは、Cursor、Gemini CLI、Codex CLI、Clineの各ツールでMichiを使用するためのセットアップと基本的な使い方を説明します。
|
|
5
|
-
|
|
6
|
-
## 対応AIツール一覧
|
|
7
|
-
|
|
8
|
-
| ツール | 種別 | 推奨用途 | セットアップコマンド |
|
|
9
|
-
|--------|------|---------|---------------------|
|
|
10
|
-
| Claude Code | CLI | メイン開発ツール | `michi setup --claude` |
|
|
11
|
-
| Cursor | エディタ統合 | コード編集・生成 | `michi setup --cursor` |
|
|
12
|
-
| Gemini CLI | CLI | Google AI活用 | `michi setup --gemini` |
|
|
13
|
-
| Codex CLI | CLI | プロンプトベース開発 | `michi setup --codex` |
|
|
14
|
-
| Cline | VS Code拡張 | エディタ統合AI | `michi setup --cline` |
|
|
15
|
-
|
|
16
|
-
**注意**: すべてのツールで同じワークフロー(`/kiro:*`、`/michi:*`コマンド)が利用可能です。
|
|
17
|
-
|
|
18
|
-
## 共通セットアップ手順
|
|
19
|
-
|
|
20
|
-
### 1. cc-sddのインストール
|
|
21
|
-
|
|
22
|
-
すべてのツールで、まずcc-sddをインストールします。
|
|
23
|
-
|
|
24
|
-
```bash
|
|
25
|
-
npx cc-sdd@latest --lang ja
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
**生成されるファイル**:
|
|
29
|
-
- `.kiro/settings/` - cc-sdd標準のルール、テンプレート(`.gitignore`対象)
|
|
30
|
-
- `.kiro/steering/` - プロジェクト固有のコンテキスト
|
|
31
|
-
- `.kiro/specs/` - 機能仕様(Git管理)
|
|
32
|
-
|
|
33
|
-
### 2. 環境変数の設定(オプション)
|
|
34
|
-
|
|
35
|
-
JIRA/Confluence連携を使用する場合、環境変数を設定してください。
|
|
36
|
-
|
|
37
|
-
```bash
|
|
38
|
-
# .envファイルに以下を追加
|
|
39
|
-
ATLASSIAN_URL=https://your-domain.atlassian.net
|
|
40
|
-
ATLASSIAN_EMAIL=your-email@example.com
|
|
41
|
-
ATLASSIAN_API_TOKEN=your-api-token
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
詳細は [環境変数リファレンス](../reference/environment-variables.md) を参照してください。
|
|
45
|
-
|
|
46
|
-
## Cursor
|
|
47
|
-
|
|
48
|
-
### 概要
|
|
49
|
-
|
|
50
|
-
Cursorは、AI統合エディタです。コードエディタ内でAIによるコード生成、リファクタリング、ドキュメント作成を行えます。
|
|
51
|
-
|
|
52
|
-
### セットアップ
|
|
53
|
-
|
|
54
|
-
```bash
|
|
55
|
-
# Cursor固有の拡張をインストール
|
|
56
|
-
michi setup --cursor
|
|
57
|
-
```
|
|
58
|
-
|
|
59
|
-
**生成されるファイル**:
|
|
60
|
-
- `.cursor/rules/` - Cursor固有ルール
|
|
61
|
-
- `michi-core.md` - Michi基本原則
|
|
62
|
-
- `atlassian-mcp.md` - Atlassian MCP統合
|
|
63
|
-
- `github-ssot.md` - GitHub SSoT原則
|
|
64
|
-
- `multi-project.mdc` - マルチプロジェクト管理
|
|
65
|
-
- `.cursor/commands/michi/` - Michiコマンド
|
|
66
|
-
- `confluence-sync.md` - Confluence同期
|
|
67
|
-
- `project-switch.md` - プロジェクト切り替え
|
|
68
|
-
- `.cursor/commands/kiro/` - Kiroコマンド
|
|
69
|
-
- `kiro-spec-tasks.md` - タスク分割
|
|
70
|
-
- `kiro-spec-impl.md` - TDD実装
|
|
71
|
-
|
|
72
|
-
### 利用可能なコマンド
|
|
73
|
-
|
|
74
|
-
Cursorでは、以下のコマンドが利用できます:
|
|
75
|
-
|
|
76
|
-
```bash
|
|
77
|
-
# cc-sdd標準コマンド
|
|
78
|
-
/kiro:spec-init "機能の説明"
|
|
79
|
-
/kiro:spec-requirements {feature}
|
|
80
|
-
/kiro:spec-design {feature}
|
|
81
|
-
/michi:spec-tasks {feature}
|
|
82
|
-
/kiro:spec-impl {feature}
|
|
83
|
-
|
|
84
|
-
# Michi拡張コマンド
|
|
85
|
-
/michi:confluence-sync {feature} {type}
|
|
86
|
-
/michi:project-switch
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
### 特徴
|
|
90
|
-
|
|
91
|
-
- エディタ内でのリアルタイムコード提案
|
|
92
|
-
- MCP(Model Context Protocol)によるAtlassian統合
|
|
93
|
-
- プロジェクト切り替え機能
|
|
94
|
-
|
|
95
|
-
## Gemini CLI
|
|
96
|
-
|
|
97
|
-
### 概要
|
|
98
|
-
|
|
99
|
-
Gemini CLIは、Google AIを活用したCLIツールです。プロンプトベースで仕様書やコードを生成できます。
|
|
100
|
-
|
|
101
|
-
### セットアップ
|
|
102
|
-
|
|
103
|
-
```bash
|
|
104
|
-
# Gemini CLI固有の拡張をインストール
|
|
105
|
-
michi setup --gemini
|
|
106
|
-
```
|
|
107
|
-
|
|
108
|
-
**生成されるファイル**:
|
|
109
|
-
- `.gemini/GEMINI.md` - Gemini CLI設定
|
|
110
|
-
- `.gemini/commands/` - Gemini CLI専用コマンド
|
|
111
|
-
|
|
112
|
-
### 利用可能なコマンド
|
|
113
|
-
|
|
114
|
-
Gemini CLIでは、以下のコマンドが利用できます:
|
|
115
|
-
|
|
116
|
-
```bash
|
|
117
|
-
# cc-sdd標準コマンド
|
|
118
|
-
/kiro:spec-init "機能の説明"
|
|
119
|
-
/kiro:spec-requirements {feature}
|
|
120
|
-
/kiro:spec-design {feature}
|
|
121
|
-
/michi:spec-tasks {feature}
|
|
122
|
-
/kiro:spec-impl {feature}
|
|
123
|
-
|
|
124
|
-
# Gemini固有の操作
|
|
125
|
-
# GitHubにコミット後、Confluence同期を実行
|
|
126
|
-
michi confluence:sync {feature} requirements
|
|
127
|
-
```
|
|
128
|
-
|
|
129
|
-
### 特徴
|
|
130
|
-
|
|
131
|
-
- Google AIの最新モデルを使用
|
|
132
|
-
- プロジェクトコンテキスト(`.kiro/project.json`)の自動参照
|
|
133
|
-
- GitHub SSoT原則(GitHub→Confluence同期)
|
|
134
|
-
|
|
135
|
-
## Codex CLI
|
|
136
|
-
|
|
137
|
-
### 概要
|
|
138
|
-
|
|
139
|
-
Codex CLIは、プロンプトベースのAI開発ツールです。エージェントベースのワークフローをサポートします。
|
|
140
|
-
|
|
141
|
-
### セットアップ
|
|
142
|
-
|
|
143
|
-
```bash
|
|
144
|
-
# Codex CLI固有の拡張をインストール
|
|
145
|
-
michi setup --codex
|
|
146
|
-
```
|
|
147
|
-
|
|
148
|
-
**生成されるファイル**:
|
|
149
|
-
- `AGENTS.override.md` - Codex CLI用エージェント設定
|
|
150
|
-
- `.codex/prompts/` - Codex CLI専用プロンプト
|
|
151
|
-
- `confluence-sync.md` - Confluence同期プロンプト
|
|
152
|
-
|
|
153
|
-
### 利用可能なプロンプト
|
|
154
|
-
|
|
155
|
-
Codex CLIでは、以下のプロンプトが利用できます:
|
|
156
|
-
|
|
157
|
-
```bash
|
|
158
|
-
# cc-sdd標準フロー
|
|
159
|
-
/kiro:spec-init FEATURE=calculator-app
|
|
160
|
-
/kiro:spec-requirements FEATURE=calculator-app
|
|
161
|
-
/kiro:spec-design FEATURE=calculator-app
|
|
162
|
-
/michi:spec-tasks FEATURE=calculator-app
|
|
163
|
-
/kiro:spec-impl FEATURE=calculator-app
|
|
164
|
-
|
|
165
|
-
# Michi拡張プロンプト
|
|
166
|
-
/prompts:confluence-sync FEATURE=calculator-app
|
|
167
|
-
```
|
|
168
|
-
|
|
169
|
-
### 特徴
|
|
170
|
-
|
|
171
|
-
- エージェントベースのワークフロー
|
|
172
|
-
- Michi固有のテスト戦略(マスタテスト方式)
|
|
173
|
-
- 対応言語: Node.js、Java(Gradle)、PHP
|
|
174
|
-
|
|
175
|
-
### テスト戦略
|
|
176
|
-
|
|
177
|
-
Codex CLIでは、Michi固有のマスタテスト方式を採用しています。
|
|
178
|
-
|
|
179
|
-
**Phase A(PR時に自動実行)**:
|
|
180
|
-
- 単体テスト
|
|
181
|
-
- Lint
|
|
182
|
-
- ビルド
|
|
183
|
-
|
|
184
|
-
**Phase B(リリース前に手動実行)**:
|
|
185
|
-
- 統合テスト
|
|
186
|
-
- E2Eテスト
|
|
187
|
-
- パフォーマンステスト
|
|
188
|
-
- セキュリティテスト
|
|
189
|
-
|
|
190
|
-
詳細は [ワークフローガイド](workflow.md) を参照してください。
|
|
191
|
-
|
|
192
|
-
## Cline
|
|
193
|
-
|
|
194
|
-
### 概要
|
|
195
|
-
|
|
196
|
-
Clineは、VS Code拡張機能として動作するAIツールです。エディタ内でAIによるコード生成、リファクタリング、ドキュメント作成を行えます。
|
|
197
|
-
|
|
198
|
-
### セットアップ
|
|
199
|
-
|
|
200
|
-
```bash
|
|
201
|
-
# Cline固有の拡張をインストール
|
|
202
|
-
michi setup --cline
|
|
203
|
-
```
|
|
204
|
-
|
|
205
|
-
**生成されるファイル**:
|
|
206
|
-
- `.clinerules/rules/` - Cline固有ルール
|
|
207
|
-
- `michi-core.md` - Michi基本原則
|
|
208
|
-
- `atlassian-integration.md` - Atlassian統合ルール
|
|
209
|
-
|
|
210
|
-
### 利用可能な機能
|
|
211
|
-
|
|
212
|
-
Clineでは、以下の機能が利用できます:
|
|
213
|
-
|
|
214
|
-
```bash
|
|
215
|
-
# cc-sdd標準コマンド
|
|
216
|
-
/kiro:spec-init "機能の説明"
|
|
217
|
-
/kiro:spec-requirements {feature}
|
|
218
|
-
/kiro:spec-design {feature}
|
|
219
|
-
/michi:spec-tasks {feature}
|
|
220
|
-
/kiro:spec-impl {feature}
|
|
221
|
-
|
|
222
|
-
# Michi拡張
|
|
223
|
-
# エディタ内でAtlassian統合を使用
|
|
224
|
-
```
|
|
225
|
-
|
|
226
|
-
### 特徴
|
|
227
|
-
|
|
228
|
-
- VS Code拡張として動作
|
|
229
|
-
- エディタ内でのリアルタイムコード提案
|
|
230
|
-
- GitHub SSoT原則のサポート
|
|
231
|
-
- Multi-Project管理機能
|
|
232
|
-
|
|
233
|
-
## 共通注意事項
|
|
234
|
-
|
|
235
|
-
### ワークフローの一貫性
|
|
236
|
-
|
|
237
|
-
すべてのAIツールで、同じワークフロー(cc-sdd + Michi拡張)が利用できます。
|
|
238
|
-
|
|
239
|
-
**基本フロー**:
|
|
240
|
-
```
|
|
241
|
-
Phase 0.0 → 0.1 → 0.2 → 0.5 → Phase 2
|
|
242
|
-
```
|
|
243
|
-
|
|
244
|
-
**完全フロー(Michi拡張含む)**:
|
|
245
|
-
```
|
|
246
|
-
Phase 0.0 → 0.1 → 0.2 → [0.3-0.4] → 0.5 → 0.6-0.7
|
|
247
|
-
→ Phase 1 → Phase 2 → Phase A → Phase 3 → Phase B → Phase 4-5
|
|
248
|
-
```
|
|
249
|
-
|
|
250
|
-
詳細は [ワークフローガイド](workflow.md) を参照してください。
|
|
251
|
-
|
|
252
|
-
### GitHub SSoT原則
|
|
253
|
-
|
|
254
|
-
すべてのツールで、GitHub SSoT(Single Source of Truth)原則を遵守します。
|
|
255
|
-
|
|
256
|
-
**基本原則**:
|
|
257
|
-
- すべての仕様はGitHub(`.kiro/specs/`)で管理
|
|
258
|
-
- Confluenceは参照と承認のみ(編集はGitHubのみ)
|
|
259
|
-
- 重複管理を避ける
|
|
260
|
-
|
|
261
|
-
**データフロー**:
|
|
262
|
-
```
|
|
263
|
-
GitHub (.kiro/specs/) ← 真実の源(編集可能)
|
|
264
|
-
↓ 同期
|
|
265
|
-
Confluence ← 表示と承認(読み取り専用)
|
|
266
|
-
```
|
|
267
|
-
|
|
268
|
-
### Multi-Project管理
|
|
269
|
-
|
|
270
|
-
すべてのツールで、Multi-Project管理機能が利用できます。
|
|
271
|
-
|
|
272
|
-
**プロジェクトメタデータ**(`.kiro/project.json`):
|
|
273
|
-
```json
|
|
274
|
-
{
|
|
275
|
-
"projectId": "my-project",
|
|
276
|
-
"jiraProjectKey": "MYPROJ",
|
|
277
|
-
"confluenceSpaceKey": "MYSPACE",
|
|
278
|
-
"confluenceLabels": ["ai-development", "michi"]
|
|
279
|
-
}
|
|
280
|
-
```
|
|
281
|
-
|
|
282
|
-
詳細は [Multi-Repoガイド](multi-repo.md) を参照してください。
|
|
283
|
-
|
|
284
|
-
### コマンド実行方法の違い
|
|
285
|
-
|
|
286
|
-
| ツール | コマンド形式 | 実行場所 |
|
|
287
|
-
|--------|------------|---------|
|
|
288
|
-
| Claude Code | `/kiro:*`, `/michi:*` | CLI |
|
|
289
|
-
| Cursor | `/kiro:*`, `/michi:*` | エディタ内 |
|
|
290
|
-
| Gemini CLI | `/kiro:*`, `michi *` | CLI |
|
|
291
|
-
| Codex CLI | `/kiro:*`, `/prompts:*` | CLI |
|
|
292
|
-
| Cline | `/kiro:*`, `/michi:*` | VS Code拡張 |
|
|
293
|
-
|
|
294
|
-
## 推奨ツールの選び方
|
|
295
|
-
|
|
296
|
-
| 用途 | 推奨ツール | 理由 |
|
|
297
|
-
|------|-----------|------|
|
|
298
|
-
| メイン開発 | Claude Code | 最も完全な統合、サブエージェント機能 |
|
|
299
|
-
| コード編集 | Cursor | エディタ統合、リアルタイム提案 |
|
|
300
|
-
| Google AI活用 | Gemini CLI | Google AIの最新モデル |
|
|
301
|
-
| プロンプトベース | Codex CLI | エージェントベースワークフロー |
|
|
302
|
-
| VS Code統合 | Cline | VS Code拡張、エディタ内完結 |
|
|
303
|
-
|
|
304
|
-
## 関連ドキュメント
|
|
305
|
-
|
|
306
|
-
- [Claude Codeセットアップガイド](claude-code.md) - Claude Code固有のセットアップ
|
|
307
|
-
- [AIコマンドリファレンス](../reference/ai-commands.md) - すべてのコマンドの詳細
|
|
308
|
-
- [ワークフローガイド](workflow.md) - 開発ワークフロー全体像
|
|
309
|
-
- [Atlassian連携ガイド](atlassian-integration.md) - JIRA/Confluence連携の詳細
|
|
310
|
-
- [環境変数リファレンス](../reference/environment-variables.md) - 環境変数の詳細設定
|
|
311
|
-
- [トラブルシューティング](../troubleshooting.md) - よくある問題と解決策
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
# Atlassian Integration Rules
|
|
2
|
-
|
|
3
|
-
## Confluence Integration
|
|
4
|
-
|
|
5
|
-
### Page Creation Format
|
|
6
|
-
- Title: `[{{PROJECT_ID}}] {document_type}`
|
|
7
|
-
- Labels: Use {{KIRO_DIR}}/project.json `confluenceLabels`
|
|
8
|
-
- Space: Reference environment variables (CONFLUENCE_PRD_SPACE, etc.)
|
|
9
|
-
|
|
10
|
-
### Content Sync
|
|
11
|
-
- Source: GitHub {{KIRO_DIR}}/specs/
|
|
12
|
-
- Destination: Confluence pages
|
|
13
|
-
- Sync tool: `npm run confluence:sync`
|
|
14
|
-
|
|
15
|
-
## JIRA Integration
|
|
16
|
-
|
|
17
|
-
### Issue Creation Format
|
|
18
|
-
- Summary: `[{{JIRA_KEY}}] {title}`
|
|
19
|
-
- Project Key: Use {{KIRO_DIR}}/project.json `jiraProjectKey`
|
|
20
|
-
- Labels: Derived from Confluence labels
|
|
21
|
-
|
|
22
|
-
### Workflow
|
|
23
|
-
1. Generate specs in GitHub
|
|
24
|
-
2. Create JIRA epics/stories
|
|
25
|
-
3. Link Confluence pages to JIRA issues
|
|
26
|
-
|
|
27
|
-
## Environment Variables
|
|
28
|
-
|
|
29
|
-
Required variables (from .env):
|
|
30
|
-
- `ATLASSIAN_URL`
|
|
31
|
-
- `ATLASSIAN_EMAIL`
|
|
32
|
-
- `ATLASSIAN_API_TOKEN`
|
|
33
|
-
- `JIRA_PROJECT_KEYS`
|
|
34
|
-
- `CONFLUENCE_PRD_SPACE`
|
|
35
|
-
- `CONFLUENCE_QA_SPACE`
|
|
36
|
-
- `CONFLUENCE_RELEASE_SPACE`
|