@amrhas82/agentic-kit 2.3.0 → 2.3.2

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
@@ -451,7 +451,7 @@ ${colors.bright}${colors.cyan}██╔══██║██║ ██║█
451
451
  ${colors.bright}${colors.cyan}██║ ██║╚██████╔╝███████╗██║ ╚████║ ██║ ██║╚██████╗ ██║ ██╗██║ ██║${colors.reset}
452
452
  ${colors.bright}${colors.cyan}╚═╝ ╚═╝ ╚═════╝ ╚══════╝╚═╝ ╚═══╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝${colors.reset}
453
453
 
454
- ${colors.bright}v2.3.0 | 11 agents + 20 commands per tool${colors.reset}
454
+ ${colors.bright}v2.3.2 | 11 agents + 20 commands per tool${colors.reset}
455
455
  `);
456
456
  }
457
457
 
@@ -250,6 +250,38 @@ class InstallationEngine {
250
250
  }
251
251
  }
252
252
 
253
+ // Collect all command files (for opencode/droid which use commands instead of skills)
254
+ for (const commandPath of (packageContents.commands || [])) {
255
+ const stat = await fs.promises.stat(commandPath);
256
+ if (stat.isDirectory()) {
257
+ // Command subdirectory (like docs-builder/)
258
+ const baseRelativePath = path.relative(sourceBase, commandPath);
259
+ const commandFiles = await collectDirectoryFiles(commandPath, baseRelativePath);
260
+ for (const file of commandFiles) {
261
+ filesToCopy.push({
262
+ sourcePath: file.sourcePath,
263
+ relativePath: file.relativePath,
264
+ size: file.size,
265
+ type: 'command'
266
+ });
267
+ totalFiles++;
268
+ totalBytes += file.size;
269
+ }
270
+ } else {
271
+ // Single command file
272
+ const relativePath = path.relative(sourceBase, commandPath);
273
+ const size = await getFileSize(commandPath);
274
+ filesToCopy.push({
275
+ sourcePath: commandPath,
276
+ relativePath: relativePath,
277
+ size: size,
278
+ type: 'command'
279
+ });
280
+ totalFiles++;
281
+ totalBytes += size;
282
+ }
283
+ }
284
+
253
285
  // Collect all resource files
254
286
  for (const resourcePath of packageContents.resources) {
255
287
  const relativePath = path.relative(sourceBase, resourcePath);
@@ -135,12 +135,13 @@ class PackageManager {
135
135
  const selected = {
136
136
  agents: [],
137
137
  skills: [],
138
+ commands: [],
138
139
  resources: [],
139
140
  hooks: []
140
141
  };
141
142
 
142
143
  // Helper function to process each content category
143
- const selectItems = (category, variantSelection, availableItems) => {
144
+ const selectItems = (category, variantSelection, availableItems, skipMissing = false) => {
144
145
  // Handle wildcard: "*" expands to all available items
145
146
  if (variantSelection === '*') {
146
147
  return [...availableItems];
@@ -153,10 +154,14 @@ class PackageManager {
153
154
  return [];
154
155
  }
155
156
 
156
- // Specific selection: validate all items exist
157
+ // Specific selection: validate all items exist (unless skipMissing)
157
158
  const selectedItems = [];
158
159
  for (const item of variantSelection) {
159
160
  if (!availableItems.includes(item)) {
161
+ if (skipMissing) {
162
+ // Skip missing items silently (e.g., removed commands like subagent-spawning)
163
+ continue;
164
+ }
160
165
  throw new Error(
161
166
  `Item '${item}' specified in ${variant} variant ${category} not found in available content. ` +
162
167
  `Available ${category}: ${availableItems.join(', ')}`
@@ -174,6 +179,7 @@ class PackageManager {
174
179
  // Process each content category
175
180
  selected.agents = selectItems('agents', variantConfig.agents, availableContent.agents || []);
176
181
  selected.skills = selectItems('skills', variantConfig.skills, availableContent.skills || []);
182
+ selected.commands = selectItems('commands', variantConfig.commands, availableContent.commands || [], true);
177
183
  selected.resources = selectItems('resources', variantConfig.resources, availableContent.resources || []);
178
184
  selected.hooks = selectItems('hooks', variantConfig.hooks, availableContent.hooks || []);
179
185
 
@@ -208,7 +214,7 @@ class PackageManager {
208
214
  throw new Error(`Package not found: ${toolId}`);
209
215
  }
210
216
 
211
- // Get all available content from the package
217
+ // Get all available content from the package (includes dynamic directory names)
212
218
  const availableContent = await this.getAvailableContent(packageDir);
213
219
 
214
220
  // Use selectVariantContent to filter based on variant configuration
@@ -218,14 +224,16 @@ class PackageManager {
218
224
  const contents = {
219
225
  agents: [],
220
226
  skills: [],
227
+ commands: [],
221
228
  resources: [],
222
229
  hooks: [],
223
230
  totalFiles: 0,
224
231
  totalSize: 0
225
232
  };
226
233
 
227
- // Build file paths for selected agents
228
- const agentsDir = path.join(packageDir, 'agents');
234
+ // Build file paths for selected agents (use dynamic directory name)
235
+ const agentsDirName = availableContent.agentsDir || 'agents';
236
+ const agentsDir = path.join(packageDir, agentsDirName);
229
237
  if (fs.existsSync(agentsDir)) {
230
238
  for (const agent of selectedContent.agents) {
231
239
  const agentPath = path.join(agentsDir, `${agent}.md`);
@@ -248,6 +256,23 @@ class PackageManager {
248
256
  }
249
257
  }
250
258
 
259
+ // Build file paths for selected commands (use dynamic directory name)
260
+ const commandsDirName = availableContent.commandsDir || 'commands';
261
+ const commandsDir = path.join(packageDir, commandsDirName);
262
+ if (fs.existsSync(commandsDir) && selectedContent.commands) {
263
+ for (const command of selectedContent.commands) {
264
+ const commandPath = path.join(commandsDir, `${command}.md`);
265
+ if (fs.existsSync(commandPath)) {
266
+ contents.commands.push(commandPath);
267
+ }
268
+ // Also check for command subdirectories (like docs-builder/templates.md)
269
+ const commandSubDir = path.join(commandsDir, command);
270
+ if (fs.existsSync(commandSubDir) && fs.statSync(commandSubDir).isDirectory()) {
271
+ contents.commands.push(commandSubDir);
272
+ }
273
+ }
274
+ }
275
+
251
276
  // Build file paths for selected resources
252
277
  const resourcesDir = path.join(packageDir, 'resources');
253
278
  if (fs.existsSync(resourcesDir)) {
@@ -273,6 +298,7 @@ class PackageManager {
273
298
  // Calculate total files
274
299
  contents.totalFiles = contents.agents.length +
275
300
  contents.skills.length +
301
+ contents.commands.length +
276
302
  contents.resources.length +
277
303
  contents.hooks.length;
278
304
 
@@ -284,8 +310,8 @@ class PackageManager {
284
310
  * Helper method for getPackageContents
285
311
  */
286
312
  async getAvailableContent(packageDir) {
287
- const getItemsInDir = async (dir) => {
288
- if (!fs.existsSync(dir)) return [];
313
+ const getItemsInDir = async (dir, isAgentDir = false) => {
314
+ if (!fs.existsSync(dir)) return { items: [], dirName: null };
289
315
  const items = await fs.promises.readdir(dir);
290
316
  const result = [];
291
317
 
@@ -295,7 +321,7 @@ class PackageManager {
295
321
 
296
322
  if (stat.isFile()) {
297
323
  // For agents, strip the .md extension
298
- if (dir.includes('agents')) {
324
+ if (isAgentDir) {
299
325
  result.push(item.replace('.md', ''));
300
326
  } else if (dir.includes('resources') || dir.includes('hooks')) {
301
327
  // For resources and hooks, keep the full filename
@@ -308,14 +334,30 @@ class PackageManager {
308
334
  }
309
335
  }
310
336
 
311
- return result;
337
+ return { items: result, dirName: path.basename(dir) };
312
338
  };
313
339
 
340
+ // Check for both plural and singular directory names
341
+ const agentsDir = fs.existsSync(path.join(packageDir, 'agents')) ? 'agents' :
342
+ fs.existsSync(path.join(packageDir, 'agent')) ? 'agent' :
343
+ fs.existsSync(path.join(packageDir, 'droids')) ? 'droids' : 'agents';
344
+ const commandsDir = fs.existsSync(path.join(packageDir, 'commands')) ? 'commands' :
345
+ fs.existsSync(path.join(packageDir, 'command')) ? 'command' : 'commands';
346
+
347
+ const agentsResult = await getItemsInDir(path.join(packageDir, agentsDir), true);
348
+ const skillsResult = await getItemsInDir(path.join(packageDir, 'skills'));
349
+ const commandsResult = await getItemsInDir(path.join(packageDir, commandsDir), true);
350
+ const resourcesResult = await getItemsInDir(path.join(packageDir, 'resources'));
351
+ const hooksResult = await getItemsInDir(path.join(packageDir, 'hooks'));
352
+
314
353
  return {
315
- agents: await getItemsInDir(path.join(packageDir, 'agents')),
316
- skills: await getItemsInDir(path.join(packageDir, 'skills')),
317
- resources: await getItemsInDir(path.join(packageDir, 'resources')),
318
- hooks: await getItemsInDir(path.join(packageDir, 'hooks'))
354
+ agents: agentsResult.items,
355
+ agentsDir: agentsDir,
356
+ skills: skillsResult.items,
357
+ commands: commandsResult.items,
358
+ commandsDir: commandsDir,
359
+ resources: resourcesResult.items,
360
+ hooks: hooksResult.items
319
361
  };
320
362
  }
321
363
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@amrhas82/agentic-kit",
3
- "version": "2.3.0",
3
+ "version": "2.3.2",
4
4
  "description": "AI development toolkit with 11 specialized agents and 20 commands. Simple one-question installer for Claude, Opencode, Ampcode, and Droid.",
5
5
  "main": "index.js",
6
6
  "bin": {
@@ -67,6 +67,7 @@
67
67
  "files": [
68
68
  "installer/",
69
69
  "packages/",
70
+ "tools/",
70
71
  "docs/",
71
72
  "cli.js",
72
73
  "index.js",
@@ -8,7 +8,6 @@
8
8
  "1-create-prd",
9
9
  "2-generate-tasks",
10
10
  "3-process-task-list",
11
- "master",
12
11
  "context-builder"
13
12
  ],
14
13
  "commands": [
@@ -26,15 +25,13 @@
26
25
  "security",
27
26
  "ship",
28
27
  "skill-creator",
29
- "subagent-spawning",
28
+ "stash",
30
29
  "systematic-debugging",
31
30
  "test-driven-development",
32
31
  "test-generate",
33
32
  "testing-anti-patterns",
34
33
  "verification-before-completion"
35
- ],
36
- "resources": "*",
37
- "hooks": "*"
34
+ ]
38
35
  },
39
36
  "standard": {
40
37
  "name": "Standard",
@@ -45,7 +42,6 @@
45
42
  "1-create-prd",
46
43
  "2-generate-tasks",
47
44
  "3-process-task-list",
48
- "master",
49
45
  "orchestrator",
50
46
  "quality-assurance",
51
47
  "code-developer",
@@ -68,15 +64,13 @@
68
64
  "security",
69
65
  "ship",
70
66
  "skill-creator",
71
- "subagent-spawning",
67
+ "stash",
72
68
  "systematic-debugging",
73
69
  "test-driven-development",
74
70
  "test-generate",
75
71
  "testing-anti-patterns",
76
72
  "verification-before-completion"
77
- ],
78
- "resources": "*",
79
- "hooks": "*"
73
+ ]
80
74
  },
81
75
  "pro": {
82
76
  "name": "Pro",
@@ -84,8 +78,6 @@
84
78
  "useCase": "Full-featured installation for users needing all AI codegen, document processing, testing, debugging, and creative capabilities",
85
79
  "targetUsers": "Power users, enterprises, teams requiring comprehensive feature set",
86
80
  "agents": "*",
87
- "commands": "*",
88
- "resources": "*",
89
- "hooks": "*"
81
+ "commands": "*"
90
82
  }
91
83
  }
@@ -8,7 +8,6 @@
8
8
  "1-create-prd",
9
9
  "2-generate-tasks",
10
10
  "3-process-task-list",
11
- "master",
12
11
  "context-builder"
13
12
  ],
14
13
  "skills": [
@@ -18,7 +17,6 @@
18
17
  "docs-builder",
19
18
  "root-cause-tracing",
20
19
  "skill-creator",
21
- "subagent-spawning",
22
20
  "systematic-debugging",
23
21
  "test-driven-development",
24
22
  "testing-anti-patterns",
@@ -33,10 +31,9 @@
33
31
  "review",
34
32
  "security",
35
33
  "ship",
34
+ "stash",
36
35
  "test-generate"
37
- ],
38
- "resources": "*",
39
- "hooks": "*"
36
+ ]
40
37
  },
41
38
  "standard": {
42
39
  "name": "Standard",
@@ -47,7 +44,6 @@
47
44
  "1-create-prd",
48
45
  "2-generate-tasks",
49
46
  "3-process-task-list",
50
- "master",
51
47
  "orchestrator",
52
48
  "quality-assurance",
53
49
  "code-developer",
@@ -62,7 +58,6 @@
62
58
  "docs-builder",
63
59
  "root-cause-tracing",
64
60
  "skill-creator",
65
- "subagent-spawning",
66
61
  "systematic-debugging",
67
62
  "test-driven-development",
68
63
  "testing-anti-patterns",
@@ -77,10 +72,9 @@
77
72
  "review",
78
73
  "security",
79
74
  "ship",
75
+ "stash",
80
76
  "test-generate"
81
- ],
82
- "resources": "*",
83
- "hooks": "*"
77
+ ]
84
78
  },
85
79
  "pro": {
86
80
  "name": "Pro",
@@ -89,8 +83,6 @@
89
83
  "targetUsers": "Power users, enterprises, teams requiring comprehensive feature set",
90
84
  "agents": "*",
91
85
  "skills": "*",
92
- "commands": "*",
93
- "resources": "*",
94
- "hooks": "*"
86
+ "commands": "*"
95
87
  }
96
88
  }
@@ -8,7 +8,6 @@
8
8
  "1-create-prd",
9
9
  "2-generate-tasks",
10
10
  "3-process-task-list",
11
- "master",
12
11
  "context-builder"
13
12
  ],
14
13
  "commands": [
@@ -26,15 +25,13 @@
26
25
  "security",
27
26
  "ship",
28
27
  "skill-creator",
29
- "subagent-spawning",
28
+ "stash",
30
29
  "systematic-debugging",
31
30
  "test-driven-development",
32
31
  "test-generate",
33
32
  "testing-anti-patterns",
34
33
  "verification-before-completion"
35
- ],
36
- "resources": "*",
37
- "hooks": "*"
34
+ ]
38
35
  },
39
36
  "standard": {
40
37
  "name": "Standard",
@@ -45,7 +42,6 @@
45
42
  "1-create-prd",
46
43
  "2-generate-tasks",
47
44
  "3-process-task-list",
48
- "master",
49
45
  "orchestrator",
50
46
  "quality-assurance",
51
47
  "code-developer",
@@ -68,15 +64,13 @@
68
64
  "security",
69
65
  "ship",
70
66
  "skill-creator",
71
- "subagent-spawning",
67
+ "stash",
72
68
  "systematic-debugging",
73
69
  "test-driven-development",
74
70
  "test-generate",
75
71
  "testing-anti-patterns",
76
72
  "verification-before-completion"
77
- ],
78
- "resources": "*",
79
- "hooks": "*"
73
+ ]
80
74
  },
81
75
  "pro": {
82
76
  "name": "Pro",
@@ -84,8 +78,6 @@
84
78
  "useCase": "Full-featured installation for users needing all AI codegen, document processing, testing, debugging, and creative capabilities",
85
79
  "targetUsers": "Power users, enterprises, teams requiring comprehensive feature set",
86
80
  "agents": "*",
87
- "commands": "*",
88
- "resources": "*",
89
- "hooks": "*"
81
+ "commands": "*"
90
82
  }
91
83
  }
@@ -8,7 +8,6 @@
8
8
  "1-create-prd",
9
9
  "2-generate-tasks",
10
10
  "3-process-task-list",
11
- "master",
12
11
  "context-builder"
13
12
  ],
14
13
  "commands": [
@@ -26,15 +25,13 @@
26
25
  "security",
27
26
  "ship",
28
27
  "skill-creator",
29
- "subagent-spawning",
28
+ "stash",
30
29
  "systematic-debugging",
31
30
  "test-driven-development",
32
31
  "test-generate",
33
32
  "testing-anti-patterns",
34
33
  "verification-before-completion"
35
- ],
36
- "resources": "*",
37
- "hooks": "*"
34
+ ]
38
35
  },
39
36
  "standard": {
40
37
  "name": "Standard",
@@ -45,7 +42,6 @@
45
42
  "1-create-prd",
46
43
  "2-generate-tasks",
47
44
  "3-process-task-list",
48
- "master",
49
45
  "orchestrator",
50
46
  "quality-assurance",
51
47
  "code-developer",
@@ -68,15 +64,13 @@
68
64
  "security",
69
65
  "ship",
70
66
  "skill-creator",
71
- "subagent-spawning",
67
+ "stash",
72
68
  "systematic-debugging",
73
69
  "test-driven-development",
74
70
  "test-generate",
75
71
  "testing-anti-patterns",
76
72
  "verification-before-completion"
77
- ],
78
- "resources": "*",
79
- "hooks": "*"
73
+ ]
80
74
  },
81
75
  "pro": {
82
76
  "name": "Pro",
@@ -84,8 +78,6 @@
84
78
  "useCase": "Full-featured installation for users needing all AI codegen, document processing, testing, debugging, and creative capabilities",
85
79
  "targetUsers": "Power users, enterprises, teams requiring comprehensive feature set",
86
80
  "agents": "*",
87
- "commands": "*",
88
- "resources": "*",
89
- "hooks": "*"
81
+ "commands": "*"
90
82
  }
91
83
  }
@@ -0,0 +1,14 @@
1
+ {
2
+ "tool": "ampcode",
3
+ "name": "Ampcode",
4
+ "description": "Amplified AI codegen workflows",
5
+ "default_path": "~/.amp",
6
+ "optimization": "amplified-codegen",
7
+ "integration_type": "cli",
8
+ "manifest_format": "ampcode-config",
9
+ "supported_variants": ["lite", "standard", "pro"],
10
+ "agent_format": "amplified-optimized",
11
+ "skill_compatibility": "ampcode-native",
12
+ "resource_format": "enhanced",
13
+ "hook_integration": "ampcode-hooks"
14
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "tool": "claude",
3
+ "name": "Claude Code",
4
+ "description": "Conversational AI development assistant",
5
+ "default_path": "~/.claude",
6
+ "optimization": "conversational-ai",
7
+ "integration_type": "plugin",
8
+ "manifest_format": "claude-plugin",
9
+ "supported_variants": ["lite", "standard", "pro"],
10
+ "agent_format": "claude-conversational",
11
+ "skill_compatibility": "claude-native",
12
+ "resource_format": "markdown",
13
+ "hook_integration": "claude-plugin"
14
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "tool": "droid",
3
+ "name": "Droid",
4
+ "description": "Mobile-focused AI codegen tool",
5
+ "default_path": "~/.factory",
6
+ "optimization": "mobile-codegen",
7
+ "integration_type": "cli",
8
+ "manifest_format": "droid-config",
9
+ "supported_variants": ["lite", "standard", "pro"],
10
+ "agent_format": "mobile-optimized",
11
+ "skill_compatibility": "droid-native",
12
+ "resource_format": "mobile-focused",
13
+ "hook_integration": "droid-hooks"
14
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "tool": "opencode",
3
+ "name": "Opencode",
4
+ "description": "CLI-based AI codegen tool",
5
+ "default_path": "~/.config/opencode",
6
+ "optimization": "cli-codegen",
7
+ "integration_type": "cli",
8
+ "manifest_format": "opencode-config",
9
+ "supported_variants": ["lite", "standard", "pro"],
10
+ "agent_format": "cli-optimized",
11
+ "skill_compatibility": "cli-native",
12
+ "resource_format": "terminal",
13
+ "hook_integration": "cli-hooks"
14
+ }