cortex-tms 4.0.0 ā 4.0.2
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 +22 -12
- package/dist/cli.js +45 -37
- package/dist/cli.js.map +1 -1
- package/dist/commands/archive.d.ts +1 -1
- package/dist/commands/archive.d.ts.map +1 -1
- package/dist/commands/archive.js +36 -34
- package/dist/commands/archive.js.map +1 -1
- package/dist/commands/auto-tier.d.ts +1 -1
- package/dist/commands/auto-tier.d.ts.map +1 -1
- package/dist/commands/auto-tier.js +77 -76
- package/dist/commands/auto-tier.js.map +1 -1
- package/dist/commands/dashboard.d.ts +1 -1
- package/dist/commands/dashboard.js +8 -8
- package/dist/commands/init.d.ts +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +73 -73
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/migrate.d.ts +2 -2
- package/dist/commands/migrate.d.ts.map +1 -1
- package/dist/commands/migrate.js +147 -136
- package/dist/commands/migrate.js.map +1 -1
- package/dist/commands/prompt.d.ts +1 -1
- package/dist/commands/prompt.d.ts.map +1 -1
- package/dist/commands/prompt.js +32 -31
- package/dist/commands/prompt.js.map +1 -1
- package/dist/commands/review.d.ts +1 -1
- package/dist/commands/review.d.ts.map +1 -1
- package/dist/commands/review.js +60 -60
- package/dist/commands/review.js.map +1 -1
- package/dist/commands/status.d.ts +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +51 -45
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/tutorial.d.ts +1 -1
- package/dist/commands/tutorial.js +168 -168
- package/dist/commands/tutorial.js.map +1 -1
- package/dist/commands/validate.d.ts +1 -1
- package/dist/commands/validate.d.ts.map +1 -1
- package/dist/commands/validate.js +60 -60
- package/dist/commands/validate.js.map +1 -1
- package/dist/types/cli.d.ts +15 -15
- package/dist/types/guardian.d.ts +2 -2
- package/dist/ui/components/Dashboard.d.ts +2 -2
- package/dist/ui/components/Dashboard.d.ts.map +1 -1
- package/dist/ui/components/Dashboard.js +24 -23
- package/dist/ui/components/Dashboard.js.map +1 -1
- package/dist/ui/components/dashboard/ContextReductionCard.d.ts +1 -1
- package/dist/ui/components/dashboard/ContextReductionCard.d.ts.map +1 -1
- package/dist/ui/components/dashboard/ContextReductionCard.js +5 -5
- package/dist/ui/components/dashboard/ContextReductionCard.js.map +1 -1
- package/dist/ui/components/dashboard/CostSavingsCard.d.ts +1 -1
- package/dist/ui/components/dashboard/CostSavingsCard.d.ts.map +1 -1
- package/dist/ui/components/dashboard/CostSavingsCard.js +7 -7
- package/dist/ui/components/dashboard/CostSavingsCard.js.map +1 -1
- package/dist/ui/components/dashboard/FileDistributionCard.d.ts +1 -1
- package/dist/ui/components/dashboard/FileDistributionCard.d.ts.map +1 -1
- package/dist/ui/components/dashboard/FileDistributionCard.js +10 -10
- package/dist/ui/components/dashboard/FileDistributionCard.js.map +1 -1
- package/dist/ui/components/dashboard/FileSizeHealthCard.d.ts +2 -2
- package/dist/ui/components/dashboard/FileSizeHealthCard.d.ts.map +1 -1
- package/dist/ui/components/dashboard/FileSizeHealthCard.js +12 -12
- package/dist/ui/components/dashboard/FileSizeHealthCard.js.map +1 -1
- package/dist/ui/components/dashboard/Footer.d.ts +1 -1
- package/dist/ui/components/dashboard/Footer.d.ts.map +1 -1
- package/dist/ui/components/dashboard/Footer.js +2 -2
- package/dist/ui/components/dashboard/Footer.js.map +1 -1
- package/dist/ui/components/dashboard/GovernanceHealthCard.d.ts +3 -3
- package/dist/ui/components/dashboard/GovernanceHealthCard.d.ts.map +1 -1
- package/dist/ui/components/dashboard/GovernanceHealthCard.js +17 -14
- package/dist/ui/components/dashboard/GovernanceHealthCard.js.map +1 -1
- package/dist/ui/components/dashboard/GuardianStatusCard.d.ts +2 -2
- package/dist/ui/components/dashboard/GuardianStatusCard.d.ts.map +1 -1
- package/dist/ui/components/dashboard/GuardianStatusCard.js +29 -16
- package/dist/ui/components/dashboard/GuardianStatusCard.js.map +1 -1
- package/dist/ui/components/dashboard/Header.d.ts +1 -1
- package/dist/ui/components/dashboard/Header.js +2 -2
- package/dist/ui/components/dashboard/HotFilesCard.d.ts +1 -1
- package/dist/ui/components/dashboard/HotFilesCard.d.ts.map +1 -1
- package/dist/ui/components/dashboard/HotFilesCard.js +6 -6
- package/dist/ui/components/dashboard/HotFilesCard.js.map +1 -1
- package/dist/ui/components/dashboard/NotConfiguredCard.d.ts +2 -2
- package/dist/ui/components/dashboard/NotConfiguredCard.d.ts.map +1 -1
- package/dist/ui/components/dashboard/NotConfiguredCard.js +3 -3
- package/dist/ui/components/dashboard/NotConfiguredCard.js.map +1 -1
- package/dist/ui/components/dashboard/SprintProgressCard.d.ts +1 -1
- package/dist/ui/components/dashboard/SprintProgressCard.d.ts.map +1 -1
- package/dist/ui/components/dashboard/SprintProgressCard.js +4 -4
- package/dist/ui/components/dashboard/SprintProgressCard.js.map +1 -1
- package/dist/ui/components/dashboard/StalenessCard.d.ts +1 -1
- package/dist/ui/components/dashboard/StalenessCard.d.ts.map +1 -1
- package/dist/ui/components/dashboard/StalenessCard.js +9 -9
- package/dist/ui/components/dashboard/StalenessCard.js.map +1 -1
- package/dist/ui/components/dashboard/TabBar.d.ts +2 -2
- package/dist/ui/components/dashboard/TabBar.js +7 -7
- package/dist/ui/components/dashboard/TabBar.js.map +1 -1
- package/dist/ui/components/dashboard/ValidationCard.d.ts +2 -2
- package/dist/ui/components/dashboard/ValidationCard.d.ts.map +1 -1
- package/dist/ui/components/dashboard/ValidationCard.js +22 -22
- package/dist/ui/components/dashboard/ValidationCard.js.map +1 -1
- package/dist/ui/components/dashboard/ViewContainer.d.ts +3 -3
- package/dist/ui/components/dashboard/ViewContainer.d.ts.map +1 -1
- package/dist/ui/components/dashboard/ViewContainer.js +20 -20
- package/dist/ui/components/dashboard/ViewContainer.js.map +1 -1
- package/dist/ui/components/dashboard/index.d.ts +13 -13
- package/dist/ui/components/dashboard/index.js +13 -13
- package/dist/ui/index.d.ts.map +1 -1
- package/dist/ui/index.js +10 -10
- package/dist/ui/index.js.map +1 -1
- package/dist/utils/backup.d.ts.map +1 -1
- package/dist/utils/backup.js +20 -20
- package/dist/utils/backup.js.map +1 -1
- package/dist/utils/config.d.ts +1 -1
- package/dist/utils/config.js +68 -68
- package/dist/utils/detection.d.ts +1 -1
- package/dist/utils/detection.js +25 -25
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +4 -4
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/git-history.d.ts.map +1 -1
- package/dist/utils/git-history.js +9 -5
- package/dist/utils/git-history.js.map +1 -1
- package/dist/utils/git-staleness.d.ts.map +1 -1
- package/dist/utils/git-staleness.js +21 -21
- package/dist/utils/git-staleness.js.map +1 -1
- package/dist/utils/guardian-prompt.d.ts.map +1 -1
- package/dist/utils/guardian-prompt.js +1 -1
- package/dist/utils/guardian-prompt.js.map +1 -1
- package/dist/utils/llm-client.d.ts +5 -5
- package/dist/utils/llm-client.d.ts.map +1 -1
- package/dist/utils/llm-client.js +56 -53
- package/dist/utils/llm-client.js.map +1 -1
- package/dist/utils/prompt-parser.d.ts.map +1 -1
- package/dist/utils/prompt-parser.js +13 -17
- package/dist/utils/prompt-parser.js.map +1 -1
- package/dist/utils/prompts.d.ts +1 -1
- package/dist/utils/prompts.d.ts.map +1 -1
- package/dist/utils/prompts.js +74 -49
- package/dist/utils/prompts.js.map +1 -1
- package/dist/utils/sanitize.js +6 -6
- package/dist/utils/sanitize.js.map +1 -1
- package/dist/utils/stats-collector.d.ts +3 -9
- package/dist/utils/stats-collector.d.ts.map +1 -1
- package/dist/utils/stats-collector.js +74 -83
- package/dist/utils/stats-collector.js.map +1 -1
- package/dist/utils/status.d.ts +1 -1
- package/dist/utils/status.d.ts.map +1 -1
- package/dist/utils/status.js +16 -16
- package/dist/utils/status.js.map +1 -1
- package/dist/utils/templates.d.ts +3 -3
- package/dist/utils/templates.d.ts.map +1 -1
- package/dist/utils/templates.js +59 -54
- package/dist/utils/templates.js.map +1 -1
- package/dist/utils/tier-tags.d.ts +1 -1
- package/dist/utils/tier-tags.js +2 -2
- package/dist/utils/token-counter.d.ts +1 -43
- package/dist/utils/token-counter.d.ts.map +1 -1
- package/dist/utils/token-counter.js +32 -80
- package/dist/utils/token-counter.js.map +1 -1
- package/dist/utils/validation.d.ts +1 -1
- package/dist/utils/validation.d.ts.map +1 -1
- package/dist/utils/validation.js +25 -24
- package/dist/utils/validation.js.map +1 -1
- package/dist/utils/validator.d.ts +1 -1
- package/dist/utils/validator.d.ts.map +1 -1
- package/dist/utils/validator.js +97 -90
- package/dist/utils/validator.js.map +1 -1
- package/package.json +7 -5
- package/templates/CLAUDE.md +1 -1
- package/templates/FUTURE-ENHANCEMENTS.md +1 -1
- package/templates/NEXT-TASKS.md +1 -1
- package/templates/PROMPTS.md +1 -1
- package/templates/README.md +1 -1
- package/templates/docs/archive/v1.0-CHANGELOG.md +1 -1
- package/templates/docs/core/ARCHITECTURE.md +1 -1
- package/templates/docs/core/DECISIONS.md +1 -1
- package/templates/docs/core/DOMAIN-LOGIC.md +1 -1
- package/templates/docs/core/GLOSSARY.md +1 -1
- package/templates/docs/core/PATTERNS.md +1 -1
- package/templates/docs/core/SCHEMA.md +1 -1
- package/templates/docs/core/TROUBLESHOOTING.md +1 -1
package/dist/commands/prompt.js
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
import { Command } from
|
|
2
|
-
import chalk from
|
|
3
|
-
import inquirer from
|
|
4
|
-
import clipboard from
|
|
5
|
-
import { getProjectPrompts, getPrompt } from
|
|
6
|
-
import { promptOptionsSchema, validateOptions } from
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
import inquirer from "inquirer";
|
|
4
|
+
import clipboard from "clipboardy";
|
|
5
|
+
import { getProjectPrompts, getPrompt } from "../utils/prompt-parser.js";
|
|
6
|
+
import { promptOptionsSchema, validateOptions } from "../utils/validation.js";
|
|
7
7
|
export function createPromptCommand() {
|
|
8
|
-
const promptCommand = new Command(
|
|
8
|
+
const promptCommand = new Command("prompt");
|
|
9
9
|
promptCommand
|
|
10
|
-
.description(
|
|
11
|
-
.argument(
|
|
12
|
-
.option(
|
|
13
|
-
.option(
|
|
10
|
+
.description("Access project-aware AI prompt templates")
|
|
11
|
+
.argument("[name]", 'Prompt name to display (e.g., "init-session", "feature")')
|
|
12
|
+
.option("-l, --list", "List all available prompts")
|
|
13
|
+
.option("--no-copy", "Do not copy to clipboard (stdout only)")
|
|
14
14
|
.action(async (name, options) => {
|
|
15
15
|
await runPromptCommand(name, options);
|
|
16
16
|
});
|
|
@@ -19,63 +19,64 @@ export function createPromptCommand() {
|
|
|
19
19
|
export const promptCommand = createPromptCommand();
|
|
20
20
|
async function runPromptCommand(promptName, options) {
|
|
21
21
|
const cwd = process.cwd();
|
|
22
|
-
validateOptions(promptOptionsSchema, options,
|
|
22
|
+
validateOptions(promptOptionsSchema, options, "prompt");
|
|
23
23
|
try {
|
|
24
24
|
const prompts = await getProjectPrompts(cwd);
|
|
25
25
|
if (prompts.length === 0) {
|
|
26
|
-
console.log(chalk.yellow(
|
|
26
|
+
console.log(chalk.yellow("\nā ļø No prompts found in PROMPTS.md"));
|
|
27
27
|
console.log(chalk.gray('\nRun "cortex-tms init" to install the prompt library.\n'));
|
|
28
28
|
return;
|
|
29
29
|
}
|
|
30
30
|
if (options.list) {
|
|
31
|
-
console.log(chalk.bold.cyan(
|
|
31
|
+
console.log(chalk.bold.cyan("\nš Available Prompts:\n"));
|
|
32
32
|
prompts.forEach((p) => {
|
|
33
33
|
console.log(chalk.bold.blue(` ${p.name}`));
|
|
34
34
|
console.log(chalk.gray(` ${p.description}\n`));
|
|
35
35
|
});
|
|
36
|
-
console.log(chalk.gray(`\nUse: ${chalk.cyan(
|
|
37
|
-
console.log(chalk.gray(`Example: ${chalk.cyan(
|
|
36
|
+
console.log(chalk.gray(`\nUse: ${chalk.cyan("cortex-tms prompt <name>")} to access a prompt`));
|
|
37
|
+
console.log(chalk.gray(`Example: ${chalk.cyan("cortex-tms prompt init-session")}\n`));
|
|
38
38
|
return;
|
|
39
39
|
}
|
|
40
40
|
if (promptName) {
|
|
41
41
|
const content = await getPrompt(cwd, promptName);
|
|
42
42
|
if (!content) {
|
|
43
|
-
console.log(chalk.red(
|
|
44
|
-
console.log(chalk.gray(
|
|
43
|
+
console.log(chalk.red("\nā Error:"), `Prompt "${promptName}" not found`);
|
|
44
|
+
console.log(chalk.gray("\nRun"), chalk.cyan("cortex-tms prompt --list"), chalk.gray("to see available prompts.\n"));
|
|
45
45
|
return;
|
|
46
46
|
}
|
|
47
47
|
await displayPrompt(promptName, content, options.copy);
|
|
48
48
|
return;
|
|
49
49
|
}
|
|
50
50
|
const choices = prompts.map((p) => ({
|
|
51
|
-
name: `${chalk.bold(p.name)} ${chalk.gray(
|
|
51
|
+
name: `${chalk.bold(p.name)} ${chalk.gray("- " + p.description)}`,
|
|
52
52
|
value: p.name,
|
|
53
53
|
short: p.name,
|
|
54
54
|
}));
|
|
55
55
|
const answer = await inquirer.prompt([
|
|
56
56
|
{
|
|
57
|
-
type:
|
|
58
|
-
name:
|
|
59
|
-
message:
|
|
57
|
+
type: "list",
|
|
58
|
+
name: "selectedPrompt",
|
|
59
|
+
message: "Select a prompt:",
|
|
60
60
|
choices,
|
|
61
61
|
pageSize: 10,
|
|
62
62
|
},
|
|
63
63
|
]);
|
|
64
64
|
const selectedPrompt = prompts.find((p) => p.name === answer.selectedPrompt);
|
|
65
65
|
if (!selectedPrompt) {
|
|
66
|
-
console.log(chalk.red(
|
|
66
|
+
console.log(chalk.red("\nā Error:"), "Prompt not found\n");
|
|
67
67
|
return;
|
|
68
68
|
}
|
|
69
69
|
await displayPrompt(selectedPrompt.name, selectedPrompt.content, options.copy);
|
|
70
70
|
}
|
|
71
71
|
catch (error) {
|
|
72
|
-
if (error instanceof Error &&
|
|
73
|
-
|
|
74
|
-
console.log(chalk.
|
|
72
|
+
if (error instanceof Error &&
|
|
73
|
+
error.message.includes("PROMPTS.md not found")) {
|
|
74
|
+
console.log(chalk.yellow("\nā ļø PROMPTS.md not found in current directory"));
|
|
75
|
+
console.log(chalk.gray("\nThis command must be run from a Cortex TMS project."));
|
|
75
76
|
console.log(chalk.gray('Run "cortex-tms init" to initialize.\n'));
|
|
76
77
|
}
|
|
77
78
|
else {
|
|
78
|
-
throw error instanceof Error ? error : new Error(
|
|
79
|
+
throw error instanceof Error ? error : new Error("Unknown error");
|
|
79
80
|
}
|
|
80
81
|
}
|
|
81
82
|
}
|
|
@@ -85,12 +86,12 @@ async function displayPrompt(name, content, shouldCopy) {
|
|
|
85
86
|
if (shouldCopy) {
|
|
86
87
|
try {
|
|
87
88
|
await clipboard.write(content);
|
|
88
|
-
console.log(chalk.green(
|
|
89
|
+
console.log(chalk.green("\nā
Copied to clipboard!"));
|
|
89
90
|
}
|
|
90
|
-
catch
|
|
91
|
-
console.log(chalk.yellow(
|
|
91
|
+
catch {
|
|
92
|
+
console.log(chalk.yellow("\nā ļø Could not copy to clipboard"), chalk.gray("(no clipboard access)"));
|
|
92
93
|
}
|
|
93
94
|
}
|
|
94
|
-
console.log(chalk.gray(
|
|
95
|
+
console.log(chalk.gray("\nš” Tip: Paste this prompt into your AI conversation.\n"));
|
|
95
96
|
}
|
|
96
97
|
//# sourceMappingURL=prompt.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/commands/prompt.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,SAAS,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACzE,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAK9E,MAAM,UAAU,mBAAmB;IACjC,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC;IAE5C,aAAa;SACV,WAAW,CAAC,0CAA0C,CAAC;SACvD,QAAQ,
|
|
1
|
+
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/commands/prompt.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"review.d.ts","sourceRoot":"","sources":["../../src/commands/review.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"review.d.ts","sourceRoot":"","sources":["../../src/commands/review.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA4BpC,wBAAgB,mBAAmB,IAAI,OAAO,CA6B7C;AAKD,eAAO,MAAM,aAAa,SAAwB,CAAC"}
|
package/dist/commands/review.js
CHANGED
|
@@ -1,23 +1,23 @@
|
|
|
1
|
-
import { Command } from
|
|
2
|
-
import chalk from
|
|
3
|
-
import { readFileSync, existsSync, mkdirSync, writeFileSync } from
|
|
4
|
-
import { join } from
|
|
5
|
-
import inquirer from
|
|
6
|
-
import { callLLM, getApiKey, parseGuardianJSON, } from
|
|
7
|
-
import { buildGuardianSystemPrompt, buildGuardianUserPrompt } from
|
|
8
|
-
import { SAFE_MODE_THRESHOLD } from
|
|
9
|
-
import { reviewOptionsSchema, validateOptions, validateFilePath } from
|
|
10
|
-
import { ValidationError } from
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
import { readFileSync, existsSync, mkdirSync, writeFileSync } from "fs";
|
|
4
|
+
import { join } from "path";
|
|
5
|
+
import inquirer from "inquirer";
|
|
6
|
+
import { callLLM, getApiKey, parseGuardianJSON, } from "../utils/llm-client.js";
|
|
7
|
+
import { buildGuardianSystemPrompt, buildGuardianUserPrompt, } from "../utils/guardian-prompt.js";
|
|
8
|
+
import { SAFE_MODE_THRESHOLD } from "../types/guardian.js";
|
|
9
|
+
import { reviewOptionsSchema, validateOptions, validateFilePath, } from "../utils/validation.js";
|
|
10
|
+
import { ValidationError } from "../utils/errors.js";
|
|
11
11
|
export function createReviewCommand() {
|
|
12
|
-
const reviewCommand = new Command(
|
|
12
|
+
const reviewCommand = new Command("review");
|
|
13
13
|
reviewCommand
|
|
14
|
-
.description(
|
|
15
|
-
.argument(
|
|
16
|
-
.option(
|
|
17
|
-
.option(
|
|
18
|
-
.option(
|
|
19
|
-
.option(
|
|
20
|
-
.option(
|
|
14
|
+
.description("š”ļø Guardian: Analyze code against project patterns")
|
|
15
|
+
.argument("<file>", "Path to file to review")
|
|
16
|
+
.option("-p, --provider <provider>", "LLM provider: openai or anthropic", "anthropic")
|
|
17
|
+
.option("-m, --model <model>", "Model name (default: gpt-4-turbo-preview or claude-3-5-sonnet-20241022)")
|
|
18
|
+
.option("--api-key <key>", "API key (alternative to environment variable)")
|
|
19
|
+
.option("--safe", `Safe Mode: only show high-confidence violations (>= ${SAFE_MODE_THRESHOLD * 100}%)`)
|
|
20
|
+
.option("--output-json", "Output raw JSON instead of formatted text (for programmatic use)")
|
|
21
21
|
.action(async (filePath, options) => {
|
|
22
22
|
await runReviewCommand(filePath, options);
|
|
23
23
|
});
|
|
@@ -25,19 +25,19 @@ export function createReviewCommand() {
|
|
|
25
25
|
}
|
|
26
26
|
export const reviewCommand = createReviewCommand();
|
|
27
27
|
function formatGuardianResult(result) {
|
|
28
|
-
let output =
|
|
28
|
+
let output = "";
|
|
29
29
|
const statusConfig = {
|
|
30
|
-
compliant: { emoji:
|
|
31
|
-
minor_issues: { emoji:
|
|
32
|
-
major_violations: { emoji:
|
|
30
|
+
compliant: { emoji: "ā
", label: "Compliant" },
|
|
31
|
+
minor_issues: { emoji: "ā ļø ", label: "Minor Issues" },
|
|
32
|
+
major_violations: { emoji: "ā", label: "Major Violations" },
|
|
33
33
|
};
|
|
34
34
|
const { emoji, label } = statusConfig[result.summary.status];
|
|
35
35
|
output += `${emoji} **${label}**\n\n`;
|
|
36
36
|
output += `${result.summary.message}\n\n`;
|
|
37
37
|
if (result.violations.length > 0) {
|
|
38
|
-
output +=
|
|
38
|
+
output += "## Violations\n\n";
|
|
39
39
|
result.violations.forEach((v, index) => {
|
|
40
|
-
const severityIcon = v.severity ===
|
|
40
|
+
const severityIcon = v.severity === "major" ? "ā" : "ā ļø ";
|
|
41
41
|
output += `${index + 1}. ${severityIcon} **${v.pattern}**\n`;
|
|
42
42
|
if (v.line) {
|
|
43
43
|
output += ` š Line: ${v.line}\n`;
|
|
@@ -47,11 +47,11 @@ function formatGuardianResult(result) {
|
|
|
47
47
|
if (v.confidence !== undefined) {
|
|
48
48
|
output += ` š Confidence: ${Math.round(v.confidence * 100)}%\n`;
|
|
49
49
|
}
|
|
50
|
-
output +=
|
|
50
|
+
output += "\n";
|
|
51
51
|
});
|
|
52
52
|
}
|
|
53
53
|
if (result.positiveObservations.length > 0) {
|
|
54
|
-
output +=
|
|
54
|
+
output += "## Positive Observations\n\n";
|
|
55
55
|
result.positiveObservations.forEach((obs) => {
|
|
56
56
|
output += `ā
${obs}\n`;
|
|
57
57
|
});
|
|
@@ -60,83 +60,83 @@ function formatGuardianResult(result) {
|
|
|
60
60
|
}
|
|
61
61
|
async function runReviewCommand(filePath, options) {
|
|
62
62
|
const cwd = process.cwd();
|
|
63
|
-
const validated = validateOptions(reviewOptionsSchema, options,
|
|
63
|
+
const validated = validateOptions(reviewOptionsSchema, options, "review");
|
|
64
64
|
if (!validated.outputJson) {
|
|
65
|
-
console.log(chalk.bold.cyan(
|
|
65
|
+
console.log(chalk.bold.cyan("\nš”ļø Guardian Code Review\n"));
|
|
66
66
|
}
|
|
67
67
|
const provider = validated.provider;
|
|
68
68
|
let apiKey = validated.apiKey || getApiKey(provider);
|
|
69
69
|
if (!apiKey) {
|
|
70
|
-
if (validated.outputJson || process.env.CI ===
|
|
71
|
-
const envVar = provider ===
|
|
70
|
+
if (validated.outputJson || process.env.CI === "true") {
|
|
71
|
+
const envVar = provider === "openai" ? "OPENAI_API_KEY" : "ANTHROPIC_API_KEY";
|
|
72
72
|
throw new ValidationError(`API key is required. Set ${envVar} environment variable or use --api-key flag`);
|
|
73
73
|
}
|
|
74
74
|
}
|
|
75
|
-
const patternsPath = join(cwd,
|
|
76
|
-
const domainLogicPath = join(cwd,
|
|
75
|
+
const patternsPath = join(cwd, "docs/core/PATTERNS.md");
|
|
76
|
+
const domainLogicPath = join(cwd, "docs/core/DOMAIN-LOGIC.md");
|
|
77
77
|
if (!existsSync(patternsPath)) {
|
|
78
78
|
if (!validated.outputJson) {
|
|
79
|
-
console.log(chalk.gray(
|
|
80
|
-
console.log(chalk.gray(
|
|
79
|
+
console.log(chalk.gray("\nGuardian requires a Cortex TMS project with pattern documentation."));
|
|
80
|
+
console.log(chalk.gray("Run"), chalk.cyan("cortex-tms init"), chalk.gray("to set up TMS files.\n"));
|
|
81
81
|
}
|
|
82
|
-
throw new ValidationError(
|
|
82
|
+
throw new ValidationError("PATTERNS.md not found at docs/core/PATTERNS.md");
|
|
83
83
|
}
|
|
84
84
|
if (!existsSync(domainLogicPath) && !validated.outputJson) {
|
|
85
|
-
console.log(chalk.yellow(
|
|
85
|
+
console.log(chalk.yellow("ā ļø Warning:"), "DOMAIN-LOGIC.md not found (optional)");
|
|
86
86
|
}
|
|
87
87
|
const targetPath = validateFilePath(filePath, cwd);
|
|
88
88
|
try {
|
|
89
89
|
if (!validated.outputJson) {
|
|
90
|
-
console.log(chalk.gray(
|
|
90
|
+
console.log(chalk.gray("š Reading project patterns..."));
|
|
91
91
|
}
|
|
92
|
-
const patterns = readFileSync(patternsPath,
|
|
92
|
+
const patterns = readFileSync(patternsPath, "utf-8");
|
|
93
93
|
const domainLogic = existsSync(domainLogicPath)
|
|
94
|
-
? readFileSync(domainLogicPath,
|
|
94
|
+
? readFileSync(domainLogicPath, "utf-8")
|
|
95
95
|
: null;
|
|
96
|
-
const codeToReview = readFileSync(targetPath,
|
|
96
|
+
const codeToReview = readFileSync(targetPath, "utf-8");
|
|
97
97
|
if (!apiKey) {
|
|
98
98
|
const answer = await inquirer.prompt([
|
|
99
99
|
{
|
|
100
|
-
type:
|
|
101
|
-
name:
|
|
102
|
-
message: `Enter your ${provider ===
|
|
103
|
-
mask:
|
|
100
|
+
type: "password",
|
|
101
|
+
name: "apiKey",
|
|
102
|
+
message: `Enter your ${provider === "openai" ? "OpenAI" : "Anthropic"} API key:`,
|
|
103
|
+
mask: "*",
|
|
104
104
|
},
|
|
105
105
|
]);
|
|
106
106
|
apiKey = answer.apiKey;
|
|
107
107
|
if (!apiKey) {
|
|
108
|
-
throw new ValidationError(
|
|
108
|
+
throw new ValidationError("API key is required");
|
|
109
109
|
}
|
|
110
110
|
}
|
|
111
111
|
if (!validated.outputJson) {
|
|
112
|
-
console.log(chalk.gray(
|
|
112
|
+
console.log(chalk.gray("š¤ Analyzing code with", provider, "..."));
|
|
113
113
|
}
|
|
114
114
|
const systemPrompt = buildGuardianSystemPrompt(patterns, domainLogic);
|
|
115
115
|
const userPrompt = buildGuardianUserPrompt(filePath, codeToReview);
|
|
116
116
|
const messages = [
|
|
117
|
-
{ role:
|
|
118
|
-
{ role:
|
|
117
|
+
{ role: "system", content: systemPrompt },
|
|
118
|
+
{ role: "user", content: userPrompt },
|
|
119
119
|
];
|
|
120
120
|
const config = {
|
|
121
121
|
provider,
|
|
122
122
|
apiKey,
|
|
123
123
|
...(validated.model && { model: validated.model }),
|
|
124
124
|
timeoutMs: 60000,
|
|
125
|
-
responseFormat:
|
|
125
|
+
responseFormat: "json",
|
|
126
126
|
};
|
|
127
127
|
const response = await callLLM(config, messages);
|
|
128
|
-
|
|
128
|
+
const parsedResult = parseGuardianJSON(response.content);
|
|
129
129
|
if (parsedResult && validated.safe) {
|
|
130
130
|
const originalCount = parsedResult.violations.length;
|
|
131
|
-
parsedResult.violations = parsedResult.violations.filter(v => (v.confidence ?? 1.0) >= SAFE_MODE_THRESHOLD);
|
|
131
|
+
parsedResult.violations = parsedResult.violations.filter((v) => (v.confidence ?? 1.0) >= SAFE_MODE_THRESHOLD);
|
|
132
132
|
if (originalCount > 0 && parsedResult.violations.length === 0) {
|
|
133
|
-
parsedResult.summary.status =
|
|
134
|
-
parsedResult.summary.message = `No high-confidence violations found (Safe Mode filtered ${originalCount} low-confidence issue${originalCount === 1 ?
|
|
133
|
+
parsedResult.summary.status = "compliant";
|
|
134
|
+
parsedResult.summary.message = `No high-confidence violations found (Safe Mode filtered ${originalCount} low-confidence issue${originalCount === 1 ? "" : "s"})`;
|
|
135
135
|
}
|
|
136
136
|
}
|
|
137
137
|
if (parsedResult) {
|
|
138
138
|
try {
|
|
139
|
-
const cortexDir = join(cwd,
|
|
139
|
+
const cortexDir = join(cwd, ".cortex");
|
|
140
140
|
if (!existsSync(cortexDir)) {
|
|
141
141
|
mkdirSync(cortexDir, { recursive: true });
|
|
142
142
|
}
|
|
@@ -147,7 +147,7 @@ async function runReviewCommand(filePath, options) {
|
|
|
147
147
|
violations: parsedResult.violations,
|
|
148
148
|
filesReviewed: 1,
|
|
149
149
|
};
|
|
150
|
-
writeFileSync(join(cortexDir,
|
|
150
|
+
writeFileSync(join(cortexDir, "guardian-cache.json"), JSON.stringify(cacheData, null, 2), "utf-8");
|
|
151
151
|
}
|
|
152
152
|
catch {
|
|
153
153
|
}
|
|
@@ -158,19 +158,19 @@ async function runReviewCommand(filePath, options) {
|
|
|
158
158
|
}
|
|
159
159
|
else {
|
|
160
160
|
console.log(JSON.stringify({
|
|
161
|
-
error:
|
|
162
|
-
rawContent: response.content
|
|
161
|
+
error: "Failed to parse Guardian response",
|
|
162
|
+
rawContent: response.content,
|
|
163
163
|
}, null, 2));
|
|
164
164
|
}
|
|
165
165
|
}
|
|
166
166
|
else {
|
|
167
|
-
console.log(chalk.bold.green(
|
|
167
|
+
console.log(chalk.bold.green("\nā
Analysis Complete\n"));
|
|
168
168
|
if (parsedResult) {
|
|
169
169
|
const formatted = formatGuardianResult(parsedResult);
|
|
170
170
|
console.log(chalk.white(formatted));
|
|
171
171
|
}
|
|
172
172
|
else {
|
|
173
|
-
console.log(chalk.yellow(
|
|
173
|
+
console.log(chalk.yellow("ā ļø Warning: Could not parse JSON response, displaying raw output:\n"));
|
|
174
174
|
console.log(chalk.white(response.content));
|
|
175
175
|
}
|
|
176
176
|
if (response.usage) {
|
|
@@ -179,7 +179,7 @@ async function runReviewCommand(filePath, options) {
|
|
|
179
179
|
}
|
|
180
180
|
}
|
|
181
181
|
catch (error) {
|
|
182
|
-
throw error instanceof Error ? error : new Error(
|
|
182
|
+
throw error instanceof Error ? error : new Error("Unknown error");
|
|
183
183
|
}
|
|
184
184
|
}
|
|
185
185
|
//# sourceMappingURL=review.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"review.js","sourceRoot":"","sources":["../../src/commands/review.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AACxE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EACL,OAAO,EACP,SAAS,EACT,iBAAiB,GAGlB,MAAM,wBAAwB,CAAC;AAChC,OAAO,
|
|
1
|
+
{"version":3,"file":"review.js","sourceRoot":"","sources":["../../src/commands/review.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,wBAAgB,mBAAmB,IAAI,OAAO,CAU7C;
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,wBAAgB,mBAAmB,IAAI,OAAO,CAU7C;AA4JD,eAAO,MAAM,aAAa,SAAwB,CAAC;AACnD,eAAe,mBAAmB,CAAC"}
|
package/dist/commands/status.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import { Command } from
|
|
2
|
-
import chalk from
|
|
3
|
-
import ora from
|
|
4
|
-
import { getProjectStatus, calculateProgress } from
|
|
5
|
-
import { validateProject } from
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
import ora from "ora";
|
|
4
|
+
import { getProjectStatus, calculateProgress } from "../utils/status.js";
|
|
5
|
+
import { validateProject } from "../utils/validator.js";
|
|
6
6
|
export function createStatusCommand() {
|
|
7
|
-
const statusCommand = new Command(
|
|
7
|
+
const statusCommand = new Command("status");
|
|
8
8
|
statusCommand
|
|
9
|
-
.description(
|
|
9
|
+
.description("Show project health dashboard and sprint progress")
|
|
10
10
|
.action(async () => {
|
|
11
11
|
await runStatus();
|
|
12
12
|
});
|
|
@@ -14,63 +14,69 @@ export function createStatusCommand() {
|
|
|
14
14
|
}
|
|
15
15
|
async function runStatus() {
|
|
16
16
|
const cwd = process.cwd();
|
|
17
|
-
console.log(chalk.bold.cyan(
|
|
18
|
-
const spinner = ora(
|
|
17
|
+
console.log(chalk.bold.cyan("\nš Cortex TMS Status Dashboard\n"));
|
|
18
|
+
const spinner = ora("Gathering project information...").start();
|
|
19
19
|
try {
|
|
20
20
|
const status = await getProjectStatus(cwd);
|
|
21
21
|
const validation = await validateProject(cwd, { strict: false });
|
|
22
|
-
spinner.succeed(
|
|
23
|
-
console.log(chalk.bold(
|
|
24
|
-
console.log(` ${chalk.cyan(
|
|
25
|
-
console.log(` ${chalk.cyan(
|
|
22
|
+
spinner.succeed("Project information loaded");
|
|
23
|
+
console.log(chalk.bold("\nš·ļø Project Identity"));
|
|
24
|
+
console.log(` ${chalk.cyan("Name:")} ${status.projectName}`);
|
|
25
|
+
console.log(` ${chalk.cyan("Scope:")} ${formatScope(status.scope)} ${getScopeEmoji(status.scope)}`);
|
|
26
26
|
if (status.config) {
|
|
27
|
-
console.log(` ${chalk.cyan(
|
|
27
|
+
console.log(` ${chalk.cyan("TMS Version:")} ${status.config.version}`);
|
|
28
28
|
}
|
|
29
|
-
console.log(chalk.bold(
|
|
30
|
-
const healthEmoji = validation.passed ?
|
|
31
|
-
const healthText = validation.passed
|
|
29
|
+
console.log(chalk.bold("\nš Project Health"));
|
|
30
|
+
const healthEmoji = validation.passed ? "ā
" : "ā ļø";
|
|
31
|
+
const healthText = validation.passed
|
|
32
|
+
? chalk.green("Healthy")
|
|
33
|
+
: chalk.yellow("Issues Found");
|
|
32
34
|
console.log(` ${healthEmoji} ${healthText}`);
|
|
33
|
-
console.log(` ${chalk.cyan(
|
|
35
|
+
console.log(` ${chalk.cyan("Checks:")} ${validation.summary.passed}/${validation.summary.total} passed`);
|
|
34
36
|
if (validation.summary.warnings > 0) {
|
|
35
|
-
console.log(` ${chalk.yellow(
|
|
37
|
+
console.log(` ${chalk.yellow("ā ")} ${validation.summary.warnings} warnings`);
|
|
36
38
|
}
|
|
37
39
|
if (validation.summary.errors > 0) {
|
|
38
|
-
console.log(` ${chalk.red(
|
|
40
|
+
console.log(` ${chalk.red("ā")} ${validation.summary.errors} errors`);
|
|
39
41
|
}
|
|
40
42
|
if (status.sprint) {
|
|
41
|
-
console.log(chalk.bold(
|
|
42
|
-
console.log(` ${chalk.cyan(
|
|
43
|
+
console.log(chalk.bold("\nšÆ Current Sprint"));
|
|
44
|
+
console.log(` ${chalk.cyan("Name:")} ${status.sprint.name}`);
|
|
43
45
|
if (status.sprint.description) {
|
|
44
|
-
console.log(` ${chalk.cyan(
|
|
46
|
+
console.log(` ${chalk.cyan("Focus:")} ${status.sprint.description}`);
|
|
45
47
|
}
|
|
46
48
|
const progress = calculateProgress(status.sprint);
|
|
47
49
|
const progressBar = createProgressBar(progress, 20);
|
|
48
|
-
const progressColor = progress === 100
|
|
49
|
-
|
|
50
|
-
|
|
50
|
+
const progressColor = progress === 100
|
|
51
|
+
? chalk.green
|
|
52
|
+
: progress >= 50
|
|
53
|
+
? chalk.yellow
|
|
54
|
+
: chalk.gray;
|
|
55
|
+
console.log(` ${chalk.cyan("Progress:")} ${progressBar} ${progressColor(`${progress}%`)}`);
|
|
56
|
+
console.log(` ${chalk.cyan("Tasks:")} ${status.sprint.completedTasks} done, ${status.sprint.inProgressTasks} in progress, ${status.sprint.todoTasks} todo`);
|
|
51
57
|
}
|
|
52
58
|
else {
|
|
53
|
-
console.log(chalk.bold(
|
|
54
|
-
console.log(chalk.gray(
|
|
59
|
+
console.log(chalk.bold("\nšÆ Current Sprint"));
|
|
60
|
+
console.log(chalk.gray(" No active sprint found in NEXT-TASKS.md"));
|
|
55
61
|
}
|
|
56
|
-
console.log(chalk.bold(
|
|
62
|
+
console.log(chalk.bold("\nš Backlog"));
|
|
57
63
|
if (status.backlogSize > 0) {
|
|
58
|
-
console.log(` ${chalk.cyan(
|
|
64
|
+
console.log(` ${chalk.cyan("Future Enhancements:")} ${status.backlogSize} items pending`);
|
|
59
65
|
}
|
|
60
66
|
else {
|
|
61
|
-
console.log(chalk.gray(
|
|
67
|
+
console.log(chalk.gray(" No backlog items found in FUTURE-ENHANCEMENTS.md"));
|
|
62
68
|
}
|
|
63
|
-
console.log(chalk.bold(
|
|
64
|
-
console.log(chalk.gray(
|
|
65
|
-
console.log(chalk.gray(
|
|
69
|
+
console.log(chalk.bold("\nā” Quick Actions"));
|
|
70
|
+
console.log(chalk.gray(" Run"), chalk.cyan("cortex-tms validate"), chalk.gray("for detailed health checks"));
|
|
71
|
+
console.log(chalk.gray(" Edit"), chalk.cyan("NEXT-TASKS.md"), chalk.gray("to update sprint tasks"));
|
|
66
72
|
if (validation.summary.warnings > 0 || validation.summary.errors > 0) {
|
|
67
|
-
console.log(chalk.gray(
|
|
73
|
+
console.log(chalk.gray(" Run"), chalk.cyan("cortex-tms validate --fix"), chalk.gray("to auto-fix issues"));
|
|
68
74
|
}
|
|
69
75
|
console.log();
|
|
70
76
|
}
|
|
71
77
|
catch (error) {
|
|
72
|
-
spinner.fail(
|
|
73
|
-
throw error instanceof Error ? error : new Error(
|
|
78
|
+
spinner.fail("Failed to gather project information");
|
|
79
|
+
throw error instanceof Error ? error : new Error("Unknown error");
|
|
74
80
|
}
|
|
75
81
|
}
|
|
76
82
|
function formatScope(scope) {
|
|
@@ -78,21 +84,21 @@ function formatScope(scope) {
|
|
|
78
84
|
}
|
|
79
85
|
function getScopeEmoji(scope) {
|
|
80
86
|
switch (scope.toLowerCase()) {
|
|
81
|
-
case
|
|
82
|
-
return
|
|
83
|
-
case
|
|
84
|
-
return
|
|
85
|
-
case
|
|
86
|
-
return
|
|
87
|
+
case "nano":
|
|
88
|
+
return "š¬";
|
|
89
|
+
case "standard":
|
|
90
|
+
return "š¦";
|
|
91
|
+
case "enterprise":
|
|
92
|
+
return "š¢";
|
|
87
93
|
default:
|
|
88
|
-
return
|
|
94
|
+
return "ā";
|
|
89
95
|
}
|
|
90
96
|
}
|
|
91
97
|
function createProgressBar(progress, width) {
|
|
92
98
|
const filled = Math.round((progress / 100) * width);
|
|
93
99
|
const empty = width - filled;
|
|
94
100
|
const filledColor = progress === 100 ? chalk.green : progress >= 50 ? chalk.yellow : chalk.gray;
|
|
95
|
-
return `[${filledColor(
|
|
101
|
+
return `[${filledColor("ā".repeat(filled))}${chalk.gray("ā".repeat(empty))}]`;
|
|
96
102
|
}
|
|
97
103
|
export const statusCommand = createStatusCommand();
|
|
98
104
|
export default createStatusCommand;
|