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.
Files changed (64) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +159 -0
  3. package/bin/cli.js +2 -0
  4. package/dist/commands/add-agent.d.ts +3 -0
  5. package/dist/commands/add-agent.d.ts.map +1 -0
  6. package/dist/commands/add-agent.js +114 -0
  7. package/dist/commands/add-agent.js.map +1 -0
  8. package/dist/commands/add-command.d.ts +3 -0
  9. package/dist/commands/add-command.d.ts.map +1 -0
  10. package/dist/commands/add-command.js +114 -0
  11. package/dist/commands/add-command.js.map +1 -0
  12. package/dist/commands/add-skill.d.ts +3 -0
  13. package/dist/commands/add-skill.d.ts.map +1 -0
  14. package/dist/commands/add-skill.js +108 -0
  15. package/dist/commands/add-skill.js.map +1 -0
  16. package/dist/commands/add.d.ts +3 -0
  17. package/dist/commands/add.d.ts.map +1 -0
  18. package/dist/commands/add.js +133 -0
  19. package/dist/commands/add.js.map +1 -0
  20. package/dist/commands/interactive.d.ts +3 -0
  21. package/dist/commands/interactive.d.ts.map +1 -0
  22. package/dist/commands/interactive.js +176 -0
  23. package/dist/commands/interactive.js.map +1 -0
  24. package/dist/index.d.ts +3 -0
  25. package/dist/index.d.ts.map +1 -0
  26. package/dist/index.js +22 -0
  27. package/dist/index.js.map +1 -0
  28. package/dist/skills/example-skill/SKILL.md +19 -0
  29. package/dist/templates/agents/code-reviewer/AGENT.md +138 -0
  30. package/dist/templates/agents/documentation-writer/AGENT.md +179 -0
  31. package/dist/templates/commands/deploy.md +52 -0
  32. package/dist/templates/commands/test.md +49 -0
  33. package/dist/templates/skills/example-skill/SKILL.md +19 -0
  34. package/dist/templates/skills/example-skill/references/reference.md +0 -0
  35. package/dist/templates/skills/example-skill/scripts/script.py +0 -0
  36. package/dist/types.d.ts +13 -0
  37. package/dist/types.d.ts.map +1 -0
  38. package/dist/types.js +16 -0
  39. package/dist/types.js.map +1 -0
  40. package/dist/utils/constants.d.ts +13 -0
  41. package/dist/utils/constants.d.ts.map +1 -0
  42. package/dist/utils/constants.js +16 -0
  43. package/dist/utils/constants.js.map +1 -0
  44. package/dist/utils/copy.d.ts +55 -0
  45. package/dist/utils/copy.d.ts.map +1 -0
  46. package/dist/utils/copy.js +229 -0
  47. package/dist/utils/copy.js.map +1 -0
  48. package/dist/utils/evaluate.d.ts +10 -0
  49. package/dist/utils/evaluate.d.ts.map +1 -0
  50. package/dist/utils/evaluate.js +28 -0
  51. package/dist/utils/evaluate.js.map +1 -0
  52. package/dist/utils/file-builder.d.ts +28 -0
  53. package/dist/utils/file-builder.d.ts.map +1 -0
  54. package/dist/utils/file-builder.js +106 -0
  55. package/dist/utils/file-builder.js.map +1 -0
  56. package/dist/utils/prompts.d.ts +12 -0
  57. package/dist/utils/prompts.d.ts.map +1 -0
  58. package/dist/utils/prompts.js +152 -0
  59. package/dist/utils/prompts.js.map +1 -0
  60. package/dist/utils/transform.d.ts +11 -0
  61. package/dist/utils/transform.d.ts.map +1 -0
  62. package/dist/utils/transform.js +43 -0
  63. package/dist/utils/transform.js.map +1 -0
  64. 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,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function interactiveCommand(program: Command): void;
3
+ //# sourceMappingURL=interactive.d.ts.map
@@ -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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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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
+ ```