ai-devkit 0.4.2 → 0.6.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 (142) hide show
  1. package/dist/cli.js +8 -0
  2. package/dist/cli.js.map +1 -1
  3. package/dist/commands/init.d.ts.map +1 -1
  4. package/dist/commands/init.js +1 -1
  5. package/dist/commands/init.js.map +1 -1
  6. package/dist/commands/memory.d.ts +3 -0
  7. package/dist/commands/memory.d.ts.map +1 -0
  8. package/dist/commands/memory.js +53 -0
  9. package/dist/commands/memory.js.map +1 -0
  10. package/dist/commands/setup.d.ts +6 -0
  11. package/dist/commands/setup.d.ts.map +1 -0
  12. package/dist/commands/setup.js +112 -0
  13. package/dist/commands/setup.js.map +1 -0
  14. package/dist/lib/EnvironmentSelector.d.ts +1 -0
  15. package/dist/lib/EnvironmentSelector.d.ts.map +1 -1
  16. package/dist/lib/EnvironmentSelector.js +28 -0
  17. package/dist/lib/EnvironmentSelector.js.map +1 -1
  18. package/dist/lib/TemplateManager.d.ts +14 -0
  19. package/dist/lib/TemplateManager.d.ts.map +1 -1
  20. package/dist/lib/TemplateManager.js +74 -3
  21. package/dist/lib/TemplateManager.js.map +1 -1
  22. package/{templates/commands/capture-knowledge.toml → dist/templates/commands/capture-knowledge.md} +10 -4
  23. package/{templates/commands/check-implementation.toml → dist/templates/commands/check-implementation.md} +9 -0
  24. package/{templates/commands/code-review.toml → dist/templates/commands/code-review.md} +11 -4
  25. package/{templates/commands/debug.toml → dist/templates/commands/debug.md} +11 -5
  26. package/{templates/commands/execute-plan.toml → dist/templates/commands/execute-plan.md} +11 -5
  27. package/{templates/commands/new-requirement.toml → dist/templates/commands/new-requirement.md} +11 -4
  28. package/dist/templates/commands/remember.md +27 -0
  29. package/dist/templates/commands/review-design.md +21 -0
  30. package/dist/templates/commands/review-requirements.md +19 -0
  31. package/dist/templates/commands/simplify-implementation.md +153 -0
  32. package/{templates/commands/update-planning.toml → dist/templates/commands/update-planning.md} +11 -4
  33. package/{templates/commands/writing-test.toml → dist/templates/commands/writing-test.md} +10 -3
  34. package/dist/templates/env/base.md +51 -0
  35. package/dist/templates/phases/deployment.md +72 -0
  36. package/dist/templates/phases/design.md +60 -0
  37. package/dist/templates/phases/implementation.md +65 -0
  38. package/dist/templates/phases/monitoring.md +80 -0
  39. package/dist/templates/phases/planning.md +60 -0
  40. package/dist/templates/phases/requirements.md +51 -0
  41. package/dist/templates/phases/testing.md +81 -0
  42. package/dist/templates/templates/commands/capture-knowledge.md +55 -0
  43. package/dist/templates/templates/commands/check-implementation.md +30 -0
  44. package/dist/templates/templates/commands/code-review.md +90 -0
  45. package/dist/templates/templates/commands/debug.md +54 -0
  46. package/dist/templates/templates/commands/execute-plan.md +80 -0
  47. package/dist/templates/templates/commands/new-requirement.md +136 -0
  48. package/dist/templates/templates/commands/remember.md +27 -0
  49. package/dist/templates/templates/commands/review-design.md +21 -0
  50. package/dist/templates/templates/commands/review-requirements.md +19 -0
  51. package/dist/templates/templates/commands/simplify-implementation.md +153 -0
  52. package/dist/templates/templates/commands/update-planning.md +70 -0
  53. package/dist/templates/templates/commands/writing-test.md +53 -0
  54. package/dist/templates/templates/env/base.md +51 -0
  55. package/dist/templates/templates/phases/deployment.md +72 -0
  56. package/dist/templates/templates/phases/design.md +60 -0
  57. package/dist/templates/templates/phases/implementation.md +65 -0
  58. package/dist/templates/templates/phases/monitoring.md +80 -0
  59. package/dist/templates/templates/phases/planning.md +60 -0
  60. package/dist/templates/templates/phases/requirements.md +51 -0
  61. package/dist/templates/templates/phases/testing.md +81 -0
  62. package/dist/types.d.ts +2 -1
  63. package/dist/types.d.ts.map +1 -1
  64. package/dist/types.js.map +1 -1
  65. package/dist/util/env.d.ts +2 -0
  66. package/dist/util/env.d.ts.map +1 -1
  67. package/dist/util/env.js +18 -1
  68. package/dist/util/env.js.map +1 -1
  69. package/package.json +5 -2
  70. package/project.json +29 -0
  71. package/templates/commands/capture-knowledge.md +9 -0
  72. package/templates/commands/check-implementation.md +9 -0
  73. package/templates/commands/code-review.md +9 -0
  74. package/templates/commands/debug.md +9 -0
  75. package/templates/commands/execute-plan.md +9 -0
  76. package/templates/commands/new-requirement.md +9 -0
  77. package/templates/commands/remember.md +27 -0
  78. package/templates/commands/review-design.md +10 -0
  79. package/templates/commands/review-requirements.md +10 -0
  80. package/templates/commands/simplify-implementation.md +153 -0
  81. package/templates/commands/update-planning.md +9 -0
  82. package/templates/commands/writing-test.md +9 -0
  83. package/CHANGELOG.md +0 -87
  84. package/README.md +0 -297
  85. package/dist/__tests__/lib/Config.test.d.ts +0 -2
  86. package/dist/__tests__/lib/Config.test.d.ts.map +0 -1
  87. package/dist/__tests__/lib/Config.test.js +0 -281
  88. package/dist/__tests__/lib/Config.test.js.map +0 -1
  89. package/dist/__tests__/lib/EnvironmentSelector.test.d.ts +0 -2
  90. package/dist/__tests__/lib/EnvironmentSelector.test.d.ts.map +0 -1
  91. package/dist/__tests__/lib/EnvironmentSelector.test.js +0 -117
  92. package/dist/__tests__/lib/EnvironmentSelector.test.js.map +0 -1
  93. package/dist/__tests__/lib/PhaseSelector.test.d.ts +0 -2
  94. package/dist/__tests__/lib/PhaseSelector.test.d.ts.map +0 -1
  95. package/dist/__tests__/lib/PhaseSelector.test.js +0 -77
  96. package/dist/__tests__/lib/PhaseSelector.test.js.map +0 -1
  97. package/dist/__tests__/lib/TemplateManager.test.d.ts +0 -2
  98. package/dist/__tests__/lib/TemplateManager.test.d.ts.map +0 -1
  99. package/dist/__tests__/lib/TemplateManager.test.js +0 -351
  100. package/dist/__tests__/lib/TemplateManager.test.js.map +0 -1
  101. package/dist/__tests__/util/env.test.d.ts +0 -2
  102. package/dist/__tests__/util/env.test.d.ts.map +0 -1
  103. package/dist/__tests__/util/env.test.js +0 -166
  104. package/dist/__tests__/util/env.test.js.map +0 -1
  105. package/templates/commands/review-design.toml +0 -13
  106. package/templates/commands/review-requirements.toml +0 -11
  107. package/web/.nojekyll +0 -2
  108. package/web/CNAME +0 -1
  109. package/web/README.md +0 -100
  110. package/web/app/favicon.ico +0 -0
  111. package/web/app/globals.css +0 -122
  112. package/web/app/layout.tsx +0 -106
  113. package/web/app/page.tsx +0 -119
  114. package/web/app/roadmap/page.tsx +0 -150
  115. package/web/app/robots.ts +0 -16
  116. package/web/app/sitemap.ts +0 -46
  117. package/web/app/vision/page.tsx +0 -49
  118. package/web/components/Footer.tsx +0 -81
  119. package/web/components/GitHubButton.tsx +0 -49
  120. package/web/components/GitHubStars.tsx +0 -27
  121. package/web/components/Header.tsx +0 -108
  122. package/web/components/MarkdownContent.tsx +0 -35
  123. package/web/components/SkipToContent.tsx +0 -11
  124. package/web/content/pages/vision.md +0 -44
  125. package/web/content/roadmap/1-web.md +0 -9
  126. package/web/content/roadmap/2-integrations.md +0 -7
  127. package/web/content/roadmap/3-cli-enhancements.md +0 -8
  128. package/web/content/roadmap/4-local-memory.md +0 -8
  129. package/web/eslint.config.mjs +0 -18
  130. package/web/lib/GitHubContext.tsx +0 -57
  131. package/web/lib/content/loader.ts +0 -152
  132. package/web/lib/content/types.ts +0 -37
  133. package/web/lib/utils.ts +0 -12
  134. package/web/next.config.ts +0 -11
  135. package/web/package-lock.json +0 -8837
  136. package/web/package.json +0 -34
  137. package/web/postcss.config.mjs +0 -7
  138. package/web/public/file.svg +0 -1
  139. package/web/public/globe.svg +0 -1
  140. package/web/public/next.svg +0 -1
  141. package/web/public/vercel.svg +0 -1
  142. package/web/public/window.svg +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"Config.test.js","sourceRoot":"","sources":["../../../src/__tests__/lib/Config.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=EnvironmentSelector.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"EnvironmentSelector.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/lib/EnvironmentSelector.test.ts"],"names":[],"mappings":""}
@@ -1,117 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const EnvironmentSelector_1 = require("../../lib/EnvironmentSelector");
4
- const env_1 = require("../../util/env");
5
- jest.mock('inquirer');
6
- describe('EnvironmentSelector', () => {
7
- let selector;
8
- let mockPrompt;
9
- beforeEach(() => {
10
- selector = new EnvironmentSelector_1.EnvironmentSelector();
11
- const inquirer = require('inquirer');
12
- mockPrompt = jest.fn();
13
- inquirer.prompt = mockPrompt;
14
- });
15
- afterEach(() => {
16
- jest.clearAllMocks();
17
- });
18
- describe('selectEnvironments', () => {
19
- it('should create choices from all environments', async () => {
20
- const environments = (0, env_1.getAllEnvironments)();
21
- mockPrompt.mockResolvedValue({ environments: ['cursor', 'claude'] });
22
- await selector.selectEnvironments();
23
- expect(mockPrompt).toHaveBeenCalledWith([
24
- expect.objectContaining({
25
- type: 'checkbox',
26
- name: 'environments',
27
- message: 'Select AI environments to set up (use space to select, enter to confirm):',
28
- choices: environments.map(env => ({
29
- name: env.name,
30
- value: env.code,
31
- short: env.name
32
- })),
33
- validate: expect.any(Function)
34
- })
35
- ]);
36
- });
37
- it('should return selected environments', async () => {
38
- const selectedEnvs = ['cursor', 'claude'];
39
- mockPrompt.mockResolvedValue({ environments: selectedEnvs });
40
- const result = await selector.selectEnvironments();
41
- expect(result).toEqual(selectedEnvs);
42
- });
43
- it('should validate that at least one environment is selected', async () => {
44
- mockPrompt.mockResolvedValue({ environments: [] });
45
- const result = await selector.selectEnvironments();
46
- expect(result).toEqual([]);
47
- const callArgs = mockPrompt.mock.calls[0][0];
48
- const validateFn = callArgs[0].validate;
49
- expect(validateFn([])).toBe('Please select at least one environment.');
50
- expect(validateFn(['cursor'])).toBe(true);
51
- });
52
- it('should handle prompt rejection', async () => {
53
- mockPrompt.mockRejectedValue(new Error('User cancelled'));
54
- await expect(selector.selectEnvironments()).rejects.toThrow('User cancelled');
55
- });
56
- });
57
- describe('confirmOverride', () => {
58
- it('should return true immediately for empty conflicts', async () => {
59
- const result = await selector.confirmOverride([]);
60
- expect(result).toBe(true);
61
- expect(mockPrompt).not.toHaveBeenCalled();
62
- });
63
- it('should prompt user for confirmation with conflict details', async () => {
64
- mockPrompt.mockResolvedValue({ proceed: true });
65
- const result = await selector.confirmOverride(['cursor', 'claude']);
66
- expect(result).toBe(true);
67
- expect(mockPrompt).toHaveBeenCalledWith([
68
- {
69
- type: 'confirm',
70
- name: 'proceed',
71
- message: 'The following environments are already set up and will be overwritten:\n Cursor, Claude Code\n\nDo you want to continue?',
72
- default: false
73
- }
74
- ]);
75
- });
76
- it('should return false when user declines', async () => {
77
- mockPrompt.mockResolvedValue({ proceed: false });
78
- const result = await selector.confirmOverride(['cursor']);
79
- expect(result).toBe(false);
80
- });
81
- it('should handle single environment conflict', async () => {
82
- mockPrompt.mockResolvedValue({ proceed: true });
83
- const result = await selector.confirmOverride(['cursor']);
84
- expect(result).toBe(true);
85
- const message = mockPrompt.mock.calls[0][0][0].message;
86
- expect(message).toContain('Cursor');
87
- });
88
- });
89
- describe('displaySelectionSummary', () => {
90
- let consoleSpy;
91
- beforeEach(() => {
92
- consoleSpy = jest.spyOn(console, 'log').mockImplementation(() => { });
93
- });
94
- afterEach(() => {
95
- consoleSpy.mockRestore();
96
- });
97
- it('should display nothing selected message for empty array', () => {
98
- selector.displaySelectionSummary([]);
99
- expect(consoleSpy).toHaveBeenCalledWith('No environments selected.');
100
- expect(consoleSpy).toHaveBeenCalledTimes(1);
101
- });
102
- it('should display selected environments with checkmarks', () => {
103
- selector.displaySelectionSummary(['cursor', 'claude']);
104
- expect(consoleSpy).toHaveBeenCalledWith('\nSelected environments:');
105
- expect(consoleSpy).toHaveBeenCalledWith(' Cursor');
106
- expect(consoleSpy).toHaveBeenCalledWith(' Claude Code');
107
- expect(consoleSpy).toHaveBeenCalledWith('');
108
- });
109
- it('should handle single environment selection', () => {
110
- selector.displaySelectionSummary(['cursor']);
111
- expect(consoleSpy).toHaveBeenCalledWith('\nSelected environments:');
112
- expect(consoleSpy).toHaveBeenCalledWith(' Cursor');
113
- expect(consoleSpy).toHaveBeenCalledWith('');
114
- });
115
- });
116
- });
117
- //# sourceMappingURL=EnvironmentSelector.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"EnvironmentSelector.test.js","sourceRoot":"","sources":["../../../src/__tests__/lib/EnvironmentSelector.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=PhaseSelector.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"PhaseSelector.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/lib/PhaseSelector.test.ts"],"names":[],"mappings":""}
@@ -1,77 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const PhaseSelector_1 = require("../../lib/PhaseSelector");
4
- const types_1 = require("../../types");
5
- jest.mock('inquirer');
6
- describe('PhaseSelector', () => {
7
- let selector;
8
- let mockPrompt;
9
- beforeEach(() => {
10
- selector = new PhaseSelector_1.PhaseSelector();
11
- const inquirer = require('inquirer');
12
- mockPrompt = jest.fn();
13
- inquirer.prompt = mockPrompt;
14
- });
15
- afterEach(() => {
16
- jest.clearAllMocks();
17
- });
18
- describe('selectPhases', () => {
19
- it('should return all phases when all=true', async () => {
20
- const result = await selector.selectPhases(true);
21
- expect(result).toEqual(types_1.AVAILABLE_PHASES);
22
- expect(mockPrompt).not.toHaveBeenCalled();
23
- });
24
- it('should parse phases string correctly', async () => {
25
- const result = await selector.selectPhases(false, 'requirements,design');
26
- expect(result).toEqual(['requirements', 'design']);
27
- expect(mockPrompt).not.toHaveBeenCalled();
28
- });
29
- it('should trim whitespace from phase names', async () => {
30
- const result = await selector.selectPhases(false, ' requirements , design ');
31
- expect(result).toEqual(['requirements', 'design']);
32
- });
33
- it('should prompt user when no options provided', async () => {
34
- mockPrompt.mockResolvedValue({ phases: ['requirements', 'design'] });
35
- const result = await selector.selectPhases();
36
- expect(mockPrompt).toHaveBeenCalledTimes(1);
37
- expect(result).toEqual(['requirements', 'design']);
38
- });
39
- it('should return empty array when no phases selected', async () => {
40
- mockPrompt.mockResolvedValue({ phases: [] });
41
- const result = await selector.selectPhases();
42
- expect(result).toEqual([]);
43
- });
44
- it('should handle prompt rejection', async () => {
45
- mockPrompt.mockRejectedValue(new Error('User cancelled'));
46
- await expect(selector.selectPhases()).rejects.toThrow('User cancelled');
47
- });
48
- });
49
- describe('displaySelectionSummary', () => {
50
- let consoleSpy;
51
- beforeEach(() => {
52
- consoleSpy = jest.spyOn(console, 'log').mockImplementation(() => { });
53
- });
54
- afterEach(() => {
55
- consoleSpy.mockRestore();
56
- });
57
- it('should display nothing selected message for empty array', () => {
58
- selector.displaySelectionSummary([]);
59
- expect(consoleSpy).toHaveBeenCalledWith('No phases selected.');
60
- expect(consoleSpy).toHaveBeenCalledTimes(1);
61
- });
62
- it('should display selected phases with checkmarks', () => {
63
- selector.displaySelectionSummary(['requirements', 'design']);
64
- expect(consoleSpy).toHaveBeenCalledWith('\nSelected phases:');
65
- expect(consoleSpy).toHaveBeenCalledWith(' Requirements & Problem Understanding');
66
- expect(consoleSpy).toHaveBeenCalledWith(' System Design & Architecture');
67
- expect(consoleSpy).toHaveBeenCalledWith('');
68
- });
69
- it('should handle single phase selection', () => {
70
- selector.displaySelectionSummary(['requirements']);
71
- expect(consoleSpy).toHaveBeenCalledWith('\nSelected phases:');
72
- expect(consoleSpy).toHaveBeenCalledWith(' Requirements & Problem Understanding');
73
- expect(consoleSpy).toHaveBeenCalledWith('');
74
- });
75
- });
76
- });
77
- //# sourceMappingURL=PhaseSelector.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"PhaseSelector.test.js","sourceRoot":"","sources":["../../../src/__tests__/lib/PhaseSelector.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=TemplateManager.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"TemplateManager.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/lib/TemplateManager.test.ts"],"names":[],"mappings":""}
@@ -1,351 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- Object.defineProperty(exports, "__esModule", { value: true });
36
- const fs = __importStar(require("fs-extra"));
37
- const path = __importStar(require("path"));
38
- const TemplateManager_1 = require("../../lib/TemplateManager");
39
- jest.mock('fs-extra');
40
- jest.mock('../../util/env');
41
- describe('TemplateManager', () => {
42
- let templateManager;
43
- let mockFs;
44
- let mockGetEnvironment;
45
- beforeEach(() => {
46
- mockFs = fs;
47
- mockGetEnvironment = require('../../util/env').getEnvironment;
48
- templateManager = new TemplateManager_1.TemplateManager('/test/target');
49
- jest.clearAllMocks();
50
- });
51
- afterEach(() => {
52
- jest.restoreAllMocks();
53
- });
54
- describe('setupSingleEnvironment', () => {
55
- it('should copy context file when it exists', async () => {
56
- const env = {
57
- code: 'test-env',
58
- name: 'Test Environment',
59
- contextFileName: '.test-context.md',
60
- commandPath: '.test',
61
- isCustomCommandPath: false
62
- };
63
- mockFs.pathExists
64
- .mockResolvedValueOnce(true)
65
- .mockResolvedValueOnce(true);
66
- mockFs.readdir.mockResolvedValue(['command1.md', 'command2.toml']);
67
- const result = await templateManager.setupSingleEnvironment(env);
68
- expect(mockFs.copy).toHaveBeenCalledWith(path.join(templateManager['templatesDir'], 'env', 'base.md'), path.join(templateManager['targetDir'], env.contextFileName));
69
- expect(result).toContain(path.join(templateManager['targetDir'], env.contextFileName));
70
- });
71
- it('should warn when context file does not exist', async () => {
72
- const consoleWarnSpy = jest.spyOn(console, 'warn').mockImplementation();
73
- const env = {
74
- code: 'test-env',
75
- name: 'Test Environment',
76
- contextFileName: '.test-context.md',
77
- commandPath: '.test',
78
- isCustomCommandPath: false
79
- };
80
- mockFs.pathExists
81
- .mockResolvedValueOnce(false)
82
- .mockResolvedValueOnce(true);
83
- mockFs.readdir.mockResolvedValue(['command1.md']);
84
- const result = await templateManager.setupSingleEnvironment(env);
85
- expect(consoleWarnSpy).toHaveBeenCalledWith(expect.stringContaining('Warning: Context file not found'));
86
- expect(result).toEqual([path.join(templateManager['targetDir'], env.commandPath, 'command1.md')]);
87
- consoleWarnSpy.mockRestore();
88
- });
89
- it('should copy commands when isCustomCommandPath is false', async () => {
90
- const env = {
91
- code: 'test-env',
92
- name: 'Test Environment',
93
- contextFileName: '.test-context.md',
94
- commandPath: '.test',
95
- isCustomCommandPath: false
96
- };
97
- const mockCommandFiles = ['command1.md', 'command2.toml', 'command3.md'];
98
- mockFs.pathExists
99
- .mockResolvedValueOnce(true) // context file exists
100
- .mockResolvedValueOnce(true); // commands directory exists
101
- mockFs.readdir.mockResolvedValue(mockCommandFiles);
102
- const result = await templateManager.setupSingleEnvironment(env);
103
- expect(mockFs.ensureDir).toHaveBeenCalledWith(path.join(templateManager['targetDir'], env.commandPath));
104
- // Should only copy .md files (not .toml files)
105
- expect(mockFs.copy).toHaveBeenCalledWith(path.join(templateManager['templatesDir'], 'commands', 'command1.md'), path.join(templateManager['targetDir'], env.commandPath, 'command1.md'));
106
- expect(mockFs.copy).toHaveBeenCalledWith(path.join(templateManager['templatesDir'], 'commands', 'command3.md'), path.join(templateManager['targetDir'], env.commandPath, 'command3.md'));
107
- expect(result).toContain(path.join(templateManager['targetDir'], env.commandPath, 'command1.md'));
108
- expect(result).toContain(path.join(templateManager['targetDir'], env.commandPath, 'command3.md'));
109
- });
110
- it('should skip commands when isCustomCommandPath is true', async () => {
111
- const env = {
112
- code: 'test-env',
113
- name: 'Test Environment',
114
- contextFileName: '.test-context.md',
115
- commandPath: '.test',
116
- isCustomCommandPath: true
117
- };
118
- mockFs.pathExists.mockResolvedValueOnce(true);
119
- const result = await templateManager.setupSingleEnvironment(env);
120
- expect(mockFs.ensureDir).not.toHaveBeenCalled();
121
- expect(mockFs.copy).toHaveBeenCalledTimes(1);
122
- expect(result).toContain(path.join(templateManager['targetDir'], env.contextFileName));
123
- });
124
- it('should handle cursor environment with special files', async () => {
125
- const env = {
126
- code: 'cursor',
127
- name: 'Cursor',
128
- contextFileName: '.cursor.md',
129
- commandPath: '.cursor',
130
- isCustomCommandPath: false
131
- };
132
- const mockRuleFiles = ['rule1.md', 'rule2.toml'];
133
- mockFs.pathExists
134
- .mockResolvedValueOnce(true)
135
- .mockResolvedValueOnce(true).mockResolvedValueOnce(true);
136
- mockFs.readdir
137
- .mockResolvedValueOnce([]).mockResolvedValueOnce(mockRuleFiles);
138
- const result = await templateManager.setupSingleEnvironment(env);
139
- expect(mockFs.ensureDir).toHaveBeenCalledWith(path.join(templateManager['targetDir'], '.cursor', 'rules'));
140
- expect(mockFs.copy).toHaveBeenCalledWith(path.join(templateManager['templatesDir'], 'env', 'cursor', 'rules'), path.join(templateManager['targetDir'], '.cursor', 'rules'));
141
- expect(result).toContain(path.join(templateManager['targetDir'], '.cursor', 'rules', 'rule1.md'));
142
- expect(result).toContain(path.join(templateManager['targetDir'], '.cursor', 'rules', 'rule2.toml'));
143
- });
144
- it('should handle gemini environment with toml files', async () => {
145
- const env = {
146
- code: 'gemini',
147
- name: 'Gemini',
148
- contextFileName: '.gemini.md',
149
- commandPath: '.gemini',
150
- isCustomCommandPath: false
151
- };
152
- const mockCommandFiles = ['command1.md', 'command2.toml', 'command3.toml'];
153
- mockFs.pathExists
154
- .mockResolvedValueOnce(true)
155
- .mockResolvedValueOnce(true).mockResolvedValueOnce(true); // gemini commands directory exists
156
- mockFs.readdir.mockResolvedValue(mockCommandFiles);
157
- const result = await templateManager.setupSingleEnvironment(env);
158
- expect(mockFs.ensureDir).toHaveBeenCalledWith(path.join(templateManager['targetDir'], '.gemini', 'commands'));
159
- expect(mockFs.copy).toHaveBeenCalledWith(path.join(templateManager['templatesDir'], 'commands', 'command2.toml'), path.join(templateManager['targetDir'], '.gemini', 'commands', 'command2.toml'));
160
- expect(mockFs.copy).toHaveBeenCalledWith(path.join(templateManager['templatesDir'], 'commands', 'command3.toml'), path.join(templateManager['targetDir'], '.gemini', 'commands', 'command3.toml'));
161
- expect(result).toContain(path.join(templateManager['targetDir'], '.gemini', 'commands', 'command2.toml'));
162
- expect(result).toContain(path.join(templateManager['targetDir'], '.gemini', 'commands', 'command3.toml'));
163
- });
164
- it('should handle errors and rethrow them', async () => {
165
- const consoleErrorSpy = jest.spyOn(console, 'error').mockImplementation();
166
- const env = {
167
- code: 'test-env',
168
- name: 'Test Environment',
169
- contextFileName: '.test-context.md',
170
- commandPath: '.test',
171
- isCustomCommandPath: false
172
- };
173
- const testError = new Error('Test error');
174
- mockFs.pathExists.mockRejectedValue(testError);
175
- await expect(templateManager.setupSingleEnvironment(env)).rejects.toThrow('Test error');
176
- expect(consoleErrorSpy).toHaveBeenCalledWith('Error setting up environment Test Environment:', testError);
177
- consoleErrorSpy.mockRestore();
178
- });
179
- });
180
- describe('copyPhaseTemplate', () => {
181
- it('should copy phase template and return target file path', async () => {
182
- const phase = 'requirements';
183
- mockFs.ensureDir.mockResolvedValue(undefined);
184
- mockFs.copy.mockResolvedValue(undefined);
185
- const result = await templateManager.copyPhaseTemplate(phase);
186
- expect(mockFs.ensureDir).toHaveBeenCalledWith(path.join(templateManager['targetDir'], 'docs', 'ai', phase));
187
- expect(mockFs.copy).toHaveBeenCalledWith(path.join(templateManager['templatesDir'], 'phases', `${phase}.md`), path.join(templateManager['targetDir'], 'docs', 'ai', phase, 'README.md'));
188
- expect(result).toBe(path.join(templateManager['targetDir'], 'docs', 'ai', phase, 'README.md'));
189
- });
190
- });
191
- describe('fileExists', () => {
192
- it('should return true when phase file exists', async () => {
193
- const phase = 'design';
194
- mockFs.pathExists.mockResolvedValue(true);
195
- const result = await templateManager.fileExists(phase);
196
- expect(mockFs.pathExists).toHaveBeenCalledWith(path.join(templateManager['targetDir'], 'docs', 'ai', phase, 'README.md'));
197
- expect(result).toBe(true);
198
- });
199
- it('should return false when phase file does not exist', async () => {
200
- const phase = 'planning';
201
- mockFs.pathExists.mockResolvedValue(false);
202
- const result = await templateManager.fileExists(phase);
203
- expect(mockFs.pathExists).toHaveBeenCalledWith(path.join(templateManager['targetDir'], 'docs', 'ai', phase, 'README.md'));
204
- expect(result).toBe(false);
205
- });
206
- });
207
- describe('setupMultipleEnvironments', () => {
208
- it('should setup multiple environments successfully', async () => {
209
- const envIds = ['cursor', 'gemini'];
210
- const cursorEnv = {
211
- code: 'cursor',
212
- name: 'Cursor',
213
- contextFileName: 'AGENTS.md',
214
- commandPath: '.cursor/commands',
215
- };
216
- const geminiEnv = {
217
- code: 'gemini',
218
- name: 'Gemini',
219
- contextFileName: 'AGENTS.md',
220
- commandPath: '.gemini/commands',
221
- isCustomCommandPath: true,
222
- };
223
- mockGetEnvironment
224
- .mockReturnValueOnce(cursorEnv)
225
- .mockReturnValueOnce(geminiEnv);
226
- // Mock setupSingleEnvironment
227
- const mockSetupSingleEnvironment = jest.fn();
228
- mockSetupSingleEnvironment
229
- .mockResolvedValueOnce(['/path/to/cursor/file1', '/path/to/cursor/file2'])
230
- .mockResolvedValueOnce(['/path/to/gemini/file1']);
231
- templateManager.setupSingleEnvironment = mockSetupSingleEnvironment;
232
- const result = await templateManager.setupMultipleEnvironments(envIds);
233
- expect(mockGetEnvironment).toHaveBeenCalledWith('cursor');
234
- expect(mockGetEnvironment).toHaveBeenCalledWith('gemini');
235
- expect(mockSetupSingleEnvironment).toHaveBeenCalledWith(cursorEnv);
236
- expect(mockSetupSingleEnvironment).toHaveBeenCalledWith(geminiEnv);
237
- expect(result).toEqual([
238
- '/path/to/cursor/file1',
239
- '/path/to/cursor/file2',
240
- '/path/to/gemini/file1'
241
- ]);
242
- });
243
- it('should skip invalid environments and continue with valid ones', async () => {
244
- const envIds = ['cursor', 'invalid', 'gemini'];
245
- const cursorEnv = {
246
- code: 'cursor',
247
- name: 'Cursor',
248
- contextFileName: 'AGENTS.md',
249
- commandPath: '.cursor/commands',
250
- };
251
- const geminiEnv = {
252
- code: 'gemini',
253
- name: 'Gemini',
254
- contextFileName: 'AGENTS.md',
255
- commandPath: '.gemini/commands',
256
- isCustomCommandPath: true,
257
- };
258
- const consoleWarnSpy = jest.spyOn(console, 'warn').mockImplementation();
259
- mockGetEnvironment
260
- .mockReturnValueOnce(cursorEnv)
261
- .mockReturnValueOnce(undefined) // invalid environment
262
- .mockReturnValueOnce(geminiEnv);
263
- // Mock setupSingleEnvironment
264
- const mockSetupSingleEnvironment = jest.fn();
265
- mockSetupSingleEnvironment
266
- .mockResolvedValueOnce(['/path/to/cursor/file1'])
267
- .mockResolvedValueOnce(['/path/to/gemini/file1']);
268
- templateManager.setupSingleEnvironment = mockSetupSingleEnvironment;
269
- const result = await templateManager.setupMultipleEnvironments(envIds);
270
- expect(consoleWarnSpy).toHaveBeenCalledWith("Warning: Environment 'invalid' not found, skipping");
271
- expect(result).toEqual([
272
- '/path/to/cursor/file1',
273
- '/path/to/gemini/file1'
274
- ]);
275
- consoleWarnSpy.mockRestore();
276
- });
277
- it('should throw error when setupSingleEnvironment fails', async () => {
278
- const envIds = ['cursor'];
279
- const cursorEnv = {
280
- code: 'cursor',
281
- name: 'Cursor',
282
- contextFileName: 'AGENTS.md',
283
- commandPath: '.cursor/commands',
284
- };
285
- mockGetEnvironment.mockReturnValue(cursorEnv);
286
- const mockSetupSingleEnvironment = jest.fn().mockRejectedValue(new Error('Setup failed'));
287
- templateManager.setupSingleEnvironment = mockSetupSingleEnvironment;
288
- const consoleErrorSpy = jest.spyOn(console, 'error').mockImplementation();
289
- await expect(templateManager.setupMultipleEnvironments(envIds)).rejects.toThrow('Setup failed');
290
- expect(consoleErrorSpy).toHaveBeenCalledWith("Error setting up environment 'Cursor':", expect.any(Error));
291
- consoleErrorSpy.mockRestore();
292
- });
293
- });
294
- describe('checkEnvironmentExists', () => {
295
- it('should return false when environment does not exist', async () => {
296
- const envId = 'cursor';
297
- mockGetEnvironment.mockReturnValue(undefined);
298
- const result = await templateManager.checkEnvironmentExists(envId);
299
- expect(mockGetEnvironment).toHaveBeenCalledWith(envId);
300
- expect(result).toBe(false);
301
- });
302
- it('should return true when context file exists', async () => {
303
- const envId = 'cursor';
304
- const env = {
305
- code: 'cursor',
306
- name: 'Cursor',
307
- contextFileName: 'AGENTS.md',
308
- commandPath: '.cursor/commands',
309
- };
310
- mockGetEnvironment.mockReturnValue(env);
311
- mockFs.pathExists
312
- .mockResolvedValueOnce(true) // context file exists
313
- .mockResolvedValueOnce(false); // command dir doesn't exist
314
- const result = await templateManager.checkEnvironmentExists(envId);
315
- expect(mockFs.pathExists).toHaveBeenCalledWith(path.join(templateManager['targetDir'], env.contextFileName));
316
- expect(mockFs.pathExists).toHaveBeenCalledWith(path.join(templateManager['targetDir'], env.commandPath));
317
- expect(result).toBe(true);
318
- });
319
- it('should return true when command directory exists', async () => {
320
- const envId = 'cursor';
321
- const env = {
322
- code: 'cursor',
323
- name: 'Cursor',
324
- contextFileName: 'AGENTS.md',
325
- commandPath: '.cursor/commands',
326
- };
327
- mockGetEnvironment.mockReturnValue(env);
328
- mockFs.pathExists
329
- .mockResolvedValueOnce(false) // context file doesn't exist
330
- .mockResolvedValueOnce(true); // command dir exists
331
- const result = await templateManager.checkEnvironmentExists(envId);
332
- expect(result).toBe(true);
333
- });
334
- it('should return false when neither context file nor command directory exists', async () => {
335
- const envId = 'cursor';
336
- const env = {
337
- code: 'cursor',
338
- name: 'Cursor',
339
- contextFileName: 'AGENTS.md',
340
- commandPath: '.cursor/commands',
341
- };
342
- mockGetEnvironment.mockReturnValue(env);
343
- mockFs.pathExists
344
- .mockResolvedValueOnce(false) // context file doesn't exist
345
- .mockResolvedValueOnce(false); // command dir doesn't exist
346
- const result = await templateManager.checkEnvironmentExists(envId);
347
- expect(result).toBe(false);
348
- });
349
- });
350
- });
351
- //# sourceMappingURL=TemplateManager.test.js.map