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,23 +1,22 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
class PromptsList extends core_1.Command {
|
|
1
|
+
import { Command } from '@oclif/core';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { PromptManager } from '../../../core/prompt-manager.js';
|
|
4
|
+
export default class PromptsList extends Command {
|
|
5
|
+
static description = 'List all saved prompts with age warnings and storage statistics';
|
|
6
|
+
static examples = [
|
|
7
|
+
'<%= config.bin %> <%= command.id %>',
|
|
8
|
+
];
|
|
10
9
|
async run() {
|
|
11
|
-
const promptManager = new
|
|
10
|
+
const promptManager = new PromptManager();
|
|
12
11
|
try {
|
|
13
12
|
const prompts = await promptManager.listPrompts();
|
|
14
13
|
const stats = await promptManager.getStorageStats();
|
|
15
|
-
console.log(
|
|
14
|
+
console.log(chalk.bold.cyan(`\nš Saved Prompts (${prompts.length} total)\n`));
|
|
16
15
|
if (prompts.length === 0) {
|
|
17
|
-
console.log(
|
|
18
|
-
console.log(
|
|
19
|
-
console.log(
|
|
20
|
-
console.log(
|
|
16
|
+
console.log(chalk.gray('No prompts saved yet.\n'));
|
|
17
|
+
console.log(chalk.cyan('Generate an optimized prompt:'));
|
|
18
|
+
console.log(chalk.cyan(' /clavix:fast "your requirement"'));
|
|
19
|
+
console.log(chalk.cyan(' /clavix:deep "your requirement"'));
|
|
21
20
|
console.log();
|
|
22
21
|
return;
|
|
23
22
|
}
|
|
@@ -25,75 +24,70 @@ class PromptsList extends core_1.Command {
|
|
|
25
24
|
const fastPrompts = prompts.filter(p => p.source === 'fast');
|
|
26
25
|
const deepPrompts = prompts.filter(p => p.source === 'deep');
|
|
27
26
|
if (fastPrompts.length > 0) {
|
|
28
|
-
console.log(
|
|
27
|
+
console.log(chalk.bold('Fast Prompts:'));
|
|
29
28
|
this.displayPrompts(fastPrompts);
|
|
30
29
|
console.log();
|
|
31
30
|
}
|
|
32
31
|
if (deepPrompts.length > 0) {
|
|
33
|
-
console.log(
|
|
32
|
+
console.log(chalk.bold('Deep Prompts:'));
|
|
34
33
|
this.displayPrompts(deepPrompts);
|
|
35
34
|
console.log();
|
|
36
35
|
}
|
|
37
36
|
// Display storage statistics
|
|
38
|
-
console.log(
|
|
39
|
-
console.log(
|
|
40
|
-
console.log(
|
|
41
|
-
console.log(
|
|
37
|
+
console.log(chalk.bold('š Storage Statistics:\n'));
|
|
38
|
+
console.log(chalk.gray(` Total Prompts: ${stats.totalPrompts}`));
|
|
39
|
+
console.log(chalk.gray(` Fast: ${stats.fastPrompts} | Deep: ${stats.deepPrompts}`));
|
|
40
|
+
console.log(chalk.gray(` Executed: ${stats.executedPrompts} | Pending: ${stats.pendingPrompts}`));
|
|
42
41
|
if (stats.oldestPromptAge > 0) {
|
|
43
|
-
console.log(
|
|
42
|
+
console.log(chalk.gray(` Oldest: ${stats.oldestPromptAge} days`));
|
|
44
43
|
}
|
|
45
44
|
console.log();
|
|
46
45
|
// Storage hygiene recommendations
|
|
47
46
|
if (stats.stalePrompts > 0) {
|
|
48
|
-
console.log(
|
|
49
|
-
console.log(
|
|
47
|
+
console.log(chalk.yellow(`ā ļø ${stats.stalePrompts} stale prompts (>30 days old)`));
|
|
48
|
+
console.log(chalk.yellow(` Recommend: clavix prompts clear --stale\n`));
|
|
50
49
|
}
|
|
51
50
|
if (stats.executedPrompts >= 10) {
|
|
52
|
-
console.log(
|
|
53
|
-
console.log(
|
|
51
|
+
console.log(chalk.cyan(`š” ${stats.executedPrompts} executed prompts`));
|
|
52
|
+
console.log(chalk.cyan(` Recommend: clavix prompts clear --executed\n`));
|
|
54
53
|
}
|
|
55
54
|
if (stats.totalPrompts >= 20) {
|
|
56
|
-
console.log(
|
|
57
|
-
console.log(
|
|
55
|
+
console.log(chalk.yellow(`ā ļø Storage approaching limit (${stats.totalPrompts}/recommended 20)`));
|
|
56
|
+
console.log(chalk.yellow(` Consider cleanup: clavix prompts clear\n`));
|
|
58
57
|
}
|
|
59
58
|
}
|
|
60
59
|
catch (error) {
|
|
61
|
-
console.log(
|
|
60
|
+
console.log(chalk.red(`\nā Error: ${error}\n`));
|
|
62
61
|
}
|
|
63
62
|
}
|
|
64
63
|
displayPrompts(prompts) {
|
|
65
64
|
prompts.forEach(p => {
|
|
66
|
-
const status = p.executed ?
|
|
65
|
+
const status = p.executed ? chalk.green('ā') : chalk.gray('ā');
|
|
67
66
|
const ageInDays = p.ageInDays || 0;
|
|
68
67
|
// Age warning coloring
|
|
69
68
|
let ageWarning = '';
|
|
70
69
|
let ageStr = '';
|
|
71
70
|
if (ageInDays === 0) {
|
|
72
|
-
ageStr =
|
|
71
|
+
ageStr = chalk.gray('today');
|
|
73
72
|
}
|
|
74
73
|
else if (ageInDays > 30) {
|
|
75
|
-
ageStr =
|
|
76
|
-
ageWarning =
|
|
74
|
+
ageStr = chalk.red(`${ageInDays}d`);
|
|
75
|
+
ageWarning = chalk.red(' [STALE]');
|
|
77
76
|
}
|
|
78
77
|
else if (ageInDays > 7) {
|
|
79
|
-
ageStr =
|
|
80
|
-
ageWarning =
|
|
78
|
+
ageStr = chalk.yellow(`${ageInDays}d`);
|
|
79
|
+
ageWarning = chalk.yellow(' [OLD]');
|
|
81
80
|
}
|
|
82
81
|
else {
|
|
83
|
-
ageStr =
|
|
82
|
+
ageStr = chalk.gray(`${ageInDays}d`);
|
|
84
83
|
}
|
|
85
84
|
// Truncate original prompt for display
|
|
86
85
|
const promptPreview = p.originalPrompt.length > 50
|
|
87
86
|
? p.originalPrompt.substring(0, 50) + '...'
|
|
88
87
|
: p.originalPrompt;
|
|
89
|
-
console.log(` ${status} ${
|
|
90
|
-
console.log(` ${
|
|
88
|
+
console.log(` ${status} ${chalk.dim(p.id)} (${ageStr})${ageWarning}`);
|
|
89
|
+
console.log(` ${chalk.gray(promptPreview)}`);
|
|
91
90
|
});
|
|
92
91
|
}
|
|
93
92
|
}
|
|
94
|
-
PromptsList.description = 'List all saved prompts with age warnings and storage statistics';
|
|
95
|
-
PromptsList.examples = [
|
|
96
|
-
'<%= config.bin %> <%= command.id %>',
|
|
97
|
-
];
|
|
98
|
-
exports.default = PromptsList;
|
|
99
93
|
//# sourceMappingURL=list.js.map
|
|
@@ -3,12 +3,12 @@ export default class Show 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
|
-
output: import("@oclif/core/
|
|
10
|
-
full: import("@oclif/core/
|
|
11
|
-
limit: import("@oclif/core/
|
|
9
|
+
output: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
10
|
+
full: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
11
|
+
limit: import("@oclif/core/interfaces").OptionFlag<number, import("@oclif/core/interfaces").CustomOptions>;
|
|
12
12
|
};
|
|
13
13
|
run(): Promise<void>;
|
|
14
14
|
private showSession;
|
|
@@ -1,56 +1,46 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
})
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
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 fs from 'fs-extra';
|
|
4
|
+
import * as path from 'path';
|
|
5
|
+
import { SessionManager } from '../../core/session-manager.js';
|
|
6
|
+
export default class Show extends Command {
|
|
7
|
+
static description = 'Show detailed information about a session or output';
|
|
8
|
+
static examples = [
|
|
9
|
+
'<%= config.bin %> <%= command.id %> session-id',
|
|
10
|
+
'<%= config.bin %> <%= command.id %> session-id --full',
|
|
11
|
+
'<%= config.bin %> <%= command.id %> --output project-name',
|
|
12
|
+
];
|
|
13
|
+
static args = {
|
|
14
|
+
sessionId: Args.string({
|
|
15
|
+
description: 'Session ID to show',
|
|
16
|
+
required: false,
|
|
17
|
+
}),
|
|
26
18
|
};
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
19
|
+
static flags = {
|
|
20
|
+
output: Flags.string({
|
|
21
|
+
char: 'o',
|
|
22
|
+
description: 'Show output directory contents',
|
|
23
|
+
}),
|
|
24
|
+
full: Flags.boolean({
|
|
25
|
+
char: 'f',
|
|
26
|
+
description: 'Show full conversation history',
|
|
27
|
+
default: false,
|
|
28
|
+
}),
|
|
29
|
+
limit: Flags.integer({
|
|
30
|
+
char: 'l',
|
|
31
|
+
description: 'Limit number of messages to show',
|
|
32
|
+
default: 10,
|
|
33
|
+
}),
|
|
33
34
|
};
|
|
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 fs = __importStar(require("fs-extra"));
|
|
42
|
-
const path = __importStar(require("path"));
|
|
43
|
-
const session_manager_1 = require("../../core/session-manager");
|
|
44
|
-
class Show extends core_1.Command {
|
|
45
35
|
async run() {
|
|
46
36
|
const { args, flags } = await this.parse(Show);
|
|
47
37
|
const clavixDir = path.join(process.cwd(), '.clavix');
|
|
48
38
|
if (!fs.existsSync(clavixDir)) {
|
|
49
|
-
this.error(
|
|
39
|
+
this.error(chalk.red('No .clavix directory found.') +
|
|
50
40
|
'\n' +
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
41
|
+
chalk.yellow('Run ') +
|
|
42
|
+
chalk.cyan('clavix init') +
|
|
43
|
+
chalk.yellow(' to initialize Clavix in this project.'));
|
|
54
44
|
}
|
|
55
45
|
// Show output directory if --output flag is used
|
|
56
46
|
if (flags.output) {
|
|
@@ -63,68 +53,68 @@ class Show extends core_1.Command {
|
|
|
63
53
|
return;
|
|
64
54
|
}
|
|
65
55
|
// If no arguments, show most recent session
|
|
66
|
-
const sessionManager = new
|
|
56
|
+
const sessionManager = new SessionManager();
|
|
67
57
|
const sessions = await sessionManager.listSessions();
|
|
68
58
|
if (sessions.length === 0) {
|
|
69
|
-
this.error(
|
|
59
|
+
this.error(chalk.yellow('No sessions found.') +
|
|
70
60
|
'\n' +
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
61
|
+
chalk.gray('Run ') +
|
|
62
|
+
chalk.cyan('clavix start') +
|
|
63
|
+
chalk.gray(' to create a new session.'));
|
|
74
64
|
}
|
|
75
65
|
// Get most recent session
|
|
76
66
|
const mostRecent = sessions.sort((a, b) => new Date(b.updated).getTime() - new Date(a.updated).getTime())[0];
|
|
77
|
-
this.log(
|
|
67
|
+
this.log(chalk.gray('Showing most recent session:\n'));
|
|
78
68
|
await this.showSession(mostRecent.id, flags.full, flags.limit);
|
|
79
69
|
}
|
|
80
70
|
async showSession(sessionId, showFull, limit) {
|
|
81
|
-
const sessionManager = new
|
|
71
|
+
const sessionManager = new SessionManager();
|
|
82
72
|
try {
|
|
83
73
|
const session = await sessionManager.getSession(sessionId);
|
|
84
74
|
if (!session) {
|
|
85
|
-
this.error(
|
|
75
|
+
this.error(chalk.red(`Session "${sessionId}" not found.`));
|
|
86
76
|
}
|
|
87
77
|
this.displaySessionHeader(session);
|
|
88
78
|
// Show conversation history
|
|
89
79
|
const messages = session.messages || [];
|
|
90
80
|
if (messages.length === 0) {
|
|
91
|
-
this.log(
|
|
81
|
+
this.log(chalk.gray(' No messages in this session yet.'));
|
|
92
82
|
return;
|
|
93
83
|
}
|
|
94
|
-
this.log(
|
|
84
|
+
this.log(chalk.bold.cyan('\nš¬ Conversation History\n'));
|
|
95
85
|
const messagesToShow = showFull ? messages : messages.slice(0, limit);
|
|
96
86
|
messagesToShow.forEach((msg, index) => {
|
|
97
87
|
const timestamp = new Date(msg.timestamp).toLocaleTimeString();
|
|
98
|
-
const roleColor = msg.role === 'user' ?
|
|
88
|
+
const roleColor = msg.role === 'user' ? chalk.blue : chalk.green;
|
|
99
89
|
const roleLabel = msg.role === 'user' ? 'User' : 'Assistant';
|
|
100
|
-
this.log(` ${roleColor.bold(roleLabel)} ${
|
|
90
|
+
this.log(` ${roleColor.bold(roleLabel)} ${chalk.gray(`[${timestamp}]`)}` +
|
|
101
91
|
`\n ${this.wrapText(msg.content, 80)}` +
|
|
102
92
|
(index < messagesToShow.length - 1 ? '\n' : ''));
|
|
103
93
|
});
|
|
104
94
|
if (!showFull && messages.length > limit) {
|
|
105
95
|
this.log('');
|
|
106
|
-
this.log(
|
|
96
|
+
this.log(chalk.gray(` ... ${messages.length - limit} more messages`) +
|
|
107
97
|
'\n' +
|
|
108
|
-
|
|
98
|
+
chalk.gray(` Use ${chalk.cyan('--full')} to see the complete conversation`));
|
|
109
99
|
}
|
|
110
100
|
// Show associated outputs if any
|
|
111
101
|
this.showAssociatedOutputs(session);
|
|
112
102
|
}
|
|
113
103
|
catch (error) {
|
|
114
|
-
this.error(
|
|
104
|
+
this.error(chalk.red(`Error loading session: ${error.message}`));
|
|
115
105
|
}
|
|
116
106
|
}
|
|
117
107
|
displaySessionHeader(session) {
|
|
118
108
|
const statusIcon = session.status === 'active' ? 'š¢' : 'āŖ';
|
|
119
109
|
const projectName = session.projectName || 'untitled';
|
|
120
|
-
this.log(
|
|
121
|
-
this.log(` ${statusIcon} ${
|
|
122
|
-
this.log(` ${
|
|
123
|
-
this.log(` ${
|
|
124
|
-
this.log(` ${
|
|
125
|
-
this.log(` ${
|
|
126
|
-
this.log(` ${
|
|
127
|
-
this.log(` ${
|
|
110
|
+
this.log(chalk.bold.cyan('š Session Details\n'));
|
|
111
|
+
this.log(` ${statusIcon} ${chalk.bold(projectName)}`);
|
|
112
|
+
this.log(` ${chalk.gray('ID:')} ${session.id}`);
|
|
113
|
+
this.log(` ${chalk.gray('Agent:')} ${session.agent || 'unknown'}`);
|
|
114
|
+
this.log(` ${chalk.gray('Created:')} ${new Date(session.created).toLocaleString()}`);
|
|
115
|
+
this.log(` ${chalk.gray('Updated:')} ${new Date(session.updated).toLocaleString()}`);
|
|
116
|
+
this.log(` ${chalk.gray('Status:')} ${session.status === 'active' ? chalk.green('active') : chalk.gray('completed')}`);
|
|
117
|
+
this.log(` ${chalk.gray('Messages:')} ${session.messages?.length || 0}`);
|
|
128
118
|
}
|
|
129
119
|
showAssociatedOutputs(session) {
|
|
130
120
|
const outputsDir = path.join(process.cwd(), '.clavix', 'outputs');
|
|
@@ -137,40 +127,40 @@ class Show extends core_1.Command {
|
|
|
137
127
|
if (files.length === 0) {
|
|
138
128
|
return;
|
|
139
129
|
}
|
|
140
|
-
this.log(
|
|
141
|
-
this.log(` ${
|
|
142
|
-
this.log(` ${
|
|
130
|
+
this.log(chalk.bold.cyan('\nš Associated Outputs\n'));
|
|
131
|
+
this.log(` ${chalk.gray('Path:')} ${chalk.dim(path.relative(process.cwd(), projectOutputDir))}`);
|
|
132
|
+
this.log(` ${chalk.gray('Files:')}`);
|
|
143
133
|
files.forEach(file => {
|
|
144
134
|
const filePath = path.join(projectOutputDir, file);
|
|
145
135
|
const stats = fs.statSync(filePath);
|
|
146
136
|
const size = this.formatFileSize(stats.size);
|
|
147
|
-
this.log(` ⢠${
|
|
137
|
+
this.log(` ⢠${chalk.cyan(file)} ${chalk.gray(`(${size})`)}`);
|
|
148
138
|
});
|
|
149
139
|
}
|
|
150
140
|
async showOutput(projectName) {
|
|
151
141
|
const outputsDir = path.join(process.cwd(), '.clavix', 'outputs', projectName);
|
|
152
142
|
if (!fs.existsSync(outputsDir)) {
|
|
153
|
-
this.error(
|
|
143
|
+
this.error(chalk.red(`Output directory "${projectName}" not found.`));
|
|
154
144
|
}
|
|
155
|
-
this.log(
|
|
156
|
-
this.log(` ${
|
|
145
|
+
this.log(chalk.bold.cyan(`š Output: ${projectName}\n`));
|
|
146
|
+
this.log(` ${chalk.gray('Path:')} ${chalk.dim(path.relative(process.cwd(), outputsDir))}`);
|
|
157
147
|
const files = fs.readdirSync(outputsDir).filter(f => f.endsWith('.md'));
|
|
158
148
|
if (files.length === 0) {
|
|
159
|
-
this.log(
|
|
149
|
+
this.log(chalk.gray(' No output files found.'));
|
|
160
150
|
return;
|
|
161
151
|
}
|
|
162
|
-
this.log(`\n ${
|
|
152
|
+
this.log(`\n ${chalk.gray('Files:')}`);
|
|
163
153
|
files.forEach(file => {
|
|
164
154
|
const filePath = path.join(outputsDir, file);
|
|
165
155
|
const stats = fs.statSync(filePath);
|
|
166
156
|
const size = this.formatFileSize(stats.size);
|
|
167
157
|
const modified = stats.mtime.toLocaleString();
|
|
168
|
-
this.log(` ⢠${
|
|
169
|
-
`\n ${
|
|
170
|
-
`${
|
|
158
|
+
this.log(` ⢠${chalk.cyan(file)}` +
|
|
159
|
+
`\n ${chalk.gray('Size:')} ${size} ${chalk.gray('ā')} ` +
|
|
160
|
+
`${chalk.gray('Modified:')} ${modified}`);
|
|
171
161
|
});
|
|
172
162
|
this.log('');
|
|
173
|
-
this.log(
|
|
163
|
+
this.log(chalk.gray(` Use ${chalk.cyan(`cat ${path.relative(process.cwd(), outputsDir)}/<file>`)} to view file contents`));
|
|
174
164
|
}
|
|
175
165
|
wrapText(text, maxWidth) {
|
|
176
166
|
const words = text.split(' ');
|
|
@@ -198,33 +188,4 @@ class Show extends core_1.Command {
|
|
|
198
188
|
return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
|
|
199
189
|
}
|
|
200
190
|
}
|
|
201
|
-
Show.description = 'Show detailed information about a session or output';
|
|
202
|
-
Show.examples = [
|
|
203
|
-
'<%= config.bin %> <%= command.id %> session-id',
|
|
204
|
-
'<%= config.bin %> <%= command.id %> session-id --full',
|
|
205
|
-
'<%= config.bin %> <%= command.id %> --output project-name',
|
|
206
|
-
];
|
|
207
|
-
Show.args = {
|
|
208
|
-
sessionId: core_1.Args.string({
|
|
209
|
-
description: 'Session ID to show',
|
|
210
|
-
required: false,
|
|
211
|
-
}),
|
|
212
|
-
};
|
|
213
|
-
Show.flags = {
|
|
214
|
-
output: core_1.Flags.string({
|
|
215
|
-
char: 'o',
|
|
216
|
-
description: 'Show output directory contents',
|
|
217
|
-
}),
|
|
218
|
-
full: core_1.Flags.boolean({
|
|
219
|
-
char: 'f',
|
|
220
|
-
description: 'Show full conversation history',
|
|
221
|
-
default: false,
|
|
222
|
-
}),
|
|
223
|
-
limit: core_1.Flags.integer({
|
|
224
|
-
char: 'l',
|
|
225
|
-
description: 'Limit number of messages to show',
|
|
226
|
-
default: 10,
|
|
227
|
-
}),
|
|
228
|
-
};
|
|
229
|
-
exports.default = Show;
|
|
230
191
|
//# sourceMappingURL=show.js.map
|
|
@@ -3,9 +3,9 @@ export default class Start extends Command {
|
|
|
3
3
|
static description: string;
|
|
4
4
|
static examples: string[];
|
|
5
5
|
static flags: {
|
|
6
|
-
project: import("@oclif/core/
|
|
7
|
-
description: import("@oclif/core/
|
|
8
|
-
tags: import("@oclif/core/
|
|
6
|
+
project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
7
|
+
description: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
8
|
+
tags: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
9
9
|
};
|
|
10
10
|
private sessionManager;
|
|
11
11
|
private sessionId;
|