@sk8metal/michi-cli 0.0.8 → 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.
- package/CHANGELOG.md +33 -0
- package/README.md +202 -9
- package/dist/scripts/__tests__/setup-existing-project.test.js +67 -5
- package/dist/scripts/__tests__/setup-existing-project.test.js.map +1 -1
- package/dist/scripts/constants/__tests__/environments.test.d.ts +2 -0
- package/dist/scripts/constants/__tests__/environments.test.d.ts.map +1 -0
- package/dist/scripts/constants/__tests__/environments.test.js +91 -0
- package/dist/scripts/constants/__tests__/environments.test.js.map +1 -0
- package/dist/scripts/constants/__tests__/languages.test.d.ts +2 -0
- package/dist/scripts/constants/__tests__/languages.test.d.ts.map +1 -0
- package/dist/scripts/constants/__tests__/languages.test.js +82 -0
- package/dist/scripts/constants/__tests__/languages.test.js.map +1 -0
- package/dist/scripts/constants/environments.d.ts +33 -0
- package/dist/scripts/constants/environments.d.ts.map +1 -0
- package/dist/scripts/constants/environments.js +49 -0
- package/dist/scripts/constants/environments.js.map +1 -0
- package/dist/scripts/constants/languages.d.ts +23 -0
- package/dist/scripts/constants/languages.d.ts.map +1 -0
- package/dist/scripts/constants/languages.js +53 -0
- package/dist/scripts/constants/languages.js.map +1 -0
- package/dist/scripts/create-project.d.ts +4 -0
- package/dist/scripts/create-project.d.ts.map +1 -1
- package/dist/scripts/create-project.js +51 -22
- package/dist/scripts/create-project.js.map +1 -1
- package/dist/scripts/setup-existing-project.d.ts +3 -1
- package/dist/scripts/setup-existing-project.d.ts.map +1 -1
- package/dist/scripts/setup-existing-project.js +110 -55
- package/dist/scripts/setup-existing-project.js.map +1 -1
- package/dist/scripts/template/__tests__/renderer.test.d.ts +2 -0
- package/dist/scripts/template/__tests__/renderer.test.d.ts.map +1 -0
- package/dist/scripts/template/__tests__/renderer.test.js +165 -0
- package/dist/scripts/template/__tests__/renderer.test.js.map +1 -0
- package/dist/scripts/template/renderer.d.ts +70 -0
- package/dist/scripts/template/renderer.d.ts.map +1 -0
- package/dist/scripts/template/renderer.js +99 -0
- package/dist/scripts/template/renderer.js.map +1 -0
- package/dist/scripts/utils/template-finder.d.ts +37 -0
- package/dist/scripts/utils/template-finder.d.ts.map +1 -0
- package/dist/scripts/utils/template-finder.js +63 -0
- package/dist/scripts/utils/template-finder.js.map +1 -0
- package/dist/src/__tests__/integration/setup/claude-agent.test.d.ts +5 -0
- package/dist/src/__tests__/integration/setup/claude-agent.test.d.ts.map +1 -0
- package/dist/src/__tests__/integration/setup/claude-agent.test.js +125 -0
- package/dist/src/__tests__/integration/setup/claude-agent.test.js.map +1 -0
- package/dist/src/__tests__/integration/setup/claude.test.d.ts +5 -0
- package/dist/src/__tests__/integration/setup/claude.test.d.ts.map +1 -0
- package/dist/src/__tests__/integration/setup/claude.test.js +111 -0
- package/dist/src/__tests__/integration/setup/claude.test.js.map +1 -0
- package/dist/src/__tests__/integration/setup/cursor.test.d.ts +5 -0
- package/dist/src/__tests__/integration/setup/cursor.test.d.ts.map +1 -0
- package/dist/src/__tests__/integration/setup/cursor.test.js +162 -0
- package/dist/src/__tests__/integration/setup/cursor.test.js.map +1 -0
- package/dist/src/__tests__/integration/setup/helpers/fs-assertions.d.ts +32 -0
- package/dist/src/__tests__/integration/setup/helpers/fs-assertions.d.ts.map +1 -0
- package/dist/src/__tests__/integration/setup/helpers/fs-assertions.js +72 -0
- package/dist/src/__tests__/integration/setup/helpers/fs-assertions.js.map +1 -0
- package/dist/src/__tests__/integration/setup/helpers/test-project.d.ts +38 -0
- package/dist/src/__tests__/integration/setup/helpers/test-project.d.ts.map +1 -0
- package/dist/src/__tests__/integration/setup/helpers/test-project.js +83 -0
- package/dist/src/__tests__/integration/setup/helpers/test-project.js.map +1 -0
- package/dist/src/__tests__/integration/setup/validation.test.d.ts +5 -0
- package/dist/src/__tests__/integration/setup/validation.test.d.ts.map +1 -0
- package/dist/src/__tests__/integration/setup/validation.test.js +318 -0
- package/dist/src/__tests__/integration/setup/validation.test.js.map +1 -0
- package/dist/src/cli.d.ts.map +1 -1
- package/dist/src/cli.js +20 -0
- package/dist/src/cli.js.map +1 -1
- package/dist/src/commands/setup-existing.d.ts +22 -0
- package/dist/src/commands/setup-existing.d.ts.map +1 -0
- package/dist/src/commands/setup-existing.js +408 -0
- package/dist/src/commands/setup-existing.js.map +1 -0
- package/dist/vitest.config.d.ts.map +1 -1
- package/dist/vitest.config.js +4 -3
- package/dist/vitest.config.js.map +1 -1
- package/docs/getting-started/new-repository-setup.md +108 -28
- package/docs/getting-started/quick-start.md +57 -6
- package/docs/getting-started/setup.md +250 -2
- package/docs/guides/customization.md +3 -3
- package/docs/guides/multi-project.md +1 -1
- package/docs/reference/quick-reference.md +25 -16
- package/docs/testing/integration-tests.md +297 -0
- package/package.json +7 -2
- package/scripts/__tests__/setup-existing-project.test.ts +73 -5
- package/scripts/constants/__tests__/environments.test.ts +110 -0
- package/scripts/constants/__tests__/languages.test.ts +100 -0
- package/scripts/constants/environments.ts +61 -0
- package/scripts/constants/languages.ts +70 -0
- package/scripts/create-project.ts +52 -22
- package/scripts/setup-existing-project.ts +136 -57
- package/scripts/setup-existing.sh +130 -3
- package/scripts/template/__tests__/renderer.test.ts +207 -0
- package/scripts/template/renderer.ts +133 -0
- package/scripts/utils/template-finder.ts +75 -0
- package/templates/claude/commands/michi/confluence-sync.md +38 -0
- package/templates/claude/commands/michi/project-switch.md +36 -0
- package/templates/claude/rules/atlassian-integration.md +35 -0
- package/templates/claude/rules/michi-core.md +54 -0
- package/templates/claude-agent/README.md +25 -0
- package/templates/cursor/commands/michi/confluence-sync.md +76 -0
- package/templates/cursor/commands/michi/project-switch.md +69 -0
- package/templates/cursor/rules/atlassian-mcp.mdc +188 -0
- package/templates/cursor/rules/github-ssot.mdc +151 -0
- package/templates/cursor/rules/multi-project.mdc +81 -0
- package/scripts/setup-env.sh +0 -52
|
@@ -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":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACjE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAe,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EACL,qBAAqB,EACrB,gBAAgB,EAChB,wBAAwB,EACxB,kBAAkB,EACnB,MAAM,4BAA4B,CAAC;AAEpC,wCAAwC;AACxC,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;IACzB,eAAe,EAAE,GAAG,EAAE,CAAC,CAAC;QACtB,QAAQ,EAAE,CAAC,QAAgB,EAAE,QAAkC,EAAE,EAAE;YACjE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,eAAe;QAChC,CAAC;QACD,KAAK,EAAE,GAAG,EAAE,GAAE,CAAC;KAChB,CAAC;CACH,CAAC,CAAC,CAAC;AAEJ,QAAQ,CAAC,gCAAgC,EAAE,GAAG,EAAE;IAC9C,IAAI,WAAwB,CAAC;IAC7B,IAAI,WAAmB,CAAC;IAExB,UAAU,CAAC,GAAG,EAAE;QACd,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAC5B,WAAW,GAAG,iBAAiB,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC,CAAC;QAC/D,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAC3B,WAAW,CAAC,OAAO,EAAE,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;QAC3B,2CAA2C;QAC3C,EAAE,CAAC,IAAI,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;YAC9D,MAAM,aAAa,CAAC;gBAClB,WAAW,EAAE,IAAI;gBACjB,WAAW,EAAE,cAAc;gBAC3B,OAAO,EAAE,MAAM;aAChB,CAAC,CAAC;YAEH,qBAAqB,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC;YACzD,qBAAqB,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC,CAAC;QACrE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;YACvD,MAAM,aAAa,CAAC;gBAClB,WAAW,EAAE,IAAI;gBACjB,WAAW,EAAE,cAAc;gBAC3B,OAAO,EAAE,MAAM;aAChB,CAAC,CAAC;YAEH,wBAAwB,CAAC,WAAW,CAAC,IAAI,EAAE;gBACzC,OAAO,EAAE,KAAK;gBACd,gBAAgB,EAAE,KAAK;gBACvB,0BAA0B,EAAE,KAAK;gBACjC,gBAAgB,EAAE,KAAK;gBACvB,aAAa,EAAE,KAAK;aACrB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;YAChE,MAAM,aAAa,CAAC;gBAClB,WAAW,EAAE,IAAI;gBACjB,WAAW,EAAE,YAAY;gBACzB,OAAO,EAAE,MAAM;aAChB,CAAC,CAAC;YAEH,MAAM,eAAe,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,oBAAoB,CAAC,CAAC;YACrE,gBAAgB,CAAC,eAAe,CAAC,CAAC;YAElC,kBAAkB,CAAC,eAAe,EAAE,6BAA6B,CAAC,CAAC;YACnE,kBAAkB,CAAC,eAAe,EAAE,0BAA0B,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;YAC3C,MAAM,aAAa,CAAC;gBAClB,WAAW,EAAE,IAAI;gBACjB,WAAW,EAAE,cAAc;gBAC3B,OAAO,EAAE,MAAM;aAChB,CAAC,CAAC;YAEH,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAC/C,gBAAgB,CAAC,OAAO,CAAC,CAAC;YAC1B,kBAAkB,CAAC,OAAO,EAAE,wBAAwB,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,iCAAiC,EAAE,GAAG,EAAE;QAC/C,2CAA2C;QAC3C,EAAE,CAAC,IAAI,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;YAC9D,MAAM,aAAa,CAAC;gBAClB,WAAW,EAAE,IAAI;gBACjB,WAAW,EAAE,cAAc;gBAC3B,OAAO,EAAE,MAAM;aAChB,CAAC,CAAC;YAEH,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC;YACjE,qBAAqB,CAAC,YAAY,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;YAC7D,MAAM,aAAa,CAAC;gBAClB,WAAW,EAAE,IAAI;gBACjB,WAAW,EAAE,cAAc;gBAC3B,OAAO,EAAE,MAAM;aAChB,CAAC,CAAC;YAEH,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;YAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YAEpD,4DAA4D;YAC5D,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;QAEH,2CAA2C;QAC3C,EAAE,CAAC,IAAI,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;YACnE,MAAM,aAAa,CAAC;gBAClB,WAAW,EAAE,IAAI;gBACjB,WAAW,EAAE,cAAc;gBAC3B,OAAO,EAAE,MAAM;aAChB,CAAC,CAAC;YAEH,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;YAC1C,MAAM,cAAc,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;YAE/D,2DAA2D;YAC3D,MAAM,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAChC,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;YACjD,MAAM,aAAa,CAAC;gBAClB,WAAW,EAAE,IAAI;gBACjB,IAAI,EAAE,OAAO;gBACb,WAAW,EAAE,cAAc;gBAC3B,OAAO,EAAE,MAAM;aAChB,CAAC,CAAC;YAEH,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,oBAAoB,CAAC,CAAC;YACjE,kBAAkB,CAAC,WAAW,EAAE,qBAAqB,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -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 @@
|
|
|
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":"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"}
|
|
@@ -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"}
|