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.
Files changed (165) hide show
  1. package/README.md +22 -8
  2. package/bin/clavix.js +12 -5
  3. package/dist/cli/commands/archive.d.ts +5 -4
  4. package/dist/cli/commands/archive.js +135 -161
  5. package/dist/cli/commands/config.d.ts +4 -4
  6. package/dist/cli/commands/config.js +66 -105
  7. package/dist/cli/commands/deep.d.ts +3 -3
  8. package/dist/cli/commands/deep.js +97 -103
  9. package/dist/cli/commands/execute.d.ts +4 -4
  10. package/dist/cli/commands/execute.js +57 -63
  11. package/dist/cli/commands/fast.d.ts +3 -3
  12. package/dist/cli/commands/fast.js +122 -128
  13. package/dist/cli/commands/implement.d.ts +4 -4
  14. package/dist/cli/commands/implement.js +84 -148
  15. package/dist/cli/commands/init.js +87 -126
  16. package/dist/cli/commands/list.d.ts +5 -5
  17. package/dist/cli/commands/list.js +72 -111
  18. package/dist/cli/commands/plan.d.ts +7 -7
  19. package/dist/cli/commands/plan.js +92 -131
  20. package/dist/cli/commands/prd.d.ts +4 -4
  21. package/dist/cli/commands/prd.js +76 -111
  22. package/dist/cli/commands/prompts/clear.d.ts +6 -6
  23. package/dist/cli/commands/prompts/clear.js +70 -76
  24. package/dist/cli/commands/prompts/list.js +37 -43
  25. package/dist/cli/commands/show.d.ts +4 -4
  26. package/dist/cli/commands/show.js +72 -111
  27. package/dist/cli/commands/start.d.ts +3 -3
  28. package/dist/cli/commands/start.js +63 -101
  29. package/dist/cli/commands/summarize.d.ts +4 -4
  30. package/dist/cli/commands/summarize.js +81 -120
  31. package/dist/cli/commands/task-complete.d.ts +4 -4
  32. package/dist/cli/commands/task-complete.js +86 -123
  33. package/dist/cli/commands/update.d.ts +3 -3
  34. package/dist/cli/commands/update.js +97 -130
  35. package/dist/cli/commands/version.js +13 -48
  36. package/dist/core/adapters/agents-md-generator.js +17 -50
  37. package/dist/core/adapters/amp-adapter.d.ts +1 -1
  38. package/dist/core/adapters/amp-adapter.js +13 -21
  39. package/dist/core/adapters/augment-adapter.d.ts +2 -2
  40. package/dist/core/adapters/augment-adapter.js +16 -56
  41. package/dist/core/adapters/base-adapter.d.ts +1 -1
  42. package/dist/core/adapters/base-adapter.js +11 -47
  43. package/dist/core/adapters/claude-code-adapter.d.ts +2 -2
  44. package/dist/core/adapters/claude-code-adapter.js +19 -60
  45. package/dist/core/adapters/cline-adapter.d.ts +1 -1
  46. package/dist/core/adapters/cline-adapter.js +13 -21
  47. package/dist/core/adapters/codebuddy-adapter.d.ts +2 -2
  48. package/dist/core/adapters/codebuddy-adapter.js +17 -57
  49. package/dist/core/adapters/codex-adapter.d.ts +2 -2
  50. package/dist/core/adapters/codex-adapter.js +16 -56
  51. package/dist/core/adapters/copilot-instructions-generator.js +18 -51
  52. package/dist/core/adapters/crush-adapter.d.ts +2 -2
  53. package/dist/core/adapters/crush-adapter.js +13 -20
  54. package/dist/core/adapters/cursor-adapter.d.ts +1 -1
  55. package/dist/core/adapters/cursor-adapter.js +12 -20
  56. package/dist/core/adapters/droid-adapter.d.ts +2 -2
  57. package/dist/core/adapters/droid-adapter.js +14 -21
  58. package/dist/core/adapters/gemini-adapter.d.ts +2 -2
  59. package/dist/core/adapters/gemini-adapter.js +16 -52
  60. package/dist/core/adapters/kilocode-adapter.d.ts +1 -1
  61. package/dist/core/adapters/kilocode-adapter.js +12 -20
  62. package/dist/core/adapters/octo-md-generator.js +17 -50
  63. package/dist/core/adapters/opencode-adapter.d.ts +2 -2
  64. package/dist/core/adapters/opencode-adapter.js +14 -21
  65. package/dist/core/adapters/qwen-adapter.d.ts +2 -2
  66. package/dist/core/adapters/qwen-adapter.js +16 -52
  67. package/dist/core/adapters/roocode-adapter.d.ts +2 -2
  68. package/dist/core/adapters/roocode-adapter.js +12 -19
  69. package/dist/core/adapters/warp-md-generator.js +17 -50
  70. package/dist/core/adapters/windsurf-adapter.d.ts +1 -1
  71. package/dist/core/adapters/windsurf-adapter.js +12 -20
  72. package/dist/core/agent-manager.d.ts +1 -1
  73. package/dist/core/agent-manager.js +34 -38
  74. package/dist/core/archive-manager.js +10 -46
  75. package/dist/core/config-manager.d.ts +2 -2
  76. package/dist/core/config-manager.js +3 -40
  77. package/dist/core/conversation-analyzer.d.ts +1 -1
  78. package/dist/core/conversation-analyzer.js +1 -5
  79. package/dist/core/doc-injector.js +23 -60
  80. package/dist/core/git-manager.js +11 -48
  81. package/dist/core/prd-generator.js +16 -51
  82. package/dist/core/prompt-manager.js +6 -42
  83. package/dist/core/prompt-optimizer.js +1 -5
  84. package/dist/core/question-engine.js +6 -45
  85. package/dist/core/session-manager.d.ts +1 -1
  86. package/dist/core/session-manager.js +11 -49
  87. package/dist/core/task-manager.d.ts +26 -0
  88. package/dist/core/task-manager.js +243 -101
  89. package/dist/index.d.ts +2 -1
  90. package/dist/index.js +8 -12
  91. package/dist/templates/agents/agents.md +31 -2
  92. package/dist/templates/agents/copilot-instructions.md +1 -1
  93. package/dist/templates/agents/octo.md +20 -1
  94. package/dist/templates/agents/warp.md +1 -1
  95. package/dist/templates/slash-commands/_canonical/implement.md +33 -11
  96. package/dist/types/agent.js +1 -2
  97. package/dist/types/config.js +3 -8
  98. package/dist/types/errors.js +7 -13
  99. package/dist/types/session.js +1 -2
  100. package/dist/utils/agent-error-messages.js +1 -5
  101. package/dist/utils/error-utils.js +5 -12
  102. package/dist/utils/file-system.js +20 -57
  103. package/dist/utils/legacy-command-cleanup.d.ts +1 -1
  104. package/dist/utils/legacy-command-cleanup.js +9 -45
  105. package/dist/utils/template-loader.d.ts +1 -1
  106. package/dist/utils/template-loader.js +9 -41
  107. package/dist/utils/toml-templates.js +1 -4
  108. package/package.json +12 -7
  109. package/dist/core/adapters 2/agents-md-generator.d.ts +0 -26
  110. package/dist/core/adapters 2/agents-md-generator.js +0 -102
  111. package/dist/core/adapters 2/amp-adapter.d.ts +0 -27
  112. package/dist/core/adapters 2/amp-adapter.js +0 -42
  113. package/dist/core/adapters 2/augment-adapter.d.ts +0 -22
  114. package/dist/core/adapters 2/augment-adapter.js +0 -77
  115. package/dist/core/adapters 2/base-adapter.d.ts +0 -45
  116. package/dist/core/adapters 2/base-adapter.js +0 -142
  117. package/dist/core/adapters 2/claude-code-adapter.d.ts +0 -32
  118. package/dist/core/adapters 2/claude-code-adapter.js +0 -116
  119. package/dist/core/adapters 2/cline-adapter.d.ts +0 -34
  120. package/dist/core/adapters 2/cline-adapter.js +0 -52
  121. package/dist/core/adapters 2/codebuddy-adapter.d.ts +0 -24
  122. package/dist/core/adapters 2/codebuddy-adapter.js +0 -82
  123. package/dist/core/adapters 2/codex-adapter.d.ts +0 -24
  124. package/dist/core/adapters 2/codex-adapter.js +0 -79
  125. package/dist/core/adapters 2/copilot-instructions-generator.d.ts +0 -26
  126. package/dist/core/adapters 2/copilot-instructions-generator.js +0 -104
  127. package/dist/core/adapters 2/crush-adapter.d.ts +0 -35
  128. package/dist/core/adapters 2/crush-adapter.js +0 -49
  129. package/dist/core/adapters 2/cursor-adapter.d.ts +0 -25
  130. package/dist/core/adapters 2/cursor-adapter.js +0 -40
  131. package/dist/core/adapters 2/droid-adapter.d.ts +0 -33
  132. package/dist/core/adapters 2/droid-adapter.js +0 -57
  133. package/dist/core/adapters 2/gemini-adapter.d.ts +0 -27
  134. package/dist/core/adapters 2/gemini-adapter.js +0 -90
  135. package/dist/core/adapters 2/kilocode-adapter.d.ts +0 -34
  136. package/dist/core/adapters 2/kilocode-adapter.js +0 -49
  137. package/dist/core/adapters 2/octo-md-generator.d.ts +0 -26
  138. package/dist/core/adapters 2/octo-md-generator.js +0 -102
  139. package/dist/core/adapters 2/opencode-adapter.d.ts +0 -33
  140. package/dist/core/adapters 2/opencode-adapter.js +0 -56
  141. package/dist/core/adapters 2/qwen-adapter.d.ts +0 -27
  142. package/dist/core/adapters 2/qwen-adapter.js +0 -90
  143. package/dist/core/adapters 2/roocode-adapter.d.ts +0 -40
  144. package/dist/core/adapters 2/roocode-adapter.js +0 -68
  145. package/dist/core/adapters 2/warp-md-generator.d.ts +0 -17
  146. package/dist/core/adapters 2/warp-md-generator.js +0 -88
  147. package/dist/core/adapters 2/windsurf-adapter.d.ts +0 -34
  148. package/dist/core/adapters 2/windsurf-adapter.js +0 -49
  149. package/dist/core/agent-manager 2.js +0 -126
  150. package/dist/core/agent-manager.d 2.ts +0 -51
  151. package/dist/core/archive-manager 2.js +0 -338
  152. package/dist/core/archive-manager.d 2.ts +0 -100
  153. package/dist/core/conversation-analyzer.d 2.ts +0 -86
  154. package/dist/core/doc-injector 2.js +0 -236
  155. package/dist/core/doc-injector.d 2.ts +0 -51
  156. package/dist/core/git-manager 2.js +0 -214
  157. package/dist/core/git-manager.d 2.ts +0 -100
  158. package/dist/core/prompt-optimizer 2.js +0 -963
  159. package/dist/core/prompt-optimizer.d 2.ts +0 -268
  160. package/dist/core/question-engine 2.js +0 -395
  161. package/dist/core/question-engine.d 2.ts +0 -167
  162. package/dist/core/session-manager 2.js +0 -403
  163. package/dist/core/session-manager.d 2.ts +0 -139
  164. package/dist/core/task-manager 2.js +0 -689
  165. package/dist/core/task-manager.d 2.ts +0 -155
@@ -1,56 +1,51 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
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);
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 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(chalk_1.default.red('No .clavix directory found.') +
44
+ this.error(chalk.red('No .clavix directory found.') +
50
45
  '\n' +
51
- chalk_1.default.yellow('Run ') +
52
- chalk_1.default.cyan('clavix init') +
53
- chalk_1.default.yellow(' to initialize Clavix in this project.'));
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(chalk_1.default.bold.cyan('📋 Sessions\n'));
70
- const sessionManager = new session_manager_1.SessionManager();
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(chalk_1.default.gray(' No sessions found.'));
74
- this.log(chalk_1.default.gray(' Run ') + chalk_1.default.cyan('clavix start') + chalk_1.default.gray(' to create a new session.'));
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(chalk_1.default.gray(` No sessions found matching "${projectFilter}".`));
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} ${chalk_1.default.bold(projectName)} ${chalk_1.default.gray(`(${session.id})`)}` +
101
- `\n ${chalk_1.default.gray('Created:')} ${created} ${chalk_1.default.gray('│')} ` +
102
- `${chalk_1.default.gray('Updated:')} ${updated}` +
103
- `\n ${chalk_1.default.gray('Messages:')} ${messageCount} ${chalk_1.default.gray('│')} ` +
104
- `${chalk_1.default.gray('Status:')} ${isActive ? chalk_1.default.green('active') : chalk_1.default.gray('completed')}` +
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(chalk_1.default.gray(` Showing ${filteredSessions.length} of ${sessions.length} sessions`));
103
+ this.log(chalk.gray(` Showing ${filteredSessions.length} of ${sessions.length} sessions`));
109
104
  if (sessions.length > filteredSessions.length && !limit) {
110
- this.log(chalk_1.default.gray(` Use ${chalk_1.default.cyan('--limit N')} to show more results`));
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(chalk_1.default.bold.cyan('📁 Outputs\n'));
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(chalk_1.default.gray(' No outputs found.'));
118
- this.log(chalk_1.default.gray(' Run ') + chalk_1.default.cyan('clavix prd') + chalk_1.default.gray(' or ') + chalk_1.default.cyan('clavix summarize') + chalk_1.default.gray(' to generate outputs.'));
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(chalk_1.default.gray(' No outputs found.'));
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(chalk_1.default.gray(` No outputs found matching "${projectFilter}".`));
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(` 📄 ${chalk_1.default.bold(projectDir)}` +
158
- `\n ${chalk_1.default.gray('Path:')} ${chalk_1.default.dim(path.relative(process.cwd(), projectPath))}` +
159
- `\n ${chalk_1.default.gray('Files:')} ${files.join(', ')}` +
160
- `\n ${chalk_1.default.gray('Modified:')} ${modified}` +
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(chalk_1.default.gray(` Showing ${filteredDirs.length} of ${projectDirs.length} output directories`));
159
+ this.log(chalk.gray(` Showing ${filteredDirs.length} of ${projectDirs.length} output directories`));
165
160
  if (projectDirs.length > filteredDirs.length && !limit) {
166
- this.log(chalk_1.default.gray(` Use ${chalk_1.default.cyan('--limit N')} to show more results`));
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(chalk_1.default.bold.cyan('📦 Archived Outputs\n'));
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(` 📦 ${chalk_1.default.bold(projectDir)} ${chalk_1.default.gray('(archived)')}` +
212
- `\n ${chalk_1.default.gray('Path:')} ${chalk_1.default.dim(path.relative(process.cwd(), projectPath))}` +
213
- `\n ${chalk_1.default.gray('Files:')} ${files.join(', ')}` +
214
- `\n ${chalk_1.default.gray('Modified:')} ${modified}` +
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(chalk_1.default.gray(` Showing ${filteredDirs.length} of ${archivedDirs.length} archived directories`));
219
- this.log(chalk_1.default.gray(` Use ${chalk_1.default.cyan('clavix archive --restore <project>')} to restore a project`));
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/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
7
- 'prd-path': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
8
- session: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
9
- 'active-session': import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
10
- source: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
11
- 'max-tasks': import("@oclif/core/lib/interfaces").OptionFlag<number, import("@oclif/core/lib/interfaces").CustomOptions>;
12
- overwrite: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
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
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
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);
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 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(chalk_1.default.bold.cyan('\nTask Plan Generator\n'));
53
- console.log(chalk_1.default.gray('Analyzing PRD and generating implementation tasks...\n'));
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 task_manager_1.TaskManager();
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(agent_error_messages_1.AgentErrorMessages.noPrdFound());
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(chalk_1.default.yellow('Warning: tasks.md already exists.'));
86
- console.log(chalk_1.default.gray(`Location: ${tasksPath}`));
87
- console.log(chalk_1.default.gray('Use --overwrite to regenerate tasks.md.\n'));
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(chalk_1.default.dim('Looking for PRD artifacts...'));
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(agent_error_messages_1.AgentErrorMessages.noPrdFound());
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(chalk_1.default.dim(`Found multiple sources (${availableSources.join(', ')}). Selecting best match...`));
100
+ console.log(chalk.dim(`Found multiple sources (${availableSources.join(', ')}). Selecting best match...`));
102
101
  }
103
102
  // Generate tasks
104
- console.log(chalk_1.default.dim('Analyzing PRD content...'));
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(chalk_1.default.dim(`Using source: ${chosenSourceFile}`));
113
+ console.log(chalk.dim(`Using source: ${chosenSourceFile}`));
115
114
  }
116
115
  else {
117
- console.log(chalk_1.default.dim(`Using source: ${chosenSourceFile} (override with --source to pick a different artifact).`));
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(chalk_1.default.bold.green('\nTask plan generated successfully!\n'));
119
+ console.log(chalk.bold.green('\nTask plan generated successfully!\n'));
121
120
  if (generatedFromSession) {
122
- console.log(chalk_1.default.bold('Generated artifacts:'));
121
+ console.log(chalk.bold('Generated artifacts:'));
123
122
  generatedArtifacts.forEach((artifact) => {
124
- console.log(chalk_1.default.gray(` • ${artifact}`));
123
+ console.log(chalk.gray(` • ${artifact}`));
125
124
  });
126
125
  console.log();
127
126
  }
128
- console.log(chalk_1.default.bold('Summary:'));
129
- console.log(chalk_1.default.cyan(` Project: ${resolvedProjectName}`));
130
- console.log(chalk_1.default.cyan(` Source: ${chosenSourceFile}`));
131
- console.log(chalk_1.default.cyan(` Total Phases: ${result.phases.length}`));
132
- console.log(chalk_1.default.cyan(` Total Tasks: ${result.totalTasks}`));
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(chalk_1.default.bold('Task Breakdown:\n'));
133
+ console.log(chalk.bold('Task Breakdown:\n'));
135
134
  for (const phase of result.phases) {
136
- console.log(chalk_1.default.bold(` ${phase.name}`));
137
- console.log(chalk_1.default.gray(` ${phase.tasks.length} tasks`));
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(chalk_1.default.dim(` • ${task.description}`));
139
+ console.log(chalk.dim(` • ${task.description}`));
141
140
  });
142
141
  if (phase.tasks.length > 3) {
143
- console.log(chalk_1.default.dim(` ... and ${phase.tasks.length - 3} more`));
142
+ console.log(chalk.dim(` ... and ${phase.tasks.length - 3} more`));
144
143
  }
145
144
  console.log();
146
145
  }
147
- console.log(chalk_1.default.bold('Output:'));
148
- console.log(chalk_1.default.cyan(` ${result.outputPath}`));
146
+ console.log(chalk.bold('Output:'));
147
+ console.log(chalk.cyan(` ${result.outputPath}`));
149
148
  console.log();
150
- console.log(chalk_1.default.bold.green('Next Steps:\n'));
151
- console.log(chalk_1.default.gray(' 1. Review the generated tasks in tasks.md'));
152
- console.log(chalk_1.default.gray(' 2. Edit if needed (add/remove/modify tasks)'));
153
- console.log(chalk_1.default.gray(' 3. Run'), chalk_1.default.cyan('clavix implement'), chalk_1.default.gray('to start implementation'));
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(chalk_1.default.dim('Tip: Tasks follow CLEAR framework principles for optimal AI execution\n'));
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 session_manager_1.SessionManager();
169
- const analyzer = new conversation_analyzer_1.ConversationAnalyzer();
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(chalk_1.default.dim(`Generating mini-PRD from session ${session.id}...`));
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 file_system_1.FileSystem.ensureDir(outputsDir);
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 file_system_1.FileSystem.writeFileAtomic(miniPrdPath, miniPrdContent);
199
- await file_system_1.FileSystem.writeFileAtomic(promptPath, promptContent);
200
- console.log(chalk_1.default.dim(`Saved mini-prd.md and optimized-prompt.md to ${outputsDir}.\n`));
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(chalk_1.default.dim(`Selected project: ${match.name}`));
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(chalk_1.default.dim(`Auto-selected project: ${project.name}`));
248
+ console.log(chalk.dim(`Auto-selected project: ${project.name}`));
250
249
  return project;
251
250
  }
252
251
  if (this.isInteractive()) {
253
- console.log(chalk_1.default.bold('Select a PRD project to generate a task plan:\n'));
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 inquirer_1.default.prompt([
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(chalk_1.default.dim(`Multiple PRD projects found; selected most recent: ${chosen.name}. Use --project to choose explicitly.`));
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