universal-dev-standards 3.3.0-beta.4 → 3.3.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/bin/uds.js CHANGED
@@ -37,6 +37,7 @@ program
37
37
  .option('--lang <language>', 'Language extension (csharp, php)')
38
38
  .option('--framework <framework>', 'Framework extension (fat-free)')
39
39
  .option('--locale <locale>', 'Locale extension (zh-tw)')
40
+ .option('--skills-location <location>', 'Skills location (marketplace, user, project, none) [default: marketplace]')
40
41
  .option('-y, --yes', 'Use defaults, skip interactive prompts')
41
42
  .action(initCommand);
42
43
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "universal-dev-standards",
3
- "version": "3.3.0-beta.4",
3
+ "version": "3.3.0",
4
4
  "description": "CLI tool for adopting Universal Development Standards",
5
5
  "keywords": [
6
6
  "documentation",
@@ -107,6 +107,7 @@ export function checkCommand() {
107
107
  console.log(chalk.green(' ✓ Skills installed via Plugin Marketplace'));
108
108
  console.log(chalk.gray(' Managed by Claude Code plugin system'));
109
109
  console.log(chalk.gray(' To verify: /plugin list'));
110
+ console.log(chalk.gray(' Note: Marketplace skills are not file-based'));
110
111
  } else {
111
112
  const skillsDir = join(process.env.HOME || '', '.claude', 'skills');
112
113
  const hasGlobalSkills = existsSync(skillsDir);
@@ -116,10 +117,18 @@ export function checkCommand() {
116
117
  console.log(chalk.green(' ✓ Claude Code Skills installed'));
117
118
  if (hasGlobalSkills) console.log(chalk.gray(' Global: ~/.claude/skills/'));
118
119
  if (hasProjectSkills) console.log(chalk.gray(' Project: .claude/skills/'));
120
+ // Migration suggestion
121
+ console.log(chalk.yellow(' ⚠ Consider migrating to Plugin Marketplace'));
122
+ console.log(chalk.gray(' Marketplace provides automatic updates and easier management.'));
123
+ console.log(chalk.gray(' To migrate:'));
124
+ console.log(chalk.gray(' 1. Install via Marketplace: /install-skills AsiaOstrich/universal-dev-skills'));
125
+ console.log(chalk.gray(' 2. Remove local skills: rm -rf ~/.claude/skills/'));
126
+ console.log(chalk.gray(' 3. Reinitialize: uds init --yes'));
119
127
  } else {
120
128
  console.log(chalk.yellow(' ⚠ Skills marked as installed but not found'));
121
- console.log(chalk.gray(' Run: git clone https://github.com/AsiaOstrich/universal-dev-skills.git'));
122
- console.log(chalk.gray(' cd universal-dev-skills && ./install.sh'));
129
+ console.log(chalk.gray(' Recommended: Install via Plugin Marketplace'));
130
+ console.log(chalk.gray(' /install-skills AsiaOstrich/universal-dev-skills'));
131
+ console.log(chalk.gray(' Then reinitialize: uds init --yes'));
123
132
  }
124
133
  }
125
134
  } else {
@@ -321,18 +321,34 @@ export async function initCommand(options) {
321
321
  test_levels: options.testLevels ? options.testLevels.split(',') : ['unit-testing', 'integration-testing']
322
322
  };
323
323
 
324
- // Auto-detect Skills status
325
- const userSkillsInfo = getInstalledSkillsInfo();
326
- if (userSkillsInfo?.installed) {
324
+ // Handle Skills configuration based on CLI flag (default: marketplace)
325
+ const skillsLocationFlag = options.skillsLocation || 'marketplace';
326
+
327
+ if (skillsLocationFlag === 'marketplace') {
327
328
  skillsConfig = {
328
329
  installed: true,
329
- location: 'user',
330
+ location: 'marketplace',
330
331
  needsInstall: false,
331
332
  updateTargets: [],
332
333
  standardsScope: 'minimal'
333
334
  };
334
- } else {
335
- // Default to installing Skills in non-interactive mode
335
+ } else if (skillsLocationFlag === 'none') {
336
+ skillsConfig = {
337
+ installed: false,
338
+ location: null,
339
+ needsInstall: false,
340
+ updateTargets: [],
341
+ standardsScope: 'full'
342
+ };
343
+ } else if (skillsLocationFlag === 'project') {
344
+ skillsConfig = {
345
+ installed: true,
346
+ location: 'project',
347
+ needsInstall: true,
348
+ updateTargets: ['project'],
349
+ standardsScope: 'minimal'
350
+ };
351
+ } else if (skillsLocationFlag === 'user') {
336
352
  skillsConfig = {
337
353
  installed: true,
338
354
  location: 'user',
@@ -340,6 +356,30 @@ export async function initCommand(options) {
340
356
  updateTargets: ['user'],
341
357
  standardsScope: 'minimal'
342
358
  };
359
+ } else {
360
+ // Fallback: auto-detect user/project installation
361
+ const userSkillsInfo = getInstalledSkillsInfo();
362
+ const projectSkillsInfo = getProjectInstalledSkillsInfo(projectPath);
363
+
364
+ if (userSkillsInfo?.installed || projectSkillsInfo?.installed) {
365
+ const location = projectSkillsInfo?.installed ? 'project' : 'user';
366
+ skillsConfig = {
367
+ installed: true,
368
+ location,
369
+ needsInstall: false,
370
+ updateTargets: [],
371
+ standardsScope: 'minimal'
372
+ };
373
+ } else {
374
+ // Fallback to marketplace if nothing detected
375
+ skillsConfig = {
376
+ installed: true,
377
+ location: 'marketplace',
378
+ needsInstall: false,
379
+ updateTargets: [],
380
+ standardsScope: 'minimal'
381
+ };
382
+ }
343
383
  }
344
384
  }
345
385
 
@@ -636,6 +676,16 @@ export async function initCommand(options) {
636
676
 
637
677
  // Create manifest
638
678
  const repoInfo = getRepositoryInfo();
679
+
680
+ // Only record options for standards that were actually copied
681
+ const standardsToCopyIds = new Set(standardsToCopy.map(s => s.id));
682
+ const manifestOptions = {
683
+ workflow: standardsToCopyIds.has('git-workflow') ? (standardOptions.workflow || null) : null,
684
+ merge_strategy: standardsToCopyIds.has('git-workflow') ? (standardOptions.merge_strategy || null) : null,
685
+ commit_language: standardsToCopyIds.has('commit-message') ? (standardOptions.commit_language || null) : null,
686
+ test_levels: standardsToCopyIds.has('testing') ? (standardOptions.test_levels || []) : []
687
+ };
688
+
639
689
  const manifest = {
640
690
  version: '3.0.0',
641
691
  upstream: {
@@ -649,12 +699,7 @@ export async function initCommand(options) {
649
699
  standards: results.standards,
650
700
  extensions: results.extensions,
651
701
  integrations: results.integrations,
652
- options: {
653
- workflow: standardOptions.workflow || null,
654
- merge_strategy: standardOptions.merge_strategy || null,
655
- commit_language: standardOptions.commit_language || null,
656
- test_levels: standardOptions.test_levels || []
657
- },
702
+ options: manifestOptions,
658
703
  aiTools,
659
704
  skills: {
660
705
  installed: skillsConfig.installed,
@@ -33,8 +33,13 @@ function getInstalledPlugins() {
33
33
  }
34
34
  }
35
35
 
36
+ // Plugin keys for different marketplace versions
37
+ const PLUGIN_KEY_NEW = 'universal-dev-standards@asia-ostrich';
38
+ const PLUGIN_KEY_OLD = 'universal-dev-standards@universal-dev-standards';
39
+
36
40
  /**
37
41
  * Find universal-dev-standards plugin in installed plugins
42
+ * Prioritizes new @asia-ostrich marketplace, falls back to legacy @universal-dev-standards
38
43
  * @param {Object} pluginsInfo - Installed plugins info
39
44
  * @returns {Object|null} Plugin info or null
40
45
  */
@@ -43,16 +48,17 @@ function findUdsPlugin(pluginsInfo) {
43
48
  return null;
44
49
  }
45
50
 
46
- // Look for universal-dev-standards plugin
47
- for (const [key, installations] of Object.entries(pluginsInfo.plugins)) {
48
- if (key.includes('universal-dev-standards')) {
49
- // Return the first (usually only) installation
50
- if (installations.length > 0) {
51
- return {
52
- key,
53
- ...installations[0]
54
- };
55
- }
51
+ // Priority order: new marketplace first, then legacy
52
+ const keysToCheck = [PLUGIN_KEY_NEW, PLUGIN_KEY_OLD];
53
+
54
+ for (const key of keysToCheck) {
55
+ const installations = pluginsInfo.plugins[key];
56
+ if (installations && installations.length > 0) {
57
+ return {
58
+ key,
59
+ isLegacyMarketplace: key === PLUGIN_KEY_OLD,
60
+ ...installations[0]
61
+ };
56
62
  }
57
63
  }
58
64
 
@@ -105,11 +111,14 @@ export function skillsCommand() {
105
111
  const skills = listSkillsInDir(udsPlugin.installPath);
106
112
  if (skills.length > 0) {
107
113
  installations.push({
108
- location: 'Plugin Marketplace',
114
+ location: udsPlugin.isLegacyMarketplace
115
+ ? 'Plugin Marketplace (legacy)'
116
+ : 'Plugin Marketplace',
109
117
  path: udsPlugin.installPath,
110
118
  version: udsPlugin.version || 'unknown',
111
119
  skills,
112
- recommended: true
120
+ recommended: !udsPlugin.isLegacyMarketplace,
121
+ legacyMarketplace: udsPlugin.isLegacyMarketplace
113
122
  });
114
123
  }
115
124
  }
@@ -188,6 +197,8 @@ export function skillsCommand() {
188
197
  // Header
189
198
  if (install.recommended) {
190
199
  console.log(chalk.green(`✓ ${install.location}`) + chalk.gray(' (recommended)'));
200
+ } else if (install.legacyMarketplace) {
201
+ console.log(chalk.yellow(`⚠ ${install.location}`));
191
202
  } else if (install.deprecated) {
192
203
  console.log(chalk.yellow(`⚠ ${install.location}`));
193
204
  } else {
@@ -201,11 +212,22 @@ export function skillsCommand() {
201
212
  // Skills list
202
213
  console.log(chalk.gray(` Skills (${install.skills.length}):`));
203
214
  for (const skill of install.skills) {
204
- const icon = install.deprecated ? chalk.yellow('○') : chalk.green('✓');
215
+ const icon = (install.deprecated || install.legacyMarketplace)
216
+ ? chalk.yellow('○')
217
+ : chalk.green('✓');
205
218
  console.log(` ${icon} ${skill}`);
206
219
  }
207
220
  console.log();
208
221
 
222
+ // Legacy marketplace migration notice
223
+ if (install.legacyMarketplace) {
224
+ console.log(chalk.yellow(' ⚠ Legacy marketplace detected.'));
225
+ console.log(chalk.gray(' Migrate to new marketplace for continued updates:'));
226
+ console.log(chalk.cyan(' /plugin uninstall universal-dev-standards@universal-dev-standards'));
227
+ console.log(chalk.cyan(' /plugin install universal-dev-standards@asia-ostrich'));
228
+ console.log();
229
+ }
230
+
209
231
  // Deprecation warning
210
232
  if (install.deprecated) {
211
233
  console.log(chalk.yellow(' ⚠ Manual installation is deprecated.'));
@@ -231,3 +253,10 @@ export function skillsCommand() {
231
253
 
232
254
  console.log();
233
255
  }
256
+
257
+ // Export for testing
258
+ export const _testing = {
259
+ findUdsPlugin,
260
+ PLUGIN_KEY_NEW,
261
+ PLUGIN_KEY_OLD
262
+ };
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
- "version": "3.3.0-beta.3",
3
+ "version": "3.3.0",
4
4
  "lastUpdated": "2026-01-07",
5
5
  "description": "Standards registry for universal-dev-standards with integrated skills and AI-optimized formats",
6
6
  "formats": {
@@ -48,14 +48,14 @@
48
48
  "standards": {
49
49
  "name": "universal-dev-standards",
50
50
  "url": "https://github.com/AsiaOstrich/universal-dev-standards",
51
- "version": "3.3.0-beta.2"
51
+ "version": "3.3.0"
52
52
  },
53
53
  "skills": {
54
54
  "name": "universal-dev-standards",
55
55
  "url": "https://github.com/AsiaOstrich/universal-dev-standards",
56
56
  "localPath": "skills/claude-code",
57
57
  "rawUrl": "https://raw.githubusercontent.com/AsiaOstrich/universal-dev-standards/main/skills/claude-code",
58
- "version": "3.3.0-beta.3",
58
+ "version": "3.3.0",
59
59
  "note": "Skills are now included in the main repository under skills/"
60
60
  }
61
61
  },
@@ -149,6 +149,18 @@
149
149
  "skills/claude-code/tdd-assistant/SKILL.md",
150
150
  "skills/claude-code/tdd-assistant/tdd-workflow.md",
151
151
  "skills/claude-code/tdd-assistant/language-examples.md"
152
+ ],
153
+ "commands": [
154
+ "skills/claude-code/commands/README.md",
155
+ "skills/claude-code/commands/changelog.md",
156
+ "skills/claude-code/commands/commit.md",
157
+ "skills/claude-code/commands/coverage.md",
158
+ "skills/claude-code/commands/docs.md",
159
+ "skills/claude-code/commands/release.md",
160
+ "skills/claude-code/commands/requirement.md",
161
+ "skills/claude-code/commands/review.md",
162
+ "skills/claude-code/commands/spec.md",
163
+ "skills/claude-code/commands/tdd.md"
152
164
  ]
153
165
  },
154
166
  "categories": {