@amrhas82/agentic-kit 1.8.1 → 1.9.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/installer/cli.js CHANGED
@@ -83,8 +83,8 @@ class InteractiveInstaller {
83
83
 
84
84
  this.variants = [
85
85
  { id: 'lite', name: 'Lite', agents: 3, skills: 0, description: 'Minimal setup, CI/CD' },
86
- { id: 'standard', name: 'Standard', agents: 13, skills: 8, description: 'Most users, general dev' },
87
- { id: 'pro', name: 'Pro', agents: 13, skills: 14, description: 'Advanced users, full features' }
86
+ { id: 'standard', name: 'Standard', agents: 14, skills: 8, description: 'Most users, general dev' },
87
+ { id: 'pro', name: 'Pro', agents: 14, skills: 20, description: 'Full installation, all features' }
88
88
  ];
89
89
  }
90
90
 
@@ -198,8 +198,8 @@ ${colors.bright}TOOLS:${colors.reset}
198
198
 
199
199
  ${colors.bright}VARIANTS:${colors.reset}
200
200
  ${colors.cyan}lite${colors.reset} - Minimal setup (3 agents, 0 skills) - For CI/CD
201
- ${colors.cyan}standard${colors.reset} - Standard setup (13 agents, 8 skills) - For most users
202
- ${colors.cyan}pro${colors.reset} - Full setup (13 agents, 22 skills) - For advanced users
201
+ ${colors.cyan}standard${colors.reset} - Standard setup (14 agents, 8 skills) - For most users
202
+ ${colors.cyan}pro${colors.reset} - Full setup (14 agents, 20 commands) - Default for everyone
203
203
 
204
204
  ${colors.bright}EXAMPLES:${colors.reset}
205
205
  # Interactive installation (default)
@@ -680,10 +680,9 @@ ${colors.bright}For more information, visit:${colors.reset}
680
680
  }
681
681
 
682
682
  // Display summary
683
- const variantInfo = this.variants.find(v => v.id === variant);
684
683
  console.log(`${colors.bright}Installation Summary:${colors.reset}`);
685
- console.log(`${colors.cyan}Variant:${colors.reset} ${variantInfo.name} (${variantInfo.agents} agents, ${variantInfo.skills} skills)`);
686
- console.log(`${colors.cyan}Tools:${colors.reset} ${this.selections.tools.join(', ')}`);
684
+ console.log(`${colors.cyan}Installing:${colors.reset} ${this.selections.tools.join(', ')}`);
685
+ console.log(`${colors.cyan}Each tool includes:${colors.reset} 14 agents + 20 commands`);
687
686
  console.log('');
688
687
 
689
688
  for (const toolId of this.selections.tools) {
@@ -1107,48 +1106,89 @@ ${colors.yellow}Press Enter to begin or Ctrl+C to exit${colors.reset}
1107
1106
  }
1108
1107
 
1109
1108
  async selectTools() {
1110
- console.log(`\n${colors.bright}Which tool(s) do you want to install?${colors.reset}\n`);
1109
+ console.log(`\n${colors.bright}Select tools to install${colors.reset}\n`);
1110
+ console.log(`${colors.cyan}(↑↓ navigate, space=toggle, a=all, enter=confirm)${colors.reset}\n`);
1111
+
1112
+ // Interactive checkbox selection
1113
+ const selected = new Set(['claude']); // Default to claude
1114
+ let currentIndex = 0;
1115
+
1116
+ const renderList = () => {
1117
+ // Clear previous list
1118
+ process.stdout.write('\x1b[' + (this.tools.length + 1) + 'A'); // Move up
1119
+ process.stdout.write('\x1b[0J'); // Clear from cursor down
1120
+
1121
+ this.tools.forEach((tool, index) => {
1122
+ const isSelected = selected.has(tool.id);
1123
+ const isCurrent = index === currentIndex;
1124
+ const checkbox = isSelected ? '●' : '○';
1125
+ const pointer = isCurrent ? '»' : ' ';
1126
+ const color = isCurrent ? colors.cyan : colors.reset;
1127
+
1128
+ console.log(`${pointer} ${color}${checkbox} ${tool.name.padEnd(20)}${colors.reset} - ${tool.description}`);
1129
+ });
1130
+ console.log(''); // Empty line at bottom
1131
+ };
1111
1132
 
1112
- // Display tools in a simple list
1113
- this.tools.forEach((tool) => {
1114
- console.log(` ${colors.cyan}${tool.id.padEnd(10)}${colors.reset} - ${tool.description}`);
1115
- });
1133
+ // Initial render
1134
+ this.tools.forEach((tool, index) => {
1135
+ const isSelected = selected.has(tool.id);
1136
+ const isCurrent = index === currentIndex;
1137
+ const checkbox = isSelected ? '●' : '○';
1138
+ const pointer = isCurrent ? '»' : ' ';
1139
+ const color = isCurrent ? colors.cyan : colors.reset;
1116
1140
 
1117
- console.log(`\n${colors.yellow}Enter tool IDs separated by spaces (e.g., "claude opencode")${colors.reset}`);
1118
- console.log(`${colors.yellow}Default: claude${colors.reset}`);
1141
+ console.log(`${pointer} ${color}${checkbox} ${tool.name.padEnd(20)}${colors.reset} - ${tool.description}`);
1142
+ });
1143
+ console.log('');
1119
1144
 
1120
- return new Promise(resolve => {
1121
- this.rl.question(`\n${colors.bright}Tools:${colors.reset} `, (answer) => {
1122
- if (answer.trim()) {
1123
- const selected = answer.toLowerCase().split(/\s+/);
1124
- this.selections.tools = selected.filter(id =>
1125
- this.tools.some(tool => tool.id === id)
1126
- );
1145
+ return new Promise((resolve) => {
1146
+ const stdin = process.stdin;
1147
+ stdin.setRawMode(true);
1148
+ stdin.resume();
1149
+ stdin.setEncoding('utf8');
1150
+
1151
+ const onKeypress = (key) => {
1152
+ if (key === '\u0003' || key === '\u001b') { // Ctrl+C or ESC
1153
+ stdin.setRawMode(false);
1154
+ stdin.pause();
1155
+ process.exit(0);
1156
+ } else if (key === '\r' || key === '\n') { // Enter
1157
+ stdin.setRawMode(false);
1158
+ stdin.removeListener('data', onKeypress);
1159
+
1160
+ this.selections.tools = Array.from(selected);
1161
+
1162
+ // Show selection summary
1163
+ console.log(`${colors.green}Installing ${this.selections.tools.length} tool(s):${colors.reset}`);
1164
+ this.selections.tools.forEach(id => {
1165
+ const tool = this.tools.find(t => t.id === id);
1166
+ console.log(` ${colors.green}✓${colors.reset} ${tool.name} ${colors.cyan}(14 agents + 20 commands)${colors.reset}`);
1167
+ });
1168
+ console.log('');
1127
1169
 
1128
- // Show invalid tool IDs if any
1129
- const invalid = selected.filter(id =>
1130
- !this.tools.some(tool => tool.id === id)
1131
- );
1132
- if (invalid.length > 0) {
1133
- console.log(`${colors.yellow}Warning: Unrecognized tool IDs ignored: ${invalid.join(', ')}${colors.reset}`);
1170
+ resolve();
1171
+ } else if (key === ' ') { // Space - toggle
1172
+ const toolId = this.tools[currentIndex].id;
1173
+ if (selected.has(toolId)) {
1174
+ selected.delete(toolId);
1175
+ } else {
1176
+ selected.add(toolId);
1134
1177
  }
1178
+ renderList();
1179
+ } else if (key === 'a' || key === 'A') { // Select all
1180
+ this.tools.forEach(tool => selected.add(tool.id));
1181
+ renderList();
1182
+ } else if (key === '\u001b[A') { // Up arrow
1183
+ currentIndex = currentIndex > 0 ? currentIndex - 1 : this.tools.length - 1;
1184
+ renderList();
1185
+ } else if (key === '\u001b[B') { // Down arrow
1186
+ currentIndex = currentIndex < this.tools.length - 1 ? currentIndex + 1 : 0;
1187
+ renderList();
1135
1188
  }
1189
+ };
1136
1190
 
1137
- // Default to claude if nothing selected
1138
- if (this.selections.tools.length === 0) {
1139
- this.selections.tools = ['claude'];
1140
- console.log(`${colors.blue}Using default: claude${colors.reset}`);
1141
- }
1142
-
1143
- // Show selection summary
1144
- console.log(`\n${colors.green}Installing:${colors.reset}`);
1145
- this.selections.tools.forEach(id => {
1146
- const tool = this.tools.find(t => t.id === id);
1147
- console.log(` ${colors.green}✓${colors.reset} ${tool.name} ${colors.cyan}(14 agents + 20 commands)${colors.reset}`);
1148
- });
1149
-
1150
- resolve();
1151
- });
1191
+ stdin.on('data', onKeypress);
1152
1192
  });
1153
1193
  }
1154
1194
 
@@ -1345,11 +1385,10 @@ ${colors.yellow}Press Enter to begin or Ctrl+C to exit${colors.reset}
1345
1385
  async showSummary() {
1346
1386
  console.log(`\n${colors.bright}Step 4/4 — Installation Summary${colors.reset}\n`);
1347
1387
 
1348
- const variant = this.variants.find(v => v.id === this.selections.variant);
1349
- console.log(`Package: ${variant.name} (${variant.agents} agents, ${variant.skills} skills)`);
1350
- console.log(`Tools: ${this.selections.tools.map(id =>
1388
+ console.log(`Installing: ${this.selections.tools.map(id =>
1351
1389
  this.tools.find(t => t.id === id).name
1352
- ).join(', ')}\n`);
1390
+ ).join(', ')}`);
1391
+ console.log(`Each tool includes: 14 agents + 20 commands\n`);
1353
1392
 
1354
1393
  console.log('Installation Details:');
1355
1394
  console.log('┌─────────────┬──────────────────┬──────────┬─────────────┐');
@@ -73,9 +73,10 @@ class PackageManager {
73
73
  }
74
74
 
75
75
  // Validate each variant has required fields
76
+ // Note: 'skills' is optional (some tools only have commands)
76
77
  for (const variant of requiredVariants) {
77
78
  const variantConfig = config[variant];
78
- const requiredFields = ['name', 'description', 'agents', 'skills', 'resources', 'hooks'];
79
+ const requiredFields = ['name', 'description', 'agents', 'resources', 'hooks'];
79
80
 
80
81
  for (const field of requiredFields) {
81
82
  if (variantConfig[field] === undefined) {
@@ -486,7 +487,8 @@ class PackageManager {
486
487
  }
487
488
 
488
489
  // Check 5: Each variant has required fields
489
- const requiredFields = ['name', 'description', 'agents', 'skills', 'resources', 'hooks'];
490
+ // Note: 'skills' is optional (some tools only have commands)
491
+ const requiredFields = ['name', 'description', 'agents', 'resources', 'hooks'];
490
492
  for (const reqVariant of requiredVariants) {
491
493
  const variantConfig = config[reqVariant];
492
494
  for (const field of requiredFields) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@amrhas82/agentic-kit",
3
- "version": "1.8.1",
3
+ "version": "1.9.1",
4
4
  "description": "AI development toolkit with 14 specialized agents and 20 commands. Simple one-question installer for Claude, Opencode, Ampcode, and Droid.",
5
5
  "main": "index.js",
6
6
  "bin": {