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 +1 -1
- package/src/i18n/messages.js +280 -0
- package/src/prompts/init.js +85 -81
- package/standards-registry.json +3 -3
package/package.json
CHANGED
package/src/i18n/messages.js
CHANGED
|
@@ -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
|
};
|
package/src/prompts/init.js
CHANGED
|
@@ -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(
|
|
13
|
-
console.log(chalk.gray(
|
|
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:
|
|
22
|
+
message: msg.question,
|
|
21
23
|
choices: [
|
|
22
|
-
new inquirer.Separator(chalk.gray(
|
|
24
|
+
new inquirer.Separator(chalk.gray(msg.separators.dynamicSkills)),
|
|
23
25
|
{
|
|
24
|
-
name: `${chalk.green('Claude Code')} ${chalk.gray(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
103
|
+
console.log(chalk.cyan(msg.title));
|
|
101
104
|
if (compatibleTools.length > 1) {
|
|
102
|
-
console.log(chalk.gray(`
|
|
105
|
+
console.log(chalk.gray(` ${msg.descriptionWithTools} ${compatibleTools.join(' and ')}`));
|
|
103
106
|
} else if (compatibleTools.length === 1) {
|
|
104
|
-
console.log(chalk.gray(`
|
|
107
|
+
console.log(chalk.gray(` ${msg.description} ${compatibleTools[0]} Skills`));
|
|
105
108
|
} else {
|
|
106
|
-
console.log(chalk.gray(
|
|
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:
|
|
117
|
+
message: msg.question,
|
|
115
118
|
choices: [
|
|
116
119
|
{
|
|
117
|
-
name: `${chalk.green('Plugin Marketplace')} ${chalk.gray(
|
|
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/)')} -
|
|
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/)')} -
|
|
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')} -
|
|
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
|
-
|
|
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(
|
|
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(
|
|
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(`
|
|
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(`
|
|
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')} -
|
|
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')} -
|
|
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')} -
|
|
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')} -
|
|
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:
|
|
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(
|
|
465
|
-
console.log(chalk.gray(
|
|
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:
|
|
472
|
+
message: msg.question,
|
|
473
473
|
choices: [
|
|
474
474
|
{
|
|
475
|
-
name: `${chalk.green(
|
|
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(
|
|
479
|
+
name: `${chalk.blue(msg.labels.chinese)} - ${msg.choices.chinese}`,
|
|
480
480
|
value: 'traditional-chinese'
|
|
481
481
|
},
|
|
482
482
|
{
|
|
483
|
-
name: `${chalk.yellow(
|
|
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:
|
|
597
|
+
message: msg.question,
|
|
596
598
|
choices: [
|
|
597
599
|
{
|
|
598
|
-
name: `${chalk.green('Skills Mode')} ${chalk.gray(
|
|
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')} -
|
|
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
|
-
|
|
613
|
-
console.log(chalk.gray(
|
|
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(
|
|
953
|
-
console.log(chalk.gray(`
|
|
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:
|
|
960
|
+
message: msg.question,
|
|
961
961
|
choices: [
|
|
962
|
-
{ name:
|
|
963
|
-
{ name:
|
|
964
|
-
{ name:
|
|
965
|
-
{ name: chalk.gray(
|
|
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(
|
|
972
|
+
console.log(chalk.cyan(msg.installedTitle));
|
|
973
973
|
if (currentTools.length === 0) {
|
|
974
|
-
console.log(chalk.gray(
|
|
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(
|
|
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:
|
|
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(
|
|
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:
|
|
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(
|
|
1052
|
-
console.log(chalk.gray(`
|
|
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:
|
|
1061
|
+
message: msg.question,
|
|
1060
1062
|
choices: [
|
|
1061
1063
|
{
|
|
1062
|
-
name: `${chalk.blue('Level 1: Starter')} ${
|
|
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(
|
|
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')} ${
|
|
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(
|
|
1083
|
+
console.log(chalk.yellow(msg.warnings.upgrade));
|
|
1082
1084
|
} else {
|
|
1083
|
-
console.log(chalk.yellow(
|
|
1084
|
-
console.log(chalk.gray(
|
|
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(
|
|
1151
|
-
console.log(chalk.yellow(
|
|
1152
|
-
console.log(chalk.gray(
|
|
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:
|
|
1163
|
+
message: msg.question,
|
|
1160
1164
|
choices: [
|
|
1161
1165
|
{
|
|
1162
|
-
name: `${chalk.red('TDD')} ${chalk.gray(
|
|
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(
|
|
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(
|
|
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(
|
|
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')} -
|
|
1183
|
+
name: `${chalk.gray('None')} - ${msg.choices.none}`,
|
|
1180
1184
|
value: null
|
|
1181
1185
|
}
|
|
1182
1186
|
],
|
package/standards-registry.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
-
"version": "3.5.0-beta.
|
|
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.
|
|
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.
|
|
58
|
+
"version": "3.5.0-beta.26",
|
|
59
59
|
"note": "Skills are now included in the main repository under skills/"
|
|
60
60
|
}
|
|
61
61
|
},
|