universal-dev-standards 3.5.0-beta.25 → 3.5.0-beta.26

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "universal-dev-standards",
3
- "version": "3.5.0-beta.25",
3
+ "version": "3.5.0-beta.26",
4
4
  "description": "CLI tool for adopting Universal Development Standards",
5
5
  "keywords": [
6
6
  "documentation",
@@ -189,6 +189,146 @@ export const messages = {
189
189
  full: ' → All rules embedded directly, highest AI compliance',
190
190
  minimal: ' → AI must actively read standards, recommend using with Skills'
191
191
  }
192
+ },
193
+
194
+ // AI Tools Selection
195
+ aiTools: {
196
+ title: 'AI Development Tools:',
197
+ description: 'Select the AI coding assistants you use with this project',
198
+ question: 'Which AI tools are you using?',
199
+ separators: {
200
+ dynamicSkills: '── Dynamic Skills ──',
201
+ staticRules: '── Static Rule Files ──',
202
+ agentsMd: '── AGENTS.md Tools ──',
203
+ gemini: '── Gemini Tools ──'
204
+ },
205
+ choices: {
206
+ claudeCode: 'Anthropic CLI with dynamic Skills',
207
+ none: 'None / Skip'
208
+ }
209
+ },
210
+
211
+ // Skills Installation Location
212
+ skillsLocation: {
213
+ title: 'Skills Installation:',
214
+ description: 'Choose where to install Skills',
215
+ descriptionWithTools: 'Skills will work with:',
216
+ question: 'Where should Skills be installed?',
217
+ choices: {
218
+ marketplace: 'Auto-managed by Claude Code',
219
+ user: 'Shared across all projects',
220
+ project: 'This project only',
221
+ none: 'No Skills installation'
222
+ },
223
+ explanations: {
224
+ marketplace: ' → Run: /plugin install universal-dev-standards@asia-ostrich',
225
+ user: ' → Skills available in all your projects',
226
+ project: ' → Consider adding .claude/skills/ to .gitignore',
227
+ none: ' → Full standards will be copied to .standards/'
228
+ }
229
+ },
230
+
231
+ // Commit Message Language
232
+ commitLanguage: {
233
+ title: 'Commit Message Language:',
234
+ description: 'What language for commit messages?',
235
+ question: 'Select commit message language:',
236
+ choices: {
237
+ english: 'Standard international format',
238
+ chinese: 'For Chinese-speaking teams',
239
+ bilingual: 'Both English and Chinese'
240
+ },
241
+ labels: {
242
+ english: 'English',
243
+ chinese: 'Traditional Chinese',
244
+ bilingual: 'Bilingual'
245
+ }
246
+ },
247
+
248
+ // Install Mode
249
+ installMode: {
250
+ question: 'Select installation mode:',
251
+ choices: {
252
+ skills: 'Use Claude Code Skills',
253
+ full: 'Install all standards without Skills'
254
+ },
255
+ explanations: {
256
+ skills: [
257
+ ' → Skills will be installed to ~/.claude/skills/',
258
+ ' → Only static standards will be copied to .standards/'
259
+ ],
260
+ full: [
261
+ ' → All standards will be copied to .standards/',
262
+ ' → No Skills will be installed'
263
+ ]
264
+ }
265
+ },
266
+
267
+ // Adoption Level (configure)
268
+ adoptionLevelConfig: {
269
+ title: 'Adoption Level:',
270
+ currentLevel: 'Current level:',
271
+ question: 'Select new adoption level:',
272
+ choices: {
273
+ 1: '6 core standards',
274
+ 2: '12 standards',
275
+ 3: 'All 16 standards'
276
+ },
277
+ warnings: {
278
+ upgrade: '⚠ Upgrading level will add new standard files',
279
+ downgrade: '⚠ Downgrading level will NOT remove existing files',
280
+ downgradeHint: ' You may manually remove files from .standards/ if needed'
281
+ }
282
+ },
283
+
284
+ // Methodology
285
+ methodology: {
286
+ title: 'Development Methodology:',
287
+ experimental: '⚠️ [Experimental] This feature will be redesigned in v4.0',
288
+ description: 'Select a methodology to guide your development workflow.',
289
+ question: 'Which development methodology do you want to use?',
290
+ choices: {
291
+ tdd: 'Test-Driven Development (Red → Green → Refactor)',
292
+ bdd: 'Behavior-Driven Development (Given-When-Then)',
293
+ sdd: 'Spec-Driven Development (Spec First, Code Second)',
294
+ atdd: 'Acceptance Test-Driven Development',
295
+ none: 'No specific methodology'
296
+ }
297
+ },
298
+
299
+ // AI Tools Management
300
+ manageAITools: {
301
+ title: 'AI Tools Management:',
302
+ currentlyInstalled: 'Currently installed:',
303
+ none: 'none',
304
+ question: 'What would you like to do?',
305
+ choices: {
306
+ add: 'Add new AI tools',
307
+ remove: 'Remove existing AI tools',
308
+ view: 'View current AI tools',
309
+ cancel: 'Cancel'
310
+ },
311
+ installedTitle: 'Installed AI Tools:',
312
+ noTools: 'No AI tools installed',
313
+ allInstalled: 'All AI tools are already installed!',
314
+ noToolsToRemove: 'No AI tools to remove!',
315
+ selectToAdd: 'Select AI tools to add:',
316
+ selectToRemove: 'Select AI tools to remove:'
317
+ },
318
+
319
+ // Skills Update
320
+ skillsUpdate: {
321
+ upToDate: '✓ All Skills installations are up to date',
322
+ title: 'Skills Update Available:',
323
+ projectLevel: 'Project level (.claude/skills/):',
324
+ userLevel: 'User level (~/.claude/skills/):',
325
+ question: 'What would you like to do?',
326
+ choices: {
327
+ both: 'Update all Skills installations',
328
+ project: 'Only update .claude/skills/',
329
+ user: 'Only update ~/.claude/skills/',
330
+ skip: 'Keep current versions'
331
+ }
192
332
  }
193
333
  },
194
334
 
@@ -374,6 +514,146 @@ export const messages = {
374
514
  full: ' → 所有規則直接嵌入,AI 合規率最高',
375
515
  minimal: ' → AI 需主動讀取規範,建議搭配 Skills'
376
516
  }
517
+ },
518
+
519
+ // AI Tools Selection
520
+ aiTools: {
521
+ title: 'AI 開發工具:',
522
+ description: '選擇你在此專案中使用的 AI 程式助手',
523
+ question: '你使用哪些 AI 工具?/ Which AI tools are you using?',
524
+ separators: {
525
+ dynamicSkills: '── 動態 Skills ──',
526
+ staticRules: '── 靜態規則檔案 ──',
527
+ agentsMd: '── AGENTS.md 工具 ──',
528
+ gemini: '── Gemini 工具 ──'
529
+ },
530
+ choices: {
531
+ claudeCode: 'Anthropic CLI,支援動態 Skills',
532
+ none: '無 / 跳過'
533
+ }
534
+ },
535
+
536
+ // Skills Installation Location
537
+ skillsLocation: {
538
+ title: 'Skills 安裝位置:',
539
+ description: '選擇 Skills 的安裝位置',
540
+ descriptionWithTools: 'Skills 將支援:',
541
+ question: 'Skills 要安裝在哪裡?/ Where should Skills be installed?',
542
+ choices: {
543
+ marketplace: '由 Claude Code 自動管理',
544
+ user: '跨專案共享',
545
+ project: '僅限此專案',
546
+ none: '不安裝 Skills'
547
+ },
548
+ explanations: {
549
+ marketplace: ' → 執行: /plugin install universal-dev-standards@asia-ostrich',
550
+ user: ' → Skills 可在所有專案中使用',
551
+ project: ' → 建議將 .claude/skills/ 加入 .gitignore',
552
+ none: ' → 完整標準將複製到 .standards/'
553
+ }
554
+ },
555
+
556
+ // Commit Message Language
557
+ commitLanguage: {
558
+ title: 'Commit 訊息語言:',
559
+ description: '選擇 commit 訊息的語言',
560
+ question: '選擇 commit 訊息語言 / Select commit message language:',
561
+ choices: {
562
+ english: '標準國際格式',
563
+ chinese: '適合中文團隊',
564
+ bilingual: '英文和中文並用'
565
+ },
566
+ labels: {
567
+ english: 'English',
568
+ chinese: '繁體中文',
569
+ bilingual: '雙語'
570
+ }
571
+ },
572
+
573
+ // Install Mode
574
+ installMode: {
575
+ question: '選擇安裝模式 / Select installation mode:',
576
+ choices: {
577
+ skills: '使用 Claude Code Skills',
578
+ full: '安裝所有標準,不使用 Skills'
579
+ },
580
+ explanations: {
581
+ skills: [
582
+ ' → Skills 將安裝到 ~/.claude/skills/',
583
+ ' → 僅靜態標準會複製到 .standards/'
584
+ ],
585
+ full: [
586
+ ' → 所有標準將複製到 .standards/',
587
+ ' → 不安裝 Skills'
588
+ ]
589
+ }
590
+ },
591
+
592
+ // Adoption Level (configure)
593
+ adoptionLevelConfig: {
594
+ title: 'Adoption Level:',
595
+ currentLevel: '目前等級:',
596
+ question: '選擇新的採用等級 / Select new adoption level:',
597
+ choices: {
598
+ 1: '6 項核心標準',
599
+ 2: '12 項標準',
600
+ 3: '全部 16 項標準'
601
+ },
602
+ warnings: {
603
+ upgrade: '⚠ 升級等級將新增標準檔案',
604
+ downgrade: '⚠ 降級等級不會移除現有檔案',
605
+ downgradeHint: ' 如有需要,請手動從 .standards/ 移除檔案'
606
+ }
607
+ },
608
+
609
+ // Methodology
610
+ methodology: {
611
+ title: '開發方法論:',
612
+ experimental: '⚠️ [實驗性] 此功能將在 v4.0 重新設計',
613
+ description: '選擇指導開發流程的方法論',
614
+ question: '你想使用哪種開發方法論?/ Which development methodology?',
615
+ choices: {
616
+ tdd: '測試驅動開發 (Red → Green → Refactor)',
617
+ bdd: '行為驅動開發 (Given-When-Then)',
618
+ sdd: '規格驅動開發 (先規格、後程式)',
619
+ atdd: '驗收測試驅動開發',
620
+ none: '不使用特定方法論'
621
+ }
622
+ },
623
+
624
+ // AI Tools Management
625
+ manageAITools: {
626
+ title: 'AI 工具管理:',
627
+ currentlyInstalled: '目前已安裝:',
628
+ none: '無',
629
+ question: '你想做什麼?/ What would you like to do?',
630
+ choices: {
631
+ add: '新增 AI 工具',
632
+ remove: '移除現有 AI 工具',
633
+ view: '檢視目前的 AI 工具',
634
+ cancel: '取消'
635
+ },
636
+ installedTitle: '已安裝的 AI 工具:',
637
+ noTools: '未安裝任何 AI 工具',
638
+ allInstalled: '所有 AI 工具都已安裝!',
639
+ noToolsToRemove: '沒有可移除的 AI 工具!',
640
+ selectToAdd: '選擇要新增的 AI 工具:',
641
+ selectToRemove: '選擇要移除的 AI 工具:'
642
+ },
643
+
644
+ // Skills Update
645
+ skillsUpdate: {
646
+ upToDate: '✓ 所有 Skills 安裝都是最新的',
647
+ title: 'Skills 有可用更新:',
648
+ projectLevel: '專案層級 (.claude/skills/):',
649
+ userLevel: '使用者層級 (~/.claude/skills/):',
650
+ question: '你想做什麼?/ What would you like to do?',
651
+ choices: {
652
+ both: '更新所有 Skills 安裝',
653
+ project: '僅更新 .claude/skills/',
654
+ user: '僅更新 ~/.claude/skills/',
655
+ skip: '保持目前版本'
656
+ }
377
657
  }
378
658
  }
379
659
  };
@@ -8,24 +8,26 @@ import { t } from '../i18n/messages.js';
8
8
  * @returns {Promise<string[]>} Selected AI tools
9
9
  */
10
10
  export async function promptAITools(detected = {}) {
11
+ const msg = t().aiTools;
12
+
11
13
  console.log();
12
- console.log(chalk.cyan('AI Development Tools:'));
13
- console.log(chalk.gray(' Select the AI coding assistants you use with this project'));
14
+ console.log(chalk.cyan(msg.title));
15
+ console.log(chalk.gray(` ${msg.description}`));
14
16
  console.log();
15
17
 
16
18
  const { tools } = await inquirer.prompt([
17
19
  {
18
20
  type: 'checkbox',
19
21
  name: 'tools',
20
- message: 'Which AI tools are you using?',
22
+ message: msg.question,
21
23
  choices: [
22
- new inquirer.Separator(chalk.gray('── Dynamic Skills ──')),
24
+ new inquirer.Separator(chalk.gray(msg.separators.dynamicSkills)),
23
25
  {
24
- name: `${chalk.green('Claude Code')} ${chalk.gray('(推薦)')} - Anthropic CLI with dynamic Skills`,
26
+ name: `${chalk.green('Claude Code')} ${chalk.gray(`(${t().recommended})`)} - ${msg.choices.claudeCode}`,
25
27
  value: 'claude-code',
26
28
  checked: detected.claudeCode || false
27
29
  },
28
- new inquirer.Separator(chalk.gray('── Static Rule Files ──')),
30
+ new inquirer.Separator(chalk.gray(msg.separators.staticRules)),
29
31
  {
30
32
  name: `Cursor ${chalk.gray('(.cursorrules)')}`,
31
33
  value: 'cursor',
@@ -51,7 +53,7 @@ export async function promptAITools(detected = {}) {
51
53
  value: 'antigravity',
52
54
  checked: detected.antigravity || false
53
55
  },
54
- new inquirer.Separator(chalk.gray('── AGENTS.md Tools ──')),
56
+ new inquirer.Separator(chalk.gray(msg.separators.agentsMd)),
55
57
  {
56
58
  name: `OpenAI Codex ${chalk.gray('(AGENTS.md)')} - OpenAI Codex CLI`,
57
59
  value: 'codex',
@@ -62,7 +64,7 @@ export async function promptAITools(detected = {}) {
62
64
  value: 'opencode',
63
65
  checked: detected.opencode || false
64
66
  },
65
- new inquirer.Separator(chalk.gray('── Gemini Tools ──')),
67
+ new inquirer.Separator(chalk.gray(msg.separators.gemini)),
66
68
  {
67
69
  name: `Gemini CLI ${chalk.gray('(GEMINI.md)')} - Google Gemini CLI`,
68
70
  value: 'gemini-cli',
@@ -70,7 +72,7 @@ export async function promptAITools(detected = {}) {
70
72
  },
71
73
  new inquirer.Separator(),
72
74
  {
73
- name: chalk.gray('None / Skip'),
75
+ name: chalk.gray(msg.choices.none),
74
76
  value: 'none'
75
77
  }
76
78
  ]
@@ -78,7 +80,7 @@ export async function promptAITools(detected = {}) {
78
80
  ]);
79
81
 
80
82
  // Filter out 'none' and separators
81
- const filtered = tools.filter(t => t !== 'none' && typeof t === 'string');
83
+ const filtered = tools.filter(tool => tool !== 'none' && typeof tool === 'string');
82
84
  return filtered;
83
85
  }
84
86
 
@@ -88,6 +90,7 @@ export async function promptAITools(detected = {}) {
88
90
  * @returns {Promise<string>} 'user', 'project', or 'none'
89
91
  */
90
92
  export async function promptSkillsInstallLocation(selectedTools = []) {
93
+ const msg = t().skillsLocation;
91
94
  const hasClaudeCode = selectedTools.includes('claude-code');
92
95
  const hasOpenCode = selectedTools.includes('opencode');
93
96
 
@@ -97,13 +100,13 @@ export async function promptSkillsInstallLocation(selectedTools = []) {
97
100
  if (hasOpenCode) compatibleTools.push('OpenCode');
98
101
 
99
102
  console.log();
100
- console.log(chalk.cyan('Skills Installation:'));
103
+ console.log(chalk.cyan(msg.title));
101
104
  if (compatibleTools.length > 1) {
102
- console.log(chalk.gray(` Skills will work with: ${compatibleTools.join(' and ')}`));
105
+ console.log(chalk.gray(` ${msg.descriptionWithTools} ${compatibleTools.join(' and ')}`));
103
106
  } else if (compatibleTools.length === 1) {
104
- console.log(chalk.gray(` Choose where to install ${compatibleTools[0]} Skills`));
107
+ console.log(chalk.gray(` ${msg.description} ${compatibleTools[0]} Skills`));
105
108
  } else {
106
- console.log(chalk.gray(' Choose where to install Skills'));
109
+ console.log(chalk.gray(` ${msg.description}`));
107
110
  }
108
111
  console.log();
109
112
 
@@ -111,22 +114,22 @@ export async function promptSkillsInstallLocation(selectedTools = []) {
111
114
  {
112
115
  type: 'list',
113
116
  name: 'location',
114
- message: 'Where should Skills be installed?',
117
+ message: msg.question,
115
118
  choices: [
116
119
  {
117
- name: `${chalk.green('Plugin Marketplace')} ${chalk.gray('(推薦)')} - Auto-managed by Claude Code`,
120
+ name: `${chalk.green('Plugin Marketplace')} ${chalk.gray(`(${t().recommended})`)} - ${msg.choices.marketplace}`,
118
121
  value: 'marketplace'
119
122
  },
120
123
  {
121
- name: `${chalk.blue('User Level')} ${chalk.gray('(~/.claude/skills/)')} - Shared across all projects`,
124
+ name: `${chalk.blue('User Level')} ${chalk.gray('(~/.claude/skills/)')} - ${msg.choices.user}`,
122
125
  value: 'user'
123
126
  },
124
127
  {
125
- name: `${chalk.blue('Project Level')} ${chalk.gray('(.claude/skills/)')} - This project only`,
128
+ name: `${chalk.blue('Project Level')} ${chalk.gray('(.claude/skills/)')} - ${msg.choices.project}`,
126
129
  value: 'project'
127
130
  },
128
131
  {
129
- name: `${chalk.gray('Skip')} - No Skills installation`,
132
+ name: `${chalk.gray('Skip')} - ${msg.choices.none}`,
130
133
  value: 'none'
131
134
  }
132
135
  ],
@@ -136,13 +139,7 @@ export async function promptSkillsInstallLocation(selectedTools = []) {
136
139
 
137
140
  // Simplified single-line explanations
138
141
  console.log();
139
- const explanations = {
140
- marketplace: ' → Run: /plugin install universal-dev-standards@asia-ostrich',
141
- user: ' → Skills available in all your projects',
142
- project: ' → Consider adding .claude/skills/ to .gitignore',
143
- none: ' → Full standards will be copied to .standards/'
144
- };
145
- console.log(chalk.gray(explanations[location]));
142
+ console.log(chalk.gray(msg.explanations[location]));
146
143
  console.log();
147
144
 
148
145
  return location;
@@ -156,6 +153,7 @@ export async function promptSkillsInstallLocation(selectedTools = []) {
156
153
  * @returns {Promise<Object>} Update decision { action: 'both'|'project'|'user'|'none', targets: string[] }
157
154
  */
158
155
  export async function promptSkillsUpdate(projectInfo, userInfo, latestVersion) {
156
+ const msg = t().skillsUpdate;
159
157
  const choices = [];
160
158
  const needsUpdate = [];
161
159
 
@@ -179,20 +177,20 @@ export async function promptSkillsUpdate(projectInfo, userInfo, latestVersion) {
179
177
 
180
178
  // If nothing needs update
181
179
  if (needsUpdate.length === 0) {
182
- console.log(chalk.green('✓ All Skills installations are up to date'));
180
+ console.log(chalk.green(msg.upToDate));
183
181
  return { action: 'none', targets: [] };
184
182
  }
185
183
 
186
184
  // Build choices based on what needs updating
187
185
  console.log();
188
- console.log(chalk.cyan('Skills Update Available:'));
186
+ console.log(chalk.cyan(msg.title));
189
187
 
190
188
  if (projectInfo?.installed) {
191
189
  const pVer = projectInfo.version || 'unknown';
192
190
  const pStatus = pVer === latestVersion
193
191
  ? chalk.green('✓ up to date')
194
192
  : chalk.yellow(`v${pVer} → v${latestVersion}`);
195
- console.log(chalk.gray(` Project level (.claude/skills/): ${pStatus}`));
193
+ console.log(chalk.gray(` ${msg.projectLevel} ${pStatus}`));
196
194
  }
197
195
 
198
196
  if (userInfo?.installed) {
@@ -200,34 +198,34 @@ export async function promptSkillsUpdate(projectInfo, userInfo, latestVersion) {
200
198
  const uStatus = uVer === latestVersion
201
199
  ? chalk.green('✓ up to date')
202
200
  : chalk.yellow(`v${uVer} → v${latestVersion}`);
203
- console.log(chalk.gray(` User level (~/.claude/skills/): ${uStatus}`));
201
+ console.log(chalk.gray(` ${msg.userLevel} ${uStatus}`));
204
202
  }
205
203
  console.log();
206
204
 
207
205
  // Build update choices
208
206
  if (needsUpdate.includes('project') && needsUpdate.includes('user')) {
209
207
  choices.push({
210
- name: `${chalk.green('Update Both')} - Update all Skills installations`,
208
+ name: `${chalk.green('Update Both')} - ${msg.choices.both}`,
211
209
  value: 'both'
212
210
  });
213
211
  }
214
212
 
215
213
  if (needsUpdate.includes('project')) {
216
214
  choices.push({
217
- name: `${chalk.blue('Update Project Level')} - Only update .claude/skills/`,
215
+ name: `${chalk.blue('Update Project Level')} - ${msg.choices.project}`,
218
216
  value: 'project'
219
217
  });
220
218
  }
221
219
 
222
220
  if (needsUpdate.includes('user')) {
223
221
  choices.push({
224
- name: `${chalk.blue('Update User Level')} - Only update ~/.claude/skills/`,
222
+ name: `${chalk.blue('Update User Level')} - ${msg.choices.user}`,
225
223
  value: 'user'
226
224
  });
227
225
  }
228
226
 
229
227
  choices.push({
230
- name: `${chalk.gray('Skip')} - Keep current versions`,
228
+ name: `${chalk.gray('Skip')} - ${msg.choices.skip}`,
231
229
  value: 'none'
232
230
  });
233
231
 
@@ -235,7 +233,7 @@ export async function promptSkillsUpdate(projectInfo, userInfo, latestVersion) {
235
233
  {
236
234
  type: 'list',
237
235
  name: 'action',
238
- message: 'What would you like to do?',
236
+ message: msg.question,
239
237
  choices,
240
238
  default: needsUpdate.length === 2 ? 'both' : needsUpdate[0]
241
239
  }
@@ -460,27 +458,29 @@ export async function promptMergeStrategy() {
460
458
  * @returns {Promise<string>} Selected language ID
461
459
  */
462
460
  export async function promptCommitLanguage() {
461
+ const msg = t().commitLanguage;
462
+
463
463
  console.log();
464
- console.log(chalk.cyan('Commit Message Language:'));
465
- console.log(chalk.gray(' What language for commit messages?'));
464
+ console.log(chalk.cyan(msg.title));
465
+ console.log(chalk.gray(` ${msg.description}`));
466
466
  console.log();
467
467
 
468
468
  const { language } = await inquirer.prompt([
469
469
  {
470
470
  type: 'list',
471
471
  name: 'language',
472
- message: 'Select commit message language:',
472
+ message: msg.question,
473
473
  choices: [
474
474
  {
475
- name: `${chalk.green('English')} ${chalk.gray('(推薦)')} - Standard international format`,
475
+ name: `${chalk.green(msg.labels.english)} ${chalk.gray(`(${t().recommended})`)} - ${msg.choices.english}`,
476
476
  value: 'english'
477
477
  },
478
478
  {
479
- name: `${chalk.blue('Traditional Chinese')} ${chalk.gray('(繁體中文)')} - For Chinese-speaking teams`,
479
+ name: `${chalk.blue(msg.labels.chinese)} - ${msg.choices.chinese}`,
480
480
  value: 'traditional-chinese'
481
481
  },
482
482
  {
483
- name: `${chalk.yellow('Bilingual')} ${chalk.gray('(雙語)')} - Both English and Chinese`,
483
+ name: `${chalk.yellow(msg.labels.bilingual)} - ${msg.choices.bilingual}`,
484
484
  value: 'bilingual'
485
485
  }
486
486
  ],
@@ -588,18 +588,20 @@ export async function promptStandardOptions(level) {
588
588
  * @returns {Promise<string>} 'skills' or 'full'
589
589
  */
590
590
  export async function promptInstallMode() {
591
+ const msg = t().installMode;
592
+
591
593
  const { mode } = await inquirer.prompt([
592
594
  {
593
595
  type: 'list',
594
596
  name: 'mode',
595
- message: 'Select installation mode:',
597
+ message: msg.question,
596
598
  choices: [
597
599
  {
598
- name: `${chalk.green('Skills Mode')} ${chalk.gray('(推薦)')} - Use Claude Code Skills`,
600
+ name: `${chalk.green('Skills Mode')} ${chalk.gray(`(${t().recommended})`)} - ${msg.choices.skills}`,
599
601
  value: 'skills'
600
602
  },
601
603
  {
602
- name: `${chalk.yellow('Full Mode')} - Install all standards without Skills`,
604
+ name: `${chalk.yellow('Full Mode')} - ${msg.choices.full}`,
603
605
  value: 'full'
604
606
  }
605
607
  ],
@@ -609,12 +611,8 @@ export async function promptInstallMode() {
609
611
 
610
612
  // Show explanation based on selection
611
613
  console.log();
612
- if (mode === 'skills') {
613
- console.log(chalk.gray(' → Skills will be installed to ~/.claude/skills/'));
614
- console.log(chalk.gray(' → Only static standards will be copied to .standards/'));
615
- } else {
616
- console.log(chalk.gray(' → All standards will be copied to .standards/'));
617
- console.log(chalk.gray(' → No Skills will be installed'));
614
+ for (const line of msg.explanations[mode]) {
615
+ console.log(chalk.gray(line));
618
616
  }
619
617
  console.log();
620
618
 
@@ -948,30 +946,32 @@ const AI_TOOL_DEFINITIONS = {
948
946
  * @returns {Promise<Object>} Action and tools to modify
949
947
  */
950
948
  export async function promptManageAITools(currentTools = []) {
949
+ const msg = t().manageAITools;
950
+
951
951
  console.log();
952
- console.log(chalk.cyan('AI Tools Management:'));
953
- console.log(chalk.gray(` Currently installed: ${currentTools.length > 0 ? currentTools.join(', ') : 'none'}`));
952
+ console.log(chalk.cyan(msg.title));
953
+ console.log(chalk.gray(` ${msg.currentlyInstalled} ${currentTools.length > 0 ? currentTools.join(', ') : msg.none}`));
954
954
  console.log();
955
955
 
956
956
  const { action } = await inquirer.prompt([
957
957
  {
958
958
  type: 'list',
959
959
  name: 'action',
960
- message: 'What would you like to do?',
960
+ message: msg.question,
961
961
  choices: [
962
- { name: 'Add new AI tools', value: 'add' },
963
- { name: 'Remove existing AI tools', value: 'remove' },
964
- { name: 'View current AI tools', value: 'view' },
965
- { name: chalk.gray('Cancel'), value: 'cancel' }
962
+ { name: msg.choices.add, value: 'add' },
963
+ { name: msg.choices.remove, value: 'remove' },
964
+ { name: msg.choices.view, value: 'view' },
965
+ { name: chalk.gray(msg.choices.cancel), value: 'cancel' }
966
966
  ]
967
967
  }
968
968
  ]);
969
969
 
970
970
  if (action === 'view') {
971
971
  console.log();
972
- console.log(chalk.cyan('Installed AI Tools:'));
972
+ console.log(chalk.cyan(msg.installedTitle));
973
973
  if (currentTools.length === 0) {
974
- console.log(chalk.gray(' No AI tools installed'));
974
+ console.log(chalk.gray(` ${msg.noTools}`));
975
975
  } else {
976
976
  for (const tool of currentTools) {
977
977
  const def = AI_TOOL_DEFINITIONS[tool];
@@ -996,7 +996,7 @@ export async function promptManageAITools(currentTools = []) {
996
996
  }));
997
997
 
998
998
  if (availableTools.length === 0) {
999
- console.log(chalk.yellow(' All AI tools are already installed!'));
999
+ console.log(chalk.yellow(` ${msg.allInstalled}`));
1000
1000
  return { action: 'cancel', tools: [] };
1001
1001
  }
1002
1002
 
@@ -1004,7 +1004,7 @@ export async function promptManageAITools(currentTools = []) {
1004
1004
  {
1005
1005
  type: 'checkbox',
1006
1006
  name: 'toolsToAdd',
1007
- message: 'Select AI tools to add:',
1007
+ message: msg.selectToAdd,
1008
1008
  choices: availableTools
1009
1009
  }
1010
1010
  ]);
@@ -1014,7 +1014,7 @@ export async function promptManageAITools(currentTools = []) {
1014
1014
 
1015
1015
  if (action === 'remove') {
1016
1016
  if (currentTools.length === 0) {
1017
- console.log(chalk.yellow(' No AI tools to remove!'));
1017
+ console.log(chalk.yellow(` ${msg.noToolsToRemove}`));
1018
1018
  return { action: 'cancel', tools: [] };
1019
1019
  }
1020
1020
 
@@ -1030,7 +1030,7 @@ export async function promptManageAITools(currentTools = []) {
1030
1030
  {
1031
1031
  type: 'checkbox',
1032
1032
  name: 'toolsToRemove',
1033
- message: 'Select AI tools to remove:',
1033
+ message: msg.selectToRemove,
1034
1034
  choices: installedChoices
1035
1035
  }
1036
1036
  ]);
@@ -1047,27 +1047,29 @@ export async function promptManageAITools(currentTools = []) {
1047
1047
  * @returns {Promise<number>} New level
1048
1048
  */
1049
1049
  export async function promptAdoptionLevel(currentLevel) {
1050
+ const msg = t().adoptionLevelConfig;
1051
+
1050
1052
  console.log();
1051
- console.log(chalk.cyan('Adoption Level:'));
1052
- console.log(chalk.gray(` Current level: ${currentLevel}`));
1053
+ console.log(chalk.cyan(msg.title));
1054
+ console.log(chalk.gray(` ${msg.currentLevel} ${currentLevel}`));
1053
1055
  console.log();
1054
1056
 
1055
1057
  const { level } = await inquirer.prompt([
1056
1058
  {
1057
1059
  type: 'list',
1058
1060
  name: 'level',
1059
- message: 'Select new adoption level:',
1061
+ message: msg.question,
1060
1062
  choices: [
1061
1063
  {
1062
- name: `${chalk.blue('Level 1: Starter')} ${chalk.gray('(基本)')} - 6 core standards`,
1064
+ name: `${chalk.blue('Level 1: Starter')} - ${msg.choices[1]}`,
1063
1065
  value: 1
1064
1066
  },
1065
1067
  {
1066
- name: `${chalk.green('Level 2: Professional')} ${chalk.gray('(推薦)')} - 12 standards`,
1068
+ name: `${chalk.green('Level 2: Professional')} ${chalk.gray(`(${t().recommended})`)} - ${msg.choices[2]}`,
1067
1069
  value: 2
1068
1070
  },
1069
1071
  {
1070
- name: `${chalk.yellow('Level 3: Complete')} ${chalk.gray('(完整)')} - All 16 standards`,
1072
+ name: `${chalk.yellow('Level 3: Complete')} - ${msg.choices[3]}`,
1071
1073
  value: 3
1072
1074
  }
1073
1075
  ],
@@ -1078,10 +1080,10 @@ export async function promptAdoptionLevel(currentLevel) {
1078
1080
  if (level !== currentLevel) {
1079
1081
  console.log();
1080
1082
  if (level > currentLevel) {
1081
- console.log(chalk.yellow('⚠ Upgrading level will add new standard files'));
1083
+ console.log(chalk.yellow(msg.warnings.upgrade));
1082
1084
  } else {
1083
- console.log(chalk.yellow('⚠ Downgrading level will NOT remove existing files'));
1084
- console.log(chalk.gray(' You may manually remove files from .standards/ if needed'));
1085
+ console.log(chalk.yellow(msg.warnings.downgrade));
1086
+ console.log(chalk.gray(msg.warnings.downgradeHint));
1085
1087
  }
1086
1088
  }
1087
1089
 
@@ -1146,37 +1148,39 @@ export async function promptContentModeChange(currentMode) {
1146
1148
  * @returns {Promise<string|null>} Selected methodology ID or null
1147
1149
  */
1148
1150
  export async function promptMethodology() {
1151
+ const msg = t().methodology;
1152
+
1149
1153
  console.log();
1150
- console.log(chalk.cyan('Development Methodology:'));
1151
- console.log(chalk.yellow(' ⚠️ [Experimental] This feature will be redesigned in v4.0'));
1152
- console.log(chalk.gray(' Select a methodology to guide your development workflow.'));
1154
+ console.log(chalk.cyan(msg.title));
1155
+ console.log(chalk.yellow(` ${msg.experimental}`));
1156
+ console.log(chalk.gray(` ${msg.description}`));
1153
1157
  console.log();
1154
1158
 
1155
1159
  const { methodology } = await inquirer.prompt([
1156
1160
  {
1157
1161
  type: 'list',
1158
1162
  name: 'methodology',
1159
- message: 'Which development methodology do you want to use?',
1163
+ message: msg.question,
1160
1164
  choices: [
1161
1165
  {
1162
- name: `${chalk.red('TDD')} ${chalk.gray('- Test-Driven Development (Red → Green → Refactor)')}`,
1166
+ name: `${chalk.red('TDD')} ${chalk.gray(`- ${msg.choices.tdd}`)}`,
1163
1167
  value: 'tdd'
1164
1168
  },
1165
1169
  {
1166
- name: `${chalk.green('BDD')} ${chalk.gray('- Behavior-Driven Development (Given-When-Then)')}`,
1170
+ name: `${chalk.green('BDD')} ${chalk.gray(`- ${msg.choices.bdd}`)}`,
1167
1171
  value: 'bdd'
1168
1172
  },
1169
1173
  {
1170
- name: `${chalk.blue('SDD')} ${chalk.gray('- Spec-Driven Development (Spec First, Code Second)')}`,
1174
+ name: `${chalk.blue('SDD')} ${chalk.gray(`- ${msg.choices.sdd}`)}`,
1171
1175
  value: 'sdd'
1172
1176
  },
1173
1177
  {
1174
- name: `${chalk.yellow('ATDD')} ${chalk.gray('- Acceptance Test-Driven Development')}`,
1178
+ name: `${chalk.yellow('ATDD')} ${chalk.gray(`- ${msg.choices.atdd}`)}`,
1175
1179
  value: 'atdd'
1176
1180
  },
1177
1181
  new inquirer.Separator(),
1178
1182
  {
1179
- name: `${chalk.gray('None')} - No specific methodology`,
1183
+ name: `${chalk.gray('None')} - ${msg.choices.none}`,
1180
1184
  value: null
1181
1185
  }
1182
1186
  ],
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
- "version": "3.5.0-beta.25",
3
+ "version": "3.5.0-beta.26",
4
4
  "lastUpdated": "2026-01-14",
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.0-beta.25"
51
+ "version": "3.5.0-beta.26"
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.0-beta.25",
58
+ "version": "3.5.0-beta.26",
59
59
  "note": "Skills are now included in the main repository under skills/"
60
60
  }
61
61
  },