clavix 4.9.0 → 4.11.1
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/dist/cli/commands/analyze.d.ts +17 -0
- package/dist/cli/commands/analyze.js +133 -0
- package/dist/cli/commands/execute.d.ts +2 -2
- package/dist/cli/commands/execute.js +23 -21
- package/dist/cli/commands/improve.d.ts +32 -0
- package/dist/cli/commands/improve.js +250 -0
- package/dist/cli/commands/init.js +35 -29
- package/dist/cli/commands/prd.js +14 -13
- package/dist/cli/commands/prompts/clear.d.ts +2 -2
- package/dist/cli/commands/prompts/clear.js +32 -26
- package/dist/cli/commands/prompts/list.js +14 -19
- package/dist/cli/commands/summarize.js +23 -14
- package/dist/cli/commands/verify.d.ts +2 -2
- package/dist/cli/commands/verify.js +26 -24
- package/dist/core/doc-injector.d.ts +2 -0
- package/dist/core/doc-injector.js +12 -13
- package/dist/core/intelligence/intent-detector.d.ts +4 -0
- package/dist/core/intelligence/intent-detector.js +8 -18
- package/dist/core/intelligence/pattern-library.d.ts +16 -10
- package/dist/core/intelligence/pattern-library.js +47 -35
- package/dist/core/intelligence/patterns/actionability-enhancer.d.ts +2 -2
- package/dist/core/intelligence/patterns/actionability-enhancer.js +1 -1
- package/dist/core/intelligence/patterns/alternative-phrasing-generator.d.ts +2 -2
- package/dist/core/intelligence/patterns/alternative-phrasing-generator.js +1 -1
- package/dist/core/intelligence/patterns/ambiguity-detector.d.ts +2 -2
- package/dist/core/intelligence/patterns/ambiguity-detector.js +1 -1
- package/dist/core/intelligence/patterns/assumption-explicitizer.d.ts +2 -2
- package/dist/core/intelligence/patterns/assumption-explicitizer.js +1 -1
- package/dist/core/intelligence/patterns/base-pattern.d.ts +10 -7
- package/dist/core/intelligence/patterns/base-pattern.js +7 -3
- package/dist/core/intelligence/patterns/completeness-validator.d.ts +2 -2
- package/dist/core/intelligence/patterns/completeness-validator.js +1 -1
- package/dist/core/intelligence/patterns/conciseness-filter.d.ts +2 -2
- package/dist/core/intelligence/patterns/conciseness-filter.js +1 -1
- package/dist/core/intelligence/patterns/context-precision.d.ts +2 -2
- package/dist/core/intelligence/patterns/context-precision.js +1 -1
- package/dist/core/intelligence/patterns/conversation-summarizer.d.ts +2 -2
- package/dist/core/intelligence/patterns/conversation-summarizer.js +1 -1
- package/dist/core/intelligence/patterns/dependency-identifier.d.ts +2 -2
- package/dist/core/intelligence/patterns/dependency-identifier.js +1 -1
- package/dist/core/intelligence/patterns/domain-context-enricher.d.ts +2 -2
- package/dist/core/intelligence/patterns/domain-context-enricher.js +1 -1
- package/dist/core/intelligence/patterns/edge-case-identifier.d.ts +2 -2
- package/dist/core/intelligence/patterns/edge-case-identifier.js +1 -1
- package/dist/core/intelligence/patterns/error-tolerance-enhancer.d.ts +2 -2
- package/dist/core/intelligence/patterns/error-tolerance-enhancer.js +1 -1
- package/dist/core/intelligence/patterns/implicit-requirement-extractor.d.ts +2 -2
- package/dist/core/intelligence/patterns/implicit-requirement-extractor.js +1 -1
- package/dist/core/intelligence/patterns/objective-clarifier.d.ts +2 -2
- package/dist/core/intelligence/patterns/objective-clarifier.js +1 -1
- package/dist/core/intelligence/patterns/output-format-enforcer.d.ts +2 -2
- package/dist/core/intelligence/patterns/output-format-enforcer.js +1 -1
- package/dist/core/intelligence/patterns/prd-structure-enforcer.d.ts +2 -2
- package/dist/core/intelligence/patterns/prd-structure-enforcer.js +1 -1
- package/dist/core/intelligence/patterns/prerequisite-identifier.d.ts +2 -2
- package/dist/core/intelligence/patterns/prerequisite-identifier.js +1 -1
- package/dist/core/intelligence/patterns/requirement-prioritizer.d.ts +2 -2
- package/dist/core/intelligence/patterns/requirement-prioritizer.js +1 -1
- package/dist/core/intelligence/patterns/scope-definer.d.ts +2 -2
- package/dist/core/intelligence/patterns/scope-definer.js +1 -1
- package/dist/core/intelligence/patterns/step-decomposer.d.ts +2 -2
- package/dist/core/intelligence/patterns/step-decomposer.js +1 -1
- package/dist/core/intelligence/patterns/structure-organizer.d.ts +2 -2
- package/dist/core/intelligence/patterns/structure-organizer.js +1 -1
- package/dist/core/intelligence/patterns/success-criteria-enforcer.d.ts +2 -2
- package/dist/core/intelligence/patterns/success-criteria-enforcer.js +1 -1
- package/dist/core/intelligence/patterns/success-metrics-enforcer.d.ts +2 -2
- package/dist/core/intelligence/patterns/success-metrics-enforcer.js +1 -1
- package/dist/core/intelligence/patterns/technical-context-enricher.d.ts +2 -2
- package/dist/core/intelligence/patterns/technical-context-enricher.js +1 -1
- package/dist/core/intelligence/patterns/topic-coherence-analyzer.d.ts +2 -2
- package/dist/core/intelligence/patterns/topic-coherence-analyzer.js +1 -1
- package/dist/core/intelligence/patterns/user-persona-enricher.d.ts +2 -2
- package/dist/core/intelligence/patterns/user-persona-enricher.js +1 -1
- package/dist/core/intelligence/patterns/validation-checklist-creator.d.ts +2 -2
- package/dist/core/intelligence/patterns/validation-checklist-creator.js +1 -1
- package/dist/core/intelligence/types.d.ts +6 -3
- package/dist/core/intelligence/universal-optimizer.d.ts +20 -15
- package/dist/core/intelligence/universal-optimizer.js +44 -29
- package/dist/core/prompt-manager.d.ts +24 -22
- package/dist/core/prompt-manager.js +65 -92
- package/dist/core/verification-manager.d.ts +8 -7
- package/dist/core/verification-manager.js +34 -41
- package/dist/templates/agents/octo.md +6 -8
- package/dist/templates/slash-commands/_canonical/execute.md +52 -41
- package/dist/templates/slash-commands/_canonical/implement.md +28 -0
- package/dist/templates/slash-commands/_canonical/improve.md +604 -0
- package/dist/templates/slash-commands/_canonical/verify.md +1 -1
- package/dist/templates/slash-commands/_components/agent-protocols/cli-reference.md +12 -0
- package/dist/templates/slash-commands/_components/agent-protocols/self-correction.md +20 -1
- package/dist/templates/slash-commands/_components/sections/escalation-factors.md +25 -25
- package/dist/templates/slash-commands/_components/sections/pattern-visibility.md +27 -33
- package/dist/types/config.d.ts +1 -2
- package/dist/types/verification.d.ts +7 -6
- package/dist/types/verification.js +2 -1
- package/package.json +1 -1
- package/dist/templates/slash-commands/_canonical/deep.md +0 -616
- package/dist/templates/slash-commands/_canonical/fast.md +0 -503
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Command } from '@oclif/core';
|
|
2
|
+
export default class Analyze extends Command {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static flags: {
|
|
6
|
+
pretty: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
7
|
+
};
|
|
8
|
+
static args: {
|
|
9
|
+
prompt: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
|
|
10
|
+
};
|
|
11
|
+
run(): Promise<void>;
|
|
12
|
+
/**
|
|
13
|
+
* v4.11: Calculate escalation with unified improve mode
|
|
14
|
+
*/
|
|
15
|
+
private calculateEscalation;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=analyze.d.ts.map
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { Command, Args, Flags } from '@oclif/core';
|
|
2
|
+
import { UniversalOptimizer } from '../../core/intelligence/index.js';
|
|
3
|
+
export default class Analyze extends Command {
|
|
4
|
+
static description = 'Analyze a prompt and return structured JSON with intent, quality, and escalation data';
|
|
5
|
+
static examples = [
|
|
6
|
+
'<%= config.bin %> <%= command.id %> "Create a login page"',
|
|
7
|
+
'<%= config.bin %> <%= command.id %> "Build an API for user management" --pretty',
|
|
8
|
+
];
|
|
9
|
+
static flags = {
|
|
10
|
+
pretty: Flags.boolean({
|
|
11
|
+
char: 'p',
|
|
12
|
+
description: 'Pretty-print the JSON output',
|
|
13
|
+
default: false,
|
|
14
|
+
}),
|
|
15
|
+
};
|
|
16
|
+
static args = {
|
|
17
|
+
prompt: Args.string({
|
|
18
|
+
description: 'The prompt to analyze',
|
|
19
|
+
required: true,
|
|
20
|
+
}),
|
|
21
|
+
};
|
|
22
|
+
async run() {
|
|
23
|
+
const { args, flags } = await this.parse(Analyze);
|
|
24
|
+
if (!args.prompt || args.prompt.trim().length === 0) {
|
|
25
|
+
const errorOutput = {
|
|
26
|
+
error: 'No prompt provided',
|
|
27
|
+
message: 'Please provide a prompt to analyze',
|
|
28
|
+
};
|
|
29
|
+
console.log(JSON.stringify(errorOutput, null, flags.pretty ? 2 : 0));
|
|
30
|
+
this.exit(1);
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
const optimizer = new UniversalOptimizer();
|
|
34
|
+
// v4.11: Use 'improve' mode for analysis
|
|
35
|
+
const result = await optimizer.optimize(args.prompt, 'improve');
|
|
36
|
+
// Calculate escalation score and recommendation
|
|
37
|
+
const escalation = this.calculateEscalation(result);
|
|
38
|
+
// Build the analysis result
|
|
39
|
+
const analysisResult = {
|
|
40
|
+
intent: result.intent.primaryIntent,
|
|
41
|
+
confidence: result.intent.confidence,
|
|
42
|
+
quality: {
|
|
43
|
+
overall: Math.round(result.quality.overall),
|
|
44
|
+
clarity: Math.round(result.quality.clarity),
|
|
45
|
+
efficiency: Math.round(result.quality.efficiency),
|
|
46
|
+
structure: Math.round(result.quality.structure),
|
|
47
|
+
completeness: Math.round(result.quality.completeness),
|
|
48
|
+
actionability: Math.round(result.quality.actionability),
|
|
49
|
+
specificity: Math.round(result.quality.specificity ?? 0),
|
|
50
|
+
},
|
|
51
|
+
escalation,
|
|
52
|
+
characteristics: {
|
|
53
|
+
hasCodeContext: result.intent.characteristics.hasCodeContext,
|
|
54
|
+
hasTechnicalTerms: result.intent.characteristics.hasTechnicalTerms,
|
|
55
|
+
isOpenEnded: result.intent.characteristics.isOpenEnded,
|
|
56
|
+
needsStructure: result.intent.characteristics.needsStructure,
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
// Output as JSON
|
|
60
|
+
console.log(JSON.stringify(analysisResult, null, flags.pretty ? 2 : 0));
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* v4.11: Calculate escalation with unified improve mode
|
|
64
|
+
*/
|
|
65
|
+
calculateEscalation(result) {
|
|
66
|
+
const factors = [];
|
|
67
|
+
let score = 0;
|
|
68
|
+
// Quality-based factors
|
|
69
|
+
if (result.quality.overall < 50) {
|
|
70
|
+
score += 30;
|
|
71
|
+
factors.push('low overall quality');
|
|
72
|
+
}
|
|
73
|
+
else if (result.quality.overall < 65) {
|
|
74
|
+
score += 15;
|
|
75
|
+
factors.push('moderate quality - could be improved');
|
|
76
|
+
}
|
|
77
|
+
if (result.quality.clarity < 50) {
|
|
78
|
+
score += 15;
|
|
79
|
+
factors.push('unclear objective');
|
|
80
|
+
}
|
|
81
|
+
if (result.quality.completeness < 50) {
|
|
82
|
+
score += 20;
|
|
83
|
+
factors.push('missing technical requirements');
|
|
84
|
+
}
|
|
85
|
+
if (result.quality.actionability < 50) {
|
|
86
|
+
score += 15;
|
|
87
|
+
factors.push('vague scope');
|
|
88
|
+
}
|
|
89
|
+
// Intent-based factors
|
|
90
|
+
if (result.intent.primaryIntent === 'planning') {
|
|
91
|
+
score += 15;
|
|
92
|
+
factors.push('planning intent - benefits from exploration');
|
|
93
|
+
}
|
|
94
|
+
if (result.intent.primaryIntent === 'prd-generation') {
|
|
95
|
+
score += 25;
|
|
96
|
+
factors.push('PRD generation - needs strategic planning');
|
|
97
|
+
}
|
|
98
|
+
// Characteristics-based factors
|
|
99
|
+
if (result.intent.characteristics.isOpenEnded && result.intent.characteristics.needsStructure) {
|
|
100
|
+
score += 10;
|
|
101
|
+
factors.push('open-ended without structure');
|
|
102
|
+
}
|
|
103
|
+
// Confidence-based factors
|
|
104
|
+
if (result.intent.confidence < 70) {
|
|
105
|
+
score += 10;
|
|
106
|
+
factors.push('low intent confidence');
|
|
107
|
+
}
|
|
108
|
+
// v4.11: Determine recommendation based on score and intent
|
|
109
|
+
let recommend = 'improve';
|
|
110
|
+
let recommendedDepth = 'standard';
|
|
111
|
+
if (result.intent.primaryIntent === 'prd-generation') {
|
|
112
|
+
recommend = 'prd';
|
|
113
|
+
}
|
|
114
|
+
else if (score >= 60 || result.quality.overall < 50) {
|
|
115
|
+
recommendedDepth = 'comprehensive';
|
|
116
|
+
}
|
|
117
|
+
else if (score >= 35) {
|
|
118
|
+
recommendedDepth = 'comprehensive';
|
|
119
|
+
}
|
|
120
|
+
// Check for strategic keywords that suggest PRD mode
|
|
121
|
+
const strategicIntents = ['planning', 'prd-generation', 'documentation'];
|
|
122
|
+
if (strategicIntents.includes(result.intent.primaryIntent) && score >= 50) {
|
|
123
|
+
recommend = 'prd';
|
|
124
|
+
}
|
|
125
|
+
return {
|
|
126
|
+
score: Math.min(100, score),
|
|
127
|
+
recommend,
|
|
128
|
+
recommendedDepth: recommend === 'improve' ? recommendedDepth : undefined,
|
|
129
|
+
factors,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=analyze.js.map
|
|
@@ -4,8 +4,8 @@ export default class Execute extends Command {
|
|
|
4
4
|
static examples: string[];
|
|
5
5
|
static flags: {
|
|
6
6
|
latest: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
standard: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
8
|
+
comprehensive: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
9
9
|
id: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
10
10
|
};
|
|
11
11
|
run(): Promise<void>;
|
|
@@ -4,12 +4,12 @@ import inquirer from 'inquirer';
|
|
|
4
4
|
import { PromptManager } from '../../core/prompt-manager.js';
|
|
5
5
|
import { ChecklistParser } from '../../core/checklist-parser.js';
|
|
6
6
|
export default class Execute extends Command {
|
|
7
|
-
static description = 'Execute a saved prompt from
|
|
7
|
+
static description = 'Execute a saved prompt from improve optimization';
|
|
8
8
|
static examples = [
|
|
9
9
|
'<%= config.bin %> <%= command.id %> --latest',
|
|
10
|
-
'<%= config.bin %> <%= command.id %> --latest --
|
|
11
|
-
'<%= config.bin %> <%= command.id %> --latest --
|
|
12
|
-
'<%= config.bin %> <%= command.id %> --id
|
|
10
|
+
'<%= config.bin %> <%= command.id %> --latest --standard',
|
|
11
|
+
'<%= config.bin %> <%= command.id %> --latest --comprehensive',
|
|
12
|
+
'<%= config.bin %> <%= command.id %> --id std-20250117-143022-a3f2',
|
|
13
13
|
'<%= config.bin %> <%= command.id %>',
|
|
14
14
|
];
|
|
15
15
|
static flags = {
|
|
@@ -17,12 +17,14 @@ export default class Execute extends Command {
|
|
|
17
17
|
description: 'Auto-select latest prompt (any type)',
|
|
18
18
|
default: false,
|
|
19
19
|
}),
|
|
20
|
-
|
|
21
|
-
|
|
20
|
+
standard: Flags.boolean({
|
|
21
|
+
char: 's',
|
|
22
|
+
description: 'Filter to standard depth prompts only (use with --latest)',
|
|
22
23
|
default: false,
|
|
23
24
|
}),
|
|
24
|
-
|
|
25
|
-
|
|
25
|
+
comprehensive: Flags.boolean({
|
|
26
|
+
char: 'c',
|
|
27
|
+
description: 'Filter to comprehensive depth prompts only (use with --latest)',
|
|
26
28
|
default: false,
|
|
27
29
|
}),
|
|
28
30
|
id: Flags.string({
|
|
@@ -38,8 +40,7 @@ export default class Execute extends Command {
|
|
|
38
40
|
if (allPrompts.length === 0) {
|
|
39
41
|
console.log(chalk.yellow('\n⚠️ No prompts found\n'));
|
|
40
42
|
console.log(chalk.cyan('Generate an optimized prompt first:'));
|
|
41
|
-
console.log(chalk.cyan(' /clavix:
|
|
42
|
-
console.log(chalk.cyan(' /clavix:deep "your requirement"'));
|
|
43
|
+
console.log(chalk.cyan(' /clavix:improve "your requirement"'));
|
|
43
44
|
console.log();
|
|
44
45
|
return;
|
|
45
46
|
}
|
|
@@ -57,18 +58,18 @@ export default class Execute extends Command {
|
|
|
57
58
|
// Auto-select latest with optional filtering
|
|
58
59
|
else if (flags.latest) {
|
|
59
60
|
let filtered = allPrompts;
|
|
60
|
-
// Apply
|
|
61
|
-
if (flags.
|
|
62
|
-
filtered = allPrompts.filter((p) => p.
|
|
61
|
+
// Apply depth filter
|
|
62
|
+
if (flags.standard && !flags.comprehensive) {
|
|
63
|
+
filtered = allPrompts.filter((p) => p.depthUsed === 'standard');
|
|
63
64
|
}
|
|
64
|
-
else if (flags.
|
|
65
|
-
filtered = allPrompts.filter((p) => p.
|
|
65
|
+
else if (flags.comprehensive && !flags.standard) {
|
|
66
|
+
filtered = allPrompts.filter((p) => p.depthUsed === 'comprehensive');
|
|
66
67
|
}
|
|
67
68
|
if (filtered.length === 0) {
|
|
68
|
-
const
|
|
69
|
-
console.log(chalk.yellow(`\n⚠️ No ${
|
|
70
|
-
console.log(chalk.cyan(`Generate a
|
|
71
|
-
console.log(chalk.cyan(` /clavix
|
|
69
|
+
const depth = flags.standard ? 'standard' : flags.comprehensive ? 'comprehensive' : 'any';
|
|
70
|
+
console.log(chalk.yellow(`\n⚠️ No ${depth} prompts found\n`));
|
|
71
|
+
console.log(chalk.cyan(`Generate a prompt first:`));
|
|
72
|
+
console.log(chalk.cyan(` /clavix:improve "your requirement"`));
|
|
72
73
|
console.log();
|
|
73
74
|
return;
|
|
74
75
|
}
|
|
@@ -94,8 +95,9 @@ export default class Execute extends Command {
|
|
|
94
95
|
const status = p.executed ? chalk.green('✓') : chalk.gray('○');
|
|
95
96
|
const age = p.ageInDays === 0 ? 'today' : `${p.ageInDays}d ago`;
|
|
96
97
|
const ageColor = (p.ageInDays || 0) > 30 ? chalk.red : (p.ageInDays || 0) > 7 ? chalk.yellow : chalk.gray;
|
|
98
|
+
const depthLabel = p.depthUsed === 'comprehensive' ? 'comp' : 'std';
|
|
97
99
|
return {
|
|
98
|
-
name: `${status} [${
|
|
100
|
+
name: `${status} [${depthLabel}] ${p.originalPrompt.substring(0, 60)}... ${ageColor(`(${age})`)}`,
|
|
99
101
|
value: p.id,
|
|
100
102
|
short: p.id,
|
|
101
103
|
};
|
|
@@ -119,7 +121,7 @@ export default class Execute extends Command {
|
|
|
119
121
|
}
|
|
120
122
|
// Display prompt header
|
|
121
123
|
console.log(chalk.bold.cyan(`\n🎯 Executing Prompt: ${prompt.id}\n`));
|
|
122
|
-
console.log(chalk.gray(`
|
|
124
|
+
console.log(chalk.gray(`Depth: ${prompt.depthUsed}`));
|
|
123
125
|
console.log(chalk.gray(`Created: ${new Date(prompt.timestamp).toLocaleDateString()}`));
|
|
124
126
|
console.log(chalk.gray(`Age: ${prompt.ageInDays} days\n`));
|
|
125
127
|
// Display full prompt content
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { Command } from '@oclif/core';
|
|
2
|
+
/**
|
|
3
|
+
* v4.11: Unified improve command with smart depth auto-detection
|
|
4
|
+
*
|
|
5
|
+
* Replaces the old fast/deep commands with intelligent depth selection:
|
|
6
|
+
* - Quality score >= 75: auto-comprehensive
|
|
7
|
+
* - Quality score 60-74: ask user (borderline)
|
|
8
|
+
* - Quality score < 60: auto-standard
|
|
9
|
+
*
|
|
10
|
+
* Users can override with --comprehensive or --standard flags.
|
|
11
|
+
*/
|
|
12
|
+
export default class Improve extends Command {
|
|
13
|
+
static description: string;
|
|
14
|
+
static examples: string[];
|
|
15
|
+
static flags: {
|
|
16
|
+
comprehensive: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
17
|
+
standard: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
18
|
+
'analysis-only': import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
19
|
+
};
|
|
20
|
+
static args: {
|
|
21
|
+
prompt: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
|
|
22
|
+
};
|
|
23
|
+
run(): Promise<void>;
|
|
24
|
+
/**
|
|
25
|
+
* v4.11: Smart depth auto-detection based on quality score
|
|
26
|
+
*/
|
|
27
|
+
private autoDetectDepth;
|
|
28
|
+
private displayOutput;
|
|
29
|
+
private displayAnalysisOnly;
|
|
30
|
+
private savePrompt;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=improve.d.ts.map
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
import { Command, Args, Flags } from '@oclif/core';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import inquirer from 'inquirer';
|
|
4
|
+
import { UniversalOptimizer } from '../../core/intelligence/index.js';
|
|
5
|
+
import { PromptManager } from '../../core/prompt-manager.js';
|
|
6
|
+
/**
|
|
7
|
+
* v4.11: Unified improve command with smart depth auto-detection
|
|
8
|
+
*
|
|
9
|
+
* Replaces the old fast/deep commands with intelligent depth selection:
|
|
10
|
+
* - Quality score >= 75: auto-comprehensive
|
|
11
|
+
* - Quality score 60-74: ask user (borderline)
|
|
12
|
+
* - Quality score < 60: auto-standard
|
|
13
|
+
*
|
|
14
|
+
* Users can override with --comprehensive or --standard flags.
|
|
15
|
+
*/
|
|
16
|
+
export default class Improve extends Command {
|
|
17
|
+
static description = 'Improve a prompt with smart quality-based depth selection (replaces fast/deep)';
|
|
18
|
+
static examples = [
|
|
19
|
+
'<%= config.bin %> <%= command.id %> "Create a login page"',
|
|
20
|
+
'<%= config.bin %> <%= command.id %> "Build an API for user management" --comprehensive',
|
|
21
|
+
'<%= config.bin %> <%= command.id %> "Fix the button styling" --standard',
|
|
22
|
+
'<%= config.bin %> <%= command.id %> "Design a notification system" --analysis-only',
|
|
23
|
+
];
|
|
24
|
+
static flags = {
|
|
25
|
+
comprehensive: Flags.boolean({
|
|
26
|
+
char: 'c',
|
|
27
|
+
description: 'Force comprehensive depth (alternative approaches, edge cases, validation)',
|
|
28
|
+
default: false,
|
|
29
|
+
}),
|
|
30
|
+
standard: Flags.boolean({
|
|
31
|
+
char: 's',
|
|
32
|
+
description: 'Force standard depth (quick improvements)',
|
|
33
|
+
default: false,
|
|
34
|
+
}),
|
|
35
|
+
'analysis-only': Flags.boolean({
|
|
36
|
+
description: 'Show only quality analysis without improved prompt',
|
|
37
|
+
default: false,
|
|
38
|
+
}),
|
|
39
|
+
};
|
|
40
|
+
static args = {
|
|
41
|
+
prompt: Args.string({
|
|
42
|
+
description: 'The prompt to improve',
|
|
43
|
+
required: true,
|
|
44
|
+
}),
|
|
45
|
+
};
|
|
46
|
+
async run() {
|
|
47
|
+
const { args, flags } = await this.parse(Improve);
|
|
48
|
+
if (!args.prompt || args.prompt.trim().length === 0) {
|
|
49
|
+
console.log(chalk.red('\n✗ Please provide a prompt to improve\n'));
|
|
50
|
+
console.log(chalk.gray('Example:'), chalk.cyan('clavix improve "Create a login page"'));
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
// Determine depth level
|
|
54
|
+
let depthLevel;
|
|
55
|
+
if (flags.comprehensive && flags.standard) {
|
|
56
|
+
console.log(chalk.yellow('\n⚠️ Cannot use both --comprehensive and --standard\n'));
|
|
57
|
+
console.log(chalk.gray('Using smart auto-detection instead...\n'));
|
|
58
|
+
depthLevel = await this.autoDetectDepth(args.prompt);
|
|
59
|
+
}
|
|
60
|
+
else if (flags.comprehensive) {
|
|
61
|
+
depthLevel = 'comprehensive';
|
|
62
|
+
console.log(chalk.bold.cyan('\n🔍 Performing comprehensive analysis...\n'));
|
|
63
|
+
console.log(chalk.gray('This may take up to 15 seconds for thorough exploration\n'));
|
|
64
|
+
}
|
|
65
|
+
else if (flags.standard) {
|
|
66
|
+
depthLevel = 'standard';
|
|
67
|
+
console.log(chalk.bold.cyan('\n🔍 Performing standard analysis...\n'));
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
depthLevel = await this.autoDetectDepth(args.prompt);
|
|
71
|
+
}
|
|
72
|
+
// Run optimization
|
|
73
|
+
const optimizer = new UniversalOptimizer();
|
|
74
|
+
const result = await optimizer.optimize(args.prompt, 'improve', { depthLevel });
|
|
75
|
+
// Handle --analysis-only flag
|
|
76
|
+
if (flags['analysis-only']) {
|
|
77
|
+
this.displayAnalysisOnly(result, depthLevel);
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
// Display full output
|
|
81
|
+
this.displayOutput(result, depthLevel);
|
|
82
|
+
// Save prompt to file system
|
|
83
|
+
await this.savePrompt(result, depthLevel);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* v4.11: Smart depth auto-detection based on quality score
|
|
87
|
+
*/
|
|
88
|
+
async autoDetectDepth(prompt) {
|
|
89
|
+
console.log(chalk.bold.cyan('\n🔍 Analyzing prompt quality...\n'));
|
|
90
|
+
// Quick analysis to determine depth
|
|
91
|
+
const optimizer = new UniversalOptimizer();
|
|
92
|
+
const quickResult = await optimizer.optimize(prompt, 'improve', { depthLevel: 'standard' });
|
|
93
|
+
const qualityScore = quickResult.quality.overall;
|
|
94
|
+
// v4.11 thresholds
|
|
95
|
+
if (qualityScore >= 75) {
|
|
96
|
+
// High quality - recommend comprehensive for extra polish
|
|
97
|
+
console.log(chalk.cyan(`Quality score: ${qualityScore.toFixed(0)}% - Recommending comprehensive depth\n`));
|
|
98
|
+
return 'comprehensive';
|
|
99
|
+
}
|
|
100
|
+
else if (qualityScore >= 60) {
|
|
101
|
+
// Borderline - ask user
|
|
102
|
+
console.log(chalk.yellow(`Quality score: ${qualityScore.toFixed(0)}% - Borderline quality\n`));
|
|
103
|
+
const { choice } = await inquirer.prompt([
|
|
104
|
+
{
|
|
105
|
+
type: 'list',
|
|
106
|
+
name: 'choice',
|
|
107
|
+
message: 'Choose analysis depth:',
|
|
108
|
+
choices: [
|
|
109
|
+
{
|
|
110
|
+
name: 'Comprehensive (alternative approaches, edge cases, validation)',
|
|
111
|
+
value: 'comprehensive',
|
|
112
|
+
},
|
|
113
|
+
{ name: 'Standard (quick improvements)', value: 'standard' },
|
|
114
|
+
],
|
|
115
|
+
},
|
|
116
|
+
]);
|
|
117
|
+
console.log();
|
|
118
|
+
return choice;
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
// Low quality - standard is fine, comprehensive would add noise
|
|
122
|
+
console.log(chalk.cyan(`Quality score: ${qualityScore.toFixed(0)}% - Using standard depth\n`));
|
|
123
|
+
return 'standard';
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
displayOutput(result, depthLevel) {
|
|
127
|
+
const modeLabel = depthLevel === 'comprehensive' ? 'Comprehensive' : 'Standard';
|
|
128
|
+
console.log(chalk.bold.cyan(`🔍 ${modeLabel} Analysis Complete\n`));
|
|
129
|
+
// Intent Analysis
|
|
130
|
+
console.log(chalk.bold.cyan('🎯 Intent Analysis:\n'));
|
|
131
|
+
console.log(chalk.cyan(` Type: ${result.intent.primaryIntent}`));
|
|
132
|
+
console.log(chalk.cyan(` Confidence: ${result.intent.confidence}%`));
|
|
133
|
+
if (depthLevel === 'comprehensive') {
|
|
134
|
+
console.log(chalk.cyan(` Characteristics:`));
|
|
135
|
+
console.log(chalk.cyan(` • Has code context: ${result.intent.characteristics.hasCodeContext ? 'Yes' : 'No'}`));
|
|
136
|
+
console.log(chalk.cyan(` • Technical terms: ${result.intent.characteristics.hasTechnicalTerms ? 'Yes' : 'No'}`));
|
|
137
|
+
console.log(chalk.cyan(` • Open-ended: ${result.intent.characteristics.isOpenEnded ? 'Yes' : 'No'}`));
|
|
138
|
+
console.log(chalk.cyan(` • Needs structure: ${result.intent.characteristics.needsStructure ? 'Yes' : 'No'}`));
|
|
139
|
+
}
|
|
140
|
+
console.log();
|
|
141
|
+
// Quality Metrics
|
|
142
|
+
console.log(chalk.bold('📊 Quality Metrics:\n'));
|
|
143
|
+
const getScoreColor = (score) => {
|
|
144
|
+
if (score >= 80)
|
|
145
|
+
return chalk.green;
|
|
146
|
+
if (score >= 60)
|
|
147
|
+
return chalk.yellow;
|
|
148
|
+
return chalk.red;
|
|
149
|
+
};
|
|
150
|
+
console.log(getScoreColor(result.quality.clarity)(` Clarity: ${result.quality.clarity.toFixed(0)}%`));
|
|
151
|
+
console.log(getScoreColor(result.quality.efficiency)(` Efficiency: ${result.quality.efficiency.toFixed(0)}%`));
|
|
152
|
+
console.log(getScoreColor(result.quality.structure)(` Structure: ${result.quality.structure.toFixed(0)}%`));
|
|
153
|
+
console.log(getScoreColor(result.quality.completeness)(` Completeness: ${result.quality.completeness.toFixed(0)}%`));
|
|
154
|
+
console.log(getScoreColor(result.quality.actionability)(` Actionability: ${result.quality.actionability.toFixed(0)}%`));
|
|
155
|
+
console.log(getScoreColor(result.quality.overall).bold(`\n Overall: ${result.quality.overall.toFixed(0)}%\n`));
|
|
156
|
+
// Strengths
|
|
157
|
+
if (result.quality.strengths.length > 0) {
|
|
158
|
+
console.log(chalk.bold.green('✅ Strengths:\n'));
|
|
159
|
+
result.quality.strengths.forEach((strength) => {
|
|
160
|
+
console.log(chalk.green(` • ${strength}`));
|
|
161
|
+
});
|
|
162
|
+
console.log();
|
|
163
|
+
}
|
|
164
|
+
// Improvements Applied
|
|
165
|
+
if (result.improvements.length > 0) {
|
|
166
|
+
console.log(chalk.bold.magenta('✨ Improvements Applied:\n'));
|
|
167
|
+
result.improvements.forEach((improvement) => {
|
|
168
|
+
const emoji = improvement.impact === 'high' ? '🔥' : improvement.impact === 'medium' ? '⚡' : '💡';
|
|
169
|
+
console.log(chalk.magenta(` ${emoji} ${improvement.description} [${improvement.dimension}]`));
|
|
170
|
+
});
|
|
171
|
+
console.log();
|
|
172
|
+
}
|
|
173
|
+
// Enhanced Prompt
|
|
174
|
+
console.log(chalk.bold.cyan('✨ Enhanced Prompt:\n'));
|
|
175
|
+
console.log(chalk.dim('─'.repeat(80)));
|
|
176
|
+
console.log(result.enhanced);
|
|
177
|
+
console.log(chalk.dim('─'.repeat(80)));
|
|
178
|
+
console.log();
|
|
179
|
+
// Patterns Applied (comprehensive mode)
|
|
180
|
+
if (depthLevel === 'comprehensive' && result.appliedPatterns.length > 0) {
|
|
181
|
+
console.log(chalk.bold.blue('🧩 Patterns Applied:\n'));
|
|
182
|
+
result.appliedPatterns.forEach((pattern) => {
|
|
183
|
+
console.log(chalk.blue(` • ${pattern.name}: ${pattern.description}`));
|
|
184
|
+
});
|
|
185
|
+
console.log();
|
|
186
|
+
}
|
|
187
|
+
// Remaining Issues
|
|
188
|
+
if (result.quality.remainingIssues && result.quality.remainingIssues.length > 0) {
|
|
189
|
+
console.log(chalk.bold.yellow('⚠️ Remaining Areas for Improvement:\n'));
|
|
190
|
+
result.quality.remainingIssues.forEach((issue) => {
|
|
191
|
+
console.log(chalk.yellow(` • ${issue}`));
|
|
192
|
+
});
|
|
193
|
+
console.log();
|
|
194
|
+
}
|
|
195
|
+
// Recommendation
|
|
196
|
+
const recommendation = new UniversalOptimizer().getRecommendation(result);
|
|
197
|
+
if (recommendation) {
|
|
198
|
+
console.log(chalk.blue.bold('💡 Recommendation:'));
|
|
199
|
+
console.log(chalk.blue(` ${recommendation}\n`));
|
|
200
|
+
}
|
|
201
|
+
console.log(chalk.gray(`⚡ Processed in ${result.processingTimeMs}ms\n`));
|
|
202
|
+
if (depthLevel === 'comprehensive') {
|
|
203
|
+
console.log(chalk.gray('💡 Tip: The enhanced prompt includes alternative approaches, edge cases, and validation checklist\n'));
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
console.log(chalk.gray('💡 Tip: Copy the enhanced prompt above and use it with your AI agent\n'));
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
displayAnalysisOnly(result, depthLevel) {
|
|
210
|
+
console.log(chalk.bold.cyan('🎯 Intent Analysis:\n'));
|
|
211
|
+
console.log(chalk.cyan(` Type: ${result.intent.primaryIntent}`));
|
|
212
|
+
console.log(chalk.cyan(` Confidence: ${result.intent.confidence}%`));
|
|
213
|
+
console.log(chalk.cyan(` Depth: ${depthLevel}`));
|
|
214
|
+
if (depthLevel === 'comprehensive') {
|
|
215
|
+
console.log(chalk.cyan(` Characteristics:`));
|
|
216
|
+
console.log(chalk.cyan(` • Has code context: ${result.intent.characteristics.hasCodeContext ? 'Yes' : 'No'}`));
|
|
217
|
+
console.log(chalk.cyan(` • Technical terms: ${result.intent.characteristics.hasTechnicalTerms ? 'Yes' : 'No'}`));
|
|
218
|
+
console.log(chalk.cyan(` • Open-ended: ${result.intent.characteristics.isOpenEnded ? 'Yes' : 'No'}`));
|
|
219
|
+
console.log(chalk.cyan(` • Needs structure: ${result.intent.characteristics.needsStructure ? 'Yes' : 'No'}`));
|
|
220
|
+
}
|
|
221
|
+
console.log();
|
|
222
|
+
console.log(chalk.bold('📊 Quality Scores:\n'));
|
|
223
|
+
console.log(chalk.white(` Clarity: ${result.quality.clarity.toFixed(0)}%`));
|
|
224
|
+
console.log(chalk.white(` Efficiency: ${result.quality.efficiency.toFixed(0)}%`));
|
|
225
|
+
console.log(chalk.white(` Structure: ${result.quality.structure.toFixed(0)}%`));
|
|
226
|
+
console.log(chalk.white(` Completeness: ${result.quality.completeness.toFixed(0)}%`));
|
|
227
|
+
console.log(chalk.white(` Actionability: ${result.quality.actionability.toFixed(0)}%`));
|
|
228
|
+
console.log(chalk.bold(`\n Overall: ${result.quality.overall.toFixed(0)}%\n`));
|
|
229
|
+
if (result.quality.strengths.length > 0) {
|
|
230
|
+
console.log(chalk.bold.green('✅ Strengths:\n'));
|
|
231
|
+
result.quality.strengths.forEach((strength) => {
|
|
232
|
+
console.log(chalk.green(` • ${strength}`));
|
|
233
|
+
});
|
|
234
|
+
console.log();
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
async savePrompt(result, depthLevel) {
|
|
238
|
+
try {
|
|
239
|
+
const manager = new PromptManager();
|
|
240
|
+
const content = result.enhanced;
|
|
241
|
+
await manager.savePrompt(content, depthLevel, result.original);
|
|
242
|
+
console.log(chalk.gray(`💾 Saved prompt to .clavix/outputs/prompts/\n`));
|
|
243
|
+
}
|
|
244
|
+
catch (error) {
|
|
245
|
+
console.log(chalk.yellow('⚠️ Could not save prompt to file system'));
|
|
246
|
+
console.log(chalk.gray('Error: ' + (error instanceof Error ? error.message : 'Unknown error')));
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
//# sourceMappingURL=improve.js.map
|