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.
Files changed (162) hide show
  1. package/README.md +72 -60
  2. package/dist/cli/commands/update.js +9 -10
  3. package/dist/templates/agents/agents.md +14 -8
  4. package/dist/templates/agents/copilot-instructions.md +1 -1
  5. package/dist/templates/instructions/core/verification.md +2 -2
  6. package/dist/templates/slash-commands/_canonical/archive.md +83 -121
  7. package/dist/templates/slash-commands/_canonical/execute.md +32 -42
  8. package/dist/templates/slash-commands/_canonical/implement.md +32 -44
  9. package/dist/templates/slash-commands/_canonical/improve.md +14 -53
  10. package/dist/templates/slash-commands/_canonical/start.md +1 -1
  11. package/dist/templates/slash-commands/_canonical/summarize.md +8 -8
  12. package/dist/templates/slash-commands/_components/agent-protocols/cli-reference.md +84 -180
  13. package/dist/templates/slash-commands/_components/agent-protocols/error-handling.md +2 -2
  14. package/dist/templates/slash-commands/_components/agent-protocols/file-formats.md +41 -59
  15. package/dist/templates/slash-commands/_components/agent-protocols/state-assertion.md +1 -1
  16. package/dist/templates/slash-commands/_components/references/intent-types.md +1 -1
  17. package/dist/templates/slash-commands/_components/sections/file-saving-protocol.md +20 -27
  18. package/dist/templates/slash-commands/_components/sections/pattern-visibility.md +29 -46
  19. package/dist/templates/slash-commands/_components/troubleshooting/file-not-saved.md +4 -5
  20. package/dist/types/config.d.ts +57 -0
  21. package/dist/utils/legacy-command-cleanup.js +31 -4
  22. package/package.json +5 -4
  23. package/dist/cli/commands/analyze.d.ts +0 -17
  24. package/dist/cli/commands/analyze.js +0 -133
  25. package/dist/cli/commands/archive.d.ts +0 -36
  26. package/dist/cli/commands/archive.js +0 -266
  27. package/dist/cli/commands/deep.d.ts +0 -17
  28. package/dist/cli/commands/deep.js +0 -170
  29. package/dist/cli/commands/execute.d.ts +0 -15
  30. package/dist/cli/commands/execute.js +0 -168
  31. package/dist/cli/commands/fast.d.ts +0 -18
  32. package/dist/cli/commands/fast.js +0 -219
  33. package/dist/cli/commands/implement.d.ts +0 -24
  34. package/dist/cli/commands/implement.js +0 -289
  35. package/dist/cli/commands/improve.d.ts +0 -32
  36. package/dist/cli/commands/improve.js +0 -250
  37. package/dist/cli/commands/list.d.ts +0 -17
  38. package/dist/cli/commands/list.js +0 -217
  39. package/dist/cli/commands/plan.d.ts +0 -21
  40. package/dist/cli/commands/plan.js +0 -297
  41. package/dist/cli/commands/prd.d.ts +0 -24
  42. package/dist/cli/commands/prd.js +0 -321
  43. package/dist/cli/commands/prompts/clear.d.ts +0 -16
  44. package/dist/cli/commands/prompts/clear.js +0 -222
  45. package/dist/cli/commands/prompts/list.d.ts +0 -8
  46. package/dist/cli/commands/prompts/list.js +0 -88
  47. package/dist/cli/commands/show.d.ts +0 -21
  48. package/dist/cli/commands/show.js +0 -191
  49. package/dist/cli/commands/start.d.ts +0 -40
  50. package/dist/cli/commands/start.js +0 -210
  51. package/dist/cli/commands/summarize.d.ts +0 -17
  52. package/dist/cli/commands/summarize.js +0 -196
  53. package/dist/cli/commands/task-complete.d.ts +0 -27
  54. package/dist/cli/commands/task-complete.js +0 -269
  55. package/dist/cli/commands/verify.d.ts +0 -28
  56. package/dist/cli/commands/verify.js +0 -349
  57. package/dist/core/archive-manager.d.ts +0 -100
  58. package/dist/core/archive-manager.js +0 -302
  59. package/dist/core/basic-checklist-generator.d.ts +0 -35
  60. package/dist/core/basic-checklist-generator.js +0 -344
  61. package/dist/core/checklist-parser.d.ts +0 -48
  62. package/dist/core/checklist-parser.js +0 -238
  63. package/dist/core/config-manager.d.ts +0 -149
  64. package/dist/core/config-manager.js +0 -230
  65. package/dist/core/conversation-analyzer.d.ts +0 -86
  66. package/dist/core/conversation-analyzer.js +0 -387
  67. package/dist/core/conversation-quality-tracker.d.ts +0 -81
  68. package/dist/core/conversation-quality-tracker.js +0 -195
  69. package/dist/core/git-manager.d.ts +0 -126
  70. package/dist/core/git-manager.js +0 -282
  71. package/dist/core/intelligence/confidence-calculator.d.ts +0 -93
  72. package/dist/core/intelligence/confidence-calculator.js +0 -124
  73. package/dist/core/intelligence/index.d.ts +0 -11
  74. package/dist/core/intelligence/index.js +0 -15
  75. package/dist/core/intelligence/intent-detector.d.ts +0 -54
  76. package/dist/core/intelligence/intent-detector.js +0 -723
  77. package/dist/core/intelligence/pattern-library.d.ts +0 -104
  78. package/dist/core/intelligence/pattern-library.js +0 -339
  79. package/dist/core/intelligence/patterns/actionability-enhancer.d.ts +0 -27
  80. package/dist/core/intelligence/patterns/actionability-enhancer.js +0 -192
  81. package/dist/core/intelligence/patterns/alternative-phrasing-generator.d.ts +0 -29
  82. package/dist/core/intelligence/patterns/alternative-phrasing-generator.js +0 -239
  83. package/dist/core/intelligence/patterns/ambiguity-detector.d.ts +0 -22
  84. package/dist/core/intelligence/patterns/ambiguity-detector.js +0 -196
  85. package/dist/core/intelligence/patterns/assumption-explicitizer.d.ts +0 -30
  86. package/dist/core/intelligence/patterns/assumption-explicitizer.js +0 -296
  87. package/dist/core/intelligence/patterns/base-pattern.d.ts +0 -192
  88. package/dist/core/intelligence/patterns/base-pattern.js +0 -103
  89. package/dist/core/intelligence/patterns/completeness-validator.d.ts +0 -27
  90. package/dist/core/intelligence/patterns/completeness-validator.js +0 -221
  91. package/dist/core/intelligence/patterns/conciseness-filter.d.ts +0 -20
  92. package/dist/core/intelligence/patterns/conciseness-filter.js +0 -92
  93. package/dist/core/intelligence/patterns/context-precision.d.ts +0 -32
  94. package/dist/core/intelligence/patterns/context-precision.js +0 -389
  95. package/dist/core/intelligence/patterns/conversation-summarizer.d.ts +0 -30
  96. package/dist/core/intelligence/patterns/conversation-summarizer.js +0 -277
  97. package/dist/core/intelligence/patterns/dependency-identifier.d.ts +0 -23
  98. package/dist/core/intelligence/patterns/dependency-identifier.js +0 -166
  99. package/dist/core/intelligence/patterns/domain-context-enricher.d.ts +0 -21
  100. package/dist/core/intelligence/patterns/domain-context-enricher.js +0 -198
  101. package/dist/core/intelligence/patterns/edge-case-identifier.d.ts +0 -30
  102. package/dist/core/intelligence/patterns/edge-case-identifier.js +0 -269
  103. package/dist/core/intelligence/patterns/error-tolerance-enhancer.d.ts +0 -22
  104. package/dist/core/intelligence/patterns/error-tolerance-enhancer.js +0 -179
  105. package/dist/core/intelligence/patterns/implicit-requirement-extractor.d.ts +0 -24
  106. package/dist/core/intelligence/patterns/implicit-requirement-extractor.js +0 -259
  107. package/dist/core/intelligence/patterns/objective-clarifier.d.ts +0 -22
  108. package/dist/core/intelligence/patterns/objective-clarifier.js +0 -126
  109. package/dist/core/intelligence/patterns/output-format-enforcer.d.ts +0 -22
  110. package/dist/core/intelligence/patterns/output-format-enforcer.js +0 -151
  111. package/dist/core/intelligence/patterns/prd-structure-enforcer.d.ts +0 -23
  112. package/dist/core/intelligence/patterns/prd-structure-enforcer.js +0 -183
  113. package/dist/core/intelligence/patterns/prerequisite-identifier.d.ts +0 -23
  114. package/dist/core/intelligence/patterns/prerequisite-identifier.js +0 -221
  115. package/dist/core/intelligence/patterns/requirement-prioritizer.d.ts +0 -24
  116. package/dist/core/intelligence/patterns/requirement-prioritizer.js +0 -134
  117. package/dist/core/intelligence/patterns/scope-definer.d.ts +0 -26
  118. package/dist/core/intelligence/patterns/scope-definer.js +0 -236
  119. package/dist/core/intelligence/patterns/step-decomposer.d.ts +0 -31
  120. package/dist/core/intelligence/patterns/step-decomposer.js +0 -242
  121. package/dist/core/intelligence/patterns/structure-organizer.d.ts +0 -31
  122. package/dist/core/intelligence/patterns/structure-organizer.js +0 -218
  123. package/dist/core/intelligence/patterns/success-criteria-enforcer.d.ts +0 -22
  124. package/dist/core/intelligence/patterns/success-criteria-enforcer.js +0 -165
  125. package/dist/core/intelligence/patterns/success-metrics-enforcer.d.ts +0 -24
  126. package/dist/core/intelligence/patterns/success-metrics-enforcer.js +0 -165
  127. package/dist/core/intelligence/patterns/technical-context-enricher.d.ts +0 -25
  128. package/dist/core/intelligence/patterns/technical-context-enricher.js +0 -165
  129. package/dist/core/intelligence/patterns/topic-coherence-analyzer.d.ts +0 -26
  130. package/dist/core/intelligence/patterns/topic-coherence-analyzer.js +0 -300
  131. package/dist/core/intelligence/patterns/user-persona-enricher.d.ts +0 -24
  132. package/dist/core/intelligence/patterns/user-persona-enricher.js +0 -141
  133. package/dist/core/intelligence/patterns/validation-checklist-creator.d.ts +0 -31
  134. package/dist/core/intelligence/patterns/validation-checklist-creator.js +0 -242
  135. package/dist/core/intelligence/quality-assessor.d.ts +0 -51
  136. package/dist/core/intelligence/quality-assessor.js +0 -505
  137. package/dist/core/intelligence/types.d.ts +0 -111
  138. package/dist/core/intelligence/types.js +0 -3
  139. package/dist/core/intelligence/universal-optimizer.d.ts +0 -84
  140. package/dist/core/intelligence/universal-optimizer.js +0 -371
  141. package/dist/core/prd-generator.d.ts +0 -76
  142. package/dist/core/prd-generator.js +0 -173
  143. package/dist/core/prompt-manager.d.ts +0 -110
  144. package/dist/core/prompt-manager.js +0 -274
  145. package/dist/core/prompt-optimizer.d.ts +0 -268
  146. package/dist/core/prompt-optimizer.js +0 -959
  147. package/dist/core/question-engine.d.ts +0 -167
  148. package/dist/core/question-engine.js +0 -356
  149. package/dist/core/session-manager.d.ts +0 -139
  150. package/dist/core/session-manager.js +0 -365
  151. package/dist/core/task-manager.d.ts +0 -211
  152. package/dist/core/task-manager.js +0 -981
  153. package/dist/core/verification-hooks.d.ts +0 -67
  154. package/dist/core/verification-hooks.js +0 -309
  155. package/dist/core/verification-manager.d.ts +0 -107
  156. package/dist/core/verification-manager.js +0 -415
  157. package/dist/index 2.js +0 -13
  158. package/dist/index.d 2.ts +0 -4
  159. package/dist/types/session.d.ts +0 -78
  160. package/dist/types/session.js +0 -8
  161. package/dist/types/verification.d.ts +0 -205
  162. 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