clavix 4.11.2 → 5.0.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 +72 -60
- package/dist/cli/commands/update.js +9 -10
- package/dist/templates/agents/agents.md +14 -8
- package/dist/templates/agents/copilot-instructions.md +1 -1
- package/dist/templates/instructions/core/verification.md +2 -2
- package/dist/templates/slash-commands/_canonical/archive.md +83 -121
- package/dist/templates/slash-commands/_canonical/execute.md +32 -42
- package/dist/templates/slash-commands/_canonical/implement.md +32 -44
- package/dist/templates/slash-commands/_canonical/improve.md +14 -53
- package/dist/templates/slash-commands/_canonical/start.md +1 -1
- package/dist/templates/slash-commands/_canonical/summarize.md +8 -8
- package/dist/templates/slash-commands/_components/agent-protocols/cli-reference.md +84 -180
- package/dist/templates/slash-commands/_components/agent-protocols/error-handling.md +2 -2
- package/dist/templates/slash-commands/_components/agent-protocols/file-formats.md +41 -59
- package/dist/templates/slash-commands/_components/agent-protocols/state-assertion.md +1 -1
- package/dist/templates/slash-commands/_components/references/intent-types.md +1 -1
- package/dist/templates/slash-commands/_components/sections/file-saving-protocol.md +20 -27
- package/dist/templates/slash-commands/_components/sections/pattern-visibility.md +29 -46
- package/dist/templates/slash-commands/_components/troubleshooting/file-not-saved.md +4 -5
- package/dist/types/config.d.ts +57 -0
- package/dist/utils/legacy-command-cleanup.js +31 -4
- package/package.json +5 -4
- package/dist/cli/commands/analyze.d.ts +0 -17
- package/dist/cli/commands/analyze.js +0 -133
- package/dist/cli/commands/archive.d.ts +0 -36
- package/dist/cli/commands/archive.js +0 -266
- package/dist/cli/commands/deep.d.ts +0 -17
- package/dist/cli/commands/deep.js +0 -170
- package/dist/cli/commands/execute.d.ts +0 -15
- package/dist/cli/commands/execute.js +0 -168
- package/dist/cli/commands/fast.d.ts +0 -18
- package/dist/cli/commands/fast.js +0 -219
- package/dist/cli/commands/implement.d.ts +0 -24
- package/dist/cli/commands/implement.js +0 -289
- package/dist/cli/commands/improve.d.ts +0 -32
- package/dist/cli/commands/improve.js +0 -250
- package/dist/cli/commands/list.d.ts +0 -17
- package/dist/cli/commands/list.js +0 -217
- package/dist/cli/commands/plan.d.ts +0 -21
- package/dist/cli/commands/plan.js +0 -297
- package/dist/cli/commands/prd.d.ts +0 -24
- package/dist/cli/commands/prd.js +0 -321
- package/dist/cli/commands/prompts/clear.d.ts +0 -16
- package/dist/cli/commands/prompts/clear.js +0 -222
- package/dist/cli/commands/prompts/list.d.ts +0 -8
- package/dist/cli/commands/prompts/list.js +0 -88
- package/dist/cli/commands/show.d.ts +0 -21
- package/dist/cli/commands/show.js +0 -191
- package/dist/cli/commands/start.d.ts +0 -40
- package/dist/cli/commands/start.js +0 -210
- package/dist/cli/commands/summarize.d.ts +0 -17
- package/dist/cli/commands/summarize.js +0 -196
- package/dist/cli/commands/task-complete.d.ts +0 -27
- package/dist/cli/commands/task-complete.js +0 -269
- package/dist/cli/commands/verify.d.ts +0 -28
- package/dist/cli/commands/verify.js +0 -349
- package/dist/core/archive-manager.d.ts +0 -100
- package/dist/core/archive-manager.js +0 -302
- package/dist/core/basic-checklist-generator.d.ts +0 -35
- package/dist/core/basic-checklist-generator.js +0 -344
- package/dist/core/checklist-parser.d.ts +0 -48
- package/dist/core/checklist-parser.js +0 -238
- package/dist/core/config-manager.d.ts +0 -149
- package/dist/core/config-manager.js +0 -230
- package/dist/core/conversation-analyzer.d.ts +0 -86
- package/dist/core/conversation-analyzer.js +0 -387
- package/dist/core/conversation-quality-tracker.d.ts +0 -81
- package/dist/core/conversation-quality-tracker.js +0 -195
- package/dist/core/git-manager.d.ts +0 -126
- package/dist/core/git-manager.js +0 -282
- package/dist/core/intelligence/confidence-calculator.d.ts +0 -93
- package/dist/core/intelligence/confidence-calculator.js +0 -124
- package/dist/core/intelligence/index.d.ts +0 -11
- package/dist/core/intelligence/index.js +0 -15
- package/dist/core/intelligence/intent-detector.d.ts +0 -54
- package/dist/core/intelligence/intent-detector.js +0 -723
- package/dist/core/intelligence/pattern-library.d.ts +0 -104
- package/dist/core/intelligence/pattern-library.js +0 -339
- package/dist/core/intelligence/patterns/actionability-enhancer.d.ts +0 -27
- package/dist/core/intelligence/patterns/actionability-enhancer.js +0 -192
- package/dist/core/intelligence/patterns/alternative-phrasing-generator.d.ts +0 -29
- package/dist/core/intelligence/patterns/alternative-phrasing-generator.js +0 -239
- package/dist/core/intelligence/patterns/ambiguity-detector.d.ts +0 -22
- package/dist/core/intelligence/patterns/ambiguity-detector.js +0 -196
- package/dist/core/intelligence/patterns/assumption-explicitizer.d.ts +0 -30
- package/dist/core/intelligence/patterns/assumption-explicitizer.js +0 -296
- package/dist/core/intelligence/patterns/base-pattern.d.ts +0 -192
- package/dist/core/intelligence/patterns/base-pattern.js +0 -103
- package/dist/core/intelligence/patterns/completeness-validator.d.ts +0 -27
- package/dist/core/intelligence/patterns/completeness-validator.js +0 -221
- package/dist/core/intelligence/patterns/conciseness-filter.d.ts +0 -20
- package/dist/core/intelligence/patterns/conciseness-filter.js +0 -92
- package/dist/core/intelligence/patterns/context-precision.d.ts +0 -32
- package/dist/core/intelligence/patterns/context-precision.js +0 -389
- package/dist/core/intelligence/patterns/conversation-summarizer.d.ts +0 -30
- package/dist/core/intelligence/patterns/conversation-summarizer.js +0 -277
- package/dist/core/intelligence/patterns/dependency-identifier.d.ts +0 -23
- package/dist/core/intelligence/patterns/dependency-identifier.js +0 -166
- package/dist/core/intelligence/patterns/domain-context-enricher.d.ts +0 -21
- package/dist/core/intelligence/patterns/domain-context-enricher.js +0 -198
- package/dist/core/intelligence/patterns/edge-case-identifier.d.ts +0 -30
- package/dist/core/intelligence/patterns/edge-case-identifier.js +0 -269
- package/dist/core/intelligence/patterns/error-tolerance-enhancer.d.ts +0 -22
- package/dist/core/intelligence/patterns/error-tolerance-enhancer.js +0 -179
- package/dist/core/intelligence/patterns/implicit-requirement-extractor.d.ts +0 -24
- package/dist/core/intelligence/patterns/implicit-requirement-extractor.js +0 -259
- package/dist/core/intelligence/patterns/objective-clarifier.d.ts +0 -22
- package/dist/core/intelligence/patterns/objective-clarifier.js +0 -126
- package/dist/core/intelligence/patterns/output-format-enforcer.d.ts +0 -22
- package/dist/core/intelligence/patterns/output-format-enforcer.js +0 -151
- package/dist/core/intelligence/patterns/prd-structure-enforcer.d.ts +0 -23
- package/dist/core/intelligence/patterns/prd-structure-enforcer.js +0 -183
- package/dist/core/intelligence/patterns/prerequisite-identifier.d.ts +0 -23
- package/dist/core/intelligence/patterns/prerequisite-identifier.js +0 -221
- package/dist/core/intelligence/patterns/requirement-prioritizer.d.ts +0 -24
- package/dist/core/intelligence/patterns/requirement-prioritizer.js +0 -134
- package/dist/core/intelligence/patterns/scope-definer.d.ts +0 -26
- package/dist/core/intelligence/patterns/scope-definer.js +0 -236
- package/dist/core/intelligence/patterns/step-decomposer.d.ts +0 -31
- package/dist/core/intelligence/patterns/step-decomposer.js +0 -242
- package/dist/core/intelligence/patterns/structure-organizer.d.ts +0 -31
- package/dist/core/intelligence/patterns/structure-organizer.js +0 -218
- package/dist/core/intelligence/patterns/success-criteria-enforcer.d.ts +0 -22
- package/dist/core/intelligence/patterns/success-criteria-enforcer.js +0 -165
- package/dist/core/intelligence/patterns/success-metrics-enforcer.d.ts +0 -24
- package/dist/core/intelligence/patterns/success-metrics-enforcer.js +0 -165
- package/dist/core/intelligence/patterns/technical-context-enricher.d.ts +0 -25
- package/dist/core/intelligence/patterns/technical-context-enricher.js +0 -165
- package/dist/core/intelligence/patterns/topic-coherence-analyzer.d.ts +0 -26
- package/dist/core/intelligence/patterns/topic-coherence-analyzer.js +0 -300
- package/dist/core/intelligence/patterns/user-persona-enricher.d.ts +0 -24
- package/dist/core/intelligence/patterns/user-persona-enricher.js +0 -141
- package/dist/core/intelligence/patterns/validation-checklist-creator.d.ts +0 -31
- package/dist/core/intelligence/patterns/validation-checklist-creator.js +0 -242
- package/dist/core/intelligence/quality-assessor.d.ts +0 -51
- package/dist/core/intelligence/quality-assessor.js +0 -505
- package/dist/core/intelligence/types.d.ts +0 -111
- package/dist/core/intelligence/types.js +0 -3
- package/dist/core/intelligence/universal-optimizer.d.ts +0 -84
- package/dist/core/intelligence/universal-optimizer.js +0 -371
- package/dist/core/prd-generator.d.ts +0 -76
- package/dist/core/prd-generator.js +0 -173
- package/dist/core/prompt-manager.d.ts +0 -110
- package/dist/core/prompt-manager.js +0 -274
- package/dist/core/prompt-optimizer.d.ts +0 -268
- package/dist/core/prompt-optimizer.js +0 -959
- package/dist/core/question-engine.d.ts +0 -167
- package/dist/core/question-engine.js +0 -356
- package/dist/core/session-manager.d.ts +0 -139
- package/dist/core/session-manager.js +0 -365
- package/dist/core/task-manager.d.ts +0 -211
- package/dist/core/task-manager.js +0 -981
- package/dist/core/verification-hooks.d.ts +0 -67
- package/dist/core/verification-hooks.js +0 -309
- package/dist/core/verification-manager.d.ts +0 -107
- package/dist/core/verification-manager.js +0 -415
- package/dist/index 2.js +0 -13
- package/dist/index.d 2.ts +0 -4
- package/dist/types/session.d.ts +0 -78
- package/dist/types/session.js +0 -8
- package/dist/types/verification.d.ts +0 -205
- package/dist/types/verification.js +0 -9
|
@@ -1,219 +0,0 @@
|
|
|
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
|
-
export default class Fast extends Command {
|
|
7
|
-
static description = 'Quickly improve a prompt with smart quality assessment and triage';
|
|
8
|
-
static examples = [
|
|
9
|
-
'<%= config.bin %> <%= command.id %> "Create a login page"',
|
|
10
|
-
'<%= config.bin %> <%= command.id %> "Build an API for user management"',
|
|
11
|
-
];
|
|
12
|
-
static flags = {
|
|
13
|
-
'analysis-only': Flags.boolean({
|
|
14
|
-
description: 'Show only quality analysis without improved prompt',
|
|
15
|
-
default: false,
|
|
16
|
-
}),
|
|
17
|
-
};
|
|
18
|
-
static args = {
|
|
19
|
-
prompt: Args.string({
|
|
20
|
-
description: 'The prompt to improve',
|
|
21
|
-
required: true,
|
|
22
|
-
}),
|
|
23
|
-
};
|
|
24
|
-
async run() {
|
|
25
|
-
const { args, flags } = await this.parse(Fast);
|
|
26
|
-
if (!args.prompt || args.prompt.trim().length === 0) {
|
|
27
|
-
console.log(chalk.red('\n✗ Please provide a prompt to improve\n'));
|
|
28
|
-
console.log(chalk.gray('Example:'), chalk.cyan('clavix fast "Create a login page"'));
|
|
29
|
-
return;
|
|
30
|
-
}
|
|
31
|
-
console.log(chalk.bold.cyan('\n🔍 Analyzing and optimizing prompt...\n'));
|
|
32
|
-
const optimizer = new UniversalOptimizer();
|
|
33
|
-
const result = await optimizer.optimize(args.prompt, 'fast');
|
|
34
|
-
// Check if deep mode is recommended
|
|
35
|
-
const shouldRecommendDeep = optimizer.shouldRecommendDeepMode(result);
|
|
36
|
-
if (shouldRecommendDeep) {
|
|
37
|
-
console.log(chalk.bold.yellow('⚠️ Smart Triage Alert\n'));
|
|
38
|
-
console.log(chalk.yellow('Deep analysis is recommended for this prompt because:'));
|
|
39
|
-
if (result.intent.primaryIntent === 'planning') {
|
|
40
|
-
console.log(chalk.yellow(` • Planning intent detected - benefits from comprehensive exploration`));
|
|
41
|
-
}
|
|
42
|
-
if (result.quality.overall < 65) {
|
|
43
|
-
console.log(chalk.yellow(` • Quality score ${result.quality.overall.toFixed(0)}% - can be significantly improved`));
|
|
44
|
-
}
|
|
45
|
-
if (result.intent.characteristics.isOpenEnded && result.intent.characteristics.needsStructure) {
|
|
46
|
-
console.log(chalk.yellow(` • Open-ended prompt without clear structure`));
|
|
47
|
-
}
|
|
48
|
-
console.log();
|
|
49
|
-
const { proceed } = await inquirer.prompt([
|
|
50
|
-
{
|
|
51
|
-
type: 'list',
|
|
52
|
-
name: 'proceed',
|
|
53
|
-
message: 'How would you like to proceed?',
|
|
54
|
-
choices: [
|
|
55
|
-
{ name: 'Switch to deep mode (recommended)', value: 'deep' },
|
|
56
|
-
{ name: 'Continue with fast mode', value: 'fast' },
|
|
57
|
-
],
|
|
58
|
-
},
|
|
59
|
-
]);
|
|
60
|
-
if (proceed === 'deep') {
|
|
61
|
-
console.log(chalk.cyan('\n🔍 Switching to deep mode...\n'));
|
|
62
|
-
const deepResult = await optimizer.optimize(args.prompt, 'deep');
|
|
63
|
-
this.displayDeepModeOutput(deepResult);
|
|
64
|
-
await this.savePrompt(deepResult);
|
|
65
|
-
return;
|
|
66
|
-
}
|
|
67
|
-
console.log(chalk.yellow('\n⚠️ Proceeding with fast mode as requested\n'));
|
|
68
|
-
}
|
|
69
|
-
// Handle --analysis-only flag
|
|
70
|
-
if (flags['analysis-only']) {
|
|
71
|
-
this.displayAnalysisOnly(result);
|
|
72
|
-
return;
|
|
73
|
-
}
|
|
74
|
-
// Display full analysis
|
|
75
|
-
this.displayFastModeOutput(result);
|
|
76
|
-
// Save prompt to file system
|
|
77
|
-
await this.savePrompt(result);
|
|
78
|
-
}
|
|
79
|
-
displayFastModeOutput(result) {
|
|
80
|
-
// Display intent detection
|
|
81
|
-
console.log(chalk.bold.cyan('🎯 Intent Analysis:\n'));
|
|
82
|
-
console.log(chalk.cyan(` Type: ${result.intent.primaryIntent}`));
|
|
83
|
-
console.log(chalk.cyan(` Confidence: ${result.intent.confidence}%\n`));
|
|
84
|
-
// Display quality assessment
|
|
85
|
-
console.log(chalk.bold('📊 Quality Assessment:\n'));
|
|
86
|
-
const getScoreColor = (score) => {
|
|
87
|
-
if (score >= 80)
|
|
88
|
-
return chalk.green;
|
|
89
|
-
if (score >= 60)
|
|
90
|
-
return chalk.yellow;
|
|
91
|
-
return chalk.red;
|
|
92
|
-
};
|
|
93
|
-
console.log(getScoreColor(result.quality.clarity)(` Clarity: ${result.quality.clarity.toFixed(0)}%`));
|
|
94
|
-
console.log(getScoreColor(result.quality.efficiency)(` Efficiency: ${result.quality.efficiency.toFixed(0)}%`));
|
|
95
|
-
console.log(getScoreColor(result.quality.structure)(` Structure: ${result.quality.structure.toFixed(0)}%`));
|
|
96
|
-
console.log(getScoreColor(result.quality.completeness)(` Completeness: ${result.quality.completeness.toFixed(0)}%`));
|
|
97
|
-
console.log(getScoreColor(result.quality.actionability)(` Actionability: ${result.quality.actionability.toFixed(0)}%`));
|
|
98
|
-
console.log(getScoreColor(result.quality.overall).bold(`\n Overall: ${result.quality.overall.toFixed(0)}%\n`));
|
|
99
|
-
// Display strengths if any
|
|
100
|
-
if (result.quality.strengths.length > 0) {
|
|
101
|
-
console.log(chalk.bold.green('✅ Strengths:\n'));
|
|
102
|
-
result.quality.strengths.forEach((strength) => {
|
|
103
|
-
console.log(chalk.green(` • ${strength}`));
|
|
104
|
-
});
|
|
105
|
-
console.log();
|
|
106
|
-
}
|
|
107
|
-
// Display improvements applied
|
|
108
|
-
if (result.improvements.length > 0) {
|
|
109
|
-
console.log(chalk.bold.magenta('✨ Improvements Applied:\n'));
|
|
110
|
-
result.improvements.forEach((improvement) => {
|
|
111
|
-
const emoji = improvement.impact === 'high' ? '🔥' : improvement.impact === 'medium' ? '⚡' : '💡';
|
|
112
|
-
console.log(chalk.magenta(` ${emoji} ${improvement.description}`));
|
|
113
|
-
});
|
|
114
|
-
console.log();
|
|
115
|
-
}
|
|
116
|
-
// Display enhanced prompt
|
|
117
|
-
console.log(chalk.bold.cyan('✨ Enhanced Prompt:\n'));
|
|
118
|
-
console.log(chalk.dim('─'.repeat(80)));
|
|
119
|
-
console.log(result.enhanced);
|
|
120
|
-
console.log(chalk.dim('─'.repeat(80)));
|
|
121
|
-
console.log();
|
|
122
|
-
// Recommendation
|
|
123
|
-
const recommendation = new UniversalOptimizer().getRecommendation(result);
|
|
124
|
-
if (recommendation) {
|
|
125
|
-
console.log(chalk.blue.bold('💡 Recommendation:'));
|
|
126
|
-
console.log(chalk.blue(` ${recommendation}\n`));
|
|
127
|
-
}
|
|
128
|
-
console.log(chalk.gray(`⚡ Processed in ${result.processingTimeMs}ms\n`));
|
|
129
|
-
console.log(chalk.gray('💡 Tip: Copy the enhanced prompt above and use it with your AI agent\n'));
|
|
130
|
-
}
|
|
131
|
-
displayDeepModeOutput(result) {
|
|
132
|
-
console.log(chalk.bold.cyan('🔍 Deep Analysis Complete\n'));
|
|
133
|
-
// Intent Analysis
|
|
134
|
-
console.log(chalk.bold.cyan('🎯 Intent Analysis:\n'));
|
|
135
|
-
console.log(chalk.cyan(` Type: ${result.intent.primaryIntent}`));
|
|
136
|
-
console.log(chalk.cyan(` Confidence: ${result.intent.confidence}%`));
|
|
137
|
-
console.log(chalk.cyan(` Characteristics:`));
|
|
138
|
-
console.log(chalk.cyan(` • Has code context: ${result.intent.characteristics.hasCodeContext ? 'Yes' : 'No'}`));
|
|
139
|
-
console.log(chalk.cyan(` • Technical terms: ${result.intent.characteristics.hasTechnicalTerms ? 'Yes' : 'No'}`));
|
|
140
|
-
console.log(chalk.cyan(` • Open-ended: ${result.intent.characteristics.isOpenEnded ? 'Yes' : 'No'}`));
|
|
141
|
-
console.log(chalk.cyan(` • Needs structure: ${result.intent.characteristics.needsStructure ? 'Yes' : 'No'}`));
|
|
142
|
-
console.log();
|
|
143
|
-
// Quality Metrics
|
|
144
|
-
console.log(chalk.bold('📊 Quality Metrics:\n'));
|
|
145
|
-
const getScoreColor = (score) => {
|
|
146
|
-
if (score >= 80)
|
|
147
|
-
return chalk.green;
|
|
148
|
-
if (score >= 60)
|
|
149
|
-
return chalk.yellow;
|
|
150
|
-
return chalk.red;
|
|
151
|
-
};
|
|
152
|
-
console.log(getScoreColor(result.quality.clarity)(` Clarity: ${result.quality.clarity.toFixed(0)}%`));
|
|
153
|
-
console.log(getScoreColor(result.quality.efficiency)(` Efficiency: ${result.quality.efficiency.toFixed(0)}%`));
|
|
154
|
-
console.log(getScoreColor(result.quality.structure)(` Structure: ${result.quality.structure.toFixed(0)}%`));
|
|
155
|
-
console.log(getScoreColor(result.quality.completeness)(` Completeness: ${result.quality.completeness.toFixed(0)}%`));
|
|
156
|
-
console.log(getScoreColor(result.quality.actionability)(` Actionability: ${result.quality.actionability.toFixed(0)}%`));
|
|
157
|
-
console.log(getScoreColor(result.quality.overall).bold(`\n Overall: ${result.quality.overall.toFixed(0)}%\n`));
|
|
158
|
-
// Improvements Applied
|
|
159
|
-
if (result.improvements.length > 0) {
|
|
160
|
-
console.log(chalk.bold.magenta('✨ Improvements Applied:\n'));
|
|
161
|
-
result.improvements.forEach((improvement) => {
|
|
162
|
-
const emoji = improvement.impact === 'high' ? '🔥' : improvement.impact === 'medium' ? '⚡' : '💡';
|
|
163
|
-
console.log(chalk.magenta(` ${emoji} ${improvement.description} [${improvement.dimension}]`));
|
|
164
|
-
});
|
|
165
|
-
console.log();
|
|
166
|
-
}
|
|
167
|
-
// Enhanced Prompt
|
|
168
|
-
console.log(chalk.bold.cyan('✨ Enhanced Prompt:\n'));
|
|
169
|
-
console.log(chalk.dim('─'.repeat(80)));
|
|
170
|
-
console.log(result.enhanced);
|
|
171
|
-
console.log(chalk.dim('─'.repeat(80)));
|
|
172
|
-
console.log();
|
|
173
|
-
// Deep mode features would go here (alternatives, edge cases, validation)
|
|
174
|
-
// TODO: Implement deep mode patterns to generate these
|
|
175
|
-
// Patterns Applied
|
|
176
|
-
if (result.appliedPatterns.length > 0) {
|
|
177
|
-
console.log(chalk.bold.blue('🧩 Patterns Applied:\n'));
|
|
178
|
-
result.appliedPatterns.forEach((pattern) => {
|
|
179
|
-
console.log(chalk.blue(` • ${pattern.name}: ${pattern.description}`));
|
|
180
|
-
});
|
|
181
|
-
console.log();
|
|
182
|
-
}
|
|
183
|
-
console.log(chalk.gray(`⚡ Processed in ${result.processingTimeMs}ms\n`));
|
|
184
|
-
console.log(chalk.gray('💡 Tip: Consider the alternatives and validation items above\n'));
|
|
185
|
-
}
|
|
186
|
-
displayAnalysisOnly(result) {
|
|
187
|
-
console.log(chalk.bold.cyan('🎯 Intent: '), chalk.cyan(result.intent.primaryIntent));
|
|
188
|
-
console.log(chalk.bold.cyan('🎯 Confidence: '), chalk.cyan(`${result.intent.confidence}%\n`));
|
|
189
|
-
console.log(chalk.bold('📊 Quality Scores:\n'));
|
|
190
|
-
console.log(chalk.white(` Clarity: ${result.quality.clarity.toFixed(0)}%`));
|
|
191
|
-
console.log(chalk.white(` Efficiency: ${result.quality.efficiency.toFixed(0)}%`));
|
|
192
|
-
console.log(chalk.white(` Structure: ${result.quality.structure.toFixed(0)}%`));
|
|
193
|
-
console.log(chalk.white(` Completeness: ${result.quality.completeness.toFixed(0)}%`));
|
|
194
|
-
console.log(chalk.white(` Actionability: ${result.quality.actionability.toFixed(0)}%`));
|
|
195
|
-
console.log(chalk.bold(`\n Overall: ${result.quality.overall.toFixed(0)}%\n`));
|
|
196
|
-
}
|
|
197
|
-
async savePrompt(result) {
|
|
198
|
-
try {
|
|
199
|
-
const manager = new PromptManager();
|
|
200
|
-
// Format enhanced prompt as content
|
|
201
|
-
const content = result.enhanced;
|
|
202
|
-
await manager.savePrompt(content, 'fast', result.original);
|
|
203
|
-
console.log(chalk.gray(`💾 Saved prompt to .clavix/outputs/prompts/fast/\n`));
|
|
204
|
-
}
|
|
205
|
-
catch (error) {
|
|
206
|
-
console.log(chalk.yellow('⚠️ Could not save prompt to file system'));
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
generateShortHash(text) {
|
|
210
|
-
let hash = 0;
|
|
211
|
-
for (let i = 0; i < text.length; i++) {
|
|
212
|
-
const char = text.charCodeAt(i);
|
|
213
|
-
hash = ((hash << 5) - hash) + char;
|
|
214
|
-
hash = hash & hash;
|
|
215
|
-
}
|
|
216
|
-
return Math.abs(hash).toString(16).slice(0, 4);
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
//# sourceMappingURL=fast.js.map
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import { Command } from '@oclif/core';
|
|
2
|
-
export default class Implement extends Command {
|
|
3
|
-
static description: string;
|
|
4
|
-
static examples: string[];
|
|
5
|
-
static flags: {
|
|
6
|
-
project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
7
|
-
'tasks-path': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
8
|
-
'no-git': import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
9
|
-
'commit-strategy': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
10
|
-
};
|
|
11
|
-
run(): Promise<void>;
|
|
12
|
-
/**
|
|
13
|
-
* Scans for PRD projects and shows interactive selection menu
|
|
14
|
-
* @param manager TaskManager instance
|
|
15
|
-
* @returns Selected project name or null
|
|
16
|
-
*/
|
|
17
|
-
private selectPrdProject;
|
|
18
|
-
/**
|
|
19
|
-
* Handles the scenario when selected PRD has no tasks
|
|
20
|
-
* @param projectName Name of the PRD project
|
|
21
|
-
*/
|
|
22
|
-
private handleNoTasks;
|
|
23
|
-
}
|
|
24
|
-
//# sourceMappingURL=implement.d.ts.map
|
|
@@ -1,289 +0,0 @@
|
|
|
1
|
-
import { Command, Flags } from '@oclif/core';
|
|
2
|
-
import chalk from 'chalk';
|
|
3
|
-
import inquirer from 'inquirer';
|
|
4
|
-
import { TaskManager } from '../../core/task-manager.js';
|
|
5
|
-
import { GitManager } from '../../core/git-manager.js';
|
|
6
|
-
import { AgentErrorMessages } from '../../utils/agent-error-messages.js';
|
|
7
|
-
import * as path from 'path';
|
|
8
|
-
import fs from 'fs-extra';
|
|
9
|
-
export default class Implement extends Command {
|
|
10
|
-
static description = 'Start implementing tasks from the task plan';
|
|
11
|
-
static examples = [
|
|
12
|
-
'<%= config.bin %> <%= command.id %>',
|
|
13
|
-
'<%= config.bin %> <%= command.id %> --project my-app',
|
|
14
|
-
'<%= config.bin %> <%= command.id %> --no-git',
|
|
15
|
-
];
|
|
16
|
-
static flags = {
|
|
17
|
-
project: Flags.string({
|
|
18
|
-
char: 'p',
|
|
19
|
-
description: 'PRD project name (defaults to most recent)',
|
|
20
|
-
}),
|
|
21
|
-
'tasks-path': Flags.string({
|
|
22
|
-
description: 'Direct path to tasks.md file',
|
|
23
|
-
}),
|
|
24
|
-
'no-git': Flags.boolean({
|
|
25
|
-
description: 'Skip git auto-commit setup',
|
|
26
|
-
default: false,
|
|
27
|
-
}),
|
|
28
|
-
'commit-strategy': Flags.string({
|
|
29
|
-
description: 'Auto-commit strategy: per-task, per-5-tasks, per-phase, none (default: none)',
|
|
30
|
-
options: ['per-task', 'per-5-tasks', 'per-phase', 'none'],
|
|
31
|
-
}),
|
|
32
|
-
};
|
|
33
|
-
async run() {
|
|
34
|
-
const { flags } = await this.parse(Implement);
|
|
35
|
-
console.log(chalk.bold.cyan('\nTask Implementation\n'));
|
|
36
|
-
try {
|
|
37
|
-
const manager = new TaskManager();
|
|
38
|
-
const gitManager = new GitManager();
|
|
39
|
-
// Interactive PRD selection (if no project specified)
|
|
40
|
-
if (!flags['tasks-path'] && !flags.project) {
|
|
41
|
-
const selectedProject = await this.selectPrdProject(manager);
|
|
42
|
-
if (selectedProject) {
|
|
43
|
-
flags.project = selectedProject;
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
// Find tasks.md file
|
|
47
|
-
let tasksPath;
|
|
48
|
-
if (flags['tasks-path']) {
|
|
49
|
-
tasksPath = flags['tasks-path'];
|
|
50
|
-
}
|
|
51
|
-
else {
|
|
52
|
-
console.log(chalk.dim('Looking for task plan...'));
|
|
53
|
-
const prdPath = await manager.findPrdDirectory(flags.project);
|
|
54
|
-
tasksPath = path.join(prdPath, 'tasks.md');
|
|
55
|
-
if (!(await fs.pathExists(tasksPath))) {
|
|
56
|
-
const projectName = flags.project || path.basename(path.dirname(tasksPath));
|
|
57
|
-
this.error(AgentErrorMessages.noTasksFound(projectName));
|
|
58
|
-
}
|
|
59
|
-
console.log(chalk.dim(`Found: ${tasksPath}\n`));
|
|
60
|
-
}
|
|
61
|
-
// Read tasks
|
|
62
|
-
const phases = await manager.readTasksFile(tasksPath);
|
|
63
|
-
const stats = manager.getTaskStats(phases);
|
|
64
|
-
// Display progress
|
|
65
|
-
console.log(chalk.bold('Progress:'));
|
|
66
|
-
console.log(chalk.cyan(` Completed: ${stats.completed}/${stats.total} tasks (${stats.percentage.toFixed(0)}%)`));
|
|
67
|
-
console.log(chalk.cyan(` Remaining: ${stats.remaining} tasks`));
|
|
68
|
-
console.log();
|
|
69
|
-
// Check if all tasks are done
|
|
70
|
-
if (stats.remaining === 0) {
|
|
71
|
-
console.log(chalk.bold.green('All tasks completed!\n'));
|
|
72
|
-
console.log(chalk.gray('Great work! All implementation tasks are done.\n'));
|
|
73
|
-
return;
|
|
74
|
-
}
|
|
75
|
-
// Find next task
|
|
76
|
-
const nextTask = manager.findFirstIncompleteTask(phases);
|
|
77
|
-
if (!nextTask) {
|
|
78
|
-
console.log(chalk.yellow('Warning: No incomplete tasks found\n'));
|
|
79
|
-
return;
|
|
80
|
-
}
|
|
81
|
-
// Display next task
|
|
82
|
-
console.log(chalk.bold('Next Task:'));
|
|
83
|
-
console.log(chalk.bold.white(` ${nextTask.description}`));
|
|
84
|
-
if (nextTask.prdReference) {
|
|
85
|
-
console.log(chalk.dim(` Reference: ${nextTask.prdReference}`));
|
|
86
|
-
}
|
|
87
|
-
console.log(chalk.dim(` Phase: ${nextTask.phase}`));
|
|
88
|
-
console.log();
|
|
89
|
-
// Git auto-commit setup (if not skipped)
|
|
90
|
-
let commitStrategy = 'none';
|
|
91
|
-
if (!flags['no-git']) {
|
|
92
|
-
const gitStatus = await gitManager.validateGitSetup();
|
|
93
|
-
if (gitStatus.isRepo) {
|
|
94
|
-
console.log(chalk.dim(`Git repository detected (branch: ${gitStatus.currentBranch})`));
|
|
95
|
-
console.log();
|
|
96
|
-
// Use commit strategy from flag, or default to 'none' (agent-friendly)
|
|
97
|
-
if (flags['commit-strategy']) {
|
|
98
|
-
commitStrategy = flags['commit-strategy'];
|
|
99
|
-
}
|
|
100
|
-
else {
|
|
101
|
-
commitStrategy = 'none';
|
|
102
|
-
console.log(chalk.dim('ℹ No git strategy specified. Use --commit-strategy flag to enable auto-commits.'));
|
|
103
|
-
}
|
|
104
|
-
if (commitStrategy !== 'none') {
|
|
105
|
-
console.log(chalk.green(`✓ Auto-commit enabled: ${commitStrategy}\n`));
|
|
106
|
-
}
|
|
107
|
-
else {
|
|
108
|
-
console.log(chalk.dim(' Auto-commits disabled (manual git workflow)\n'));
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
else {
|
|
112
|
-
console.log(chalk.yellow('⚠ Warning: Not a git repository - auto-commits disabled\n'));
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
// Display implementation instructions
|
|
116
|
-
console.log(chalk.bold.cyan('Implementation Instructions:\n'));
|
|
117
|
-
console.log(chalk.gray('The AI agent will now:'));
|
|
118
|
-
console.log(chalk.gray(` 1. Implement: ${nextTask.description}`));
|
|
119
|
-
console.log(chalk.gray(' 2. Mark the task as completed in tasks.md'));
|
|
120
|
-
if (commitStrategy !== 'none') {
|
|
121
|
-
console.log(chalk.gray(` 3. Create git commits (strategy: ${commitStrategy})`));
|
|
122
|
-
}
|
|
123
|
-
console.log(chalk.gray(' 4. Proceed to the next task'));
|
|
124
|
-
console.log();
|
|
125
|
-
// Save commit strategy to a config file for the AI agent to read
|
|
126
|
-
const configPath = path.join(path.dirname(tasksPath), '.clavix-implement-config.json');
|
|
127
|
-
await fs.writeJson(configPath, {
|
|
128
|
-
commitStrategy,
|
|
129
|
-
tasksPath,
|
|
130
|
-
currentTask: nextTask,
|
|
131
|
-
stats,
|
|
132
|
-
timestamp: new Date().toISOString(),
|
|
133
|
-
}, { spaces: 2 });
|
|
134
|
-
console.log(chalk.bold.green('Ready to implement!\n'));
|
|
135
|
-
console.log(chalk.dim('Configuration saved to:'));
|
|
136
|
-
console.log(chalk.dim(` ${configPath}\n`));
|
|
137
|
-
console.log(chalk.yellow('Important Notes for AI Agent:\n'));
|
|
138
|
-
console.log(chalk.gray(' • Follow the tasks in order from tasks.md'));
|
|
139
|
-
console.log(chalk.gray(' • Mark each completed task: change [ ] to [x]'));
|
|
140
|
-
console.log(chalk.gray(` • Current task: ${nextTask.description}`));
|
|
141
|
-
if (commitStrategy !== 'none') {
|
|
142
|
-
console.log(chalk.gray(` • Create git commits per strategy: ${commitStrategy}`));
|
|
143
|
-
}
|
|
144
|
-
console.log(chalk.gray(' • Use PRD as reference for implementation details'));
|
|
145
|
-
console.log();
|
|
146
|
-
console.log(chalk.dim('Tip: The AI agent can run "clavix implement" again to resume progress\n'));
|
|
147
|
-
}
|
|
148
|
-
catch (error) {
|
|
149
|
-
const errorMessage = error instanceof Error ? error.message : 'An unexpected error occurred';
|
|
150
|
-
this.error(errorMessage);
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
/**
|
|
154
|
-
* Scans for PRD projects and shows interactive selection menu
|
|
155
|
-
* @param manager TaskManager instance
|
|
156
|
-
* @returns Selected project name or null
|
|
157
|
-
*/
|
|
158
|
-
async selectPrdProject(manager) {
|
|
159
|
-
const outputsDir = path.join(process.cwd(), '.clavix', 'outputs');
|
|
160
|
-
if (!(await fs.pathExists(outputsDir))) {
|
|
161
|
-
return null; // No PRDs exist
|
|
162
|
-
}
|
|
163
|
-
// Scan for PRD projects (exclude 'archive' directory)
|
|
164
|
-
const entries = await fs.readdir(outputsDir, { withFileTypes: true });
|
|
165
|
-
const prdProjects = [];
|
|
166
|
-
for (const entry of entries) {
|
|
167
|
-
if (!entry.isDirectory() || entry.name === 'archive') {
|
|
168
|
-
continue;
|
|
169
|
-
}
|
|
170
|
-
const projectPath = path.join(outputsDir, entry.name);
|
|
171
|
-
const tasksPath = path.join(projectPath, 'tasks.md');
|
|
172
|
-
// Check if this directory has a PRD file
|
|
173
|
-
const hasPrd = await manager.hasPrdFile(projectPath);
|
|
174
|
-
if (!hasPrd) {
|
|
175
|
-
continue; // Not a PRD project
|
|
176
|
-
}
|
|
177
|
-
// Check if tasks.md exists
|
|
178
|
-
const hasTasks = await fs.pathExists(tasksPath);
|
|
179
|
-
let stats;
|
|
180
|
-
if (hasTasks) {
|
|
181
|
-
try {
|
|
182
|
-
const phases = await manager.readTasksFile(tasksPath);
|
|
183
|
-
stats = manager.getTaskStats(phases);
|
|
184
|
-
}
|
|
185
|
-
catch {
|
|
186
|
-
// Ignore read errors, treat as no stats
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
prdProjects.push({
|
|
190
|
-
name: entry.name,
|
|
191
|
-
hasTasks,
|
|
192
|
-
stats,
|
|
193
|
-
});
|
|
194
|
-
}
|
|
195
|
-
// No PRD projects found
|
|
196
|
-
if (prdProjects.length === 0) {
|
|
197
|
-
this.error(AgentErrorMessages.noPrdFound());
|
|
198
|
-
}
|
|
199
|
-
// Only one PRD - auto-select
|
|
200
|
-
if (prdProjects.length === 1) {
|
|
201
|
-
const project = prdProjects[0];
|
|
202
|
-
console.log(chalk.dim(`Auto-selected project: ${project.name}\n`));
|
|
203
|
-
// Check if it has tasks
|
|
204
|
-
if (!project.hasTasks) {
|
|
205
|
-
await this.handleNoTasks(project.name);
|
|
206
|
-
return null;
|
|
207
|
-
}
|
|
208
|
-
return project.name;
|
|
209
|
-
}
|
|
210
|
-
// Multiple PRDs - show selection menu
|
|
211
|
-
console.log(chalk.bold('Select a PRD project to implement:\n'));
|
|
212
|
-
const choices = prdProjects.map((project, index) => {
|
|
213
|
-
let label = `${index + 1}. ${project.name}`;
|
|
214
|
-
if (project.hasTasks && project.stats) {
|
|
215
|
-
const percentage = project.stats.percentage.toFixed(0);
|
|
216
|
-
label += chalk.dim(` - ${project.stats.completed}/${project.stats.total} tasks (${percentage}%)`);
|
|
217
|
-
}
|
|
218
|
-
else {
|
|
219
|
-
label += chalk.dim(' - No tasks generated');
|
|
220
|
-
}
|
|
221
|
-
return {
|
|
222
|
-
name: label,
|
|
223
|
-
value: project.name,
|
|
224
|
-
hasTasks: project.hasTasks,
|
|
225
|
-
};
|
|
226
|
-
});
|
|
227
|
-
const response = await inquirer.prompt([
|
|
228
|
-
{
|
|
229
|
-
type: 'list',
|
|
230
|
-
name: 'project',
|
|
231
|
-
message: 'Select project:',
|
|
232
|
-
choices: choices.map(c => ({ name: c.name, value: c.value })),
|
|
233
|
-
},
|
|
234
|
-
]);
|
|
235
|
-
const selectedProject = response.project;
|
|
236
|
-
const selected = choices.find(c => c.value === selectedProject);
|
|
237
|
-
// Handle "no tasks" scenario
|
|
238
|
-
if (selected && !selected.hasTasks) {
|
|
239
|
-
await this.handleNoTasks(selectedProject);
|
|
240
|
-
return null;
|
|
241
|
-
}
|
|
242
|
-
console.log(); // Add spacing
|
|
243
|
-
return selectedProject;
|
|
244
|
-
}
|
|
245
|
-
/**
|
|
246
|
-
* Handles the scenario when selected PRD has no tasks
|
|
247
|
-
* @param projectName Name of the PRD project
|
|
248
|
-
*/
|
|
249
|
-
async handleNoTasks(projectName) {
|
|
250
|
-
console.log(chalk.yellow(`\nWarning: Project "${projectName}" has no tasks generated yet.\n`));
|
|
251
|
-
const response = await inquirer.prompt([
|
|
252
|
-
{
|
|
253
|
-
type: 'confirm',
|
|
254
|
-
name: 'runPlan',
|
|
255
|
-
message: 'Would you like to run "clavix plan" to generate tasks first?',
|
|
256
|
-
default: true,
|
|
257
|
-
},
|
|
258
|
-
]);
|
|
259
|
-
if (response.runPlan) {
|
|
260
|
-
console.log(chalk.cyan(`\nRunning: clavix plan --project ${projectName}\n`));
|
|
261
|
-
// Execute clavix plan command
|
|
262
|
-
const { exec } = await import('child_process');
|
|
263
|
-
const { promisify } = await import('util');
|
|
264
|
-
const execAsync = promisify(exec);
|
|
265
|
-
try {
|
|
266
|
-
const { stdout, stderr } = await execAsync(`clavix plan --project ${projectName}`, {
|
|
267
|
-
cwd: process.cwd(),
|
|
268
|
-
});
|
|
269
|
-
if (stdout) {
|
|
270
|
-
console.log(stdout);
|
|
271
|
-
}
|
|
272
|
-
if (stderr) {
|
|
273
|
-
console.error(chalk.yellow(stderr));
|
|
274
|
-
}
|
|
275
|
-
// After plan completes, continue with implementation
|
|
276
|
-
console.log(chalk.green('\nTasks generated! Continuing with implementation...\n'));
|
|
277
|
-
}
|
|
278
|
-
catch (error) {
|
|
279
|
-
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
280
|
-
this.error(`Running clavix plan failed: ${errorMessage}`);
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
else {
|
|
284
|
-
console.log(chalk.dim('\nExiting. Run "clavix plan" when ready to generate tasks.\n'));
|
|
285
|
-
this.exit(0);
|
|
286
|
-
}
|
|
287
|
-
}
|
|
288
|
-
}
|
|
289
|
-
//# sourceMappingURL=implement.js.map
|
|
@@ -1,32 +0,0 @@
|
|
|
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
|