cortex-tms 2.2.0 → 2.4.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/README.md +2 -0
- package/dist/__tests__/init.test.js +4 -3
- package/dist/__tests__/init.test.js.map +1 -1
- package/dist/__tests__/validate.test.js +2 -0
- package/dist/__tests__/validate.test.js.map +1 -1
- package/dist/cli.js +6 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +96 -25
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/migrate.d.ts +12 -0
- package/dist/commands/migrate.d.ts.map +1 -0
- package/dist/commands/migrate.js +183 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/commands/prompt.d.ts +4 -0
- package/dist/commands/prompt.d.ts.map +1 -0
- package/dist/commands/prompt.js +95 -0
- package/dist/commands/prompt.js.map +1 -0
- package/dist/commands/status.d.ts +4 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +99 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/validate.d.ts.map +1 -1
- package/dist/commands/validate.js +39 -0
- package/dist/commands/validate.js.map +1 -1
- package/dist/types/cli.d.ts +5 -0
- package/dist/types/cli.d.ts.map +1 -1
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js +2 -0
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/prompt-parser.d.ts +9 -0
- package/dist/utils/prompt-parser.d.ts.map +1 -0
- package/dist/utils/prompt-parser.js +50 -0
- package/dist/utils/prompt-parser.js.map +1 -0
- package/dist/utils/prompts.d.ts.map +1 -1
- package/dist/utils/prompts.js +15 -0
- package/dist/utils/prompts.js.map +1 -1
- package/dist/utils/status.d.ts +21 -0
- package/dist/utils/status.d.ts.map +1 -0
- package/dist/utils/status.js +86 -0
- package/dist/utils/status.js.map +1 -0
- package/dist/utils/templates.d.ts +14 -1
- package/dist/utils/templates.d.ts.map +1 -1
- package/dist/utils/templates.js +122 -9
- package/dist/utils/templates.js.map +1 -1
- package/dist/utils/validator.d.ts +1 -0
- package/dist/utils/validator.d.ts.map +1 -1
- package/dist/utils/validator.js +54 -3
- package/dist/utils/validator.js.map +1 -1
- package/package.json +2 -1
- package/templates/.github/copilot-instructions.md +2 -0
- package/templates/CLAUDE.md +2 -0
- package/templates/FUTURE-ENHANCEMENTS.md +2 -0
- package/templates/NEXT-TASKS.md +2 -0
- package/templates/PROMPTS.md +55 -0
- package/templates/README.md +2 -0
- package/templates/docs/archive/v1.0-CHANGELOG.md +3 -0
- package/templates/docs/core/ARCHITECTURE.md +2 -0
- package/templates/docs/core/DECISIONS.md +2 -0
- package/templates/docs/core/DOMAIN-LOGIC.md +2 -0
- package/templates/docs/core/GLOSSARY.md +2 -0
- package/templates/docs/core/PATTERNS.md +2 -0
- package/templates/docs/core/SCHEMA.md +2 -0
- package/templates/docs/core/TROUBLESHOOTING.md +2 -0
- package/templates/vscode/tms.code-snippets +225 -0
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { readFile } from 'fs/promises';
|
|
2
|
+
import { existsSync } from 'fs';
|
|
3
|
+
import { join } from 'path';
|
|
4
|
+
import { loadConfig } from './config.js';
|
|
5
|
+
export function parseSprintInfo(content) {
|
|
6
|
+
const sprintMatch = content.match(/##\s+Active Sprint:\s*(.+?)(?:\n|$)/i);
|
|
7
|
+
if (!sprintMatch) {
|
|
8
|
+
return null;
|
|
9
|
+
}
|
|
10
|
+
const sprintName = sprintMatch[1]?.trim() || '';
|
|
11
|
+
const descMatch = content.match(/\*\*Why this matters\*\*:\s*(.+?)(?:\n|$)/i);
|
|
12
|
+
const description = descMatch?.[1]?.trim() || '';
|
|
13
|
+
const taskLines = content.match(/\|[^|]*\|[^|]*\|[^|]*\|[^|]*\|[^|]*\|/g) || [];
|
|
14
|
+
const dataRows = taskLines.filter((line) => !line.includes('Task') && !line.includes('---'));
|
|
15
|
+
let completedTasks = 0;
|
|
16
|
+
let inProgressTasks = 0;
|
|
17
|
+
let todoTasks = 0;
|
|
18
|
+
for (const row of dataRows) {
|
|
19
|
+
if (row.includes('✅ Done')) {
|
|
20
|
+
completedTasks++;
|
|
21
|
+
}
|
|
22
|
+
else if (row.includes('🔄 In Progress')) {
|
|
23
|
+
inProgressTasks++;
|
|
24
|
+
}
|
|
25
|
+
else if (row.includes('⬜ Todo')) {
|
|
26
|
+
todoTasks++;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
const totalTasks = completedTasks + inProgressTasks + todoTasks;
|
|
30
|
+
return {
|
|
31
|
+
name: sprintName,
|
|
32
|
+
description,
|
|
33
|
+
totalTasks,
|
|
34
|
+
completedTasks,
|
|
35
|
+
inProgressTasks,
|
|
36
|
+
todoTasks,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
export function countBacklogItems(content) {
|
|
40
|
+
const itemMatches = content.match(/^- \*\*.+?\*\*:/gm) || [];
|
|
41
|
+
return itemMatches.length;
|
|
42
|
+
}
|
|
43
|
+
export function calculateProgress(sprint) {
|
|
44
|
+
if (sprint.totalTasks === 0) {
|
|
45
|
+
return 0;
|
|
46
|
+
}
|
|
47
|
+
return Math.round((sprint.completedTasks / sprint.totalTasks) * 100);
|
|
48
|
+
}
|
|
49
|
+
export async function getProjectStatus(cwd) {
|
|
50
|
+
let config = null;
|
|
51
|
+
try {
|
|
52
|
+
config = await loadConfig(cwd);
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
}
|
|
56
|
+
const projectName = config?.metadata?.projectName || 'Unknown Project';
|
|
57
|
+
const scope = config?.scope || 'unknown';
|
|
58
|
+
let sprint = null;
|
|
59
|
+
const tasksPath = join(cwd, 'NEXT-TASKS.md');
|
|
60
|
+
if (existsSync(tasksPath)) {
|
|
61
|
+
try {
|
|
62
|
+
const tasksContent = await readFile(tasksPath, 'utf-8');
|
|
63
|
+
sprint = parseSprintInfo(tasksContent);
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
let backlogSize = 0;
|
|
69
|
+
const backlogPath = join(cwd, 'FUTURE-ENHANCEMENTS.md');
|
|
70
|
+
if (existsSync(backlogPath)) {
|
|
71
|
+
try {
|
|
72
|
+
const backlogContent = await readFile(backlogPath, 'utf-8');
|
|
73
|
+
backlogSize = countBacklogItems(backlogContent);
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return {
|
|
79
|
+
projectName,
|
|
80
|
+
scope,
|
|
81
|
+
sprint,
|
|
82
|
+
backlogSize,
|
|
83
|
+
config,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/utils/status.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +1,28 @@
|
|
|
1
1
|
import type { TemplateFile } from '../types/cli.js';
|
|
2
|
+
export declare function getPackageVersion(): string;
|
|
3
|
+
export declare function injectVersionMetadata(content: string, version: string): string;
|
|
4
|
+
export declare function extractVersion(filePath: string): Promise<string | null>;
|
|
5
|
+
export type FileStatus = 'CREATE' | 'UPDATE' | 'SKIP' | 'CONFLICT';
|
|
6
|
+
export interface FileChange {
|
|
7
|
+
path: string;
|
|
8
|
+
status: FileStatus;
|
|
9
|
+
reason?: string;
|
|
10
|
+
}
|
|
2
11
|
export declare function getTemplatesDir(): string;
|
|
3
12
|
export declare function replacePlaceholders(content: string, replacements: Record<string, string>): string;
|
|
4
|
-
export declare function processTemplate(sourcePath: string, destPath: string, replacements: Record<string, string
|
|
13
|
+
export declare function processTemplate(sourcePath: string, destPath: string, replacements: Record<string, string>, options?: {
|
|
14
|
+
injectVersion?: boolean;
|
|
15
|
+
}): Promise<void>;
|
|
5
16
|
export declare function getTemplateFiles(templatesDir: string): Promise<TemplateFile[]>;
|
|
6
17
|
export declare function copyTemplates(templatesDir: string, destDir: string, replacements: Record<string, string>, options?: {
|
|
7
18
|
overwrite?: boolean;
|
|
8
19
|
scope?: 'nano' | 'standard' | 'enterprise' | 'custom';
|
|
9
20
|
customFiles?: string[];
|
|
21
|
+
dryRun?: boolean;
|
|
10
22
|
}): Promise<{
|
|
11
23
|
copied: number;
|
|
12
24
|
skipped: number;
|
|
25
|
+
changes?: FileChange[];
|
|
13
26
|
}>;
|
|
14
27
|
export declare function generateReplacements(projectName: string, description?: string): Record<string, string>;
|
|
15
28
|
//# sourceMappingURL=templates.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/utils/templates.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/utils/templates.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AASpD,wBAAgB,iBAAiB,IAAI,MAAM,CAI1C;AAYD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAM9E;AAWD,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAS7E;AAKD,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;AAKnE,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,UAAU,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAKD,wBAAgB,eAAe,IAAI,MAAM,CAGxC;AAcD,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACnC,MAAM,CAUR;AAUD,wBAAsB,eAAe,CACnC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACpC,OAAO,GAAE;IAAE,aAAa,CAAC,EAAE,OAAO,CAAA;CAAO,GACxC,OAAO,CAAC,IAAI,CAAC,CAoBf;AAQD,wBAAsB,gBAAgB,CACpC,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,YAAY,EAAE,CAAC,CA2CzB;AAUD,wBAAsB,aAAa,CACjC,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACpC,OAAO,GAAE;IACP,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,YAAY,GAAG,QAAQ,CAAC;IACtD,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,MAAM,CAAC,EAAE,OAAO,CAAC;CACb,GACL,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,UAAU,EAAE,CAAA;CAAE,CAAC,CAwGtE;AAgFD,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,MAAM,EACnB,WAAW,CAAC,EAAE,MAAM,GACnB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAaxB"}
|
package/dist/utils/templates.js
CHANGED
|
@@ -2,9 +2,29 @@ import fs from 'fs-extra';
|
|
|
2
2
|
import { join, relative } from 'path';
|
|
3
3
|
import { fileURLToPath } from 'url';
|
|
4
4
|
import { dirname } from 'path';
|
|
5
|
+
import chalk from 'chalk';
|
|
5
6
|
import { getScopePreset } from './config.js';
|
|
6
7
|
const __filename = fileURLToPath(import.meta.url);
|
|
7
8
|
const __dirname = dirname(__filename);
|
|
9
|
+
export function getPackageVersion() {
|
|
10
|
+
const packageJsonPath = join(__dirname, '../../package.json');
|
|
11
|
+
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));
|
|
12
|
+
return packageJson.version;
|
|
13
|
+
}
|
|
14
|
+
export function injectVersionMetadata(content, version) {
|
|
15
|
+
const normalizedContent = content.endsWith('\n') ? content : content + '\n';
|
|
16
|
+
return `${normalizedContent}\n<!-- @cortex-tms-version ${version} -->\n`;
|
|
17
|
+
}
|
|
18
|
+
export async function extractVersion(filePath) {
|
|
19
|
+
try {
|
|
20
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
21
|
+
const match = content.match(/<!-- @cortex-tms-version ([\d.]+) -->/);
|
|
22
|
+
return match?.[1] ?? null;
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
8
28
|
export function getTemplatesDir() {
|
|
9
29
|
return join(__dirname, '../../templates');
|
|
10
30
|
}
|
|
@@ -16,9 +36,14 @@ export function replacePlaceholders(content, replacements) {
|
|
|
16
36
|
});
|
|
17
37
|
return result;
|
|
18
38
|
}
|
|
19
|
-
export async function processTemplate(sourcePath, destPath, replacements) {
|
|
39
|
+
export async function processTemplate(sourcePath, destPath, replacements, options = {}) {
|
|
40
|
+
const { injectVersion = true } = options;
|
|
20
41
|
const content = await fs.readFile(sourcePath, 'utf-8');
|
|
21
|
-
|
|
42
|
+
let processed = replacePlaceholders(content, replacements);
|
|
43
|
+
if (injectVersion && destPath.endsWith('.md')) {
|
|
44
|
+
const version = getPackageVersion();
|
|
45
|
+
processed = injectVersionMetadata(processed, version);
|
|
46
|
+
}
|
|
22
47
|
await fs.ensureDir(dirname(destPath));
|
|
23
48
|
await fs.writeFile(destPath, processed, 'utf-8');
|
|
24
49
|
}
|
|
@@ -57,7 +82,7 @@ export async function getTemplateFiles(templatesDir) {
|
|
|
57
82
|
return files;
|
|
58
83
|
}
|
|
59
84
|
export async function copyTemplates(templatesDir, destDir, replacements, options = {}) {
|
|
60
|
-
const { overwrite = false, scope = 'standard', customFiles } = options;
|
|
85
|
+
const { overwrite = false, scope = 'standard', customFiles, dryRun = false } = options;
|
|
61
86
|
const allFiles = await getTemplateFiles(templatesDir);
|
|
62
87
|
let allowedFiles;
|
|
63
88
|
if (scope === 'custom' && customFiles) {
|
|
@@ -78,16 +103,104 @@ export async function copyTemplates(templatesDir, destDir, replacements, options
|
|
|
78
103
|
});
|
|
79
104
|
let copied = 0;
|
|
80
105
|
let skipped = 0;
|
|
106
|
+
const changes = [];
|
|
81
107
|
for (const file of filesToCopy) {
|
|
82
108
|
const destPath = join(destDir, file.destination);
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
109
|
+
const exists = await fs.pathExists(destPath);
|
|
110
|
+
if (dryRun) {
|
|
111
|
+
if (!exists) {
|
|
112
|
+
changes.push({
|
|
113
|
+
path: file.destination,
|
|
114
|
+
status: 'CREATE',
|
|
115
|
+
});
|
|
116
|
+
copied++;
|
|
117
|
+
}
|
|
118
|
+
else if (overwrite) {
|
|
119
|
+
const existingContent = await fs.readFile(destPath, 'utf-8');
|
|
120
|
+
const templateContent = await fs.readFile(file.source, 'utf-8');
|
|
121
|
+
let processedContent = replacePlaceholders(templateContent, replacements);
|
|
122
|
+
if (destPath.endsWith('.md')) {
|
|
123
|
+
const version = getPackageVersion();
|
|
124
|
+
processedContent = injectVersionMetadata(processedContent, version);
|
|
125
|
+
}
|
|
126
|
+
if (existingContent !== processedContent) {
|
|
127
|
+
changes.push({
|
|
128
|
+
path: file.destination,
|
|
129
|
+
status: 'UPDATE',
|
|
130
|
+
reason: 'Content differs from template',
|
|
131
|
+
});
|
|
132
|
+
copied++;
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
changes.push({
|
|
136
|
+
path: file.destination,
|
|
137
|
+
status: 'SKIP',
|
|
138
|
+
reason: 'Already up to date',
|
|
139
|
+
});
|
|
140
|
+
skipped++;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
changes.push({
|
|
145
|
+
path: file.destination,
|
|
146
|
+
status: 'CONFLICT',
|
|
147
|
+
reason: 'File exists (use --force to overwrite)',
|
|
148
|
+
});
|
|
149
|
+
skipped++;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
if (!overwrite && exists) {
|
|
154
|
+
skipped++;
|
|
155
|
+
continue;
|
|
156
|
+
}
|
|
157
|
+
await processTemplate(file.source, destPath, replacements);
|
|
158
|
+
copied++;
|
|
86
159
|
}
|
|
87
|
-
await processTemplate(file.source, destPath, replacements);
|
|
88
|
-
copied++;
|
|
89
160
|
}
|
|
90
|
-
|
|
161
|
+
if (dryRun && changes.length > 0) {
|
|
162
|
+
printImpactReport(changes);
|
|
163
|
+
}
|
|
164
|
+
return { copied, skipped, ...(dryRun && { changes }) };
|
|
165
|
+
}
|
|
166
|
+
function printImpactReport(changes) {
|
|
167
|
+
console.log(chalk.bold('\n📋 IMPACT ANALYSIS:\n'));
|
|
168
|
+
const byStatus = {
|
|
169
|
+
CREATE: [],
|
|
170
|
+
UPDATE: [],
|
|
171
|
+
SKIP: [],
|
|
172
|
+
CONFLICT: [],
|
|
173
|
+
};
|
|
174
|
+
changes.forEach((change) => {
|
|
175
|
+
byStatus[change.status].push(change);
|
|
176
|
+
});
|
|
177
|
+
const statusConfig = {
|
|
178
|
+
CREATE: { icon: '✨', color: chalk.green, label: 'CREATE' },
|
|
179
|
+
UPDATE: { icon: '🔄', color: chalk.blue, label: 'UPDATE' },
|
|
180
|
+
CONFLICT: { icon: '⚠️ ', color: chalk.yellow, label: 'CONFLICT' },
|
|
181
|
+
SKIP: { icon: '⏭️ ', color: chalk.gray, label: 'SKIP' },
|
|
182
|
+
};
|
|
183
|
+
for (const status of ['CREATE', 'UPDATE', 'CONFLICT', 'SKIP']) {
|
|
184
|
+
const items = byStatus[status];
|
|
185
|
+
if (items.length === 0)
|
|
186
|
+
continue;
|
|
187
|
+
const config = statusConfig[status];
|
|
188
|
+
console.log(config.color.bold(`${config.icon} ${config.label} (${items.length}):`));
|
|
189
|
+
items.forEach((item) => {
|
|
190
|
+
const reasonText = item.reason ? chalk.gray(` - ${item.reason}`) : '';
|
|
191
|
+
console.log(` ${config.color(item.path)}${reasonText}`);
|
|
192
|
+
});
|
|
193
|
+
console.log();
|
|
194
|
+
}
|
|
195
|
+
const conflicts = byStatus.CONFLICT.length;
|
|
196
|
+
const updates = byStatus.UPDATE.length;
|
|
197
|
+
if (conflicts > 0) {
|
|
198
|
+
console.log(chalk.yellow.bold('⚠️ WARNING:'), chalk.yellow(`${conflicts} file(s) will be skipped due to conflicts. Use --force to overwrite.`));
|
|
199
|
+
}
|
|
200
|
+
if (updates > 0) {
|
|
201
|
+
console.log(chalk.blue.bold('ℹ️ INFO:'), chalk.blue(`${updates} file(s) will be updated with new template content. Review changes carefully.`));
|
|
202
|
+
}
|
|
203
|
+
console.log(chalk.gray('\n💡 Tip: Run without --dry-run to apply these changes.'));
|
|
91
204
|
}
|
|
92
205
|
export function generateReplacements(projectName, description) {
|
|
93
206
|
const kebabName = projectName
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/utils/templates.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/utils/templates.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,7 @@ export declare const DEFAULT_LINE_LIMITS: LineLimits;
|
|
|
3
3
|
export declare const MANDATORY_FILES: MandatoryFile[];
|
|
4
4
|
export declare function validateFileSizes(cwd: string, limits?: LineLimits): Promise<ValidationCheck[]>;
|
|
5
5
|
export declare function validateMandatoryFiles(cwd: string): ValidationCheck[];
|
|
6
|
+
export declare function validateConfig(cwd: string): ValidationCheck[];
|
|
6
7
|
export declare function validatePlaceholders(cwd: string, ignoreFiles?: string[]): Promise<ValidationCheck[]>;
|
|
7
8
|
export declare function validateArchiveStatus(cwd: string): Promise<ValidationCheck[]>;
|
|
8
9
|
export declare function validateProject(cwd: string, options?: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../src/utils/validator.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EACV,eAAe,EACf,gBAAgB,EAChB,UAAU,EACV,aAAa,EACd,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../src/utils/validator.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EACV,eAAe,EACf,gBAAgB,EAChB,UAAU,EACV,aAAa,EACd,MAAM,iBAAiB,CAAC;AAczB,eAAO,MAAM,mBAAmB,EAAE,UAUjC,CAAC;AAKF,eAAO,MAAM,eAAe,EAAE,aAAa,EAI1C,CAAC;AA8FF,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,MAAM,EACX,MAAM,GAAE,UAAgC,GACvC,OAAO,CAAC,eAAe,EAAE,CAAC,CAkC5B;AAKD,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,EAAE,CAuBrE;AA2BD,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,EAAE,CAkB7D;AAKD,wBAAsB,oBAAoB,CACxC,GAAG,EAAE,MAAM,EACX,WAAW,GAAE,MAAM,EAAO,GACzB,OAAO,CAAC,eAAe,EAAE,CAAC,CAiD5B;AAKD,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAoDnF;AAKD,wBAAsB,eAAe,CACnC,GAAG,EAAE,MAAM,EACX,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,UAAU,CAAA;CAAO,GACtD,OAAO,CAAC,gBAAgB,CAAC,CAiD3B"}
|
package/dist/utils/validator.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { readFile } from 'fs/promises';
|
|
2
2
|
import { existsSync } from 'fs';
|
|
3
|
-
import { join } from 'path';
|
|
4
|
-
import { loadConfig, mergeConfig, getEffectiveLineLimits, } from './config.js';
|
|
3
|
+
import { join, basename } from 'path';
|
|
4
|
+
import { loadConfig, mergeConfig, getEffectiveLineLimits, saveConfig, createConfigFromScope, } from './config.js';
|
|
5
|
+
import { getTemplatesDir, processTemplate } from './templates.js';
|
|
5
6
|
export const DEFAULT_LINE_LIMITS = {
|
|
6
7
|
'NEXT-TASKS.md': 200,
|
|
7
8
|
'FUTURE-ENHANCEMENTS.md': 500,
|
|
@@ -66,6 +67,18 @@ async function countCompletedTasks(filePath) {
|
|
|
66
67
|
function hasArchiveDirectory(cwd) {
|
|
67
68
|
return existsSync(join(cwd, 'docs/archive'));
|
|
68
69
|
}
|
|
70
|
+
async function fixMissingFile(cwd, file) {
|
|
71
|
+
const templatesDir = getTemplatesDir();
|
|
72
|
+
const sourcePath = join(templatesDir, file);
|
|
73
|
+
const destPath = join(cwd, file);
|
|
74
|
+
const projectName = basename(cwd);
|
|
75
|
+
const replacements = {
|
|
76
|
+
'Project Name': projectName,
|
|
77
|
+
'project-name': projectName.toLowerCase().replace(/[^a-z0-9-]/g, '-'),
|
|
78
|
+
Description: `A project powered by Cortex TMS`,
|
|
79
|
+
};
|
|
80
|
+
await processTemplate(sourcePath, destPath, replacements);
|
|
81
|
+
}
|
|
69
82
|
export async function validateFileSizes(cwd, limits = DEFAULT_LINE_LIMITS) {
|
|
70
83
|
const checks = [];
|
|
71
84
|
for (const [filename, limit] of Object.entries(limits)) {
|
|
@@ -110,10 +123,46 @@ export function validateMandatoryFiles(cwd) {
|
|
|
110
123
|
? `${file} exists`
|
|
111
124
|
: `${file} is missing (required for TMS)`,
|
|
112
125
|
file,
|
|
126
|
+
...(!exists && {
|
|
127
|
+
fix: async (cwd) => fixMissingFile(cwd, file),
|
|
128
|
+
}),
|
|
113
129
|
});
|
|
114
130
|
}
|
|
115
131
|
return checks;
|
|
116
132
|
}
|
|
133
|
+
async function fixMissingConfig(cwd) {
|
|
134
|
+
const hasGlossary = existsSync(join(cwd, 'docs/core/GLOSSARY.md'));
|
|
135
|
+
const hasSchema = existsSync(join(cwd, 'docs/core/SCHEMA.md'));
|
|
136
|
+
const hasArchitecture = existsSync(join(cwd, 'docs/core/ARCHITECTURE.md'));
|
|
137
|
+
let scope = 'standard';
|
|
138
|
+
if (hasGlossary || hasSchema) {
|
|
139
|
+
scope = 'enterprise';
|
|
140
|
+
}
|
|
141
|
+
else if (!hasArchitecture) {
|
|
142
|
+
scope = 'nano';
|
|
143
|
+
}
|
|
144
|
+
const projectName = basename(cwd);
|
|
145
|
+
const config = createConfigFromScope(scope, projectName);
|
|
146
|
+
await saveConfig(cwd, config);
|
|
147
|
+
}
|
|
148
|
+
export function validateConfig(cwd) {
|
|
149
|
+
const configPath = join(cwd, '.cortexrc');
|
|
150
|
+
const exists = existsSync(configPath);
|
|
151
|
+
return [
|
|
152
|
+
{
|
|
153
|
+
name: 'Configuration File',
|
|
154
|
+
passed: exists,
|
|
155
|
+
level: exists ? 'info' : 'error',
|
|
156
|
+
message: exists
|
|
157
|
+
? '.cortexrc configuration exists'
|
|
158
|
+
: '.cortexrc is missing (required for TMS validation)',
|
|
159
|
+
file: '.cortexrc',
|
|
160
|
+
...(!exists && {
|
|
161
|
+
fix: fixMissingConfig,
|
|
162
|
+
}),
|
|
163
|
+
},
|
|
164
|
+
];
|
|
165
|
+
}
|
|
117
166
|
export async function validatePlaceholders(cwd, ignoreFiles = []) {
|
|
118
167
|
const checks = [];
|
|
119
168
|
const filesToScan = [
|
|
@@ -211,14 +260,16 @@ export async function validateProject(cwd, options = {}) {
|
|
|
211
260
|
const config = mergeConfig(userConfig);
|
|
212
261
|
const limits = options.limits || getEffectiveLineLimits(config);
|
|
213
262
|
const ignoreFiles = config.validation?.ignoreFiles || [];
|
|
214
|
-
const [fileSizeChecks, mandatoryChecks, placeholderChecks, archiveChecks] = await Promise.all([
|
|
263
|
+
const [fileSizeChecks, mandatoryChecks, configChecks, placeholderChecks, archiveChecks] = await Promise.all([
|
|
215
264
|
validateFileSizes(cwd, limits),
|
|
216
265
|
Promise.resolve(validateMandatoryFiles(cwd)),
|
|
266
|
+
Promise.resolve(validateConfig(cwd)),
|
|
217
267
|
validatePlaceholders(cwd, ignoreFiles),
|
|
218
268
|
validateArchiveStatus(cwd),
|
|
219
269
|
]);
|
|
220
270
|
const checks = [
|
|
221
271
|
...mandatoryChecks,
|
|
272
|
+
...configChecks,
|
|
222
273
|
...fileSizeChecks,
|
|
223
274
|
...placeholderChecks,
|
|
224
275
|
...archiveChecks,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/utils/validator.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/utils/validator.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAOtC,OAAO,EACL,UAAU,EACV,WAAW,EACX,sBAAsB,EACtB,UAAU,EACV,qBAAqB,GACtB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAMlE,MAAM,CAAC,MAAM,mBAAmB,GAAe;IAC7C,eAAe,EAAE,GAAG;IACpB,wBAAwB,EAAE,GAAG;IAC7B,iBAAiB,EAAE,GAAG;IACtB,aAAa,EAAE,GAAG;IAClB,iBAAiB,EAAE,GAAG;IACtB,cAAc,EAAE,GAAG;IACnB,aAAa,EAAE,GAAG;IAClB,WAAW,EAAE,GAAG;IAChB,oBAAoB,EAAE,GAAG;CAC1B,CAAC;AAKF,MAAM,CAAC,MAAM,eAAe,GAAoB;IAC9C,eAAe;IACf,iCAAiC;IACjC,WAAW;CACZ,CAAC;AAKF,MAAM,oBAAoB,GAAG;IAC3B,mBAAmB;IACnB,mBAAmB;IACnB,kBAAkB;IAClB,gBAAgB;IAChB,qBAAqB;CACtB,CAAC;AAKF,KAAK,UAAU,UAAU,CAAC,QAAgB;IACxC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAClD,OAAO,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC;AAKD,KAAK,UAAU,mBAAmB,CAChC,QAAgB;IAEhB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAClD,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,KAAK,MAAM,OAAO,IAAI,oBAAoB,EAAE,CAAC;YAC3C,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACvC,IAAI,OAAO,EAAE,CAAC;gBACZ,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;QAED,OAAO;YACL,KAAK,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC;YACvB,YAAY,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;SAClC,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC;IAC5C,CAAC;AACH,CAAC;AAKD,KAAK,UAAU,mBAAmB,CAAC,QAAgB;IACjD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAElD,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACrE,OAAO,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC;AAKD,SAAS,mBAAmB,CAAC,GAAW;IACtC,OAAO,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,CAAC;AAC/C,CAAC;AAKD,KAAK,UAAU,cAAc,CAAC,GAAW,EAAE,IAAY;IACrD,MAAM,YAAY,GAAG,eAAe,EAAE,CAAC;IACvC,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;IAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAGjC,MAAM,WAAW,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;IAClC,MAAM,YAAY,GAAG;QACnB,cAAc,EAAE,WAAW;QAC3B,cAAc,EAAE,WAAW,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;QACrE,WAAW,EAAE,iCAAiC;KAC/C,CAAC;IAEF,MAAM,eAAe,CAAC,UAAU,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;AAC5D,CAAC;AAKD,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,GAAW,EACX,SAAqB,mBAAmB;IAExC,MAAM,MAAM,GAAsB,EAAE,CAAC;IAErC,KAAK,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACvD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAErC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,SAAS;QACX,CAAC;QAED,MAAM,SAAS,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAC;QAE7C,IAAI,SAAS,GAAG,KAAK,EAAE,CAAC;YACtB,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,cAAc,QAAQ,EAAE;gBAC9B,MAAM,EAAE,KAAK;gBACb,KAAK,EAAE,SAAS;gBAChB,OAAO,EAAE,GAAG,QAAQ,iCAAiC;gBACrD,OAAO,EAAE,YAAY,SAAS,mBAAmB,KAAK,qBAAqB,SAAS,GAAG,KAAK,QAAQ;gBACpG,IAAI,EAAE,QAAQ;aACf,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,cAAc,QAAQ,EAAE;gBAC9B,MAAM,EAAE,IAAI;gBACZ,KAAK,EAAE,MAAM;gBACb,OAAO,EAAE,GAAG,QAAQ,wBAAwB;gBAC5C,OAAO,EAAE,GAAG,SAAS,IAAI,KAAK,QAAQ;gBACtC,IAAI,EAAE,QAAQ;aACf,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAKD,MAAM,UAAU,sBAAsB,CAAC,GAAW;IAChD,MAAM,MAAM,GAAsB,EAAE,CAAC;IAErC,KAAK,MAAM,IAAI,IAAI,eAAe,EAAE,CAAC;QACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACjC,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;QAEpC,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,mBAAmB,IAAI,EAAE;YAC/B,MAAM,EAAE,MAAM;YACd,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO;YAChC,OAAO,EAAE,MAAM;gBACb,CAAC,CAAC,GAAG,IAAI,SAAS;gBAClB,CAAC,CAAC,GAAG,IAAI,gCAAgC;YAC3C,IAAI;YAEJ,GAAG,CAAC,CAAC,MAAM,IAAI;gBACb,GAAG,EAAE,KAAK,EAAE,GAAW,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG,EAAE,IAAI,CAAC;aACtD,CAAC;SACH,CAAC,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAKD,KAAK,UAAU,gBAAgB,CAAC,GAAW;IAEzC,MAAM,WAAW,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,uBAAuB,CAAC,CAAC,CAAC;IACnE,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,qBAAqB,CAAC,CAAC,CAAC;IAC/D,MAAM,eAAe,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,2BAA2B,CAAC,CAAC,CAAC;IAE3E,IAAI,KAAK,GAAuC,UAAU,CAAC;IAE3D,IAAI,WAAW,IAAI,SAAS,EAAE,CAAC;QAC7B,KAAK,GAAG,YAAY,CAAC;IACvB,CAAC;SAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAC5B,KAAK,GAAG,MAAM,CAAC;IACjB,CAAC;IAED,MAAM,WAAW,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;IAClC,MAAM,MAAM,GAAG,qBAAqB,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IACzD,MAAM,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;AAChC,CAAC;AAKD,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IAEtC,OAAO;QACL;YACE,IAAI,EAAE,oBAAoB;YAC1B,MAAM,EAAE,MAAM;YACd,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO;YAChC,OAAO,EAAE,MAAM;gBACb,CAAC,CAAC,gCAAgC;gBAClC,CAAC,CAAC,oDAAoD;YACxD,IAAI,EAAE,WAAW;YACjB,GAAG,CAAC,CAAC,MAAM,IAAI;gBACb,GAAG,EAAE,gBAAgB;aACtB,CAAC;SACH;KACF,CAAC;AACJ,CAAC;AAKD,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,GAAW,EACX,cAAwB,EAAE;IAE1B,MAAM,MAAM,GAAsB,EAAE,CAAC;IAGrC,MAAM,WAAW,GAAG;QAClB,WAAW;QACX,eAAe;QACf,WAAW;QACX,wBAAwB;QACxB,2BAA2B;QAC3B,uBAAuB;QACvB,2BAA2B;KAC5B,CAAC;IAEF,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAE/B,IAAI,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/B,SAAS;QACX,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAEjC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,SAAS;QACX,CAAC;QAED,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,MAAM,mBAAmB,CAAC,QAAQ,CAAC,CAAC;QAEpE,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,iBAAiB,IAAI,EAAE;gBAC7B,MAAM,EAAE,KAAK;gBACb,KAAK,EAAE,SAAS;gBAChB,OAAO,EAAE,GAAG,IAAI,mCAAmC;gBACnD,OAAO,EAAE,UAAU,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;gBAC5C,IAAI;aACL,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,iBAAiB,IAAI,EAAE;gBAC7B,MAAM,EAAE,IAAI;gBACZ,KAAK,EAAE,MAAM;gBACb,OAAO,EAAE,GAAG,IAAI,iCAAiC;gBACjD,IAAI;aACL,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAKD,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,GAAW;IACrD,MAAM,MAAM,GAAsB,EAAE,CAAC;IAErC,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;IAEjD,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAC/B,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,cAAc,GAAG,MAAM,mBAAmB,CAAC,aAAa,CAAC,CAAC;IAChE,MAAM,UAAU,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;IAE5C,IAAI,cAAc,GAAG,EAAE,EAAE,CAAC;QACxB,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,gBAAgB;YACtB,MAAM,EAAE,KAAK;YACb,KAAK,EAAE,SAAS;YAChB,OAAO,EAAE,2CAA2C;YACpD,OAAO,EAAE,GAAG,cAAc,sDAAsD;YAChF,IAAI,EAAE,eAAe;SACtB,CAAC,CAAC;IACL,CAAC;SAAM,IAAI,cAAc,GAAG,CAAC,EAAE,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,gBAAgB;YACtB,MAAM,EAAE,IAAI;YACZ,KAAK,EAAE,MAAM;YACb,OAAO,EAAE,yCAAyC;YAClD,OAAO,EAAE,GAAG,cAAc,mCAAmC;YAC7D,IAAI,EAAE,eAAe;SACtB,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,gBAAgB;YACtB,MAAM,EAAE,IAAI;YACZ,KAAK,EAAE,MAAM;YACb,OAAO,EAAE,6BAA6B;YACtC,OAAO,EAAE,GAAG,cAAc,kBAAkB;YAC5C,IAAI,EAAE,eAAe;SACtB,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC,UAAU,IAAI,cAAc,GAAG,CAAC,EAAE,CAAC;QACtC,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,mBAAmB;YACzB,MAAM,EAAE,KAAK;YACb,KAAK,EAAE,SAAS;YAChB,OAAO,EAAE,4BAA4B;YACrC,OAAO,EAAE,wDAAwD;SAClE,CAAC,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAKD,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,GAAW,EACX,UAAqD,EAAE;IAEvD,MAAM,EAAE,MAAM,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC;IAGnC,MAAM,UAAU,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC;IAGvC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,sBAAsB,CAAC,MAAM,CAAC,CAAC;IAGhE,MAAM,WAAW,GAAG,MAAM,CAAC,UAAU,EAAE,WAAW,IAAI,EAAE,CAAC;IAGzD,MAAM,CAAC,cAAc,EAAE,eAAe,EAAE,YAAY,EAAE,iBAAiB,EAAE,aAAa,CAAC,GACrF,MAAM,OAAO,CAAC,GAAG,CAAC;QAChB,iBAAiB,CAAC,GAAG,EAAE,MAAM,CAAC;QAC9B,OAAO,CAAC,OAAO,CAAC,sBAAsB,CAAC,GAAG,CAAC,CAAC;QAC5C,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;QACpC,oBAAoB,CAAC,GAAG,EAAE,WAAW,CAAC;QACtC,qBAAqB,CAAC,GAAG,CAAC;KAC3B,CAAC,CAAC;IAEL,MAAM,MAAM,GAAG;QACb,GAAG,eAAe;QAClB,GAAG,YAAY;QACf,GAAG,cAAc;QACjB,GAAG,iBAAiB;QACpB,GAAG,aAAa;KACjB,CAAC;IAGF,MAAM,OAAO,GAAG;QACd,KAAK,EAAE,MAAM,CAAC,MAAM;QACpB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM;QAC7C,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,MAAM;QAC5D,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC,MAAM;KACzD,CAAC;IAGF,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;IACrC,MAAM,WAAW,GAAG,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAEhE,OAAO;QACL,MAAM;QACN,MAAM;QACN,OAAO;KACR,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cortex-tms",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.4.0",
|
|
4
4
|
"description": "The Universal AI-Optimized Project Boilerplate - CLI tool for bootstrapping TMS-structured projects",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -51,6 +51,7 @@
|
|
|
51
51
|
"homepage": "https://github.com/cortex-tms/cortex-tms#readme",
|
|
52
52
|
"dependencies": {
|
|
53
53
|
"chalk": "^5.3.0",
|
|
54
|
+
"clipboardy": "^4.0.0",
|
|
54
55
|
"commander": "^12.1.0",
|
|
55
56
|
"fs-extra": "^11.2.0",
|
|
56
57
|
"inquirer": "^10.2.2",
|
package/templates/CLAUDE.md
CHANGED
|
@@ -16,3 +16,5 @@ Expert Senior Developer. Follow the **"Propose, Justify, Recommend"** framework.
|
|
|
16
16
|
2. Cross-reference `docs/core/PATTERNS.md` for existing code conventions.
|
|
17
17
|
3. If unsure of a term, check `docs/core/GLOSSARY.md`.
|
|
18
18
|
4. Execute TDD (Test-Driven Development).
|
|
19
|
+
|
|
20
|
+
<!-- @cortex-tms-version 2.3.0 -->
|
|
@@ -77,3 +77,5 @@ A task moves from FUTURE → NEXT when:
|
|
|
77
77
|
### [YYYY-MM-DD] - [Rejected Idea Name]
|
|
78
78
|
**Why Rejected**: [Reason - e.g., "User research showed low demand", "Technical complexity too high"]
|
|
79
79
|
**Alternative**: [What we did instead - e.g., "Built simplified version in Sprint 3"]
|
|
80
|
+
|
|
81
|
+
<!-- @cortex-tms-version 2.3.0 -->
|
package/templates/NEXT-TASKS.md
CHANGED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# Cortex TMS: AI Prompt Library
|
|
2
|
+
|
|
3
|
+
This file contains project-aware prompt templates for streamlined AI collaboration. Use `cortex-tms prompt <name>` to quickly access these prompts.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## init-session
|
|
8
|
+
|
|
9
|
+
Review `NEXT-TASKS.md`, `docs/core/ARCHITECTURE.md`, and `CLAUDE.md`. Summarize current priorities and propose a step-by-step plan for the next task.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## feature
|
|
14
|
+
|
|
15
|
+
Implement `[FEATURE]`. First, check `ARCHITECTURE.md` for constraints, follow `PATTERNS.md` for style, and validate logic against `DOMAIN-LOGIC.md`.
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## debug
|
|
20
|
+
|
|
21
|
+
I'm seeing `[ISSUE]`. Check `docs/core/TROUBLESHOOTING.md` for known issues, then trace the logic through `ARCHITECTURE.md` to find the failure point.
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## review
|
|
26
|
+
|
|
27
|
+
Review the current changes against `PATTERNS.md`. Flag any violations of project conventions and suggest specific fixes.
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## refactor
|
|
32
|
+
|
|
33
|
+
Refactor `[COMPONENT]`. Improve structure per `PATTERNS.md` while ensuring behavior remains strictly compliant with `DOMAIN-LOGIC.md`.
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## decision
|
|
38
|
+
|
|
39
|
+
We need to decide on `[TOPIC]`. Draft a new Architecture Decision Record in `docs/core/DECISIONS.md` using the project's standard format.
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## finish
|
|
44
|
+
|
|
45
|
+
Task complete. Execute the Maintenance Protocol: update `NEXT-TASKS.md`, sync truth to `docs/core/`, and suggest the next priority.
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## Usage Tips
|
|
50
|
+
|
|
51
|
+
- Replace placeholders like `[FEATURE]`, `[ISSUE]`, `[COMPONENT]`, `[TOPIC]` with your specific context
|
|
52
|
+
- Customize these prompts to match your team's vocabulary and workflow
|
|
53
|
+
- Run `cortex-tms prompt --list` to see all available prompts
|
|
54
|
+
|
|
55
|
+
<!-- @cortex-tms-version 2.3.0 -->
|
package/templates/README.md
CHANGED
|
@@ -81,3 +81,5 @@ This file documents **why** we made key technical decisions. When an AI agent or
|
|
|
81
81
|
- **Architecture**: See `docs/core/ARCHITECTURE.md` for technology stack
|
|
82
82
|
- **Patterns**: See `docs/core/PATTERNS.md` for implementation patterns
|
|
83
83
|
- **Glossary**: See `docs/core/GLOSSARY.md` for term definitions
|
|
84
|
+
|
|
85
|
+
<!-- @cortex-tms-version 2.3.0 -->
|
|
@@ -64,3 +64,5 @@ This file defines project-specific terminology, acronyms, and domain language to
|
|
|
64
64
|
- **Architecture**: See `docs/core/ARCHITECTURE.md` for system structure
|
|
65
65
|
- **Patterns**: See `docs/core/PATTERNS.md` for code conventions
|
|
66
66
|
- **Decisions**: See `docs/core/DECISIONS.md` for technology choices
|
|
67
|
+
|
|
68
|
+
<!-- @cortex-tms-version 2.3.0 -->
|
|
@@ -53,3 +53,5 @@ AI agents MUST follow this order before proposing or writing code:
|
|
|
53
53
|
1. Read `NEXT-TASKS.md` to understand the "Why" and "What."
|
|
54
54
|
2. Check `docs/core/PATTERNS.md` for existing canonical examples.
|
|
55
55
|
3. Propose -> Justify -> Recommend.
|
|
56
|
+
|
|
57
|
+
<!-- @cortex-tms-version 2.3.0 -->
|