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,266 +0,0 @@
1
- import { Command, Flags, Args } from '@oclif/core';
2
- import chalk from 'chalk';
3
- import inquirer from 'inquirer';
4
- import { ArchiveManager } from '../../core/archive-manager.js';
5
- export default class Archive extends Command {
6
- static description = 'Archive completed PRD projects';
7
- static examples = [
8
- '<%= config.bin %> <%= command.id %> # Interactive selection',
9
- '<%= config.bin %> <%= command.id %> my-project # Archive specific project',
10
- '<%= config.bin %> <%= command.id %> --list # List archived projects',
11
- '<%= config.bin %> <%= command.id %> my-project --force # Force archive',
12
- '<%= config.bin %> <%= command.id %> --restore my-project # Restore from archive',
13
- ];
14
- static args = {
15
- project: Args.string({
16
- description: 'Name of the project to archive',
17
- required: false,
18
- }),
19
- };
20
- static flags = {
21
- list: Flags.boolean({
22
- char: 'l',
23
- description: 'List archived projects',
24
- default: false,
25
- }),
26
- force: Flags.boolean({
27
- char: 'f',
28
- description: 'Force archive even if tasks are incomplete',
29
- default: false,
30
- }),
31
- yes: Flags.boolean({
32
- char: 'y',
33
- description: 'Skip all confirmation prompts (agent-friendly)',
34
- default: false,
35
- }),
36
- restore: Flags.string({
37
- char: 'r',
38
- description: 'Restore an archived project',
39
- }),
40
- };
41
- async run() {
42
- const { args, flags } = await this.parse(Archive);
43
- const archiveManager = new ArchiveManager();
44
- try {
45
- // Handle restore flag
46
- if (flags.restore) {
47
- await this.restoreProject(flags.restore, archiveManager, flags.yes);
48
- return;
49
- }
50
- // Handle list flag
51
- if (flags.list) {
52
- await this.listArchivedProjects(archiveManager);
53
- return;
54
- }
55
- // Handle direct project archival
56
- if (args.project) {
57
- await this.archiveSpecificProject(args.project, flags.force, flags.yes, archiveManager);
58
- return;
59
- }
60
- // Interactive mode
61
- await this.interactiveArchive(archiveManager, flags.yes);
62
- }
63
- catch (error) {
64
- const { getErrorMessage } = await import('../../utils/error-utils.js');
65
- this.error(chalk.red(`Archive failed: ${getErrorMessage(error)}`));
66
- }
67
- }
68
- /**
69
- * Interactive archive mode - show list of archivable projects
70
- */
71
- async interactiveArchive(archiveManager, yes) {
72
- this.log(chalk.bold.cyan('\n📦 Archive PRD Projects\n'));
73
- // Get all archivable projects (100% tasks completed)
74
- const archivableProjects = await archiveManager.getArchivablePrds();
75
- if (archivableProjects.length === 0) {
76
- this.log(chalk.gray('No projects ready to archive.'));
77
- this.log(chalk.gray('\nProjects can be archived when all tasks are completed.'));
78
- this.log(chalk.gray('Use ') + chalk.cyan('clavix list --outputs') + chalk.gray(' to see all projects.'));
79
- return;
80
- }
81
- // Show archivable projects
82
- this.log(chalk.green(`Found ${archivableProjects.length} project(s) ready to archive:\n`));
83
- // Inquirer choices can be mixed types (choices + separators)
84
- const choices = archivableProjects.map((project) => ({
85
- name: `${project.name} (${project.taskStatus.completed} tasks completed)`,
86
- value: project.name,
87
- short: project.name,
88
- }));
89
- choices.push(new inquirer.Separator());
90
- choices.push({
91
- name: chalk.gray('Cancel'),
92
- value: '__cancel__',
93
- short: 'Cancel',
94
- });
95
- const { selectedProject } = await inquirer.prompt([
96
- {
97
- type: 'list',
98
- name: 'selectedProject',
99
- message: 'Which project would you like to archive?',
100
- choices,
101
- pageSize: 15,
102
- },
103
- ]);
104
- if (selectedProject === '__cancel__') {
105
- this.log(chalk.yellow('\n✗ Archive cancelled\n'));
106
- return;
107
- }
108
- // Confirm archival (unless --yes)
109
- if (!yes) {
110
- const { confirm } = await inquirer.prompt([
111
- {
112
- type: 'confirm',
113
- name: 'confirm',
114
- message: `Archive "${selectedProject}"? (This will move it to .clavix/outputs/archive/)`,
115
- default: false,
116
- },
117
- ]);
118
- if (!confirm) {
119
- this.log(chalk.yellow('\n✗ Archive cancelled\n'));
120
- return;
121
- }
122
- }
123
- // Archive the project
124
- const result = await archiveManager.archiveProject(selectedProject);
125
- if (result.success) {
126
- this.log(chalk.green(`\n✓ ${result.message}\n`));
127
- }
128
- else {
129
- this.error(chalk.red(`\n✗ ${result.message}\n`));
130
- }
131
- }
132
- /**
133
- * Archive a specific project by name
134
- */
135
- async archiveSpecificProject(projectName, force, yes, archiveManager) {
136
- this.log(chalk.cyan(`\nArchiving project: ${chalk.bold(projectName)}\n`));
137
- // Check task status
138
- const projectPath = `.clavix/outputs/${projectName}`;
139
- const taskStatus = await archiveManager.checkTasksStatus(projectPath);
140
- // If not forcing and tasks are incomplete, ask for confirmation (unless --yes)
141
- if (!force && !taskStatus.allCompleted) {
142
- if (!taskStatus.hasTasksFile) {
143
- this.log(chalk.yellow(`⚠ Project has no tasks.md file\n`));
144
- if (!yes) {
145
- const { proceed } = await inquirer.prompt([
146
- {
147
- type: 'confirm',
148
- name: 'proceed',
149
- message: 'Archive anyway?',
150
- default: false,
151
- },
152
- ]);
153
- if (!proceed) {
154
- this.log(chalk.yellow('\n✗ Archive cancelled\n'));
155
- return;
156
- }
157
- }
158
- }
159
- else if (taskStatus.remaining > 0) {
160
- this.log(chalk.yellow(`⚠ Project has ${taskStatus.remaining} incomplete task(s):\n`));
161
- // Show incomplete tasks
162
- const incompleteTasks = await archiveManager.getIncompleteTasks(projectPath);
163
- incompleteTasks.slice(0, 5).forEach((task) => {
164
- this.log(chalk.gray(` • ${task}`));
165
- });
166
- if (incompleteTasks.length > 5) {
167
- this.log(chalk.gray(` ... and ${incompleteTasks.length - 5} more\n`));
168
- }
169
- else {
170
- this.log('');
171
- }
172
- if (!yes) {
173
- const { proceed } = await inquirer.prompt([
174
- {
175
- type: 'confirm',
176
- name: 'proceed',
177
- message: 'Archive anyway?',
178
- default: false,
179
- },
180
- ]);
181
- if (!proceed) {
182
- this.log(chalk.yellow('\n✗ Archive cancelled\n'));
183
- return;
184
- }
185
- }
186
- }
187
- }
188
- // Archive the project
189
- const result = await archiveManager.archiveProject(projectName, true);
190
- if (result.success) {
191
- this.log(chalk.green(`✓ ${result.message}\n`));
192
- }
193
- else {
194
- this.error(chalk.red(`✗ ${result.message}\n`));
195
- }
196
- }
197
- /**
198
- * List all archived projects
199
- */
200
- async listArchivedProjects(archiveManager) {
201
- this.log(chalk.bold.cyan('\n📦 Archived Projects\n'));
202
- const archivedProjects = await archiveManager.listArchivedProjects();
203
- if (archivedProjects.length === 0) {
204
- this.log(chalk.gray('No archived projects found.'));
205
- this.log(chalk.gray('\nUse ') + chalk.cyan('clavix archive') + chalk.gray(' to archive completed projects.\n'));
206
- return;
207
- }
208
- // Display archived projects
209
- archivedProjects.forEach((project, index) => {
210
- const statusIcon = project.taskStatus.allCompleted ? '✓' : '○';
211
- const taskInfo = project.taskStatus.hasTasksFile
212
- ? `${project.taskStatus.completed}/${project.taskStatus.total} tasks`
213
- : 'no tasks';
214
- const modified = project.modifiedTime.toLocaleDateString();
215
- this.log(` ${statusIcon} ${chalk.bold(project.name)}` +
216
- `\n ${chalk.gray('Tasks:')} ${taskInfo} ${chalk.gray('│')} ` +
217
- `${chalk.gray('Archived:')} ${modified}` +
218
- `\n ${chalk.gray('Path:')} ${chalk.dim(project.path)}` +
219
- (index < archivedProjects.length - 1 ? '\n' : ''));
220
- });
221
- this.log('');
222
- this.log(chalk.gray(` Total: ${archivedProjects.length} archived project(s)`));
223
- this.log(chalk.gray(` Use ${chalk.cyan('clavix archive --restore <project>')} to restore a project\n`));
224
- }
225
- /**
226
- * Restore an archived project
227
- */
228
- async restoreProject(projectName, archiveManager, yes) {
229
- this.log(chalk.cyan(`\nRestoring project: ${chalk.bold(projectName)}\n`));
230
- // Confirm restoration (unless --yes)
231
- if (!yes) {
232
- const { confirm } = await inquirer.prompt([
233
- {
234
- type: 'confirm',
235
- name: 'confirm',
236
- message: `Restore "${projectName}" from archive?`,
237
- default: false,
238
- },
239
- ]);
240
- if (!confirm) {
241
- this.log(chalk.yellow('\n✗ Restore cancelled\n'));
242
- return;
243
- }
244
- }
245
- const result = await archiveManager.restoreProject(projectName);
246
- if (result.success) {
247
- this.log(chalk.green(`✓ ${result.message}\n`));
248
- }
249
- else {
250
- this.error(chalk.red(`✗ ${result.message}\n`));
251
- }
252
- }
253
- /**
254
- * Display project details (helper for formatting)
255
- */
256
- displayProjectInfo(project) {
257
- const statusIcon = project.taskStatus.allCompleted ? '✓' : '○';
258
- const taskInfo = project.taskStatus.hasTasksFile
259
- ? `${project.taskStatus.completed}/${project.taskStatus.total} tasks (${Math.round(project.taskStatus.percentage)}%)`
260
- : 'no tasks';
261
- this.log(` ${statusIcon} ${chalk.bold(project.name)}` +
262
- `\n ${chalk.gray('Tasks:')} ${taskInfo}` +
263
- `\n ${chalk.gray('Modified:')} ${project.modifiedTime.toLocaleDateString()}`);
264
- }
265
- }
266
- //# sourceMappingURL=archive.js.map
@@ -1,17 +0,0 @@
1
- import { Command } from '@oclif/core';
2
- export default class Deep extends Command {
3
- static description: string;
4
- static examples: string[];
5
- static flags: {
6
- 'analysis-only': 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
- private displayOutput;
13
- private displayAnalysisOnly;
14
- private savePrompt;
15
- private generateShortHash;
16
- }
17
- //# sourceMappingURL=deep.d.ts.map
@@ -1,170 +0,0 @@
1
- import { Command, Args, Flags } from '@oclif/core';
2
- import chalk from 'chalk';
3
- import { UniversalOptimizer } from '../../core/intelligence/index.js';
4
- import { PromptManager } from '../../core/prompt-manager.js';
5
- export default class Deep extends Command {
6
- static description = 'Perform comprehensive deep analysis with alternative approaches, edge cases, and validation checklists';
7
- static examples = [
8
- '<%= config.bin %> <%= command.id %> "Create a login page"',
9
- '<%= config.bin %> <%= command.id %> "Build an API for user management"',
10
- '<%= config.bin %> <%= command.id %> "Design a notification system"',
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 analyze deeply',
21
- required: true,
22
- }),
23
- };
24
- async run() {
25
- const { args, flags } = await this.parse(Deep);
26
- if (!args.prompt || args.prompt.trim().length === 0) {
27
- console.log(chalk.red('\n✗ Please provide a prompt to analyze\n'));
28
- console.log(chalk.gray('Example:'), chalk.cyan('clavix deep "Create a login page"'));
29
- return;
30
- }
31
- console.log(chalk.bold.cyan('\n🔍 Performing comprehensive deep analysis...\n'));
32
- console.log(chalk.gray('This may take up to 15 seconds for thorough exploration\n'));
33
- const optimizer = new UniversalOptimizer();
34
- const result = await optimizer.optimize(args.prompt, 'deep');
35
- // Handle --analysis-only flag
36
- if (flags['analysis-only']) {
37
- this.displayAnalysisOnly(result);
38
- return;
39
- }
40
- // Display full deep mode output
41
- this.displayOutput(result);
42
- // Save prompt to file system
43
- await this.savePrompt(result);
44
- }
45
- displayOutput(result) {
46
- console.log(chalk.bold.cyan('🔍 Deep Analysis Complete\n'));
47
- // ===== Intent Analysis =====
48
- console.log(chalk.bold.cyan('🎯 Intent Analysis:\n'));
49
- console.log(chalk.cyan(` Type: ${result.intent.primaryIntent}`));
50
- console.log(chalk.cyan(` Confidence: ${result.intent.confidence}%`));
51
- console.log(chalk.cyan(` Characteristics:`));
52
- console.log(chalk.cyan(` • Has code context: ${result.intent.characteristics.hasCodeContext ? 'Yes' : 'No'}`));
53
- console.log(chalk.cyan(` • Technical terms: ${result.intent.characteristics.hasTechnicalTerms ? 'Yes' : 'No'}`));
54
- console.log(chalk.cyan(` • Open-ended: ${result.intent.characteristics.isOpenEnded ? 'Yes' : 'No'}`));
55
- console.log(chalk.cyan(` • Needs structure: ${result.intent.characteristics.needsStructure ? 'Yes' : 'No'}`));
56
- console.log();
57
- // ===== Quality Metrics =====
58
- console.log(chalk.bold('📊 Quality Metrics:\n'));
59
- const getScoreColor = (score) => {
60
- if (score >= 80)
61
- return chalk.green;
62
- if (score >= 60)
63
- return chalk.yellow;
64
- return chalk.red;
65
- };
66
- console.log(getScoreColor(result.quality.clarity)(` Clarity: ${result.quality.clarity.toFixed(0)}%`));
67
- console.log(getScoreColor(result.quality.efficiency)(` Efficiency: ${result.quality.efficiency.toFixed(0)}%`));
68
- console.log(getScoreColor(result.quality.structure)(` Structure: ${result.quality.structure.toFixed(0)}%`));
69
- console.log(getScoreColor(result.quality.completeness)(` Completeness: ${result.quality.completeness.toFixed(0)}%`));
70
- console.log(getScoreColor(result.quality.actionability)(` Actionability: ${result.quality.actionability.toFixed(0)}%`));
71
- console.log(getScoreColor(result.quality.overall).bold(`\n Overall: ${result.quality.overall.toFixed(0)}%\n`));
72
- // ===== Strengths =====
73
- if (result.quality.strengths.length > 0) {
74
- console.log(chalk.bold.green('✅ Strengths:\n'));
75
- result.quality.strengths.forEach((strength) => {
76
- console.log(chalk.green(` • ${strength}`));
77
- });
78
- console.log();
79
- }
80
- // ===== Improvements Applied =====
81
- if (result.improvements.length > 0) {
82
- console.log(chalk.bold.magenta('✨ Improvements Applied:\n'));
83
- result.improvements.forEach((improvement) => {
84
- const emoji = improvement.impact === 'high' ? '🔥' : improvement.impact === 'medium' ? '⚡' : '💡';
85
- console.log(chalk.magenta(` ${emoji} ${improvement.description} [${improvement.dimension}]`));
86
- });
87
- console.log();
88
- }
89
- // ===== Enhanced Prompt =====
90
- // Note: Pattern-generated content (Alternative Approaches, Edge Cases, Validation Checklist)
91
- // is already embedded in result.enhanced by deep mode patterns
92
- console.log(chalk.bold.cyan('✨ Enhanced Prompt:\n'));
93
- console.log(chalk.dim('─'.repeat(80)));
94
- console.log(result.enhanced);
95
- console.log(chalk.dim('─'.repeat(80)));
96
- console.log();
97
- // Patterns Applied
98
- if (result.appliedPatterns.length > 0) {
99
- console.log(chalk.bold.blue('🧩 Patterns Applied:\n'));
100
- result.appliedPatterns.forEach((pattern) => {
101
- console.log(chalk.blue(` • ${pattern.name}: ${pattern.description}`));
102
- });
103
- console.log();
104
- }
105
- // Remaining Issues (if any)
106
- if (result.quality.remainingIssues && result.quality.remainingIssues.length > 0) {
107
- console.log(chalk.bold.yellow('⚠️ Remaining Areas for Improvement:\n'));
108
- result.quality.remainingIssues.forEach((issue) => {
109
- console.log(chalk.yellow(` • ${issue}`));
110
- });
111
- console.log();
112
- }
113
- // Final recommendation
114
- const recommendation = new UniversalOptimizer().getRecommendation(result);
115
- if (recommendation) {
116
- console.log(chalk.blue.bold('💡 Recommendation:'));
117
- console.log(chalk.blue(` ${recommendation}\n`));
118
- }
119
- console.log(chalk.gray(`⚡ Processed in ${result.processingTimeMs}ms\n`));
120
- console.log(chalk.gray('💡 Tip: The enhanced prompt above includes alternative approaches, edge cases, and validation checklist\n'));
121
- }
122
- displayAnalysisOnly(result) {
123
- console.log(chalk.bold.cyan('🎯 Intent Analysis:\n'));
124
- console.log(chalk.cyan(` Type: ${result.intent.primaryIntent}`));
125
- console.log(chalk.cyan(` Confidence: ${result.intent.confidence}%`));
126
- console.log(chalk.cyan(` Characteristics:`));
127
- console.log(chalk.cyan(` • Has code context: ${result.intent.characteristics.hasCodeContext ? 'Yes' : 'No'}`));
128
- console.log(chalk.cyan(` • Technical terms: ${result.intent.characteristics.hasTechnicalTerms ? 'Yes' : 'No'}`));
129
- console.log(chalk.cyan(` • Open-ended: ${result.intent.characteristics.isOpenEnded ? 'Yes' : 'No'}`));
130
- console.log(chalk.cyan(` • Needs structure: ${result.intent.characteristics.needsStructure ? 'Yes' : 'No'}`));
131
- console.log();
132
- console.log(chalk.bold('📊 Quality Scores:\n'));
133
- console.log(chalk.white(` Clarity: ${result.quality.clarity.toFixed(0)}%`));
134
- console.log(chalk.white(` Efficiency: ${result.quality.efficiency.toFixed(0)}%`));
135
- console.log(chalk.white(` Structure: ${result.quality.structure.toFixed(0)}%`));
136
- console.log(chalk.white(` Completeness: ${result.quality.completeness.toFixed(0)}%`));
137
- console.log(chalk.white(` Actionability: ${result.quality.actionability.toFixed(0)}%`));
138
- console.log(chalk.bold(`\n Overall: ${result.quality.overall.toFixed(0)}%\n`));
139
- if (result.quality.strengths.length > 0) {
140
- console.log(chalk.bold.green('✅ Strengths:\n'));
141
- result.quality.strengths.forEach((strength) => {
142
- console.log(chalk.green(` • ${strength}`));
143
- });
144
- console.log();
145
- }
146
- }
147
- async savePrompt(result) {
148
- try {
149
- const manager = new PromptManager();
150
- // Format enhanced prompt as content
151
- const content = result.enhanced;
152
- await manager.savePrompt(content, 'deep', result.original);
153
- console.log(chalk.gray(`💾 Saved prompt to .clavix/outputs/prompts/deep/\n`));
154
- }
155
- catch (error) {
156
- console.log(chalk.yellow('⚠️ Could not save prompt to file system'));
157
- console.log(chalk.gray('Error: ' + (error instanceof Error ? error.message : 'Unknown error')));
158
- }
159
- }
160
- generateShortHash(text) {
161
- let hash = 0;
162
- for (let i = 0; i < text.length; i++) {
163
- const char = text.charCodeAt(i);
164
- hash = (hash << 5) - hash + char;
165
- hash = hash & hash;
166
- }
167
- return Math.abs(hash).toString(16).slice(0, 4);
168
- }
169
- }
170
- //# sourceMappingURL=deep.js.map
@@ -1,15 +0,0 @@
1
- import { Command } from '@oclif/core';
2
- export default class Execute extends Command {
3
- static description: string;
4
- static examples: string[];
5
- static flags: {
6
- latest: import("@oclif/core/interfaces").BooleanFlag<boolean>;
7
- standard: import("@oclif/core/interfaces").BooleanFlag<boolean>;
8
- comprehensive: import("@oclif/core/interfaces").BooleanFlag<boolean>;
9
- id: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
10
- };
11
- run(): Promise<void>;
12
- private selectPromptInteractively;
13
- private executePrompt;
14
- }
15
- //# sourceMappingURL=execute.d.ts.map
@@ -1,168 +0,0 @@
1
- import { Command, Flags } from '@oclif/core';
2
- import chalk from 'chalk';
3
- import inquirer from 'inquirer';
4
- import { PromptManager } from '../../core/prompt-manager.js';
5
- import { ChecklistParser } from '../../core/checklist-parser.js';
6
- export default class Execute extends Command {
7
- static description = 'Execute a saved prompt from improve optimization';
8
- static examples = [
9
- '<%= config.bin %> <%= command.id %> --latest',
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
- '<%= config.bin %> <%= command.id %>',
14
- ];
15
- static flags = {
16
- latest: Flags.boolean({
17
- description: 'Auto-select latest prompt (any type)',
18
- default: false,
19
- }),
20
- standard: Flags.boolean({
21
- char: 's',
22
- description: 'Filter to standard depth prompts only (use with --latest)',
23
- default: false,
24
- }),
25
- comprehensive: Flags.boolean({
26
- char: 'c',
27
- description: 'Filter to comprehensive depth prompts only (use with --latest)',
28
- default: false,
29
- }),
30
- id: Flags.string({
31
- description: 'Execute specific prompt by ID',
32
- }),
33
- };
34
- async run() {
35
- const { flags } = await this.parse(Execute);
36
- const promptManager = new PromptManager();
37
- try {
38
- // Get all prompts
39
- const allPrompts = await promptManager.listPrompts();
40
- if (allPrompts.length === 0) {
41
- console.log(chalk.yellow('\n⚠️ No prompts found\n'));
42
- console.log(chalk.cyan('Generate an optimized prompt first:'));
43
- console.log(chalk.cyan(' /clavix:improve "your requirement"'));
44
- console.log();
45
- return;
46
- }
47
- let selectedPrompt = null;
48
- // Execute specific prompt by ID
49
- if (flags.id) {
50
- selectedPrompt = allPrompts.find((p) => p.id === flags.id) || null;
51
- if (!selectedPrompt) {
52
- console.log(chalk.red(`\n✗ Prompt not found: ${flags.id}\n`));
53
- console.log(chalk.cyan('Run clavix prompts list to see available prompts'));
54
- console.log();
55
- return;
56
- }
57
- }
58
- // Auto-select latest with optional filtering
59
- else if (flags.latest) {
60
- let filtered = allPrompts;
61
- // Apply depth filter
62
- if (flags.standard && !flags.comprehensive) {
63
- filtered = allPrompts.filter((p) => p.depthUsed === 'standard');
64
- }
65
- else if (flags.comprehensive && !flags.standard) {
66
- filtered = allPrompts.filter((p) => p.depthUsed === 'comprehensive');
67
- }
68
- if (filtered.length === 0) {
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"`));
73
- console.log();
74
- return;
75
- }
76
- // Latest is first (already sorted by timestamp desc)
77
- selectedPrompt = filtered[0];
78
- }
79
- // Interactive selection
80
- else {
81
- selectedPrompt = await this.selectPromptInteractively(allPrompts);
82
- if (!selectedPrompt)
83
- return;
84
- }
85
- // Load and display prompt
86
- await this.executePrompt(selectedPrompt, promptManager);
87
- }
88
- catch (error) {
89
- console.log(chalk.red(`\n✗ Error: ${error}\n`));
90
- }
91
- }
92
- async selectPromptInteractively(prompts) {
93
- console.log(chalk.bold.cyan('\n📋 Available Prompts\n'));
94
- const choices = prompts.map((p) => {
95
- const status = p.executed ? chalk.green('✓') : chalk.gray('○');
96
- const age = p.ageInDays === 0 ? 'today' : `${p.ageInDays}d ago`;
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';
99
- return {
100
- name: `${status} [${depthLabel}] ${p.originalPrompt.substring(0, 60)}... ${ageColor(`(${age})`)}`,
101
- value: p.id,
102
- short: p.id,
103
- };
104
- });
105
- const { promptId } = await inquirer.prompt([
106
- {
107
- type: 'list',
108
- name: 'promptId',
109
- message: 'Select a prompt to execute:',
110
- choices,
111
- pageSize: 15,
112
- },
113
- ]);
114
- return prompts.find((p) => p.id === promptId) || null;
115
- }
116
- async executePrompt(prompt, manager) {
117
- const promptData = await manager.loadPrompt(prompt.id);
118
- if (!promptData) {
119
- console.log(chalk.red(`\n✗ Could not load prompt: ${prompt.id}\n`));
120
- return;
121
- }
122
- // Display prompt header
123
- console.log(chalk.bold.cyan(`\n🎯 Executing Prompt: ${prompt.id}\n`));
124
- console.log(chalk.gray(`Depth: ${prompt.depthUsed}`));
125
- console.log(chalk.gray(`Created: ${new Date(prompt.timestamp).toLocaleDateString()}`));
126
- console.log(chalk.gray(`Age: ${prompt.ageInDays} days\n`));
127
- // Display full prompt content
128
- console.log(chalk.dim('─'.repeat(80)));
129
- console.log(promptData.content);
130
- console.log(chalk.dim('─'.repeat(80)));
131
- console.log();
132
- // Parse and display checklist summary
133
- const checklistParser = new ChecklistParser();
134
- const checklist = checklistParser.parse(promptData.content);
135
- if (checklist.hasChecklist) {
136
- const summary = checklistParser.getSummary(checklist);
137
- console.log(chalk.bold.cyan('📋 Checklist Summary:'));
138
- console.log(chalk.gray(` Validation items: ${summary.validation}`));
139
- console.log(chalk.gray(` Edge cases: ${summary.edgeCases}`));
140
- console.log(chalk.gray(` Risks: ${summary.risks}`));
141
- console.log(chalk.gray(` Total: ${checklist.totalItems} items to verify`));
142
- console.log();
143
- }
144
- // Mark as executed
145
- if (!prompt.executed) {
146
- await manager.markExecuted(prompt.id);
147
- console.log(chalk.green('✓ Prompt marked as executed\n'));
148
- }
149
- // Display REQUIRED verification notice
150
- console.log(chalk.bgYellow.black(' ⚠️ VERIFICATION REQUIRED '));
151
- console.log(chalk.yellow('After implementing, run verification:'));
152
- console.log(chalk.cyan(` clavix verify --id ${prompt.id}`));
153
- console.log(chalk.cyan(' Or: /clavix:verify'));
154
- console.log();
155
- // Suggest cleanup
156
- const stats = await manager.getStorageStats();
157
- if (stats.executedPrompts >= 5) {
158
- console.log(chalk.gray(`💡 You have ${stats.executedPrompts} executed prompts.`));
159
- console.log(chalk.gray(` Clean up after verification: clavix prompts clear --executed`));
160
- console.log();
161
- }
162
- console.log(chalk.cyan('💡 Next steps:'));
163
- console.log(chalk.cyan(' 1. Implement the requirements described above'));
164
- console.log(chalk.cyan(' 2. Run: clavix verify --latest'));
165
- console.log();
166
- }
167
- }
168
- //# sourceMappingURL=execute.js.map
@@ -1,18 +0,0 @@
1
- import { Command } from '@oclif/core';
2
- export default class Fast extends Command {
3
- static description: string;
4
- static examples: string[];
5
- static flags: {
6
- 'analysis-only': 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
- private displayFastModeOutput;
13
- private displayDeepModeOutput;
14
- private displayAnalysisOnly;
15
- private savePrompt;
16
- private generateShortHash;
17
- }
18
- //# sourceMappingURL=fast.d.ts.map