clavix 2.7.1 → 2.8.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 +18 -4
- package/bin/clavix.js +12 -5
- package/dist/cli/commands/archive.d.ts +5 -4
- package/dist/cli/commands/archive.js +135 -161
- package/dist/cli/commands/config.d.ts +4 -4
- package/dist/cli/commands/config.js +66 -105
- package/dist/cli/commands/deep.d.ts +3 -3
- package/dist/cli/commands/deep.js +97 -103
- package/dist/cli/commands/execute.d.ts +4 -4
- package/dist/cli/commands/execute.js +57 -63
- package/dist/cli/commands/fast.d.ts +3 -3
- package/dist/cli/commands/fast.js +122 -128
- package/dist/cli/commands/implement.d.ts +4 -4
- package/dist/cli/commands/implement.js +84 -148
- package/dist/cli/commands/init.js +87 -126
- package/dist/cli/commands/list.d.ts +5 -5
- package/dist/cli/commands/list.js +72 -111
- package/dist/cli/commands/plan.d.ts +7 -7
- package/dist/cli/commands/plan.js +92 -131
- package/dist/cli/commands/prd.d.ts +4 -4
- package/dist/cli/commands/prd.js +76 -111
- package/dist/cli/commands/prompts/clear.d.ts +6 -6
- package/dist/cli/commands/prompts/clear.js +70 -76
- package/dist/cli/commands/prompts/list.js +37 -43
- package/dist/cli/commands/show.d.ts +4 -4
- package/dist/cli/commands/show.js +72 -111
- package/dist/cli/commands/start.d.ts +3 -3
- package/dist/cli/commands/start.js +63 -101
- package/dist/cli/commands/summarize.d.ts +4 -4
- package/dist/cli/commands/summarize.js +81 -120
- package/dist/cli/commands/task-complete.d.ts +4 -4
- package/dist/cli/commands/task-complete.js +86 -123
- package/dist/cli/commands/update.d.ts +3 -3
- package/dist/cli/commands/update.js +97 -130
- package/dist/cli/commands/version.js +13 -48
- package/dist/core/adapters/agents-md-generator.js +17 -50
- package/dist/core/adapters/amp-adapter.d.ts +1 -1
- package/dist/core/adapters/amp-adapter.js +13 -21
- package/dist/core/adapters/augment-adapter.d.ts +2 -2
- package/dist/core/adapters/augment-adapter.js +16 -56
- package/dist/core/adapters/base-adapter.d.ts +1 -1
- package/dist/core/adapters/base-adapter.js +11 -47
- package/dist/core/adapters/claude-code-adapter.d.ts +2 -2
- package/dist/core/adapters/claude-code-adapter.js +19 -60
- package/dist/core/adapters/cline-adapter.d.ts +1 -1
- package/dist/core/adapters/cline-adapter.js +13 -21
- package/dist/core/adapters/codebuddy-adapter.d.ts +2 -2
- package/dist/core/adapters/codebuddy-adapter.js +17 -57
- package/dist/core/adapters/codex-adapter.d.ts +2 -2
- package/dist/core/adapters/codex-adapter.js +16 -56
- package/dist/core/adapters/copilot-instructions-generator.js +18 -51
- package/dist/core/adapters/crush-adapter.d.ts +2 -2
- package/dist/core/adapters/crush-adapter.js +13 -20
- package/dist/core/adapters/cursor-adapter.d.ts +1 -1
- package/dist/core/adapters/cursor-adapter.js +12 -20
- package/dist/core/adapters/droid-adapter.d.ts +2 -2
- package/dist/core/adapters/droid-adapter.js +14 -21
- package/dist/core/adapters/gemini-adapter.d.ts +2 -2
- package/dist/core/adapters/gemini-adapter.js +16 -52
- package/dist/core/adapters/kilocode-adapter.d.ts +1 -1
- package/dist/core/adapters/kilocode-adapter.js +12 -20
- package/dist/core/adapters/octo-md-generator.js +17 -50
- package/dist/core/adapters/opencode-adapter.d.ts +2 -2
- package/dist/core/adapters/opencode-adapter.js +14 -21
- package/dist/core/adapters/qwen-adapter.d.ts +2 -2
- package/dist/core/adapters/qwen-adapter.js +16 -52
- package/dist/core/adapters/roocode-adapter.d.ts +2 -2
- package/dist/core/adapters/roocode-adapter.js +12 -19
- package/dist/core/adapters/warp-md-generator.js +17 -50
- package/dist/core/adapters/windsurf-adapter.d.ts +1 -1
- package/dist/core/adapters/windsurf-adapter.js +12 -20
- package/dist/core/agent-manager.d.ts +1 -1
- package/dist/core/agent-manager.js +34 -38
- package/dist/core/archive-manager.js +10 -46
- package/dist/core/config-manager.d.ts +2 -2
- package/dist/core/config-manager.js +3 -40
- package/dist/core/conversation-analyzer.d.ts +1 -1
- package/dist/core/conversation-analyzer.js +1 -5
- package/dist/core/doc-injector.js +23 -60
- package/dist/core/git-manager.js +11 -48
- package/dist/core/prd-generator.js +16 -51
- package/dist/core/prompt-manager.js +6 -42
- package/dist/core/prompt-optimizer.js +1 -5
- package/dist/core/question-engine.js +6 -45
- package/dist/core/session-manager.d.ts +1 -1
- package/dist/core/session-manager.js +11 -49
- package/dist/core/task-manager.d.ts +26 -0
- package/dist/core/task-manager.js +243 -101
- package/dist/index.d.ts +2 -1
- package/dist/index.js +8 -12
- package/dist/templates/agents/agents.md +31 -2
- package/dist/templates/agents/copilot-instructions.md +1 -1
- package/dist/templates/agents/octo.md +20 -1
- package/dist/templates/agents/warp.md +1 -1
- package/dist/templates/slash-commands/_canonical/implement.md +33 -11
- package/dist/types/agent.js +1 -2
- package/dist/types/config.js +3 -8
- package/dist/types/errors.js +7 -13
- package/dist/types/session.js +1 -2
- package/dist/utils/agent-error-messages.js +1 -5
- package/dist/utils/error-utils.js +5 -12
- package/dist/utils/file-system.js +20 -57
- package/dist/utils/legacy-command-cleanup.d.ts +1 -1
- package/dist/utils/legacy-command-cleanup.js +9 -45
- package/dist/utils/template-loader.d.ts +1 -1
- package/dist/utils/template-loader.js +9 -41
- package/dist/utils/toml-templates.js +1 -4
- package/package.json +9 -4
- package/dist/core/adapters 2/agents-md-generator.d.ts +0 -26
- package/dist/core/adapters 2/agents-md-generator.js +0 -102
- package/dist/core/adapters 2/amp-adapter.d.ts +0 -27
- package/dist/core/adapters 2/amp-adapter.js +0 -42
- package/dist/core/adapters 2/augment-adapter.d.ts +0 -22
- package/dist/core/adapters 2/augment-adapter.js +0 -77
- package/dist/core/adapters 2/base-adapter.d.ts +0 -45
- package/dist/core/adapters 2/base-adapter.js +0 -142
- package/dist/core/adapters 2/claude-code-adapter.d.ts +0 -32
- package/dist/core/adapters 2/claude-code-adapter.js +0 -116
- package/dist/core/adapters 2/cline-adapter.d.ts +0 -34
- package/dist/core/adapters 2/cline-adapter.js +0 -52
- package/dist/core/adapters 2/codebuddy-adapter.d.ts +0 -24
- package/dist/core/adapters 2/codebuddy-adapter.js +0 -82
- package/dist/core/adapters 2/codex-adapter.d.ts +0 -24
- package/dist/core/adapters 2/codex-adapter.js +0 -79
- package/dist/core/adapters 2/copilot-instructions-generator.d.ts +0 -26
- package/dist/core/adapters 2/copilot-instructions-generator.js +0 -104
- package/dist/core/adapters 2/crush-adapter.d.ts +0 -35
- package/dist/core/adapters 2/crush-adapter.js +0 -49
- package/dist/core/adapters 2/cursor-adapter.d.ts +0 -25
- package/dist/core/adapters 2/cursor-adapter.js +0 -40
- package/dist/core/adapters 2/droid-adapter.d.ts +0 -33
- package/dist/core/adapters 2/droid-adapter.js +0 -57
- package/dist/core/adapters 2/gemini-adapter.d.ts +0 -27
- package/dist/core/adapters 2/gemini-adapter.js +0 -90
- package/dist/core/adapters 2/kilocode-adapter.d.ts +0 -34
- package/dist/core/adapters 2/kilocode-adapter.js +0 -49
- package/dist/core/adapters 2/octo-md-generator.d.ts +0 -26
- package/dist/core/adapters 2/octo-md-generator.js +0 -102
- package/dist/core/adapters 2/opencode-adapter.d.ts +0 -33
- package/dist/core/adapters 2/opencode-adapter.js +0 -56
- package/dist/core/adapters 2/qwen-adapter.d.ts +0 -27
- package/dist/core/adapters 2/qwen-adapter.js +0 -90
- package/dist/core/adapters 2/roocode-adapter.d.ts +0 -40
- package/dist/core/adapters 2/roocode-adapter.js +0 -68
- package/dist/core/adapters 2/warp-md-generator.d.ts +0 -17
- package/dist/core/adapters 2/warp-md-generator.js +0 -88
- package/dist/core/adapters 2/windsurf-adapter.d.ts +0 -34
- package/dist/core/adapters 2/windsurf-adapter.js +0 -49
- package/dist/core/agent-manager 2.js +0 -126
- package/dist/core/agent-manager.d 2.ts +0 -51
- package/dist/core/archive-manager 2.js +0 -338
- package/dist/core/archive-manager.d 2.ts +0 -100
- package/dist/core/conversation-analyzer.d 2.ts +0 -86
- package/dist/core/doc-injector 2.js +0 -236
- package/dist/core/doc-injector.d 2.ts +0 -51
- package/dist/core/git-manager 2.js +0 -214
- package/dist/core/git-manager.d 2.ts +0 -100
- package/dist/core/prompt-optimizer 2.js +0 -963
- package/dist/core/prompt-optimizer.d 2.ts +0 -268
- package/dist/core/question-engine 2.js +0 -395
- package/dist/core/question-engine.d 2.ts +0 -167
- package/dist/core/session-manager 2.js +0 -403
- package/dist/core/session-manager.d 2.ts +0 -139
- package/dist/core/task-manager 2.js +0 -689
- package/dist/core/task-manager.d 2.ts +0 -155
|
@@ -3,10 +3,10 @@ export default class Prd extends Command {
|
|
|
3
3
|
static description: string;
|
|
4
4
|
static examples: string[];
|
|
5
5
|
static flags: {
|
|
6
|
-
quick: import("@oclif/core/
|
|
7
|
-
project: import("@oclif/core/
|
|
8
|
-
template: import("@oclif/core/
|
|
9
|
-
'skip-validation': import("@oclif/core/
|
|
6
|
+
quick: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
7
|
+
project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
8
|
+
template: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
9
|
+
'skip-validation': import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
10
10
|
};
|
|
11
11
|
run(): Promise<void>;
|
|
12
12
|
/**
|
package/dist/cli/commands/prd.js
CHANGED
|
@@ -1,65 +1,56 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
1
|
+
import { Command, Flags } from '@oclif/core';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import inquirer from 'inquirer';
|
|
4
|
+
import * as path from 'path';
|
|
5
|
+
import { fileURLToPath } from 'url';
|
|
6
|
+
import { dirname } from 'path';
|
|
7
|
+
import fs from 'fs-extra';
|
|
8
|
+
import { QuestionEngine } from '../../core/question-engine.js';
|
|
9
|
+
import { PrdGenerator } from '../../core/prd-generator.js';
|
|
10
|
+
import { PromptOptimizer } from '../../core/prompt-optimizer.js';
|
|
11
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
12
|
+
const __dirname = dirname(__filename);
|
|
13
|
+
export default class Prd extends Command {
|
|
14
|
+
static description = 'Generate a Product Requirements Document through Socratic questioning';
|
|
15
|
+
static examples = [
|
|
16
|
+
'<%= config.bin %> <%= command.id %>',
|
|
17
|
+
'<%= config.bin %> <%= command.id %> --quick',
|
|
18
|
+
'<%= config.bin %> <%= command.id %> --project my-app',
|
|
19
|
+
];
|
|
20
|
+
static flags = {
|
|
21
|
+
quick: Flags.boolean({
|
|
22
|
+
char: 'q',
|
|
23
|
+
description: 'Use quick mode with fewer questions',
|
|
24
|
+
default: false,
|
|
25
|
+
}),
|
|
26
|
+
project: Flags.string({
|
|
27
|
+
char: 'p',
|
|
28
|
+
description: 'Project name for organizing outputs',
|
|
29
|
+
}),
|
|
30
|
+
template: Flags.string({
|
|
31
|
+
char: 't',
|
|
32
|
+
description: 'Path to custom question template',
|
|
33
|
+
}),
|
|
34
|
+
'skip-validation': Flags.boolean({
|
|
35
|
+
description: 'Skip CLEAR framework validation of generated PRD',
|
|
36
|
+
default: false,
|
|
37
|
+
}),
|
|
33
38
|
};
|
|
34
|
-
})();
|
|
35
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
-
};
|
|
38
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
-
const core_1 = require("@oclif/core");
|
|
40
|
-
const chalk_1 = __importDefault(require("chalk"));
|
|
41
|
-
const inquirer_1 = __importDefault(require("inquirer"));
|
|
42
|
-
const path = __importStar(require("path"));
|
|
43
|
-
const fs = __importStar(require("fs-extra"));
|
|
44
|
-
const question_engine_1 = require("../../core/question-engine");
|
|
45
|
-
const prd_generator_1 = require("../../core/prd-generator");
|
|
46
|
-
const prompt_optimizer_1 = require("../../core/prompt-optimizer");
|
|
47
|
-
class Prd extends core_1.Command {
|
|
48
39
|
async run() {
|
|
49
40
|
const { flags } = await this.parse(Prd);
|
|
50
|
-
console.log(
|
|
51
|
-
console.log(
|
|
41
|
+
console.log(chalk.bold.cyan('\nPRD Generator\n'));
|
|
42
|
+
console.log(chalk.gray("Let's create a comprehensive Product Requirements Document through strategic questions.\n"));
|
|
52
43
|
try {
|
|
53
44
|
// Initialize QuestionEngine
|
|
54
|
-
const engine = new
|
|
45
|
+
const engine = new QuestionEngine();
|
|
55
46
|
// Determine template path
|
|
56
47
|
const templatePath = flags.template ||
|
|
57
48
|
path.join(__dirname, '../../templates/prd-questions.md');
|
|
58
49
|
// Load question flow
|
|
59
|
-
console.log(
|
|
50
|
+
console.log(chalk.dim('Loading questions...\n'));
|
|
60
51
|
const flow = await engine.loadFlow(templatePath);
|
|
61
|
-
console.log(
|
|
62
|
-
console.log(
|
|
52
|
+
console.log(chalk.bold(`${flow.name}`));
|
|
53
|
+
console.log(chalk.gray(flow.description));
|
|
63
54
|
console.log();
|
|
64
55
|
// Collect answers through Socratic questioning
|
|
65
56
|
const answers = {};
|
|
@@ -68,10 +59,10 @@ class Prd extends core_1.Command {
|
|
|
68
59
|
let stackDetectionDone = false;
|
|
69
60
|
while (question) {
|
|
70
61
|
const progress = engine.getProgress();
|
|
71
|
-
console.log(
|
|
62
|
+
console.log(chalk.dim(`[${progress.current + 1}/${progress.total}]`));
|
|
72
63
|
let answer;
|
|
73
64
|
if (question.type === 'confirm') {
|
|
74
|
-
const response = await
|
|
65
|
+
const response = await inquirer.prompt([
|
|
75
66
|
{
|
|
76
67
|
type: 'confirm',
|
|
77
68
|
name: 'answer',
|
|
@@ -82,7 +73,7 @@ class Prd extends core_1.Command {
|
|
|
82
73
|
answer = response.answer;
|
|
83
74
|
}
|
|
84
75
|
else if (question.type === 'list' && question.choices) {
|
|
85
|
-
const response = await
|
|
76
|
+
const response = await inquirer.prompt([
|
|
86
77
|
{
|
|
87
78
|
type: 'list',
|
|
88
79
|
name: 'answer',
|
|
@@ -102,10 +93,10 @@ class Prd extends core_1.Command {
|
|
|
102
93
|
detectedStack = await this.detectProjectTechStack();
|
|
103
94
|
stackDetectionDone = true;
|
|
104
95
|
if (detectedStack) {
|
|
105
|
-
messageText = `${currentQuestion.text}\n ${
|
|
96
|
+
messageText = `${currentQuestion.text}\n ${chalk.cyan('Detected:')} ${chalk.green(detectedStack)} ${chalk.dim('(press Enter to use, or type to override)')}`;
|
|
106
97
|
}
|
|
107
98
|
}
|
|
108
|
-
const response = await
|
|
99
|
+
const response = await inquirer.prompt([
|
|
109
100
|
{
|
|
110
101
|
type: 'input',
|
|
111
102
|
name: 'answer',
|
|
@@ -131,14 +122,14 @@ class Prd extends core_1.Command {
|
|
|
131
122
|
// If Q3 and answer is empty but we have detected stack, use it
|
|
132
123
|
if (currentQuestion.id === 'q3' && !answer.trim() && detectedStack) {
|
|
133
124
|
answer = detectedStack;
|
|
134
|
-
console.log(
|
|
125
|
+
console.log(chalk.dim(` Using detected: ${detectedStack}`));
|
|
135
126
|
}
|
|
136
127
|
}
|
|
137
128
|
// Submit answer (only if not empty or if it's a detected stack for Q3)
|
|
138
129
|
if (answer && answer.toString().trim() && question) {
|
|
139
130
|
const submitResult = engine.submitAnswer(question.id, answer);
|
|
140
131
|
if (submitResult !== true) {
|
|
141
|
-
console.log(
|
|
132
|
+
console.log(chalk.red(`\n${submitResult}\n`));
|
|
142
133
|
continue; // Ask again
|
|
143
134
|
}
|
|
144
135
|
answers[question.id] = answer;
|
|
@@ -147,29 +138,29 @@ class Prd extends core_1.Command {
|
|
|
147
138
|
question = engine.getNextQuestion();
|
|
148
139
|
}
|
|
149
140
|
// All questions answered
|
|
150
|
-
console.log(
|
|
141
|
+
console.log(chalk.bold.green('\nAll questions answered!\n'));
|
|
151
142
|
// Generate PRDs
|
|
152
|
-
console.log(
|
|
153
|
-
const generator = new
|
|
143
|
+
console.log(chalk.dim('Generating PRD documents...\n'));
|
|
144
|
+
const generator = new PrdGenerator();
|
|
154
145
|
const projectName = flags.project || generator.extractProjectName(answers);
|
|
155
146
|
const outputPath = await generator.generate(answers, {
|
|
156
147
|
projectName,
|
|
157
148
|
outputDir: '.clavix/outputs',
|
|
158
149
|
});
|
|
159
150
|
// Display success message
|
|
160
|
-
console.log(
|
|
161
|
-
console.log(
|
|
162
|
-
console.log(
|
|
151
|
+
console.log(chalk.bold.green('PRD documents generated successfully!\n'));
|
|
152
|
+
console.log(chalk.bold('Output location:'));
|
|
153
|
+
console.log(chalk.cyan(` ${outputPath}`));
|
|
163
154
|
console.log();
|
|
164
|
-
console.log(
|
|
165
|
-
console.log(
|
|
166
|
-
console.log(
|
|
155
|
+
console.log(chalk.bold('Generated files:'));
|
|
156
|
+
console.log(chalk.gray(` • full-prd.md`) + chalk.dim(' - Comprehensive PRD for team alignment'));
|
|
157
|
+
console.log(chalk.gray(` • quick-prd.md`) + chalk.dim(' - Condensed prompt for AI agents'));
|
|
167
158
|
console.log();
|
|
168
159
|
// CLEAR validation of quick-prd.md (unless skipped)
|
|
169
160
|
if (!flags['skip-validation']) {
|
|
170
161
|
await this.validatePrdWithClear(outputPath);
|
|
171
162
|
}
|
|
172
|
-
console.log(
|
|
163
|
+
console.log(chalk.gray('Tip: Use quick-prd.md as input for your AI agent to start development\n'));
|
|
173
164
|
}
|
|
174
165
|
catch (error) {
|
|
175
166
|
const errorMessage = error instanceof Error ? error.message : 'An unexpected error occurred';
|
|
@@ -265,21 +256,21 @@ class Prd extends core_1.Command {
|
|
|
265
256
|
const quickPrdPath = path.join(outputPath, 'quick-prd.md');
|
|
266
257
|
// Read the generated quick-prd.md
|
|
267
258
|
const prdContent = await fs.readFile(quickPrdPath, 'utf-8');
|
|
268
|
-
console.log(
|
|
269
|
-
console.log(
|
|
259
|
+
console.log(chalk.bold.cyan('📊 CLEAR Framework Validation\n'));
|
|
260
|
+
console.log(chalk.gray('Analyzing quick-prd.md for AI consumption quality...\n'));
|
|
270
261
|
// Run CLEAR analysis (C, L, E only for PRDs)
|
|
271
|
-
const optimizer = new
|
|
262
|
+
const optimizer = new PromptOptimizer();
|
|
272
263
|
const clearResult = optimizer.applyCLEARFramework(prdContent, 'fast');
|
|
273
264
|
const clearScore = optimizer.calculateCLEARScore(clearResult);
|
|
274
265
|
const getScoreColor = (score) => {
|
|
275
266
|
if (score >= 80)
|
|
276
|
-
return
|
|
267
|
+
return chalk.green;
|
|
277
268
|
if (score >= 60)
|
|
278
|
-
return
|
|
279
|
-
return
|
|
269
|
+
return chalk.yellow;
|
|
270
|
+
return chalk.red;
|
|
280
271
|
};
|
|
281
272
|
// Display CLEAR assessment for AI consumption
|
|
282
|
-
console.log(
|
|
273
|
+
console.log(chalk.bold('AI Consumption Quality Assessment:\n'));
|
|
283
274
|
// Conciseness
|
|
284
275
|
const cColor = getScoreColor(clearScore.conciseness);
|
|
285
276
|
console.log(cColor.bold(` [C] Concise: ${clearScore.conciseness.toFixed(0)}%`));
|
|
@@ -312,63 +303,37 @@ class Prd extends core_1.Command {
|
|
|
312
303
|
console.log(overallColor.bold(` Overall CLEAR Score: ${clearScore.overall.toFixed(0)}% (${clearScore.rating})\n`));
|
|
313
304
|
// Recommendations
|
|
314
305
|
if (clearScore.overall < 80) {
|
|
315
|
-
console.log(
|
|
306
|
+
console.log(chalk.yellow('💡 PRD Quality Tips:\n'));
|
|
316
307
|
if (clearScore.conciseness < 80 && clearResult.conciseness.suggestions.length > 0) {
|
|
317
|
-
console.log(
|
|
308
|
+
console.log(chalk.yellow(' [C] Consider making the PRD more concise:'));
|
|
318
309
|
clearResult.conciseness.suggestions.slice(0, 2).forEach((s) => {
|
|
319
|
-
console.log(
|
|
310
|
+
console.log(chalk.yellow(` • ${s}`));
|
|
320
311
|
});
|
|
321
312
|
console.log();
|
|
322
313
|
}
|
|
323
314
|
if (clearScore.logic < 80 && clearResult.logic.suggestions.length > 0) {
|
|
324
|
-
console.log(
|
|
315
|
+
console.log(chalk.yellow(' [L] Improve logical structure:'));
|
|
325
316
|
clearResult.logic.suggestions.slice(0, 2).forEach((s) => {
|
|
326
|
-
console.log(
|
|
317
|
+
console.log(chalk.yellow(` • ${s}`));
|
|
327
318
|
});
|
|
328
319
|
console.log();
|
|
329
320
|
}
|
|
330
321
|
if (clearScore.explicitness < 80 && clearResult.explicitness.suggestions.length > 0) {
|
|
331
|
-
console.log(
|
|
322
|
+
console.log(chalk.yellow(' [E] Add more explicit details:'));
|
|
332
323
|
clearResult.explicitness.suggestions.slice(0, 2).forEach((s) => {
|
|
333
|
-
console.log(
|
|
324
|
+
console.log(chalk.yellow(` • ${s}`));
|
|
334
325
|
});
|
|
335
326
|
console.log();
|
|
336
327
|
}
|
|
337
328
|
}
|
|
338
329
|
else {
|
|
339
|
-
console.log(
|
|
330
|
+
console.log(chalk.green('✨ Excellent! This PRD is well-optimized for AI consumption.\n'));
|
|
340
331
|
}
|
|
341
332
|
}
|
|
342
333
|
catch {
|
|
343
334
|
// Don't fail the whole command if validation fails
|
|
344
|
-
console.log(
|
|
335
|
+
console.log(chalk.yellow('⚠ Could not validate PRD with CLEAR framework\n'));
|
|
345
336
|
}
|
|
346
337
|
}
|
|
347
338
|
}
|
|
348
|
-
Prd.description = 'Generate a Product Requirements Document through Socratic questioning';
|
|
349
|
-
Prd.examples = [
|
|
350
|
-
'<%= config.bin %> <%= command.id %>',
|
|
351
|
-
'<%= config.bin %> <%= command.id %> --quick',
|
|
352
|
-
'<%= config.bin %> <%= command.id %> --project my-app',
|
|
353
|
-
];
|
|
354
|
-
Prd.flags = {
|
|
355
|
-
quick: core_1.Flags.boolean({
|
|
356
|
-
char: 'q',
|
|
357
|
-
description: 'Use quick mode with fewer questions',
|
|
358
|
-
default: false,
|
|
359
|
-
}),
|
|
360
|
-
project: core_1.Flags.string({
|
|
361
|
-
char: 'p',
|
|
362
|
-
description: 'Project name for organizing outputs',
|
|
363
|
-
}),
|
|
364
|
-
template: core_1.Flags.string({
|
|
365
|
-
char: 't',
|
|
366
|
-
description: 'Path to custom question template',
|
|
367
|
-
}),
|
|
368
|
-
'skip-validation': core_1.Flags.boolean({
|
|
369
|
-
description: 'Skip CLEAR framework validation of generated PRD',
|
|
370
|
-
default: false,
|
|
371
|
-
}),
|
|
372
|
-
};
|
|
373
|
-
exports.default = Prd;
|
|
374
339
|
//# sourceMappingURL=prd.js.map
|
|
@@ -3,12 +3,12 @@ export default class PromptsClear extends Command {
|
|
|
3
3
|
static description: string;
|
|
4
4
|
static examples: string[];
|
|
5
5
|
static flags: {
|
|
6
|
-
fast: import("@oclif/core/
|
|
7
|
-
deep: import("@oclif/core/
|
|
8
|
-
executed: import("@oclif/core/
|
|
9
|
-
stale: import("@oclif/core/
|
|
10
|
-
all: import("@oclif/core/
|
|
11
|
-
force: import("@oclif/core/
|
|
6
|
+
fast: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
7
|
+
deep: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
8
|
+
executed: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
9
|
+
stale: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
10
|
+
all: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
11
|
+
force: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
12
12
|
};
|
|
13
13
|
run(): Promise<void>;
|
|
14
14
|
private interactiveClear;
|
|
@@ -1,16 +1,46 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
};
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
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
|
+
export default class PromptsClear extends Command {
|
|
6
|
+
static description = 'Clear saved prompts with safety checks';
|
|
7
|
+
static examples = [
|
|
8
|
+
'<%= config.bin %> <%= command.id %>',
|
|
9
|
+
'<%= config.bin %> <%= command.id %> --fast',
|
|
10
|
+
'<%= config.bin %> <%= command.id %> --deep',
|
|
11
|
+
'<%= config.bin %> <%= command.id %> --executed',
|
|
12
|
+
'<%= config.bin %> <%= command.id %> --stale',
|
|
13
|
+
'<%= config.bin %> <%= command.id %> --all',
|
|
14
|
+
];
|
|
15
|
+
static flags = {
|
|
16
|
+
fast: Flags.boolean({
|
|
17
|
+
description: 'Clear all fast prompts',
|
|
18
|
+
default: false,
|
|
19
|
+
}),
|
|
20
|
+
deep: Flags.boolean({
|
|
21
|
+
description: 'Clear all deep prompts',
|
|
22
|
+
default: false,
|
|
23
|
+
}),
|
|
24
|
+
executed: Flags.boolean({
|
|
25
|
+
description: 'Clear executed prompts only (safe)',
|
|
26
|
+
default: false,
|
|
27
|
+
}),
|
|
28
|
+
stale: Flags.boolean({
|
|
29
|
+
description: 'Clear stale prompts (>30 days old)',
|
|
30
|
+
default: false,
|
|
31
|
+
}),
|
|
32
|
+
all: Flags.boolean({
|
|
33
|
+
description: 'Clear all prompts (with confirmation)',
|
|
34
|
+
default: false,
|
|
35
|
+
}),
|
|
36
|
+
force: Flags.boolean({
|
|
37
|
+
description: 'Skip confirmation prompts',
|
|
38
|
+
default: false,
|
|
39
|
+
}),
|
|
40
|
+
};
|
|
11
41
|
async run() {
|
|
12
42
|
const { flags } = await this.parse(PromptsClear);
|
|
13
|
-
const promptManager = new
|
|
43
|
+
const promptManager = new PromptManager();
|
|
14
44
|
try {
|
|
15
45
|
// Build filters
|
|
16
46
|
const filters = {};
|
|
@@ -34,23 +64,23 @@ class PromptsClear extends core_1.Command {
|
|
|
34
64
|
// Get prompts that will be deleted
|
|
35
65
|
const toDelete = await promptManager.listPrompts(filters);
|
|
36
66
|
if (toDelete.length === 0) {
|
|
37
|
-
console.log(
|
|
67
|
+
console.log(chalk.yellow('\n⚠️ No prompts match the specified criteria\n'));
|
|
38
68
|
return;
|
|
39
69
|
}
|
|
40
70
|
// Display what will be deleted
|
|
41
|
-
console.log(
|
|
71
|
+
console.log(chalk.bold.cyan(`\n📋 Prompts to Delete (${toDelete.length}):\n`));
|
|
42
72
|
toDelete.forEach(p => {
|
|
43
|
-
const status = p.executed ?
|
|
73
|
+
const status = p.executed ? chalk.green('✓') : chalk.gray('○');
|
|
44
74
|
const age = p.ageInDays === 0 ? 'today' : `${p.ageInDays}d ago`;
|
|
45
75
|
console.log(` ${status} [${p.source}] ${p.id} (${age})`);
|
|
46
|
-
console.log(` ${
|
|
76
|
+
console.log(` ${chalk.gray(p.originalPrompt.substring(0, 60))}...`);
|
|
47
77
|
});
|
|
48
78
|
console.log();
|
|
49
79
|
// Safety check for unexecuted prompts
|
|
50
80
|
const unexecuted = toDelete.filter(p => !p.executed);
|
|
51
81
|
if (unexecuted.length > 0 && !flags.force) {
|
|
52
|
-
console.log(
|
|
53
|
-
const { proceed } = await
|
|
82
|
+
console.log(chalk.yellow(`⚠️ Warning: ${unexecuted.length} unexecuted prompts will be deleted\n`));
|
|
83
|
+
const { proceed } = await inquirer.prompt([
|
|
54
84
|
{
|
|
55
85
|
type: 'confirm',
|
|
56
86
|
name: 'proceed',
|
|
@@ -59,57 +89,57 @@ class PromptsClear extends core_1.Command {
|
|
|
59
89
|
},
|
|
60
90
|
]);
|
|
61
91
|
if (!proceed) {
|
|
62
|
-
console.log(
|
|
92
|
+
console.log(chalk.gray('\nCancelled. No prompts were deleted.\n'));
|
|
63
93
|
return;
|
|
64
94
|
}
|
|
65
95
|
}
|
|
66
96
|
// Final confirmation for --all
|
|
67
97
|
if (flags.all && !flags.force) {
|
|
68
|
-
const { confirm } = await
|
|
98
|
+
const { confirm } = await inquirer.prompt([
|
|
69
99
|
{
|
|
70
100
|
type: 'confirm',
|
|
71
101
|
name: 'confirm',
|
|
72
|
-
message:
|
|
102
|
+
message: chalk.red('Delete ALL prompts? This cannot be undone.'),
|
|
73
103
|
default: false,
|
|
74
104
|
},
|
|
75
105
|
]);
|
|
76
106
|
if (!confirm) {
|
|
77
|
-
console.log(
|
|
107
|
+
console.log(chalk.gray('\nCancelled. No prompts were deleted.\n'));
|
|
78
108
|
return;
|
|
79
109
|
}
|
|
80
110
|
}
|
|
81
111
|
// Delete prompts
|
|
82
112
|
const deleted = await promptManager.deletePrompts(filters);
|
|
83
|
-
console.log(
|
|
113
|
+
console.log(chalk.green(`\n✓ Deleted ${deleted} prompt(s)\n`));
|
|
84
114
|
// Show remaining stats
|
|
85
115
|
const stats = await promptManager.getStorageStats();
|
|
86
116
|
if (stats.totalPrompts > 0) {
|
|
87
|
-
console.log(
|
|
88
|
-
console.log(
|
|
89
|
-
console.log(
|
|
117
|
+
console.log(chalk.gray(`Remaining prompts: ${stats.totalPrompts}`));
|
|
118
|
+
console.log(chalk.gray(` Fast: ${stats.fastPrompts} | Deep: ${stats.deepPrompts}`));
|
|
119
|
+
console.log(chalk.gray(` Executed: ${stats.executedPrompts} | Pending: ${stats.pendingPrompts}\n`));
|
|
90
120
|
}
|
|
91
121
|
}
|
|
92
122
|
catch (error) {
|
|
93
|
-
console.log(
|
|
123
|
+
console.log(chalk.red(`\n✗ Error: ${error}\n`));
|
|
94
124
|
}
|
|
95
125
|
}
|
|
96
126
|
async interactiveClear(manager) {
|
|
97
127
|
const allPrompts = await manager.listPrompts();
|
|
98
128
|
if (allPrompts.length === 0) {
|
|
99
|
-
console.log(
|
|
129
|
+
console.log(chalk.yellow('\n⚠️ No prompts to clear\n'));
|
|
100
130
|
return;
|
|
101
131
|
}
|
|
102
|
-
console.log(
|
|
132
|
+
console.log(chalk.bold.cyan(`\n📋 Clear Saved Prompts\n`));
|
|
103
133
|
const choices = [
|
|
104
134
|
{ name: 'Executed prompts only (safe)', value: 'executed' },
|
|
105
135
|
{ name: 'Stale prompts (>30 days old)', value: 'stale' },
|
|
106
136
|
{ name: 'Old prompts (>7 days old)', value: 'old' },
|
|
107
137
|
{ name: 'Fast prompts only', value: 'fast' },
|
|
108
138
|
{ name: 'Deep prompts only', value: 'deep' },
|
|
109
|
-
{ name:
|
|
139
|
+
{ name: chalk.red('All prompts (dangerous)'), value: 'all' },
|
|
110
140
|
{ name: 'Cancel', value: 'cancel' },
|
|
111
141
|
];
|
|
112
|
-
const { selection } = await
|
|
142
|
+
const { selection } = await inquirer.prompt([
|
|
113
143
|
{
|
|
114
144
|
type: 'list',
|
|
115
145
|
name: 'selection',
|
|
@@ -118,7 +148,7 @@ class PromptsClear extends core_1.Command {
|
|
|
118
148
|
},
|
|
119
149
|
]);
|
|
120
150
|
if (selection === 'cancel') {
|
|
121
|
-
console.log(
|
|
151
|
+
console.log(chalk.gray('\nCancelled.\n'));
|
|
122
152
|
return;
|
|
123
153
|
}
|
|
124
154
|
// Build filters based on selection
|
|
@@ -144,21 +174,21 @@ class PromptsClear extends core_1.Command {
|
|
|
144
174
|
? allPrompts
|
|
145
175
|
: await manager.listPrompts(filters);
|
|
146
176
|
if (toDelete.length === 0) {
|
|
147
|
-
console.log(
|
|
177
|
+
console.log(chalk.yellow('\n⚠️ No prompts match the selected criteria\n'));
|
|
148
178
|
return;
|
|
149
179
|
}
|
|
150
180
|
// Show preview
|
|
151
|
-
console.log(
|
|
181
|
+
console.log(chalk.cyan(`\nWill delete ${toDelete.length} prompt(s):\n`));
|
|
152
182
|
toDelete.slice(0, 5).forEach(p => {
|
|
153
|
-
const status = p.executed ?
|
|
183
|
+
const status = p.executed ? chalk.green('✓') : chalk.gray('○');
|
|
154
184
|
console.log(` ${status} [${p.source}] ${p.id}`);
|
|
155
185
|
});
|
|
156
186
|
if (toDelete.length > 5) {
|
|
157
|
-
console.log(
|
|
187
|
+
console.log(chalk.gray(` ... and ${toDelete.length - 5} more`));
|
|
158
188
|
}
|
|
159
189
|
console.log();
|
|
160
190
|
// Confirm deletion
|
|
161
|
-
const { confirm } = await
|
|
191
|
+
const { confirm } = await inquirer.prompt([
|
|
162
192
|
{
|
|
163
193
|
type: 'confirm',
|
|
164
194
|
name: 'confirm',
|
|
@@ -167,56 +197,20 @@ class PromptsClear extends core_1.Command {
|
|
|
167
197
|
},
|
|
168
198
|
]);
|
|
169
199
|
if (!confirm) {
|
|
170
|
-
console.log(
|
|
200
|
+
console.log(chalk.gray('\nCancelled. No prompts were deleted.\n'));
|
|
171
201
|
return;
|
|
172
202
|
}
|
|
173
203
|
// Delete
|
|
174
204
|
const deleted = await manager.deletePrompts(filters);
|
|
175
|
-
console.log(
|
|
205
|
+
console.log(chalk.green(`\n✓ Deleted ${deleted} prompt(s)\n`));
|
|
176
206
|
// Show remaining
|
|
177
207
|
const stats = await manager.getStorageStats();
|
|
178
208
|
if (stats.totalPrompts > 0) {
|
|
179
|
-
console.log(
|
|
209
|
+
console.log(chalk.gray(`Remaining: ${stats.totalPrompts} prompt(s)\n`));
|
|
180
210
|
}
|
|
181
211
|
else {
|
|
182
|
-
console.log(
|
|
212
|
+
console.log(chalk.gray('All prompts cleared.\n'));
|
|
183
213
|
}
|
|
184
214
|
}
|
|
185
215
|
}
|
|
186
|
-
PromptsClear.description = 'Clear saved prompts with safety checks';
|
|
187
|
-
PromptsClear.examples = [
|
|
188
|
-
'<%= config.bin %> <%= command.id %>',
|
|
189
|
-
'<%= config.bin %> <%= command.id %> --fast',
|
|
190
|
-
'<%= config.bin %> <%= command.id %> --deep',
|
|
191
|
-
'<%= config.bin %> <%= command.id %> --executed',
|
|
192
|
-
'<%= config.bin %> <%= command.id %> --stale',
|
|
193
|
-
'<%= config.bin %> <%= command.id %> --all',
|
|
194
|
-
];
|
|
195
|
-
PromptsClear.flags = {
|
|
196
|
-
fast: core_1.Flags.boolean({
|
|
197
|
-
description: 'Clear all fast prompts',
|
|
198
|
-
default: false,
|
|
199
|
-
}),
|
|
200
|
-
deep: core_1.Flags.boolean({
|
|
201
|
-
description: 'Clear all deep prompts',
|
|
202
|
-
default: false,
|
|
203
|
-
}),
|
|
204
|
-
executed: core_1.Flags.boolean({
|
|
205
|
-
description: 'Clear executed prompts only (safe)',
|
|
206
|
-
default: false,
|
|
207
|
-
}),
|
|
208
|
-
stale: core_1.Flags.boolean({
|
|
209
|
-
description: 'Clear stale prompts (>30 days old)',
|
|
210
|
-
default: false,
|
|
211
|
-
}),
|
|
212
|
-
all: core_1.Flags.boolean({
|
|
213
|
-
description: 'Clear all prompts (with confirmation)',
|
|
214
|
-
default: false,
|
|
215
|
-
}),
|
|
216
|
-
force: core_1.Flags.boolean({
|
|
217
|
-
description: 'Skip confirmation prompts',
|
|
218
|
-
default: false,
|
|
219
|
-
}),
|
|
220
|
-
};
|
|
221
|
-
exports.default = PromptsClear;
|
|
222
216
|
//# sourceMappingURL=clear.js.map
|