@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.
Files changed (48) hide show
  1. package/README.md +3 -10
  2. package/dist/scripts/constants/environments.d.ts +1 -1
  3. package/dist/scripts/constants/environments.d.ts.map +1 -1
  4. package/dist/scripts/constants/environments.js +0 -20
  5. package/dist/scripts/constants/environments.js.map +1 -1
  6. package/dist/scripts/utils/template-finder.d.ts +2 -2
  7. package/dist/scripts/utils/template-finder.d.ts.map +1 -1
  8. package/dist/scripts/utils/template-finder.js +3 -8
  9. package/dist/scripts/utils/template-finder.js.map +1 -1
  10. package/dist/src/cli.d.ts.map +1 -1
  11. package/dist/src/cli.js +0 -8
  12. package/dist/src/cli.js.map +1 -1
  13. package/dist/src/commands/init.d.ts +0 -4
  14. package/dist/src/commands/init.d.ts.map +1 -1
  15. package/dist/src/commands/init.js +6 -30
  16. package/dist/src/commands/init.js.map +1 -1
  17. package/dist/src/commands/setup-existing.d.ts +2 -6
  18. package/dist/src/commands/setup-existing.d.ts.map +1 -1
  19. package/dist/src/commands/setup-existing.js +8 -142
  20. package/dist/src/commands/setup-existing.js.map +1 -1
  21. package/docs/getting-started/configuration.md +0 -29
  22. package/docs/getting-started/quick-start.md +2 -2
  23. package/docs/guides/workflow.md +1 -1
  24. package/docs/reference/cli.md +0 -4
  25. package/docs/troubleshooting.md +0 -45
  26. package/package.json +1 -3
  27. package/scripts/__tests__/create-project.test.ts +12 -12
  28. package/scripts/__tests__/setup-existing-project.test.ts +22 -22
  29. package/scripts/constants/__tests__/environments.test.ts +7 -50
  30. package/scripts/constants/environments.ts +1 -27
  31. package/scripts/template/__tests__/renderer.test.ts +21 -21
  32. package/scripts/utils/template-finder.ts +5 -11
  33. package/docs/guides/ai-tools.md +0 -311
  34. package/templates/cline/rules/atlassian-integration.md +0 -36
  35. package/templates/cline/rules/michi-core.md +0 -56
  36. package/templates/codex/AGENTS.override.md +0 -277
  37. package/templates/codex/prompts/confluence-sync.md +0 -177
  38. package/templates/codex/rules/README.md +0 -210
  39. package/templates/cursor/commands/kiro/kiro-spec-impl.md +0 -244
  40. package/templates/cursor/commands/kiro/kiro-spec-tasks.md +0 -354
  41. package/templates/cursor/commands/michi/confluence-sync.md +0 -76
  42. package/templates/cursor/commands/michi/project-switch.md +0 -69
  43. package/templates/cursor/commands/michi/spec-tasks.md +0 -117
  44. package/templates/cursor/rules/atlassian-mcp.mdc +0 -188
  45. package/templates/cursor/rules/github-ssot.mdc +0 -151
  46. package/templates/cursor/rules/multi-project.mdc +0 -81
  47. package/templates/gemini/commands/README.md +0 -41
  48. 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 = 'cursor';
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(6);
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', '.cursor');
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('.cursor');
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', '.cursor');
24
+ const contextJa = createTemplateContext('ja', '.kiro', '.claude');
25
25
  expect(contextJa.DEV_GUIDELINES).toContain('日本語');
26
26
 
27
- const contextEn = createTemplateContext('en', '.kiro', '.cursor');
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', '.cursor');
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', '.cursor');
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', '.cursor');
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', '.cursor');
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', '.cursor');
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', '.cursor');
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', '.cursor');
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: .cursor`);
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', '.cursor');
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', '.cursor');
129
+ const context = createTemplateContext('ja', '.kiro', '.claude');
130
130
  const result = renderJsonTemplate(template, context);
131
131
 
132
- expect(result).toEqual(['ja', '.kiro', '.cursor']);
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', '.cursor');
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', '.cursor');
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', '.cursor');
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', '.cursor');
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: .cursor'
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', '.cursor');
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
- * Cursor/Claude両環境のテンプレートを優先順位付きで検索
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/cursor/rules/github-ssot.mdc'
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
- // 優先順位1: templates/cursor/
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
 
@@ -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`