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.
Files changed (165) hide show
  1. package/README.md +18 -4
  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 +9 -4
  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,12 +1,7 @@
1
- "use strict";
2
1
  /**
3
2
  * Configuration types for Clavix
4
3
  */
5
- Object.defineProperty(exports, "__esModule", { value: true });
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' &&
@@ -1,10 +1,9 @@
1
- "use strict";
2
1
  /**
3
2
  * Custom error types for Clavix
4
3
  */
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.DataError = exports.IntegrationError = exports.ValidationError = exports.PermissionError = exports.ClavixError = void 0;
7
- class ClavixError extends Error {
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
- exports.ClavixError = ClavixError;
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
- exports.PermissionError = PermissionError;
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
- exports.ValidationError = ValidationError;
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
- exports.IntegrationError = IntegrationError;
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
@@ -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
- Object.defineProperty(exports, "__esModule", { value: true });
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
- Object.defineProperty(exports, "__esModule", { value: true });
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
- "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.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 errors_1.DataError('Failed to write file and restore backup', `Check file permissions for ${fullPath}`);
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 Promise.resolve().then(() => __importStar(require('./error-utils.js')));
37
+ const { isNodeError, toError } = await import('./error-utils.js');
74
38
  if (isNodeError(error) && (error.code === 'EACCES' || error.code === 'EPERM')) {
75
- throw new errors_1.PermissionError(`Permission denied: Cannot write to ${filePath}`, 'Try running with appropriate permissions or check file ownership');
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 errors_1.DataError(`File not found: ${filePath}`);
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 Promise.resolve().then(() => __importStar(require('./error-utils.js')));
56
+ const { isNodeError, toError } = await import('./error-utils.js');
93
57
  if (isNodeError(error) && (error.code === 'EACCES' || error.code === 'EPERM')) {
94
- throw new errors_1.PermissionError(`Permission denied: Cannot read ${filePath}`, 'Check file permissions');
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 Promise.resolve().then(() => __importStar(require('./error-utils.js')));
72
+ const { isNodeError, toError } = await import('./error-utils.js');
109
73
  if (isNodeError(error) && (error.code === 'EACCES' || error.code === 'EPERM')) {
110
- throw new errors_1.PermissionError(`Permission denied: Cannot create directory ${dirPath}`, 'Check parent directory permissions');
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 errors_1.PermissionError(`Failed to create backup of ${filePath}`, 'Check file permissions');
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 errors_1.DataError(`Failed to restore backup for ${filePath}`, 'Manual recovery may be required');
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 Promise.resolve().then(() => __importStar(require('./error-utils.js')));
158
+ const { isNodeError, toError } = await import('./error-utils.js');
195
159
  if (isNodeError(error) && (error.code === 'EACCES' || error.code === 'EPERM')) {
196
- throw new errors_1.PermissionError(`Permission denied: Cannot read directory ${dirPath}`, 'Check directory permissions');
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 Promise.resolve().then(() => __importStar(require('./error-utils.js')));
175
+ const { isNodeError, toError } = await import('./error-utils.js');
212
176
  if (isNodeError(error) && (error.code === 'EACCES' || error.code === 'EPERM')) {
213
- throw new errors_1.PermissionError(`Permission denied: Cannot copy from ${src} to ${dest}`, 'Check file permissions');
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 Promise.resolve().then(() => __importStar(require('./error-utils.js')));
193
+ const { isNodeError, toError } = await import('./error-utils.js');
230
194
  if (isNodeError(error) && (error.code === 'EACCES' || error.code === 'EPERM')) {
231
- throw new errors_1.PermissionError(`Permission denied: Cannot remove ${filePath}`, 'Check file permissions');
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,3 +1,3 @@
1
- import { AgentAdapter } from '../types/agent';
1
+ import { AgentAdapter } from '../types/agent.js';
2
2
  export declare function collectLegacyCommandFiles(adapter: AgentAdapter, commandNames: string[]): Promise<string[]>;
3
3
  //# sourceMappingURL=legacy-command-cleanup.d.ts.map
@@ -1,42 +1,6 @@
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.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 file_system_1.FileSystem.exists(resolvedCandidate)) {
18
+ if (resolvedCandidate !== newFilePath && await FileSystem.exists(resolvedCandidate)) {
55
19
  legacyPaths.add(resolvedCandidate);
56
20
  }
57
21
  }
58
- if (defaultFilePath !== newFilePath && await file_system_1.FileSystem.exists(defaultFilePath)) {
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 file_system_1.FileSystem.exists(defaultFilePath)) {
29
+ if (!namespaced && defaultFilePath !== newFilePath && await FileSystem.exists(defaultFilePath)) {
66
30
  legacyPaths.add(defaultFilePath);
67
31
  }
68
32
  }
69
- else if (defaultFilePath !== newFilePath && await file_system_1.FileSystem.exists(defaultFilePath)) {
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 file_system_1.FileSystem.listFiles(commandsDir, /^clavix:.*\.md$/);
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 file_system_1.FileSystem.listFiles(clavixDir, /^clavix-.*\.md$/);
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
- "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.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 file_system_1.FileSystem.listFiles(templatesDir);
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 file_system_1.FileSystem.readFile(templatePath);
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.7.1",
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