universal-dev-standards 3.1.0 → 3.2.1-beta.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/README.md CHANGED
@@ -273,6 +273,7 @@ Git 鉤子透過 Git Bash 運作,它包含在 Git for Windows 中。不需要
273
273
 
274
274
  | Version | Date | Changes |
275
275
  |---------|------|---------|
276
+ | 3.2.0 | 2026-01-02 | Added: Marketplace installation support; Fixed: wildcard paths, process hanging |
276
277
  | 3.0.0 | 2025-12-30 | Published to npm, enhanced init with AI tools selection |
277
278
  | 1.0.1 | 2025-12-24 | Added: Bilingual support (English + Chinese) |
278
279
  | 1.0.0 | 2025-12-23 | Initial CLI documentation |
package/bin/uds.js CHANGED
@@ -1,5 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
 
3
+ import { createRequire } from 'node:module';
3
4
  import { program } from 'commander';
4
5
  import { listCommand } from '../src/commands/list.js';
5
6
  import { initCommand } from '../src/commands/init.js';
@@ -7,10 +8,13 @@ import { checkCommand } from '../src/commands/check.js';
7
8
  import { updateCommand } from '../src/commands/update.js';
8
9
  import { configureCommand } from '../src/commands/configure.js';
9
10
 
11
+ const require = createRequire(import.meta.url);
12
+ const pkg = require('../package.json');
13
+
10
14
  program
11
15
  .name('uds')
12
16
  .description('CLI tool for adopting Universal Development Standards')
13
- .version('3.0.0');
17
+ .version(pkg.version);
14
18
 
15
19
  program
16
20
  .command('list')
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "universal-dev-standards",
3
- "version": "3.1.0",
3
+ "version": "3.2.1-beta.1",
4
4
  "description": "CLI tool for adopting Universal Development Standards",
5
5
  "keywords": [
6
6
  "documentation",
@@ -103,18 +103,24 @@ export function checkCommand() {
103
103
  // Skills status
104
104
  console.log(chalk.cyan('Skills Status:'));
105
105
  if (manifest.skills.installed) {
106
- const skillsDir = join(process.env.HOME || '', '.claude', 'skills');
107
- const hasGlobalSkills = existsSync(skillsDir);
108
- const hasProjectSkills = existsSync(join(projectPath, '.claude', 'skills'));
109
-
110
- if (hasGlobalSkills || hasProjectSkills) {
111
- console.log(chalk.green(' ✓ Claude Code Skills installed'));
112
- if (hasGlobalSkills) console.log(chalk.gray(' Global: ~/.claude/skills/'));
113
- if (hasProjectSkills) console.log(chalk.gray(' Project: .claude/skills/'));
106
+ if (manifest.skills.location === 'marketplace') {
107
+ console.log(chalk.green(' ✓ Skills installed via Plugin Marketplace'));
108
+ console.log(chalk.gray(' Managed by Claude Code plugin system'));
109
+ console.log(chalk.gray(' To verify: /plugin list'));
114
110
  } else {
115
- console.log(chalk.yellow(' ⚠ Skills marked as installed but not found'));
116
- console.log(chalk.gray(' Run: git clone https://github.com/AsiaOstrich/universal-dev-skills.git'));
117
- console.log(chalk.gray(' cd universal-dev-skills && ./install.sh'));
111
+ const skillsDir = join(process.env.HOME || '', '.claude', 'skills');
112
+ const hasGlobalSkills = existsSync(skillsDir);
113
+ const hasProjectSkills = existsSync(join(projectPath, '.claude', 'skills'));
114
+
115
+ if (hasGlobalSkills || hasProjectSkills) {
116
+ console.log(chalk.green(' ✓ Claude Code Skills installed'));
117
+ if (hasGlobalSkills) console.log(chalk.gray(' Global: ~/.claude/skills/'));
118
+ if (hasProjectSkills) console.log(chalk.gray(' Project: .claude/skills/'));
119
+ } else {
120
+ 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'));
123
+ }
118
124
  }
119
125
  } else {
120
126
  console.log(chalk.gray(' Skills not installed (using reference documents only)'));
@@ -218,4 +218,7 @@ export async function configureCommand(options) {
218
218
  }
219
219
 
220
220
  console.log();
221
+
222
+ // Exit explicitly to prevent hanging due to inquirer's readline interface
223
+ process.exit(0);
221
224
  }
@@ -218,8 +218,8 @@ export async function initCommand(options) {
218
218
  skillsConfig = {
219
219
  installed: true,
220
220
  location,
221
- needsInstall: true,
222
- updateTargets: [location]
221
+ needsInstall: location !== 'marketplace', // marketplace doesn't need install via CLI
222
+ updateTargets: location === 'marketplace' ? [] : [location]
223
223
  };
224
224
  }
225
225
  }
@@ -353,9 +353,14 @@ export async function initCommand(options) {
353
353
  console.log(chalk.gray(` Integrations: ${integrations.length > 0 ? integrations.join(', ') : 'none'}`));
354
354
 
355
355
  if (skillsConfig.installed) {
356
- const skillsStatus = skillsConfig.needsInstall
357
- ? `install/update to ${skillsConfig.location}`
358
- : `using existing (${skillsConfig.location})`;
356
+ let skillsStatus;
357
+ if (skillsConfig.location === 'marketplace') {
358
+ skillsStatus = 'Plugin Marketplace (managed by Claude Code)';
359
+ } else {
360
+ skillsStatus = skillsConfig.needsInstall
361
+ ? `install/update to ${skillsConfig.location}`
362
+ : `using existing (${skillsConfig.location})`;
363
+ }
359
364
  console.log(chalk.gray(` Skills: ${skillsStatus}`));
360
365
  }
361
366
 
@@ -616,7 +621,7 @@ export async function initCommand(options) {
616
621
  skills: {
617
622
  installed: skillsConfig.installed,
618
623
  location: skillsConfig.location,
619
- names: results.skills,
624
+ names: skillsConfig.location === 'marketplace' ? ['all-via-plugin'] : results.skills,
620
625
  version: skillsConfig.installed ? repoInfo.skills.version : null
621
626
  }
622
627
  };
@@ -631,15 +636,19 @@ export async function initCommand(options) {
631
636
  const totalFiles = results.standards.length + results.extensions.length + results.integrations.length;
632
637
  console.log(chalk.gray(` ${totalFiles} files copied to project`));
633
638
 
634
- if (results.skills.length > 0) {
635
- const skillLocations = [];
636
- if (skillsConfig.updateTargets.includes('user')) {
637
- skillLocations.push('~/.claude/skills/');
638
- }
639
- if (skillsConfig.updateTargets.includes('project')) {
640
- skillLocations.push('.claude/skills/');
639
+ if (skillsConfig.installed) {
640
+ if (skillsConfig.location === 'marketplace') {
641
+ console.log(chalk.gray(' Skills: Using Plugin Marketplace installation'));
642
+ } else if (results.skills.length > 0) {
643
+ const skillLocations = [];
644
+ if (skillsConfig.updateTargets.includes('user')) {
645
+ skillLocations.push('~/.claude/skills/');
646
+ }
647
+ if (skillsConfig.updateTargets.includes('project')) {
648
+ skillLocations.push('.claude/skills/');
649
+ }
650
+ console.log(chalk.gray(` ${results.skills.length} Skills installed to ${skillLocations.join(' and ')}`));
641
651
  }
642
- console.log(chalk.gray(` ${results.skills.length} Skills installed to ${skillLocations.join(' and ')}`));
643
652
  }
644
653
  console.log(chalk.gray(' Manifest created at .standards/manifest.json'));
645
654
 
@@ -662,4 +671,7 @@ export async function initCommand(options) {
662
671
  console.log(chalk.gray(' 3. Run `uds check` to verify adoption status'));
663
672
  }
664
673
  console.log();
674
+
675
+ // Exit explicitly to prevent hanging due to inquirer's readline interface
676
+ process.exit(0);
665
677
  }
@@ -183,4 +183,7 @@ export async function updateCommand(options) {
183
183
  }
184
184
 
185
185
  console.log();
186
+
187
+ // Exit explicitly to prevent hanging due to inquirer's readline interface
188
+ process.exit(0);
186
189
  }
@@ -81,7 +81,11 @@ export async function promptSkillsInstallLocation() {
81
81
  message: 'Where should Skills be installed?',
82
82
  choices: [
83
83
  {
84
- name: `${chalk.green('User Level')} ${chalk.gray('(推薦)')} - ~/.claude/skills/ (shared across projects)`,
84
+ name: `${chalk.green('Plugin Marketplace')} ${chalk.gray('(推薦)')} - Already installed via /plugin install`,
85
+ value: 'marketplace'
86
+ },
87
+ {
88
+ name: `${chalk.blue('User Level')} - ~/.claude/skills/ (shared across projects)`,
85
89
  value: 'user'
86
90
  },
87
91
  {
@@ -93,13 +97,19 @@ export async function promptSkillsInstallLocation() {
93
97
  value: 'none'
94
98
  }
95
99
  ],
96
- default: 'user'
100
+ default: 'marketplace'
97
101
  }
98
102
  ]);
99
103
 
100
104
  // Show explanation
101
105
  console.log();
102
- if (location === 'user') {
106
+ if (location === 'marketplace') {
107
+ console.log(chalk.gray(' → Skills managed by Claude Code Plugin system'));
108
+ console.log(chalk.gray(' → Automatic updates when new versions are released'));
109
+ console.log(chalk.gray(' → If not installed yet, run:'));
110
+ console.log(chalk.gray(' /plugin marketplace add AsiaOstrich/universal-dev-standards'));
111
+ console.log(chalk.gray(' /plugin install universal-dev-standards@universal-dev-standards'));
112
+ } else if (location === 'user') {
103
113
  console.log(chalk.gray(' → Skills will be installed to ~/.claude/skills/'));
104
114
  console.log(chalk.gray(' → Available across all your projects'));
105
115
  } else if (location === 'project') {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
- "version": "3.0.0",
4
- "lastUpdated": "2025-12-30",
3
+ "version": "3.2.0",
4
+ "lastUpdated": "2026-01-02",
5
5
  "description": "Standards registry for universal-dev-standards with integrated skills and AI-optimized formats",
6
6
  "formats": {
7
7
  "ai": {
@@ -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.0.0"
51
+ "version": "3.2.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.0.0",
58
+ "version": "3.2.0",
59
59
  "note": "Skills are now included in the main repository under skills/"
60
60
  }
61
61
  },
@@ -634,14 +634,34 @@
634
634
  "note": "SDD tool, not AI coding assistant. Manual integration only."
635
635
  },
636
636
  {
637
- "id": "requirement-templates",
638
- "name": "Requirement Document Templates",
637
+ "id": "requirement-checklist",
638
+ "name": "Requirement Checklist Template",
639
+ "nameZh": "需求檢核清單模板",
640
+ "source": "templates/requirement-checklist.md",
641
+ "category": "skill",
642
+ "skillName": "requirement-assistant",
643
+ "level": 2,
644
+ "description": "Checklist for reviewing requirement documents"
645
+ },
646
+ {
647
+ "id": "requirement-template",
648
+ "name": "Requirement Template",
649
+ "nameZh": "需求模板",
650
+ "source": "templates/requirement-template.md",
651
+ "category": "skill",
652
+ "skillName": "requirement-assistant",
653
+ "level": 2,
654
+ "description": "Template for writing user stories"
655
+ },
656
+ {
657
+ "id": "requirement-document-template",
658
+ "name": "Requirement Document Template",
639
659
  "nameZh": "需求文件模板",
640
- "source": "templates/requirement-*.md",
660
+ "source": "templates/requirement-document-template.md",
641
661
  "category": "skill",
642
662
  "skillName": "requirement-assistant",
643
663
  "level": 2,
644
- "description": "Templates for writing requirement documents and user stories"
664
+ "description": "Template for writing comprehensive requirement documents"
645
665
  },
646
666
  {
647
667
  "id": "migration-template",