@cxtmanager/core 1.0.10 → 1.0.12
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/LICENSE +21 -0
- package/README.md +81 -28
- package/dist/__tests__/context-manager.test.d.ts +2 -0
- package/dist/__tests__/context-manager.test.d.ts.map +1 -0
- package/dist/__tests__/context-manager.test.js +239 -0
- package/dist/__tests__/context-manager.test.js.map +1 -0
- package/dist/__tests__/file-watcher.test.d.ts +2 -0
- package/dist/__tests__/file-watcher.test.d.ts.map +1 -0
- package/dist/__tests__/file-watcher.test.js +84 -0
- package/dist/__tests__/file-watcher.test.js.map +1 -0
- package/dist/__tests__/git-repository.test.d.ts +2 -0
- package/dist/__tests__/git-repository.test.d.ts.map +1 -0
- package/dist/__tests__/git-repository.test.js +256 -0
- package/dist/__tests__/git-repository.test.js.map +1 -0
- package/dist/__tests__/plan-manager.test.d.ts +2 -0
- package/dist/__tests__/plan-manager.test.d.ts.map +1 -0
- package/dist/__tests__/plan-manager.test.js +212 -0
- package/dist/__tests__/plan-manager.test.js.map +1 -0
- package/dist/__tests__/plan-templates.test.d.ts +2 -0
- package/dist/__tests__/plan-templates.test.d.ts.map +1 -0
- package/dist/__tests__/plan-templates.test.js +93 -0
- package/dist/__tests__/plan-templates.test.js.map +1 -0
- package/dist/__tests__/validation-engine.test.d.ts +2 -0
- package/dist/__tests__/validation-engine.test.d.ts.map +1 -0
- package/dist/__tests__/validation-engine.test.js +152 -0
- package/dist/__tests__/validation-engine.test.js.map +1 -0
- package/dist/context-manager.d.ts +6 -7
- package/dist/context-manager.d.ts.map +1 -1
- package/dist/context-manager.js +166 -169
- package/dist/context-manager.js.map +1 -1
- package/dist/git-hooks-manager.d.ts +1 -1
- package/dist/git-hooks-manager.d.ts.map +1 -1
- package/dist/git-hooks-manager.js +15 -17
- package/dist/git-hooks-manager.js.map +1 -1
- package/dist/git-repository.d.ts +6 -1
- package/dist/git-repository.d.ts.map +1 -1
- package/dist/git-repository.js +141 -21
- package/dist/git-repository.js.map +1 -1
- package/dist/plan-manager.d.ts +3 -3
- package/dist/plan-manager.d.ts.map +1 -1
- package/dist/plan-manager.js +19 -9
- package/dist/plan-manager.js.map +1 -1
- package/dist/plan-templates.d.ts +4 -4
- package/dist/plan-templates.d.ts.map +1 -1
- package/dist/plan-templates.js +9 -40
- package/dist/plan-templates.js.map +1 -1
- package/dist/types/index.d.ts +1 -33
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/types.d.ts +22 -55
- package/dist/types.d.ts.map +1 -1
- package/dist/validation-engine.d.ts +5 -11
- package/dist/validation-engine.d.ts.map +1 -1
- package/dist/validation-engine.js +103 -150
- package/dist/validation-engine.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,256 @@
|
|
|
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 git_repository_1 = require("../git-repository");
|
|
37
|
+
const fs = __importStar(require("fs-extra"));
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
const os = __importStar(require("os"));
|
|
40
|
+
const simple_git_1 = require("simple-git");
|
|
41
|
+
describe('GitRepository', () => {
|
|
42
|
+
let testDir;
|
|
43
|
+
let gitRepo;
|
|
44
|
+
beforeEach(() => {
|
|
45
|
+
testDir = path.join(os.tmpdir(), `cxtmanager-git-test-${Date.now()}`);
|
|
46
|
+
fs.ensureDirSync(testDir);
|
|
47
|
+
gitRepo = new git_repository_1.GitRepository(testDir);
|
|
48
|
+
});
|
|
49
|
+
afterEach(async () => {
|
|
50
|
+
if (await fs.pathExists(testDir)) {
|
|
51
|
+
await fs.remove(testDir);
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
describe('isGitRepo', () => {
|
|
55
|
+
it('should return false when not a git repository', async () => {
|
|
56
|
+
const result = await gitRepo.isGitRepo();
|
|
57
|
+
expect(result).toBe(false);
|
|
58
|
+
});
|
|
59
|
+
it('should return true after initializing git repository', async () => {
|
|
60
|
+
const git = (0, simple_git_1.simpleGit)(testDir);
|
|
61
|
+
await git.init();
|
|
62
|
+
const result = await gitRepo.isGitRepo();
|
|
63
|
+
expect(result).toBe(true);
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
describe('getStatus', () => {
|
|
67
|
+
it('should throw error when not a git repository', async () => {
|
|
68
|
+
await expect(gitRepo.getStatus()).rejects.toThrow('Not a Git repository');
|
|
69
|
+
});
|
|
70
|
+
it('should return status with empty arrays for clean repo', async () => {
|
|
71
|
+
const git = (0, simple_git_1.simpleGit)(testDir);
|
|
72
|
+
await git.init();
|
|
73
|
+
const status = await gitRepo.getStatus();
|
|
74
|
+
expect(status).toBeDefined();
|
|
75
|
+
expect(status.staged).toEqual([]);
|
|
76
|
+
expect(status.modified).toEqual([]);
|
|
77
|
+
expect(status.untracked).toEqual([]);
|
|
78
|
+
});
|
|
79
|
+
it('should detect modified files', async () => {
|
|
80
|
+
const git = (0, simple_git_1.simpleGit)(testDir);
|
|
81
|
+
await git.init();
|
|
82
|
+
try {
|
|
83
|
+
await git.addConfig('user.name', 'Test User', false, 'local');
|
|
84
|
+
await git.addConfig('user.email', 'test@example.com', false, 'local');
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
// Ignore config errors
|
|
88
|
+
}
|
|
89
|
+
// Create and modify a file
|
|
90
|
+
const testFile = path.join(testDir, 'test.txt');
|
|
91
|
+
fs.writeFileSync(testFile, 'initial');
|
|
92
|
+
await git.add(['test.txt']);
|
|
93
|
+
await git.commit('Initial commit');
|
|
94
|
+
fs.writeFileSync(testFile, 'modified');
|
|
95
|
+
const status = await gitRepo.getStatus();
|
|
96
|
+
expect(status.modified.length).toBeGreaterThan(0);
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
describe('getFileHistory', () => {
|
|
100
|
+
it('should return empty array for non-existent file', async () => {
|
|
101
|
+
const git = (0, simple_git_1.simpleGit)(testDir);
|
|
102
|
+
await git.init();
|
|
103
|
+
const history = await gitRepo.getFileHistory('nonexistent.txt');
|
|
104
|
+
expect(history).toEqual([]);
|
|
105
|
+
});
|
|
106
|
+
it('should return commit history for file', async () => {
|
|
107
|
+
const git = (0, simple_git_1.simpleGit)(testDir);
|
|
108
|
+
await git.init();
|
|
109
|
+
try {
|
|
110
|
+
await git.addConfig('user.name', 'Test User', false, 'local');
|
|
111
|
+
await git.addConfig('user.email', 'test@example.com', false, 'local');
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
// Ignore config errors
|
|
115
|
+
}
|
|
116
|
+
const testFile = path.join(testDir, 'test.txt');
|
|
117
|
+
fs.writeFileSync(testFile, 'content');
|
|
118
|
+
await git.add(['test.txt']);
|
|
119
|
+
await git.commit('Add test file');
|
|
120
|
+
const history = await gitRepo.getFileHistory('test.txt');
|
|
121
|
+
expect(history.length).toBeGreaterThan(0);
|
|
122
|
+
expect(history[0]).toHaveProperty('hash');
|
|
123
|
+
expect(history[0]).toHaveProperty('message');
|
|
124
|
+
expect(history[0]).toHaveProperty('author');
|
|
125
|
+
expect(history[0]).toHaveProperty('email');
|
|
126
|
+
expect(history[0]).toHaveProperty('date');
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
describe('addAndCommit', () => {
|
|
130
|
+
it('should throw error when not a git repository', async () => {
|
|
131
|
+
await expect(gitRepo.addAndCommit(['test.txt'], 'test message')).rejects.toThrow('Not a Git repository');
|
|
132
|
+
});
|
|
133
|
+
it('should commit files', async () => {
|
|
134
|
+
const git = (0, simple_git_1.simpleGit)(testDir);
|
|
135
|
+
await git.init();
|
|
136
|
+
try {
|
|
137
|
+
await git.addConfig('user.name', 'Test User', false, 'local');
|
|
138
|
+
await git.addConfig('user.email', 'test@example.com', false, 'local');
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
// Ignore config errors
|
|
142
|
+
}
|
|
143
|
+
const testFile = path.join(testDir, 'test.txt');
|
|
144
|
+
fs.writeFileSync(testFile, 'content');
|
|
145
|
+
await gitRepo.addAndCommit(['test.txt'], 'Test commit');
|
|
146
|
+
const log = await git.log();
|
|
147
|
+
expect(log.total).toBe(1);
|
|
148
|
+
expect(log.latest?.message).toBe('Test commit');
|
|
149
|
+
});
|
|
150
|
+
it('should use Git configured user when no author override', async () => {
|
|
151
|
+
const git = (0, simple_git_1.simpleGit)(testDir);
|
|
152
|
+
await git.init();
|
|
153
|
+
// Set Git user config
|
|
154
|
+
try {
|
|
155
|
+
await git.addConfig('user.name', 'Test User', false, 'local');
|
|
156
|
+
await git.addConfig('user.email', 'test@example.com', false, 'local');
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
// Ignore config errors
|
|
160
|
+
}
|
|
161
|
+
const testFile = path.join(testDir, 'test.txt');
|
|
162
|
+
fs.writeFileSync(testFile, 'content');
|
|
163
|
+
// No author override - Git will use configured user.name and user.email
|
|
164
|
+
await gitRepo.addAndCommit(['test.txt'], 'Test commit');
|
|
165
|
+
const log = await git.log();
|
|
166
|
+
expect(log.total).toBe(1);
|
|
167
|
+
expect(log.latest?.message).toBe('Test commit');
|
|
168
|
+
// Git will use the configured user
|
|
169
|
+
expect(log.latest?.author_name).toBe('Test User');
|
|
170
|
+
expect(log.latest?.author_email).toBe('test@example.com');
|
|
171
|
+
});
|
|
172
|
+
it('should accept properly formatted author string', async () => {
|
|
173
|
+
const git = (0, simple_git_1.simpleGit)(testDir);
|
|
174
|
+
await git.init();
|
|
175
|
+
// Set Git user config (required even when using --author override)
|
|
176
|
+
try {
|
|
177
|
+
await git.addConfig('user.name', 'Test User', false, 'local');
|
|
178
|
+
await git.addConfig('user.email', 'test@example.com', false, 'local');
|
|
179
|
+
}
|
|
180
|
+
catch {
|
|
181
|
+
// Ignore config errors
|
|
182
|
+
}
|
|
183
|
+
const testFile = path.join(testDir, 'test.txt');
|
|
184
|
+
fs.writeFileSync(testFile, 'content');
|
|
185
|
+
// Use properly formatted author string
|
|
186
|
+
await gitRepo.addAndCommit(['test.txt'], 'Test commit', 'Custom Author <custom@example.com>');
|
|
187
|
+
const log = await git.log();
|
|
188
|
+
expect(log.total).toBe(1);
|
|
189
|
+
expect(log.latest?.author_name).toBe('Custom Author');
|
|
190
|
+
expect(log.latest?.author_email).toBe('custom@example.com');
|
|
191
|
+
});
|
|
192
|
+
it('should throw helpful error when Git user is not configured', async () => {
|
|
193
|
+
const git = (0, simple_git_1.simpleGit)(testDir);
|
|
194
|
+
await git.init();
|
|
195
|
+
// Don't set Git user config
|
|
196
|
+
const testFile = path.join(testDir, 'test.txt');
|
|
197
|
+
fs.writeFileSync(testFile, 'content');
|
|
198
|
+
await expect(gitRepo.addAndCommit(['test.txt'], 'Test commit')).rejects.toThrow('Git user information not configured');
|
|
199
|
+
try {
|
|
200
|
+
await gitRepo.addAndCommit(['test.txt'], 'Test commit');
|
|
201
|
+
fail('Should have thrown an error');
|
|
202
|
+
}
|
|
203
|
+
catch (error) {
|
|
204
|
+
expect(error.message).toContain('Git user information not configured');
|
|
205
|
+
expect(error.message).toContain('git config --global user.name');
|
|
206
|
+
expect(error.message).toContain('git config --global user.email');
|
|
207
|
+
}
|
|
208
|
+
});
|
|
209
|
+
});
|
|
210
|
+
describe('ensureGitUserConfigured', () => {
|
|
211
|
+
it('should pass when Git user is configured', async () => {
|
|
212
|
+
const git = (0, simple_git_1.simpleGit)(testDir);
|
|
213
|
+
await git.init();
|
|
214
|
+
await git.addConfig('user.name', 'Test User', false, 'local');
|
|
215
|
+
await git.addConfig('user.email', 'test@example.com', false, 'local');
|
|
216
|
+
// Should not throw
|
|
217
|
+
await expect(gitRepo.ensureGitUserConfigured()).resolves.not.toThrow();
|
|
218
|
+
});
|
|
219
|
+
it('should throw when Git user name is not configured', async () => {
|
|
220
|
+
const git = (0, simple_git_1.simpleGit)(testDir);
|
|
221
|
+
await git.init();
|
|
222
|
+
// Only set email, not name
|
|
223
|
+
await git.addConfig('user.email', 'test@example.com', false, 'local');
|
|
224
|
+
await expect(gitRepo.ensureGitUserConfigured()).rejects.toThrow('Git user information not configured');
|
|
225
|
+
});
|
|
226
|
+
it('should throw when Git user email is not configured', async () => {
|
|
227
|
+
const git = (0, simple_git_1.simpleGit)(testDir);
|
|
228
|
+
await git.init();
|
|
229
|
+
// Only set name, not email
|
|
230
|
+
await git.addConfig('user.name', 'Test User', false, 'local');
|
|
231
|
+
await expect(gitRepo.ensureGitUserConfigured()).rejects.toThrow('Git user information not configured');
|
|
232
|
+
});
|
|
233
|
+
it('should check global config if local is not set', async () => {
|
|
234
|
+
const git = (0, simple_git_1.simpleGit)(testDir);
|
|
235
|
+
await git.init();
|
|
236
|
+
// Don't set local config - method should check global
|
|
237
|
+
// Note: This test verifies the method checks global, but we can't reliably
|
|
238
|
+
// set global config in tests without affecting the system. Instead, we verify
|
|
239
|
+
// the method attempts to check global by ensuring it doesn't throw immediately
|
|
240
|
+
// when local is not set (it will check global before throwing)
|
|
241
|
+
// If global config exists on the system, this should pass
|
|
242
|
+
// If not, it will throw (which is expected behavior)
|
|
243
|
+
try {
|
|
244
|
+
await gitRepo.ensureGitUserConfigured();
|
|
245
|
+
// If we get here, global config exists - test passes
|
|
246
|
+
expect(true).toBe(true);
|
|
247
|
+
}
|
|
248
|
+
catch (error) {
|
|
249
|
+
// If global config doesn't exist, error should mention global config
|
|
250
|
+
expect(error.message).toContain('Git user information not configured');
|
|
251
|
+
expect(error.message).toContain('git config --global');
|
|
252
|
+
}
|
|
253
|
+
});
|
|
254
|
+
});
|
|
255
|
+
});
|
|
256
|
+
//# sourceMappingURL=git-repository.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-repository.test.js","sourceRoot":"","sources":["../../src/__tests__/git-repository.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan-manager.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/plan-manager.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,212 @@
|
|
|
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 plan_manager_1 = require("../plan-manager");
|
|
37
|
+
const git_repository_1 = require("../git-repository");
|
|
38
|
+
const fs = __importStar(require("fs-extra"));
|
|
39
|
+
const path = __importStar(require("path"));
|
|
40
|
+
const os = __importStar(require("os"));
|
|
41
|
+
describe('PlanManager', () => {
|
|
42
|
+
let testDir;
|
|
43
|
+
let gitRepo;
|
|
44
|
+
let manager;
|
|
45
|
+
let config;
|
|
46
|
+
beforeEach(async () => {
|
|
47
|
+
testDir = path.join(os.tmpdir(), `cxtmanager-plan-test-${Date.now()}`);
|
|
48
|
+
await fs.ensureDir(testDir);
|
|
49
|
+
// Initialize git repo
|
|
50
|
+
gitRepo = new git_repository_1.GitRepository(testDir);
|
|
51
|
+
await gitRepo.ensureGitRepo();
|
|
52
|
+
// Set git user for commits
|
|
53
|
+
const { execSync } = require('child_process');
|
|
54
|
+
execSync('git config user.name "Test User"', { cwd: testDir });
|
|
55
|
+
execSync('git config user.email "test@example.com"', { cwd: testDir });
|
|
56
|
+
// Create .cxt directory
|
|
57
|
+
const cxtDir = path.join(testDir, '.cxt');
|
|
58
|
+
await fs.ensureDir(cxtDir);
|
|
59
|
+
// Default config
|
|
60
|
+
config = {
|
|
61
|
+
version: '1.0.0',
|
|
62
|
+
mode: 'blank',
|
|
63
|
+
git_integration: {
|
|
64
|
+
enabled: true,
|
|
65
|
+
hooks: {},
|
|
66
|
+
silent_mode: true,
|
|
67
|
+
auto_install_hooks: false,
|
|
68
|
+
track_in_git: true
|
|
69
|
+
},
|
|
70
|
+
plan_management: {
|
|
71
|
+
backup_on_switch: true,
|
|
72
|
+
// auto_commit_ai_changes and archive_completed removed
|
|
73
|
+
},
|
|
74
|
+
context: {
|
|
75
|
+
health_checks: true,
|
|
76
|
+
ai_attribution: true,
|
|
77
|
+
drift_detection: true,
|
|
78
|
+
warn_threshold: 3,
|
|
79
|
+
content_quality: {
|
|
80
|
+
min_content_length: 100,
|
|
81
|
+
min_content_lines: 3,
|
|
82
|
+
empty_section_warning: true,
|
|
83
|
+
short_content_warning: 200
|
|
84
|
+
}
|
|
85
|
+
},
|
|
86
|
+
created: new Date().toISOString()
|
|
87
|
+
};
|
|
88
|
+
manager = new plan_manager_1.PlanManager(cxtDir, gitRepo, config);
|
|
89
|
+
});
|
|
90
|
+
afterEach(async () => {
|
|
91
|
+
if (await fs.pathExists(testDir)) {
|
|
92
|
+
await fs.remove(testDir);
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
describe('createBlankPlan - respects init mode', () => {
|
|
96
|
+
it('should create blank plan when config.mode is blank', async () => {
|
|
97
|
+
config.mode = 'blank';
|
|
98
|
+
manager = new plan_manager_1.PlanManager(path.join(testDir, '.cxt'), gitRepo, config);
|
|
99
|
+
await manager.createBlankPlan();
|
|
100
|
+
const planPath = path.join(testDir, '.cxt', 'plan.md');
|
|
101
|
+
expect(await fs.pathExists(planPath)).toBe(true);
|
|
102
|
+
const content = await fs.readFile(planPath, 'utf-8');
|
|
103
|
+
expect(content).toContain('# Development Plan');
|
|
104
|
+
expect(content).not.toContain('GUIDANCE');
|
|
105
|
+
expect(content).not.toContain('##');
|
|
106
|
+
});
|
|
107
|
+
it('should create template plan when config.mode is template', async () => {
|
|
108
|
+
config.mode = 'template';
|
|
109
|
+
manager = new plan_manager_1.PlanManager(path.join(testDir, '.cxt'), gitRepo, config);
|
|
110
|
+
await manager.createBlankPlan('template');
|
|
111
|
+
const planPath = path.join(testDir, '.cxt', 'plan.md');
|
|
112
|
+
expect(await fs.pathExists(planPath)).toBe(true);
|
|
113
|
+
const content = await fs.readFile(planPath, 'utf-8');
|
|
114
|
+
expect(content).toContain('# Current Branch Implementation');
|
|
115
|
+
expect(content).toContain('GUIDANCE');
|
|
116
|
+
expect(content).toContain('##');
|
|
117
|
+
});
|
|
118
|
+
it('should respect plan_management.plan_template_style override', async () => {
|
|
119
|
+
config.mode = 'template'; // Init was template
|
|
120
|
+
config.plan_management.plan_template_style = 'blank'; // But override to blank
|
|
121
|
+
manager = new plan_manager_1.PlanManager(path.join(testDir, '.cxt'), gitRepo, config);
|
|
122
|
+
await manager.createBlankPlan();
|
|
123
|
+
const planPath = path.join(testDir, '.cxt', 'plan.md');
|
|
124
|
+
const content = await fs.readFile(planPath, 'utf-8');
|
|
125
|
+
// Should use blank despite init mode being template
|
|
126
|
+
expect(content).toContain('# Development Plan');
|
|
127
|
+
expect(content).not.toContain('GUIDANCE');
|
|
128
|
+
expect(content).not.toContain('##');
|
|
129
|
+
});
|
|
130
|
+
it('should use config.mode when plan_template_style is not set', async () => {
|
|
131
|
+
config.mode = 'blank';
|
|
132
|
+
config.plan_management.plan_template_style = undefined;
|
|
133
|
+
manager = new plan_manager_1.PlanManager(path.join(testDir, '.cxt'), gitRepo, config);
|
|
134
|
+
await manager.createBlankPlan();
|
|
135
|
+
const planPath = path.join(testDir, '.cxt', 'plan.md');
|
|
136
|
+
const content = await fs.readFile(planPath, 'utf-8');
|
|
137
|
+
// Should use config.mode (blank)
|
|
138
|
+
expect(content).toContain('# Development Plan');
|
|
139
|
+
expect(content).not.toContain('GUIDANCE');
|
|
140
|
+
});
|
|
141
|
+
it('should use template when template mode is set', async () => {
|
|
142
|
+
config.mode = 'template';
|
|
143
|
+
manager = new plan_manager_1.PlanManager(path.join(testDir, '.cxt'), gitRepo, config);
|
|
144
|
+
await manager.createBlankPlan();
|
|
145
|
+
const planPath = path.join(testDir, '.cxt', 'plan.md');
|
|
146
|
+
const content = await fs.readFile(planPath, 'utf-8');
|
|
147
|
+
// Should use template (structured with guidance)
|
|
148
|
+
expect(content).toContain('# Current Branch Implementation');
|
|
149
|
+
expect(content).toContain('GUIDANCE');
|
|
150
|
+
expect(content).toContain('##');
|
|
151
|
+
});
|
|
152
|
+
});
|
|
153
|
+
describe('syncPlan - backup_on_switch', () => {
|
|
154
|
+
it('should backup plan when backup_on_switch is true', async () => {
|
|
155
|
+
config.plan_management.backup_on_switch = true;
|
|
156
|
+
manager = new plan_manager_1.PlanManager(path.join(testDir, '.cxt'), gitRepo, config);
|
|
157
|
+
// Create initial plan
|
|
158
|
+
await manager.createBlankPlan();
|
|
159
|
+
const planPath = path.join(testDir, '.cxt', 'plan.md');
|
|
160
|
+
await fs.writeFile(planPath, '# Test Plan\n\nInitial content');
|
|
161
|
+
// Create state file to simulate branch switch
|
|
162
|
+
const statePath = path.join(testDir, '.cxt', '.plan-state.json');
|
|
163
|
+
await fs.writeJson(statePath, { lastBranch: 'feature-branch' });
|
|
164
|
+
// Switch to new branch (simulated)
|
|
165
|
+
const { execSync } = require('child_process');
|
|
166
|
+
execSync('git checkout -b main', { cwd: testDir });
|
|
167
|
+
await manager.syncPlan({ silent: true });
|
|
168
|
+
// Plan should be backed up
|
|
169
|
+
const backupPath = path.join(testDir, '.cxt', '.plan-history', 'feature-branch.md');
|
|
170
|
+
expect(await fs.pathExists(backupPath)).toBe(true);
|
|
171
|
+
const backupContent = await fs.readFile(backupPath, 'utf-8');
|
|
172
|
+
expect(backupContent).toContain('Initial content');
|
|
173
|
+
});
|
|
174
|
+
it('should not backup plan when backup_on_switch is false', async () => {
|
|
175
|
+
config.plan_management.backup_on_switch = false;
|
|
176
|
+
manager = new plan_manager_1.PlanManager(path.join(testDir, '.cxt'), gitRepo, config);
|
|
177
|
+
// Create initial plan
|
|
178
|
+
await manager.createBlankPlan();
|
|
179
|
+
const planPath = path.join(testDir, '.cxt', 'plan.md');
|
|
180
|
+
await fs.writeFile(planPath, '# Test Plan\n\nInitial content');
|
|
181
|
+
// Create state file to simulate branch switch
|
|
182
|
+
const statePath = path.join(testDir, '.cxt', '.plan-state.json');
|
|
183
|
+
await fs.writeJson(statePath, { lastBranch: 'feature-branch' });
|
|
184
|
+
// Switch to new branch (simulated)
|
|
185
|
+
const { execSync } = require('child_process');
|
|
186
|
+
execSync('git checkout -b main', { cwd: testDir });
|
|
187
|
+
await manager.syncPlan({ silent: true });
|
|
188
|
+
// Plan should NOT be backed up
|
|
189
|
+
const backupPath = path.join(testDir, '.cxt', '.plan-history', 'feature-branch.md');
|
|
190
|
+
expect(await fs.pathExists(backupPath)).toBe(false);
|
|
191
|
+
});
|
|
192
|
+
it('should backup plan when backup_on_switch is undefined (defaults to true)', async () => {
|
|
193
|
+
config.plan_management.backup_on_switch = undefined;
|
|
194
|
+
manager = new plan_manager_1.PlanManager(path.join(testDir, '.cxt'), gitRepo, config);
|
|
195
|
+
// Create initial plan
|
|
196
|
+
await manager.createBlankPlan();
|
|
197
|
+
const planPath = path.join(testDir, '.cxt', 'plan.md');
|
|
198
|
+
await fs.writeFile(planPath, '# Test Plan\n\nInitial content');
|
|
199
|
+
// Create state file to simulate branch switch
|
|
200
|
+
const statePath = path.join(testDir, '.cxt', '.plan-state.json');
|
|
201
|
+
await fs.writeJson(statePath, { lastBranch: 'feature-branch' });
|
|
202
|
+
// Switch to new branch (simulated)
|
|
203
|
+
const { execSync } = require('child_process');
|
|
204
|
+
execSync('git checkout -b main', { cwd: testDir });
|
|
205
|
+
await manager.syncPlan({ silent: true });
|
|
206
|
+
// Plan should be backed up (default behavior)
|
|
207
|
+
const backupPath = path.join(testDir, '.cxt', '.plan-history', 'feature-branch.md');
|
|
208
|
+
expect(await fs.pathExists(backupPath)).toBe(true);
|
|
209
|
+
});
|
|
210
|
+
});
|
|
211
|
+
});
|
|
212
|
+
//# sourceMappingURL=plan-manager.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan-manager.test.js","sourceRoot":"","sources":["../../src/__tests__/plan-manager.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan-templates.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/plan-templates.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const plan_templates_1 = require("../plan-templates");
|
|
4
|
+
describe('PlanTemplates', () => {
|
|
5
|
+
describe('getBlank', () => {
|
|
6
|
+
it('should return a template string', () => {
|
|
7
|
+
const template = plan_templates_1.PlanTemplates.getBlank();
|
|
8
|
+
expect(typeof template).toBe('string');
|
|
9
|
+
expect(template.length).toBeGreaterThan(0);
|
|
10
|
+
});
|
|
11
|
+
it('should include branch name when provided', () => {
|
|
12
|
+
const template = plan_templates_1.PlanTemplates.getBlank('feature/test');
|
|
13
|
+
expect(template).toContain('feature/test');
|
|
14
|
+
});
|
|
15
|
+
it('should include date when provided', () => {
|
|
16
|
+
const date = '2025-12-05';
|
|
17
|
+
const template = plan_templates_1.PlanTemplates.getBlank(undefined, date);
|
|
18
|
+
expect(template).toContain(date);
|
|
19
|
+
});
|
|
20
|
+
it('should NOT include guidance comments', () => {
|
|
21
|
+
const template = plan_templates_1.PlanTemplates.getBlank();
|
|
22
|
+
expect(template).not.toContain('GUIDANCE');
|
|
23
|
+
expect(template).not.toContain('<!--');
|
|
24
|
+
expect(template).not.toContain('-->');
|
|
25
|
+
});
|
|
26
|
+
it('should NOT include section headers', () => {
|
|
27
|
+
const template = plan_templates_1.PlanTemplates.getBlank();
|
|
28
|
+
expect(template).not.toContain('##');
|
|
29
|
+
});
|
|
30
|
+
it('should only include title and metadata', () => {
|
|
31
|
+
const template = plan_templates_1.PlanTemplates.getBlank();
|
|
32
|
+
expect(template).toContain('# Development Plan');
|
|
33
|
+
expect(template).toContain('*This file contains');
|
|
34
|
+
// Should be shorter than template (no structure)
|
|
35
|
+
const structured = plan_templates_1.PlanTemplates.getTemplate();
|
|
36
|
+
expect(template.length).toBeLessThan(structured.length);
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
describe('getTemplate', () => {
|
|
40
|
+
it('should return a template string', () => {
|
|
41
|
+
const template = plan_templates_1.PlanTemplates.getTemplate();
|
|
42
|
+
expect(typeof template).toBe('string');
|
|
43
|
+
expect(template.length).toBeGreaterThan(0);
|
|
44
|
+
});
|
|
45
|
+
it('should be longer than blank template', () => {
|
|
46
|
+
const blank = plan_templates_1.PlanTemplates.getBlank();
|
|
47
|
+
const template = plan_templates_1.PlanTemplates.getTemplate();
|
|
48
|
+
expect(template.length).toBeGreaterThan(blank.length);
|
|
49
|
+
});
|
|
50
|
+
it('should include branch name when provided', () => {
|
|
51
|
+
const template = plan_templates_1.PlanTemplates.getTemplate('feature/test');
|
|
52
|
+
expect(template).toContain('feature/test');
|
|
53
|
+
});
|
|
54
|
+
it('should include date when provided', () => {
|
|
55
|
+
const date = '2025-12-05';
|
|
56
|
+
const template = plan_templates_1.PlanTemplates.getTemplate(undefined, date);
|
|
57
|
+
expect(template).toContain(date);
|
|
58
|
+
});
|
|
59
|
+
it('should include section headers', () => {
|
|
60
|
+
const template = plan_templates_1.PlanTemplates.getTemplate();
|
|
61
|
+
expect(template).toContain('##');
|
|
62
|
+
});
|
|
63
|
+
it('should include guidance comments', () => {
|
|
64
|
+
const template = plan_templates_1.PlanTemplates.getTemplate();
|
|
65
|
+
expect(template).toContain('GUIDANCE');
|
|
66
|
+
expect(template).toContain('What\'s Being Built');
|
|
67
|
+
expect(template).toContain('Implementation Approach');
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
describe('template consistency', () => {
|
|
71
|
+
it('should have consistent structure for both templates', () => {
|
|
72
|
+
const blank = plan_templates_1.PlanTemplates.getBlank();
|
|
73
|
+
const template = plan_templates_1.PlanTemplates.getTemplate();
|
|
74
|
+
// Both should have title
|
|
75
|
+
expect(blank).toMatch(/^#/);
|
|
76
|
+
expect(template).toMatch(/^#/);
|
|
77
|
+
// Both should be valid markdown
|
|
78
|
+
expect(blank.trim().length).toBeGreaterThan(0);
|
|
79
|
+
expect(template.trim().length).toBeGreaterThan(0);
|
|
80
|
+
});
|
|
81
|
+
it('should have blank template with minimal structure', () => {
|
|
82
|
+
const blank = plan_templates_1.PlanTemplates.getBlank();
|
|
83
|
+
const template = plan_templates_1.PlanTemplates.getTemplate();
|
|
84
|
+
// Blank should have title
|
|
85
|
+
expect(blank).toMatch(/^#/);
|
|
86
|
+
// Blank should be shorter (no sections)
|
|
87
|
+
expect(blank.length).toBeLessThan(template.length);
|
|
88
|
+
// Blank should not have section headers
|
|
89
|
+
expect(blank).not.toContain('##');
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
//# sourceMappingURL=plan-templates.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan-templates.test.js","sourceRoot":"","sources":["../../src/__tests__/plan-templates.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation-engine.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/validation-engine.test.ts"],"names":[],"mappings":""}
|