clavix 2.7.0 → 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 +22 -8
- 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 +12 -7
- 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
|
@@ -1,52 +1,36 @@
|
|
|
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
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
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 { SessionManager } from '../../core/session-manager.js';
|
|
6
|
+
export default class Start extends Command {
|
|
7
|
+
static description = 'Start an interactive conversation session for iterative prompt development';
|
|
8
|
+
static examples = [
|
|
9
|
+
'<%= config.bin %> <%= command.id %>',
|
|
10
|
+
'<%= config.bin %> <%= command.id %> --project my-app',
|
|
11
|
+
'<%= config.bin %> <%= command.id %> --description "Planning new feature"',
|
|
12
|
+
];
|
|
13
|
+
static flags = {
|
|
14
|
+
project: Flags.string({
|
|
15
|
+
char: 'p',
|
|
16
|
+
description: 'Project name for this session',
|
|
17
|
+
}),
|
|
18
|
+
description: Flags.string({
|
|
19
|
+
char: 'd',
|
|
20
|
+
description: 'Session description',
|
|
21
|
+
}),
|
|
22
|
+
tags: Flags.string({
|
|
23
|
+
char: 't',
|
|
24
|
+
description: 'Comma-separated tags for this session',
|
|
25
|
+
multiple: false,
|
|
26
|
+
}),
|
|
33
27
|
};
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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 session_manager_1 = require("../../core/session-manager");
|
|
44
|
-
class Start extends core_1.Command {
|
|
28
|
+
sessionManager;
|
|
29
|
+
sessionId = null;
|
|
30
|
+
isExiting = false;
|
|
45
31
|
constructor(argv, config) {
|
|
46
32
|
super(argv, config);
|
|
47
|
-
this.
|
|
48
|
-
this.isExiting = false;
|
|
49
|
-
this.sessionManager = new session_manager_1.SessionManager();
|
|
33
|
+
this.sessionManager = new SessionManager();
|
|
50
34
|
}
|
|
51
35
|
async run() {
|
|
52
36
|
const { flags } = await this.parse(Start);
|
|
@@ -79,24 +63,24 @@ class Start extends core_1.Command {
|
|
|
79
63
|
* Display introduction and instructions
|
|
80
64
|
*/
|
|
81
65
|
displayIntroduction(projectName, sessionId) {
|
|
82
|
-
console.log(
|
|
83
|
-
console.log(
|
|
66
|
+
console.log(chalk.bold.cyan('\n💬 Conversational Session Started\n'));
|
|
67
|
+
console.log(chalk.gray('━'.repeat(60)));
|
|
84
68
|
console.log();
|
|
85
|
-
console.log(
|
|
86
|
-
console.log(
|
|
69
|
+
console.log(chalk.bold('Project:'), chalk.cyan(projectName));
|
|
70
|
+
console.log(chalk.bold('Session ID:'), chalk.dim(sessionId));
|
|
87
71
|
console.log();
|
|
88
|
-
console.log(
|
|
72
|
+
console.log(chalk.gray('━'.repeat(60)));
|
|
89
73
|
console.log();
|
|
90
|
-
console.log(
|
|
91
|
-
console.log(
|
|
92
|
-
console.log(
|
|
93
|
-
console.log(
|
|
74
|
+
console.log(chalk.bold('How it works:'));
|
|
75
|
+
console.log(chalk.gray(' • Share your ideas and requirements naturally'));
|
|
76
|
+
console.log(chalk.gray(' • The conversation is tracked and saved'));
|
|
77
|
+
console.log(chalk.gray(' • Use ') + chalk.cyan('/clavix:summarize') + chalk.gray(' later to extract structured requirements'));
|
|
94
78
|
console.log();
|
|
95
|
-
console.log(
|
|
96
|
-
console.log(
|
|
97
|
-
console.log(
|
|
79
|
+
console.log(chalk.bold('Commands:'));
|
|
80
|
+
console.log(chalk.gray(' • Type ') + chalk.yellow('exit') + chalk.gray(' or ') + chalk.yellow('quit') + chalk.gray(' to end the session'));
|
|
81
|
+
console.log(chalk.gray(' • Press ') + chalk.yellow('Ctrl+C') + chalk.gray(' to exit'));
|
|
98
82
|
console.log();
|
|
99
|
-
console.log(
|
|
83
|
+
console.log(chalk.gray('━'.repeat(60)));
|
|
100
84
|
console.log();
|
|
101
85
|
}
|
|
102
86
|
/**
|
|
@@ -107,11 +91,11 @@ class Start extends core_1.Command {
|
|
|
107
91
|
while (!this.isExiting) {
|
|
108
92
|
try {
|
|
109
93
|
// Get user input
|
|
110
|
-
const response = await
|
|
94
|
+
const response = await inquirer.prompt([
|
|
111
95
|
{
|
|
112
96
|
type: 'input',
|
|
113
97
|
name: 'message',
|
|
114
|
-
message:
|
|
98
|
+
message: chalk.bold.cyan('You:'),
|
|
115
99
|
prefix: '',
|
|
116
100
|
},
|
|
117
101
|
]);
|
|
@@ -156,7 +140,7 @@ class Start extends core_1.Command {
|
|
|
156
140
|
];
|
|
157
141
|
const index = (messageCount - 1) % acknowledgments.length;
|
|
158
142
|
const message = acknowledgments[index];
|
|
159
|
-
console.log(
|
|
143
|
+
console.log(chalk.dim('Assistant:'), chalk.gray(message));
|
|
160
144
|
}
|
|
161
145
|
/**
|
|
162
146
|
* Check if message is an exit command
|
|
@@ -189,60 +173,38 @@ class Start extends core_1.Command {
|
|
|
189
173
|
return;
|
|
190
174
|
}
|
|
191
175
|
console.log();
|
|
192
|
-
console.log(
|
|
176
|
+
console.log(chalk.gray('━'.repeat(60)));
|
|
193
177
|
console.log();
|
|
194
178
|
const session = await this.sessionManager.getSession(this.sessionId);
|
|
195
179
|
if (session) {
|
|
196
|
-
console.log(
|
|
197
|
-
console.log(
|
|
198
|
-
console.log(
|
|
199
|
-
console.log(
|
|
200
|
-
console.log(
|
|
201
|
-
console.log(
|
|
180
|
+
console.log(chalk.bold.green('Session saved successfully!\n'));
|
|
181
|
+
console.log(chalk.bold('Session Details:'));
|
|
182
|
+
console.log(chalk.gray(' Session ID:'), chalk.cyan(session.id));
|
|
183
|
+
console.log(chalk.gray(' Project:'), chalk.cyan(session.projectName));
|
|
184
|
+
console.log(chalk.gray(' Messages:'), chalk.cyan(session.messages.length.toString()));
|
|
185
|
+
console.log(chalk.gray(' Created:'), chalk.dim(session.created.toLocaleString()));
|
|
202
186
|
if (session.tags && session.tags.length > 0) {
|
|
203
|
-
console.log(
|
|
187
|
+
console.log(chalk.gray(' Tags:'), chalk.cyan(session.tags.join(', ')));
|
|
204
188
|
}
|
|
205
189
|
if (session.description) {
|
|
206
|
-
console.log(
|
|
190
|
+
console.log(chalk.gray(' Description:'), chalk.dim(session.description));
|
|
207
191
|
}
|
|
208
192
|
const sessionPath = path.join('.clavix/sessions', `${session.id}.json`);
|
|
209
193
|
console.log();
|
|
210
|
-
console.log(
|
|
211
|
-
console.log(
|
|
194
|
+
console.log(chalk.bold('Session file:'));
|
|
195
|
+
console.log(chalk.dim(` ${sessionPath}`));
|
|
212
196
|
console.log();
|
|
213
|
-
console.log(
|
|
214
|
-
console.log(
|
|
215
|
-
console.log(
|
|
216
|
-
console.log(
|
|
197
|
+
console.log(chalk.bold('Next steps:'));
|
|
198
|
+
console.log(chalk.gray(' • Resume: ') + chalk.cyan(`clavix start --resume ${session.id}`));
|
|
199
|
+
console.log(chalk.gray(' • Summarize: ') + chalk.cyan(`clavix summarize ${session.id}`));
|
|
200
|
+
console.log(chalk.gray(' • View: ') + chalk.cyan(`clavix show ${session.id}`));
|
|
217
201
|
console.log();
|
|
218
202
|
}
|
|
219
203
|
else {
|
|
220
|
-
console.log(
|
|
204
|
+
console.log(chalk.yellow('Warning: Could not retrieve session information\n'));
|
|
221
205
|
}
|
|
222
|
-
console.log(
|
|
206
|
+
console.log(chalk.gray('━'.repeat(60)));
|
|
223
207
|
console.log();
|
|
224
208
|
}
|
|
225
209
|
}
|
|
226
|
-
Start.description = 'Start an interactive conversation session for iterative prompt development';
|
|
227
|
-
Start.examples = [
|
|
228
|
-
'<%= config.bin %> <%= command.id %>',
|
|
229
|
-
'<%= config.bin %> <%= command.id %> --project my-app',
|
|
230
|
-
'<%= config.bin %> <%= command.id %> --description "Planning new feature"',
|
|
231
|
-
];
|
|
232
|
-
Start.flags = {
|
|
233
|
-
project: core_1.Flags.string({
|
|
234
|
-
char: 'p',
|
|
235
|
-
description: 'Project name for this session',
|
|
236
|
-
}),
|
|
237
|
-
description: core_1.Flags.string({
|
|
238
|
-
char: 'd',
|
|
239
|
-
description: 'Session description',
|
|
240
|
-
}),
|
|
241
|
-
tags: core_1.Flags.string({
|
|
242
|
-
char: 't',
|
|
243
|
-
description: 'Comma-separated tags for this session',
|
|
244
|
-
multiple: false,
|
|
245
|
-
}),
|
|
246
|
-
};
|
|
247
|
-
exports.default = Start;
|
|
248
210
|
//# sourceMappingURL=start.js.map
|
|
@@ -3,12 +3,12 @@ export default class Summarize extends Command {
|
|
|
3
3
|
static description: string;
|
|
4
4
|
static examples: string[];
|
|
5
5
|
static args: {
|
|
6
|
-
sessionId: import("@oclif/core/
|
|
6
|
+
sessionId: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
|
|
7
7
|
};
|
|
8
8
|
static flags: {
|
|
9
|
-
active: import("@oclif/core/
|
|
10
|
-
output: import("@oclif/core/
|
|
11
|
-
'skip-clear': import("@oclif/core/
|
|
9
|
+
active: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
10
|
+
output: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
11
|
+
'skip-clear': import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
12
12
|
};
|
|
13
13
|
run(): Promise<void>;
|
|
14
14
|
/**
|
|
@@ -1,66 +1,55 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
1
|
+
import { Command, Args, Flags } from '@oclif/core';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import * as path from 'path';
|
|
4
|
+
import { SessionManager } from '../../core/session-manager.js';
|
|
5
|
+
import { ConversationAnalyzer } from '../../core/conversation-analyzer.js';
|
|
6
|
+
import { FileSystem } from '../../utils/file-system.js';
|
|
7
|
+
import { PromptOptimizer } from '../../core/prompt-optimizer.js';
|
|
8
|
+
export default class Summarize extends Command {
|
|
9
|
+
static description = 'Analyze a conversation session and extract structured requirements';
|
|
10
|
+
static examples = [
|
|
11
|
+
'<%= config.bin %> <%= command.id %>',
|
|
12
|
+
'<%= config.bin %> <%= command.id %> <session-id>',
|
|
13
|
+
'<%= config.bin %> <%= command.id %> --active',
|
|
14
|
+
];
|
|
15
|
+
static args = {
|
|
16
|
+
sessionId: Args.string({
|
|
17
|
+
description: 'Session ID to summarize',
|
|
18
|
+
required: false,
|
|
19
|
+
}),
|
|
26
20
|
};
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
21
|
+
static flags = {
|
|
22
|
+
active: Flags.boolean({
|
|
23
|
+
char: 'a',
|
|
24
|
+
description: 'Summarize the most recent active session',
|
|
25
|
+
default: false,
|
|
26
|
+
}),
|
|
27
|
+
output: Flags.string({
|
|
28
|
+
char: 'o',
|
|
29
|
+
description: 'Output directory (defaults to .clavix/outputs/[session-name])',
|
|
30
|
+
}),
|
|
31
|
+
'skip-clear': Flags.boolean({
|
|
32
|
+
description: 'Skip CLEAR framework optimization of extracted prompt',
|
|
33
|
+
default: false,
|
|
34
|
+
}),
|
|
33
35
|
};
|
|
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 path = __importStar(require("path"));
|
|
42
|
-
const session_manager_1 = require("../../core/session-manager");
|
|
43
|
-
const conversation_analyzer_1 = require("../../core/conversation-analyzer");
|
|
44
|
-
const file_system_1 = require("../../utils/file-system");
|
|
45
|
-
const prompt_optimizer_1 = require("../../core/prompt-optimizer");
|
|
46
|
-
class Summarize extends core_1.Command {
|
|
47
36
|
async run() {
|
|
48
37
|
const { args, flags } = await this.parse(Summarize);
|
|
49
|
-
console.log(
|
|
38
|
+
console.log(chalk.bold.cyan('\nConversation Summarizer\n'));
|
|
50
39
|
try {
|
|
51
|
-
const manager = new
|
|
52
|
-
const analyzer = new
|
|
40
|
+
const manager = new SessionManager();
|
|
41
|
+
const analyzer = new ConversationAnalyzer();
|
|
53
42
|
// Load session
|
|
54
43
|
let session;
|
|
55
44
|
if (args.sessionId) {
|
|
56
|
-
console.log(
|
|
45
|
+
console.log(chalk.dim(`Loading session ${args.sessionId}...\n`));
|
|
57
46
|
session = await manager.getSession(args.sessionId);
|
|
58
47
|
if (!session) {
|
|
59
48
|
this.error(`Session not found: ${args.sessionId}`);
|
|
60
49
|
}
|
|
61
50
|
}
|
|
62
51
|
else if (flags.active) {
|
|
63
|
-
console.log(
|
|
52
|
+
console.log(chalk.dim('Loading most recent active session...\n'));
|
|
64
53
|
session = await manager.getActiveSession();
|
|
65
54
|
if (!session) {
|
|
66
55
|
this.error('No active session found\n\nHint: Use "clavix list" to see all sessions');
|
|
@@ -78,59 +67,59 @@ class Summarize extends core_1.Command {
|
|
|
78
67
|
}
|
|
79
68
|
}
|
|
80
69
|
// Display session info
|
|
81
|
-
console.log(
|
|
82
|
-
console.log(
|
|
83
|
-
console.log(
|
|
84
|
-
console.log(
|
|
85
|
-
console.log(
|
|
70
|
+
console.log(chalk.bold('Session Information:'));
|
|
71
|
+
console.log(chalk.gray(' ID:'), chalk.cyan(session.id));
|
|
72
|
+
console.log(chalk.gray(' Project:'), chalk.cyan(session.projectName));
|
|
73
|
+
console.log(chalk.gray(' Messages:'), chalk.cyan(session.messages.length.toString()));
|
|
74
|
+
console.log(chalk.gray(' Created:'), chalk.dim(session.created.toLocaleString()));
|
|
86
75
|
console.log();
|
|
87
76
|
// Check if session has messages
|
|
88
77
|
if (session.messages.length === 0) {
|
|
89
78
|
this.error('Session has no messages to analyze');
|
|
90
79
|
}
|
|
91
80
|
// Analyze conversation
|
|
92
|
-
console.log(
|
|
81
|
+
console.log(chalk.dim('Analyzing conversation...\n'));
|
|
93
82
|
const analysis = analyzer.analyze(session);
|
|
94
83
|
// Display analysis summary
|
|
95
84
|
this.displayAnalysisSummary(analysis);
|
|
96
85
|
// Generate outputs
|
|
97
|
-
console.log(
|
|
86
|
+
console.log(chalk.dim('\nGenerating output files...\n'));
|
|
98
87
|
const outputDir = flags.output ||
|
|
99
88
|
path.join('.clavix/outputs', this.sanitizeProjectName(session.projectName));
|
|
100
|
-
await
|
|
89
|
+
await FileSystem.ensureDir(outputDir);
|
|
101
90
|
// Generate mini-PRD
|
|
102
91
|
const miniPrdContent = analyzer.generateMiniPrd(session, analysis);
|
|
103
92
|
const miniPrdPath = path.join(outputDir, 'mini-prd.md');
|
|
104
|
-
await
|
|
93
|
+
await FileSystem.writeFileAtomic(miniPrdPath, miniPrdContent);
|
|
105
94
|
// Generate optimized prompt
|
|
106
95
|
const optimizedPromptContent = analyzer.generateOptimizedPrompt(session, analysis);
|
|
107
96
|
const optimizedPromptPath = path.join(outputDir, 'optimized-prompt.md');
|
|
108
|
-
await
|
|
97
|
+
await FileSystem.writeFileAtomic(optimizedPromptPath, optimizedPromptContent);
|
|
109
98
|
// CLEAR optimization (unless skipped)
|
|
110
99
|
if (!flags['skip-clear']) {
|
|
111
100
|
await this.applyClearOptimization(optimizedPromptContent, outputDir);
|
|
112
101
|
}
|
|
113
102
|
// Display success
|
|
114
|
-
console.log(
|
|
115
|
-
console.log(
|
|
116
|
-
console.log(
|
|
117
|
-
console.log(
|
|
103
|
+
console.log(chalk.bold.green('Analysis complete!\n'));
|
|
104
|
+
console.log(chalk.bold('Generated files:'));
|
|
105
|
+
console.log(chalk.gray(' • ') + chalk.cyan('mini-prd.md') + chalk.dim(' - Structured requirements document'));
|
|
106
|
+
console.log(chalk.gray(' • ') + chalk.cyan('optimized-prompt.md') + chalk.dim(' - AI-ready development prompt'));
|
|
118
107
|
if (!flags['skip-clear']) {
|
|
119
|
-
console.log(
|
|
108
|
+
console.log(chalk.gray(' • ') + chalk.cyan('clear-optimized-prompt.md') + chalk.dim(' - CLEAR-enhanced version (C, L, E)'));
|
|
120
109
|
}
|
|
121
110
|
console.log();
|
|
122
|
-
console.log(
|
|
123
|
-
console.log(
|
|
111
|
+
console.log(chalk.bold('Output location:'));
|
|
112
|
+
console.log(chalk.dim(` ${outputDir}`));
|
|
124
113
|
console.log();
|
|
125
|
-
console.log(
|
|
114
|
+
console.log(chalk.bold('Next steps:'));
|
|
126
115
|
if (!flags['skip-clear']) {
|
|
127
|
-
console.log(
|
|
128
|
-
console.log(
|
|
116
|
+
console.log(chalk.gray(' • Use ') + chalk.cyan('clear-optimized-prompt.md') + chalk.gray(' for best AI results (CLEAR-optimized)'));
|
|
117
|
+
console.log(chalk.gray(' • Or use ') + chalk.cyan('optimized-prompt.md') + chalk.gray(' for the original extracted version'));
|
|
129
118
|
}
|
|
130
119
|
else {
|
|
131
|
-
console.log(
|
|
120
|
+
console.log(chalk.gray(' • Use ') + chalk.cyan('optimized-prompt.md') + chalk.gray(' as input for your AI agent'));
|
|
132
121
|
}
|
|
133
|
-
console.log(
|
|
122
|
+
console.log(chalk.gray(' • Share ') + chalk.cyan('mini-prd.md') + chalk.gray(' with your team for alignment'));
|
|
134
123
|
console.log();
|
|
135
124
|
}
|
|
136
125
|
catch (error) {
|
|
@@ -142,33 +131,33 @@ class Summarize extends core_1.Command {
|
|
|
142
131
|
* Display analysis summary
|
|
143
132
|
*/
|
|
144
133
|
displayAnalysisSummary(analysis) {
|
|
145
|
-
console.log(
|
|
134
|
+
console.log(chalk.bold('Analysis Summary:'));
|
|
146
135
|
console.log();
|
|
147
136
|
if (analysis.keyRequirements.length > 0) {
|
|
148
|
-
console.log(
|
|
137
|
+
console.log(chalk.bold.cyan('Key Requirements:'));
|
|
149
138
|
analysis.keyRequirements.forEach((req) => {
|
|
150
|
-
console.log(
|
|
139
|
+
console.log(chalk.gray(' • ') + req);
|
|
151
140
|
});
|
|
152
141
|
console.log();
|
|
153
142
|
}
|
|
154
143
|
if (analysis.technicalConstraints.length > 0) {
|
|
155
|
-
console.log(
|
|
144
|
+
console.log(chalk.bold.cyan('Technical Constraints:'));
|
|
156
145
|
analysis.technicalConstraints.forEach((constraint) => {
|
|
157
|
-
console.log(
|
|
146
|
+
console.log(chalk.gray(' • ') + constraint);
|
|
158
147
|
});
|
|
159
148
|
console.log();
|
|
160
149
|
}
|
|
161
150
|
if (analysis.successCriteria.length > 0) {
|
|
162
|
-
console.log(
|
|
151
|
+
console.log(chalk.bold.cyan('Success Criteria:'));
|
|
163
152
|
analysis.successCriteria.forEach((criteria) => {
|
|
164
|
-
console.log(
|
|
153
|
+
console.log(chalk.gray(' • ') + criteria);
|
|
165
154
|
});
|
|
166
155
|
console.log();
|
|
167
156
|
}
|
|
168
157
|
if (analysis.outOfScope.length > 0) {
|
|
169
|
-
console.log(
|
|
158
|
+
console.log(chalk.bold.yellow('Out of Scope:'));
|
|
170
159
|
analysis.outOfScope.forEach((item) => {
|
|
171
|
-
console.log(
|
|
160
|
+
console.log(chalk.gray(' • ') + item);
|
|
172
161
|
});
|
|
173
162
|
console.log();
|
|
174
163
|
}
|
|
@@ -190,20 +179,20 @@ class Summarize extends core_1.Command {
|
|
|
190
179
|
*/
|
|
191
180
|
async applyClearOptimization(rawPrompt, outputDir) {
|
|
192
181
|
try {
|
|
193
|
-
console.log(
|
|
194
|
-
console.log(
|
|
195
|
-
const optimizer = new
|
|
182
|
+
console.log(chalk.bold.cyan('\n🎯 CLEAR Framework Optimization\n'));
|
|
183
|
+
console.log(chalk.gray('Applying CLEAR framework to extracted prompt...\n'));
|
|
184
|
+
const optimizer = new PromptOptimizer();
|
|
196
185
|
const clearResult = optimizer.applyCLEARFramework(rawPrompt, 'fast');
|
|
197
186
|
const clearScore = optimizer.calculateCLEARScore(clearResult);
|
|
198
187
|
const getScoreColor = (score) => {
|
|
199
188
|
if (score >= 80)
|
|
200
|
-
return
|
|
189
|
+
return chalk.green;
|
|
201
190
|
if (score >= 60)
|
|
202
|
-
return
|
|
203
|
-
return
|
|
191
|
+
return chalk.yellow;
|
|
192
|
+
return chalk.red;
|
|
204
193
|
};
|
|
205
194
|
// Display comparison
|
|
206
|
-
console.log(
|
|
195
|
+
console.log(chalk.bold('CLEAR Analysis of Extracted Prompt:\n'));
|
|
207
196
|
// Conciseness
|
|
208
197
|
const cColor = getScoreColor(clearScore.conciseness);
|
|
209
198
|
console.log(cColor(` [C] Concise: ${clearScore.conciseness.toFixed(0)}%`));
|
|
@@ -230,9 +219,9 @@ class Summarize extends core_1.Command {
|
|
|
230
219
|
console.log(overallColor(` Overall: ${clearScore.overall.toFixed(0)}% (${clearScore.rating})\n`));
|
|
231
220
|
// Display CLEAR changes made
|
|
232
221
|
if (clearResult.changesSummary && clearResult.changesSummary.length > 0) {
|
|
233
|
-
console.log(
|
|
222
|
+
console.log(chalk.bold.magenta('CLEAR Improvements Applied:\n'));
|
|
234
223
|
clearResult.changesSummary.slice(0, 3).forEach((change) => {
|
|
235
|
-
console.log(
|
|
224
|
+
console.log(chalk.magenta(` [${change.component}] ${change.change}`));
|
|
236
225
|
});
|
|
237
226
|
console.log();
|
|
238
227
|
}
|
|
@@ -255,40 +244,12 @@ ${clearResult.improvedPrompt}
|
|
|
255
244
|
|
|
256
245
|
${clearResult.changesSummary.map((c) => `- **[${c.component}]** ${c.change}`).join('\n')}
|
|
257
246
|
`;
|
|
258
|
-
await
|
|
259
|
-
console.log(
|
|
247
|
+
await FileSystem.writeFileAtomic(clearOptimizedPath, clearOptimizedContent);
|
|
248
|
+
console.log(chalk.green('✓ CLEAR-optimized version saved\n'));
|
|
260
249
|
}
|
|
261
250
|
catch {
|
|
262
|
-
console.log(
|
|
251
|
+
console.log(chalk.yellow('⚠ Could not apply CLEAR optimization\n'));
|
|
263
252
|
}
|
|
264
253
|
}
|
|
265
254
|
}
|
|
266
|
-
Summarize.description = 'Analyze a conversation session and extract structured requirements';
|
|
267
|
-
Summarize.examples = [
|
|
268
|
-
'<%= config.bin %> <%= command.id %>',
|
|
269
|
-
'<%= config.bin %> <%= command.id %> <session-id>',
|
|
270
|
-
'<%= config.bin %> <%= command.id %> --active',
|
|
271
|
-
];
|
|
272
|
-
Summarize.args = {
|
|
273
|
-
sessionId: core_1.Args.string({
|
|
274
|
-
description: 'Session ID to summarize',
|
|
275
|
-
required: false,
|
|
276
|
-
}),
|
|
277
|
-
};
|
|
278
|
-
Summarize.flags = {
|
|
279
|
-
active: core_1.Flags.boolean({
|
|
280
|
-
char: 'a',
|
|
281
|
-
description: 'Summarize the most recent active session',
|
|
282
|
-
default: false,
|
|
283
|
-
}),
|
|
284
|
-
output: core_1.Flags.string({
|
|
285
|
-
char: 'o',
|
|
286
|
-
description: 'Output directory (defaults to .clavix/outputs/[session-name])',
|
|
287
|
-
}),
|
|
288
|
-
'skip-clear': core_1.Flags.boolean({
|
|
289
|
-
description: 'Skip CLEAR framework optimization of extracted prompt',
|
|
290
|
-
default: false,
|
|
291
|
-
}),
|
|
292
|
-
};
|
|
293
|
-
exports.default = Summarize;
|
|
294
255
|
//# sourceMappingURL=summarize.js.map
|
|
@@ -3,12 +3,12 @@ export default class TaskComplete extends Command {
|
|
|
3
3
|
static description: string;
|
|
4
4
|
static examples: string[];
|
|
5
5
|
static args: {
|
|
6
|
-
taskId: import("@oclif/core/
|
|
6
|
+
taskId: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
|
|
7
7
|
};
|
|
8
8
|
static flags: {
|
|
9
|
-
'no-git': import("@oclif/core/
|
|
10
|
-
force: import("@oclif/core/
|
|
11
|
-
config: import("@oclif/core/
|
|
9
|
+
'no-git': import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
10
|
+
force: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
11
|
+
config: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
12
12
|
};
|
|
13
13
|
run(): Promise<void>;
|
|
14
14
|
/**
|