cortex-tms 2.1.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.
- package/LICENSE +21 -0
- package/README.md +258 -0
- package/bin/cortex-tms.js +34 -0
- package/dist/__tests__/init.test.d.ts +2 -0
- package/dist/__tests__/init.test.d.ts.map +1 -0
- package/dist/__tests__/init.test.js +172 -0
- package/dist/__tests__/init.test.js.map +1 -0
- package/dist/__tests__/utils/temp-dir.d.ts +6 -0
- package/dist/__tests__/utils/temp-dir.d.ts.map +1 -0
- package/dist/__tests__/utils/temp-dir.js +34 -0
- package/dist/__tests__/utils/temp-dir.js.map +1 -0
- package/dist/__tests__/validate.test.d.ts +2 -0
- package/dist/__tests__/validate.test.d.ts.map +1 -0
- package/dist/__tests__/validate.test.js +207 -0
- package/dist/__tests__/validate.test.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +32 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/init.d.ts +4 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +121 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/validate.d.ts +4 -0
- package/dist/commands/validate.d.ts.map +1 -0
- package/dist/commands/validate.js +151 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/types/cli.d.ts +94 -0
- package/dist/types/cli.d.ts.map +1 -0
- package/dist/types/cli.js +2 -0
- package/dist/types/cli.js.map +1 -0
- package/dist/utils/config.d.ts +13 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +185 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/detection.d.ts +5 -0
- package/dist/utils/detection.d.ts.map +1 -0
- package/dist/utils/detection.js +60 -0
- package/dist/utils/detection.js.map +1 -0
- package/dist/utils/prompts.d.ts +5 -0
- package/dist/utils/prompts.d.ts.map +1 -0
- package/dist/utils/prompts.js +82 -0
- package/dist/utils/prompts.js.map +1 -0
- package/dist/utils/templates.d.ts +14 -0
- package/dist/utils/templates.d.ts.map +1 -0
- package/dist/utils/templates.js +98 -0
- package/dist/utils/templates.js.map +1 -0
- package/dist/utils/validator.d.ts +12 -0
- package/dist/utils/validator.d.ts.map +1 -0
- package/dist/utils/validator.js +241 -0
- package/dist/utils/validator.js.map +1 -0
- package/package.json +69 -0
- package/templates/.github/copilot-instructions.md +28 -0
- package/templates/CLAUDE.md +18 -0
- package/templates/FUTURE-ENHANCEMENTS.md +79 -0
- package/templates/NEXT-TASKS.md +20 -0
- package/templates/README.md +172 -0
- package/templates/docs/archive/v1.0-CHANGELOG.md +0 -0
- package/templates/docs/core/ARCHITECTURE.md +102 -0
- package/templates/docs/core/DECISIONS.md +83 -0
- package/templates/docs/core/DOMAIN-LOGIC.md +8 -0
- package/templates/docs/core/GLOSSARY.md +66 -0
- package/templates/docs/core/PATTERNS.md +55 -0
- package/templates/docs/core/SCHEMA.md +246 -0
- package/templates/docs/core/TROUBLESHOOTING.md +325 -0
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
2
|
+
import { join } from 'path';
|
|
3
|
+
import { writeFile, mkdir } from 'fs/promises';
|
|
4
|
+
import { createTempDir, cleanupTempDir, } from './utils/temp-dir.js';
|
|
5
|
+
import { validateProject, validateFileSizes, validateMandatoryFiles, DEFAULT_LINE_LIMITS, } from '../utils/validator.js';
|
|
6
|
+
import { saveConfig, createConfigFromScope } from '../utils/config.js';
|
|
7
|
+
async function createMinimalProject(dir) {
|
|
8
|
+
await writeFile(join(dir, 'NEXT-TASKS.md'), '# NEXT: Upcoming Tasks\n');
|
|
9
|
+
await writeFile(join(dir, 'CLAUDE.md'), '# Agent Workflow\n');
|
|
10
|
+
await mkdir(join(dir, '.github'), { recursive: true });
|
|
11
|
+
await writeFile(join(dir, '.github/copilot-instructions.md'), '# Instructions\n');
|
|
12
|
+
}
|
|
13
|
+
async function createFileWithLines(dir, filename, lineCount) {
|
|
14
|
+
const content = Array(lineCount)
|
|
15
|
+
.fill('Line content here')
|
|
16
|
+
.join('\n');
|
|
17
|
+
const filePath = join(dir, filename);
|
|
18
|
+
const dirPath = filePath.substring(0, filePath.lastIndexOf('/'));
|
|
19
|
+
if (dirPath !== dir) {
|
|
20
|
+
await mkdir(dirPath, { recursive: true });
|
|
21
|
+
}
|
|
22
|
+
await writeFile(filePath, content);
|
|
23
|
+
}
|
|
24
|
+
describe('Validate Command - .cortexrc Integration', () => {
|
|
25
|
+
let tempDir;
|
|
26
|
+
beforeEach(async () => {
|
|
27
|
+
tempDir = await createTempDir();
|
|
28
|
+
await createMinimalProject(tempDir);
|
|
29
|
+
});
|
|
30
|
+
afterEach(async () => {
|
|
31
|
+
await cleanupTempDir(tempDir);
|
|
32
|
+
});
|
|
33
|
+
it('should use default line limits when no .cortexrc exists', async () => {
|
|
34
|
+
await createFileWithLines(tempDir, 'NEXT-TASKS.md', 250);
|
|
35
|
+
const result = await validateProject(tempDir);
|
|
36
|
+
const fileSizeCheck = result.checks.find((c) => c.name === 'File Size: NEXT-TASKS.md');
|
|
37
|
+
expect(fileSizeCheck).toBeDefined();
|
|
38
|
+
expect(fileSizeCheck?.passed).toBe(false);
|
|
39
|
+
expect(fileSizeCheck?.details).toContain('250');
|
|
40
|
+
expect(fileSizeCheck?.details).toContain('200');
|
|
41
|
+
});
|
|
42
|
+
it('should use scope-based limits from .cortexrc', async () => {
|
|
43
|
+
const config = createConfigFromScope('nano', 'test-project');
|
|
44
|
+
await saveConfig(tempDir, config);
|
|
45
|
+
await createFileWithLines(tempDir, 'NEXT-TASKS.md', 150);
|
|
46
|
+
const result = await validateProject(tempDir);
|
|
47
|
+
const fileSizeCheck = result.checks.find((c) => c.name === 'File Size: NEXT-TASKS.md');
|
|
48
|
+
expect(fileSizeCheck?.passed).toBe(false);
|
|
49
|
+
expect(fileSizeCheck?.details).toContain('150');
|
|
50
|
+
expect(fileSizeCheck?.details).toContain('100');
|
|
51
|
+
});
|
|
52
|
+
it('should allow larger limits for enterprise scope', async () => {
|
|
53
|
+
const config = createConfigFromScope('enterprise', 'test-project');
|
|
54
|
+
await saveConfig(tempDir, config);
|
|
55
|
+
await createFileWithLines(tempDir, 'NEXT-TASKS.md', 250);
|
|
56
|
+
const result = await validateProject(tempDir);
|
|
57
|
+
const fileSizeCheck = result.checks.find((c) => c.name === 'File Size: NEXT-TASKS.md');
|
|
58
|
+
expect(fileSizeCheck?.passed).toBe(true);
|
|
59
|
+
expect(fileSizeCheck?.details).toContain('250');
|
|
60
|
+
expect(fileSizeCheck?.details).toContain('300');
|
|
61
|
+
});
|
|
62
|
+
it('should respect custom line limit overrides in .cortexrc', async () => {
|
|
63
|
+
const config = createConfigFromScope('standard', 'test-project');
|
|
64
|
+
config.limits = {
|
|
65
|
+
'NEXT-TASKS.md': 500,
|
|
66
|
+
};
|
|
67
|
+
await saveConfig(tempDir, config);
|
|
68
|
+
await createFileWithLines(tempDir, 'NEXT-TASKS.md', 450);
|
|
69
|
+
const result = await validateProject(tempDir);
|
|
70
|
+
const fileSizeCheck = result.checks.find((c) => c.name === 'File Size: NEXT-TASKS.md');
|
|
71
|
+
expect(fileSizeCheck?.passed).toBe(true);
|
|
72
|
+
expect(fileSizeCheck?.details).toContain('450');
|
|
73
|
+
expect(fileSizeCheck?.details).toContain('500');
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
describe('Validate Command - Ignore Files', () => {
|
|
77
|
+
let tempDir;
|
|
78
|
+
beforeEach(async () => {
|
|
79
|
+
tempDir = await createTempDir();
|
|
80
|
+
await createMinimalProject(tempDir);
|
|
81
|
+
});
|
|
82
|
+
afterEach(async () => {
|
|
83
|
+
await cleanupTempDir(tempDir);
|
|
84
|
+
});
|
|
85
|
+
it('should detect placeholders by default', async () => {
|
|
86
|
+
await writeFile(join(tempDir, 'NEXT-TASKS.md'), '# Project: [Project Name]\n');
|
|
87
|
+
const result = await validateProject(tempDir);
|
|
88
|
+
const placeholderCheck = result.checks.find((c) => c.name === 'Placeholders: NEXT-TASKS.md');
|
|
89
|
+
expect(placeholderCheck?.passed).toBe(false);
|
|
90
|
+
expect(placeholderCheck?.message).toContain('unreplaced placeholders');
|
|
91
|
+
});
|
|
92
|
+
it('should ignore files specified in .cortexrc validation.ignoreFiles', async () => {
|
|
93
|
+
const config = createConfigFromScope('standard', 'test-project');
|
|
94
|
+
config.validation = {
|
|
95
|
+
ignoreFiles: ['NEXT-TASKS.md'],
|
|
96
|
+
ignorePatterns: [],
|
|
97
|
+
};
|
|
98
|
+
await saveConfig(tempDir, config);
|
|
99
|
+
await writeFile(join(tempDir, 'NEXT-TASKS.md'), '# Project: [Project Name]\n');
|
|
100
|
+
const result = await validateProject(tempDir);
|
|
101
|
+
const placeholderCheck = result.checks.find((c) => c.name === 'Placeholders: NEXT-TASKS.md');
|
|
102
|
+
expect(placeholderCheck).toBeUndefined();
|
|
103
|
+
});
|
|
104
|
+
it('should still check non-ignored files', async () => {
|
|
105
|
+
const config = createConfigFromScope('standard', 'test-project');
|
|
106
|
+
config.validation = {
|
|
107
|
+
ignoreFiles: ['NEXT-TASKS.md'],
|
|
108
|
+
ignorePatterns: [],
|
|
109
|
+
};
|
|
110
|
+
await saveConfig(tempDir, config);
|
|
111
|
+
await writeFile(join(tempDir, 'CLAUDE.md'), '# Agent for [Project Name]\n');
|
|
112
|
+
const result = await validateProject(tempDir);
|
|
113
|
+
const claudeCheck = result.checks.find((c) => c.name === 'Placeholders: CLAUDE.md');
|
|
114
|
+
expect(claudeCheck?.passed).toBe(false);
|
|
115
|
+
expect(claudeCheck?.message).toContain('unreplaced placeholders');
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
describe('Validate Command - Mandatory Files', () => {
|
|
119
|
+
let tempDir;
|
|
120
|
+
beforeEach(async () => {
|
|
121
|
+
tempDir = await createTempDir();
|
|
122
|
+
});
|
|
123
|
+
afterEach(async () => {
|
|
124
|
+
await cleanupTempDir(tempDir);
|
|
125
|
+
});
|
|
126
|
+
it('should fail when mandatory files are missing', async () => {
|
|
127
|
+
const checks = validateMandatoryFiles(tempDir);
|
|
128
|
+
const nextTasksCheck = checks.find((c) => c.file === 'NEXT-TASKS.md');
|
|
129
|
+
const claudeCheck = checks.find((c) => c.file === 'CLAUDE.md');
|
|
130
|
+
expect(nextTasksCheck?.passed).toBe(false);
|
|
131
|
+
expect(nextTasksCheck?.level).toBe('error');
|
|
132
|
+
expect(claudeCheck?.passed).toBe(false);
|
|
133
|
+
expect(claudeCheck?.level).toBe('error');
|
|
134
|
+
});
|
|
135
|
+
it('should pass when all mandatory files exist', async () => {
|
|
136
|
+
await createMinimalProject(tempDir);
|
|
137
|
+
const checks = validateMandatoryFiles(tempDir);
|
|
138
|
+
const allPassed = checks.every((c) => c.passed);
|
|
139
|
+
expect(allPassed).toBe(true);
|
|
140
|
+
});
|
|
141
|
+
});
|
|
142
|
+
describe('Validate Command - File Size Limits', () => {
|
|
143
|
+
let tempDir;
|
|
144
|
+
beforeEach(async () => {
|
|
145
|
+
tempDir = await createTempDir();
|
|
146
|
+
});
|
|
147
|
+
afterEach(async () => {
|
|
148
|
+
await cleanupTempDir(tempDir);
|
|
149
|
+
});
|
|
150
|
+
it('should pass when file is within limit', async () => {
|
|
151
|
+
await createFileWithLines(tempDir, 'NEXT-TASKS.md', 100);
|
|
152
|
+
const checks = await validateFileSizes(tempDir, DEFAULT_LINE_LIMITS);
|
|
153
|
+
const nextTasksCheck = checks.find((c) => c.file === 'NEXT-TASKS.md');
|
|
154
|
+
expect(nextTasksCheck?.passed).toBe(true);
|
|
155
|
+
expect(nextTasksCheck?.details).toContain('100/200');
|
|
156
|
+
});
|
|
157
|
+
it('should fail when file exceeds limit', async () => {
|
|
158
|
+
await createFileWithLines(tempDir, 'NEXT-TASKS.md', 300);
|
|
159
|
+
const checks = await validateFileSizes(tempDir, DEFAULT_LINE_LIMITS);
|
|
160
|
+
const nextTasksCheck = checks.find((c) => c.file === 'NEXT-TASKS.md');
|
|
161
|
+
expect(nextTasksCheck?.passed).toBe(false);
|
|
162
|
+
expect(nextTasksCheck?.level).toBe('warning');
|
|
163
|
+
expect(nextTasksCheck?.details).toContain('Overage: 100');
|
|
164
|
+
});
|
|
165
|
+
it('should skip files that do not exist', async () => {
|
|
166
|
+
const checks = await validateFileSizes(tempDir, DEFAULT_LINE_LIMITS);
|
|
167
|
+
expect(checks.length).toBe(0);
|
|
168
|
+
});
|
|
169
|
+
});
|
|
170
|
+
describe('Validate Command - Strict Mode', () => {
|
|
171
|
+
let tempDir;
|
|
172
|
+
beforeEach(async () => {
|
|
173
|
+
tempDir = await createTempDir();
|
|
174
|
+
});
|
|
175
|
+
afterEach(async () => {
|
|
176
|
+
await cleanupTempDir(tempDir);
|
|
177
|
+
});
|
|
178
|
+
it('should pass in normal mode with warnings', async () => {
|
|
179
|
+
await createMinimalProject(tempDir);
|
|
180
|
+
await createFileWithLines(tempDir, 'NEXT-TASKS.md', 250);
|
|
181
|
+
const result = await validateProject(tempDir, { strict: false });
|
|
182
|
+
expect(result.passed).toBe(true);
|
|
183
|
+
expect(result.summary.warnings).toBeGreaterThan(0);
|
|
184
|
+
});
|
|
185
|
+
it('should fail in strict mode with warnings', async () => {
|
|
186
|
+
await createMinimalProject(tempDir);
|
|
187
|
+
await createFileWithLines(tempDir, 'NEXT-TASKS.md', 250);
|
|
188
|
+
const result = await validateProject(tempDir, { strict: true });
|
|
189
|
+
expect(result.passed).toBe(false);
|
|
190
|
+
expect(result.summary.warnings).toBeGreaterThan(0);
|
|
191
|
+
});
|
|
192
|
+
it('should fail in both modes with errors', async () => {
|
|
193
|
+
await writeFile(join(tempDir, 'NEXT-TASKS.md'), '# NEXT: Upcoming Tasks\n');
|
|
194
|
+
await mkdir(join(tempDir, '.github'), { recursive: true });
|
|
195
|
+
await writeFile(join(tempDir, '.github/copilot-instructions.md'), '# Instructions\n');
|
|
196
|
+
const normalResult = await validateProject(tempDir, { strict: false });
|
|
197
|
+
const strictResult = await validateProject(tempDir, { strict: true });
|
|
198
|
+
const claudeCheck = normalResult.checks.find((c) => c.file === 'CLAUDE.md');
|
|
199
|
+
expect(claudeCheck).toBeDefined();
|
|
200
|
+
expect(claudeCheck?.passed).toBe(false);
|
|
201
|
+
expect(claudeCheck?.level).toBe('error');
|
|
202
|
+
expect(normalResult.summary.errors).toBeGreaterThan(0);
|
|
203
|
+
expect(normalResult.passed).toBe(false);
|
|
204
|
+
expect(strictResult.passed).toBe(false);
|
|
205
|
+
});
|
|
206
|
+
});
|
|
207
|
+
//# sourceMappingURL=validate.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.test.js","sourceRoot":"","sources":["../../src/__tests__/validate.test.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from 'commander';
|
|
3
|
+
import { readFileSync } from 'fs';
|
|
4
|
+
import { fileURLToPath } from 'url';
|
|
5
|
+
import { dirname, join } from 'path';
|
|
6
|
+
import chalk from 'chalk';
|
|
7
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
8
|
+
const __dirname = dirname(__filename);
|
|
9
|
+
const packageJson = JSON.parse(readFileSync(join(__dirname, '../package.json'), 'utf-8'));
|
|
10
|
+
const program = new Command();
|
|
11
|
+
program
|
|
12
|
+
.name('cortex-tms')
|
|
13
|
+
.description(chalk.bold('š§ Cortex TMS') +
|
|
14
|
+
'\n' +
|
|
15
|
+
chalk.gray('The Universal AI-Optimized Project Boilerplate\n') +
|
|
16
|
+
chalk.gray('Initialize your project with TMS documentation structure'))
|
|
17
|
+
.version(packageJson.version, '-v, --version', 'Output the current version')
|
|
18
|
+
.helpOption('-h, --help', 'Display help for command');
|
|
19
|
+
import { initCommand } from './commands/init.js';
|
|
20
|
+
import { validateCommand } from './commands/validate.js';
|
|
21
|
+
program.addCommand(initCommand);
|
|
22
|
+
program.addCommand(validateCommand);
|
|
23
|
+
program.on('command:*', () => {
|
|
24
|
+
console.error(chalk.red('\nā Invalid command:'), chalk.bold(program.args.join(' ')));
|
|
25
|
+
console.log(chalk.gray('\nRun'), chalk.cyan('cortex-tms --help'), chalk.gray('to see available commands.'));
|
|
26
|
+
process.exit(1);
|
|
27
|
+
});
|
|
28
|
+
program.parse(process.argv);
|
|
29
|
+
if (!process.argv.slice(2).length) {
|
|
30
|
+
program.outputHelp();
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AASA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAGtC,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAC5B,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,EAAE,OAAO,CAAC,CAC1D,CAAC;AAEF,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAG9B,OAAO;KACJ,IAAI,CAAC,YAAY,CAAC;KAClB,WAAW,CACV,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC;IACzB,IAAI;IACJ,KAAK,CAAC,IAAI,CAAC,kDAAkD,CAAC;IAC9D,KAAK,CAAC,IAAI,CAAC,0DAA0D,CAAC,CACzE;KACA,OAAO,CAAC,WAAW,CAAC,OAAO,EAAE,eAAe,EAAE,4BAA4B,CAAC;KAC3E,UAAU,CAAC,YAAY,EAAE,0BAA0B,CAAC,CAAC;AAGxD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;AAGpC,OAAO,CAAC,EAAE,CAAC,WAAW,EAAE,GAAG,EAAE;IAC3B,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CAAC,sBAAsB,CAAC,EACjC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CACnC,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC,CAAC;IAC5G,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAGH,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAG5B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAClC,OAAO,CAAC,UAAU,EAAE,CAAC;AACvB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAqBpC,wBAAgB,iBAAiB,IAAI,OAAO,CAa3C;AA6KD,eAAO,MAAM,WAAW,SAAsB,CAAC"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import ora from 'ora';
|
|
4
|
+
import { basename } from 'path';
|
|
5
|
+
import { detectContext, isSafeToInitialize } from '../utils/detection.js';
|
|
6
|
+
import { runInitPrompts, showInitSummary, confirmInit, } from '../utils/prompts.js';
|
|
7
|
+
import { getTemplatesDir, copyTemplates, generateReplacements, } from '../utils/templates.js';
|
|
8
|
+
import { createConfigFromScope, saveConfig } from '../utils/config.js';
|
|
9
|
+
export function createInitCommand() {
|
|
10
|
+
const initCommand = new Command('init');
|
|
11
|
+
initCommand
|
|
12
|
+
.description('Initialize Cortex TMS in your project')
|
|
13
|
+
.option('-f, --force', 'Skip confirmation prompts and overwrite existing files')
|
|
14
|
+
.option('-m, --minimal', 'Install minimal template set only')
|
|
15
|
+
.option('-v, --verbose', 'Show detailed output')
|
|
16
|
+
.action(async (options) => {
|
|
17
|
+
await runInit(options);
|
|
18
|
+
});
|
|
19
|
+
return initCommand;
|
|
20
|
+
}
|
|
21
|
+
async function runInit(options) {
|
|
22
|
+
const cwd = process.cwd();
|
|
23
|
+
console.log(chalk.bold.cyan('\nš§ Cortex TMS Initialization\n'));
|
|
24
|
+
const spinner = ora('Detecting project context...').start();
|
|
25
|
+
const context = detectContext(cwd);
|
|
26
|
+
spinner.succeed('Project context detected');
|
|
27
|
+
if (options.verbose) {
|
|
28
|
+
console.log(chalk.gray('\nProject Context:'));
|
|
29
|
+
console.log(chalk.gray(` Git repository: ${context.isGitRepo ? 'Yes' : 'No'}`));
|
|
30
|
+
console.log(chalk.gray(` Package.json: ${context.hasPackageJson ? 'Yes' : 'No'}`));
|
|
31
|
+
console.log(chalk.gray(` Package manager: ${context.packageManager !== 'unknown' ? context.packageManager : 'Unknown'}`));
|
|
32
|
+
console.log(chalk.gray(` Existing TMS files: ${context.existingFiles.length > 0 ? context.existingFiles.join(', ') : 'None'}`));
|
|
33
|
+
console.log();
|
|
34
|
+
}
|
|
35
|
+
if (!isSafeToInitialize(context) && !options.force) {
|
|
36
|
+
console.log(chalk.yellow(`\nā ļø Warning: ${context.existingFiles.length} TMS file(s) already exist:`));
|
|
37
|
+
context.existingFiles.forEach((file) => {
|
|
38
|
+
console.log(chalk.yellow(` - ${file}`));
|
|
39
|
+
});
|
|
40
|
+
console.log(chalk.gray('\nUse --force to overwrite, or remove existing files first.\n'));
|
|
41
|
+
}
|
|
42
|
+
let answers;
|
|
43
|
+
if (options.force) {
|
|
44
|
+
const defaultName = basename(cwd)
|
|
45
|
+
.toLowerCase()
|
|
46
|
+
.replace(/[^a-z0-9-]/g, '-')
|
|
47
|
+
.replace(/-+/g, '-')
|
|
48
|
+
.replace(/^-|-$/g, '');
|
|
49
|
+
answers = {
|
|
50
|
+
projectName: defaultName,
|
|
51
|
+
scope: (options.minimal ? 'nano' : 'standard'),
|
|
52
|
+
overwrite: true,
|
|
53
|
+
};
|
|
54
|
+
if (options.verbose) {
|
|
55
|
+
console.log(chalk.gray('\nUsing default values (--force enabled):'));
|
|
56
|
+
console.log(chalk.gray(` Project Name: ${answers.projectName}`));
|
|
57
|
+
console.log(chalk.gray(` Scope: ${answers.scope}`));
|
|
58
|
+
console.log();
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
answers = await runInitPrompts(context, cwd);
|
|
63
|
+
}
|
|
64
|
+
if (!options.force) {
|
|
65
|
+
showInitSummary(answers, context);
|
|
66
|
+
const confirmed = await confirmInit();
|
|
67
|
+
if (!confirmed) {
|
|
68
|
+
console.log(chalk.gray('\nInitialization cancelled.\n'));
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
const replacements = generateReplacements(answers.projectName, answers.description);
|
|
73
|
+
if (options.verbose) {
|
|
74
|
+
console.log(chalk.gray('\nPlaceholder Replacements:'));
|
|
75
|
+
Object.entries(replacements).forEach(([key, value]) => {
|
|
76
|
+
console.log(chalk.gray(` [${key}] ā ${value}`));
|
|
77
|
+
});
|
|
78
|
+
console.log();
|
|
79
|
+
}
|
|
80
|
+
const copySpinner = ora('Copying templates...').start();
|
|
81
|
+
try {
|
|
82
|
+
const templatesDir = getTemplatesDir();
|
|
83
|
+
const overwrite = options.force || answers.overwrite;
|
|
84
|
+
const result = await copyTemplates(templatesDir, cwd, replacements, {
|
|
85
|
+
overwrite,
|
|
86
|
+
scope: answers.scope,
|
|
87
|
+
});
|
|
88
|
+
copySpinner.succeed(`Templates copied: ${chalk.bold(result.copied)} files${result.skipped > 0 ? chalk.gray(` (skipped ${result.skipped})`) : ''}`);
|
|
89
|
+
const configSpinner = ora('Creating .cortexrc configuration...').start();
|
|
90
|
+
try {
|
|
91
|
+
const config = createConfigFromScope(answers.scope, answers.projectName);
|
|
92
|
+
await saveConfig(cwd, config);
|
|
93
|
+
configSpinner.succeed('Configuration saved');
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
configSpinner.fail('Failed to save configuration');
|
|
97
|
+
throw error;
|
|
98
|
+
}
|
|
99
|
+
console.log(chalk.green.bold('\n⨠Success!'), chalk.gray('Cortex TMS initialized.\n'));
|
|
100
|
+
console.log(chalk.bold('Next Steps:'));
|
|
101
|
+
console.log(chalk.gray(' 1. Review'), chalk.cyan('NEXT-TASKS.md'), chalk.gray('for active sprint tasks'));
|
|
102
|
+
console.log(chalk.gray(' 2. Update'), chalk.cyan('docs/core/'), chalk.gray('with your project details'));
|
|
103
|
+
console.log(chalk.gray(' 3. Customize'), chalk.cyan('.github/copilot-instructions.md'), chalk.gray('for AI rules'));
|
|
104
|
+
if (!context.isGitRepo) {
|
|
105
|
+
console.log(chalk.gray('\n š” Tip: Initialize git with'), chalk.cyan('git init'), chalk.gray('to track changes'));
|
|
106
|
+
}
|
|
107
|
+
console.log(chalk.gray('\nš Learn more:'), chalk.underline('https://github.com/yourusername/cortex-tms'));
|
|
108
|
+
console.log();
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
copySpinner.fail('Failed to copy templates');
|
|
112
|
+
console.error(chalk.red('\nā Error:'), error instanceof Error ? error.message : 'Unknown error');
|
|
113
|
+
if (options.verbose && error instanceof Error && error.stack) {
|
|
114
|
+
console.error(chalk.gray('\nStack trace:'));
|
|
115
|
+
console.error(chalk.gray(error.stack));
|
|
116
|
+
}
|
|
117
|
+
process.exit(1);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
export const initCommand = createInitCommand();
|
|
121
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA6DpC,wBAAgB,qBAAqB,IAAI,OAAO,CAa/C;AAqLD,eAAO,MAAM,eAAe,SAA0B,CAAC"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import ora from 'ora';
|
|
4
|
+
import { validateProject } from '../utils/validator.js';
|
|
5
|
+
function getCheckEmoji(level, passed) {
|
|
6
|
+
if (passed) {
|
|
7
|
+
return chalk.green('ā');
|
|
8
|
+
}
|
|
9
|
+
if (level === 'error') {
|
|
10
|
+
return chalk.red('ā');
|
|
11
|
+
}
|
|
12
|
+
return chalk.yellow('ā ');
|
|
13
|
+
}
|
|
14
|
+
function getColorForLevel(level) {
|
|
15
|
+
switch (level) {
|
|
16
|
+
case 'error':
|
|
17
|
+
return chalk.red;
|
|
18
|
+
case 'warning':
|
|
19
|
+
return chalk.yellow;
|
|
20
|
+
case 'info':
|
|
21
|
+
return chalk.gray;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
function formatCheck(check, verbose) {
|
|
25
|
+
const emoji = getCheckEmoji(check.level, check.passed);
|
|
26
|
+
const color = getColorForLevel(check.level);
|
|
27
|
+
let output = ` ${emoji} ${color(check.message)}`;
|
|
28
|
+
if (verbose && check.details) {
|
|
29
|
+
output += `\n ${chalk.gray(check.details)}`;
|
|
30
|
+
}
|
|
31
|
+
return output;
|
|
32
|
+
}
|
|
33
|
+
export function createValidateCommand() {
|
|
34
|
+
const validateCommand = new Command('validate');
|
|
35
|
+
validateCommand
|
|
36
|
+
.description('Validate TMS project health and compliance')
|
|
37
|
+
.option('-s, --strict', 'Treat warnings as errors')
|
|
38
|
+
.option('-v, --verbose', 'Show detailed check information')
|
|
39
|
+
.option('-f, --fix', 'Auto-fix issues where possible (future feature)')
|
|
40
|
+
.action(async (options) => {
|
|
41
|
+
await runValidate(options);
|
|
42
|
+
});
|
|
43
|
+
return validateCommand;
|
|
44
|
+
}
|
|
45
|
+
async function runValidate(options) {
|
|
46
|
+
const cwd = process.cwd();
|
|
47
|
+
console.log(chalk.bold.cyan('\nš Cortex TMS Validation\n'));
|
|
48
|
+
const spinner = ora('Running health checks...').start();
|
|
49
|
+
try {
|
|
50
|
+
const result = await validateProject(cwd, {
|
|
51
|
+
strict: options.strict || false,
|
|
52
|
+
});
|
|
53
|
+
spinner.stop();
|
|
54
|
+
const mandatoryChecks = result.checks.filter((c) => c.name.startsWith('Mandatory File'));
|
|
55
|
+
const fileSizeChecks = result.checks.filter((c) => c.name.startsWith('File Size'));
|
|
56
|
+
const placeholderChecks = result.checks.filter((c) => c.name.startsWith('Placeholders'));
|
|
57
|
+
const archiveChecks = result.checks.filter((c) => c.name === 'Archive Status' || c.name === 'Archive Directory');
|
|
58
|
+
if (mandatoryChecks.length > 0) {
|
|
59
|
+
console.log(chalk.bold('\nš Mandatory Files'));
|
|
60
|
+
mandatoryChecks.forEach((check) => {
|
|
61
|
+
console.log(formatCheck(check, options.verbose || false));
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
if (fileSizeChecks.length > 0 && options.verbose) {
|
|
65
|
+
console.log(chalk.bold('\nš File Size Limits (Rule 4)'));
|
|
66
|
+
fileSizeChecks.forEach((check) => {
|
|
67
|
+
console.log(formatCheck(check, options.verbose || false));
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
else if (fileSizeChecks.some((c) => !c.passed)) {
|
|
71
|
+
console.log(chalk.bold('\nš File Size Limits (Rule 4)'));
|
|
72
|
+
fileSizeChecks
|
|
73
|
+
.filter((c) => !c.passed)
|
|
74
|
+
.forEach((check) => {
|
|
75
|
+
console.log(formatCheck(check, options.verbose || false));
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
if (placeholderChecks.length > 0 && options.verbose) {
|
|
79
|
+
console.log(chalk.bold('\nš§ Placeholder Completion'));
|
|
80
|
+
placeholderChecks.forEach((check) => {
|
|
81
|
+
console.log(formatCheck(check, options.verbose || false));
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
else if (placeholderChecks.some((c) => !c.passed)) {
|
|
85
|
+
console.log(chalk.bold('\nš§ Placeholder Completion'));
|
|
86
|
+
placeholderChecks
|
|
87
|
+
.filter((c) => !c.passed)
|
|
88
|
+
.forEach((check) => {
|
|
89
|
+
console.log(formatCheck(check, options.verbose || false));
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
if (archiveChecks.length > 0) {
|
|
93
|
+
console.log(chalk.bold('\nš¦ Archive Status'));
|
|
94
|
+
archiveChecks.forEach((check) => {
|
|
95
|
+
console.log(formatCheck(check, options.verbose || false));
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
console.log(chalk.bold('\nš Summary\n'));
|
|
99
|
+
const { summary } = result;
|
|
100
|
+
console.log(` Total Checks: ${chalk.bold(summary.total)}`);
|
|
101
|
+
console.log(` ${chalk.green('ā')} Passed: ${chalk.bold(summary.passed)}`);
|
|
102
|
+
if (summary.warnings > 0) {
|
|
103
|
+
console.log(` ${chalk.yellow('ā ')} Warnings: ${chalk.bold(summary.warnings)}`);
|
|
104
|
+
}
|
|
105
|
+
if (summary.errors > 0) {
|
|
106
|
+
console.log(` ${chalk.red('ā')} Errors: ${chalk.bold(summary.errors)}`);
|
|
107
|
+
}
|
|
108
|
+
console.log();
|
|
109
|
+
if (result.passed) {
|
|
110
|
+
console.log(chalk.green.bold('⨠Validation passed!'), chalk.gray('Your TMS project is healthy.'));
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
if (options.strict && summary.warnings > 0) {
|
|
114
|
+
console.log(chalk.red.bold('ā Validation failed!'), chalk.gray('(Strict mode: warnings treated as errors)'));
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
console.log(chalk.red.bold('ā Validation failed!'), chalk.gray('Please fix the errors above.'));
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
if (summary.errors > 0 || summary.warnings > 0) {
|
|
121
|
+
console.log(chalk.bold('\nš” Tips:\n'));
|
|
122
|
+
if (result.checks.some((c) => c.message.includes('missing'))) {
|
|
123
|
+
console.log(chalk.gray(' ⢠Run'), chalk.cyan('cortex-tms init'), chalk.gray('to create missing files'));
|
|
124
|
+
}
|
|
125
|
+
if (result.checks.some((c) => c.message.includes('placeholders'))) {
|
|
126
|
+
console.log(chalk.gray(' ⢠Replace [Placeholders] with actual values'));
|
|
127
|
+
}
|
|
128
|
+
if (result.checks.some((c) => c.message.includes('exceeds'))) {
|
|
129
|
+
console.log(chalk.gray(' ⢠Archive completed tasks to reduce file size'));
|
|
130
|
+
console.log(chalk.gray(' ⢠Move to'), chalk.cyan('docs/archive/'), chalk.gray('for historical reference'));
|
|
131
|
+
}
|
|
132
|
+
if (result.checks.some((c) => c.message.includes('completed tasks'))) {
|
|
133
|
+
console.log(chalk.gray(' ⢠Archive completed tasks from NEXT-TASKS.md'));
|
|
134
|
+
console.log(chalk.gray(' ⢠Create'), chalk.cyan('docs/archive/sprint-YYYY-MM.md'), chalk.gray('if needed'));
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
console.log();
|
|
138
|
+
process.exit(result.passed ? 0 : 1);
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
spinner.fail('Validation failed');
|
|
142
|
+
console.error(chalk.red('\nā Error:'), error instanceof Error ? error.message : 'Unknown error');
|
|
143
|
+
if (options.verbose && error instanceof Error && error.stack) {
|
|
144
|
+
console.error(chalk.gray('\nStack trace:'));
|
|
145
|
+
console.error(chalk.gray(error.stack));
|
|
146
|
+
}
|
|
147
|
+
process.exit(1);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
export const validateCommand = createValidateCommand();
|
|
151
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"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"}
|