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,46 +1,12 @@
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;
33
- };
34
- })();
35
- Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.DocInjector = void 0;
37
- const path = __importStar(require("path"));
38
- const file_system_1 = require("../utils/file-system");
39
- const errors_1 = require("../types/errors");
1
+ import * as path from 'path';
2
+ import { FileSystem } from '../utils/file-system.js';
3
+ import { DataError } from '../types/errors.js';
40
4
  /**
41
5
  * DocInjector - manages injection and updating of managed blocks in documentation files
42
6
  */
43
- class DocInjector {
7
+ export class DocInjector {
8
+ static DEFAULT_START_MARKER = '<!-- CLAVIX:START -->';
9
+ static DEFAULT_END_MARKER = '<!-- CLAVIX:END -->';
44
10
  /**
45
11
  * Inject or update managed block in a file
46
12
  */
@@ -55,18 +21,18 @@ class DocInjector {
55
21
  const fullPath = path.resolve(filePath);
56
22
  let fileContent = '';
57
23
  // Read existing file or create new
58
- if (await file_system_1.FileSystem.exists(fullPath)) {
59
- fileContent = await file_system_1.FileSystem.readFile(fullPath);
24
+ if (await FileSystem.exists(fullPath)) {
25
+ fileContent = await FileSystem.readFile(fullPath);
60
26
  }
61
27
  else if (!opts.createIfMissing) {
62
- throw new errors_1.DataError(`File not found: ${filePath}`, 'Set createIfMissing: true to create the file automatically');
28
+ throw new DataError(`File not found: ${filePath}`, 'Set createIfMissing: true to create the file automatically');
63
29
  }
64
30
  // Build the managed block
65
31
  const blockRegex = new RegExp(`${this.escapeRegex(opts.startMarker)}[\\s\\S]*?${this.escapeRegex(opts.endMarker)}`, 'g');
66
32
  const wrappedContent = this.wrapContent(opts.content, opts.startMarker, opts.endMarker);
67
33
  if (blockRegex.test(fileContent)) {
68
34
  // Replace existing block
69
- await file_system_1.FileSystem.backup(fullPath);
35
+ await FileSystem.backup(fullPath);
70
36
  fileContent = fileContent.replace(blockRegex, wrappedContent);
71
37
  }
72
38
  else {
@@ -83,13 +49,13 @@ class DocInjector {
83
49
  try {
84
50
  // Ensure parent directory exists
85
51
  const dir = path.dirname(fullPath);
86
- await file_system_1.FileSystem.ensureDir(dir);
87
- await file_system_1.FileSystem.writeFileAtomic(fullPath, fileContent);
52
+ await FileSystem.ensureDir(dir);
53
+ await FileSystem.writeFileAtomic(fullPath, fileContent);
88
54
  }
89
55
  catch (error) {
90
56
  // Attempt to restore backup
91
- if (await file_system_1.FileSystem.exists(`${fullPath}.backup`)) {
92
- await file_system_1.FileSystem.restoreBackup(fullPath);
57
+ if (await FileSystem.exists(`${fullPath}.backup`)) {
58
+ await FileSystem.restoreBackup(fullPath);
93
59
  }
94
60
  throw error;
95
61
  }
@@ -100,10 +66,10 @@ class DocInjector {
100
66
  static async hasBlock(filePath, startMarker, endMarker) {
101
67
  const start = startMarker || this.DEFAULT_START_MARKER;
102
68
  const end = endMarker || this.DEFAULT_END_MARKER;
103
- if (!(await file_system_1.FileSystem.exists(filePath))) {
69
+ if (!(await FileSystem.exists(filePath))) {
104
70
  return false;
105
71
  }
106
- const content = await file_system_1.FileSystem.readFile(filePath);
72
+ const content = await FileSystem.readFile(filePath);
107
73
  const blockRegex = new RegExp(`${this.escapeRegex(start)}[\\s\\S]*?${this.escapeRegex(end)}`, 'g');
108
74
  return blockRegex.test(content);
109
75
  }
@@ -113,10 +79,10 @@ class DocInjector {
113
79
  static async extractBlock(filePath, startMarker, endMarker) {
114
80
  const start = startMarker || this.DEFAULT_START_MARKER;
115
81
  const end = endMarker || this.DEFAULT_END_MARKER;
116
- if (!(await file_system_1.FileSystem.exists(filePath))) {
82
+ if (!(await FileSystem.exists(filePath))) {
117
83
  return null;
118
84
  }
119
- const content = await file_system_1.FileSystem.readFile(filePath);
85
+ const content = await FileSystem.readFile(filePath);
120
86
  const blockRegex = new RegExp(`${this.escapeRegex(start)}([\\s\\S]*?)${this.escapeRegex(end)}`, 'g');
121
87
  const match = blockRegex.exec(content);
122
88
  return match ? match[1].trim() : null;
@@ -127,15 +93,15 @@ class DocInjector {
127
93
  static async removeBlock(filePath, startMarker, endMarker) {
128
94
  const start = startMarker || this.DEFAULT_START_MARKER;
129
95
  const end = endMarker || this.DEFAULT_END_MARKER;
130
- if (!(await file_system_1.FileSystem.exists(filePath))) {
96
+ if (!(await FileSystem.exists(filePath))) {
131
97
  return;
132
98
  }
133
- const content = await file_system_1.FileSystem.readFile(filePath);
99
+ const content = await FileSystem.readFile(filePath);
134
100
  const blockRegex = new RegExp(`${this.escapeRegex(start)}[\\s\\S]*?${this.escapeRegex(end)}\\n?`, 'g');
135
101
  if (blockRegex.test(content)) {
136
- await file_system_1.FileSystem.backup(filePath);
102
+ await FileSystem.backup(filePath);
137
103
  const updated = content.replace(blockRegex, '');
138
- await file_system_1.FileSystem.writeFileAtomic(filePath, updated);
104
+ await FileSystem.writeFileAtomic(filePath, updated);
139
105
  }
140
106
  }
141
107
  /**
@@ -157,7 +123,7 @@ class DocInjector {
157
123
  // Check for balanced code blocks
158
124
  const codeBlockMarkers = (content.match(/```/g) || []).length;
159
125
  if (codeBlockMarkers % 2 !== 0) {
160
- throw new errors_1.DataError('Invalid markdown: Unbalanced code blocks');
126
+ throw new DataError('Invalid markdown: Unbalanced code blocks');
161
127
  }
162
128
  // Check for balanced brackets
163
129
  const openBrackets = (content.match(/\[/g) || []).length;
@@ -230,7 +196,4 @@ Analyze the current conversation and extract key requirements into a structured
230
196
  `;
231
197
  }
232
198
  }
233
- exports.DocInjector = DocInjector;
234
- DocInjector.DEFAULT_START_MARKER = '<!-- CLAVIX:START -->';
235
- DocInjector.DEFAULT_END_MARKER = '<!-- CLAVIX:END -->';
236
199
  //# sourceMappingURL=doc-injector.js.map
@@ -1,4 +1,3 @@
1
- "use strict";
2
1
  /**
3
2
  * GitManager - Manages git auto-commit functionality for task implementation
4
3
  *
@@ -8,50 +7,15 @@
8
7
  * - Generating commit messages
9
8
  * - Handling commit strategies (per task, per phase, per N tasks)
10
9
  */
11
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
12
- if (k2 === undefined) k2 = k;
13
- var desc = Object.getOwnPropertyDescriptor(m, k);
14
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
15
- desc = { enumerable: true, get: function() { return m[k]; } };
16
- }
17
- Object.defineProperty(o, k2, desc);
18
- }) : (function(o, m, k, k2) {
19
- if (k2 === undefined) k2 = k;
20
- o[k2] = m[k];
21
- }));
22
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
23
- Object.defineProperty(o, "default", { enumerable: true, value: v });
24
- }) : function(o, v) {
25
- o["default"] = v;
26
- });
27
- var __importStar = (this && this.__importStar) || (function () {
28
- var ownKeys = function(o) {
29
- ownKeys = Object.getOwnPropertyNames || function (o) {
30
- var ar = [];
31
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
32
- return ar;
33
- };
34
- return ownKeys(o);
35
- };
36
- return function (mod) {
37
- if (mod && mod.__esModule) return mod;
38
- var result = {};
39
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
40
- __setModuleDefault(result, mod);
41
- return result;
42
- };
43
- })();
44
- Object.defineProperty(exports, "__esModule", { value: true });
45
- exports.CommitScheduler = exports.GitManager = void 0;
46
- const child_process_1 = require("child_process");
47
- const util_1 = require("util");
48
- const execAsync = (0, util_1.promisify)(child_process_1.exec);
10
+ import { exec } from 'child_process';
11
+ import { promisify } from 'util';
12
+ const execAsync = promisify(exec);
49
13
  /**
50
14
  * GitManager class
51
15
  *
52
16
  * Handles git operations for the implement command
53
17
  */
54
- class GitManager {
18
+ export class GitManager {
55
19
  /**
56
20
  * Check if current directory is a git repository
57
21
  */
@@ -147,7 +111,7 @@ class GitManager {
147
111
  const errors = [];
148
112
  try {
149
113
  // Read tasks.md file
150
- const fs = await Promise.resolve().then(() => __importStar(require('fs-extra')));
114
+ const fs = await import('fs-extra');
151
115
  if (!(await fs.pathExists(tasksPath))) {
152
116
  errors.push(`Tasks file not found: ${tasksPath}`);
153
117
  return { valid: false, errors };
@@ -249,17 +213,17 @@ class GitManager {
249
213
  };
250
214
  }
251
215
  }
252
- exports.GitManager = GitManager;
253
216
  /**
254
217
  * Helper class to track when to commit based on strategy
255
218
  */
256
- class CommitScheduler {
219
+ export class CommitScheduler {
220
+ strategy;
221
+ completedTasksInPhase = 0;
222
+ completedTasksTotal = 0;
223
+ completedTasksSinceLastCommit = 0;
224
+ currentPhase = '';
257
225
  constructor(strategy) {
258
226
  this.strategy = strategy;
259
- this.completedTasksInPhase = 0;
260
- this.completedTasksTotal = 0;
261
- this.completedTasksSinceLastCommit = 0;
262
- this.currentPhase = '';
263
227
  }
264
228
  /**
265
229
  * Mark a task as completed and check if commit should be made
@@ -314,5 +278,4 @@ class CommitScheduler {
314
278
  return this.completedTasksSinceLastCommit;
315
279
  }
316
280
  }
317
- exports.CommitScheduler = CommitScheduler;
318
281
  //# sourceMappingURL=git-manager.js.map
@@ -1,4 +1,3 @@
1
- "use strict";
2
1
  /**
3
2
  * PrdGenerator - Generates Product Requirements Documents from collected answers
4
3
  *
@@ -8,57 +7,24 @@
8
7
  * - File generation (full PRD and quick PRD)
9
8
  * - Output organization and timestamps
10
9
  */
11
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
12
- if (k2 === undefined) k2 = k;
13
- var desc = Object.getOwnPropertyDescriptor(m, k);
14
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
15
- desc = { enumerable: true, get: function() { return m[k]; } };
16
- }
17
- Object.defineProperty(o, k2, desc);
18
- }) : (function(o, m, k, k2) {
19
- if (k2 === undefined) k2 = k;
20
- o[k2] = m[k];
21
- }));
22
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
23
- Object.defineProperty(o, "default", { enumerable: true, value: v });
24
- }) : function(o, v) {
25
- o["default"] = v;
26
- });
27
- var __importStar = (this && this.__importStar) || (function () {
28
- var ownKeys = function(o) {
29
- ownKeys = Object.getOwnPropertyNames || function (o) {
30
- var ar = [];
31
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
32
- return ar;
33
- };
34
- return ownKeys(o);
35
- };
36
- return function (mod) {
37
- if (mod && mod.__esModule) return mod;
38
- var result = {};
39
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
40
- __setModuleDefault(result, mod);
41
- return result;
42
- };
43
- })();
44
- var __importDefault = (this && this.__importDefault) || function (mod) {
45
- return (mod && mod.__esModule) ? mod : { "default": mod };
46
- };
47
- Object.defineProperty(exports, "__esModule", { value: true });
48
- exports.PrdGenerator = void 0;
49
- const fs = __importStar(require("fs-extra"));
50
- const path = __importStar(require("path"));
51
- const handlebars_1 = __importDefault(require("handlebars"));
52
- const file_system_1 = require("../utils/file-system");
10
+ import fs from 'fs-extra';
11
+ import * as path from 'path';
12
+ import { fileURLToPath } from 'url';
13
+ import { dirname } from 'path';
14
+ import Handlebars from 'handlebars';
15
+ import { FileSystem } from '../utils/file-system.js';
16
+ const __filename = fileURLToPath(import.meta.url);
17
+ const __dirname = dirname(__filename);
53
18
  /**
54
19
  * PrdGenerator class
55
20
  *
56
21
  * Generates comprehensive and quick-reference PRD documents
57
22
  * from collected question answers
58
23
  */
59
- class PrdGenerator {
24
+ export class PrdGenerator {
25
+ templatesDir;
26
+ defaultOutputDir = '.clavix/outputs';
60
27
  constructor() {
61
- this.defaultOutputDir = '.clavix/outputs';
62
28
  // Templates are in src/templates (or dist/templates when built)
63
29
  this.templatesDir = path.join(__dirname, '../templates');
64
30
  }
@@ -75,7 +41,7 @@ class PrdGenerator {
75
41
  const timestamp = options.timestamp || new Date();
76
42
  // Create output directory
77
43
  const projectDir = path.join(outputDir, this.sanitizeProjectName(projectName));
78
- await file_system_1.FileSystem.ensureDir(projectDir);
44
+ await FileSystem.ensureDir(projectDir);
79
45
  // Prepare template data
80
46
  const metadata = {
81
47
  generatedAt: timestamp.toISOString(),
@@ -172,9 +138,9 @@ class PrdGenerator {
172
138
  ? customTemplatePath
173
139
  : templatePath;
174
140
  const template = await fs.readFile(templateToUse, 'utf-8');
175
- const compiled = handlebars_1.default.compile(template);
141
+ const compiled = Handlebars.compile(template);
176
142
  const rendered = compiled(data);
177
- await file_system_1.FileSystem.writeFileAtomic(outputPath, rendered);
143
+ await FileSystem.writeFileAtomic(outputPath, rendered);
178
144
  }
179
145
  /**
180
146
  * Generate quick PRD document
@@ -187,9 +153,9 @@ class PrdGenerator {
187
153
  ? customTemplatePath
188
154
  : templatePath;
189
155
  const template = await fs.readFile(templateToUse, 'utf-8');
190
- const compiled = handlebars_1.default.compile(template);
156
+ const compiled = Handlebars.compile(template);
191
157
  const rendered = compiled(data);
192
- await file_system_1.FileSystem.writeFileAtomic(outputPath, rendered);
158
+ await FileSystem.writeFileAtomic(outputPath, rendered);
193
159
  }
194
160
  /**
195
161
  * Format timestamp for display
@@ -204,5 +170,4 @@ class PrdGenerator {
204
170
  });
205
171
  }
206
172
  }
207
- exports.PrdGenerator = PrdGenerator;
208
173
  //# sourceMappingURL=prd-generator.js.map
@@ -1,43 +1,8 @@
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;
33
- };
34
- })();
35
- Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.PromptManager = void 0;
37
- const fs = __importStar(require("fs-extra"));
38
- const path = __importStar(require("path"));
39
- const uuid_1 = require("uuid");
40
- class PromptManager {
1
+ import fs from 'fs-extra';
2
+ import * as path from 'path';
3
+ import { v4 as uuidv4 } from 'uuid';
4
+ export class PromptManager {
5
+ promptsDir;
41
6
  constructor(baseDir) {
42
7
  // If baseDir ends with 'prompts', use it directly; otherwise append 'prompts'
43
8
  if (baseDir) {
@@ -68,7 +33,7 @@ class PromptManager {
68
33
  const date = timestamp[0].replace(/-/g, '');
69
34
  const time = timestamp[1].split('-').slice(0, 3).join('');
70
35
  // Use UUID for uniqueness (mockable for tests - first 13 chars for readability)
71
- const hash = (0, uuid_1.v4)().substring(0, 13);
36
+ const hash = uuidv4().substring(0, 13);
72
37
  return `${source}-${date}-${time}-${hash}`;
73
38
  }
74
39
  /**
@@ -308,5 +273,4 @@ class PromptManager {
308
273
  await this.saveIndex(index, metadata.source);
309
274
  }
310
275
  }
311
- exports.PromptManager = PromptManager;
312
276
  //# sourceMappingURL=prompt-manager.js.map
@@ -1,13 +1,10 @@
1
- "use strict";
2
1
  /**
3
2
  * PromptOptimizer - Analyzes and improves prompts using the CLEAR Framework
4
3
  * CLEAR Framework: Concise, Logical, Explicit, Adaptive, Reflective
5
4
  * Developed by Dr. Leo Lo, University of New Mexico
6
5
  * Reference: https://guides.library.tamucc.edu/prompt-engineering/clear
7
6
  */
8
- Object.defineProperty(exports, "__esModule", { value: true });
9
- exports.PromptOptimizer = void 0;
10
- class PromptOptimizer {
7
+ export class PromptOptimizer {
11
8
  /**
12
9
  * Analyze a prompt and identify issues
13
10
  */
@@ -959,5 +956,4 @@ class PromptOptimizer {
959
956
  return cleaned.split('.')[0] || cleaned.substring(0, 100);
960
957
  }
961
958
  }
962
- exports.PromptOptimizer = PromptOptimizer;
963
959
  //# sourceMappingURL=prompt-optimizer.js.map
@@ -1,4 +1,3 @@
1
- "use strict";
2
1
  /**
3
2
  * QuestionEngine - Manages Socratic questioning flows for PRD generation
4
3
  *
@@ -8,54 +7,17 @@
8
7
  * - Answer collection and validation
9
8
  * - Progress tracking
10
9
  */
11
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
12
- if (k2 === undefined) k2 = k;
13
- var desc = Object.getOwnPropertyDescriptor(m, k);
14
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
15
- desc = { enumerable: true, get: function() { return m[k]; } };
16
- }
17
- Object.defineProperty(o, k2, desc);
18
- }) : (function(o, m, k, k2) {
19
- if (k2 === undefined) k2 = k;
20
- o[k2] = m[k];
21
- }));
22
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
23
- Object.defineProperty(o, "default", { enumerable: true, value: v });
24
- }) : function(o, v) {
25
- o["default"] = v;
26
- });
27
- var __importStar = (this && this.__importStar) || (function () {
28
- var ownKeys = function(o) {
29
- ownKeys = Object.getOwnPropertyNames || function (o) {
30
- var ar = [];
31
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
32
- return ar;
33
- };
34
- return ownKeys(o);
35
- };
36
- return function (mod) {
37
- if (mod && mod.__esModule) return mod;
38
- var result = {};
39
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
40
- __setModuleDefault(result, mod);
41
- return result;
42
- };
43
- })();
44
- Object.defineProperty(exports, "__esModule", { value: true });
45
- exports.QuestionEngine = void 0;
46
- const fs = __importStar(require("fs-extra"));
47
- const path = __importStar(require("path"));
10
+ import fs from 'fs-extra';
11
+ import * as path from 'path';
48
12
  /**
49
13
  * QuestionEngine class
50
14
  *
51
15
  * Manages the flow of questions, answer collection, and validation
52
16
  */
53
- class QuestionEngine {
54
- constructor() {
55
- this.currentFlow = null;
56
- this.answers = {};
57
- this.currentQuestionIndex = 0;
58
- }
17
+ export class QuestionEngine {
18
+ currentFlow = null;
19
+ answers = {};
20
+ currentQuestionIndex = 0;
59
21
  /**
60
22
  * Load a question flow from a template file
61
23
  *
@@ -391,5 +353,4 @@ class QuestionEngine {
391
353
  return this.currentFlow;
392
354
  }
393
355
  }
394
- exports.QuestionEngine = QuestionEngine;
395
356
  //# sourceMappingURL=question-engine.js.map
@@ -11,7 +11,7 @@
11
11
  * Sessions are stored in `.clavix/sessions/` as JSON files:
12
12
  * `.clavix/sessions/{session-id}.json`
13
13
  */
14
- import { Session, SessionMetadata, SessionFilter } from '../types/session';
14
+ import { Session, SessionMetadata, SessionFilter } from '../types/session.js';
15
15
  /**
16
16
  * Options for creating a new session
17
17
  */
@@ -1,4 +1,3 @@
1
- "use strict";
2
1
  /**
3
2
  * SessionManager - Manages conversational sessions for clavix start/summarize
4
3
  *
@@ -12,56 +11,20 @@
12
11
  * Sessions are stored in `.clavix/sessions/` as JSON files:
13
12
  * `.clavix/sessions/{session-id}.json`
14
13
  */
15
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
16
- if (k2 === undefined) k2 = k;
17
- var desc = Object.getOwnPropertyDescriptor(m, k);
18
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
19
- desc = { enumerable: true, get: function() { return m[k]; } };
20
- }
21
- Object.defineProperty(o, k2, desc);
22
- }) : (function(o, m, k, k2) {
23
- if (k2 === undefined) k2 = k;
24
- o[k2] = m[k];
25
- }));
26
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
27
- Object.defineProperty(o, "default", { enumerable: true, value: v });
28
- }) : function(o, v) {
29
- o["default"] = v;
30
- });
31
- var __importStar = (this && this.__importStar) || (function () {
32
- var ownKeys = function(o) {
33
- ownKeys = Object.getOwnPropertyNames || function (o) {
34
- var ar = [];
35
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
36
- return ar;
37
- };
38
- return ownKeys(o);
39
- };
40
- return function (mod) {
41
- if (mod && mod.__esModule) return mod;
42
- var result = {};
43
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
44
- __setModuleDefault(result, mod);
45
- return result;
46
- };
47
- })();
48
- Object.defineProperty(exports, "__esModule", { value: true });
49
- exports.SessionManager = void 0;
50
- const fs = __importStar(require("fs-extra"));
51
- const path = __importStar(require("path"));
52
- const file_system_1 = require("../utils/file-system");
53
- // Use require for uuid to avoid Jest ESM issues
54
- // eslint-disable-next-line @typescript-eslint/no-require-imports
55
- const { v4: uuidv4 } = require('uuid');
14
+ import fs from 'fs-extra';
15
+ import * as path from 'path';
16
+ import { FileSystem } from '../utils/file-system.js';
17
+ import { v4 as uuidv4 } from 'uuid';
56
18
  /**
57
19
  * SessionManager class
58
20
  *
59
21
  * Manages all session-related operations including creation, storage,
60
22
  * retrieval, listing, and search functionality.
61
23
  */
62
- class SessionManager {
24
+ export class SessionManager {
25
+ sessionsDir;
26
+ defaultSessionsDir = '.clavix/sessions';
63
27
  constructor(sessionsDir) {
64
- this.defaultSessionsDir = '.clavix/sessions';
65
28
  this.sessionsDir = sessionsDir || this.defaultSessionsDir;
66
29
  }
67
30
  /**
@@ -112,11 +75,11 @@ class SessionManager {
112
75
  * @param session - The session to save
113
76
  */
114
77
  async saveSession(session) {
115
- await file_system_1.FileSystem.ensureDir(this.sessionsDir);
78
+ await FileSystem.ensureDir(this.sessionsDir);
116
79
  const sessionPath = this.getSessionPath(session.id);
117
80
  const serialized = this.serializeSession(session);
118
81
  // Use atomic write to prevent corruption
119
- await file_system_1.FileSystem.writeFileAtomic(sessionPath, JSON.stringify(serialized, null, 2));
82
+ await FileSystem.writeFileAtomic(sessionPath, JSON.stringify(serialized, null, 2));
120
83
  }
121
84
  /**
122
85
  * Update a session
@@ -185,7 +148,7 @@ class SessionManager {
185
148
  * @returns Array of session metadata
186
149
  */
187
150
  async listSessions(filter) {
188
- await file_system_1.FileSystem.ensureDir(this.sessionsDir);
151
+ await FileSystem.ensureDir(this.sessionsDir);
189
152
  const files = await fs.readdir(this.sessionsDir);
190
153
  const sessionFiles = files.filter((f) => f.endsWith('.json'));
191
154
  const sessions = [];
@@ -220,7 +183,7 @@ class SessionManager {
220
183
  * @returns Array of matching session metadata
221
184
  */
222
185
  async searchSessions(keyword) {
223
- await file_system_1.FileSystem.ensureDir(this.sessionsDir);
186
+ await FileSystem.ensureDir(this.sessionsDir);
224
187
  const files = await fs.readdir(this.sessionsDir);
225
188
  const sessionFiles = files.filter((f) => f.endsWith('.json'));
226
189
  const matches = [];
@@ -399,5 +362,4 @@ class SessionManager {
399
362
  return true;
400
363
  }
401
364
  }
402
- exports.SessionManager = SessionManager;
403
365
  //# sourceMappingURL=session-manager.js.map
@@ -70,8 +70,34 @@ export declare class TaskManager {
70
70
  */
71
71
  private analyzePrdAndGenerateTasks;
72
72
  private getSectionByAliases;
73
+ /**
74
+ * Generate phases from core features with intelligent grouping
75
+ * CRITICAL FIX: Group related features instead of 1 phase per bullet
76
+ */
73
77
  private generatePhasesFromCoreFeatures;
78
+ /**
79
+ * Group features by category for logical phase organization
80
+ * Replaces "1 bullet = 1 phase" with intelligent grouping
81
+ */
82
+ private groupFeaturesByCategory;
83
+ /**
84
+ * Extract top-level list items only (ignore nested bullets)
85
+ * This prevents sub-bullets from being treated as separate tasks
86
+ */
74
87
  private extractListItems;
88
+ /**
89
+ * Detect if a line looks like code or a file path (not a task)
90
+ */
91
+ private looksLikeCodeOrPath;
92
+ /**
93
+ * Detect if text is an implementation detail rather than a feature
94
+ * Implementation details are constraints, requirements, or sub-steps
95
+ */
96
+ private looksLikeImplementationDetail;
97
+ /**
98
+ * Build context-aware task descriptions based on feature type and complexity
99
+ * Replaces the old 5-task boilerplate with intelligent task generation
100
+ */
75
101
  private buildFeatureTaskDescriptions;
76
102
  private formatInlineText;
77
103
  private toTitleCase;