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,56 +1,51 @@
|
|
|
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 fs from 'fs-extra';
|
|
4
|
+
import * as path from 'path';
|
|
5
|
+
import { SessionManager } from '../../core/session-manager.js';
|
|
6
|
+
export default class List extends Command {
|
|
7
|
+
static description = 'List sessions and outputs';
|
|
8
|
+
static examples = [
|
|
9
|
+
'<%= config.bin %> <%= command.id %>',
|
|
10
|
+
'<%= config.bin %> <%= command.id %> --sessions',
|
|
11
|
+
'<%= config.bin %> <%= command.id %> --outputs',
|
|
12
|
+
'<%= config.bin %> <%= command.id %> --project my-feature',
|
|
13
|
+
];
|
|
14
|
+
static flags = {
|
|
15
|
+
sessions: Flags.boolean({
|
|
16
|
+
char: 's',
|
|
17
|
+
description: 'List only sessions',
|
|
18
|
+
default: false,
|
|
19
|
+
}),
|
|
20
|
+
outputs: Flags.boolean({
|
|
21
|
+
char: 'o',
|
|
22
|
+
description: 'List only outputs',
|
|
23
|
+
default: false,
|
|
24
|
+
}),
|
|
25
|
+
archived: Flags.boolean({
|
|
26
|
+
char: 'a',
|
|
27
|
+
description: 'Include archived projects in outputs',
|
|
28
|
+
default: false,
|
|
29
|
+
}),
|
|
30
|
+
project: Flags.string({
|
|
31
|
+
char: 'p',
|
|
32
|
+
description: 'Filter by project name',
|
|
33
|
+
}),
|
|
34
|
+
limit: Flags.integer({
|
|
35
|
+
char: 'l',
|
|
36
|
+
description: 'Limit number of results',
|
|
37
|
+
default: 20,
|
|
38
|
+
}),
|
|
33
39
|
};
|
|
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 List extends core_1.Command {
|
|
45
40
|
async run() {
|
|
46
41
|
const { flags } = await this.parse(List);
|
|
47
42
|
const clavixDir = path.join(process.cwd(), '.clavix');
|
|
48
43
|
if (!fs.existsSync(clavixDir)) {
|
|
49
|
-
this.error(
|
|
44
|
+
this.error(chalk.red('No .clavix directory found.') +
|
|
50
45
|
'\n' +
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
46
|
+
chalk.yellow('Run ') +
|
|
47
|
+
chalk.cyan('clavix init') +
|
|
48
|
+
chalk.yellow(' to initialize Clavix in this project.'));
|
|
54
49
|
}
|
|
55
50
|
// If no specific flag is set, show both
|
|
56
51
|
const showSessions = flags.sessions || (!flags.outputs && !flags.sessions);
|
|
@@ -66,12 +61,12 @@ class List extends core_1.Command {
|
|
|
66
61
|
}
|
|
67
62
|
}
|
|
68
63
|
async listSessions(projectFilter, limit) {
|
|
69
|
-
this.log(
|
|
70
|
-
const sessionManager = new
|
|
64
|
+
this.log(chalk.bold.cyan('📋 Sessions\n'));
|
|
65
|
+
const sessionManager = new SessionManager();
|
|
71
66
|
const sessions = await sessionManager.listSessions();
|
|
72
67
|
if (sessions.length === 0) {
|
|
73
|
-
this.log(
|
|
74
|
-
this.log(
|
|
68
|
+
this.log(chalk.gray(' No sessions found.'));
|
|
69
|
+
this.log(chalk.gray(' Run ') + chalk.cyan('clavix start') + chalk.gray(' to create a new session.'));
|
|
75
70
|
return;
|
|
76
71
|
}
|
|
77
72
|
// Filter by project if specified
|
|
@@ -86,7 +81,7 @@ class List extends core_1.Command {
|
|
|
86
81
|
filteredSessions = filteredSessions.slice(0, limit);
|
|
87
82
|
}
|
|
88
83
|
if (filteredSessions.length === 0) {
|
|
89
|
-
this.log(
|
|
84
|
+
this.log(chalk.gray(` No sessions found matching "${projectFilter}".`));
|
|
90
85
|
return;
|
|
91
86
|
}
|
|
92
87
|
// Display sessions in a table-like format
|
|
@@ -97,25 +92,25 @@ class List extends core_1.Command {
|
|
|
97
92
|
const created = new Date(session.created).toLocaleDateString();
|
|
98
93
|
const updated = new Date(session.updated).toLocaleString();
|
|
99
94
|
const messageCount = session.messageCount || 0;
|
|
100
|
-
this.log(` ${statusIcon} ${
|
|
101
|
-
`\n ${
|
|
102
|
-
`${
|
|
103
|
-
`\n ${
|
|
104
|
-
`${
|
|
95
|
+
this.log(` ${statusIcon} ${chalk.bold(projectName)} ${chalk.gray(`(${session.id})`)}` +
|
|
96
|
+
`\n ${chalk.gray('Created:')} ${created} ${chalk.gray('│')} ` +
|
|
97
|
+
`${chalk.gray('Updated:')} ${updated}` +
|
|
98
|
+
`\n ${chalk.gray('Messages:')} ${messageCount} ${chalk.gray('│')} ` +
|
|
99
|
+
`${chalk.gray('Status:')} ${isActive ? chalk.green('active') : chalk.gray('completed')}` +
|
|
105
100
|
(index < filteredSessions.length - 1 ? '\n' : ''));
|
|
106
101
|
});
|
|
107
102
|
this.log('');
|
|
108
|
-
this.log(
|
|
103
|
+
this.log(chalk.gray(` Showing ${filteredSessions.length} of ${sessions.length} sessions`));
|
|
109
104
|
if (sessions.length > filteredSessions.length && !limit) {
|
|
110
|
-
this.log(
|
|
105
|
+
this.log(chalk.gray(` Use ${chalk.cyan('--limit N')} to show more results`));
|
|
111
106
|
}
|
|
112
107
|
}
|
|
113
108
|
async listOutputs(projectFilter, limit, includeArchived = false) {
|
|
114
|
-
this.log(
|
|
109
|
+
this.log(chalk.bold.cyan('📁 Outputs\n'));
|
|
115
110
|
const outputsDir = path.join(process.cwd(), '.clavix', 'outputs');
|
|
116
111
|
if (!fs.existsSync(outputsDir)) {
|
|
117
|
-
this.log(
|
|
118
|
-
this.log(
|
|
112
|
+
this.log(chalk.gray(' No outputs found.'));
|
|
113
|
+
this.log(chalk.gray(' Run ') + chalk.cyan('clavix prd') + chalk.gray(' or ') + chalk.cyan('clavix summarize') + chalk.gray(' to generate outputs.'));
|
|
119
114
|
return;
|
|
120
115
|
}
|
|
121
116
|
const projectDirs = fs.readdirSync(outputsDir).filter(name => {
|
|
@@ -127,7 +122,7 @@ class List extends core_1.Command {
|
|
|
127
122
|
return fs.statSync(fullPath).isDirectory();
|
|
128
123
|
});
|
|
129
124
|
if (projectDirs.length === 0) {
|
|
130
|
-
this.log(
|
|
125
|
+
this.log(chalk.gray(' No outputs found.'));
|
|
131
126
|
return;
|
|
132
127
|
}
|
|
133
128
|
// Filter by project if specified
|
|
@@ -146,7 +141,7 @@ class List extends core_1.Command {
|
|
|
146
141
|
filteredDirs = filteredDirs.slice(0, limit);
|
|
147
142
|
}
|
|
148
143
|
if (filteredDirs.length === 0) {
|
|
149
|
-
this.log(
|
|
144
|
+
this.log(chalk.gray(` No outputs found matching "${projectFilter}".`));
|
|
150
145
|
return;
|
|
151
146
|
}
|
|
152
147
|
// Display outputs
|
|
@@ -154,16 +149,16 @@ class List extends core_1.Command {
|
|
|
154
149
|
const projectPath = path.join(outputsDir, projectDir);
|
|
155
150
|
const files = fs.readdirSync(projectPath).filter(f => f.endsWith('.md'));
|
|
156
151
|
const modified = fs.statSync(projectPath).mtime.toLocaleDateString();
|
|
157
|
-
this.log(` 📄 ${
|
|
158
|
-
`\n ${
|
|
159
|
-
`\n ${
|
|
160
|
-
`\n ${
|
|
152
|
+
this.log(` 📄 ${chalk.bold(projectDir)}` +
|
|
153
|
+
`\n ${chalk.gray('Path:')} ${chalk.dim(path.relative(process.cwd(), projectPath))}` +
|
|
154
|
+
`\n ${chalk.gray('Files:')} ${files.join(', ')}` +
|
|
155
|
+
`\n ${chalk.gray('Modified:')} ${modified}` +
|
|
161
156
|
(index < filteredDirs.length - 1 ? '\n' : ''));
|
|
162
157
|
});
|
|
163
158
|
this.log('');
|
|
164
|
-
this.log(
|
|
159
|
+
this.log(chalk.gray(` Showing ${filteredDirs.length} of ${projectDirs.length} output directories`));
|
|
165
160
|
if (projectDirs.length > filteredDirs.length && !limit) {
|
|
166
|
-
this.log(
|
|
161
|
+
this.log(chalk.gray(` Use ${chalk.cyan('--limit N')} to show more results`));
|
|
167
162
|
}
|
|
168
163
|
// Show archived projects if flag is set
|
|
169
164
|
if (includeArchived) {
|
|
@@ -202,55 +197,21 @@ class List extends core_1.Command {
|
|
|
202
197
|
}
|
|
203
198
|
// Display archived section header
|
|
204
199
|
this.log('');
|
|
205
|
-
this.log(
|
|
200
|
+
this.log(chalk.bold.cyan('📦 Archived Outputs\n'));
|
|
206
201
|
// Display archived outputs
|
|
207
202
|
filteredDirs.forEach((projectDir, index) => {
|
|
208
203
|
const projectPath = path.join(archiveDir, projectDir);
|
|
209
204
|
const files = fs.readdirSync(projectPath).filter(f => f.endsWith('.md'));
|
|
210
205
|
const modified = fs.statSync(projectPath).mtime.toLocaleDateString();
|
|
211
|
-
this.log(` 📦 ${
|
|
212
|
-
`\n ${
|
|
213
|
-
`\n ${
|
|
214
|
-
`\n ${
|
|
206
|
+
this.log(` 📦 ${chalk.bold(projectDir)} ${chalk.gray('(archived)')}` +
|
|
207
|
+
`\n ${chalk.gray('Path:')} ${chalk.dim(path.relative(process.cwd(), projectPath))}` +
|
|
208
|
+
`\n ${chalk.gray('Files:')} ${files.join(', ')}` +
|
|
209
|
+
`\n ${chalk.gray('Modified:')} ${modified}` +
|
|
215
210
|
(index < filteredDirs.length - 1 ? '\n' : ''));
|
|
216
211
|
});
|
|
217
212
|
this.log('');
|
|
218
|
-
this.log(
|
|
219
|
-
this.log(
|
|
213
|
+
this.log(chalk.gray(` Showing ${filteredDirs.length} of ${archivedDirs.length} archived directories`));
|
|
214
|
+
this.log(chalk.gray(` Use ${chalk.cyan('clavix archive --restore <project>')} to restore a project`));
|
|
220
215
|
}
|
|
221
216
|
}
|
|
222
|
-
List.description = 'List sessions and outputs';
|
|
223
|
-
List.examples = [
|
|
224
|
-
'<%= config.bin %> <%= command.id %>',
|
|
225
|
-
'<%= config.bin %> <%= command.id %> --sessions',
|
|
226
|
-
'<%= config.bin %> <%= command.id %> --outputs',
|
|
227
|
-
'<%= config.bin %> <%= command.id %> --project my-feature',
|
|
228
|
-
];
|
|
229
|
-
List.flags = {
|
|
230
|
-
sessions: core_1.Flags.boolean({
|
|
231
|
-
char: 's',
|
|
232
|
-
description: 'List only sessions',
|
|
233
|
-
default: false,
|
|
234
|
-
}),
|
|
235
|
-
outputs: core_1.Flags.boolean({
|
|
236
|
-
char: 'o',
|
|
237
|
-
description: 'List only outputs',
|
|
238
|
-
default: false,
|
|
239
|
-
}),
|
|
240
|
-
archived: core_1.Flags.boolean({
|
|
241
|
-
char: 'a',
|
|
242
|
-
description: 'Include archived projects in outputs',
|
|
243
|
-
default: false,
|
|
244
|
-
}),
|
|
245
|
-
project: core_1.Flags.string({
|
|
246
|
-
char: 'p',
|
|
247
|
-
description: 'Filter by project name',
|
|
248
|
-
}),
|
|
249
|
-
limit: core_1.Flags.integer({
|
|
250
|
-
char: 'l',
|
|
251
|
-
description: 'Limit number of results',
|
|
252
|
-
default: 20,
|
|
253
|
-
}),
|
|
254
|
-
};
|
|
255
|
-
exports.default = List;
|
|
256
217
|
//# sourceMappingURL=list.js.map
|
|
@@ -3,13 +3,13 @@ export default class Plan extends Command {
|
|
|
3
3
|
static description: string;
|
|
4
4
|
static examples: string[];
|
|
5
5
|
static flags: {
|
|
6
|
-
project: import("@oclif/core/
|
|
7
|
-
'prd-path': import("@oclif/core/
|
|
8
|
-
session: import("@oclif/core/
|
|
9
|
-
'active-session': import("@oclif/core/
|
|
10
|
-
source: import("@oclif/core/
|
|
11
|
-
'max-tasks': import("@oclif/core/
|
|
12
|
-
overwrite: import("@oclif/core/
|
|
6
|
+
project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
7
|
+
'prd-path': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
8
|
+
session: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
9
|
+
'active-session': import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
10
|
+
source: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
11
|
+
'max-tasks': import("@oclif/core/interfaces").OptionFlag<number, import("@oclif/core/interfaces").CustomOptions>;
|
|
12
|
+
overwrite: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
13
13
|
};
|
|
14
14
|
run(): Promise<void>;
|
|
15
15
|
private validateSessionFlags;
|
|
@@ -1,59 +1,58 @@
|
|
|
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 fs from 'fs-extra';
|
|
5
|
+
import * as path from 'path';
|
|
6
|
+
import { TaskManager } from '../../core/task-manager.js';
|
|
7
|
+
import { SessionManager } from '../../core/session-manager.js';
|
|
8
|
+
import { ConversationAnalyzer } from '../../core/conversation-analyzer.js';
|
|
9
|
+
import { FileSystem } from '../../utils/file-system.js';
|
|
10
|
+
import { AgentErrorMessages } from '../../utils/agent-error-messages.js';
|
|
11
|
+
export default class Plan extends Command {
|
|
12
|
+
static description = 'Generate implementation task breakdown from PRD';
|
|
13
|
+
static examples = [
|
|
14
|
+
'<%= config.bin %> <%= command.id %>',
|
|
15
|
+
'<%= config.bin %> <%= command.id %> --project my-app',
|
|
16
|
+
'<%= config.bin %> <%= command.id %> --prd-path .clavix/outputs/my-project',
|
|
17
|
+
'<%= config.bin %> <%= command.id %> --session 1234-5678',
|
|
18
|
+
];
|
|
19
|
+
static flags = {
|
|
20
|
+
project: Flags.string({
|
|
21
|
+
char: 'p',
|
|
22
|
+
description: 'PRD project name (defaults to most recent)',
|
|
23
|
+
}),
|
|
24
|
+
'prd-path': Flags.string({
|
|
25
|
+
description: 'Direct path to PRD directory',
|
|
26
|
+
}),
|
|
27
|
+
session: Flags.string({
|
|
28
|
+
description: 'Session ID to plan from (generates mini-prd.md automatically)',
|
|
29
|
+
}),
|
|
30
|
+
'active-session': Flags.boolean({
|
|
31
|
+
description: 'Use the most recent active session as input',
|
|
32
|
+
default: false,
|
|
33
|
+
}),
|
|
34
|
+
source: Flags.string({
|
|
35
|
+
description: 'Preferred PRD source (auto|full|quick|mini|prompt)',
|
|
36
|
+
options: ['auto', 'full', 'quick', 'mini', 'prompt'],
|
|
37
|
+
default: 'auto',
|
|
38
|
+
}),
|
|
39
|
+
'max-tasks': Flags.integer({
|
|
40
|
+
description: 'Maximum tasks per phase',
|
|
41
|
+
default: 20,
|
|
42
|
+
}),
|
|
43
|
+
overwrite: Flags.boolean({
|
|
44
|
+
char: 'o',
|
|
45
|
+
description: 'Overwrite existing tasks.md file',
|
|
46
|
+
default: false,
|
|
47
|
+
}),
|
|
33
48
|
};
|
|
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 fs = __importStar(require("fs-extra"));
|
|
43
|
-
const path = __importStar(require("path"));
|
|
44
|
-
const task_manager_1 = require("../../core/task-manager");
|
|
45
|
-
const session_manager_1 = require("../../core/session-manager");
|
|
46
|
-
const conversation_analyzer_1 = require("../../core/conversation-analyzer");
|
|
47
|
-
const file_system_1 = require("../../utils/file-system");
|
|
48
|
-
const agent_error_messages_1 = require("../../utils/agent-error-messages");
|
|
49
|
-
class Plan extends core_1.Command {
|
|
50
49
|
async run() {
|
|
51
50
|
const { flags } = await this.parse(Plan);
|
|
52
|
-
console.log(
|
|
53
|
-
console.log(
|
|
51
|
+
console.log(chalk.bold.cyan('\nTask Plan Generator\n'));
|
|
52
|
+
console.log(chalk.gray('Analyzing PRD and generating implementation tasks...\n'));
|
|
54
53
|
try {
|
|
55
54
|
this.validateSessionFlags(flags.session, flags['active-session']);
|
|
56
|
-
const manager = new
|
|
55
|
+
const manager = new TaskManager();
|
|
57
56
|
const sourcePreference = (flags.source ?? 'auto');
|
|
58
57
|
let projectName = null;
|
|
59
58
|
let prdPath = flags['prd-path'] ? path.resolve(flags['prd-path']) : null;
|
|
@@ -70,7 +69,7 @@ class Plan extends core_1.Command {
|
|
|
70
69
|
if (!prdPath) {
|
|
71
70
|
selectedProject = await this.resolveProjectDirectory(manager, flags.project);
|
|
72
71
|
if (!selectedProject) {
|
|
73
|
-
this.error(
|
|
72
|
+
this.error(AgentErrorMessages.noPrdFound());
|
|
74
73
|
}
|
|
75
74
|
prdPath = selectedProject.path;
|
|
76
75
|
projectName = selectedProject.name;
|
|
@@ -82,15 +81,15 @@ class Plan extends core_1.Command {
|
|
|
82
81
|
// Check if tasks.md already exists
|
|
83
82
|
const tasksPath = path.join(prdPath, 'tasks.md');
|
|
84
83
|
if (await fs.pathExists(tasksPath) && !flags.overwrite) {
|
|
85
|
-
console.log(
|
|
86
|
-
console.log(
|
|
87
|
-
console.log(
|
|
84
|
+
console.log(chalk.yellow('Warning: tasks.md already exists.'));
|
|
85
|
+
console.log(chalk.gray(`Location: ${tasksPath}`));
|
|
86
|
+
console.log(chalk.gray('Use --overwrite to regenerate tasks.md.\n'));
|
|
88
87
|
return;
|
|
89
88
|
}
|
|
90
|
-
console.log(
|
|
89
|
+
console.log(chalk.dim('Looking for PRD artifacts...'));
|
|
91
90
|
const availableSources = await manager.detectAvailableSources(prdPath);
|
|
92
91
|
if (availableSources.length === 0) {
|
|
93
|
-
this.error(
|
|
92
|
+
this.error(AgentErrorMessages.noPrdFound());
|
|
94
93
|
}
|
|
95
94
|
if (sourcePreference !== 'auto' && !availableSources.includes(sourcePreference)) {
|
|
96
95
|
this.error(`Preferred source "${sourcePreference}" not found in ${prdPath}\n\n` +
|
|
@@ -98,10 +97,10 @@ class Plan extends core_1.Command {
|
|
|
98
97
|
'Hint: Override with --source flag');
|
|
99
98
|
}
|
|
100
99
|
if (availableSources.length > 1 && sourcePreference === 'auto') {
|
|
101
|
-
console.log(
|
|
100
|
+
console.log(chalk.dim(`Found multiple sources (${availableSources.join(', ')}). Selecting best match...`));
|
|
102
101
|
}
|
|
103
102
|
// Generate tasks
|
|
104
|
-
console.log(
|
|
103
|
+
console.log(chalk.dim('Analyzing PRD content...'));
|
|
105
104
|
const result = await manager.generateTasksFromPrd(prdPath, {
|
|
106
105
|
maxTasksPerPhase: flags['max-tasks'],
|
|
107
106
|
includeReferences: true,
|
|
@@ -111,48 +110,48 @@ class Plan extends core_1.Command {
|
|
|
111
110
|
const chosenSourceFile = path.basename(result.sourcePath);
|
|
112
111
|
const usingOverride = sourcePreference !== 'auto';
|
|
113
112
|
if (usingOverride) {
|
|
114
|
-
console.log(
|
|
113
|
+
console.log(chalk.dim(`Using source: ${chosenSourceFile}`));
|
|
115
114
|
}
|
|
116
115
|
else {
|
|
117
|
-
console.log(
|
|
116
|
+
console.log(chalk.dim(`Using source: ${chosenSourceFile} (override with --source to pick a different artifact).`));
|
|
118
117
|
}
|
|
119
118
|
// Display results
|
|
120
|
-
console.log(
|
|
119
|
+
console.log(chalk.bold.green('\nTask plan generated successfully!\n'));
|
|
121
120
|
if (generatedFromSession) {
|
|
122
|
-
console.log(
|
|
121
|
+
console.log(chalk.bold('Generated artifacts:'));
|
|
123
122
|
generatedArtifacts.forEach((artifact) => {
|
|
124
|
-
console.log(
|
|
123
|
+
console.log(chalk.gray(` • ${artifact}`));
|
|
125
124
|
});
|
|
126
125
|
console.log();
|
|
127
126
|
}
|
|
128
|
-
console.log(
|
|
129
|
-
console.log(
|
|
130
|
-
console.log(
|
|
131
|
-
console.log(
|
|
132
|
-
console.log(
|
|
127
|
+
console.log(chalk.bold('Summary:'));
|
|
128
|
+
console.log(chalk.cyan(` Project: ${resolvedProjectName}`));
|
|
129
|
+
console.log(chalk.cyan(` Source: ${chosenSourceFile}`));
|
|
130
|
+
console.log(chalk.cyan(` Total Phases: ${result.phases.length}`));
|
|
131
|
+
console.log(chalk.cyan(` Total Tasks: ${result.totalTasks}`));
|
|
133
132
|
console.log();
|
|
134
|
-
console.log(
|
|
133
|
+
console.log(chalk.bold('Task Breakdown:\n'));
|
|
135
134
|
for (const phase of result.phases) {
|
|
136
|
-
console.log(
|
|
137
|
-
console.log(
|
|
135
|
+
console.log(chalk.bold(` ${phase.name}`));
|
|
136
|
+
console.log(chalk.gray(` ${phase.tasks.length} tasks`));
|
|
138
137
|
const preview = phase.tasks.slice(0, 3);
|
|
139
138
|
preview.forEach((task) => {
|
|
140
|
-
console.log(
|
|
139
|
+
console.log(chalk.dim(` • ${task.description}`));
|
|
141
140
|
});
|
|
142
141
|
if (phase.tasks.length > 3) {
|
|
143
|
-
console.log(
|
|
142
|
+
console.log(chalk.dim(` ... and ${phase.tasks.length - 3} more`));
|
|
144
143
|
}
|
|
145
144
|
console.log();
|
|
146
145
|
}
|
|
147
|
-
console.log(
|
|
148
|
-
console.log(
|
|
146
|
+
console.log(chalk.bold('Output:'));
|
|
147
|
+
console.log(chalk.cyan(` ${result.outputPath}`));
|
|
149
148
|
console.log();
|
|
150
|
-
console.log(
|
|
151
|
-
console.log(
|
|
152
|
-
console.log(
|
|
153
|
-
console.log(
|
|
149
|
+
console.log(chalk.bold.green('Next Steps:\n'));
|
|
150
|
+
console.log(chalk.gray(' 1. Review the generated tasks in tasks.md'));
|
|
151
|
+
console.log(chalk.gray(' 2. Edit if needed (add/remove/modify tasks)'));
|
|
152
|
+
console.log(chalk.gray(' 3. Run'), chalk.cyan('clavix implement'), chalk.gray('to start implementation'));
|
|
154
153
|
console.log();
|
|
155
|
-
console.log(
|
|
154
|
+
console.log(chalk.dim('Tip: Tasks follow CLEAR framework principles for optimal AI execution\n'));
|
|
156
155
|
}
|
|
157
156
|
catch (error) {
|
|
158
157
|
const errorMessage = error instanceof Error ? error.message : 'An unexpected error occurred';
|
|
@@ -165,8 +164,8 @@ class Plan extends core_1.Command {
|
|
|
165
164
|
}
|
|
166
165
|
}
|
|
167
166
|
async prepareArtifactsFromSession(sessionId, useActive) {
|
|
168
|
-
const sessionManager = new
|
|
169
|
-
const analyzer = new
|
|
167
|
+
const sessionManager = new SessionManager();
|
|
168
|
+
const analyzer = new ConversationAnalyzer();
|
|
170
169
|
let session = null;
|
|
171
170
|
if (sessionId) {
|
|
172
171
|
session = await sessionManager.getSession(sessionId);
|
|
@@ -186,18 +185,18 @@ class Plan extends core_1.Command {
|
|
|
186
185
|
if (session.messages.length === 0) {
|
|
187
186
|
throw new Error('Session has no messages to analyze.');
|
|
188
187
|
}
|
|
189
|
-
console.log(
|
|
188
|
+
console.log(chalk.dim(`Generating mini-PRD from session ${session.id}...`));
|
|
190
189
|
const analysis = analyzer.analyze(session);
|
|
191
190
|
const projectDirName = this.sanitizeProjectName(session.projectName);
|
|
192
191
|
const outputsDir = path.join('.clavix', 'outputs', projectDirName);
|
|
193
|
-
await
|
|
192
|
+
await FileSystem.ensureDir(outputsDir);
|
|
194
193
|
const miniPrdPath = path.join(outputsDir, 'mini-prd.md');
|
|
195
194
|
const promptPath = path.join(outputsDir, 'optimized-prompt.md');
|
|
196
195
|
const miniPrdContent = analyzer.generateMiniPrd(session, analysis);
|
|
197
196
|
const promptContent = analyzer.generateOptimizedPrompt(session, analysis);
|
|
198
|
-
await
|
|
199
|
-
await
|
|
200
|
-
console.log(
|
|
197
|
+
await FileSystem.writeFileAtomic(miniPrdPath, miniPrdContent);
|
|
198
|
+
await FileSystem.writeFileAtomic(promptPath, promptContent);
|
|
199
|
+
console.log(chalk.dim(`Saved mini-prd.md and optimized-prompt.md to ${outputsDir}.\n`));
|
|
201
200
|
return {
|
|
202
201
|
prdPath: outputsDir,
|
|
203
202
|
projectName: projectDirName,
|
|
@@ -238,7 +237,7 @@ class Plan extends core_1.Command {
|
|
|
238
237
|
if (!match) {
|
|
239
238
|
throw new Error(`PRD project not found: ${projectName}`);
|
|
240
239
|
}
|
|
241
|
-
console.log(
|
|
240
|
+
console.log(chalk.dim(`Selected project: ${match.name}`));
|
|
242
241
|
return match;
|
|
243
242
|
}
|
|
244
243
|
if (projects.length === 0) {
|
|
@@ -246,11 +245,11 @@ class Plan extends core_1.Command {
|
|
|
246
245
|
}
|
|
247
246
|
if (projects.length === 1) {
|
|
248
247
|
const [project] = projects;
|
|
249
|
-
console.log(
|
|
248
|
+
console.log(chalk.dim(`Auto-selected project: ${project.name}`));
|
|
250
249
|
return project;
|
|
251
250
|
}
|
|
252
251
|
if (this.isInteractive()) {
|
|
253
|
-
console.log(
|
|
252
|
+
console.log(chalk.bold('Select a PRD project to generate a task plan:\n'));
|
|
254
253
|
const choices = projects.map((project) => {
|
|
255
254
|
const sourceLabel = project.sources.join('/') || 'prompt';
|
|
256
255
|
const taskLabel = project.hasTasks ? 'tasks present' : 'no tasks yet';
|
|
@@ -259,7 +258,7 @@ class Plan extends core_1.Command {
|
|
|
259
258
|
value: project.name,
|
|
260
259
|
};
|
|
261
260
|
});
|
|
262
|
-
const response = await
|
|
261
|
+
const response = await inquirer.prompt([
|
|
263
262
|
{
|
|
264
263
|
type: 'list',
|
|
265
264
|
name: 'project',
|
|
@@ -275,7 +274,7 @@ class Plan extends core_1.Command {
|
|
|
275
274
|
}
|
|
276
275
|
projects.sort((a, b) => b.mtime.getTime() - a.mtime.getTime());
|
|
277
276
|
const chosen = projects[0];
|
|
278
|
-
console.log(
|
|
277
|
+
console.log(chalk.dim(`Multiple PRD projects found; selected most recent: ${chosen.name}. Use --project to choose explicitly.`));
|
|
279
278
|
return chosen;
|
|
280
279
|
}
|
|
281
280
|
sanitizeProjectName(name) {
|
|
@@ -295,42 +294,4 @@ class Plan extends core_1.Command {
|
|
|
295
294
|
return Boolean(process.stdin.isTTY && process.stdout.isTTY);
|
|
296
295
|
}
|
|
297
296
|
}
|
|
298
|
-
Plan.description = 'Generate implementation task breakdown from PRD';
|
|
299
|
-
Plan.examples = [
|
|
300
|
-
'<%= config.bin %> <%= command.id %>',
|
|
301
|
-
'<%= config.bin %> <%= command.id %> --project my-app',
|
|
302
|
-
'<%= config.bin %> <%= command.id %> --prd-path .clavix/outputs/my-project',
|
|
303
|
-
'<%= config.bin %> <%= command.id %> --session 1234-5678',
|
|
304
|
-
];
|
|
305
|
-
Plan.flags = {
|
|
306
|
-
project: core_1.Flags.string({
|
|
307
|
-
char: 'p',
|
|
308
|
-
description: 'PRD project name (defaults to most recent)',
|
|
309
|
-
}),
|
|
310
|
-
'prd-path': core_1.Flags.string({
|
|
311
|
-
description: 'Direct path to PRD directory',
|
|
312
|
-
}),
|
|
313
|
-
session: core_1.Flags.string({
|
|
314
|
-
description: 'Session ID to plan from (generates mini-prd.md automatically)',
|
|
315
|
-
}),
|
|
316
|
-
'active-session': core_1.Flags.boolean({
|
|
317
|
-
description: 'Use the most recent active session as input',
|
|
318
|
-
default: false,
|
|
319
|
-
}),
|
|
320
|
-
source: core_1.Flags.string({
|
|
321
|
-
description: 'Preferred PRD source (auto|full|quick|mini|prompt)',
|
|
322
|
-
options: ['auto', 'full', 'quick', 'mini', 'prompt'],
|
|
323
|
-
default: 'auto',
|
|
324
|
-
}),
|
|
325
|
-
'max-tasks': core_1.Flags.integer({
|
|
326
|
-
description: 'Maximum tasks per phase',
|
|
327
|
-
default: 20,
|
|
328
|
-
}),
|
|
329
|
-
overwrite: core_1.Flags.boolean({
|
|
330
|
-
char: 'o',
|
|
331
|
-
description: 'Overwrite existing tasks.md file',
|
|
332
|
-
default: false,
|
|
333
|
-
}),
|
|
334
|
-
};
|
|
335
|
-
exports.default = Plan;
|
|
336
297
|
//# sourceMappingURL=plan.js.map
|