universal-dev-standards 3.5.1-beta.10 → 3.5.1-beta.12

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.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  description: Update development standards to latest version
3
- allowed-tools: Read, Bash(uds update:*), Bash(uds check:*), Bash(npx:*), Bash(cat .standards/*), Bash(ls .claude/*), Bash(ls .opencode/*), Bash(ls .github/*)
3
+ allowed-tools: Read, Bash(uds update:*), Bash(uds check:*), Bash(uds configure:*), Bash(npx:*), Bash(cat .standards/*), Bash(ls .claude/*), Bash(ls .opencode/*), Bash(ls .github/*)
4
4
  argument-hint: "[--yes] [--offline] [--beta]"
5
5
  ---
6
6
 
@@ -42,34 +42,44 @@ uds update --yes
42
42
  uds update --beta --yes
43
43
  ```
44
44
 
45
- ### Step 4: Check New Features | 步驟 4:檢查新功能
45
+ ### Step 4: Install Skills/Commands | 步驟 4:安裝 Skills/Commands
46
46
 
47
- After update completes, check if Skills/Commands need to be installed:
47
+ The CLI automatically handles Skills/Commands installation in Step 4:
48
48
 
49
- 更新完成後,檢查是否需要安裝 Skills/Commands
49
+ CLI 會自動處理 Skills/Commands 安裝:
50
50
 
51
- 1. Read `.standards/manifest.json` to get `aiTools` list and `skills.installed` status
52
- 2. Check if Skills are installed: `skills.installed === true`
53
- 3. Check if Commands are installed for tools that support them (opencode, copilot, gemini-cli, roo-code)
51
+ **With `--yes` flag (automatic):**
52
+ - All missing Skills/Commands are installed automatically for configured AI tools
53
+ - No additional action needed
54
54
 
55
- If `skills.installed` is `false` OR command directories are missing for supported tools, use AskUserQuestion:
55
+ 使用 `--yes` 時,會自動為所有設定的 AI 工具安裝缺少的 Skills/Commands。
56
56
 
57
- | Option | Description | 說明 |
58
- |--------|-------------|------|
59
- | **Install All (Recommended)** | Install Skills + Commands | 安裝 Skills 和斜線命令 |
60
- | **Skills Only** | Install Skills to .claude/skills/ | 只安裝 Skills |
61
- | **Commands Only** | Install Commands for supported tools | 只安裝斜線命令 |
62
- | **Skip** | Don't install features | 跳過 |
57
+ **Without `--yes` (interactive):**
58
+ - CLI shows a checkbox menu to select which AI tools to install for
59
+ - All options are checked by default (opt-out behavior)
63
60
 
64
- **If Install All or Skills Only selected:**
65
- ```bash
66
- uds update --skills
67
- ```
61
+ 不使用 `--yes` 時,CLI 會顯示 checkbox 選單讓用戶選擇要安裝的 AI 工具。
68
62
 
69
- **If Install All or Commands Only selected:**
70
- ```bash
71
- uds update --commands
63
+ **Example checkbox interface:**
72
64
  ```
65
+ ? Select AI tools to install Skills for:
66
+ ❯◉ Claude Code
67
+ ◉ OpenCode
68
+ ◉ GitHub Copilot
69
+ ──────────────
70
+ ◯ Skip Skills installation
71
+ ```
72
+
73
+ **If CLI cannot prompt (non-TTY environment):**
74
+
75
+ Use AskUserQuestion and then run `uds configure`:
76
+
77
+ | User Selection | Action |
78
+ |----------------|--------|
79
+ | **Install All** | `uds configure --type skills` then `uds configure --type commands` |
80
+ | **Skills Only** | `uds configure --type skills` |
81
+ | **Commands Only** | `uds configure --type commands` |
82
+ | **Skip** | No action needed |
73
83
 
74
84
  Explain the results and any next steps to the user.
75
85
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "universal-dev-standards",
3
- "version": "3.5.1-beta.10",
3
+ "version": "3.5.1-beta.12",
4
4
  "description": "CLI tool for adopting Universal Development Standards",
5
5
  "keywords": [
6
6
  "documentation",
@@ -17,9 +17,7 @@ import {
17
17
  import { downloadFromGitHub, getMarketplaceSkillsInfo } from '../utils/github.js';
18
18
  import {
19
19
  getInstalledSkillsInfoForAgent,
20
- getInstalledCommandsForAgent,
21
- installSkillsToMultipleAgents,
22
- installCommandsToMultipleAgents
20
+ getInstalledCommandsForAgent
23
21
  } from '../utils/skills-installer.js';
24
22
  import {
25
23
  getAgentConfig,
@@ -261,10 +259,10 @@ export async function checkCommand(options = {}) {
261
259
  console.log(chalk.yellow(msg.issuesDetected));
262
260
  }
263
261
 
264
- // Offer to install missing Skills/Commands if in interactive mode and TTY available
265
- const canPrompt = !options.noInteractive && process.stdin.isTTY && process.stdout.isTTY;
266
- if ((missingSkills.length > 0 || missingCommands.length > 0) && canPrompt) {
267
- await promptSkillsCommandsInstallation(manifest, projectPath, missingSkills, missingCommands, msg);
262
+ // Show hint if Skills/Commands are missing (check is read-only, no installation)
263
+ if (missingSkills.length > 0 || missingCommands.length > 0) {
264
+ console.log();
265
+ console.log(chalk.cyan(msg.missingSkillsHint || 'Tip: Run `uds update` to install missing Skills/Commands'));
268
266
  }
269
267
 
270
268
  console.log();
@@ -789,171 +787,6 @@ function displaySkillsStatus(manifest, projectPath, msg) {
789
787
  return { missingSkills, missingCommands };
790
788
  }
791
789
 
792
- /**
793
- * Prompt user to install missing Skills/Commands discovered during check
794
- * @param {Object} manifest - The manifest object
795
- * @param {string} projectPath - Project path
796
- * @param {Array} missingSkills - Array of {agent, displayName, paths}
797
- * @param {Array} missingCommands - Array of {agent, displayName, path}
798
- * @param {Object} msg - i18n messages
799
- * @returns {Promise<boolean>} - Whether anything was installed
800
- */
801
- async function promptSkillsCommandsInstallation(manifest, projectPath, missingSkills, missingCommands, msg) {
802
- const repoInfo = getRepositoryInfo();
803
- let installedAnything = false;
804
-
805
- // Handle missing Skills with checkbox selection
806
- if (missingSkills.length > 0) {
807
- console.log();
808
- console.log(chalk.cyan('━'.repeat(50)));
809
- console.log(chalk.cyan.bold(msg.offerSkillsInstallation || 'Skills Installation'));
810
- console.log(chalk.cyan('━'.repeat(50)));
811
- console.log();
812
-
813
- // Build checkbox choices
814
- const skillChoices = missingSkills.map(skill => ({
815
- name: skill.displayName,
816
- value: skill.agent,
817
- checked: true // Default checked for opt-out behavior
818
- }));
819
-
820
- // Add skip option
821
- skillChoices.push(new inquirer.Separator());
822
- skillChoices.push({
823
- name: chalk.gray(msg.skipInstallation || 'Skip'),
824
- value: '__skip__'
825
- });
826
-
827
- const { selectedSkillAgents } = await inquirer.prompt([{
828
- type: 'checkbox',
829
- name: 'selectedSkillAgents',
830
- message: msg.selectSkillsToInstall || 'Select AI tools to install Skills for:',
831
- choices: skillChoices,
832
- validate: (answer) => {
833
- if (answer.includes('__skip__') && answer.length > 1) {
834
- return t().commands.update.skipValidationError || 'Cannot select Skip with other options';
835
- }
836
- return true;
837
- }
838
- }]);
839
-
840
- const filteredSkillAgents = selectedSkillAgents.filter(a => a !== '__skip__');
841
-
842
- if (filteredSkillAgents.length > 0) {
843
- // Prompt for installation level
844
- const { skillsLevel } = await inquirer.prompt([{
845
- type: 'list',
846
- name: 'skillsLevel',
847
- message: t().commands.update.skillsLevelQuestion || 'Where should Skills be installed?',
848
- choices: [
849
- { name: `${t().commands.update.projectLevel || 'Project level'} (.claude/skills/, etc.)`, value: 'project' },
850
- { name: `${t().commands.update.userLevel || 'User level'} (~/.claude/skills/, etc.)`, value: 'user' }
851
- ],
852
- default: 'project'
853
- }]);
854
-
855
- // Install Skills
856
- const spinner = ora(t().commands.update.installingNewSkills || 'Installing Skills...').start();
857
- const skillResult = await installSkillsToMultipleAgents(
858
- filteredSkillAgents.map(agent => ({ agent, level: skillsLevel })),
859
- null,
860
- projectPath
861
- );
862
-
863
- // Update manifest
864
- if (!manifest.skills) manifest.skills = {};
865
- manifest.skills.installed = true;
866
- manifest.skills.version = repoInfo.skills.version;
867
- manifest.skills.installations = [
868
- ...(manifest.skills.installations || []),
869
- ...filteredSkillAgents.map(agent => ({ agent, level: skillsLevel }))
870
- ];
871
-
872
- if (skillResult.totalErrors === 0) {
873
- spinner.succeed((msg.skillsInstalledSuccess || 'Installed Skills for {count} AI tools')
874
- .replace('{count}', filteredSkillAgents.length));
875
- } else {
876
- spinner.warn((t().commands.update.newSkillsInstalledWithErrors || 'Installed Skills with {errors} errors')
877
- .replace('{errors}', skillResult.totalErrors));
878
- }
879
-
880
- installedAnything = true;
881
- }
882
- }
883
-
884
- // Handle missing Commands with checkbox selection
885
- if (missingCommands.length > 0) {
886
- console.log();
887
- console.log(chalk.cyan('━'.repeat(50)));
888
- console.log(chalk.cyan.bold(msg.offerCommandsInstallation || 'Commands Installation'));
889
- console.log(chalk.cyan('━'.repeat(50)));
890
- console.log();
891
-
892
- // Build checkbox choices
893
- const commandChoices = missingCommands.map(cmd => ({
894
- name: `${cmd.displayName} ${chalk.gray(`(${cmd.path})`)}`,
895
- value: cmd.agent,
896
- checked: true // Default checked for opt-out behavior
897
- }));
898
-
899
- // Add skip option
900
- commandChoices.push(new inquirer.Separator());
901
- commandChoices.push({
902
- name: chalk.gray(msg.skipInstallation || 'Skip'),
903
- value: '__skip__'
904
- });
905
-
906
- const { selectedCommandAgents } = await inquirer.prompt([{
907
- type: 'checkbox',
908
- name: 'selectedCommandAgents',
909
- message: msg.selectCommandsToInstall || 'Select AI tools to install Commands for:',
910
- choices: commandChoices,
911
- validate: (answer) => {
912
- if (answer.includes('__skip__') && answer.length > 1) {
913
- return t().commands.update.skipValidationError || 'Cannot select Skip with other options';
914
- }
915
- return true;
916
- }
917
- }]);
918
-
919
- const filteredCommandAgents = selectedCommandAgents.filter(a => a !== '__skip__');
920
-
921
- if (filteredCommandAgents.length > 0) {
922
- const spinner = ora(t().commands.update.installingNewCommands || 'Installing commands...').start();
923
- const cmdResult = await installCommandsToMultipleAgents(
924
- filteredCommandAgents,
925
- null,
926
- projectPath
927
- );
928
-
929
- // Update manifest
930
- if (!manifest.commands) manifest.commands = {};
931
- manifest.commands.installed = true;
932
- manifest.commands.installations = [
933
- ...(manifest.commands.installations || []),
934
- ...filteredCommandAgents
935
- ];
936
-
937
- if (cmdResult.totalErrors === 0) {
938
- spinner.succeed((msg.commandsInstalledSuccess || 'Installed commands for {count} AI tools')
939
- .replace('{count}', filteredCommandAgents.length));
940
- } else {
941
- spinner.warn((t().commands.update.newCommandsInstalledWithErrors || 'Installed commands with {errors} errors')
942
- .replace('{errors}', cmdResult.totalErrors));
943
- }
944
-
945
- installedAnything = true;
946
- }
947
- }
948
-
949
- // Save manifest if anything was installed
950
- if (installedAnything) {
951
- writeManifest(manifest, projectPath);
952
- }
953
-
954
- return installedAnything;
955
- }
956
-
957
790
  /**
958
791
  * Display coverage report
959
792
  */
@@ -602,7 +602,9 @@ export const messages = {
602
602
  selectCommandsToInstall: 'Select AI tools to install Commands for:',
603
603
  skipInstallation: 'Skip',
604
604
  skillsInstalledSuccess: 'Installed Skills for {count} AI tools',
605
- commandsInstalledSuccess: 'Installed commands for {count} AI tools'
605
+ commandsInstalledSuccess: 'Installed commands for {count} AI tools',
606
+ // Read-only hint
607
+ missingSkillsHint: 'Tip: Run `uds update` to install missing Skills/Commands'
606
608
  },
607
609
 
608
610
  // init command (commands/init.js)
@@ -1440,7 +1442,9 @@ export const messages = {
1440
1442
  selectCommandsToInstall: '選擇要安裝斜線命令的 AI 工具:',
1441
1443
  skipInstallation: '跳過',
1442
1444
  skillsInstalledSuccess: '已為 {count} 個 AI 工具安裝 Skills',
1443
- commandsInstalledSuccess: '已為 {count} 個 AI 工具安裝斜線命令'
1445
+ commandsInstalledSuccess: '已為 {count} 個 AI 工具安裝斜線命令',
1446
+ // Read-only hint
1447
+ missingSkillsHint: '提示:執行 `uds update` 安裝缺少的 Skills/斜線命令'
1444
1448
  },
1445
1449
 
1446
1450
  // init command (commands/init.js)
@@ -2181,7 +2185,9 @@ export const messages = {
2181
2185
  selectCommandsToInstall: '选择要安装斜线命令的 AI 工具:',
2182
2186
  skipInstallation: '跳过',
2183
2187
  skillsInstalledSuccess: '已为 {count} 个 AI 工具安装 Skills',
2184
- commandsInstalledSuccess: '已为 {count} 个 AI 工具安装斜线命令'
2188
+ commandsInstalledSuccess: '已为 {count} 个 AI 工具安装斜线命令',
2189
+ // Read-only hint
2190
+ missingSkillsHint: '提示:执行 `uds update` 安装缺少的 Skills/斜线命令'
2185
2191
  },
2186
2192
 
2187
2193
  // update command
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
- "version": "3.5.1-beta.10",
3
+ "version": "3.5.1-beta.12",
4
4
  "lastUpdated": "2026-01-15",
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.5.1-beta.10"
51
+ "version": "3.5.1-beta.12"
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.5.1-beta.10",
58
+ "version": "3.5.1-beta.12",
59
59
  "note": "Skills are now included in the main repository under skills/"
60
60
  }
61
61
  },