clavix 2.7.1 → 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 +18 -4
- 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 +9 -4
- 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
package/dist/types/config.js
CHANGED
|
@@ -1,12 +1,7 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
/**
|
|
3
2
|
* Configuration types for Clavix
|
|
4
3
|
*/
|
|
5
|
-
|
|
6
|
-
exports.DEFAULT_CONFIG = void 0;
|
|
7
|
-
exports.migrateConfig = migrateConfig;
|
|
8
|
-
exports.isLegacyConfig = isLegacyConfig;
|
|
9
|
-
exports.DEFAULT_CONFIG = {
|
|
4
|
+
export const DEFAULT_CONFIG = {
|
|
10
5
|
version: '1.4.0',
|
|
11
6
|
providers: [],
|
|
12
7
|
templates: {
|
|
@@ -27,7 +22,7 @@ exports.DEFAULT_CONFIG = {
|
|
|
27
22
|
/**
|
|
28
23
|
* Migrate legacy config (v1.3.0 and earlier) to new format
|
|
29
24
|
*/
|
|
30
|
-
function migrateConfig(legacy) {
|
|
25
|
+
export function migrateConfig(legacy) {
|
|
31
26
|
return {
|
|
32
27
|
version: '1.4.0',
|
|
33
28
|
providers: [legacy.agent],
|
|
@@ -40,7 +35,7 @@ function migrateConfig(legacy) {
|
|
|
40
35
|
/**
|
|
41
36
|
* Check if config is legacy format
|
|
42
37
|
*/
|
|
43
|
-
function isLegacyConfig(config) {
|
|
38
|
+
export function isLegacyConfig(config) {
|
|
44
39
|
return (config !== null &&
|
|
45
40
|
config !== undefined &&
|
|
46
41
|
typeof config === 'object' &&
|
package/dist/types/errors.js
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
/**
|
|
3
2
|
* Custom error types for Clavix
|
|
4
3
|
*/
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
4
|
+
export class ClavixError extends Error {
|
|
5
|
+
hint;
|
|
6
|
+
code;
|
|
8
7
|
constructor(message, hint, code) {
|
|
9
8
|
super(message);
|
|
10
9
|
this.hint = hint;
|
|
@@ -13,33 +12,28 @@ class ClavixError extends Error {
|
|
|
13
12
|
Error.captureStackTrace(this, this.constructor);
|
|
14
13
|
}
|
|
15
14
|
}
|
|
16
|
-
|
|
17
|
-
class PermissionError extends ClavixError {
|
|
15
|
+
export class PermissionError extends ClavixError {
|
|
18
16
|
constructor(message, hint) {
|
|
19
17
|
super(message, hint, 'PERMISSION_ERROR');
|
|
20
18
|
this.name = 'PermissionError';
|
|
21
19
|
}
|
|
22
20
|
}
|
|
23
|
-
|
|
24
|
-
class ValidationError extends ClavixError {
|
|
21
|
+
export class ValidationError extends ClavixError {
|
|
25
22
|
constructor(message, hint) {
|
|
26
23
|
super(message, hint, 'VALIDATION_ERROR');
|
|
27
24
|
this.name = 'ValidationError';
|
|
28
25
|
}
|
|
29
26
|
}
|
|
30
|
-
|
|
31
|
-
class IntegrationError extends ClavixError {
|
|
27
|
+
export class IntegrationError extends ClavixError {
|
|
32
28
|
constructor(message, hint) {
|
|
33
29
|
super(message, hint, 'INTEGRATION_ERROR');
|
|
34
30
|
this.name = 'IntegrationError';
|
|
35
31
|
}
|
|
36
32
|
}
|
|
37
|
-
|
|
38
|
-
class DataError extends ClavixError {
|
|
33
|
+
export class DataError extends ClavixError {
|
|
39
34
|
constructor(message, hint) {
|
|
40
35
|
super(message, hint, 'DATA_ERROR');
|
|
41
36
|
this.name = 'DataError';
|
|
42
37
|
}
|
|
43
38
|
}
|
|
44
|
-
exports.DataError = DataError;
|
|
45
39
|
//# sourceMappingURL=errors.js.map
|
package/dist/types/session.js
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
/**
|
|
3
2
|
* Session management types
|
|
4
3
|
*
|
|
5
4
|
* Sessions store conversational state for the `clavix start` command,
|
|
6
5
|
* allowing users to have multi-turn conversations that can be summarized later.
|
|
7
6
|
*/
|
|
8
|
-
|
|
7
|
+
export {};
|
|
9
8
|
//# sourceMappingURL=session.js.map
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
/**
|
|
3
2
|
* Error messages optimized for AI agent consumption
|
|
4
3
|
*
|
|
@@ -8,9 +7,7 @@
|
|
|
8
7
|
* - Provide context for decision-making
|
|
9
8
|
* - Avoid conversational tone in favor of structured guidance
|
|
10
9
|
*/
|
|
11
|
-
|
|
12
|
-
exports.AgentErrorMessages = void 0;
|
|
13
|
-
class AgentErrorMessages {
|
|
10
|
+
export class AgentErrorMessages {
|
|
14
11
|
/**
|
|
15
12
|
* Error: No PRD artifacts found in .clavix/outputs/
|
|
16
13
|
* Used by: plan.ts, implement.ts
|
|
@@ -208,5 +205,4 @@ class AgentErrorMessages {
|
|
|
208
205
|
'No action needed unless forced.');
|
|
209
206
|
}
|
|
210
207
|
}
|
|
211
|
-
exports.AgentErrorMessages = AgentErrorMessages;
|
|
212
208
|
//# sourceMappingURL=agent-error-messages.js.map
|
|
@@ -1,17 +1,10 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
/**
|
|
3
2
|
* Error handling utilities with proper type guards
|
|
4
3
|
*/
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.isError = isError;
|
|
7
|
-
exports.getErrorMessage = getErrorMessage;
|
|
8
|
-
exports.getErrorStack = getErrorStack;
|
|
9
|
-
exports.toError = toError;
|
|
10
|
-
exports.isNodeError = isNodeError;
|
|
11
4
|
/**
|
|
12
5
|
* Type guard to check if value is an Error instance
|
|
13
6
|
*/
|
|
14
|
-
function isError(error) {
|
|
7
|
+
export function isError(error) {
|
|
15
8
|
return error instanceof Error;
|
|
16
9
|
}
|
|
17
10
|
/**
|
|
@@ -19,7 +12,7 @@ function isError(error) {
|
|
|
19
12
|
* @param error - Unknown error value
|
|
20
13
|
* @returns Error message string
|
|
21
14
|
*/
|
|
22
|
-
function getErrorMessage(error) {
|
|
15
|
+
export function getErrorMessage(error) {
|
|
23
16
|
if (isError(error)) {
|
|
24
17
|
return error.message;
|
|
25
18
|
}
|
|
@@ -39,7 +32,7 @@ function getErrorMessage(error) {
|
|
|
39
32
|
* @param error - Unknown error value
|
|
40
33
|
* @returns Stack trace string or undefined
|
|
41
34
|
*/
|
|
42
|
-
function getErrorStack(error) {
|
|
35
|
+
export function getErrorStack(error) {
|
|
43
36
|
if (isError(error)) {
|
|
44
37
|
return error.stack;
|
|
45
38
|
}
|
|
@@ -49,7 +42,7 @@ function getErrorStack(error) {
|
|
|
49
42
|
* Convert unknown error to Error instance
|
|
50
43
|
* Useful when you need to throw or rethrow with proper type
|
|
51
44
|
*/
|
|
52
|
-
function toError(error) {
|
|
45
|
+
export function toError(error) {
|
|
53
46
|
if (isError(error)) {
|
|
54
47
|
return error;
|
|
55
48
|
}
|
|
@@ -67,7 +60,7 @@ function toError(error) {
|
|
|
67
60
|
/**
|
|
68
61
|
* Type guard to check if error is a NodeJS error with code property
|
|
69
62
|
*/
|
|
70
|
-
function isNodeError(error) {
|
|
63
|
+
export function isNodeError(error) {
|
|
71
64
|
return (isError(error) &&
|
|
72
65
|
'code' in error &&
|
|
73
66
|
typeof error.code === 'string');
|
|
@@ -1,46 +1,10 @@
|
|
|
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.FileSystem = void 0;
|
|
37
|
-
const fs = __importStar(require("fs-extra"));
|
|
38
|
-
const path = __importStar(require("path"));
|
|
39
|
-
const errors_1 = require("../types/errors");
|
|
1
|
+
import fs from 'fs-extra';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import { PermissionError, DataError } from '../types/errors.js';
|
|
40
4
|
/**
|
|
41
5
|
* FileSystem utility class for safe file operations
|
|
42
6
|
*/
|
|
43
|
-
class FileSystem {
|
|
7
|
+
export class FileSystem {
|
|
44
8
|
/**
|
|
45
9
|
* Atomically write file with backup
|
|
46
10
|
*/
|
|
@@ -67,12 +31,12 @@ class FileSystem {
|
|
|
67
31
|
await fs.remove(backupPath);
|
|
68
32
|
}
|
|
69
33
|
catch {
|
|
70
|
-
throw new
|
|
34
|
+
throw new DataError('Failed to write file and restore backup', `Check file permissions for ${fullPath}`);
|
|
71
35
|
}
|
|
72
36
|
}
|
|
73
|
-
const { isNodeError, toError } = await
|
|
37
|
+
const { isNodeError, toError } = await import('./error-utils.js');
|
|
74
38
|
if (isNodeError(error) && (error.code === 'EACCES' || error.code === 'EPERM')) {
|
|
75
|
-
throw new
|
|
39
|
+
throw new PermissionError(`Permission denied: Cannot write to ${filePath}`, 'Try running with appropriate permissions or check file ownership');
|
|
76
40
|
}
|
|
77
41
|
throw toError(error);
|
|
78
42
|
}
|
|
@@ -84,14 +48,14 @@ class FileSystem {
|
|
|
84
48
|
const fullPath = path.resolve(filePath);
|
|
85
49
|
try {
|
|
86
50
|
if (!(await fs.pathExists(fullPath))) {
|
|
87
|
-
throw new
|
|
51
|
+
throw new DataError(`File not found: ${filePath}`);
|
|
88
52
|
}
|
|
89
53
|
return await fs.readFile(fullPath, 'utf-8');
|
|
90
54
|
}
|
|
91
55
|
catch (error) {
|
|
92
|
-
const { isNodeError, toError } = await
|
|
56
|
+
const { isNodeError, toError } = await import('./error-utils.js');
|
|
93
57
|
if (isNodeError(error) && (error.code === 'EACCES' || error.code === 'EPERM')) {
|
|
94
|
-
throw new
|
|
58
|
+
throw new PermissionError(`Permission denied: Cannot read ${filePath}`, 'Check file permissions');
|
|
95
59
|
}
|
|
96
60
|
throw toError(error);
|
|
97
61
|
}
|
|
@@ -105,9 +69,9 @@ class FileSystem {
|
|
|
105
69
|
await fs.ensureDir(fullPath);
|
|
106
70
|
}
|
|
107
71
|
catch (error) {
|
|
108
|
-
const { isNodeError, toError } = await
|
|
72
|
+
const { isNodeError, toError } = await import('./error-utils.js');
|
|
109
73
|
if (isNodeError(error) && (error.code === 'EACCES' || error.code === 'EPERM')) {
|
|
110
|
-
throw new
|
|
74
|
+
throw new PermissionError(`Permission denied: Cannot create directory ${dirPath}`, 'Check parent directory permissions');
|
|
111
75
|
}
|
|
112
76
|
throw toError(error);
|
|
113
77
|
}
|
|
@@ -156,7 +120,7 @@ class FileSystem {
|
|
|
156
120
|
return backupPath;
|
|
157
121
|
}
|
|
158
122
|
catch {
|
|
159
|
-
throw new
|
|
123
|
+
throw new PermissionError(`Failed to create backup of ${filePath}`, 'Check file permissions');
|
|
160
124
|
}
|
|
161
125
|
}
|
|
162
126
|
/**
|
|
@@ -172,7 +136,7 @@ class FileSystem {
|
|
|
172
136
|
}
|
|
173
137
|
}
|
|
174
138
|
catch {
|
|
175
|
-
throw new
|
|
139
|
+
throw new DataError(`Failed to restore backup for ${filePath}`, 'Manual recovery may be required');
|
|
176
140
|
}
|
|
177
141
|
}
|
|
178
142
|
/**
|
|
@@ -191,9 +155,9 @@ class FileSystem {
|
|
|
191
155
|
return files;
|
|
192
156
|
}
|
|
193
157
|
catch (error) {
|
|
194
|
-
const { isNodeError, toError } = await
|
|
158
|
+
const { isNodeError, toError } = await import('./error-utils.js');
|
|
195
159
|
if (isNodeError(error) && (error.code === 'EACCES' || error.code === 'EPERM')) {
|
|
196
|
-
throw new
|
|
160
|
+
throw new PermissionError(`Permission denied: Cannot read directory ${dirPath}`, 'Check directory permissions');
|
|
197
161
|
}
|
|
198
162
|
throw toError(error);
|
|
199
163
|
}
|
|
@@ -208,9 +172,9 @@ class FileSystem {
|
|
|
208
172
|
await fs.copy(srcPath, destPath);
|
|
209
173
|
}
|
|
210
174
|
catch (error) {
|
|
211
|
-
const { isNodeError, toError } = await
|
|
175
|
+
const { isNodeError, toError } = await import('./error-utils.js');
|
|
212
176
|
if (isNodeError(error) && (error.code === 'EACCES' || error.code === 'EPERM')) {
|
|
213
|
-
throw new
|
|
177
|
+
throw new PermissionError(`Permission denied: Cannot copy from ${src} to ${dest}`, 'Check file permissions');
|
|
214
178
|
}
|
|
215
179
|
throw toError(error);
|
|
216
180
|
}
|
|
@@ -226,13 +190,12 @@ class FileSystem {
|
|
|
226
190
|
}
|
|
227
191
|
}
|
|
228
192
|
catch (error) {
|
|
229
|
-
const { isNodeError, toError } = await
|
|
193
|
+
const { isNodeError, toError } = await import('./error-utils.js');
|
|
230
194
|
if (isNodeError(error) && (error.code === 'EACCES' || error.code === 'EPERM')) {
|
|
231
|
-
throw new
|
|
195
|
+
throw new PermissionError(`Permission denied: Cannot remove ${filePath}`, 'Check file permissions');
|
|
232
196
|
}
|
|
233
197
|
throw toError(error);
|
|
234
198
|
}
|
|
235
199
|
}
|
|
236
200
|
}
|
|
237
|
-
exports.FileSystem = FileSystem;
|
|
238
201
|
//# sourceMappingURL=file-system.js.map
|
|
@@ -1,42 +1,6 @@
|
|
|
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.collectLegacyCommandFiles = collectLegacyCommandFiles;
|
|
37
|
-
const path = __importStar(require("path"));
|
|
38
|
-
const file_system_1 = require("./file-system");
|
|
39
|
-
async function collectLegacyCommandFiles(adapter, commandNames) {
|
|
1
|
+
import * as path from 'path';
|
|
2
|
+
import { FileSystem } from './file-system.js';
|
|
3
|
+
export async function collectLegacyCommandFiles(adapter, commandNames) {
|
|
40
4
|
const legacyPaths = new Set();
|
|
41
5
|
const extension = adapter.fileExtension;
|
|
42
6
|
const commandDir = path.resolve(adapter.getCommandPath());
|
|
@@ -51,33 +15,33 @@ async function collectLegacyCommandFiles(adapter, commandNames) {
|
|
|
51
15
|
];
|
|
52
16
|
for (const candidate of oldCandidates) {
|
|
53
17
|
const resolvedCandidate = path.resolve(candidate);
|
|
54
|
-
if (resolvedCandidate !== newFilePath && await
|
|
18
|
+
if (resolvedCandidate !== newFilePath && await FileSystem.exists(resolvedCandidate)) {
|
|
55
19
|
legacyPaths.add(resolvedCandidate);
|
|
56
20
|
}
|
|
57
21
|
}
|
|
58
|
-
if (defaultFilePath !== newFilePath && await
|
|
22
|
+
if (defaultFilePath !== newFilePath && await FileSystem.exists(defaultFilePath)) {
|
|
59
23
|
legacyPaths.add(defaultFilePath);
|
|
60
24
|
}
|
|
61
25
|
continue;
|
|
62
26
|
}
|
|
63
27
|
if (adapter.name === 'gemini' || adapter.name === 'qwen') {
|
|
64
28
|
const namespaced = commandDir.endsWith(path.join('commands', 'clavix'));
|
|
65
|
-
if (!namespaced && defaultFilePath !== newFilePath && await
|
|
29
|
+
if (!namespaced && defaultFilePath !== newFilePath && await FileSystem.exists(defaultFilePath)) {
|
|
66
30
|
legacyPaths.add(defaultFilePath);
|
|
67
31
|
}
|
|
68
32
|
}
|
|
69
|
-
else if (defaultFilePath !== newFilePath && await
|
|
33
|
+
else if (defaultFilePath !== newFilePath && await FileSystem.exists(defaultFilePath)) {
|
|
70
34
|
legacyPaths.add(defaultFilePath);
|
|
71
35
|
}
|
|
72
36
|
}
|
|
73
37
|
if (adapter.name === 'claude-code') {
|
|
74
38
|
const commandsDir = path.resolve('.claude', 'commands');
|
|
75
|
-
const colonFiles = await
|
|
39
|
+
const colonFiles = await FileSystem.listFiles(commandsDir, /^clavix:.*\.md$/);
|
|
76
40
|
for (const file of colonFiles) {
|
|
77
41
|
legacyPaths.add(path.resolve(path.join(commandsDir, file)));
|
|
78
42
|
}
|
|
79
43
|
const clavixDir = path.resolve(commandsDir, 'clavix');
|
|
80
|
-
const hyphenFiles = await
|
|
44
|
+
const hyphenFiles = await FileSystem.listFiles(clavixDir, /^clavix-.*\.md$/);
|
|
81
45
|
for (const file of hyphenFiles) {
|
|
82
46
|
legacyPaths.add(path.resolve(path.join(clavixDir, file)));
|
|
83
47
|
}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { AgentAdapter, CommandTemplate } from '../types/agent';
|
|
1
|
+
import { AgentAdapter, CommandTemplate } from '../types/agent.js';
|
|
2
2
|
export declare function loadCommandTemplates(_adapter: AgentAdapter): Promise<CommandTemplate[]>;
|
|
3
3
|
//# sourceMappingURL=template-loader.d.ts.map
|
|
@@ -1,45 +1,13 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
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.loadCommandTemplates = loadCommandTemplates;
|
|
37
|
-
const path = __importStar(require("path"));
|
|
38
|
-
const file_system_1 = require("./file-system");
|
|
39
|
-
async function loadCommandTemplates(_adapter) {
|
|
1
|
+
import * as path from 'path';
|
|
2
|
+
import { fileURLToPath } from 'url';
|
|
3
|
+
import { dirname } from 'path';
|
|
4
|
+
import { FileSystem } from './file-system.js';
|
|
5
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
6
|
+
const __dirname = dirname(__filename);
|
|
7
|
+
export async function loadCommandTemplates(_adapter) {
|
|
40
8
|
// Load from canonical template source (always .md files)
|
|
41
9
|
const templatesDir = getCanonicalTemplatesDirectory();
|
|
42
|
-
const files = await
|
|
10
|
+
const files = await FileSystem.listFiles(templatesDir);
|
|
43
11
|
if (files.length === 0) {
|
|
44
12
|
return [];
|
|
45
13
|
}
|
|
@@ -48,7 +16,7 @@ async function loadCommandTemplates(_adapter) {
|
|
|
48
16
|
const templates = [];
|
|
49
17
|
for (const file of commandFiles) {
|
|
50
18
|
const templatePath = path.join(templatesDir, file);
|
|
51
|
-
const content = await
|
|
19
|
+
const content = await FileSystem.readFile(templatePath);
|
|
52
20
|
const name = file.slice(0, -3); // Remove .md extension
|
|
53
21
|
// Extract description and clean content from markdown
|
|
54
22
|
const description = extractDescription(content);
|
|
@@ -1,11 +1,8 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.parseTomlSlashCommand = parseTomlSlashCommand;
|
|
4
1
|
/**
|
|
5
2
|
* Parse TOML-based slash command templates (Gemini/Qwen) and extract metadata.
|
|
6
3
|
* Ensures the resulting prompt body does not include duplicated frontmatter.
|
|
7
4
|
*/
|
|
8
|
-
function parseTomlSlashCommand(content, templateName, providerName) {
|
|
5
|
+
export function parseTomlSlashCommand(content, templateName, providerName) {
|
|
9
6
|
let normalized = content.replace(/\r\n/g, '\n').replace(/\r/g, '\n');
|
|
10
7
|
if (normalized.charCodeAt(0) === 0xfeff) {
|
|
11
8
|
normalized = normalized.slice(1);
|
package/package.json
CHANGED
|
@@ -1,21 +1,26 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "clavix",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.8.0",
|
|
4
4
|
"description": "Transform vague ideas into production-ready prompts. AI agent tool with CLI interface using the CLEAR framework to analyze, improve, and generate PRDs for AI coding assistants (Claude Code, Cursor, Windsurf, and more)",
|
|
5
|
+
"type": "module",
|
|
5
6
|
"main": "dist/index.js",
|
|
6
7
|
"types": "dist/index.d.ts",
|
|
7
8
|
"bin": {
|
|
8
9
|
"clavix": "bin/clavix.js"
|
|
9
10
|
},
|
|
11
|
+
"exports": {
|
|
12
|
+
".": "./dist/index.js",
|
|
13
|
+
"./package.json": "./package.json"
|
|
14
|
+
},
|
|
10
15
|
"scripts": {
|
|
11
16
|
"build": "tsc && npm run copy-templates",
|
|
12
17
|
"build:prod": "npm run build && npm run remove-sourcemaps",
|
|
13
18
|
"copy-templates": "copyfiles -u 1 \"src/templates/**/*\" dist/",
|
|
14
19
|
"remove-sourcemaps": "find dist -name '*.map' -type f -delete",
|
|
15
20
|
"dev": "ts-node src/index.ts",
|
|
16
|
-
"test": "jest",
|
|
17
|
-
"test:watch": "jest --watch",
|
|
18
|
-
"test:coverage": "jest --coverage",
|
|
21
|
+
"test": "NODE_OPTIONS=\"--experimental-vm-modules\" jest",
|
|
22
|
+
"test:watch": "NODE_OPTIONS=\"--experimental-vm-modules\" jest --watch",
|
|
23
|
+
"test:coverage": "NODE_OPTIONS=\"--experimental-vm-modules\" jest --coverage",
|
|
19
24
|
"lint": "eslint src --ext .ts",
|
|
20
25
|
"lint:fix": "eslint src --ext .ts --fix",
|
|
21
26
|
"format": "prettier --write \"src/**/*.ts\"",
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Generator for universal AGENTS.md file
|
|
3
|
-
* Provides workflow instructions for AI tools without slash command support
|
|
4
|
-
*/
|
|
5
|
-
export declare class AgentsMdGenerator {
|
|
6
|
-
static readonly TARGET_FILE = "AGENTS.md";
|
|
7
|
-
static readonly START_MARKER = "<!-- CLAVIX:START -->";
|
|
8
|
-
static readonly END_MARKER = "<!-- CLAVIX:END -->";
|
|
9
|
-
/**
|
|
10
|
-
* Generate or update AGENTS.md with Clavix workflows
|
|
11
|
-
*/
|
|
12
|
-
static generate(): Promise<void>;
|
|
13
|
-
/**
|
|
14
|
-
* Inject or update managed block in AGENTS.md
|
|
15
|
-
*/
|
|
16
|
-
private static injectManagedBlock;
|
|
17
|
-
/**
|
|
18
|
-
* Escape special regex characters
|
|
19
|
-
*/
|
|
20
|
-
private static escapeRegex;
|
|
21
|
-
/**
|
|
22
|
-
* Check if AGENTS.md has Clavix block
|
|
23
|
-
*/
|
|
24
|
-
static hasClavixBlock(): Promise<boolean>;
|
|
25
|
-
}
|
|
26
|
-
//# sourceMappingURL=agents-md-generator.d.ts.map
|
|
@@ -1,102 +0,0 @@
|
|
|
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.AgentsMdGenerator = void 0;
|
|
37
|
-
const file_system_1 = require("../../utils/file-system");
|
|
38
|
-
const path = __importStar(require("path"));
|
|
39
|
-
/**
|
|
40
|
-
* Generator for universal AGENTS.md file
|
|
41
|
-
* Provides workflow instructions for AI tools without slash command support
|
|
42
|
-
*/
|
|
43
|
-
class AgentsMdGenerator {
|
|
44
|
-
/**
|
|
45
|
-
* Generate or update AGENTS.md with Clavix workflows
|
|
46
|
-
*/
|
|
47
|
-
static async generate() {
|
|
48
|
-
const templatePath = path.join(__dirname, '../../templates/agents/agents.md');
|
|
49
|
-
// Check if template exists
|
|
50
|
-
if (!(await file_system_1.FileSystem.exists(templatePath))) {
|
|
51
|
-
throw new Error(`AGENTS.md template not found at ${templatePath}`);
|
|
52
|
-
}
|
|
53
|
-
const template = await file_system_1.FileSystem.readFile(templatePath);
|
|
54
|
-
// Inject into AGENTS.md using managed blocks
|
|
55
|
-
await this.injectManagedBlock(this.TARGET_FILE, template);
|
|
56
|
-
}
|
|
57
|
-
/**
|
|
58
|
-
* Inject or update managed block in AGENTS.md
|
|
59
|
-
*/
|
|
60
|
-
static async injectManagedBlock(filePath, content) {
|
|
61
|
-
let fileContent = '';
|
|
62
|
-
// Read existing file or start with empty content
|
|
63
|
-
if (await file_system_1.FileSystem.exists(filePath)) {
|
|
64
|
-
fileContent = await file_system_1.FileSystem.readFile(filePath);
|
|
65
|
-
}
|
|
66
|
-
const blockRegex = new RegExp(`${this.escapeRegex(this.START_MARKER)}[\\s\\S]*?${this.escapeRegex(this.END_MARKER)}`, 'g');
|
|
67
|
-
const wrappedContent = `${this.START_MARKER}\n${content}\n${this.END_MARKER}`;
|
|
68
|
-
if (blockRegex.test(fileContent)) {
|
|
69
|
-
// Replace existing block
|
|
70
|
-
fileContent = fileContent.replace(blockRegex, wrappedContent);
|
|
71
|
-
}
|
|
72
|
-
else {
|
|
73
|
-
// Append new block
|
|
74
|
-
if (fileContent && !fileContent.endsWith('\n\n')) {
|
|
75
|
-
fileContent += '\n\n';
|
|
76
|
-
}
|
|
77
|
-
fileContent += wrappedContent + '\n';
|
|
78
|
-
}
|
|
79
|
-
await file_system_1.FileSystem.writeFileAtomic(filePath, fileContent);
|
|
80
|
-
}
|
|
81
|
-
/**
|
|
82
|
-
* Escape special regex characters
|
|
83
|
-
*/
|
|
84
|
-
static escapeRegex(str) {
|
|
85
|
-
return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
86
|
-
}
|
|
87
|
-
/**
|
|
88
|
-
* Check if AGENTS.md has Clavix block
|
|
89
|
-
*/
|
|
90
|
-
static async hasClavixBlock() {
|
|
91
|
-
if (!(await file_system_1.FileSystem.exists(this.TARGET_FILE))) {
|
|
92
|
-
return false;
|
|
93
|
-
}
|
|
94
|
-
const content = await file_system_1.FileSystem.readFile(this.TARGET_FILE);
|
|
95
|
-
return content.includes(this.START_MARKER);
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
exports.AgentsMdGenerator = AgentsMdGenerator;
|
|
99
|
-
AgentsMdGenerator.TARGET_FILE = 'AGENTS.md';
|
|
100
|
-
AgentsMdGenerator.START_MARKER = '<!-- CLAVIX:START -->';
|
|
101
|
-
AgentsMdGenerator.END_MARKER = '<!-- CLAVIX:END -->';
|
|
102
|
-
//# sourceMappingURL=agents-md-generator.js.map
|