@sk8metal/michi-cli 0.0.7 → 0.0.9

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 (175) hide show
  1. package/CHANGELOG.md +55 -0
  2. package/README.md +205 -11
  3. package/dist/scripts/__tests__/create-project.test.d.ts +2 -0
  4. package/dist/scripts/__tests__/create-project.test.d.ts.map +1 -0
  5. package/dist/scripts/__tests__/create-project.test.js +247 -0
  6. package/dist/scripts/__tests__/create-project.test.js.map +1 -0
  7. package/dist/scripts/__tests__/multi-project-estimate.test.d.ts +2 -0
  8. package/dist/scripts/__tests__/multi-project-estimate.test.d.ts.map +1 -0
  9. package/dist/scripts/__tests__/multi-project-estimate.test.js +119 -0
  10. package/dist/scripts/__tests__/multi-project-estimate.test.js.map +1 -0
  11. package/dist/scripts/__tests__/setup-existing-project.test.d.ts +2 -0
  12. package/dist/scripts/__tests__/setup-existing-project.test.d.ts.map +1 -0
  13. package/dist/scripts/__tests__/setup-existing-project.test.js +129 -0
  14. package/dist/scripts/__tests__/setup-existing-project.test.js.map +1 -0
  15. package/dist/scripts/__tests__/setup-interactive.test.d.ts +2 -0
  16. package/dist/scripts/__tests__/setup-interactive.test.d.ts.map +1 -0
  17. package/dist/scripts/__tests__/setup-interactive.test.js +160 -0
  18. package/dist/scripts/__tests__/setup-interactive.test.js.map +1 -0
  19. package/dist/scripts/config/default-config.json +57 -0
  20. package/dist/scripts/confluence-sync.d.ts +4 -0
  21. package/dist/scripts/confluence-sync.d.ts.map +1 -1
  22. package/dist/scripts/confluence-sync.js +12 -23
  23. package/dist/scripts/confluence-sync.js.map +1 -1
  24. package/dist/scripts/constants/__tests__/environments.test.d.ts +2 -0
  25. package/dist/scripts/constants/__tests__/environments.test.d.ts.map +1 -0
  26. package/dist/scripts/constants/__tests__/environments.test.js +91 -0
  27. package/dist/scripts/constants/__tests__/environments.test.js.map +1 -0
  28. package/dist/scripts/constants/__tests__/languages.test.d.ts +2 -0
  29. package/dist/scripts/constants/__tests__/languages.test.d.ts.map +1 -0
  30. package/dist/scripts/constants/__tests__/languages.test.js +82 -0
  31. package/dist/scripts/constants/__tests__/languages.test.js.map +1 -0
  32. package/dist/scripts/constants/environments.d.ts +33 -0
  33. package/dist/scripts/constants/environments.d.ts.map +1 -0
  34. package/dist/scripts/constants/environments.js +49 -0
  35. package/dist/scripts/constants/environments.js.map +1 -0
  36. package/dist/scripts/constants/languages.d.ts +23 -0
  37. package/dist/scripts/constants/languages.d.ts.map +1 -0
  38. package/dist/scripts/constants/languages.js +53 -0
  39. package/dist/scripts/constants/languages.js.map +1 -0
  40. package/dist/scripts/create-project.d.ts +4 -0
  41. package/dist/scripts/create-project.d.ts.map +1 -1
  42. package/dist/scripts/create-project.js +227 -137
  43. package/dist/scripts/create-project.js.map +1 -1
  44. package/dist/scripts/jira-sync.d.ts.map +1 -1
  45. package/dist/scripts/jira-sync.js +15 -0
  46. package/dist/scripts/jira-sync.js.map +1 -1
  47. package/dist/scripts/list-projects.d.ts.map +1 -1
  48. package/dist/scripts/list-projects.js +42 -15
  49. package/dist/scripts/list-projects.js.map +1 -1
  50. package/dist/scripts/multi-project-estimate.d.ts.map +1 -1
  51. package/dist/scripts/multi-project-estimate.js +56 -21
  52. package/dist/scripts/multi-project-estimate.js.map +1 -1
  53. package/dist/scripts/resource-dashboard.d.ts.map +1 -1
  54. package/dist/scripts/resource-dashboard.js +74 -17
  55. package/dist/scripts/resource-dashboard.js.map +1 -1
  56. package/dist/scripts/setup-existing-project.d.ts +3 -1
  57. package/dist/scripts/setup-existing-project.d.ts.map +1 -1
  58. package/dist/scripts/setup-existing-project.js +306 -217
  59. package/dist/scripts/setup-existing-project.js.map +1 -1
  60. package/dist/scripts/setup-interactive.d.ts +10 -0
  61. package/dist/scripts/setup-interactive.d.ts.map +1 -0
  62. package/dist/scripts/setup-interactive.js +413 -0
  63. package/dist/scripts/setup-interactive.js.map +1 -0
  64. package/dist/scripts/template/__tests__/renderer.test.d.ts +2 -0
  65. package/dist/scripts/template/__tests__/renderer.test.d.ts.map +1 -0
  66. package/dist/scripts/template/__tests__/renderer.test.js +165 -0
  67. package/dist/scripts/template/__tests__/renderer.test.js.map +1 -0
  68. package/dist/scripts/template/renderer.d.ts +70 -0
  69. package/dist/scripts/template/renderer.d.ts.map +1 -0
  70. package/dist/scripts/template/renderer.js +99 -0
  71. package/dist/scripts/template/renderer.js.map +1 -0
  72. package/dist/scripts/utils/__tests__/config-validator.test.js +5 -0
  73. package/dist/scripts/utils/__tests__/config-validator.test.js.map +1 -1
  74. package/dist/scripts/utils/__tests__/spec-updater.test.d.ts +5 -0
  75. package/dist/scripts/utils/__tests__/spec-updater.test.d.ts.map +1 -0
  76. package/dist/scripts/utils/__tests__/spec-updater.test.js +158 -0
  77. package/dist/scripts/utils/__tests__/spec-updater.test.js.map +1 -0
  78. package/dist/scripts/utils/confluence-hierarchy.d.ts +2 -1
  79. package/dist/scripts/utils/confluence-hierarchy.d.ts.map +1 -1
  80. package/dist/scripts/utils/confluence-hierarchy.js +5 -0
  81. package/dist/scripts/utils/confluence-hierarchy.js.map +1 -1
  82. package/dist/scripts/utils/project-finder.d.ts +30 -0
  83. package/dist/scripts/utils/project-finder.d.ts.map +1 -0
  84. package/dist/scripts/utils/project-finder.js +147 -0
  85. package/dist/scripts/utils/project-finder.js.map +1 -0
  86. package/dist/scripts/utils/spec-updater.d.ts +72 -0
  87. package/dist/scripts/utils/spec-updater.d.ts.map +1 -0
  88. package/dist/scripts/utils/spec-updater.js +141 -0
  89. package/dist/scripts/utils/spec-updater.js.map +1 -0
  90. package/dist/scripts/utils/template-finder.d.ts +37 -0
  91. package/dist/scripts/utils/template-finder.d.ts.map +1 -0
  92. package/dist/scripts/utils/template-finder.js +63 -0
  93. package/dist/scripts/utils/template-finder.js.map +1 -0
  94. package/dist/src/__tests__/integration/setup/claude-agent.test.d.ts +5 -0
  95. package/dist/src/__tests__/integration/setup/claude-agent.test.d.ts.map +1 -0
  96. package/dist/src/__tests__/integration/setup/claude-agent.test.js +125 -0
  97. package/dist/src/__tests__/integration/setup/claude-agent.test.js.map +1 -0
  98. package/dist/src/__tests__/integration/setup/claude.test.d.ts +5 -0
  99. package/dist/src/__tests__/integration/setup/claude.test.d.ts.map +1 -0
  100. package/dist/src/__tests__/integration/setup/claude.test.js +111 -0
  101. package/dist/src/__tests__/integration/setup/claude.test.js.map +1 -0
  102. package/dist/src/__tests__/integration/setup/cursor.test.d.ts +5 -0
  103. package/dist/src/__tests__/integration/setup/cursor.test.d.ts.map +1 -0
  104. package/dist/src/__tests__/integration/setup/cursor.test.js +162 -0
  105. package/dist/src/__tests__/integration/setup/cursor.test.js.map +1 -0
  106. package/dist/src/__tests__/integration/setup/helpers/fs-assertions.d.ts +32 -0
  107. package/dist/src/__tests__/integration/setup/helpers/fs-assertions.d.ts.map +1 -0
  108. package/dist/src/__tests__/integration/setup/helpers/fs-assertions.js +72 -0
  109. package/dist/src/__tests__/integration/setup/helpers/fs-assertions.js.map +1 -0
  110. package/dist/src/__tests__/integration/setup/helpers/test-project.d.ts +38 -0
  111. package/dist/src/__tests__/integration/setup/helpers/test-project.d.ts.map +1 -0
  112. package/dist/src/__tests__/integration/setup/helpers/test-project.js +83 -0
  113. package/dist/src/__tests__/integration/setup/helpers/test-project.js.map +1 -0
  114. package/dist/src/__tests__/integration/setup/validation.test.d.ts +5 -0
  115. package/dist/src/__tests__/integration/setup/validation.test.d.ts.map +1 -0
  116. package/dist/src/__tests__/integration/setup/validation.test.js +318 -0
  117. package/dist/src/__tests__/integration/setup/validation.test.js.map +1 -0
  118. package/dist/src/cli.d.ts.map +1 -1
  119. package/dist/src/cli.js +20 -0
  120. package/dist/src/cli.js.map +1 -1
  121. package/dist/src/commands/setup-existing.d.ts +22 -0
  122. package/dist/src/commands/setup-existing.d.ts.map +1 -0
  123. package/dist/src/commands/setup-existing.js +408 -0
  124. package/dist/src/commands/setup-existing.js.map +1 -0
  125. package/dist/vitest.config.d.ts.map +1 -1
  126. package/dist/vitest.config.js +9 -6
  127. package/dist/vitest.config.js.map +1 -1
  128. package/docs/README.md +2 -2
  129. package/docs/contributing/development.md +37 -0
  130. package/docs/getting-started/{new-project-setup.md → new-repository-setup.md} +165 -38
  131. package/docs/getting-started/quick-start.md +57 -6
  132. package/docs/getting-started/setup.md +551 -180
  133. package/docs/guides/customization.md +4 -4
  134. package/docs/guides/multi-project.md +12 -9
  135. package/docs/reference/quick-reference.md +27 -18
  136. package/docs/testing/integration-tests.md +297 -0
  137. package/docs/testing-strategy.md +87 -0
  138. package/package.json +23 -6
  139. package/scripts/__tests__/create-project.test.ts +292 -0
  140. package/scripts/__tests__/multi-project-estimate.test.ts +145 -0
  141. package/scripts/__tests__/setup-existing-project.test.ts +147 -0
  142. package/scripts/__tests__/setup-interactive.test.ts +199 -0
  143. package/scripts/confluence-sync.ts +17 -29
  144. package/scripts/constants/__tests__/environments.test.ts +110 -0
  145. package/scripts/constants/__tests__/languages.test.ts +100 -0
  146. package/scripts/constants/environments.ts +61 -0
  147. package/scripts/constants/languages.ts +70 -0
  148. package/scripts/copy-static-assets.js +50 -0
  149. package/scripts/create-project.ts +251 -158
  150. package/scripts/jira-sync.ts +16 -1
  151. package/scripts/list-projects.ts +51 -24
  152. package/scripts/multi-project-estimate.ts +58 -22
  153. package/scripts/resource-dashboard.ts +91 -26
  154. package/scripts/setup-existing-project.ts +350 -230
  155. package/scripts/setup-existing.sh +159 -25
  156. package/scripts/setup-interactive.ts +565 -0
  157. package/scripts/template/__tests__/renderer.test.ts +207 -0
  158. package/scripts/template/renderer.ts +133 -0
  159. package/scripts/utils/__tests__/config-validator.test.ts +6 -0
  160. package/scripts/utils/__tests__/spec-updater.test.ts +220 -0
  161. package/scripts/utils/confluence-hierarchy.ts +7 -1
  162. package/scripts/utils/project-finder.ts +184 -0
  163. package/scripts/utils/spec-updater.ts +212 -0
  164. package/scripts/utils/template-finder.ts +75 -0
  165. package/templates/claude/commands/michi/confluence-sync.md +38 -0
  166. package/templates/claude/commands/michi/project-switch.md +36 -0
  167. package/templates/claude/rules/atlassian-integration.md +35 -0
  168. package/templates/claude/rules/michi-core.md +54 -0
  169. package/templates/claude-agent/README.md +25 -0
  170. package/templates/cursor/commands/michi/confluence-sync.md +76 -0
  171. package/templates/cursor/commands/michi/project-switch.md +69 -0
  172. package/templates/cursor/rules/atlassian-mcp.mdc +188 -0
  173. package/templates/cursor/rules/github-ssot.mdc +151 -0
  174. package/templates/cursor/rules/multi-project.mdc +81 -0
  175. package/scripts/setup-env.sh +0 -52
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Integration tests for Claude Agent (Subagents) environment setup
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=claude-agent.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-agent.test.d.ts","sourceRoot":"","sources":["../../../../../src/__tests__/integration/setup/claude-agent.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,125 @@
1
+ /**
2
+ * Integration tests for Claude Agent (Subagents) environment setup
3
+ */
4
+ import { describe, it, beforeEach, afterEach, vi } from 'vitest';
5
+ import { join } from 'path';
6
+ import { setupExisting } from '../../../commands/setup-existing.js';
7
+ import { createTestProject } from './helpers/test-project.js';
8
+ import { assertDirectoryExists, assertFileExists, assertDirectoryStructure, assertFileContains } from './helpers/fs-assertions.js';
9
+ // Mock readline to auto-confirm prompts
10
+ vi.mock('readline', () => ({
11
+ createInterface: () => ({
12
+ question: (question, callback) => {
13
+ callback('y'); // Auto-confirm
14
+ },
15
+ close: () => { },
16
+ }),
17
+ }));
18
+ describe('Claude Agent Environment Setup', () => {
19
+ let testProject;
20
+ let originalCwd;
21
+ beforeEach(() => {
22
+ originalCwd = process.cwd();
23
+ testProject = createTestProject({ name: 'claude-agent-test' });
24
+ process.chdir(testProject.path);
25
+ });
26
+ afterEach(() => {
27
+ process.chdir(originalCwd);
28
+ testProject.destroy();
29
+ });
30
+ describe('Basic Setup', () => {
31
+ // TODO: Fix template structure (Issue #55)
32
+ it.skip('should create .claude/subagents directory', async () => {
33
+ await setupExisting({
34
+ claudeAgent: true,
35
+ projectName: 'Test Project',
36
+ jiraKey: 'TEST'
37
+ });
38
+ assertDirectoryExists(join(testProject.path, '.claude'));
39
+ assertDirectoryExists(join(testProject.path, '.claude/subagents'));
40
+ });
41
+ it('should create .kiro directory structure', async () => {
42
+ await setupExisting({
43
+ claudeAgent: true,
44
+ projectName: 'Test Project',
45
+ jiraKey: 'TEST'
46
+ });
47
+ assertDirectoryStructure(testProject.path, {
48
+ '.kiro': 'dir',
49
+ '.kiro/settings': 'dir',
50
+ '.kiro/settings/templates': 'dir',
51
+ '.kiro/steering': 'dir',
52
+ '.kiro/specs': 'dir',
53
+ });
54
+ });
55
+ it('should create project.json with correct metadata', async () => {
56
+ await setupExisting({
57
+ claudeAgent: true,
58
+ projectName: 'Agent Test',
59
+ jiraKey: 'AGNT'
60
+ });
61
+ const projectJsonPath = join(testProject.path, '.kiro/project.json');
62
+ assertFileExists(projectJsonPath);
63
+ assertFileContains(projectJsonPath, '"projectName": "Agent Test"');
64
+ assertFileContains(projectJsonPath, '"jiraProjectKey": "AGNT"');
65
+ });
66
+ it('should create .env template', async () => {
67
+ await setupExisting({
68
+ claudeAgent: true,
69
+ projectName: 'Test Project',
70
+ jiraKey: 'TEST'
71
+ });
72
+ const envPath = join(testProject.path, '.env');
73
+ assertFileExists(envPath);
74
+ assertFileContains(envPath, 'JIRA_PROJECT_KEYS=TEST');
75
+ });
76
+ });
77
+ describe('Claude Agent-specific Structure', () => {
78
+ // TODO: Fix template structure (Issue #55)
79
+ it.skip('should have subagents directory structure', async () => {
80
+ await setupExisting({
81
+ claudeAgent: true,
82
+ projectName: 'Test Project',
83
+ jiraKey: 'TEST'
84
+ });
85
+ const subagentsDir = join(testProject.path, '.claude/subagents');
86
+ assertDirectoryExists(subagentsDir);
87
+ });
88
+ it('should not create Cursor-specific directories', async () => {
89
+ await setupExisting({
90
+ claudeAgent: true,
91
+ projectName: 'Test Project',
92
+ jiraKey: 'TEST'
93
+ });
94
+ const { existsSync } = await import('fs');
95
+ const cursorDir = join(testProject.path, '.cursor');
96
+ // .cursor directory should not exist for Claude Agent setup
97
+ expect(existsSync(cursorDir)).toBe(false);
98
+ });
99
+ // TODO: Fix template structure (Issue #55)
100
+ it.skip('should not create basic Claude rules directory', async () => {
101
+ await setupExisting({
102
+ claudeAgent: true,
103
+ projectName: 'Test Project',
104
+ jiraKey: 'TEST'
105
+ });
106
+ const { existsSync } = await import('fs');
107
+ const claudeRulesDir = join(testProject.path, '.claude/rules');
108
+ // Basic .claude/rules should not exist for subagents setup
109
+ expect(existsSync(claudeRulesDir)).toBe(false);
110
+ });
111
+ });
112
+ describe('Language Support', () => {
113
+ it('should support multiple languages', async () => {
114
+ await setupExisting({
115
+ claudeAgent: true,
116
+ lang: 'zh-TW',
117
+ projectName: 'Test Project',
118
+ jiraKey: 'TEST'
119
+ });
120
+ const projectJson = join(testProject.path, '.kiro/project.json');
121
+ assertFileContains(projectJson, '"language": "zh-TW"');
122
+ });
123
+ });
124
+ });
125
+ //# sourceMappingURL=claude-agent.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-agent.test.js","sourceRoot":"","sources":["../../../../../src/__tests__/integration/setup/claude-agent.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Integration tests for Claude environment setup
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=claude.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude.test.d.ts","sourceRoot":"","sources":["../../../../../src/__tests__/integration/setup/claude.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,111 @@
1
+ /**
2
+ * Integration tests for Claude environment setup
3
+ */
4
+ import { describe, it, beforeEach, afterEach, vi } from 'vitest';
5
+ import { join } from 'path';
6
+ import { setupExisting } from '../../../commands/setup-existing.js';
7
+ import { createTestProject } from './helpers/test-project.js';
8
+ import { assertDirectoryExists, assertFileExists, assertDirectoryStructure, assertFileContains } from './helpers/fs-assertions.js';
9
+ // Mock readline to auto-confirm prompts
10
+ vi.mock('readline', () => ({
11
+ createInterface: () => ({
12
+ question: (question, callback) => {
13
+ callback('y'); // Auto-confirm
14
+ },
15
+ close: () => { },
16
+ }),
17
+ }));
18
+ describe('Claude Environment Setup', () => {
19
+ let testProject;
20
+ let originalCwd;
21
+ beforeEach(() => {
22
+ originalCwd = process.cwd();
23
+ testProject = createTestProject({ name: 'claude-test' });
24
+ process.chdir(testProject.path);
25
+ });
26
+ afterEach(() => {
27
+ process.chdir(originalCwd);
28
+ testProject.destroy();
29
+ });
30
+ describe('Basic Setup', () => {
31
+ it('should create .claude/rules directory', async () => {
32
+ await setupExisting({
33
+ claude: true,
34
+ projectName: 'Test Project',
35
+ jiraKey: 'TEST'
36
+ });
37
+ assertDirectoryExists(join(testProject.path, '.claude'));
38
+ assertDirectoryExists(join(testProject.path, '.claude/rules'));
39
+ });
40
+ it('should create .kiro directory structure', async () => {
41
+ await setupExisting({
42
+ claude: true,
43
+ projectName: 'Test Project',
44
+ jiraKey: 'TEST'
45
+ });
46
+ assertDirectoryStructure(testProject.path, {
47
+ '.kiro': 'dir',
48
+ '.kiro/settings': 'dir',
49
+ '.kiro/settings/templates': 'dir',
50
+ '.kiro/steering': 'dir',
51
+ '.kiro/specs': 'dir',
52
+ });
53
+ });
54
+ it('should create project.json with correct metadata', async () => {
55
+ await setupExisting({
56
+ claude: true,
57
+ projectName: 'Claude Test',
58
+ jiraKey: 'CLAU'
59
+ });
60
+ const projectJsonPath = join(testProject.path, '.kiro/project.json');
61
+ assertFileExists(projectJsonPath);
62
+ assertFileContains(projectJsonPath, '"projectName": "Claude Test"');
63
+ assertFileContains(projectJsonPath, '"jiraProjectKey": "CLAU"');
64
+ });
65
+ it('should create .env template', async () => {
66
+ await setupExisting({
67
+ claude: true,
68
+ projectName: 'Test Project',
69
+ jiraKey: 'TEST'
70
+ });
71
+ const envPath = join(testProject.path, '.env');
72
+ assertFileExists(envPath);
73
+ assertFileContains(envPath, 'JIRA_PROJECT_KEYS=TEST');
74
+ });
75
+ });
76
+ describe('Claude-specific Structure', () => {
77
+ it('should have Claude-specific rules structure', async () => {
78
+ await setupExisting({
79
+ claude: true,
80
+ projectName: 'Test Project',
81
+ jiraKey: 'TEST'
82
+ });
83
+ const rulesDir = join(testProject.path, '.claude/rules');
84
+ assertDirectoryExists(rulesDir);
85
+ });
86
+ it('should not create Cursor-specific directories', async () => {
87
+ await setupExisting({
88
+ claude: true,
89
+ projectName: 'Test Project',
90
+ jiraKey: 'TEST'
91
+ });
92
+ const { existsSync } = await import('fs');
93
+ const cursorDir = join(testProject.path, '.cursor');
94
+ // .cursor directory should not exist for Claude setup
95
+ expect(existsSync(cursorDir)).toBe(false);
96
+ });
97
+ });
98
+ describe('Language Support', () => {
99
+ it('should support multiple languages', async () => {
100
+ await setupExisting({
101
+ claude: true,
102
+ lang: 'en',
103
+ projectName: 'Test Project',
104
+ jiraKey: 'TEST'
105
+ });
106
+ const projectJson = join(testProject.path, '.kiro/project.json');
107
+ assertFileContains(projectJson, '"language": "en"');
108
+ });
109
+ });
110
+ });
111
+ //# sourceMappingURL=claude.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude.test.js","sourceRoot":"","sources":["../../../../../src/__tests__/integration/setup/claude.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Integration tests for Cursor environment setup
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=cursor.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor.test.d.ts","sourceRoot":"","sources":["../../../../../src/__tests__/integration/setup/cursor.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,162 @@
1
+ /**
2
+ * Integration tests for Cursor environment setup
3
+ */
4
+ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
5
+ import { join } from 'path';
6
+ import { setupExisting } from '../../../commands/setup-existing.js';
7
+ import { createTestProject } from './helpers/test-project.js';
8
+ import { assertDirectoryExists, assertFileExists, assertDirectoryStructure, assertFileContains } from './helpers/fs-assertions.js';
9
+ // Mock readline to auto-confirm prompts
10
+ vi.mock('readline', () => ({
11
+ createInterface: () => ({
12
+ question: (question, callback) => {
13
+ callback('y'); // Auto-confirm
14
+ },
15
+ close: () => { },
16
+ }),
17
+ }));
18
+ describe('Cursor Environment Setup', () => {
19
+ let testProject;
20
+ let originalCwd;
21
+ beforeEach(() => {
22
+ originalCwd = process.cwd();
23
+ testProject = createTestProject({ name: 'cursor-test' });
24
+ process.chdir(testProject.path);
25
+ });
26
+ afterEach(() => {
27
+ process.chdir(originalCwd);
28
+ testProject.destroy();
29
+ });
30
+ describe('Basic Setup', () => {
31
+ it('should create .cursor/rules directory', async () => {
32
+ await setupExisting({
33
+ cursor: true,
34
+ projectName: 'Test Project',
35
+ jiraKey: 'TEST'
36
+ });
37
+ // Assert directory structure
38
+ assertDirectoryExists(join(testProject.path, '.cursor'));
39
+ assertDirectoryExists(join(testProject.path, '.cursor/rules'));
40
+ assertDirectoryExists(join(testProject.path, '.cursor/commands'));
41
+ });
42
+ it('should create .kiro directory structure', async () => {
43
+ await setupExisting({
44
+ cursor: true,
45
+ projectName: 'Test Project',
46
+ jiraKey: 'TEST'
47
+ });
48
+ assertDirectoryStructure(testProject.path, {
49
+ '.kiro': 'dir',
50
+ '.kiro/settings': 'dir',
51
+ '.kiro/settings/templates': 'dir',
52
+ '.kiro/steering': 'dir',
53
+ '.kiro/specs': 'dir',
54
+ });
55
+ });
56
+ it('should create project.json with correct metadata', async () => {
57
+ await setupExisting({
58
+ cursor: true,
59
+ projectName: 'Test Project',
60
+ jiraKey: 'TEST'
61
+ });
62
+ const projectJsonPath = join(testProject.path, '.kiro/project.json');
63
+ assertFileExists(projectJsonPath);
64
+ assertFileContains(projectJsonPath, '"projectName": "Test Project"');
65
+ assertFileContains(projectJsonPath, '"jiraProjectKey": "TEST"');
66
+ assertFileContains(projectJsonPath, '"language": "ja"');
67
+ });
68
+ it('should create .env template', async () => {
69
+ await setupExisting({
70
+ cursor: true,
71
+ projectName: 'Test Project',
72
+ jiraKey: 'TEST'
73
+ });
74
+ const envPath = join(testProject.path, '.env');
75
+ assertFileExists(envPath);
76
+ assertFileContains(envPath, 'ATLASSIAN_URL=');
77
+ assertFileContains(envPath, 'JIRA_PROJECT_KEYS=TEST');
78
+ });
79
+ });
80
+ describe('Template Rendering', () => {
81
+ it('should render templates with correct placeholders', async () => {
82
+ await setupExisting({
83
+ cursor: true,
84
+ lang: 'ja',
85
+ projectName: 'Test Project',
86
+ jiraKey: 'TEST'
87
+ });
88
+ // Check if rules contain language-specific content
89
+ const rulesDir = join(testProject.path, '.cursor/rules');
90
+ assertDirectoryExists(rulesDir);
91
+ // Note: Actual file checks depend on template content
92
+ // This is a placeholder for template verification
93
+ });
94
+ });
95
+ describe('Language Support', () => {
96
+ it('should support Japanese language (default)', async () => {
97
+ await setupExisting({
98
+ cursor: true,
99
+ projectName: 'テストプロジェクト',
100
+ jiraKey: 'TEST'
101
+ });
102
+ const projectJson = join(testProject.path, '.kiro/project.json');
103
+ assertFileContains(projectJson, '"language": "ja"');
104
+ });
105
+ it('should support English language', async () => {
106
+ await setupExisting({
107
+ cursor: true,
108
+ lang: 'en',
109
+ projectName: 'Test Project',
110
+ jiraKey: 'TEST'
111
+ });
112
+ const projectJson = join(testProject.path, '.kiro/project.json');
113
+ assertFileContains(projectJson, '"language": "en"');
114
+ });
115
+ });
116
+ describe('Git Integration', () => {
117
+ it('should detect Git remote URL', async () => {
118
+ await setupExisting({
119
+ cursor: true,
120
+ projectName: 'Test Project',
121
+ jiraKey: 'TEST'
122
+ });
123
+ const projectJson = join(testProject.path, '.kiro/project.json');
124
+ assertFileContains(projectJson, /repository.*github\.com/);
125
+ });
126
+ it('should handle missing Git remote gracefully', async () => {
127
+ // Remove git remote
128
+ const { execSync } = await import('child_process');
129
+ try {
130
+ execSync('git remote remove origin', { cwd: testProject.path, stdio: 'ignore' });
131
+ }
132
+ catch {
133
+ // Ignore if remote doesn't exist
134
+ }
135
+ await setupExisting({
136
+ cursor: true,
137
+ projectName: 'Test Project',
138
+ jiraKey: 'TEST'
139
+ });
140
+ const projectJson = join(testProject.path, '.kiro/project.json');
141
+ assertFileExists(projectJson);
142
+ // Should have placeholder URL
143
+ assertFileContains(projectJson, /"repository":/);
144
+ });
145
+ });
146
+ describe('Error Handling', () => {
147
+ it('should fail gracefully if not in Git repository', async () => {
148
+ // Remove .git directory
149
+ const { rmSync } = await import('fs');
150
+ const gitPath = join(testProject.path, '.git');
151
+ rmSync(gitPath, { recursive: true, force: true });
152
+ await expect(async () => {
153
+ await setupExisting({
154
+ cursor: true,
155
+ projectName: 'Test Project',
156
+ jiraKey: 'TEST'
157
+ });
158
+ }).rejects.toThrow(/Gitリポジトリではありません/);
159
+ });
160
+ });
161
+ });
162
+ //# sourceMappingURL=cursor.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor.test.js","sourceRoot":"","sources":["../../../../../src/__tests__/integration/setup/cursor.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * File system assertion helpers for tests
3
+ */
4
+ /**
5
+ * Assert that a file exists
6
+ */
7
+ export declare function assertFileExists(filePath: string, message?: string): void;
8
+ /**
9
+ * Assert that a file does not exist
10
+ */
11
+ export declare function assertFileNotExists(filePath: string, message?: string): void;
12
+ /**
13
+ * Assert that a directory exists
14
+ */
15
+ export declare function assertDirectoryExists(dirPath: string, message?: string): void;
16
+ /**
17
+ * Assert that a directory does not exist
18
+ */
19
+ export declare function assertDirectoryNotExists(dirPath: string, message?: string): void;
20
+ /**
21
+ * Assert that a directory contains specific files
22
+ */
23
+ export declare function assertDirectoryContains(dirPath: string, expectedFiles: string[], message?: string): void;
24
+ /**
25
+ * Assert that a file contains specific content
26
+ */
27
+ export declare function assertFileContains(filePath: string, expectedContent: string | RegExp, message?: string): void;
28
+ /**
29
+ * Assert directory structure matches expected structure
30
+ */
31
+ export declare function assertDirectoryStructure(basePath: string, expectedStructure: Record<string, 'file' | 'dir'>): void;
32
+ //# sourceMappingURL=fs-assertions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs-assertions.d.ts","sourceRoot":"","sources":["../../../../../../src/__tests__/integration/setup/helpers/fs-assertions.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAKzE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAK5E;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAW7E;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAKhF;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,MAAM,EAAE,EACvB,OAAO,CAAC,EAAE,MAAM,GACf,IAAI,CAUN;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,eAAe,EAAE,MAAM,GAAG,MAAM,EAChC,OAAO,CAAC,EAAE,MAAM,GACf,IAAI,CAgBN;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,MAAM,EAChB,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC,GAChD,IAAI,CAUN"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * File system assertion helpers for tests
3
+ */
4
+ import { existsSync, statSync, readdirSync, readFileSync } from 'fs';
5
+ import { join } from 'path';
6
+ import { expect } from 'vitest';
7
+ /**
8
+ * Assert that a file exists
9
+ */
10
+ export function assertFileExists(filePath, message) {
11
+ expect(existsSync(filePath), message || `Expected file to exist: ${filePath}`).toBe(true);
12
+ }
13
+ /**
14
+ * Assert that a file does not exist
15
+ */
16
+ export function assertFileNotExists(filePath, message) {
17
+ expect(existsSync(filePath), message || `Expected file to not exist: ${filePath}`).toBe(false);
18
+ }
19
+ /**
20
+ * Assert that a directory exists
21
+ */
22
+ export function assertDirectoryExists(dirPath, message) {
23
+ const exists = existsSync(dirPath);
24
+ expect(exists, message || `Expected directory to exist: ${dirPath}`).toBe(true);
25
+ if (exists) {
26
+ const stats = statSync(dirPath);
27
+ expect(stats.isDirectory(), `Expected ${dirPath} to be a directory`).toBe(true);
28
+ }
29
+ }
30
+ /**
31
+ * Assert that a directory does not exist
32
+ */
33
+ export function assertDirectoryNotExists(dirPath, message) {
34
+ expect(existsSync(dirPath), message || `Expected directory to not exist: ${dirPath}`).toBe(false);
35
+ }
36
+ /**
37
+ * Assert that a directory contains specific files
38
+ */
39
+ export function assertDirectoryContains(dirPath, expectedFiles, message) {
40
+ assertDirectoryExists(dirPath);
41
+ const files = readdirSync(dirPath);
42
+ const missingFiles = expectedFiles.filter(f => !files.includes(f));
43
+ expect(missingFiles, message || `Expected directory ${dirPath} to contain files: ${expectedFiles.join(', ')}`).toEqual([]);
44
+ }
45
+ /**
46
+ * Assert that a file contains specific content
47
+ */
48
+ export function assertFileContains(filePath, expectedContent, message) {
49
+ assertFileExists(filePath);
50
+ const content = readFileSync(filePath, 'utf-8');
51
+ if (typeof expectedContent === 'string') {
52
+ expect(content.includes(expectedContent), message || `Expected file ${filePath} to contain: ${expectedContent}`).toBe(true);
53
+ }
54
+ else {
55
+ expect(expectedContent.test(content), message || `Expected file ${filePath} to match pattern: ${expectedContent}`).toBe(true);
56
+ }
57
+ }
58
+ /**
59
+ * Assert directory structure matches expected structure
60
+ */
61
+ export function assertDirectoryStructure(basePath, expectedStructure) {
62
+ for (const [path, type] of Object.entries(expectedStructure)) {
63
+ const fullPath = join(basePath, path);
64
+ if (type === 'file') {
65
+ assertFileExists(fullPath, `Expected file at ${path}`);
66
+ }
67
+ else if (type === 'dir') {
68
+ assertDirectoryExists(fullPath, `Expected directory at ${path}`);
69
+ }
70
+ }
71
+ }
72
+ //# sourceMappingURL=fs-assertions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs-assertions.js","sourceRoot":"","sources":["../../../../../../src/__tests__/integration/setup/helpers/fs-assertions.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AACrE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAAgB,EAAE,OAAgB;IACjE,MAAM,CACJ,UAAU,CAAC,QAAQ,CAAC,EACpB,OAAO,IAAI,2BAA2B,QAAQ,EAAE,CACjD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,QAAgB,EAAE,OAAgB;IACpE,MAAM,CACJ,UAAU,CAAC,QAAQ,CAAC,EACpB,OAAO,IAAI,+BAA+B,QAAQ,EAAE,CACrD,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAAe,EAAE,OAAgB;IACrE,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;IACnC,MAAM,CAAC,MAAM,EAAE,OAAO,IAAI,gCAAgC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEhF,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;QAChC,MAAM,CACJ,KAAK,CAAC,WAAW,EAAE,EACnB,YAAY,OAAO,oBAAoB,CACxC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB,CAAC,OAAe,EAAE,OAAgB;IACxE,MAAM,CACJ,UAAU,CAAC,OAAO,CAAC,EACnB,OAAO,IAAI,oCAAoC,OAAO,EAAE,CACzD,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB,CACrC,OAAe,EACf,aAAuB,EACvB,OAAgB;IAEhB,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAE/B,MAAM,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IACnC,MAAM,YAAY,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAEnE,MAAM,CACJ,YAAY,EACZ,OAAO,IAAI,sBAAsB,OAAO,sBAAsB,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACzF,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAChC,QAAgB,EAChB,eAAgC,EAChC,OAAgB;IAEhB,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAE3B,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAEhD,IAAI,OAAO,eAAe,KAAK,QAAQ,EAAE,CAAC;QACxC,MAAM,CACJ,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,EACjC,OAAO,IAAI,iBAAiB,QAAQ,gBAAgB,eAAe,EAAE,CACtE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC;SAAM,CAAC;QACN,MAAM,CACJ,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,EAC7B,OAAO,IAAI,iBAAiB,QAAQ,sBAAsB,eAAe,EAAE,CAC5E,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB,CACtC,QAAgB,EAChB,iBAAiD;IAEjD,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,EAAE,CAAC;QAC7D,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAEtC,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YACpB,gBAAgB,CAAC,QAAQ,EAAE,oBAAoB,IAAI,EAAE,CAAC,CAAC;QACzD,CAAC;aAAM,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;YAC1B,qBAAqB,CAAC,QAAQ,EAAE,yBAAyB,IAAI,EAAE,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Test helper for creating temporary test projects
3
+ */
4
+ export interface TestProjectOptions {
5
+ /** Project name (used for directory name) */
6
+ name?: string;
7
+ /** Initialize as Git repository */
8
+ initGit?: boolean;
9
+ /** Create .git/config file */
10
+ createGitConfig?: boolean;
11
+ }
12
+ export declare class TestProject {
13
+ readonly path: string;
14
+ private readonly cleanup;
15
+ constructor(options?: TestProjectOptions);
16
+ /**
17
+ * Create a file in the test project
18
+ */
19
+ writeFile(relativePath: string, content: string): void;
20
+ /**
21
+ * Check if a file exists in the test project
22
+ */
23
+ hasFile(relativePath: string): boolean;
24
+ /**
25
+ * Check if a directory exists in the test project
26
+ */
27
+ hasDirectory(relativePath: string): boolean;
28
+ /**
29
+ * Clean up the test project
30
+ */
31
+ destroy(): void;
32
+ }
33
+ /**
34
+ * Create a test project for use in tests
35
+ * Automatically cleaned up after test
36
+ */
37
+ export declare function createTestProject(options?: TestProjectOptions): TestProject;
38
+ //# sourceMappingURL=test-project.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-project.d.ts","sourceRoot":"","sources":["../../../../../../src/__tests__/integration/setup/helpers/test-project.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,MAAM,WAAW,kBAAkB;IACjC,6CAA6C;IAC7C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,mCAAmC;IACnC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,8BAA8B;IAC9B,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,qBAAa,WAAW;IACtB,SAAgB,IAAI,EAAE,MAAM,CAAC;IAC7B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;gBAEtB,OAAO,GAAE,kBAAuB;IA+B5C;;OAEG;IACH,SAAS,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAStD;;OAEG;IACH,OAAO,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO;IAItC;;OAEG;IACH,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO;IAK3C;;OAEG;IACH,OAAO,IAAI,IAAI;CAShB;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,GAAE,kBAAuB,GAAG,WAAW,CAE/E"}