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,41 @@
|
|
|
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
|
-
return result;
|
|
1
|
+
import { Command, Flags } from '@oclif/core';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import inquirer from 'inquirer';
|
|
4
|
+
import { TaskManager } from '../../core/task-manager.js';
|
|
5
|
+
import { GitManager } from '../../core/git-manager.js';
|
|
6
|
+
import { AgentErrorMessages } from '../../utils/agent-error-messages.js';
|
|
7
|
+
import * as path from 'path';
|
|
8
|
+
import fs from 'fs-extra';
|
|
9
|
+
export default class Implement extends Command {
|
|
10
|
+
static description = 'Start implementing tasks from the task plan';
|
|
11
|
+
static examples = [
|
|
12
|
+
'<%= config.bin %> <%= command.id %>',
|
|
13
|
+
'<%= config.bin %> <%= command.id %> --project my-app',
|
|
14
|
+
'<%= config.bin %> <%= command.id %> --no-git',
|
|
15
|
+
];
|
|
16
|
+
static flags = {
|
|
17
|
+
project: Flags.string({
|
|
18
|
+
char: 'p',
|
|
19
|
+
description: 'PRD project name (defaults to most recent)',
|
|
20
|
+
}),
|
|
21
|
+
'tasks-path': Flags.string({
|
|
22
|
+
description: 'Direct path to tasks.md file',
|
|
23
|
+
}),
|
|
24
|
+
'no-git': Flags.boolean({
|
|
25
|
+
description: 'Skip git auto-commit setup',
|
|
26
|
+
default: false,
|
|
27
|
+
}),
|
|
28
|
+
'commit-strategy': Flags.string({
|
|
29
|
+
description: 'Auto-commit strategy: per-task, per-5-tasks, per-phase, none (default: none)',
|
|
30
|
+
options: ['per-task', 'per-5-tasks', 'per-phase', 'none'],
|
|
31
|
+
}),
|
|
33
32
|
};
|
|
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 task_manager_1 = require("../../core/task-manager");
|
|
43
|
-
const git_manager_1 = require("../../core/git-manager");
|
|
44
|
-
const agent_error_messages_1 = require("../../utils/agent-error-messages");
|
|
45
|
-
const path = __importStar(require("path"));
|
|
46
|
-
const fs = __importStar(require("fs-extra"));
|
|
47
|
-
class Implement extends core_1.Command {
|
|
48
33
|
async run() {
|
|
49
34
|
const { flags } = await this.parse(Implement);
|
|
50
|
-
console.log(
|
|
35
|
+
console.log(chalk.bold.cyan('\nTask Implementation\n'));
|
|
51
36
|
try {
|
|
52
|
-
const manager = new
|
|
53
|
-
const gitManager = new
|
|
37
|
+
const manager = new TaskManager();
|
|
38
|
+
const gitManager = new GitManager();
|
|
54
39
|
// Interactive PRD selection (if no project specified)
|
|
55
40
|
if (!flags['tasks-path'] && !flags.project) {
|
|
56
41
|
const selectedProject = await this.selectPrdProject(manager);
|
|
@@ -64,103 +49,78 @@ class Implement extends core_1.Command {
|
|
|
64
49
|
tasksPath = flags['tasks-path'];
|
|
65
50
|
}
|
|
66
51
|
else {
|
|
67
|
-
console.log(
|
|
52
|
+
console.log(chalk.dim('Looking for task plan...'));
|
|
68
53
|
const prdPath = await manager.findPrdDirectory(flags.project);
|
|
69
54
|
tasksPath = path.join(prdPath, 'tasks.md');
|
|
70
55
|
if (!(await fs.pathExists(tasksPath))) {
|
|
71
56
|
const projectName = flags.project || path.basename(path.dirname(tasksPath));
|
|
72
|
-
this.error(
|
|
57
|
+
this.error(AgentErrorMessages.noTasksFound(projectName));
|
|
73
58
|
}
|
|
74
|
-
console.log(
|
|
59
|
+
console.log(chalk.dim(`Found: ${tasksPath}\n`));
|
|
75
60
|
}
|
|
76
61
|
// Read tasks
|
|
77
62
|
const phases = await manager.readTasksFile(tasksPath);
|
|
78
63
|
const stats = manager.getTaskStats(phases);
|
|
79
64
|
// Display progress
|
|
80
|
-
console.log(
|
|
81
|
-
console.log(
|
|
82
|
-
console.log(
|
|
65
|
+
console.log(chalk.bold('Progress:'));
|
|
66
|
+
console.log(chalk.cyan(` Completed: ${stats.completed}/${stats.total} tasks (${stats.percentage.toFixed(0)}%)`));
|
|
67
|
+
console.log(chalk.cyan(` Remaining: ${stats.remaining} tasks`));
|
|
83
68
|
console.log();
|
|
84
69
|
// Check if all tasks are done
|
|
85
70
|
if (stats.remaining === 0) {
|
|
86
|
-
console.log(
|
|
87
|
-
console.log(
|
|
71
|
+
console.log(chalk.bold.green('All tasks completed!\n'));
|
|
72
|
+
console.log(chalk.gray('Great work! All implementation tasks are done.\n'));
|
|
88
73
|
return;
|
|
89
74
|
}
|
|
90
75
|
// Find next task
|
|
91
76
|
const nextTask = manager.findFirstIncompleteTask(phases);
|
|
92
77
|
if (!nextTask) {
|
|
93
|
-
console.log(
|
|
78
|
+
console.log(chalk.yellow('Warning: No incomplete tasks found\n'));
|
|
94
79
|
return;
|
|
95
80
|
}
|
|
96
81
|
// Display next task
|
|
97
|
-
console.log(
|
|
98
|
-
console.log(
|
|
82
|
+
console.log(chalk.bold('Next Task:'));
|
|
83
|
+
console.log(chalk.bold.white(` ${nextTask.description}`));
|
|
99
84
|
if (nextTask.prdReference) {
|
|
100
|
-
console.log(
|
|
85
|
+
console.log(chalk.dim(` Reference: ${nextTask.prdReference}`));
|
|
101
86
|
}
|
|
102
|
-
console.log(
|
|
87
|
+
console.log(chalk.dim(` Phase: ${nextTask.phase}`));
|
|
103
88
|
console.log();
|
|
104
89
|
// Git auto-commit setup (if not skipped)
|
|
105
90
|
let commitStrategy = 'none';
|
|
106
91
|
if (!flags['no-git']) {
|
|
107
92
|
const gitStatus = await gitManager.validateGitSetup();
|
|
108
93
|
if (gitStatus.isRepo) {
|
|
109
|
-
console.log(
|
|
94
|
+
console.log(chalk.dim(`Git repository detected (branch: ${gitStatus.currentBranch})`));
|
|
110
95
|
console.log();
|
|
111
|
-
//
|
|
96
|
+
// Use commit strategy from flag, or default to 'none' (agent-friendly)
|
|
112
97
|
if (flags['commit-strategy']) {
|
|
113
98
|
commitStrategy = flags['commit-strategy'];
|
|
114
99
|
}
|
|
115
100
|
else {
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
type: 'list',
|
|
119
|
-
name: 'strategy',
|
|
120
|
-
message: 'Do you want the AI agent to create local git commits automatically?',
|
|
121
|
-
choices: [
|
|
122
|
-
{
|
|
123
|
-
name: 'After each phase/section completes',
|
|
124
|
-
value: 'per-phase',
|
|
125
|
-
},
|
|
126
|
-
{
|
|
127
|
-
name: 'After every 5 tasks',
|
|
128
|
-
value: 'per-5-tasks',
|
|
129
|
-
},
|
|
130
|
-
{
|
|
131
|
-
name: 'After each task',
|
|
132
|
-
value: 'per-task',
|
|
133
|
-
},
|
|
134
|
-
{
|
|
135
|
-
name: "No, don't create commits for me",
|
|
136
|
-
value: 'none',
|
|
137
|
-
},
|
|
138
|
-
],
|
|
139
|
-
default: 'per-phase',
|
|
140
|
-
},
|
|
141
|
-
]);
|
|
142
|
-
commitStrategy = response.strategy;
|
|
101
|
+
commitStrategy = 'none';
|
|
102
|
+
console.log(chalk.dim('ℹ No git strategy specified. Use --commit-strategy flag to enable auto-commits.'));
|
|
143
103
|
}
|
|
144
104
|
if (commitStrategy !== 'none') {
|
|
145
|
-
console.log(
|
|
105
|
+
console.log(chalk.green(`✓ Auto-commit enabled: ${commitStrategy}\n`));
|
|
146
106
|
}
|
|
147
107
|
else {
|
|
148
|
-
console.log(
|
|
108
|
+
console.log(chalk.dim(' Auto-commits disabled (manual git workflow)\n'));
|
|
149
109
|
}
|
|
150
110
|
}
|
|
151
111
|
else {
|
|
152
|
-
console.log(
|
|
112
|
+
console.log(chalk.yellow('⚠ Warning: Not a git repository - auto-commits disabled\n'));
|
|
153
113
|
}
|
|
154
114
|
}
|
|
155
115
|
// Display implementation instructions
|
|
156
|
-
console.log(
|
|
157
|
-
console.log(
|
|
158
|
-
console.log(
|
|
159
|
-
console.log(
|
|
116
|
+
console.log(chalk.bold.cyan('Implementation Instructions:\n'));
|
|
117
|
+
console.log(chalk.gray('The AI agent will now:'));
|
|
118
|
+
console.log(chalk.gray(` 1. Implement: ${nextTask.description}`));
|
|
119
|
+
console.log(chalk.gray(' 2. Mark the task as completed in tasks.md'));
|
|
160
120
|
if (commitStrategy !== 'none') {
|
|
161
|
-
console.log(
|
|
121
|
+
console.log(chalk.gray(` 3. Create git commits (strategy: ${commitStrategy})`));
|
|
162
122
|
}
|
|
163
|
-
console.log(
|
|
123
|
+
console.log(chalk.gray(' 4. Proceed to the next task'));
|
|
164
124
|
console.log();
|
|
165
125
|
// Save commit strategy to a config file for the AI agent to read
|
|
166
126
|
const configPath = path.join(path.dirname(tasksPath), '.clavix-implement-config.json');
|
|
@@ -171,19 +131,19 @@ class Implement extends core_1.Command {
|
|
|
171
131
|
stats,
|
|
172
132
|
timestamp: new Date().toISOString(),
|
|
173
133
|
}, { spaces: 2 });
|
|
174
|
-
console.log(
|
|
175
|
-
console.log(
|
|
176
|
-
console.log(
|
|
177
|
-
console.log(
|
|
178
|
-
console.log(
|
|
179
|
-
console.log(
|
|
180
|
-
console.log(
|
|
134
|
+
console.log(chalk.bold.green('Ready to implement!\n'));
|
|
135
|
+
console.log(chalk.dim('Configuration saved to:'));
|
|
136
|
+
console.log(chalk.dim(` ${configPath}\n`));
|
|
137
|
+
console.log(chalk.yellow('Important Notes for AI Agent:\n'));
|
|
138
|
+
console.log(chalk.gray(' • Follow the tasks in order from tasks.md'));
|
|
139
|
+
console.log(chalk.gray(' • Mark each completed task: change [ ] to [x]'));
|
|
140
|
+
console.log(chalk.gray(` • Current task: ${nextTask.description}`));
|
|
181
141
|
if (commitStrategy !== 'none') {
|
|
182
|
-
console.log(
|
|
142
|
+
console.log(chalk.gray(` • Create git commits per strategy: ${commitStrategy}`));
|
|
183
143
|
}
|
|
184
|
-
console.log(
|
|
144
|
+
console.log(chalk.gray(' • Use PRD as reference for implementation details'));
|
|
185
145
|
console.log();
|
|
186
|
-
console.log(
|
|
146
|
+
console.log(chalk.dim('Tip: The AI agent can run "clavix implement" again to resume progress\n'));
|
|
187
147
|
}
|
|
188
148
|
catch (error) {
|
|
189
149
|
const errorMessage = error instanceof Error ? error.message : 'An unexpected error occurred';
|
|
@@ -234,12 +194,12 @@ class Implement extends core_1.Command {
|
|
|
234
194
|
}
|
|
235
195
|
// No PRD projects found
|
|
236
196
|
if (prdProjects.length === 0) {
|
|
237
|
-
this.error(
|
|
197
|
+
this.error(AgentErrorMessages.noPrdFound());
|
|
238
198
|
}
|
|
239
199
|
// Only one PRD - auto-select
|
|
240
200
|
if (prdProjects.length === 1) {
|
|
241
201
|
const project = prdProjects[0];
|
|
242
|
-
console.log(
|
|
202
|
+
console.log(chalk.dim(`Auto-selected project: ${project.name}\n`));
|
|
243
203
|
// Check if it has tasks
|
|
244
204
|
if (!project.hasTasks) {
|
|
245
205
|
await this.handleNoTasks(project.name);
|
|
@@ -248,15 +208,15 @@ class Implement extends core_1.Command {
|
|
|
248
208
|
return project.name;
|
|
249
209
|
}
|
|
250
210
|
// Multiple PRDs - show selection menu
|
|
251
|
-
console.log(
|
|
211
|
+
console.log(chalk.bold('Select a PRD project to implement:\n'));
|
|
252
212
|
const choices = prdProjects.map((project, index) => {
|
|
253
213
|
let label = `${index + 1}. ${project.name}`;
|
|
254
214
|
if (project.hasTasks && project.stats) {
|
|
255
215
|
const percentage = project.stats.percentage.toFixed(0);
|
|
256
|
-
label +=
|
|
216
|
+
label += chalk.dim(` - ${project.stats.completed}/${project.stats.total} tasks (${percentage}%)`);
|
|
257
217
|
}
|
|
258
218
|
else {
|
|
259
|
-
label +=
|
|
219
|
+
label += chalk.dim(' - No tasks generated');
|
|
260
220
|
}
|
|
261
221
|
return {
|
|
262
222
|
name: label,
|
|
@@ -264,7 +224,7 @@ class Implement extends core_1.Command {
|
|
|
264
224
|
hasTasks: project.hasTasks,
|
|
265
225
|
};
|
|
266
226
|
});
|
|
267
|
-
const response = await
|
|
227
|
+
const response = await inquirer.prompt([
|
|
268
228
|
{
|
|
269
229
|
type: 'list',
|
|
270
230
|
name: 'project',
|
|
@@ -287,8 +247,8 @@ class Implement extends core_1.Command {
|
|
|
287
247
|
* @param projectName Name of the PRD project
|
|
288
248
|
*/
|
|
289
249
|
async handleNoTasks(projectName) {
|
|
290
|
-
console.log(
|
|
291
|
-
const response = await
|
|
250
|
+
console.log(chalk.yellow(`\nWarning: Project "${projectName}" has no tasks generated yet.\n`));
|
|
251
|
+
const response = await inquirer.prompt([
|
|
292
252
|
{
|
|
293
253
|
type: 'confirm',
|
|
294
254
|
name: 'runPlan',
|
|
@@ -297,10 +257,10 @@ class Implement extends core_1.Command {
|
|
|
297
257
|
},
|
|
298
258
|
]);
|
|
299
259
|
if (response.runPlan) {
|
|
300
|
-
console.log(
|
|
260
|
+
console.log(chalk.cyan(`\nRunning: clavix plan --project ${projectName}\n`));
|
|
301
261
|
// Execute clavix plan command
|
|
302
|
-
const { exec } = await
|
|
303
|
-
const { promisify } = await
|
|
262
|
+
const { exec } = await import('child_process');
|
|
263
|
+
const { promisify } = await import('util');
|
|
304
264
|
const execAsync = promisify(exec);
|
|
305
265
|
try {
|
|
306
266
|
const { stdout, stderr } = await execAsync(`clavix plan --project ${projectName}`, {
|
|
@@ -310,10 +270,10 @@ class Implement extends core_1.Command {
|
|
|
310
270
|
console.log(stdout);
|
|
311
271
|
}
|
|
312
272
|
if (stderr) {
|
|
313
|
-
console.error(
|
|
273
|
+
console.error(chalk.yellow(stderr));
|
|
314
274
|
}
|
|
315
275
|
// After plan completes, continue with implementation
|
|
316
|
-
console.log(
|
|
276
|
+
console.log(chalk.green('\nTasks generated! Continuing with implementation...\n'));
|
|
317
277
|
}
|
|
318
278
|
catch (error) {
|
|
319
279
|
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
@@ -321,33 +281,9 @@ class Implement extends core_1.Command {
|
|
|
321
281
|
}
|
|
322
282
|
}
|
|
323
283
|
else {
|
|
324
|
-
console.log(
|
|
284
|
+
console.log(chalk.dim('\nExiting. Run "clavix plan" when ready to generate tasks.\n'));
|
|
325
285
|
this.exit(0);
|
|
326
286
|
}
|
|
327
287
|
}
|
|
328
288
|
}
|
|
329
|
-
Implement.description = 'Start implementing tasks from the task plan';
|
|
330
|
-
Implement.examples = [
|
|
331
|
-
'<%= config.bin %> <%= command.id %>',
|
|
332
|
-
'<%= config.bin %> <%= command.id %> --project my-app',
|
|
333
|
-
'<%= config.bin %> <%= command.id %> --no-git',
|
|
334
|
-
];
|
|
335
|
-
Implement.flags = {
|
|
336
|
-
project: core_1.Flags.string({
|
|
337
|
-
char: 'p',
|
|
338
|
-
description: 'PRD project name (defaults to most recent)',
|
|
339
|
-
}),
|
|
340
|
-
'tasks-path': core_1.Flags.string({
|
|
341
|
-
description: 'Direct path to tasks.md file',
|
|
342
|
-
}),
|
|
343
|
-
'no-git': core_1.Flags.boolean({
|
|
344
|
-
description: 'Skip git auto-commit setup',
|
|
345
|
-
default: false,
|
|
346
|
-
}),
|
|
347
|
-
'commit-strategy': core_1.Flags.string({
|
|
348
|
-
description: 'Auto-commit strategy (per-task, per-5-tasks, per-phase, none)',
|
|
349
|
-
options: ['per-task', 'per-5-tasks', 'per-phase', 'none'],
|
|
350
|
-
}),
|
|
351
|
-
};
|
|
352
|
-
exports.default = Implement;
|
|
353
289
|
//# sourceMappingURL=implement.js.map
|