clavix 2.7.0 → 2.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (165) hide show
  1. package/README.md +22 -8
  2. package/bin/clavix.js +12 -5
  3. package/dist/cli/commands/archive.d.ts +5 -4
  4. package/dist/cli/commands/archive.js +135 -161
  5. package/dist/cli/commands/config.d.ts +4 -4
  6. package/dist/cli/commands/config.js +66 -105
  7. package/dist/cli/commands/deep.d.ts +3 -3
  8. package/dist/cli/commands/deep.js +97 -103
  9. package/dist/cli/commands/execute.d.ts +4 -4
  10. package/dist/cli/commands/execute.js +57 -63
  11. package/dist/cli/commands/fast.d.ts +3 -3
  12. package/dist/cli/commands/fast.js +122 -128
  13. package/dist/cli/commands/implement.d.ts +4 -4
  14. package/dist/cli/commands/implement.js +84 -148
  15. package/dist/cli/commands/init.js +87 -126
  16. package/dist/cli/commands/list.d.ts +5 -5
  17. package/dist/cli/commands/list.js +72 -111
  18. package/dist/cli/commands/plan.d.ts +7 -7
  19. package/dist/cli/commands/plan.js +92 -131
  20. package/dist/cli/commands/prd.d.ts +4 -4
  21. package/dist/cli/commands/prd.js +76 -111
  22. package/dist/cli/commands/prompts/clear.d.ts +6 -6
  23. package/dist/cli/commands/prompts/clear.js +70 -76
  24. package/dist/cli/commands/prompts/list.js +37 -43
  25. package/dist/cli/commands/show.d.ts +4 -4
  26. package/dist/cli/commands/show.js +72 -111
  27. package/dist/cli/commands/start.d.ts +3 -3
  28. package/dist/cli/commands/start.js +63 -101
  29. package/dist/cli/commands/summarize.d.ts +4 -4
  30. package/dist/cli/commands/summarize.js +81 -120
  31. package/dist/cli/commands/task-complete.d.ts +4 -4
  32. package/dist/cli/commands/task-complete.js +86 -123
  33. package/dist/cli/commands/update.d.ts +3 -3
  34. package/dist/cli/commands/update.js +97 -130
  35. package/dist/cli/commands/version.js +13 -48
  36. package/dist/core/adapters/agents-md-generator.js +17 -50
  37. package/dist/core/adapters/amp-adapter.d.ts +1 -1
  38. package/dist/core/adapters/amp-adapter.js +13 -21
  39. package/dist/core/adapters/augment-adapter.d.ts +2 -2
  40. package/dist/core/adapters/augment-adapter.js +16 -56
  41. package/dist/core/adapters/base-adapter.d.ts +1 -1
  42. package/dist/core/adapters/base-adapter.js +11 -47
  43. package/dist/core/adapters/claude-code-adapter.d.ts +2 -2
  44. package/dist/core/adapters/claude-code-adapter.js +19 -60
  45. package/dist/core/adapters/cline-adapter.d.ts +1 -1
  46. package/dist/core/adapters/cline-adapter.js +13 -21
  47. package/dist/core/adapters/codebuddy-adapter.d.ts +2 -2
  48. package/dist/core/adapters/codebuddy-adapter.js +17 -57
  49. package/dist/core/adapters/codex-adapter.d.ts +2 -2
  50. package/dist/core/adapters/codex-adapter.js +16 -56
  51. package/dist/core/adapters/copilot-instructions-generator.js +18 -51
  52. package/dist/core/adapters/crush-adapter.d.ts +2 -2
  53. package/dist/core/adapters/crush-adapter.js +13 -20
  54. package/dist/core/adapters/cursor-adapter.d.ts +1 -1
  55. package/dist/core/adapters/cursor-adapter.js +12 -20
  56. package/dist/core/adapters/droid-adapter.d.ts +2 -2
  57. package/dist/core/adapters/droid-adapter.js +14 -21
  58. package/dist/core/adapters/gemini-adapter.d.ts +2 -2
  59. package/dist/core/adapters/gemini-adapter.js +16 -52
  60. package/dist/core/adapters/kilocode-adapter.d.ts +1 -1
  61. package/dist/core/adapters/kilocode-adapter.js +12 -20
  62. package/dist/core/adapters/octo-md-generator.js +17 -50
  63. package/dist/core/adapters/opencode-adapter.d.ts +2 -2
  64. package/dist/core/adapters/opencode-adapter.js +14 -21
  65. package/dist/core/adapters/qwen-adapter.d.ts +2 -2
  66. package/dist/core/adapters/qwen-adapter.js +16 -52
  67. package/dist/core/adapters/roocode-adapter.d.ts +2 -2
  68. package/dist/core/adapters/roocode-adapter.js +12 -19
  69. package/dist/core/adapters/warp-md-generator.js +17 -50
  70. package/dist/core/adapters/windsurf-adapter.d.ts +1 -1
  71. package/dist/core/adapters/windsurf-adapter.js +12 -20
  72. package/dist/core/agent-manager.d.ts +1 -1
  73. package/dist/core/agent-manager.js +34 -38
  74. package/dist/core/archive-manager.js +10 -46
  75. package/dist/core/config-manager.d.ts +2 -2
  76. package/dist/core/config-manager.js +3 -40
  77. package/dist/core/conversation-analyzer.d.ts +1 -1
  78. package/dist/core/conversation-analyzer.js +1 -5
  79. package/dist/core/doc-injector.js +23 -60
  80. package/dist/core/git-manager.js +11 -48
  81. package/dist/core/prd-generator.js +16 -51
  82. package/dist/core/prompt-manager.js +6 -42
  83. package/dist/core/prompt-optimizer.js +1 -5
  84. package/dist/core/question-engine.js +6 -45
  85. package/dist/core/session-manager.d.ts +1 -1
  86. package/dist/core/session-manager.js +11 -49
  87. package/dist/core/task-manager.d.ts +26 -0
  88. package/dist/core/task-manager.js +243 -101
  89. package/dist/index.d.ts +2 -1
  90. package/dist/index.js +8 -12
  91. package/dist/templates/agents/agents.md +31 -2
  92. package/dist/templates/agents/copilot-instructions.md +1 -1
  93. package/dist/templates/agents/octo.md +20 -1
  94. package/dist/templates/agents/warp.md +1 -1
  95. package/dist/templates/slash-commands/_canonical/implement.md +33 -11
  96. package/dist/types/agent.js +1 -2
  97. package/dist/types/config.js +3 -8
  98. package/dist/types/errors.js +7 -13
  99. package/dist/types/session.js +1 -2
  100. package/dist/utils/agent-error-messages.js +1 -5
  101. package/dist/utils/error-utils.js +5 -12
  102. package/dist/utils/file-system.js +20 -57
  103. package/dist/utils/legacy-command-cleanup.d.ts +1 -1
  104. package/dist/utils/legacy-command-cleanup.js +9 -45
  105. package/dist/utils/template-loader.d.ts +1 -1
  106. package/dist/utils/template-loader.js +9 -41
  107. package/dist/utils/toml-templates.js +1 -4
  108. package/package.json +12 -7
  109. package/dist/core/adapters 2/agents-md-generator.d.ts +0 -26
  110. package/dist/core/adapters 2/agents-md-generator.js +0 -102
  111. package/dist/core/adapters 2/amp-adapter.d.ts +0 -27
  112. package/dist/core/adapters 2/amp-adapter.js +0 -42
  113. package/dist/core/adapters 2/augment-adapter.d.ts +0 -22
  114. package/dist/core/adapters 2/augment-adapter.js +0 -77
  115. package/dist/core/adapters 2/base-adapter.d.ts +0 -45
  116. package/dist/core/adapters 2/base-adapter.js +0 -142
  117. package/dist/core/adapters 2/claude-code-adapter.d.ts +0 -32
  118. package/dist/core/adapters 2/claude-code-adapter.js +0 -116
  119. package/dist/core/adapters 2/cline-adapter.d.ts +0 -34
  120. package/dist/core/adapters 2/cline-adapter.js +0 -52
  121. package/dist/core/adapters 2/codebuddy-adapter.d.ts +0 -24
  122. package/dist/core/adapters 2/codebuddy-adapter.js +0 -82
  123. package/dist/core/adapters 2/codex-adapter.d.ts +0 -24
  124. package/dist/core/adapters 2/codex-adapter.js +0 -79
  125. package/dist/core/adapters 2/copilot-instructions-generator.d.ts +0 -26
  126. package/dist/core/adapters 2/copilot-instructions-generator.js +0 -104
  127. package/dist/core/adapters 2/crush-adapter.d.ts +0 -35
  128. package/dist/core/adapters 2/crush-adapter.js +0 -49
  129. package/dist/core/adapters 2/cursor-adapter.d.ts +0 -25
  130. package/dist/core/adapters 2/cursor-adapter.js +0 -40
  131. package/dist/core/adapters 2/droid-adapter.d.ts +0 -33
  132. package/dist/core/adapters 2/droid-adapter.js +0 -57
  133. package/dist/core/adapters 2/gemini-adapter.d.ts +0 -27
  134. package/dist/core/adapters 2/gemini-adapter.js +0 -90
  135. package/dist/core/adapters 2/kilocode-adapter.d.ts +0 -34
  136. package/dist/core/adapters 2/kilocode-adapter.js +0 -49
  137. package/dist/core/adapters 2/octo-md-generator.d.ts +0 -26
  138. package/dist/core/adapters 2/octo-md-generator.js +0 -102
  139. package/dist/core/adapters 2/opencode-adapter.d.ts +0 -33
  140. package/dist/core/adapters 2/opencode-adapter.js +0 -56
  141. package/dist/core/adapters 2/qwen-adapter.d.ts +0 -27
  142. package/dist/core/adapters 2/qwen-adapter.js +0 -90
  143. package/dist/core/adapters 2/roocode-adapter.d.ts +0 -40
  144. package/dist/core/adapters 2/roocode-adapter.js +0 -68
  145. package/dist/core/adapters 2/warp-md-generator.d.ts +0 -17
  146. package/dist/core/adapters 2/warp-md-generator.js +0 -88
  147. package/dist/core/adapters 2/windsurf-adapter.d.ts +0 -34
  148. package/dist/core/adapters 2/windsurf-adapter.js +0 -49
  149. package/dist/core/agent-manager 2.js +0 -126
  150. package/dist/core/agent-manager.d 2.ts +0 -51
  151. package/dist/core/archive-manager 2.js +0 -338
  152. package/dist/core/archive-manager.d 2.ts +0 -100
  153. package/dist/core/conversation-analyzer.d 2.ts +0 -86
  154. package/dist/core/doc-injector 2.js +0 -236
  155. package/dist/core/doc-injector.d 2.ts +0 -51
  156. package/dist/core/git-manager 2.js +0 -214
  157. package/dist/core/git-manager.d 2.ts +0 -100
  158. package/dist/core/prompt-optimizer 2.js +0 -963
  159. package/dist/core/prompt-optimizer.d 2.ts +0 -268
  160. package/dist/core/question-engine 2.js +0 -395
  161. package/dist/core/question-engine.d 2.ts +0 -167
  162. package/dist/core/session-manager 2.js +0 -403
  163. package/dist/core/session-manager.d 2.ts +0 -139
  164. package/dist/core/task-manager 2.js +0 -689
  165. package/dist/core/task-manager.d 2.ts +0 -155
@@ -1,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
@@ -1,27 +0,0 @@
1
- import { BaseAdapter } from './base-adapter';
2
- /**
3
- * Amp adapter
4
- * Commands stored in .agents/commands/ (simple markdown, no frontmatter)
5
- * Supports executable commands (experimental)
6
- */
7
- export declare class AmpAdapter extends BaseAdapter {
8
- readonly name = "amp";
9
- readonly displayName = "Amp";
10
- readonly directory = ".agents/commands";
11
- readonly fileExtension = ".md";
12
- readonly features: {
13
- supportsSubdirectories: boolean;
14
- supportsFrontmatter: boolean;
15
- supportsExecutableCommands: boolean;
16
- };
17
- /**
18
- * Detect if Amp is available in the project
19
- */
20
- detectProject(): Promise<boolean>;
21
- /**
22
- * Get command path for Amp
23
- */
24
- getCommandPath(): string;
25
- getTargetFilename(name: string): string;
26
- }
27
- //# sourceMappingURL=amp-adapter.d.ts.map
@@ -1,42 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.AmpAdapter = void 0;
4
- const base_adapter_1 = require("./base-adapter");
5
- const file_system_1 = require("../../utils/file-system");
6
- /**
7
- * Amp adapter
8
- * Commands stored in .agents/commands/ (simple markdown, no frontmatter)
9
- * Supports executable commands (experimental)
10
- */
11
- class AmpAdapter extends base_adapter_1.BaseAdapter {
12
- constructor() {
13
- super(...arguments);
14
- this.name = 'amp';
15
- this.displayName = 'Amp';
16
- this.directory = '.agents/commands';
17
- this.fileExtension = '.md';
18
- this.features = {
19
- supportsSubdirectories: false,
20
- supportsFrontmatter: false,
21
- supportsExecutableCommands: true,
22
- };
23
- // Uses default formatCommand from BaseAdapter (no special formatting)
24
- }
25
- /**
26
- * Detect if Amp is available in the project
27
- */
28
- async detectProject() {
29
- return await file_system_1.FileSystem.exists('.agents');
30
- }
31
- /**
32
- * Get command path for Amp
33
- */
34
- getCommandPath() {
35
- return this.directory;
36
- }
37
- getTargetFilename(name) {
38
- return `clavix-${name}${this.fileExtension}`;
39
- }
40
- }
41
- exports.AmpAdapter = AmpAdapter;
42
- //# sourceMappingURL=amp-adapter.js.map
@@ -1,22 +0,0 @@
1
- import { BaseAdapter } from './base-adapter';
2
- import { CommandTemplate } from '../../types/agent';
3
- /**
4
- * Augment CLI adapter
5
- * Commands stored in .augment/commands/clavix with optional subdirectories
6
- */
7
- export declare class AugmentAdapter extends BaseAdapter {
8
- readonly name = "augment";
9
- readonly displayName = "Augment CLI";
10
- readonly directory = ".augment/commands/clavix";
11
- readonly fileExtension = ".md";
12
- readonly features: {
13
- supportsSubdirectories: boolean;
14
- supportsFrontmatter: boolean;
15
- frontmatterFields: string[];
16
- };
17
- detectProject(): Promise<boolean>;
18
- getCommandPath(): string;
19
- protected formatCommand(template: CommandTemplate): string;
20
- private getHomeDir;
21
- }
22
- //# sourceMappingURL=augment-adapter.d.ts.map
@@ -1,77 +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.AugmentAdapter = void 0;
37
- const os = __importStar(require("os"));
38
- const path = __importStar(require("path"));
39
- const base_adapter_1 = require("./base-adapter");
40
- const file_system_1 = require("../../utils/file-system");
41
- /**
42
- * Augment CLI adapter
43
- * Commands stored in .augment/commands/clavix with optional subdirectories
44
- */
45
- class AugmentAdapter extends base_adapter_1.BaseAdapter {
46
- constructor() {
47
- super(...arguments);
48
- this.name = 'augment';
49
- this.displayName = 'Augment CLI';
50
- this.directory = '.augment/commands/clavix';
51
- this.fileExtension = '.md';
52
- this.features = {
53
- supportsSubdirectories: true,
54
- supportsFrontmatter: true,
55
- frontmatterFields: ['description', 'argument-hint', 'model'],
56
- };
57
- }
58
- async detectProject() {
59
- if (await file_system_1.FileSystem.exists('.augment')) {
60
- return true;
61
- }
62
- const homeAugmentDir = path.join(this.getHomeDir(), '.augment');
63
- return file_system_1.FileSystem.exists(homeAugmentDir);
64
- }
65
- getCommandPath() {
66
- return this.directory;
67
- }
68
- formatCommand(template) {
69
- const frontmatter = `---\ndescription: ${template.description}\nargument-hint: [prompt]\n---\n\n`;
70
- return frontmatter + template.content;
71
- }
72
- getHomeDir() {
73
- return process.env.CLAVIX_HOME_OVERRIDE || os.homedir();
74
- }
75
- }
76
- exports.AugmentAdapter = AugmentAdapter;
77
- //# sourceMappingURL=augment-adapter.js.map
@@ -1,45 +0,0 @@
1
- import { AgentAdapter, CommandTemplate, ManagedBlock, ProviderFeatures, ValidationResult } from '../../types/agent';
2
- /**
3
- * Base adapter class with shared logic for all providers
4
- * Ensures consistency and reduces code duplication
5
- */
6
- export declare abstract class BaseAdapter implements AgentAdapter {
7
- abstract readonly name: string;
8
- abstract readonly displayName: string;
9
- abstract readonly directory: string;
10
- abstract readonly fileExtension: string;
11
- readonly features?: ProviderFeatures;
12
- abstract detectProject(): Promise<boolean>;
13
- abstract getCommandPath(): string;
14
- /**
15
- * Determine the target filename for a generated command
16
- * Providers can override to customize filename conventions
17
- */
18
- getTargetFilename(name: string): string;
19
- /**
20
- * Default validation logic - can be overridden
21
- * Checks if directory can be created and is writable
22
- */
23
- validate(): Promise<ValidationResult>;
24
- /**
25
- * Generate commands - default implementation
26
- * Creates command files in the provider's directory
27
- */
28
- generateCommands(templates: CommandTemplate[]): Promise<void>;
29
- /**
30
- * Format command content for this provider
31
- * Default: return content as-is
32
- * Override for provider-specific formatting (frontmatter, placeholders, etc.)
33
- */
34
- protected formatCommand(template: CommandTemplate): string;
35
- /**
36
- * Default documentation injection - no-op
37
- * Override if provider needs doc injection (like Claude Code)
38
- */
39
- injectDocumentation(_blocks: ManagedBlock[]): Promise<void>;
40
- /**
41
- * Escape special regex characters
42
- */
43
- protected escapeRegex(str: string): string;
44
- }
45
- //# sourceMappingURL=base-adapter.d.ts.map
@@ -1,142 +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.BaseAdapter = void 0;
37
- const path = __importStar(require("path"));
38
- const file_system_1 = require("../../utils/file-system");
39
- const errors_1 = require("../../types/errors");
40
- /**
41
- * Base adapter class with shared logic for all providers
42
- * Ensures consistency and reduces code duplication
43
- */
44
- class BaseAdapter {
45
- /**
46
- * Determine the target filename for a generated command
47
- * Providers can override to customize filename conventions
48
- */
49
- getTargetFilename(name) {
50
- return `${name}${this.fileExtension}`;
51
- }
52
- /**
53
- * Default validation logic - can be overridden
54
- * Checks if directory can be created and is writable
55
- */
56
- async validate() {
57
- const errors = [];
58
- const warnings = [];
59
- const commandPath = this.getCommandPath();
60
- // Check if parent directory exists
61
- const parentDir = path.dirname(commandPath);
62
- if (!(await file_system_1.FileSystem.exists(parentDir))) {
63
- // Check if we can create parent by finding first existing ancestor
64
- let ancestorDir = parentDir;
65
- let canCreate = false;
66
- // Walk up the directory tree until we find an existing directory
67
- while (ancestorDir !== '.' && ancestorDir !== '/' && ancestorDir.length > 0) {
68
- ancestorDir = path.dirname(ancestorDir);
69
- if (await file_system_1.FileSystem.exists(ancestorDir)) {
70
- canCreate = true;
71
- break;
72
- }
73
- }
74
- // If we reached '.' or '/', it means we can create the directory
75
- if (ancestorDir === '.' || ancestorDir === '/' || canCreate) {
76
- warnings.push(`Parent directory ${parentDir} will be created`);
77
- }
78
- else {
79
- errors.push(`Parent directory ${parentDir} does not exist and cannot be created`);
80
- }
81
- }
82
- // Try to ensure directory exists
83
- if (errors.length === 0) {
84
- try {
85
- await file_system_1.FileSystem.ensureDir(commandPath);
86
- }
87
- catch (error) {
88
- errors.push(`Cannot create command directory: ${error}`);
89
- }
90
- }
91
- return {
92
- valid: errors.length === 0,
93
- errors: errors.length > 0 ? errors : undefined,
94
- warnings: warnings.length > 0 ? warnings : undefined,
95
- };
96
- }
97
- /**
98
- * Generate commands - default implementation
99
- * Creates command files in the provider's directory
100
- */
101
- async generateCommands(templates) {
102
- const commandPath = this.getCommandPath();
103
- try {
104
- // Ensure directory exists
105
- await file_system_1.FileSystem.ensureDir(commandPath);
106
- // Generate each command file
107
- for (const template of templates) {
108
- const content = this.formatCommand(template);
109
- const filename = this.getTargetFilename(template.name);
110
- const filePath = path.join(commandPath, filename);
111
- await file_system_1.FileSystem.writeFileAtomic(filePath, content);
112
- }
113
- }
114
- catch (error) {
115
- throw new errors_1.IntegrationError(`Failed to generate ${this.displayName} commands: ${error}`, `Ensure ${commandPath} is writable`);
116
- }
117
- }
118
- /**
119
- * Format command content for this provider
120
- * Default: return content as-is
121
- * Override for provider-specific formatting (frontmatter, placeholders, etc.)
122
- */
123
- formatCommand(template) {
124
- return template.content;
125
- }
126
- /**
127
- * Default documentation injection - no-op
128
- * Override if provider needs doc injection (like Claude Code)
129
- */
130
- async injectDocumentation(_blocks) {
131
- // Default: no documentation injection
132
- // Override in subclasses if needed
133
- }
134
- /**
135
- * Escape special regex characters
136
- */
137
- escapeRegex(str) {
138
- return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
139
- }
140
- }
141
- exports.BaseAdapter = BaseAdapter;
142
- //# sourceMappingURL=base-adapter.js.map
@@ -1,32 +0,0 @@
1
- import { BaseAdapter } from './base-adapter';
2
- import { ManagedBlock } from '../../types/agent';
3
- /**
4
- * Claude Code agent adapter
5
- */
6
- export declare class ClaudeCodeAdapter extends BaseAdapter {
7
- readonly name = "claude-code";
8
- readonly displayName = "Claude Code";
9
- readonly directory = ".claude/commands/clavix";
10
- readonly fileExtension = ".md";
11
- readonly features: {
12
- supportsSubdirectories: boolean;
13
- supportsFrontmatter: boolean;
14
- };
15
- /**
16
- * Detect if Claude Code is available in the project
17
- */
18
- detectProject(): Promise<boolean>;
19
- /**
20
- * Get command path for Claude Code
21
- */
22
- getCommandPath(): string;
23
- /**
24
- * Inject documentation blocks into CLAUDE.md
25
- */
26
- injectDocumentation(blocks: ManagedBlock[]): Promise<void>;
27
- /**
28
- * Inject or update a managed block in a file
29
- */
30
- private injectManagedBlock;
31
- }
32
- //# sourceMappingURL=claude-code-adapter.d.ts.map
@@ -1,116 +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.ClaudeCodeAdapter = void 0;
37
- const path = __importStar(require("path"));
38
- const base_adapter_1 = require("./base-adapter");
39
- const file_system_1 = require("../../utils/file-system");
40
- const errors_1 = require("../../types/errors");
41
- /**
42
- * Claude Code agent adapter
43
- */
44
- class ClaudeCodeAdapter extends base_adapter_1.BaseAdapter {
45
- constructor() {
46
- super(...arguments);
47
- this.name = 'claude-code';
48
- this.displayName = 'Claude Code';
49
- this.directory = '.claude/commands/clavix';
50
- this.fileExtension = '.md';
51
- this.features = {
52
- supportsSubdirectories: true,
53
- supportsFrontmatter: false,
54
- };
55
- // escapeRegex is inherited from BaseAdapter
56
- }
57
- /**
58
- * Detect if Claude Code is available in the project
59
- */
60
- async detectProject() {
61
- // Check if .claude directory exists
62
- return await file_system_1.FileSystem.exists('.claude');
63
- }
64
- /**
65
- * Get command path for Claude Code
66
- */
67
- getCommandPath() {
68
- return this.directory;
69
- }
70
- // generateCommands is inherited from BaseAdapter
71
- /**
72
- * Inject documentation blocks into CLAUDE.md
73
- */
74
- async injectDocumentation(blocks) {
75
- try {
76
- for (const block of blocks) {
77
- await this.injectManagedBlock(block.targetFile, block.content, block.startMarker, block.endMarker);
78
- }
79
- }
80
- catch (error) {
81
- throw new errors_1.IntegrationError(`Failed to inject documentation: ${error}`, 'Ensure target files are writable');
82
- }
83
- }
84
- /**
85
- * Inject or update a managed block in a file
86
- */
87
- async injectManagedBlock(filePath, content, startMarker, endMarker) {
88
- const fullPath = path.resolve(filePath);
89
- let fileContent = '';
90
- // Read existing file or create new
91
- if (await file_system_1.FileSystem.exists(fullPath)) {
92
- fileContent = await file_system_1.FileSystem.readFile(fullPath);
93
- }
94
- else {
95
- // Create parent directory if needed
96
- const dir = path.dirname(fullPath);
97
- await file_system_1.FileSystem.ensureDir(dir);
98
- }
99
- const blockRegex = new RegExp(`${this.escapeRegex(startMarker)}[\\s\\S]*?${this.escapeRegex(endMarker)}`, 'g');
100
- const wrappedContent = `${startMarker}\n${content}\n${endMarker}`;
101
- if (blockRegex.test(fileContent)) {
102
- // Replace existing block
103
- fileContent = fileContent.replace(blockRegex, wrappedContent);
104
- }
105
- else {
106
- // Append new block
107
- if (fileContent && !fileContent.endsWith('\n\n')) {
108
- fileContent += '\n\n';
109
- }
110
- fileContent += wrappedContent + '\n';
111
- }
112
- await file_system_1.FileSystem.writeFileAtomic(fullPath, fileContent);
113
- }
114
- }
115
- exports.ClaudeCodeAdapter = ClaudeCodeAdapter;
116
- //# sourceMappingURL=claude-code-adapter.js.map
@@ -1,34 +0,0 @@
1
- import { BaseAdapter } from './base-adapter';
2
- /**
3
- * Cline adapter
4
- * Workflows stored in .cline/workflows/ (flat structure, no subdirectories)
5
- * Slash command format: /<name.md> (includes .md extension with leading slash)
6
- *
7
- * Features:
8
- * - Lives alongside Cline Rules
9
- * - Clear step-by-step instructions in markdown
10
- * - Supports built-in tools, CLI utilities, and MCP integrations
11
- *
12
- * Reference: https://docs.cline.bot/features/slash-commands/workflows
13
- */
14
- export declare class ClineAdapter extends BaseAdapter {
15
- readonly name = "cline";
16
- readonly displayName = "Cline";
17
- readonly directory = ".clinerules/workflows";
18
- readonly fileExtension = ".md";
19
- readonly features: {
20
- supportsSubdirectories: boolean;
21
- supportsFrontmatter: boolean;
22
- };
23
- /**
24
- * Detect if Cline is available in the project
25
- * Checks for .cline directory
26
- */
27
- detectProject(): Promise<boolean>;
28
- /**
29
- * Get command path for Cline
30
- */
31
- getCommandPath(): string;
32
- getTargetFilename(name: string): string;
33
- }
34
- //# sourceMappingURL=cline-adapter.d.ts.map