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
|
@@ -1,58 +1,29 @@
|
|
|
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.CopilotInstructionsGenerator = void 0;
|
|
37
|
-
const file_system_1 = require("../../utils/file-system");
|
|
38
|
-
const path = __importStar(require("path"));
|
|
1
|
+
import { FileSystem } from '../../utils/file-system.js';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import { fileURLToPath } from 'url';
|
|
4
|
+
import { dirname } from 'path';
|
|
5
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
6
|
+
const __dirname = dirname(__filename);
|
|
39
7
|
/**
|
|
40
8
|
* Generator for GitHub Copilot instructions file
|
|
41
9
|
* Provides workflow instructions via .github/copilot-instructions.md
|
|
42
10
|
*/
|
|
43
|
-
class CopilotInstructionsGenerator {
|
|
11
|
+
export class CopilotInstructionsGenerator {
|
|
12
|
+
static TARGET_FILE = '.github/copilot-instructions.md';
|
|
13
|
+
static START_MARKER = '<!-- CLAVIX:START -->';
|
|
14
|
+
static END_MARKER = '<!-- CLAVIX:END -->';
|
|
44
15
|
/**
|
|
45
16
|
* Generate or update .github/copilot-instructions.md with Clavix workflows
|
|
46
17
|
*/
|
|
47
18
|
static async generate() {
|
|
48
19
|
const templatePath = path.join(__dirname, '../../templates/agents/copilot-instructions.md');
|
|
49
20
|
// Check if template exists
|
|
50
|
-
if (!(await
|
|
21
|
+
if (!(await FileSystem.exists(templatePath))) {
|
|
51
22
|
throw new Error(`Copilot instructions template not found at ${templatePath}`);
|
|
52
23
|
}
|
|
53
|
-
const template = await
|
|
24
|
+
const template = await FileSystem.readFile(templatePath);
|
|
54
25
|
// Ensure .github directory exists
|
|
55
|
-
await
|
|
26
|
+
await FileSystem.ensureDir('.github');
|
|
56
27
|
// Inject into .github/copilot-instructions.md using managed blocks
|
|
57
28
|
await this.injectManagedBlock(this.TARGET_FILE, template);
|
|
58
29
|
}
|
|
@@ -62,8 +33,8 @@ class CopilotInstructionsGenerator {
|
|
|
62
33
|
static async injectManagedBlock(filePath, content) {
|
|
63
34
|
let fileContent = '';
|
|
64
35
|
// Read existing file or start with empty content
|
|
65
|
-
if (await
|
|
66
|
-
fileContent = await
|
|
36
|
+
if (await FileSystem.exists(filePath)) {
|
|
37
|
+
fileContent = await FileSystem.readFile(filePath);
|
|
67
38
|
}
|
|
68
39
|
const blockRegex = new RegExp(`${this.escapeRegex(this.START_MARKER)}[\\s\\S]*?${this.escapeRegex(this.END_MARKER)}`, 'g');
|
|
69
40
|
const wrappedContent = `${this.START_MARKER}\n${content}\n${this.END_MARKER}`;
|
|
@@ -78,7 +49,7 @@ class CopilotInstructionsGenerator {
|
|
|
78
49
|
}
|
|
79
50
|
fileContent += wrappedContent + '\n';
|
|
80
51
|
}
|
|
81
|
-
await
|
|
52
|
+
await FileSystem.writeFileAtomic(filePath, fileContent);
|
|
82
53
|
}
|
|
83
54
|
/**
|
|
84
55
|
* Escape special regex characters
|
|
@@ -90,15 +61,11 @@ class CopilotInstructionsGenerator {
|
|
|
90
61
|
* Check if .github/copilot-instructions.md has Clavix block
|
|
91
62
|
*/
|
|
92
63
|
static async hasClavixBlock() {
|
|
93
|
-
if (!(await
|
|
64
|
+
if (!(await FileSystem.exists(this.TARGET_FILE))) {
|
|
94
65
|
return false;
|
|
95
66
|
}
|
|
96
|
-
const content = await
|
|
67
|
+
const content = await FileSystem.readFile(this.TARGET_FILE);
|
|
97
68
|
return content.includes(this.START_MARKER);
|
|
98
69
|
}
|
|
99
70
|
}
|
|
100
|
-
exports.CopilotInstructionsGenerator = CopilotInstructionsGenerator;
|
|
101
|
-
CopilotInstructionsGenerator.TARGET_FILE = '.github/copilot-instructions.md';
|
|
102
|
-
CopilotInstructionsGenerator.START_MARKER = '<!-- CLAVIX:START -->';
|
|
103
|
-
CopilotInstructionsGenerator.END_MARKER = '<!-- CLAVIX:END -->';
|
|
104
71
|
//# sourceMappingURL=copilot-instructions-generator.js.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { BaseAdapter } from './base-adapter';
|
|
2
|
-
import { CommandTemplate } from '../../types/agent';
|
|
1
|
+
import { BaseAdapter } from './base-adapter.js';
|
|
2
|
+
import { CommandTemplate } from '../../types/agent.js';
|
|
3
3
|
/**
|
|
4
4
|
* Crush CLI adapter
|
|
5
5
|
* Commands stored in .crush/commands/clavix/ (supports subdirectories)
|
|
@@ -1,8 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
exports.CrushAdapter = void 0;
|
|
4
|
-
const base_adapter_1 = require("./base-adapter");
|
|
5
|
-
const file_system_1 = require("../../utils/file-system");
|
|
1
|
+
import { BaseAdapter } from './base-adapter.js';
|
|
2
|
+
import { FileSystem } from '../../utils/file-system.js';
|
|
6
3
|
/**
|
|
7
4
|
* Crush CLI adapter
|
|
8
5
|
* Commands stored in .crush/commands/clavix/ (supports subdirectories)
|
|
@@ -10,25 +7,22 @@ const file_system_1 = require("../../utils/file-system");
|
|
|
10
7
|
*
|
|
11
8
|
* Reference: https://github.com/charmbracelet/crush/blob/main/COMMANDS.md
|
|
12
9
|
*/
|
|
13
|
-
class CrushAdapter extends
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
argumentPlaceholder: '$PROMPT',
|
|
24
|
-
};
|
|
25
|
-
}
|
|
10
|
+
export class CrushAdapter extends BaseAdapter {
|
|
11
|
+
name = 'crush';
|
|
12
|
+
displayName = 'Crush CLI';
|
|
13
|
+
directory = '.crush/commands/clavix';
|
|
14
|
+
fileExtension = '.md';
|
|
15
|
+
features = {
|
|
16
|
+
supportsSubdirectories: true,
|
|
17
|
+
supportsFrontmatter: false,
|
|
18
|
+
argumentPlaceholder: '$PROMPT',
|
|
19
|
+
};
|
|
26
20
|
/**
|
|
27
21
|
* Detect if Crush is available in the project
|
|
28
22
|
* Checks for .crush directory (project-level commands)
|
|
29
23
|
*/
|
|
30
24
|
async detectProject() {
|
|
31
|
-
return await
|
|
25
|
+
return await FileSystem.exists('.crush');
|
|
32
26
|
}
|
|
33
27
|
/**
|
|
34
28
|
* Get command path for Crush
|
|
@@ -45,5 +39,4 @@ class CrushAdapter extends base_adapter_1.BaseAdapter {
|
|
|
45
39
|
return template.content.replace(/\{\{ARGS\}\}/g, '$PROMPT');
|
|
46
40
|
}
|
|
47
41
|
}
|
|
48
|
-
exports.CrushAdapter = CrushAdapter;
|
|
49
42
|
//# sourceMappingURL=crush-adapter.js.map
|
|
@@ -1,30 +1,23 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
exports.CursorAdapter = void 0;
|
|
4
|
-
const base_adapter_1 = require("./base-adapter");
|
|
5
|
-
const file_system_1 = require("../../utils/file-system");
|
|
1
|
+
import { BaseAdapter } from './base-adapter.js';
|
|
2
|
+
import { FileSystem } from '../../utils/file-system.js';
|
|
6
3
|
/**
|
|
7
4
|
* Cursor IDE adapter
|
|
8
5
|
* Commands are stored in .cursor/commands/ (flat structure, no subdirectories)
|
|
9
6
|
*/
|
|
10
|
-
class CursorAdapter extends
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
supportsFrontmatter: false,
|
|
20
|
-
};
|
|
21
|
-
// Uses default formatCommand and generateCommands from BaseAdapter
|
|
22
|
-
}
|
|
7
|
+
export class CursorAdapter extends BaseAdapter {
|
|
8
|
+
name = 'cursor';
|
|
9
|
+
displayName = 'Cursor';
|
|
10
|
+
directory = '.cursor/commands';
|
|
11
|
+
fileExtension = '.md';
|
|
12
|
+
features = {
|
|
13
|
+
supportsSubdirectories: false,
|
|
14
|
+
supportsFrontmatter: false,
|
|
15
|
+
};
|
|
23
16
|
/**
|
|
24
17
|
* Detect if Cursor is available in the project
|
|
25
18
|
*/
|
|
26
19
|
async detectProject() {
|
|
27
|
-
return await
|
|
20
|
+
return await FileSystem.exists('.cursor');
|
|
28
21
|
}
|
|
29
22
|
/**
|
|
30
23
|
* Get command path for Cursor
|
|
@@ -36,5 +29,4 @@ class CursorAdapter extends base_adapter_1.BaseAdapter {
|
|
|
36
29
|
return `clavix-${name}${this.fileExtension}`;
|
|
37
30
|
}
|
|
38
31
|
}
|
|
39
|
-
exports.CursorAdapter = CursorAdapter;
|
|
40
32
|
//# sourceMappingURL=cursor-adapter.js.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { BaseAdapter } from './base-adapter';
|
|
2
|
-
import { CommandTemplate } from '../../types/agent';
|
|
1
|
+
import { BaseAdapter } from './base-adapter.js';
|
|
2
|
+
import { CommandTemplate } from '../../types/agent.js';
|
|
3
3
|
/**
|
|
4
4
|
* Droid CLI adapter (Factory.ai)
|
|
5
5
|
* Commands stored in .factory/commands/ with YAML frontmatter
|
|
@@ -1,32 +1,26 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
exports.DroidAdapter = void 0;
|
|
4
|
-
const base_adapter_1 = require("./base-adapter");
|
|
5
|
-
const file_system_1 = require("../../utils/file-system");
|
|
1
|
+
import { BaseAdapter } from './base-adapter.js';
|
|
2
|
+
import { FileSystem } from '../../utils/file-system.js';
|
|
6
3
|
/**
|
|
7
4
|
* Droid CLI adapter (Factory.ai)
|
|
8
5
|
* Commands stored in .factory/commands/ with YAML frontmatter
|
|
9
6
|
* Uses $ARGUMENTS placeholder for command arguments
|
|
10
7
|
*/
|
|
11
|
-
class DroidAdapter extends
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
argumentPlaceholder: '$ARGUMENTS',
|
|
23
|
-
};
|
|
24
|
-
}
|
|
8
|
+
export class DroidAdapter extends BaseAdapter {
|
|
9
|
+
name = 'droid';
|
|
10
|
+
displayName = 'Droid CLI';
|
|
11
|
+
directory = '.factory/commands';
|
|
12
|
+
fileExtension = '.md';
|
|
13
|
+
features = {
|
|
14
|
+
supportsSubdirectories: false,
|
|
15
|
+
supportsFrontmatter: true,
|
|
16
|
+
frontmatterFields: ['description', 'argument-hint'],
|
|
17
|
+
argumentPlaceholder: '$ARGUMENTS',
|
|
18
|
+
};
|
|
25
19
|
/**
|
|
26
20
|
* Detect if Droid CLI is available in the project
|
|
27
21
|
*/
|
|
28
22
|
async detectProject() {
|
|
29
|
-
return await
|
|
23
|
+
return await FileSystem.exists('.factory');
|
|
30
24
|
}
|
|
31
25
|
/**
|
|
32
26
|
* Get command path for Droid CLI
|
|
@@ -53,5 +47,4 @@ argument-hint: [prompt]
|
|
|
53
47
|
return frontmatter + content;
|
|
54
48
|
}
|
|
55
49
|
}
|
|
56
|
-
exports.DroidAdapter = DroidAdapter;
|
|
57
50
|
//# sourceMappingURL=droid-adapter.js.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { BaseAdapter } from './base-adapter';
|
|
2
|
-
import { CommandTemplate } from '../../types/agent';
|
|
1
|
+
import { BaseAdapter } from './base-adapter.js';
|
|
2
|
+
import { CommandTemplate } from '../../types/agent.js';
|
|
3
3
|
/**
|
|
4
4
|
* Gemini CLI adapter
|
|
5
5
|
* Commands stored as TOML files under .gemini/commands/clavix by default
|
|
@@ -1,70 +1,35 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
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.GeminiAdapter = 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");
|
|
1
|
+
import * as os from 'os';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import { BaseAdapter } from './base-adapter.js';
|
|
4
|
+
import { FileSystem } from '../../utils/file-system.js';
|
|
41
5
|
/**
|
|
42
6
|
* Gemini CLI adapter
|
|
43
7
|
* Commands stored as TOML files under .gemini/commands/clavix by default
|
|
44
8
|
*/
|
|
45
|
-
class GeminiAdapter extends
|
|
9
|
+
export class GeminiAdapter extends BaseAdapter {
|
|
10
|
+
options;
|
|
11
|
+
name = 'gemini';
|
|
12
|
+
displayName = 'Gemini CLI';
|
|
13
|
+
fileExtension = '.toml';
|
|
14
|
+
features = {
|
|
15
|
+
supportsSubdirectories: true,
|
|
16
|
+
supportsFrontmatter: false,
|
|
17
|
+
argumentPlaceholder: '{{args}}',
|
|
18
|
+
};
|
|
46
19
|
constructor(options = {}) {
|
|
47
20
|
super();
|
|
48
21
|
this.options = options;
|
|
49
|
-
this.name = 'gemini';
|
|
50
|
-
this.displayName = 'Gemini CLI';
|
|
51
|
-
this.fileExtension = '.toml';
|
|
52
|
-
this.features = {
|
|
53
|
-
supportsSubdirectories: true,
|
|
54
|
-
supportsFrontmatter: false,
|
|
55
|
-
argumentPlaceholder: '{{args}}',
|
|
56
|
-
};
|
|
57
22
|
}
|
|
58
23
|
get directory() {
|
|
59
24
|
const useNamespace = this.options.useNamespace ?? true;
|
|
60
25
|
return useNamespace ? path.join('.gemini', 'commands', 'clavix') : path.join('.gemini', 'commands');
|
|
61
26
|
}
|
|
62
27
|
async detectProject() {
|
|
63
|
-
if (await
|
|
28
|
+
if (await FileSystem.exists('.gemini')) {
|
|
64
29
|
return true;
|
|
65
30
|
}
|
|
66
31
|
const homePath = path.join(this.getHomeDir(), '.gemini');
|
|
67
|
-
return await
|
|
32
|
+
return await FileSystem.exists(homePath);
|
|
68
33
|
}
|
|
69
34
|
getCommandPath() {
|
|
70
35
|
return this.directory;
|
|
@@ -86,5 +51,4 @@ class GeminiAdapter extends base_adapter_1.BaseAdapter {
|
|
|
86
51
|
return process.env.CLAVIX_HOME_OVERRIDE || os.homedir();
|
|
87
52
|
}
|
|
88
53
|
}
|
|
89
|
-
exports.GeminiAdapter = GeminiAdapter;
|
|
90
54
|
//# sourceMappingURL=gemini-adapter.js.map
|
|
@@ -1,8 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
exports.KilocodeAdapter = void 0;
|
|
4
|
-
const base_adapter_1 = require("./base-adapter");
|
|
5
|
-
const file_system_1 = require("../../utils/file-system");
|
|
1
|
+
import { BaseAdapter } from './base-adapter.js';
|
|
2
|
+
import { FileSystem } from '../../utils/file-system.js';
|
|
6
3
|
/**
|
|
7
4
|
* Kilocode adapter
|
|
8
5
|
* Workflows stored in .kilocode/workflows/ (flat structure, no subdirectories)
|
|
@@ -15,25 +12,21 @@ const file_system_1 = require("../../utils/file-system");
|
|
|
15
12
|
*
|
|
16
13
|
* Reference: https://kilocode.ai/docs/features/slash-commands/workflows
|
|
17
14
|
*/
|
|
18
|
-
class KilocodeAdapter extends
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
supportsFrontmatter: false,
|
|
28
|
-
};
|
|
29
|
-
// Uses default formatCommand and generateCommands from BaseAdapter
|
|
30
|
-
}
|
|
15
|
+
export class KilocodeAdapter extends BaseAdapter {
|
|
16
|
+
name = 'kilocode';
|
|
17
|
+
displayName = 'Kilocode';
|
|
18
|
+
directory = '.kilocode/workflows';
|
|
19
|
+
fileExtension = '.md';
|
|
20
|
+
features = {
|
|
21
|
+
supportsSubdirectories: false,
|
|
22
|
+
supportsFrontmatter: false,
|
|
23
|
+
};
|
|
31
24
|
/**
|
|
32
25
|
* Detect if Kilocode is available in the project
|
|
33
26
|
* Checks for .kilocode directory
|
|
34
27
|
*/
|
|
35
28
|
async detectProject() {
|
|
36
|
-
return await
|
|
29
|
+
return await FileSystem.exists('.kilocode');
|
|
37
30
|
}
|
|
38
31
|
/**
|
|
39
32
|
* Get command path for Kilocode
|
|
@@ -45,5 +38,4 @@ class KilocodeAdapter extends base_adapter_1.BaseAdapter {
|
|
|
45
38
|
return `clavix-${name}${this.fileExtension}`;
|
|
46
39
|
}
|
|
47
40
|
}
|
|
48
|
-
exports.KilocodeAdapter = KilocodeAdapter;
|
|
49
41
|
//# sourceMappingURL=kilocode-adapter.js.map
|
|
@@ -1,56 +1,27 @@
|
|
|
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.OctoMdGenerator = void 0;
|
|
37
|
-
const file_system_1 = require("../../utils/file-system");
|
|
38
|
-
const path = __importStar(require("path"));
|
|
1
|
+
import { FileSystem } from '../../utils/file-system.js';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import { fileURLToPath } from 'url';
|
|
4
|
+
import { dirname } from 'path';
|
|
5
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
6
|
+
const __dirname = dirname(__filename);
|
|
39
7
|
/**
|
|
40
8
|
* Generator for Octofriend OCTO.md file
|
|
41
9
|
* Provides workflow instructions optimized for Octofriend capabilities
|
|
42
10
|
*/
|
|
43
|
-
class OctoMdGenerator {
|
|
11
|
+
export class OctoMdGenerator {
|
|
12
|
+
static TARGET_FILE = 'OCTO.md';
|
|
13
|
+
static START_MARKER = '<!-- CLAVIX:START -->';
|
|
14
|
+
static END_MARKER = '<!-- CLAVIX:END -->';
|
|
44
15
|
/**
|
|
45
16
|
* Generate or update OCTO.md with Clavix workflows
|
|
46
17
|
*/
|
|
47
18
|
static async generate() {
|
|
48
19
|
const templatePath = path.join(__dirname, '../../templates/agents/octo.md');
|
|
49
20
|
// Check if template exists
|
|
50
|
-
if (!(await
|
|
21
|
+
if (!(await FileSystem.exists(templatePath))) {
|
|
51
22
|
throw new Error(`OCTO.md template not found at ${templatePath}`);
|
|
52
23
|
}
|
|
53
|
-
const template = await
|
|
24
|
+
const template = await FileSystem.readFile(templatePath);
|
|
54
25
|
// Inject into OCTO.md using managed blocks
|
|
55
26
|
await this.injectManagedBlock(this.TARGET_FILE, template);
|
|
56
27
|
}
|
|
@@ -60,8 +31,8 @@ class OctoMdGenerator {
|
|
|
60
31
|
static async injectManagedBlock(filePath, content) {
|
|
61
32
|
let fileContent = '';
|
|
62
33
|
// Read existing file or start with empty content
|
|
63
|
-
if (await
|
|
64
|
-
fileContent = await
|
|
34
|
+
if (await FileSystem.exists(filePath)) {
|
|
35
|
+
fileContent = await FileSystem.readFile(filePath);
|
|
65
36
|
}
|
|
66
37
|
const blockRegex = new RegExp(`${this.escapeRegex(this.START_MARKER)}[\\s\\S]*?${this.escapeRegex(this.END_MARKER)}`, 'g');
|
|
67
38
|
const wrappedContent = `${this.START_MARKER}\n${content}\n${this.END_MARKER}`;
|
|
@@ -76,7 +47,7 @@ class OctoMdGenerator {
|
|
|
76
47
|
}
|
|
77
48
|
fileContent += wrappedContent + '\n';
|
|
78
49
|
}
|
|
79
|
-
await
|
|
50
|
+
await FileSystem.writeFileAtomic(filePath, fileContent);
|
|
80
51
|
}
|
|
81
52
|
/**
|
|
82
53
|
* Escape special regex characters
|
|
@@ -88,15 +59,11 @@ class OctoMdGenerator {
|
|
|
88
59
|
* Check if OCTO.md has Clavix block
|
|
89
60
|
*/
|
|
90
61
|
static async hasClavixBlock() {
|
|
91
|
-
if (!(await
|
|
62
|
+
if (!(await FileSystem.exists(this.TARGET_FILE))) {
|
|
92
63
|
return false;
|
|
93
64
|
}
|
|
94
|
-
const content = await
|
|
65
|
+
const content = await FileSystem.readFile(this.TARGET_FILE);
|
|
95
66
|
return content.includes(this.START_MARKER);
|
|
96
67
|
}
|
|
97
68
|
}
|
|
98
|
-
exports.OctoMdGenerator = OctoMdGenerator;
|
|
99
|
-
OctoMdGenerator.TARGET_FILE = 'OCTO.md';
|
|
100
|
-
OctoMdGenerator.START_MARKER = '<!-- CLAVIX:START -->';
|
|
101
|
-
OctoMdGenerator.END_MARKER = '<!-- CLAVIX:END -->';
|
|
102
69
|
//# sourceMappingURL=octo-md-generator.js.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { BaseAdapter } from './base-adapter';
|
|
2
|
-
import { CommandTemplate } from '../../types/agent';
|
|
1
|
+
import { BaseAdapter } from './base-adapter.js';
|
|
2
|
+
import { CommandTemplate } from '../../types/agent.js';
|
|
3
3
|
/**
|
|
4
4
|
* OpenCode adapter
|
|
5
5
|
* Commands stored in .opencode/command/ with frontmatter
|
|
@@ -1,32 +1,26 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
exports.OpenCodeAdapter = void 0;
|
|
4
|
-
const base_adapter_1 = require("./base-adapter");
|
|
5
|
-
const file_system_1 = require("../../utils/file-system");
|
|
1
|
+
import { BaseAdapter } from './base-adapter.js';
|
|
2
|
+
import { FileSystem } from '../../utils/file-system.js';
|
|
6
3
|
/**
|
|
7
4
|
* OpenCode adapter
|
|
8
5
|
* Commands stored in .opencode/command/ with frontmatter
|
|
9
6
|
* Uses $ARGUMENTS, $1, $2 placeholders
|
|
10
7
|
*/
|
|
11
|
-
class OpenCodeAdapter extends
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
argumentPlaceholder: '$ARGUMENTS',
|
|
23
|
-
};
|
|
24
|
-
}
|
|
8
|
+
export class OpenCodeAdapter extends BaseAdapter {
|
|
9
|
+
name = 'opencode';
|
|
10
|
+
displayName = 'OpenCode';
|
|
11
|
+
directory = '.opencode/command';
|
|
12
|
+
fileExtension = '.md';
|
|
13
|
+
features = {
|
|
14
|
+
supportsSubdirectories: false,
|
|
15
|
+
supportsFrontmatter: true,
|
|
16
|
+
frontmatterFields: ['description', 'agent', 'model'],
|
|
17
|
+
argumentPlaceholder: '$ARGUMENTS',
|
|
18
|
+
};
|
|
25
19
|
/**
|
|
26
20
|
* Detect if OpenCode is available in the project
|
|
27
21
|
*/
|
|
28
22
|
async detectProject() {
|
|
29
|
-
return await
|
|
23
|
+
return await FileSystem.exists('.opencode');
|
|
30
24
|
}
|
|
31
25
|
/**
|
|
32
26
|
* Get command path for OpenCode
|
|
@@ -52,5 +46,4 @@ description: ${template.description}
|
|
|
52
46
|
return frontmatter + content;
|
|
53
47
|
}
|
|
54
48
|
}
|
|
55
|
-
exports.OpenCodeAdapter = OpenCodeAdapter;
|
|
56
49
|
//# sourceMappingURL=opencode-adapter.js.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { BaseAdapter } from './base-adapter';
|
|
2
|
-
import { CommandTemplate } from '../../types/agent';
|
|
1
|
+
import { BaseAdapter } from './base-adapter.js';
|
|
2
|
+
import { CommandTemplate } from '../../types/agent.js';
|
|
3
3
|
/**
|
|
4
4
|
* Qwen Code CLI adapter
|
|
5
5
|
* Commands stored as TOML files under .qwen/commands/clavix by default
|