xo-agent 0.0.1-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/LICENSE +21 -0
- package/README.md +159 -0
- package/bin/cli.js +2 -0
- package/dist/commands/add-agent.d.ts +3 -0
- package/dist/commands/add-agent.d.ts.map +1 -0
- package/dist/commands/add-agent.js +114 -0
- package/dist/commands/add-agent.js.map +1 -0
- package/dist/commands/add-command.d.ts +3 -0
- package/dist/commands/add-command.d.ts.map +1 -0
- package/dist/commands/add-command.js +114 -0
- package/dist/commands/add-command.js.map +1 -0
- package/dist/commands/add-skill.d.ts +3 -0
- package/dist/commands/add-skill.d.ts.map +1 -0
- package/dist/commands/add-skill.js +108 -0
- package/dist/commands/add-skill.js.map +1 -0
- package/dist/commands/add.d.ts +3 -0
- package/dist/commands/add.d.ts.map +1 -0
- package/dist/commands/add.js +133 -0
- package/dist/commands/add.js.map +1 -0
- package/dist/commands/interactive.d.ts +3 -0
- package/dist/commands/interactive.d.ts.map +1 -0
- package/dist/commands/interactive.js +176 -0
- package/dist/commands/interactive.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/skills/example-skill/SKILL.md +19 -0
- package/dist/templates/agents/code-reviewer/AGENT.md +138 -0
- package/dist/templates/agents/documentation-writer/AGENT.md +179 -0
- package/dist/templates/commands/deploy.md +52 -0
- package/dist/templates/commands/test.md +49 -0
- package/dist/templates/skills/example-skill/SKILL.md +19 -0
- package/dist/templates/skills/example-skill/references/reference.md +0 -0
- package/dist/templates/skills/example-skill/scripts/script.py +0 -0
- package/dist/types.d.ts +13 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +16 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/constants.d.ts +13 -0
- package/dist/utils/constants.d.ts.map +1 -0
- package/dist/utils/constants.js +16 -0
- package/dist/utils/constants.js.map +1 -0
- package/dist/utils/copy.d.ts +55 -0
- package/dist/utils/copy.d.ts.map +1 -0
- package/dist/utils/copy.js +229 -0
- package/dist/utils/copy.js.map +1 -0
- package/dist/utils/evaluate.d.ts +10 -0
- package/dist/utils/evaluate.d.ts.map +1 -0
- package/dist/utils/evaluate.js +28 -0
- package/dist/utils/evaluate.js.map +1 -0
- package/dist/utils/file-builder.d.ts +28 -0
- package/dist/utils/file-builder.d.ts.map +1 -0
- package/dist/utils/file-builder.js +106 -0
- package/dist/utils/file-builder.js.map +1 -0
- package/dist/utils/prompts.d.ts +12 -0
- package/dist/utils/prompts.d.ts.map +1 -0
- package/dist/utils/prompts.js +152 -0
- package/dist/utils/prompts.js.map +1 -0
- package/dist/utils/transform.d.ts +11 -0
- package/dist/utils/transform.d.ts.map +1 -0
- package/dist/utils/transform.js +43 -0
- package/dist/utils/transform.js.map +1 -0
- package/package.json +45 -0
|
@@ -0,0 +1,133 @@
|
|
|
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.addCommand = addCommand;
|
|
37
|
+
const path = __importStar(require("path"));
|
|
38
|
+
const prompts_1 = require("../utils/prompts");
|
|
39
|
+
const copy_1 = require("../utils/copy");
|
|
40
|
+
const file_builder_1 = require("../utils/file-builder");
|
|
41
|
+
const types_1 = require("../types");
|
|
42
|
+
async function addCommand(program) {
|
|
43
|
+
program
|
|
44
|
+
.command('add [skill]', { isDefault: true })
|
|
45
|
+
.description('Add a skill to your agent project')
|
|
46
|
+
.option('-a, --agent <type>', 'Agent type (antigravity or claude)')
|
|
47
|
+
.option('-s, --skill <name>', 'Skill name (deprecated, use positional argument)')
|
|
48
|
+
.action(async (skillArg, options) => {
|
|
49
|
+
try {
|
|
50
|
+
const cwd = process.cwd();
|
|
51
|
+
// Check if we're in a valid project
|
|
52
|
+
if (!(await (0, copy_1.isValidProject)(cwd))) {
|
|
53
|
+
console.error('❌ Error: Not in a valid project directory (no package.json found)');
|
|
54
|
+
process.exit(1);
|
|
55
|
+
}
|
|
56
|
+
// Get skills directory
|
|
57
|
+
// When running from dist/commands/add.js, skills are in ../skills (if copied to dist)
|
|
58
|
+
// Or we can resolve relative to the package root
|
|
59
|
+
const skillsDir = path.join(__dirname, '../skills');
|
|
60
|
+
// Get available skills
|
|
61
|
+
const availableSkills = await (0, copy_1.getAvailableSkills)(skillsDir);
|
|
62
|
+
if (availableSkills.length === 0) {
|
|
63
|
+
console.error('❌ No skills found in the package');
|
|
64
|
+
process.exit(1);
|
|
65
|
+
}
|
|
66
|
+
// Determine skill from Argument or Option
|
|
67
|
+
let skillName = skillArg || options.skill;
|
|
68
|
+
let selectedSkill;
|
|
69
|
+
// 1. Resolve Skill (if provided)
|
|
70
|
+
if (skillName) {
|
|
71
|
+
selectedSkill = availableSkills.find((s) => s.name === skillName);
|
|
72
|
+
if (!selectedSkill) {
|
|
73
|
+
console.error(`❌ Skill "${skillName}" not found`);
|
|
74
|
+
console.log('\nAvailable skills:');
|
|
75
|
+
availableSkills.forEach((s) => console.log(` - ${s.name}`));
|
|
76
|
+
process.exit(1);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// 2. Resolve Agent
|
|
80
|
+
let agentType = options.agent;
|
|
81
|
+
if (!agentType) {
|
|
82
|
+
agentType = await (0, prompts_1.promptForAgent)();
|
|
83
|
+
}
|
|
84
|
+
// Validate agent type
|
|
85
|
+
if (!types_1.AGENT_CONFIGS[agentType]) {
|
|
86
|
+
console.error(`❌ Invalid agent type: ${agentType}`);
|
|
87
|
+
process.exit(1);
|
|
88
|
+
}
|
|
89
|
+
const agentConfig = types_1.AGENT_CONFIGS[agentType];
|
|
90
|
+
// 3. Prompt for Skill (if not provided earlier)
|
|
91
|
+
if (!selectedSkill) {
|
|
92
|
+
selectedSkill = await (0, prompts_1.promptForSkill)(availableSkills);
|
|
93
|
+
}
|
|
94
|
+
// Ensure agent directory exists
|
|
95
|
+
const agentDir = path.join(cwd, agentConfig.directory);
|
|
96
|
+
await (0, copy_1.ensureAgentDirectory)(agentDir);
|
|
97
|
+
// Check if skill already exists and remove it (silent overwrite)
|
|
98
|
+
if (await (0, copy_1.skillExists)(agentDir, selectedSkill.name)) {
|
|
99
|
+
// console.log(`ℹ️ Skill "${selectedSkill.name}" already exists, overwriting...`); // Silent as requested
|
|
100
|
+
await (0, copy_1.removeSkill)(agentDir, selectedSkill.name);
|
|
101
|
+
}
|
|
102
|
+
// Confirm action (Removed as per user request)
|
|
103
|
+
const targetPath = path.join(cwd, agentConfig.directory, 'skills', selectedSkill.name);
|
|
104
|
+
console.log(`\n📦 Copying .md files to: ${targetPath}`);
|
|
105
|
+
/*
|
|
106
|
+
const confirmed = await confirmAction('Continue?');
|
|
107
|
+
if (!confirmed) {
|
|
108
|
+
console.log('❌ Cancelled');
|
|
109
|
+
process.exit(0);
|
|
110
|
+
}
|
|
111
|
+
*/
|
|
112
|
+
// Copy skill with transformation
|
|
113
|
+
await (0, copy_1.copySkill)(selectedSkill.path, agentDir, selectedSkill.name, async (content, filePath) => {
|
|
114
|
+
const sourcePath = path.join(selectedSkill.path, filePath);
|
|
115
|
+
return new file_builder_1.FileBuilder({
|
|
116
|
+
agent: agentType,
|
|
117
|
+
content,
|
|
118
|
+
agentDir,
|
|
119
|
+
source: sourcePath,
|
|
120
|
+
})
|
|
121
|
+
.include()
|
|
122
|
+
.code()
|
|
123
|
+
.build();
|
|
124
|
+
});
|
|
125
|
+
console.log(`\n✅ Successfully added skill "${selectedSkill.name}" to ${agentConfig.displayName}!`);
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
console.error(`\n❌ Error: ${error instanceof Error ? error.message : error}`);
|
|
129
|
+
process.exit(1);
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=add.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interactive.d.ts","sourceRoot":"","sources":["../../src/commands/interactive.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,QA+JlD"}
|
|
@@ -0,0 +1,176 @@
|
|
|
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
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.interactiveCommand = interactiveCommand;
|
|
40
|
+
const path = __importStar(require("path"));
|
|
41
|
+
const inquirer_1 = __importDefault(require("inquirer"));
|
|
42
|
+
const prompts_1 = require("../utils/prompts");
|
|
43
|
+
const copy_1 = require("../utils/copy");
|
|
44
|
+
const types_1 = require("../types");
|
|
45
|
+
function interactiveCommand(program) {
|
|
46
|
+
program
|
|
47
|
+
.action(async () => {
|
|
48
|
+
try {
|
|
49
|
+
const cwd = process.cwd();
|
|
50
|
+
// Check if we're in a valid project
|
|
51
|
+
if (!(await (0, copy_1.isValidProject)(cwd))) {
|
|
52
|
+
console.error('❌ Error: Not in a valid project directory (no package.json found)');
|
|
53
|
+
process.exit(1);
|
|
54
|
+
}
|
|
55
|
+
// 1. Ask what to add
|
|
56
|
+
const actionType = await (0, prompts_1.promptForActionType)();
|
|
57
|
+
// 2. Ask for platform
|
|
58
|
+
const platform = await (0, prompts_1.promptForAgent)();
|
|
59
|
+
// Validate platform type
|
|
60
|
+
if (!types_1.AGENT_CONFIGS[platform]) {
|
|
61
|
+
console.error(`❌ Invalid platform type: ${platform}`);
|
|
62
|
+
process.exit(1);
|
|
63
|
+
}
|
|
64
|
+
const agentConfig = types_1.AGENT_CONFIGS[platform];
|
|
65
|
+
const agentDir = path.join(cwd, agentConfig.directory);
|
|
66
|
+
await (0, copy_1.ensureAgentDirectory)(agentDir);
|
|
67
|
+
// 3. Handle based on action type
|
|
68
|
+
if (actionType === 'skill') {
|
|
69
|
+
// Get skills directory from templates
|
|
70
|
+
const skillsDir = path.join(__dirname, '../templates/skills');
|
|
71
|
+
const availableSkills = await (0, copy_1.getAvailableSkills)(skillsDir);
|
|
72
|
+
if (availableSkills.length === 0) {
|
|
73
|
+
console.error('❌ No skills found in the package');
|
|
74
|
+
process.exit(1);
|
|
75
|
+
}
|
|
76
|
+
// Prompt for multiple skills with checkbox
|
|
77
|
+
const selectedSkills = await (0, prompts_1.promptForMultipleSkills)(availableSkills);
|
|
78
|
+
console.log(`\n📦 Adding ${selectedSkills.length} skill(s) to ${agentConfig.displayName}...\n`);
|
|
79
|
+
// Process each selected skill
|
|
80
|
+
for (const skill of selectedSkills) {
|
|
81
|
+
// Check if skill already exists and remove it (silent overwrite)
|
|
82
|
+
if (await (0, copy_1.skillExists)(agentDir, skill.name)) {
|
|
83
|
+
await (0, copy_1.removeSkill)(agentDir, skill.name);
|
|
84
|
+
}
|
|
85
|
+
const targetPath = path.join(cwd, agentConfig.directory, 'skills', skill.name);
|
|
86
|
+
// Copy skill with FileBuilder processing
|
|
87
|
+
await (0, copy_1.copySkill)(skill.path, agentDir, skill.name, platform);
|
|
88
|
+
}
|
|
89
|
+
console.log(`✅ Successfully added ${selectedSkills.length} skill(s)!`);
|
|
90
|
+
}
|
|
91
|
+
else if (actionType === 'command') {
|
|
92
|
+
// Get available command templates
|
|
93
|
+
const commandsDir = path.join(__dirname, '../templates/commands');
|
|
94
|
+
const availableCommands = await (0, copy_1.getAvailableCommands)(commandsDir);
|
|
95
|
+
if (availableCommands.length === 0) {
|
|
96
|
+
console.error('❌ No command templates found');
|
|
97
|
+
process.exit(1);
|
|
98
|
+
}
|
|
99
|
+
// Prompt for multiple commands with checkbox
|
|
100
|
+
const choices = availableCommands.map((cmd) => ({
|
|
101
|
+
name: cmd.description ? `${cmd.name} - ${cmd.description}` : cmd.name,
|
|
102
|
+
value: cmd,
|
|
103
|
+
}));
|
|
104
|
+
const { selectedCommands } = await inquirer_1.default.prompt([
|
|
105
|
+
{
|
|
106
|
+
type: 'checkbox',
|
|
107
|
+
name: 'selectedCommands',
|
|
108
|
+
message: 'Select commands to add (use space to select, enter to confirm):',
|
|
109
|
+
choices,
|
|
110
|
+
validate: (answer) => {
|
|
111
|
+
if (answer.length < 1) {
|
|
112
|
+
return 'You must choose at least one command.';
|
|
113
|
+
}
|
|
114
|
+
return true;
|
|
115
|
+
},
|
|
116
|
+
},
|
|
117
|
+
]);
|
|
118
|
+
console.log(`\n📦 Adding ${selectedCommands.length} command(s) to ${agentConfig.displayName}...\n`);
|
|
119
|
+
// Process each selected command
|
|
120
|
+
for (const cmd of selectedCommands) {
|
|
121
|
+
if (await (0, copy_1.commandExists)(agentDir, cmd.name, platform)) {
|
|
122
|
+
console.log(` ⚠️ Command "${cmd.name}" already exists, skipping...`);
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
// Copy command template with FileBuilder processing
|
|
126
|
+
await (0, copy_1.copyCommand)(cmd.path, agentDir, cmd.name, platform);
|
|
127
|
+
}
|
|
128
|
+
console.log(`✅ Successfully added ${selectedCommands.length} command(s)!`);
|
|
129
|
+
}
|
|
130
|
+
else if (actionType === 'agent') {
|
|
131
|
+
// Get available agent templates
|
|
132
|
+
const agentsDir = path.join(__dirname, '../templates/agents');
|
|
133
|
+
const availableAgents = await (0, copy_1.getAvailableAgents)(agentsDir);
|
|
134
|
+
if (availableAgents.length === 0) {
|
|
135
|
+
console.error('❌ No agent templates found');
|
|
136
|
+
process.exit(1);
|
|
137
|
+
}
|
|
138
|
+
// Prompt for multiple agents with checkbox
|
|
139
|
+
const choices = availableAgents.map((agent) => ({
|
|
140
|
+
name: agent.description ? `${agent.name} - ${agent.description}` : agent.name,
|
|
141
|
+
value: agent,
|
|
142
|
+
}));
|
|
143
|
+
const { selectedAgents } = await inquirer_1.default.prompt([
|
|
144
|
+
{
|
|
145
|
+
type: 'checkbox',
|
|
146
|
+
name: 'selectedAgents',
|
|
147
|
+
message: 'Select agents to add (use space to select, enter to confirm):',
|
|
148
|
+
choices,
|
|
149
|
+
validate: (answer) => {
|
|
150
|
+
if (answer.length < 1) {
|
|
151
|
+
return 'You must choose at least one agent.';
|
|
152
|
+
}
|
|
153
|
+
return true;
|
|
154
|
+
},
|
|
155
|
+
},
|
|
156
|
+
]);
|
|
157
|
+
console.log(`\n📦 Adding ${selectedAgents.length} agent(s) to ${agentConfig.displayName}...\n`);
|
|
158
|
+
// Process each selected agent
|
|
159
|
+
for (const agent of selectedAgents) {
|
|
160
|
+
if (await (0, copy_1.agentExists)(agentDir, agent.name)) {
|
|
161
|
+
console.log(` ⚠️ Agent "${agent.name}" already exists, skipping...`);
|
|
162
|
+
continue;
|
|
163
|
+
}
|
|
164
|
+
// Copy agent template with FileBuilder processing
|
|
165
|
+
await (0, copy_1.copyAgent)(agent.path, agentDir, agent.name, platform);
|
|
166
|
+
}
|
|
167
|
+
console.log(`✅ Successfully added ${selectedAgents.length} agent(s)!`);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
catch (error) {
|
|
171
|
+
console.error(`❌ Error: ${error instanceof Error ? error.message : error}`);
|
|
172
|
+
process.exit(1);
|
|
173
|
+
}
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=interactive.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interactive.js","sourceRoot":"","sources":["../../src/commands/interactive.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
const commander_1 = require("commander");
|
|
5
|
+
const add_skill_1 = require("./commands/add-skill");
|
|
6
|
+
const add_command_1 = require("./commands/add-command");
|
|
7
|
+
const add_agent_1 = require("./commands/add-agent");
|
|
8
|
+
const interactive_1 = require("./commands/interactive");
|
|
9
|
+
const package_json_1 = require("../package.json");
|
|
10
|
+
const program = new commander_1.Command();
|
|
11
|
+
program
|
|
12
|
+
.name('xo-agent')
|
|
13
|
+
.description('CLI tool to manage AI agent projects (skills, commands, agents)')
|
|
14
|
+
.version(package_json_1.version);
|
|
15
|
+
// Register commands
|
|
16
|
+
(0, add_skill_1.addSkillCommand)(program);
|
|
17
|
+
(0, add_command_1.addCommandCommand)(program);
|
|
18
|
+
(0, add_agent_1.addAgentCommand)(program);
|
|
19
|
+
// Set interactive as default action (when no command specified)
|
|
20
|
+
(0, interactive_1.interactiveCommand)(program);
|
|
21
|
+
program.parse(process.argv);
|
|
22
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AACA,yCAAoC;AACpC,oDAAuD;AACvD,wDAA2D;AAC3D,oDAAuD;AACvD,wDAA4D;AAC5D,kDAA0C;AAE1C,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,UAAU,CAAC;KAChB,WAAW,CAAC,iEAAiE,CAAC;KAC9E,OAAO,CAAC,sBAAO,CAAC,CAAC;AAEpB,oBAAoB;AACpB,IAAA,2BAAe,EAAC,OAAO,CAAC,CAAC;AACzB,IAAA,+BAAiB,EAAC,OAAO,CAAC,CAAC;AAC3B,IAAA,2BAAe,EAAC,OAAO,CAAC,CAAC;AAEzB,gEAAgE;AAChE,IAAA,gCAAkB,EAAC,OAAO,CAAC,CAAC;AAE5B,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Example Skill
|
|
3
|
+
description: This is an example skill template
|
|
4
|
+
category: example
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Example Skill
|
|
8
|
+
|
|
9
|
+
This is an example skill that demonstrates the structure of a skill file.
|
|
10
|
+
|
|
11
|
+
## Usage
|
|
12
|
+
|
|
13
|
+
Add your skill documentation here.
|
|
14
|
+
|
|
15
|
+
## Features
|
|
16
|
+
|
|
17
|
+
- Feature 1
|
|
18
|
+
- Feature 2
|
|
19
|
+
- Feature 3
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: code-reviewer
|
|
3
|
+
description: Automated code review agent for pull requests
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Code Reviewer Agent
|
|
7
|
+
|
|
8
|
+
An intelligent sub-agent specialized in reviewing code changes, identifying potential issues, and suggesting improvements.
|
|
9
|
+
|
|
10
|
+
## Purpose
|
|
11
|
+
|
|
12
|
+
This agent automatically reviews pull requests and code changes to:
|
|
13
|
+
- Identify bugs and potential issues
|
|
14
|
+
- Suggest performance improvements
|
|
15
|
+
- Ensure code style consistency
|
|
16
|
+
- Check for security vulnerabilities
|
|
17
|
+
- Verify test coverage
|
|
18
|
+
|
|
19
|
+
## Capabilities
|
|
20
|
+
|
|
21
|
+
### Code Analysis
|
|
22
|
+
- Static code analysis for common patterns
|
|
23
|
+
- Complexity analysis (cyclomatic complexity)
|
|
24
|
+
- Dead code detection
|
|
25
|
+
- Unused imports and variables
|
|
26
|
+
|
|
27
|
+
### Security Review
|
|
28
|
+
- SQL injection vulnerabilities
|
|
29
|
+
- XSS vulnerabilities
|
|
30
|
+
- Insecure dependencies
|
|
31
|
+
- Hardcoded secrets detection
|
|
32
|
+
|
|
33
|
+
### Best Practices
|
|
34
|
+
- Design pattern suggestions
|
|
35
|
+
- Code organization recommendations
|
|
36
|
+
- Documentation completeness
|
|
37
|
+
- Error handling review
|
|
38
|
+
|
|
39
|
+
### Performance
|
|
40
|
+
- Algorithm efficiency analysis
|
|
41
|
+
- Memory leak detection
|
|
42
|
+
- Database query optimization
|
|
43
|
+
- Bundle size impact
|
|
44
|
+
|
|
45
|
+
## Usage
|
|
46
|
+
|
|
47
|
+
### Automatic PR Review
|
|
48
|
+
|
|
49
|
+
When a pull request is created, the agent automatically:
|
|
50
|
+
|
|
51
|
+
1. Analyzes all changed files
|
|
52
|
+
2. Runs security scans
|
|
53
|
+
3. Checks test coverage
|
|
54
|
+
4. Posts review comments
|
|
55
|
+
5. Assigns severity levels (critical/warning/suggestion)
|
|
56
|
+
|
|
57
|
+
### Manual Review
|
|
58
|
+
|
|
59
|
+
You can also trigger manual reviews:
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
xo-agent review --files src/**/*.ts
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
### Configuration
|
|
66
|
+
|
|
67
|
+
Configure review rules in `.agent/agents/code-reviewer/config.json`:
|
|
68
|
+
|
|
69
|
+
```json
|
|
70
|
+
{
|
|
71
|
+
"rules": {
|
|
72
|
+
"maxComplexity": 10,
|
|
73
|
+
"minCoverage": 80,
|
|
74
|
+
"enforceTypes": true,
|
|
75
|
+
"checkSecurity": true
|
|
76
|
+
},
|
|
77
|
+
"ignore": [
|
|
78
|
+
"**/*.test.ts",
|
|
79
|
+
"**/*.spec.ts"
|
|
80
|
+
]
|
|
81
|
+
}
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## Review Checklist
|
|
85
|
+
|
|
86
|
+
The agent follows this checklist for each review:
|
|
87
|
+
|
|
88
|
+
- [ ] Code compiles without errors
|
|
89
|
+
- [ ] All tests pass
|
|
90
|
+
- [ ] Test coverage meets threshold
|
|
91
|
+
- [ ] No security vulnerabilities
|
|
92
|
+
- [ ] Code follows style guide
|
|
93
|
+
- [ ] Documentation is updated
|
|
94
|
+
- [ ] No TODO/FIXME comments in production code
|
|
95
|
+
- [ ] Error handling is appropriate
|
|
96
|
+
- [ ] Performance impact is acceptable
|
|
97
|
+
|
|
98
|
+
## Integration
|
|
99
|
+
|
|
100
|
+
Works with:
|
|
101
|
+
- GitHub Pull Requests
|
|
102
|
+
- GitLab Merge Requests
|
|
103
|
+
- Bitbucket Pull Requests
|
|
104
|
+
- Local git hooks (pre-commit)
|
|
105
|
+
|
|
106
|
+
## Examples
|
|
107
|
+
|
|
108
|
+
### Example Review Comment
|
|
109
|
+
|
|
110
|
+
```
|
|
111
|
+
⚠️ Warning: High Complexity Detected
|
|
112
|
+
|
|
113
|
+
File: src/utils/parser.ts
|
|
114
|
+
Line: 45
|
|
115
|
+
Complexity: 15 (threshold: 10)
|
|
116
|
+
|
|
117
|
+
Suggestion: Consider breaking this function into smaller,
|
|
118
|
+
more focused functions.
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### Example Security Alert
|
|
122
|
+
|
|
123
|
+
```
|
|
124
|
+
🔴 Critical: Potential SQL Injection
|
|
125
|
+
|
|
126
|
+
File: src/database/queries.ts
|
|
127
|
+
Line: 23
|
|
128
|
+
|
|
129
|
+
Issue: User input is directly concatenated into SQL query.
|
|
130
|
+
|
|
131
|
+
Fix: Use parameterized queries instead:
|
|
132
|
+
// Bad
|
|
133
|
+
const query = `SELECT * FROM users WHERE id = ${userId}`;
|
|
134
|
+
|
|
135
|
+
// Good
|
|
136
|
+
const query = 'SELECT * FROM users WHERE id = ?';
|
|
137
|
+
db.query(query, [userId]);
|
|
138
|
+
```
|