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,46 +1,12 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
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
|
|
59
|
-
fileContent = await
|
|
24
|
+
if (await FileSystem.exists(fullPath)) {
|
|
25
|
+
fileContent = await FileSystem.readFile(fullPath);
|
|
60
26
|
}
|
|
61
27
|
else if (!opts.createIfMissing) {
|
|
62
|
-
throw new
|
|
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
|
|
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
|
|
87
|
-
await
|
|
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
|
|
92
|
-
await
|
|
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
|
|
69
|
+
if (!(await FileSystem.exists(filePath))) {
|
|
104
70
|
return false;
|
|
105
71
|
}
|
|
106
|
-
const content = await
|
|
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
|
|
82
|
+
if (!(await FileSystem.exists(filePath))) {
|
|
117
83
|
return null;
|
|
118
84
|
}
|
|
119
|
-
const content = await
|
|
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
|
|
96
|
+
if (!(await FileSystem.exists(filePath))) {
|
|
131
97
|
return;
|
|
132
98
|
}
|
|
133
|
-
const content = await
|
|
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
|
|
102
|
+
await FileSystem.backup(filePath);
|
|
137
103
|
const updated = content.replace(blockRegex, '');
|
|
138
|
-
await
|
|
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
|
|
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
|
package/dist/core/git-manager.js
CHANGED
|
@@ -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
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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
|
|
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
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
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
|
|
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 =
|
|
141
|
+
const compiled = Handlebars.compile(template);
|
|
176
142
|
const rendered = compiled(data);
|
|
177
|
-
await
|
|
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 =
|
|
156
|
+
const compiled = Handlebars.compile(template);
|
|
191
157
|
const rendered = compiled(data);
|
|
192
|
-
await
|
|
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
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
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 = (
|
|
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
|
-
|
|
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
|
-
|
|
12
|
-
|
|
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
|
-
|
|
55
|
-
|
|
56
|
-
|
|
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
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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;
|