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,65 +1,31 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
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
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
-
};
|
|
38
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
-
const core_1 = require("@oclif/core");
|
|
40
|
-
const inquirer_1 = __importDefault(require("inquirer"));
|
|
41
|
-
const chalk_1 = __importDefault(require("chalk"));
|
|
42
|
-
const path = __importStar(require("path"));
|
|
43
|
-
const json5_1 = __importDefault(require("json5"));
|
|
44
|
-
const agent_manager_1 = require("../../core/agent-manager");
|
|
45
|
-
const doc_injector_1 = require("../../core/doc-injector");
|
|
46
|
-
const agents_md_generator_1 = require("../../core/adapters/agents-md-generator");
|
|
47
|
-
const octo_md_generator_1 = require("../../core/adapters/octo-md-generator");
|
|
48
|
-
const warp_md_generator_1 = require("../../core/adapters/warp-md-generator");
|
|
49
|
-
const copilot_instructions_generator_1 = require("../../core/adapters/copilot-instructions-generator");
|
|
50
|
-
const file_system_1 = require("../../utils/file-system");
|
|
51
|
-
const config_1 = require("../../types/config");
|
|
52
|
-
const gemini_adapter_1 = require("../../core/adapters/gemini-adapter");
|
|
53
|
-
const qwen_adapter_1 = require("../../core/adapters/qwen-adapter");
|
|
54
|
-
const template_loader_1 = require("../../utils/template-loader");
|
|
55
|
-
const legacy_command_cleanup_1 = require("../../utils/legacy-command-cleanup");
|
|
56
|
-
class Init extends core_1.Command {
|
|
1
|
+
import { Command } from '@oclif/core';
|
|
2
|
+
import inquirer from 'inquirer';
|
|
3
|
+
import chalk from 'chalk';
|
|
4
|
+
import * as path from 'path';
|
|
5
|
+
import JSON5 from 'json5';
|
|
6
|
+
import { AgentManager } from '../../core/agent-manager.js';
|
|
7
|
+
import { DocInjector } from '../../core/doc-injector.js';
|
|
8
|
+
import { AgentsMdGenerator } from '../../core/adapters/agents-md-generator.js';
|
|
9
|
+
import { OctoMdGenerator } from '../../core/adapters/octo-md-generator.js';
|
|
10
|
+
import { WarpMdGenerator } from '../../core/adapters/warp-md-generator.js';
|
|
11
|
+
import { CopilotInstructionsGenerator } from '../../core/adapters/copilot-instructions-generator.js';
|
|
12
|
+
import { FileSystem } from '../../utils/file-system.js';
|
|
13
|
+
import { DEFAULT_CONFIG } from '../../types/config.js';
|
|
14
|
+
import { GeminiAdapter } from '../../core/adapters/gemini-adapter.js';
|
|
15
|
+
import { QwenAdapter } from '../../core/adapters/qwen-adapter.js';
|
|
16
|
+
import { loadCommandTemplates } from '../../utils/template-loader.js';
|
|
17
|
+
import { collectLegacyCommandFiles } from '../../utils/legacy-command-cleanup.js';
|
|
18
|
+
export default class Init extends Command {
|
|
19
|
+
static description = 'Initialize Clavix in the current project';
|
|
20
|
+
static examples = [
|
|
21
|
+
'<%= config.bin %> <%= command.id %>',
|
|
22
|
+
];
|
|
57
23
|
async run() {
|
|
58
|
-
console.log(
|
|
24
|
+
console.log(chalk.bold.cyan('\n🚀 Clavix Initialization\n'));
|
|
59
25
|
try {
|
|
60
26
|
// Check if already initialized
|
|
61
|
-
if (await
|
|
62
|
-
const { reinit } = await
|
|
27
|
+
if (await FileSystem.exists('.clavix')) {
|
|
28
|
+
const { reinit } = await inquirer.prompt([
|
|
63
29
|
{
|
|
64
30
|
type: 'confirm',
|
|
65
31
|
name: 'reinit',
|
|
@@ -68,15 +34,15 @@ class Init extends core_1.Command {
|
|
|
68
34
|
},
|
|
69
35
|
]);
|
|
70
36
|
if (!reinit) {
|
|
71
|
-
console.log(
|
|
37
|
+
console.log(chalk.yellow('\n✓ Initialization cancelled\n'));
|
|
72
38
|
return;
|
|
73
39
|
}
|
|
74
40
|
}
|
|
75
41
|
// Select providers (multi-select)
|
|
76
|
-
const agentManager = new
|
|
77
|
-
console.log(
|
|
78
|
-
console.log(
|
|
79
|
-
const { selectedProviders } = await
|
|
42
|
+
const agentManager = new AgentManager();
|
|
43
|
+
console.log(chalk.gray('Select AI development tools to support:\n'));
|
|
44
|
+
console.log(chalk.gray('(Space to select, Enter to confirm)\n'));
|
|
45
|
+
const { selectedProviders } = await inquirer.prompt([
|
|
80
46
|
{
|
|
81
47
|
type: 'checkbox',
|
|
82
48
|
name: 'selectedProviders',
|
|
@@ -123,7 +89,7 @@ class Init extends core_1.Command {
|
|
|
123
89
|
name: 'Qwen Code (.qwen/commands/clavix/)',
|
|
124
90
|
value: 'qwen',
|
|
125
91
|
},
|
|
126
|
-
new
|
|
92
|
+
new inquirer.Separator(),
|
|
127
93
|
// IDE & IDE Extensions
|
|
128
94
|
{
|
|
129
95
|
name: 'Cursor (.cursor/commands/)',
|
|
@@ -145,7 +111,7 @@ class Init extends core_1.Command {
|
|
|
145
111
|
name: 'Cline (.clinerules/workflows/)',
|
|
146
112
|
value: 'cline',
|
|
147
113
|
},
|
|
148
|
-
new
|
|
114
|
+
new inquirer.Separator(),
|
|
149
115
|
// Universal Adapters
|
|
150
116
|
{
|
|
151
117
|
name: 'Agents (AGENTS.md - Universal - for tools without slash commands)',
|
|
@@ -163,7 +129,7 @@ class Init extends core_1.Command {
|
|
|
163
129
|
name: 'Octofriend (OCTO.md - optimized for Octofriend)',
|
|
164
130
|
value: 'octo-md',
|
|
165
131
|
},
|
|
166
|
-
new
|
|
132
|
+
new inquirer.Separator(),
|
|
167
133
|
],
|
|
168
134
|
validate: (answer) => {
|
|
169
135
|
if (answer.length === 0) {
|
|
@@ -174,48 +140,48 @@ class Init extends core_1.Command {
|
|
|
174
140
|
},
|
|
175
141
|
]);
|
|
176
142
|
if (!selectedProviders || selectedProviders.length === 0) {
|
|
177
|
-
console.log(
|
|
143
|
+
console.log(chalk.red('\n✗ No providers selected\n'));
|
|
178
144
|
return;
|
|
179
145
|
}
|
|
180
146
|
// Create .clavix directory structure
|
|
181
|
-
console.log(
|
|
147
|
+
console.log(chalk.cyan('\n📁 Creating directory structure...'));
|
|
182
148
|
await this.createDirectoryStructure();
|
|
183
149
|
// Generate config
|
|
184
|
-
console.log(
|
|
150
|
+
console.log(chalk.cyan('⚙️ Generating configuration...'));
|
|
185
151
|
await this.generateConfig(selectedProviders);
|
|
186
152
|
// Generate INSTRUCTIONS.md
|
|
187
153
|
await this.generateInstructions();
|
|
188
154
|
// Generate commands for each selected provider
|
|
189
|
-
console.log(
|
|
155
|
+
console.log(chalk.cyan(`\n📝 Generating commands for ${selectedProviders.length} provider(s)...\n`));
|
|
190
156
|
for (const providerName of selectedProviders) {
|
|
191
157
|
// Handle agents-md separately (it's not an adapter)
|
|
192
158
|
if (providerName === 'agents-md') {
|
|
193
|
-
console.log(
|
|
194
|
-
await
|
|
159
|
+
console.log(chalk.gray(' ✓ Generating AGENTS.md...'));
|
|
160
|
+
await AgentsMdGenerator.generate();
|
|
195
161
|
continue;
|
|
196
162
|
}
|
|
197
163
|
// Handle copilot-instructions separately (it's not an adapter)
|
|
198
164
|
if (providerName === 'copilot-instructions') {
|
|
199
|
-
console.log(
|
|
200
|
-
await
|
|
165
|
+
console.log(chalk.gray(' ✓ Generating .github/copilot-instructions.md...'));
|
|
166
|
+
await CopilotInstructionsGenerator.generate();
|
|
201
167
|
continue;
|
|
202
168
|
}
|
|
203
169
|
// Handle octo-md separately (it's not an adapter)
|
|
204
170
|
if (providerName === 'octo-md') {
|
|
205
|
-
console.log(
|
|
206
|
-
await
|
|
171
|
+
console.log(chalk.gray(' ✓ Generating OCTO.md...'));
|
|
172
|
+
await OctoMdGenerator.generate();
|
|
207
173
|
continue;
|
|
208
174
|
}
|
|
209
175
|
if (providerName === 'warp-md') {
|
|
210
|
-
console.log(
|
|
211
|
-
await
|
|
176
|
+
console.log(chalk.gray(' ✓ Generating WARP.md...'));
|
|
177
|
+
await WarpMdGenerator.generate();
|
|
212
178
|
continue;
|
|
213
179
|
}
|
|
214
180
|
let adapter = agentManager.requireAdapter(providerName);
|
|
215
|
-
console.log(
|
|
181
|
+
console.log(chalk.gray(` ✓ Generating ${adapter.displayName} commands...`));
|
|
216
182
|
if (adapter.name === 'codex') {
|
|
217
183
|
const codexPath = adapter.getCommandPath();
|
|
218
|
-
const { confirmCodex } = await
|
|
184
|
+
const { confirmCodex } = await inquirer.prompt([
|
|
219
185
|
{
|
|
220
186
|
type: 'confirm',
|
|
221
187
|
name: 'confirmCodex',
|
|
@@ -224,13 +190,13 @@ class Init extends core_1.Command {
|
|
|
224
190
|
},
|
|
225
191
|
]);
|
|
226
192
|
if (!confirmCodex) {
|
|
227
|
-
console.log(
|
|
193
|
+
console.log(chalk.yellow(' ⊗ Skipped Codex CLI'));
|
|
228
194
|
continue;
|
|
229
195
|
}
|
|
230
196
|
}
|
|
231
197
|
if (adapter.name === 'gemini' || adapter.name === 'qwen') {
|
|
232
198
|
const defaultNamespacePath = path.join(`.${adapter.name}`, 'commands', 'clavix');
|
|
233
|
-
const { useNamespace } = await
|
|
199
|
+
const { useNamespace } = await inquirer.prompt([
|
|
234
200
|
{
|
|
235
201
|
type: 'confirm',
|
|
236
202
|
name: 'useNamespace',
|
|
@@ -240,18 +206,18 @@ class Init extends core_1.Command {
|
|
|
240
206
|
]);
|
|
241
207
|
if (!useNamespace) {
|
|
242
208
|
adapter = adapter.name === 'gemini'
|
|
243
|
-
? new
|
|
244
|
-
: new
|
|
245
|
-
console.log(
|
|
209
|
+
? new GeminiAdapter({ useNamespace: false })
|
|
210
|
+
: new QwenAdapter({ useNamespace: false });
|
|
211
|
+
console.log(chalk.gray(` → Using ${adapter.getCommandPath()} (no namespacing)`));
|
|
246
212
|
}
|
|
247
213
|
}
|
|
248
214
|
// Validate before generating
|
|
249
215
|
if (adapter.validate) {
|
|
250
216
|
const validation = await adapter.validate();
|
|
251
217
|
if (!validation.valid) {
|
|
252
|
-
console.log(
|
|
253
|
-
validation.errors?.forEach((err) => console.log(
|
|
254
|
-
const { continueAnyway } = await
|
|
218
|
+
console.log(chalk.yellow(` ⚠ Validation warnings for ${adapter.displayName}:`));
|
|
219
|
+
validation.errors?.forEach((err) => console.log(chalk.yellow(` - ${err}`)));
|
|
220
|
+
const { continueAnyway } = await inquirer.prompt([
|
|
255
221
|
{
|
|
256
222
|
type: 'confirm',
|
|
257
223
|
name: 'continueAnyway',
|
|
@@ -260,7 +226,7 @@ class Init extends core_1.Command {
|
|
|
260
226
|
},
|
|
261
227
|
]);
|
|
262
228
|
if (!continueAnyway) {
|
|
263
|
-
console.log(
|
|
229
|
+
console.log(chalk.yellow(` ⊗ Skipped ${adapter.displayName}`));
|
|
264
230
|
continue;
|
|
265
231
|
}
|
|
266
232
|
}
|
|
@@ -280,30 +246,30 @@ class Init extends core_1.Command {
|
|
|
280
246
|
const slashName = filename.slice(0, -adapter.fileExtension.length);
|
|
281
247
|
return `/${slashName}`;
|
|
282
248
|
});
|
|
283
|
-
console.log(
|
|
284
|
-
console.log(
|
|
285
|
-
console.log(
|
|
249
|
+
console.log(chalk.green(` → Registered ${commandNames.join(', ')}`));
|
|
250
|
+
console.log(chalk.gray(` Commands saved to ${commandPath}`));
|
|
251
|
+
console.log(chalk.gray(' Tip: reopen the CLI or run /help to refresh the command list.'));
|
|
286
252
|
}
|
|
287
253
|
// Inject documentation blocks (Claude Code only)
|
|
288
254
|
if (providerName === 'claude-code') {
|
|
289
|
-
console.log(
|
|
255
|
+
console.log(chalk.gray(' ✓ Injecting CLAUDE.md documentation...'));
|
|
290
256
|
await this.injectDocumentation(adapter);
|
|
291
257
|
}
|
|
292
258
|
}
|
|
293
259
|
// Success message
|
|
294
|
-
console.log(
|
|
295
|
-
console.log(
|
|
296
|
-
console.log(
|
|
297
|
-
console.log(
|
|
298
|
-
console.log(
|
|
299
|
-
console.log(
|
|
300
|
-
console.log(
|
|
260
|
+
console.log(chalk.bold.green('\n✅ Clavix initialized successfully!\n'));
|
|
261
|
+
console.log(chalk.gray('Next steps:'));
|
|
262
|
+
console.log(chalk.gray(' • Slash commands are now available in your AI agent'));
|
|
263
|
+
console.log(chalk.gray(' • Run'), chalk.cyan('clavix --help'), chalk.gray('to see all commands'));
|
|
264
|
+
console.log(chalk.gray(' • Try'), chalk.cyan('/clavix:fast'), chalk.gray('for quick prompt improvements'));
|
|
265
|
+
console.log(chalk.gray(' • Try'), chalk.cyan('/clavix:deep'), chalk.gray('for comprehensive prompt analysis'));
|
|
266
|
+
console.log(chalk.gray(' • Use'), chalk.cyan('/clavix:prd'), chalk.gray('to generate a PRD\n'));
|
|
301
267
|
}
|
|
302
268
|
catch (error) {
|
|
303
|
-
const { getErrorMessage, toError } = await
|
|
304
|
-
console.error(
|
|
269
|
+
const { getErrorMessage, toError } = await import('../../utils/error-utils.js');
|
|
270
|
+
console.error(chalk.red('\n✗ Initialization failed:'), getErrorMessage(error));
|
|
305
271
|
if (error && typeof error === 'object' && 'hint' in error && typeof error.hint === 'string') {
|
|
306
|
-
console.error(
|
|
272
|
+
console.error(chalk.yellow(' Hint:'), error.hint);
|
|
307
273
|
}
|
|
308
274
|
throw toError(error);
|
|
309
275
|
}
|
|
@@ -316,17 +282,17 @@ class Init extends core_1.Command {
|
|
|
316
282
|
'.clavix/templates',
|
|
317
283
|
];
|
|
318
284
|
for (const dir of dirs) {
|
|
319
|
-
await
|
|
285
|
+
await FileSystem.ensureDir(dir);
|
|
320
286
|
}
|
|
321
287
|
}
|
|
322
288
|
async generateConfig(providers) {
|
|
323
289
|
const config = {
|
|
324
|
-
...
|
|
290
|
+
...DEFAULT_CONFIG,
|
|
325
291
|
providers,
|
|
326
292
|
};
|
|
327
293
|
const configPath = '.clavix/config.json';
|
|
328
|
-
const configContent =
|
|
329
|
-
await
|
|
294
|
+
const configContent = JSON5.stringify(config, null, 2);
|
|
295
|
+
await FileSystem.writeFileAtomic(configPath, configContent);
|
|
330
296
|
}
|
|
331
297
|
async generateInstructions() {
|
|
332
298
|
const instructions = `# Clavix Instructions
|
|
@@ -377,27 +343,27 @@ See documentation for template format details.
|
|
|
377
343
|
- Documentation: https://github.com/Bob5k/Clavix
|
|
378
344
|
- Issues: https://github.com/Bob5k/Clavix/issues
|
|
379
345
|
`;
|
|
380
|
-
await
|
|
346
|
+
await FileSystem.writeFileAtomic('.clavix/INSTRUCTIONS.md', instructions);
|
|
381
347
|
}
|
|
382
348
|
async generateSlashCommands(adapter) {
|
|
383
|
-
const templates = await
|
|
349
|
+
const templates = await loadCommandTemplates(adapter);
|
|
384
350
|
await adapter.generateCommands(templates);
|
|
385
351
|
return templates;
|
|
386
352
|
}
|
|
387
353
|
async handleLegacyCommands(adapter, templates) {
|
|
388
354
|
const commandNames = templates.map((template) => template.name);
|
|
389
|
-
const legacyFiles = await
|
|
355
|
+
const legacyFiles = await collectLegacyCommandFiles(adapter, commandNames);
|
|
390
356
|
if (legacyFiles.length === 0) {
|
|
391
357
|
return;
|
|
392
358
|
}
|
|
393
359
|
const relativePaths = legacyFiles
|
|
394
360
|
.map((file) => path.relative(process.cwd(), file))
|
|
395
361
|
.sort((a, b) => a.localeCompare(b));
|
|
396
|
-
console.log(
|
|
362
|
+
console.log(chalk.gray(` ⚠ Found ${relativePaths.length} deprecated command file(s):`));
|
|
397
363
|
for (const file of relativePaths) {
|
|
398
|
-
console.log(
|
|
364
|
+
console.log(chalk.gray(` • ${file}`));
|
|
399
365
|
}
|
|
400
|
-
const { removeLegacy } = await
|
|
366
|
+
const { removeLegacy } = await inquirer.prompt([
|
|
401
367
|
{
|
|
402
368
|
type: 'confirm',
|
|
403
369
|
name: 'removeLegacy',
|
|
@@ -406,22 +372,22 @@ See documentation for template format details.
|
|
|
406
372
|
},
|
|
407
373
|
]);
|
|
408
374
|
if (!removeLegacy) {
|
|
409
|
-
console.log(
|
|
375
|
+
console.log(chalk.gray(' ⊗ Kept legacy files (deprecated naming retained)'));
|
|
410
376
|
return;
|
|
411
377
|
}
|
|
412
378
|
for (const file of legacyFiles) {
|
|
413
|
-
await
|
|
414
|
-
console.log(
|
|
379
|
+
await FileSystem.remove(file);
|
|
380
|
+
console.log(chalk.gray(` ✓ Removed ${path.relative(process.cwd(), file)}`));
|
|
415
381
|
}
|
|
416
382
|
}
|
|
417
383
|
async injectDocumentation(adapter) {
|
|
418
384
|
// Inject AGENTS.md
|
|
419
|
-
const agentsContent =
|
|
420
|
-
await
|
|
385
|
+
const agentsContent = DocInjector.getDefaultAgentsContent();
|
|
386
|
+
await DocInjector.injectBlock('AGENTS.md', this.extractClavixBlock(agentsContent));
|
|
421
387
|
// Inject CLAUDE.md if Claude Code selected
|
|
422
388
|
if (adapter.name === 'claude-code') {
|
|
423
|
-
const claudeContent =
|
|
424
|
-
await
|
|
389
|
+
const claudeContent = DocInjector.getDefaultClaudeContent();
|
|
390
|
+
await DocInjector.injectBlock('CLAUDE.md', this.extractClavixBlock(claudeContent));
|
|
425
391
|
}
|
|
426
392
|
}
|
|
427
393
|
extractClavixBlock(content) {
|
|
@@ -429,9 +395,4 @@ See documentation for template format details.
|
|
|
429
395
|
return match ? match[1].trim() : content;
|
|
430
396
|
}
|
|
431
397
|
}
|
|
432
|
-
Init.description = 'Initialize Clavix in the current project';
|
|
433
|
-
Init.examples = [
|
|
434
|
-
'<%= config.bin %> <%= command.id %>',
|
|
435
|
-
];
|
|
436
|
-
exports.default = Init;
|
|
437
398
|
//# sourceMappingURL=init.js.map
|
|
@@ -3,11 +3,11 @@ export default class List extends Command {
|
|
|
3
3
|
static description: string;
|
|
4
4
|
static examples: string[];
|
|
5
5
|
static flags: {
|
|
6
|
-
sessions: import("@oclif/core/
|
|
7
|
-
outputs: import("@oclif/core/
|
|
8
|
-
archived: import("@oclif/core/
|
|
9
|
-
project: import("@oclif/core/
|
|
10
|
-
limit: import("@oclif/core/
|
|
6
|
+
sessions: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
7
|
+
outputs: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
8
|
+
archived: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
9
|
+
project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
10
|
+
limit: import("@oclif/core/interfaces").OptionFlag<number, import("@oclif/core/interfaces").CustomOptions>;
|
|
11
11
|
};
|
|
12
12
|
run(): Promise<void>;
|
|
13
13
|
private listSessions;
|