@claude-flow/codex 3.0.0-alpha.1
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 +301 -0
- package/dist/cli.d.ts +9 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +649 -0
- package/dist/cli.js.map +1 -0
- package/dist/generators/agents-md.d.ts +12 -0
- package/dist/generators/agents-md.d.ts.map +1 -0
- package/dist/generators/agents-md.js +641 -0
- package/dist/generators/agents-md.js.map +1 -0
- package/dist/generators/config-toml.d.ts +74 -0
- package/dist/generators/config-toml.d.ts.map +1 -0
- package/dist/generators/config-toml.js +910 -0
- package/dist/generators/config-toml.js.map +1 -0
- package/dist/generators/index.d.ts +9 -0
- package/dist/generators/index.d.ts.map +1 -0
- package/dist/generators/index.js +9 -0
- package/dist/generators/index.js.map +1 -0
- package/dist/generators/skill-md.d.ts +20 -0
- package/dist/generators/skill-md.d.ts.map +1 -0
- package/dist/generators/skill-md.js +946 -0
- package/dist/generators/skill-md.js.map +1 -0
- package/dist/index.d.ts +45 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +46 -0
- package/dist/index.js.map +1 -0
- package/dist/initializer.d.ts +87 -0
- package/dist/initializer.d.ts.map +1 -0
- package/dist/initializer.js +666 -0
- package/dist/initializer.js.map +1 -0
- package/dist/migrations/index.d.ts +114 -0
- package/dist/migrations/index.d.ts.map +1 -0
- package/dist/migrations/index.js +856 -0
- package/dist/migrations/index.js.map +1 -0
- package/dist/templates/index.d.ts +92 -0
- package/dist/templates/index.d.ts.map +1 -0
- package/dist/templates/index.js +284 -0
- package/dist/templates/index.js.map +1 -0
- package/dist/types.d.ts +218 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -0
- package/dist/validators/index.d.ts +42 -0
- package/dist/validators/index.d.ts.map +1 -0
- package/dist/validators/index.js +929 -0
- package/dist/validators/index.js.map +1 -0
- package/package.json +88 -0
|
@@ -0,0 +1,666 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @claude-flow/codex - CodexInitializer
|
|
3
|
+
*
|
|
4
|
+
* Main initialization class for setting up Codex projects
|
|
5
|
+
*/
|
|
6
|
+
import fs from 'fs-extra';
|
|
7
|
+
import path from 'path';
|
|
8
|
+
import { generateAgentsMd } from './generators/agents-md.js';
|
|
9
|
+
import { generateSkillMd, generateBuiltInSkill } from './generators/skill-md.js';
|
|
10
|
+
import { generateConfigToml } from './generators/config-toml.js';
|
|
11
|
+
import { DEFAULT_SKILLS_BY_TEMPLATE, AGENTS_OVERRIDE_TEMPLATE, GITIGNORE_ENTRIES } from './templates/index.js';
|
|
12
|
+
/**
|
|
13
|
+
* Bundled skills source directory (relative to package)
|
|
14
|
+
*/
|
|
15
|
+
const BUNDLED_SKILLS_DIR = '../../../../.agents/skills';
|
|
16
|
+
/**
|
|
17
|
+
* Main initializer for Codex projects
|
|
18
|
+
*/
|
|
19
|
+
export class CodexInitializer {
|
|
20
|
+
projectPath = '';
|
|
21
|
+
template = 'default';
|
|
22
|
+
skills = [];
|
|
23
|
+
force = false;
|
|
24
|
+
dual = false;
|
|
25
|
+
bundledSkillsPath = '';
|
|
26
|
+
/**
|
|
27
|
+
* Initialize a new Codex project
|
|
28
|
+
*/
|
|
29
|
+
async initialize(options) {
|
|
30
|
+
this.projectPath = path.resolve(options.projectPath);
|
|
31
|
+
this.template = options.template ?? 'default';
|
|
32
|
+
this.skills = options.skills ?? DEFAULT_SKILLS_BY_TEMPLATE[this.template];
|
|
33
|
+
this.force = options.force ?? false;
|
|
34
|
+
this.dual = options.dual ?? false;
|
|
35
|
+
// Resolve bundled skills path (relative to this file's location)
|
|
36
|
+
this.bundledSkillsPath = path.resolve(path.dirname(new URL(import.meta.url).pathname), BUNDLED_SKILLS_DIR);
|
|
37
|
+
const filesCreated = [];
|
|
38
|
+
const skillsGenerated = [];
|
|
39
|
+
const warnings = [];
|
|
40
|
+
const errors = [];
|
|
41
|
+
try {
|
|
42
|
+
// Validate project path
|
|
43
|
+
await this.validateProjectPath();
|
|
44
|
+
// Check if already initialized
|
|
45
|
+
const alreadyInitialized = await this.isAlreadyInitialized();
|
|
46
|
+
if (alreadyInitialized && !this.force) {
|
|
47
|
+
return {
|
|
48
|
+
success: false,
|
|
49
|
+
filesCreated,
|
|
50
|
+
skillsGenerated,
|
|
51
|
+
warnings: ['Project already initialized. Use --force to overwrite.'],
|
|
52
|
+
errors: ['Project already initialized'],
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
if (alreadyInitialized && this.force) {
|
|
56
|
+
warnings.push('Overwriting existing configuration files');
|
|
57
|
+
}
|
|
58
|
+
// Create directory structure
|
|
59
|
+
await this.createDirectoryStructure();
|
|
60
|
+
// Generate AGENTS.md
|
|
61
|
+
const agentsMd = await this.generateAgentsMd();
|
|
62
|
+
const agentsMdPath = path.join(this.projectPath, 'AGENTS.md');
|
|
63
|
+
if (await this.shouldWriteFile(agentsMdPath)) {
|
|
64
|
+
await fs.writeFile(agentsMdPath, agentsMd, 'utf-8');
|
|
65
|
+
filesCreated.push('AGENTS.md');
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
warnings.push('AGENTS.md already exists - skipped');
|
|
69
|
+
}
|
|
70
|
+
// Generate config.toml
|
|
71
|
+
const configToml = await this.generateConfigToml();
|
|
72
|
+
const configTomlPath = path.join(this.projectPath, '.agents', 'config.toml');
|
|
73
|
+
if (await this.shouldWriteFile(configTomlPath)) {
|
|
74
|
+
await fs.writeFile(configTomlPath, configToml, 'utf-8');
|
|
75
|
+
filesCreated.push('.agents/config.toml');
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
warnings.push('.agents/config.toml already exists - skipped');
|
|
79
|
+
}
|
|
80
|
+
// Copy bundled skills first (for full/enterprise templates or specific skills)
|
|
81
|
+
const bundledResult = await this.copyBundledSkills();
|
|
82
|
+
skillsGenerated.push(...bundledResult.copied);
|
|
83
|
+
warnings.push(...bundledResult.warnings);
|
|
84
|
+
// For skills not bundled, generate from templates
|
|
85
|
+
for (const skillName of this.skills) {
|
|
86
|
+
// Skip if already copied as bundled skill
|
|
87
|
+
if (bundledResult.copied.includes(skillName)) {
|
|
88
|
+
filesCreated.push(`.agents/skills/${skillName}/SKILL.md`);
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
try {
|
|
92
|
+
const skillResult = await this.generateSkill(skillName);
|
|
93
|
+
if (skillResult.created) {
|
|
94
|
+
skillsGenerated.push(skillName);
|
|
95
|
+
filesCreated.push(skillResult.path);
|
|
96
|
+
}
|
|
97
|
+
else if (skillResult.skipped) {
|
|
98
|
+
// Only warn if not already in bundled warnings
|
|
99
|
+
if (!bundledResult.warnings.some(w => w.includes(skillName))) {
|
|
100
|
+
warnings.push(`Skill ${skillName} already exists - skipped`);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
catch (err) {
|
|
105
|
+
const errorMessage = err instanceof Error ? err.message : String(err);
|
|
106
|
+
warnings.push(`Failed to generate skill ${skillName}: ${errorMessage}`);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// Generate local overrides template
|
|
110
|
+
const overridePath = path.join(this.projectPath, '.codex', 'AGENTS.override.md');
|
|
111
|
+
if (await this.shouldWriteFile(overridePath)) {
|
|
112
|
+
await fs.writeFile(overridePath, AGENTS_OVERRIDE_TEMPLATE, 'utf-8');
|
|
113
|
+
filesCreated.push('.codex/AGENTS.override.md');
|
|
114
|
+
}
|
|
115
|
+
// Generate local config.toml
|
|
116
|
+
const localConfigPath = path.join(this.projectPath, '.codex', 'config.toml');
|
|
117
|
+
if (await this.shouldWriteFile(localConfigPath)) {
|
|
118
|
+
await fs.writeFile(localConfigPath, await this.generateLocalConfigToml(), 'utf-8');
|
|
119
|
+
filesCreated.push('.codex/config.toml');
|
|
120
|
+
}
|
|
121
|
+
// Update .gitignore
|
|
122
|
+
const gitignoreUpdated = await this.updateGitignore();
|
|
123
|
+
if (gitignoreUpdated) {
|
|
124
|
+
filesCreated.push('.gitignore (updated)');
|
|
125
|
+
}
|
|
126
|
+
// Register MCP server with Codex
|
|
127
|
+
const mcpResult = await this.registerMCPServer();
|
|
128
|
+
if (mcpResult.registered) {
|
|
129
|
+
filesCreated.push('MCP server (claude-flow) registered');
|
|
130
|
+
}
|
|
131
|
+
if (mcpResult.warning) {
|
|
132
|
+
warnings.push(mcpResult.warning);
|
|
133
|
+
}
|
|
134
|
+
// If dual mode, also generate Claude Code files
|
|
135
|
+
if (this.dual) {
|
|
136
|
+
const dualResult = await this.generateDualPlatformFiles();
|
|
137
|
+
filesCreated.push(...dualResult.files);
|
|
138
|
+
if (dualResult.warnings) {
|
|
139
|
+
warnings.push(...dualResult.warnings);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
// Create a README for the .agents directory
|
|
143
|
+
const agentsReadmePath = path.join(this.projectPath, '.agents', 'README.md');
|
|
144
|
+
if (await this.shouldWriteFile(agentsReadmePath)) {
|
|
145
|
+
await fs.writeFile(agentsReadmePath, this.generateAgentsReadme(), 'utf-8');
|
|
146
|
+
filesCreated.push('.agents/README.md');
|
|
147
|
+
}
|
|
148
|
+
const result = {
|
|
149
|
+
success: true,
|
|
150
|
+
filesCreated,
|
|
151
|
+
skillsGenerated,
|
|
152
|
+
};
|
|
153
|
+
if (warnings.length > 0) {
|
|
154
|
+
result.warnings = warnings;
|
|
155
|
+
}
|
|
156
|
+
return result;
|
|
157
|
+
}
|
|
158
|
+
catch (error) {
|
|
159
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error occurred';
|
|
160
|
+
errors.push(errorMessage);
|
|
161
|
+
const result = {
|
|
162
|
+
success: false,
|
|
163
|
+
filesCreated,
|
|
164
|
+
skillsGenerated,
|
|
165
|
+
errors,
|
|
166
|
+
};
|
|
167
|
+
if (warnings.length > 0) {
|
|
168
|
+
result.warnings = warnings;
|
|
169
|
+
}
|
|
170
|
+
return result;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Validate that the project path is valid and writable
|
|
175
|
+
*/
|
|
176
|
+
async validateProjectPath() {
|
|
177
|
+
try {
|
|
178
|
+
await fs.ensureDir(this.projectPath);
|
|
179
|
+
// Check write permissions by attempting to create a temp file
|
|
180
|
+
const tempFile = path.join(this.projectPath, '.codex-init-test');
|
|
181
|
+
await fs.writeFile(tempFile, 'test', 'utf-8');
|
|
182
|
+
await fs.remove(tempFile);
|
|
183
|
+
}
|
|
184
|
+
catch (error) {
|
|
185
|
+
throw new Error(`Cannot write to project path: ${this.projectPath}`);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Check if project is already initialized
|
|
190
|
+
*/
|
|
191
|
+
async isAlreadyInitialized() {
|
|
192
|
+
const agentsMdExists = await fs.pathExists(path.join(this.projectPath, 'AGENTS.md'));
|
|
193
|
+
const agentsConfigExists = await fs.pathExists(path.join(this.projectPath, '.agents', 'config.toml'));
|
|
194
|
+
return agentsMdExists || agentsConfigExists;
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Check if we should write a file (force mode or doesn't exist)
|
|
198
|
+
*/
|
|
199
|
+
async shouldWriteFile(filePath) {
|
|
200
|
+
if (this.force) {
|
|
201
|
+
return true;
|
|
202
|
+
}
|
|
203
|
+
return !(await fs.pathExists(filePath));
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Create the directory structure
|
|
207
|
+
*/
|
|
208
|
+
async createDirectoryStructure() {
|
|
209
|
+
const dirs = [
|
|
210
|
+
'.agents',
|
|
211
|
+
'.agents/skills',
|
|
212
|
+
'.codex',
|
|
213
|
+
'.claude-flow',
|
|
214
|
+
'.claude-flow/data',
|
|
215
|
+
'.claude-flow/logs',
|
|
216
|
+
];
|
|
217
|
+
for (const dir of dirs) {
|
|
218
|
+
const fullPath = path.join(this.projectPath, dir);
|
|
219
|
+
await fs.ensureDir(fullPath);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Copy bundled skills from the package or source directory
|
|
224
|
+
* Returns the list of skills copied
|
|
225
|
+
*/
|
|
226
|
+
async copyBundledSkills() {
|
|
227
|
+
const copied = [];
|
|
228
|
+
const warnings = [];
|
|
229
|
+
// Check if bundled skills directory exists
|
|
230
|
+
if (!await fs.pathExists(this.bundledSkillsPath)) {
|
|
231
|
+
warnings.push(`Bundled skills directory not found: ${this.bundledSkillsPath}`);
|
|
232
|
+
return { copied, warnings };
|
|
233
|
+
}
|
|
234
|
+
const destSkillsDir = path.join(this.projectPath, '.agents', 'skills');
|
|
235
|
+
// Get all skill directories
|
|
236
|
+
const skillDirs = await fs.readdir(this.bundledSkillsPath, { withFileTypes: true });
|
|
237
|
+
for (const dirent of skillDirs) {
|
|
238
|
+
if (!dirent.isDirectory())
|
|
239
|
+
continue;
|
|
240
|
+
const skillName = dirent.name;
|
|
241
|
+
const srcPath = path.join(this.bundledSkillsPath, skillName);
|
|
242
|
+
const destPath = path.join(destSkillsDir, skillName);
|
|
243
|
+
// Skip if skill should be filtered (based on template)
|
|
244
|
+
// For 'full' and 'enterprise' templates, include all skills
|
|
245
|
+
const includeAll = this.template === 'full' || this.template === 'enterprise';
|
|
246
|
+
if (!includeAll && !this.skills.includes(skillName)) {
|
|
247
|
+
continue;
|
|
248
|
+
}
|
|
249
|
+
try {
|
|
250
|
+
// Check if skill already exists and we're not forcing
|
|
251
|
+
if (!this.force && await fs.pathExists(destPath)) {
|
|
252
|
+
warnings.push(`Skill ${skillName} already exists - skipped`);
|
|
253
|
+
continue;
|
|
254
|
+
}
|
|
255
|
+
// Copy the entire skill directory
|
|
256
|
+
await fs.copy(srcPath, destPath, { overwrite: this.force });
|
|
257
|
+
copied.push(skillName);
|
|
258
|
+
}
|
|
259
|
+
catch (err) {
|
|
260
|
+
const errorMessage = err instanceof Error ? err.message : String(err);
|
|
261
|
+
warnings.push(`Failed to copy skill ${skillName}: ${errorMessage}`);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
return { copied, warnings };
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Check if a skill is bundled (exists in source directory)
|
|
268
|
+
*/
|
|
269
|
+
async isBundledSkill(skillName) {
|
|
270
|
+
const skillPath = path.join(this.bundledSkillsPath, skillName);
|
|
271
|
+
return fs.pathExists(skillPath);
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Register claude-flow as MCP server with Codex
|
|
275
|
+
*/
|
|
276
|
+
async registerMCPServer() {
|
|
277
|
+
try {
|
|
278
|
+
const { execSync } = await import('child_process');
|
|
279
|
+
// Check if codex CLI is available
|
|
280
|
+
try {
|
|
281
|
+
execSync('which codex', { stdio: 'pipe' });
|
|
282
|
+
}
|
|
283
|
+
catch {
|
|
284
|
+
return {
|
|
285
|
+
registered: false,
|
|
286
|
+
warning: 'Codex CLI not found. Run: codex mcp add claude-flow -- npx claude-flow mcp start',
|
|
287
|
+
};
|
|
288
|
+
}
|
|
289
|
+
// Check if already registered
|
|
290
|
+
try {
|
|
291
|
+
const list = execSync('codex mcp list 2>&1', { encoding: 'utf-8' });
|
|
292
|
+
if (list.includes('claude-flow')) {
|
|
293
|
+
return { registered: true }; // Already registered
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
catch {
|
|
297
|
+
// Ignore list errors
|
|
298
|
+
}
|
|
299
|
+
// Register the MCP server
|
|
300
|
+
try {
|
|
301
|
+
execSync('codex mcp add claude-flow -- npx claude-flow mcp start', {
|
|
302
|
+
stdio: 'pipe',
|
|
303
|
+
timeout: 10000,
|
|
304
|
+
});
|
|
305
|
+
return { registered: true };
|
|
306
|
+
}
|
|
307
|
+
catch (err) {
|
|
308
|
+
const errorMessage = err instanceof Error ? err.message : String(err);
|
|
309
|
+
return {
|
|
310
|
+
registered: false,
|
|
311
|
+
warning: `Failed to register MCP server: ${errorMessage}. Run manually: codex mcp add claude-flow -- npx claude-flow mcp start`,
|
|
312
|
+
};
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
catch {
|
|
316
|
+
return {
|
|
317
|
+
registered: false,
|
|
318
|
+
warning: 'Could not register MCP server. Run manually: codex mcp add claude-flow -- npx claude-flow mcp start',
|
|
319
|
+
};
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
/**
|
|
323
|
+
* Generate AGENTS.md content
|
|
324
|
+
*/
|
|
325
|
+
async generateAgentsMd() {
|
|
326
|
+
const projectName = path.basename(this.projectPath);
|
|
327
|
+
return generateAgentsMd({
|
|
328
|
+
projectName,
|
|
329
|
+
template: this.template,
|
|
330
|
+
skills: this.skills,
|
|
331
|
+
});
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* Generate config.toml content
|
|
335
|
+
*/
|
|
336
|
+
async generateConfigToml() {
|
|
337
|
+
return generateConfigToml({
|
|
338
|
+
skills: this.skills.map(skill => ({
|
|
339
|
+
path: `.agents/skills/${skill}`,
|
|
340
|
+
enabled: true,
|
|
341
|
+
})),
|
|
342
|
+
});
|
|
343
|
+
}
|
|
344
|
+
/**
|
|
345
|
+
* Generate local config.toml for .codex directory
|
|
346
|
+
*/
|
|
347
|
+
async generateLocalConfigToml() {
|
|
348
|
+
return `# Local Codex Configuration
|
|
349
|
+
# This file overrides .agents/config.toml for local development
|
|
350
|
+
# DO NOT commit this file to version control
|
|
351
|
+
|
|
352
|
+
# Development profile - more permissive
|
|
353
|
+
approval_policy = "never"
|
|
354
|
+
sandbox_mode = "danger-full-access"
|
|
355
|
+
web_search = "live"
|
|
356
|
+
|
|
357
|
+
# Debug settings
|
|
358
|
+
# Uncomment to enable debug logging
|
|
359
|
+
# CODEX_LOG_LEVEL = "debug"
|
|
360
|
+
|
|
361
|
+
# Local MCP server overrides
|
|
362
|
+
# [mcp_servers.local]
|
|
363
|
+
# command = "node"
|
|
364
|
+
# args = ["./local-mcp-server.js"]
|
|
365
|
+
# enabled = true
|
|
366
|
+
|
|
367
|
+
# Environment-specific settings
|
|
368
|
+
# [env]
|
|
369
|
+
# ANTHROPIC_API_KEY = "your-local-key"
|
|
370
|
+
`;
|
|
371
|
+
}
|
|
372
|
+
/**
|
|
373
|
+
* Generate a skill
|
|
374
|
+
*/
|
|
375
|
+
async generateSkill(skillName) {
|
|
376
|
+
const skillDir = path.join(this.projectPath, '.agents', 'skills', skillName);
|
|
377
|
+
const skillPath = path.join(skillDir, 'SKILL.md');
|
|
378
|
+
// Check if skill already exists
|
|
379
|
+
if (!this.force && await fs.pathExists(skillPath)) {
|
|
380
|
+
return { created: false, skipped: true, path: `.agents/skills/${skillName}/SKILL.md` };
|
|
381
|
+
}
|
|
382
|
+
await fs.ensureDir(skillDir);
|
|
383
|
+
// Check if it's a built-in skill
|
|
384
|
+
const builtInSkills = [
|
|
385
|
+
'swarm-orchestration',
|
|
386
|
+
'memory-management',
|
|
387
|
+
'sparc-methodology',
|
|
388
|
+
'security-audit',
|
|
389
|
+
'performance-analysis',
|
|
390
|
+
'github-automation',
|
|
391
|
+
];
|
|
392
|
+
let skillMd;
|
|
393
|
+
if (builtInSkills.includes(skillName)) {
|
|
394
|
+
const result = await generateBuiltInSkill(skillName);
|
|
395
|
+
skillMd = result.skillMd;
|
|
396
|
+
// Also write any associated scripts or references
|
|
397
|
+
if (Object.keys(result.scripts).length > 0) {
|
|
398
|
+
const scriptsDir = path.join(skillDir, 'scripts');
|
|
399
|
+
await fs.ensureDir(scriptsDir);
|
|
400
|
+
for (const [scriptName, scriptContent] of Object.entries(result.scripts)) {
|
|
401
|
+
await fs.writeFile(path.join(scriptsDir, scriptName), scriptContent, 'utf-8');
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
if (Object.keys(result.references).length > 0) {
|
|
405
|
+
const refsDir = path.join(skillDir, 'docs');
|
|
406
|
+
await fs.ensureDir(refsDir);
|
|
407
|
+
for (const [refName, refContent] of Object.entries(result.references)) {
|
|
408
|
+
await fs.writeFile(path.join(refsDir, refName), refContent, 'utf-8');
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
else {
|
|
413
|
+
// Generate a custom skill template
|
|
414
|
+
skillMd = await generateSkillMd({
|
|
415
|
+
name: skillName,
|
|
416
|
+
description: `Custom skill: ${skillName}`,
|
|
417
|
+
triggers: ['Define when to trigger this skill'],
|
|
418
|
+
skipWhen: ['Define when to skip this skill'],
|
|
419
|
+
});
|
|
420
|
+
}
|
|
421
|
+
await fs.writeFile(skillPath, skillMd, 'utf-8');
|
|
422
|
+
return { created: true, skipped: false, path: `.agents/skills/${skillName}/SKILL.md` };
|
|
423
|
+
}
|
|
424
|
+
/**
|
|
425
|
+
* Update .gitignore with Codex entries
|
|
426
|
+
*/
|
|
427
|
+
async updateGitignore() {
|
|
428
|
+
const gitignorePath = path.join(this.projectPath, '.gitignore');
|
|
429
|
+
let content = '';
|
|
430
|
+
if (await fs.pathExists(gitignorePath)) {
|
|
431
|
+
content = await fs.readFile(gitignorePath, 'utf-8');
|
|
432
|
+
}
|
|
433
|
+
// Check if Codex entries already exist
|
|
434
|
+
if (content.includes('.codex/')) {
|
|
435
|
+
return false; // Already has entries
|
|
436
|
+
}
|
|
437
|
+
// Add entries with proper spacing
|
|
438
|
+
const separator = content.length > 0 && !content.endsWith('\n') ? '\n\n' : '\n';
|
|
439
|
+
const newContent = content + separator + GITIGNORE_ENTRIES.join('\n') + '\n';
|
|
440
|
+
await fs.writeFile(gitignorePath, newContent, 'utf-8');
|
|
441
|
+
return true;
|
|
442
|
+
}
|
|
443
|
+
/**
|
|
444
|
+
* Generate README for .agents directory
|
|
445
|
+
*/
|
|
446
|
+
generateAgentsReadme() {
|
|
447
|
+
return `# .agents Directory
|
|
448
|
+
|
|
449
|
+
This directory contains agent configuration and skills for OpenAI Codex CLI.
|
|
450
|
+
|
|
451
|
+
## Structure
|
|
452
|
+
|
|
453
|
+
\`\`\`
|
|
454
|
+
.agents/
|
|
455
|
+
config.toml # Main configuration file
|
|
456
|
+
skills/ # Skill definitions
|
|
457
|
+
skill-name/
|
|
458
|
+
SKILL.md # Skill instructions
|
|
459
|
+
scripts/ # Optional scripts
|
|
460
|
+
docs/ # Optional documentation
|
|
461
|
+
README.md # This file
|
|
462
|
+
\`\`\`
|
|
463
|
+
|
|
464
|
+
## Configuration
|
|
465
|
+
|
|
466
|
+
The \`config.toml\` file controls:
|
|
467
|
+
- Model selection
|
|
468
|
+
- Approval policies
|
|
469
|
+
- Sandbox modes
|
|
470
|
+
- MCP server connections
|
|
471
|
+
- Skills configuration
|
|
472
|
+
|
|
473
|
+
## Skills
|
|
474
|
+
|
|
475
|
+
Skills are invoked using \`$skill-name\` syntax. Each skill has:
|
|
476
|
+
- YAML frontmatter with metadata
|
|
477
|
+
- Trigger and skip conditions
|
|
478
|
+
- Commands and examples
|
|
479
|
+
|
|
480
|
+
## Documentation
|
|
481
|
+
|
|
482
|
+
- Main instructions: \`AGENTS.md\` (project root)
|
|
483
|
+
- Local overrides: \`.codex/AGENTS.override.md\` (gitignored)
|
|
484
|
+
- Claude Flow: https://github.com/ruvnet/claude-flow
|
|
485
|
+
`;
|
|
486
|
+
}
|
|
487
|
+
/**
|
|
488
|
+
* Generate dual-platform files (Claude Code + Codex)
|
|
489
|
+
*/
|
|
490
|
+
async generateDualPlatformFiles() {
|
|
491
|
+
const files = [];
|
|
492
|
+
const warnings = [];
|
|
493
|
+
// Check if CLAUDE.md already exists
|
|
494
|
+
const claudeMdPath = path.join(this.projectPath, 'CLAUDE.md');
|
|
495
|
+
const claudeMdExists = await fs.pathExists(claudeMdPath);
|
|
496
|
+
if (claudeMdExists && !this.force) {
|
|
497
|
+
warnings.push('CLAUDE.md already exists - not overwriting. Use --force to replace.');
|
|
498
|
+
return { files, warnings };
|
|
499
|
+
}
|
|
500
|
+
const projectName = path.basename(this.projectPath);
|
|
501
|
+
// Generate a CLAUDE.md that references AGENTS.md
|
|
502
|
+
const claudeMd = `# ${projectName}
|
|
503
|
+
|
|
504
|
+
> This project supports both Claude Code and OpenAI Codex.
|
|
505
|
+
|
|
506
|
+
## Platform Compatibility
|
|
507
|
+
|
|
508
|
+
| Platform | Config File | Skill Syntax |
|
|
509
|
+
|----------|-------------|--------------|
|
|
510
|
+
| Claude Code | CLAUDE.md | /skill-name |
|
|
511
|
+
| OpenAI Codex | AGENTS.md | $skill-name |
|
|
512
|
+
|
|
513
|
+
## Instructions
|
|
514
|
+
|
|
515
|
+
**Primary instructions are in \`AGENTS.md\`** (Agentic AI Foundation standard).
|
|
516
|
+
|
|
517
|
+
This file provides compatibility for Claude Code users.
|
|
518
|
+
|
|
519
|
+
## Quick Start
|
|
520
|
+
|
|
521
|
+
\`\`\`bash
|
|
522
|
+
# Install dependencies
|
|
523
|
+
npm install
|
|
524
|
+
|
|
525
|
+
# Build the project
|
|
526
|
+
npm run build
|
|
527
|
+
|
|
528
|
+
# Run tests
|
|
529
|
+
npm test
|
|
530
|
+
\`\`\`
|
|
531
|
+
|
|
532
|
+
## Available Skills
|
|
533
|
+
|
|
534
|
+
Both platforms share the same skills in \`.agents/skills/\`:
|
|
535
|
+
|
|
536
|
+
${this.skills.map(s => `- \`$${s}\` (Codex) / \`/${s}\` (Claude Code)`).join('\n')}
|
|
537
|
+
|
|
538
|
+
## Configuration
|
|
539
|
+
|
|
540
|
+
### Codex Configuration
|
|
541
|
+
- Main: \`.agents/config.toml\`
|
|
542
|
+
- Local: \`.codex/config.toml\` (gitignored)
|
|
543
|
+
|
|
544
|
+
### Claude Code Configuration
|
|
545
|
+
- This file: \`CLAUDE.md\`
|
|
546
|
+
- Local: \`CLAUDE.local.md\` (gitignored)
|
|
547
|
+
|
|
548
|
+
## MCP Integration
|
|
549
|
+
|
|
550
|
+
\`\`\`bash
|
|
551
|
+
# Start MCP server
|
|
552
|
+
npx @claude-flow/cli mcp start
|
|
553
|
+
\`\`\`
|
|
554
|
+
|
|
555
|
+
## Swarm Orchestration
|
|
556
|
+
|
|
557
|
+
This project uses hierarchical swarm coordination:
|
|
558
|
+
|
|
559
|
+
| Setting | Value |
|
|
560
|
+
|---------|-------|
|
|
561
|
+
| Topology | hierarchical |
|
|
562
|
+
| Max Agents | 8 |
|
|
563
|
+
| Strategy | specialized |
|
|
564
|
+
|
|
565
|
+
## Code Standards
|
|
566
|
+
|
|
567
|
+
- Files under 500 lines
|
|
568
|
+
- No hardcoded secrets
|
|
569
|
+
- Input validation at boundaries
|
|
570
|
+
- Typed interfaces for APIs
|
|
571
|
+
|
|
572
|
+
## Security
|
|
573
|
+
|
|
574
|
+
- NEVER commit .env files or secrets
|
|
575
|
+
- Always validate user input
|
|
576
|
+
- Use parameterized queries for SQL
|
|
577
|
+
|
|
578
|
+
## Full Documentation
|
|
579
|
+
|
|
580
|
+
For complete instructions, see \`AGENTS.md\`.
|
|
581
|
+
|
|
582
|
+
---
|
|
583
|
+
|
|
584
|
+
*Generated by @claude-flow/codex - Dual platform mode*
|
|
585
|
+
`;
|
|
586
|
+
await fs.writeFile(claudeMdPath, claudeMd, 'utf-8');
|
|
587
|
+
files.push('CLAUDE.md');
|
|
588
|
+
// Generate CLAUDE.local.md template
|
|
589
|
+
const claudeLocalPath = path.join(this.projectPath, 'CLAUDE.local.md');
|
|
590
|
+
if (await this.shouldWriteFile(claudeLocalPath)) {
|
|
591
|
+
const claudeLocal = `# Local Development Configuration
|
|
592
|
+
|
|
593
|
+
## Environment
|
|
594
|
+
|
|
595
|
+
\`\`\`bash
|
|
596
|
+
# Development settings
|
|
597
|
+
CLAUDE_FLOW_LOG_LEVEL=debug
|
|
598
|
+
\`\`\`
|
|
599
|
+
|
|
600
|
+
## Personal Preferences
|
|
601
|
+
|
|
602
|
+
[Add your preferences here]
|
|
603
|
+
|
|
604
|
+
## Debug Settings
|
|
605
|
+
|
|
606
|
+
Enable verbose logging for development.
|
|
607
|
+
|
|
608
|
+
---
|
|
609
|
+
|
|
610
|
+
*This file is gitignored and contains local-only settings.*
|
|
611
|
+
`;
|
|
612
|
+
await fs.writeFile(claudeLocalPath, claudeLocal, 'utf-8');
|
|
613
|
+
files.push('CLAUDE.local.md');
|
|
614
|
+
}
|
|
615
|
+
// Update .gitignore for CLAUDE.local.md
|
|
616
|
+
const gitignorePath = path.join(this.projectPath, '.gitignore');
|
|
617
|
+
if (await fs.pathExists(gitignorePath)) {
|
|
618
|
+
let content = await fs.readFile(gitignorePath, 'utf-8');
|
|
619
|
+
if (!content.includes('CLAUDE.local.md')) {
|
|
620
|
+
content += '\n# Claude Code local config\nCLAUDE.local.md\n';
|
|
621
|
+
await fs.writeFile(gitignorePath, content, 'utf-8');
|
|
622
|
+
}
|
|
623
|
+
}
|
|
624
|
+
warnings.push('Generated dual-platform setup. AGENTS.md is the canonical source.');
|
|
625
|
+
return { files, warnings };
|
|
626
|
+
}
|
|
627
|
+
/**
|
|
628
|
+
* Get the list of files that would be created (dry-run)
|
|
629
|
+
*/
|
|
630
|
+
async dryRun(options) {
|
|
631
|
+
const files = [
|
|
632
|
+
'AGENTS.md',
|
|
633
|
+
'.agents/config.toml',
|
|
634
|
+
'.agents/README.md',
|
|
635
|
+
'.codex/AGENTS.override.md',
|
|
636
|
+
'.codex/config.toml',
|
|
637
|
+
'.gitignore (updated)',
|
|
638
|
+
];
|
|
639
|
+
const skills = options.skills ?? DEFAULT_SKILLS_BY_TEMPLATE[options.template ?? 'default'];
|
|
640
|
+
for (const skill of skills) {
|
|
641
|
+
files.push(`.agents/skills/${skill}/SKILL.md`);
|
|
642
|
+
}
|
|
643
|
+
if (options.dual) {
|
|
644
|
+
files.push('CLAUDE.md');
|
|
645
|
+
files.push('CLAUDE.local.md');
|
|
646
|
+
}
|
|
647
|
+
return files;
|
|
648
|
+
}
|
|
649
|
+
}
|
|
650
|
+
/**
|
|
651
|
+
* Quick initialization function for programmatic use
|
|
652
|
+
*/
|
|
653
|
+
export async function initializeCodexProject(projectPath, options) {
|
|
654
|
+
const initializer = new CodexInitializer();
|
|
655
|
+
const initOptions = {
|
|
656
|
+
projectPath,
|
|
657
|
+
template: options?.template ?? 'default',
|
|
658
|
+
force: options?.force ?? false,
|
|
659
|
+
dual: options?.dual ?? false,
|
|
660
|
+
};
|
|
661
|
+
if (options?.skills) {
|
|
662
|
+
initOptions.skills = options.skills;
|
|
663
|
+
}
|
|
664
|
+
return initializer.initialize(initOptions);
|
|
665
|
+
}
|
|
666
|
+
//# sourceMappingURL=initializer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"initializer.js","sourceRoot":"","sources":["../src/initializer.ts"],"names":[],"mappings":"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"}
|