@ngxtm/devkit 2.0.0 → 2.0.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/cli/config.js CHANGED
@@ -8,130 +8,188 @@
8
8
  */
9
9
 
10
10
  // Core skills that are always installed with --minimal
11
- // These are reference/best-practice skills, not commands
11
+ // Using exact directory names for accurate matching
12
12
  const MINIMAL_SKILLS = [
13
13
  // Best practices
14
14
  'react-best-practices',
15
- 'typescript-best-practices',
15
+ 'typescript-expert',
16
+ 'typescript-pro',
16
17
  'postgres-best-practices',
17
18
  'api-security-best-practices',
19
+ 'nodejs-best-practices',
18
20
  // Core workflows
19
- 'git-commit',
20
21
  'code-review',
21
22
  'debugging',
22
- 'testing',
23
- 'refactoring',
23
+ 'testing-patterns',
24
+ 'code-refactoring',
24
25
  // Architecture
25
26
  'api-patterns',
26
27
  'architecture',
27
28
  'clean-code',
29
+ 'software-architecture',
28
30
  // Operations
29
- 'documentation',
30
- 'error-handling',
31
- 'logging',
32
- 'performance-optimization',
33
- 'security-best-practices',
31
+ 'code-documentation',
32
+ 'performance-profiling',
34
33
  // AI/MCP
35
34
  'mcp-management',
36
- 'sequential-thinking'
35
+ 'sequential-thinking',
36
+ // Git
37
+ 'git-pushing'
37
38
  ];
38
39
 
39
40
  // Skill categories for --category option
41
+ // Using patterns that match actual directory names
40
42
  const SKILL_CATEGORIES = {
41
43
  'react': [
42
44
  'react-best-practices',
43
- 'react-native',
44
- 'nextjs',
45
- 'remix',
46
- 'vite-react',
47
- 'react-query',
48
- 'react-hooks',
49
- 'react-testing',
50
- 'react-performance'
45
+ 'react-expert',
46
+ 'react-patterns',
47
+ 'react-ui-patterns',
48
+ 'react-native-expert',
49
+ 'react-flow-node',
50
+ 'nextjs-best-practices',
51
+ 'nextjs-developer',
52
+ 'nextjs-supabase-auth',
53
+ 'expo-app-design',
54
+ 'expo-deployment'
51
55
  ],
52
56
  'typescript': [
53
- 'typescript-best-practices',
54
- 'typescript-advanced',
55
- 'typescript-patterns',
56
- 'zod-validation'
57
+ 'typescript-expert',
58
+ 'typescript-pro',
59
+ 'javascript-typescript',
60
+ 'javascript-mastery',
61
+ 'javascript-pro'
57
62
  ],
58
63
  'node': [
59
- 'nodejs',
60
- 'nestjs',
61
- 'express',
62
- 'fastify',
63
- 'prisma',
64
- 'drizzle'
64
+ 'nodejs-best-practices',
65
+ 'nestjs-expert',
66
+ 'fastapi-expert',
67
+ 'fastapi-router',
68
+ 'prisma-expert',
69
+ 'bullmq-specialist',
70
+ 'bun-development'
71
+ ],
72
+ 'python': [
73
+ 'python-development',
74
+ 'python-patterns',
75
+ 'python-pro',
76
+ 'django-expert',
77
+ 'fastapi-expert',
78
+ 'pydantic-models',
79
+ 'pandas-pro'
65
80
  ],
66
81
  'database': [
67
82
  'postgres-best-practices',
68
- 'mongodb',
69
- 'redis',
70
- 'sql-optimization',
71
- 'database-design'
83
+ 'postgres-pro',
84
+ 'neon-postgres',
85
+ 'database-design',
86
+ 'database-optimizer',
87
+ 'databases',
88
+ 'nosql-expert',
89
+ 'sql-pro'
72
90
  ],
73
91
  'devops': [
74
- 'docker',
75
- 'kubernetes',
76
- 'ci-cd',
77
- 'github-actions',
78
- 'terraform',
79
- 'aws',
80
- 'cloudflare-expert'
92
+ 'docker-expert',
93
+ 'kubernetes-specialist',
94
+ 'terraform-engineer',
95
+ 'github-workflow-automation',
96
+ 'aws-serverless',
97
+ 'aws-cdk-development',
98
+ 'aws-cost-operations',
99
+ 'gcp-cloud-run',
100
+ 'cloudflare-expert',
101
+ 'vercel-deploy',
102
+ 'vercel-deployment',
103
+ 'devops',
104
+ 'devops-engineer'
81
105
  ],
82
106
  'testing': [
83
- 'testing',
84
- 'jest',
85
- 'playwright',
86
- 'cypress',
87
- 'vitest',
88
- 'test-driven-development'
107
+ 'testing-patterns',
108
+ 'test-driven-development',
109
+ 'tdd-workflow',
110
+ 'playwright-expert',
111
+ 'playwright-skill',
112
+ 'test-master',
113
+ 'test-fixing',
114
+ 'qa-regression'
89
115
  ],
90
116
  'security': [
91
- 'security-best-practices',
92
117
  'api-security-best-practices',
93
- 'owasp',
94
- 'authentication',
95
- 'authorization'
118
+ 'secure-code-guardian',
119
+ 'security-reviewer',
120
+ 'ethical-hacking-methodology',
121
+ 'pentest-checklist',
122
+ 'pentest-commands',
123
+ 'aws-penetration-testing',
124
+ 'cloud-penetration-testing',
125
+ 'top-web-vulnerabilities'
96
126
  ],
97
127
  'ai': [
98
128
  'ai-agents-architect',
99
129
  'ai-product',
130
+ 'ai-multimodal',
100
131
  'mcp-management',
132
+ 'mcp-developer',
133
+ 'mcp-builder',
101
134
  'prompt-engineering',
102
- 'langchain',
103
- 'openai-integration'
135
+ 'prompt-engineer',
136
+ 'langgraph',
137
+ 'langfuse',
138
+ 'crewai',
139
+ 'rag-architect',
140
+ 'rag-engineer',
141
+ 'rag-implementation',
142
+ 'llm-application-dev',
143
+ 'llm-app-patterns',
144
+ 'sequential-thinking',
145
+ 'agent-memory-mcp',
146
+ 'agent-memory-systems',
147
+ 'autonomous-agent-patterns'
104
148
  ],
105
149
  'mobile': [
106
- 'react-native',
107
- 'flutter',
108
- 'ios-development',
109
- 'android-development',
110
- 'mobile-optimization'
150
+ 'react-native-expert',
151
+ 'flutter-expert',
152
+ 'expo-app-design',
153
+ 'expo-deployment',
154
+ 'mobile-design',
155
+ 'mobile-development',
156
+ 'swift-expert',
157
+ 'kotlin-specialist'
111
158
  ],
112
159
  'frontend': [
113
- 'css-architecture',
114
- 'tailwindcss',
115
- 'animation',
116
- 'accessibility',
117
- 'responsive-design',
118
- 'web-performance'
160
+ 'frontend-development',
161
+ 'frontend-design',
162
+ 'frontend-dev-guidelines',
163
+ 'tailwind-patterns',
164
+ 'ui-design-system',
165
+ 'ui-styling',
166
+ 'ui-ux-pro-max',
167
+ 'web-design-guidelines',
168
+ 'web-performance-optimization',
169
+ 'threejs',
170
+ 'vue-expert',
171
+ 'angular-architect'
119
172
  ],
120
173
  'backend': [
174
+ 'backend-development',
175
+ 'backend-dev-guidelines',
121
176
  'api-patterns',
122
- 'microservices',
123
- 'event-driven',
124
- 'caching',
125
- 'queue-systems',
126
- 'rate-limiting'
177
+ 'api-designer',
178
+ 'microservices-architect',
179
+ 'graphql',
180
+ 'graphql-architect',
181
+ 'websocket-engineer'
127
182
  ],
128
183
  'tools': [
129
- 'git-commit',
184
+ 'git-pushing',
130
185
  'code-review',
131
186
  'debugging',
132
- 'refactoring',
133
- 'documentation',
134
- 'repomix'
187
+ 'debugging-wizard',
188
+ 'code-refactoring',
189
+ 'code-documentation',
190
+ 'repomix',
191
+ 'browser-automation',
192
+ 'cli-developer'
135
193
  ]
136
194
  };
137
195
 
@@ -157,30 +215,37 @@ function getSkillsForCategories(categories) {
157
215
  // Check if a skill matches the filter
158
216
  function shouldIncludeSkill(skillName, options = {}) {
159
217
  const { minimal, categories, selectedSkills } = options;
218
+ const lowerSkillName = skillName.toLowerCase();
160
219
 
161
220
  // If specific skills are selected, check against that list
162
221
  if (selectedSkills && selectedSkills.length > 0) {
163
- return selectedSkills.some(s =>
164
- skillName.toLowerCase().includes(s.toLowerCase()) ||
165
- s.toLowerCase().includes(skillName.toLowerCase())
166
- );
222
+ return selectedSkills.some(s => {
223
+ const lowerS = s.toLowerCase();
224
+ return lowerSkillName === lowerS ||
225
+ lowerSkillName.includes(lowerS) ||
226
+ lowerS.includes(lowerSkillName);
227
+ });
167
228
  }
168
229
 
169
230
  // If minimal mode, only include minimal skills
170
231
  if (minimal) {
171
- return MINIMAL_SKILLS.some(s =>
172
- skillName.toLowerCase().includes(s.toLowerCase()) ||
173
- s.toLowerCase().includes(skillName.toLowerCase())
174
- );
232
+ return MINIMAL_SKILLS.some(s => {
233
+ const lowerS = s.toLowerCase();
234
+ return lowerSkillName === lowerS ||
235
+ lowerSkillName.includes(lowerS) ||
236
+ lowerS.includes(lowerSkillName);
237
+ });
175
238
  }
176
239
 
177
240
  // If categories specified, check against category skills
178
241
  if (categories && categories.length > 0) {
179
242
  const categorySkills = getSkillsForCategories(categories);
180
- return categorySkills.some(s =>
181
- skillName.toLowerCase().includes(s.toLowerCase()) ||
182
- s.toLowerCase().includes(skillName.toLowerCase())
183
- );
243
+ return categorySkills.some(s => {
244
+ const lowerS = s.toLowerCase();
245
+ return lowerSkillName === lowerS ||
246
+ lowerSkillName.includes(lowerS) ||
247
+ lowerS.includes(lowerSkillName);
248
+ });
184
249
  }
185
250
 
186
251
  // Default: include all
package/cli/install.js CHANGED
@@ -172,9 +172,28 @@ function installToTool(toolId, tool, options = {}) {
172
172
  }
173
173
  }
174
174
 
175
- // 2. Install core framework under agent-assistant subfolder
175
+ // 2. Install commands to the official commands directory (for slash commands)
176
+ if (tool.commandsPath) {
177
+ // Install commands from commands/ folder
178
+ const srcCommands = path.join(PACKAGE_ROOT, 'commands');
179
+ if (fs.existsSync(srcCommands)) {
180
+ const count = copyDir(srcCommands, tool.commandsPath, replacements, options);
181
+ console.log(` ✅ Commands: ${count} files`);
182
+ totalFiles += count;
183
+ }
184
+
185
+ // Install commands from commands-claudekit/ folder (merged into same directory)
186
+ const srcCommandsClaudekit = path.join(PACKAGE_ROOT, 'commands-claudekit');
187
+ if (fs.existsSync(srcCommandsClaudekit)) {
188
+ const count = copyDir(srcCommandsClaudekit, tool.commandsPath, replacements, options);
189
+ console.log(` ✅ Commands (claudekit): ${count} files`);
190
+ totalFiles += count;
191
+ }
192
+ }
193
+
194
+ // 3. Install core framework under agent-assistant subfolder (agents, matrix-skills only)
176
195
  const coreDir = path.join(tool.skillsPath, 'agent-assistant');
177
- const coreComponents = ['agents', 'commands', 'matrix-skills'];
196
+ const coreComponents = ['agents', 'matrix-skills'];
178
197
 
179
198
  for (const name of coreComponents) {
180
199
  const srcPath = path.join(PACKAGE_ROOT, name);
@@ -186,20 +205,16 @@ function installToTool(toolId, tool, options = {}) {
186
205
  }
187
206
  }
188
207
 
189
- // 3. Install claudekit components (agents, commands) if available
190
- const claudekitComponents = ['agents-claudekit', 'commands-claudekit'];
191
- for (const name of claudekitComponents) {
192
- const srcPath = path.join(PACKAGE_ROOT, name);
193
- if (fs.existsSync(srcPath)) {
194
- const destName = name.replace('-claudekit', '');
195
- const destPath = path.join(coreDir, 'claudekit', destName);
196
- const count = copyDir(srcPath, destPath, replacements, options);
197
- console.log(` ✅ claudekit/${destName}: ${count} files`);
198
- totalFiles += count;
199
- }
208
+ // 4. Install claudekit agents if available
209
+ const srcAgentsClaudekit = path.join(PACKAGE_ROOT, 'agents-claudekit');
210
+ if (fs.existsSync(srcAgentsClaudekit)) {
211
+ const destPath = path.join(coreDir, 'claudekit', 'agents');
212
+ const count = copyDir(srcAgentsClaudekit, destPath, replacements, options);
213
+ console.log(` ✅ claudekit/agents: ${count} files`);
214
+ totalFiles += count;
200
215
  }
201
216
 
202
- // 4. Install rules
217
+ // 5. Install rules
203
218
  const srcRules = path.join(PACKAGE_ROOT, 'rules');
204
219
  if (fs.existsSync(srcRules) && tool.rulesPath) {
205
220
  const count = copyDir(srcRules, tool.rulesPath, replacements, options);
@@ -207,7 +222,7 @@ function installToTool(toolId, tool, options = {}) {
207
222
  totalFiles += count;
208
223
  }
209
224
 
210
- // 5. Install hooks (Claude Code only)
225
+ // 6. Install hooks (Claude Code only)
211
226
  if (tool.supportsHooks && tool.hooksPath) {
212
227
  const srcHooks = path.join(PACKAGE_ROOT, 'hooks');
213
228
  if (fs.existsSync(srcHooks)) {
@@ -217,7 +232,7 @@ function installToTool(toolId, tool, options = {}) {
217
232
  }
218
233
  }
219
234
 
220
- // 6. Install output-styles (Claude Code only)
235
+ // 7. Install output-styles (Claude Code only)
221
236
  if (toolId === 'claude') {
222
237
  const srcStyles = path.join(PACKAGE_ROOT, 'output-styles');
223
238
  if (fs.existsSync(srcStyles)) {
@@ -227,7 +242,7 @@ function installToTool(toolId, tool, options = {}) {
227
242
  totalFiles += count;
228
243
  }
229
244
 
230
- // 7. Install workflows
245
+ // 8. Install workflows
231
246
  const srcWorkflows = path.join(PACKAGE_ROOT, 'workflows');
232
247
  if (fs.existsSync(srcWorkflows)) {
233
248
  const destWorkflows = path.join(tool.basePath, 'workflows');
@@ -236,7 +251,7 @@ function installToTool(toolId, tool, options = {}) {
236
251
  totalFiles += count;
237
252
  }
238
253
 
239
- // 8. Copy statusline scripts
254
+ // 9. Copy statusline scripts
240
255
  const statuslineFiles = ['statusline.cjs', 'statusline.ps1', 'statusline.sh'];
241
256
  for (const file of statuslineFiles) {
242
257
  const srcFile = path.join(PACKAGE_ROOT, file);
@@ -247,7 +262,7 @@ function installToTool(toolId, tool, options = {}) {
247
262
  }
248
263
  }
249
264
 
250
- // 9. Copy settings.json if not exists
265
+ // 10. Copy settings.json if not exists
251
266
  const srcSettings = path.join(PACKAGE_ROOT, 'settings.json');
252
267
  const destSettings = path.join(tool.basePath, 'settings.json');
253
268
  if (fs.existsSync(srcSettings) && !fs.existsSync(destSettings)) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ngxtm/devkit",
3
- "version": "2.0.0",
3
+ "version": "2.0.2",
4
4
  "description": "Unified multi-agent system with auto-synced skills from multiple sources",
5
5
  "main": "cli/install.js",
6
6
  "bin": {
package/settings.json CHANGED
@@ -1,94 +1,3 @@
1
1
  {
2
- "includeCoAuthoredBy": false,
3
- "statusLine": {
4
- "type": "command",
5
- "command": "node \"%CLAUDE_PROJECT_DIR%\"/.claude/statusline.cjs",
6
- "padding": 0
7
- },
8
- "hooks": {
9
- "SessionStart": [
10
- {
11
- "matcher": "startup|resume|clear|compact",
12
- "hooks": [
13
- {
14
- "type": "command",
15
- "command": "node \"%CLAUDE_PROJECT_DIR%\"/.claude/hooks/session-init.cjs"
16
- }
17
- ]
18
- }
19
- ],
20
- "SubagentStart": [
21
- {
22
- "matcher": "*",
23
- "hooks": [
24
- {
25
- "type": "command",
26
- "command": "node \"%CLAUDE_PROJECT_DIR%\"/.claude/hooks/subagent-init.cjs"
27
- }
28
- ]
29
- }
30
- ],
31
- "UserPromptSubmit": [
32
- {
33
- "hooks": [
34
- {
35
- "type": "command",
36
- "command": "node \"%CLAUDE_PROJECT_DIR%\"/.claude/hooks/dev-rules-reminder.cjs"
37
- }
38
- ]
39
- },
40
- {
41
- "hooks": [
42
- {
43
- "type": "command",
44
- "command": "node \"%CLAUDE_PROJECT_DIR%\"/.claude/hooks/dev-rules-reminder.cjs",
45
- "_origin": "engineer"
46
- },
47
- {
48
- "type": "command",
49
- "command": "node \"%CLAUDE_PROJECT_DIR%\"/.claude/hooks/usage-context-awareness.cjs",
50
- "timeout": 30,
51
- "_origin": "engineer"
52
- }
53
- ]
54
- }
55
- ],
56
- "PreToolUse": [
57
- {
58
- "matcher": "Bash|Glob|Grep|Read|Edit|Write",
59
- "hooks": [
60
- {
61
- "type": "command",
62
- "command": "node \"%CLAUDE_PROJECT_DIR%\"/.claude/hooks/scout-block.cjs"
63
- },
64
- {
65
- "type": "command",
66
- "command": "node \"%CLAUDE_PROJECT_DIR%\"/.claude/hooks/privacy-block.cjs"
67
- }
68
- ]
69
- }
70
- ],
71
- "PostToolUse": [
72
- {
73
- "matcher": "Edit|Write|MultiEdit",
74
- "hooks": [
75
- {
76
- "type": "command",
77
- "command": "node \"%CLAUDE_PROJECT_DIR%\"/.claude/hooks/post-edit-simplify-reminder.cjs",
78
- "_origin": "engineer"
79
- }
80
- ]
81
- },
82
- {
83
- "matcher": "*",
84
- "hooks": [
85
- {
86
- "type": "command",
87
- "command": "node \"%CLAUDE_PROJECT_DIR%\"/.claude/hooks/usage-context-awareness.cjs",
88
- "_origin": "engineer"
89
- }
90
- ]
91
- }
92
- ]
93
- }
2
+ "includeCoAuthoredBy": false
94
3
  }