universal-dev-standards 5.3.1 → 5.4.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.
@@ -1,253 +1,47 @@
1
- # Workflow Enforcement Standards - AI Optimized
2
- # Source: core/workflow-enforcement.md
1
+ # Workflow Enforcement Standards - DEPRECATED STUB
2
+ # This file has been migrated to DevAP per DEC-049 (UDS/DevAP responsibility split).
3
+ # Canonical location: dev-autopilot/standards/flow/workflow-enforcement.ai.yaml
4
+ # Migration: XSPEC-086 Phase 2 (2026-04-27)
5
+ #
6
+ # Human-readable standard: core/workflow-enforcement.md (remains in UDS)
7
+ # Deprecation schedule: UDS 5.4.0 deprecated → UDS 6.0.0 removed
3
8
 
4
9
  id: workflow-enforcement
5
10
  meta:
6
- version: "1.0.0"
7
- updated: "2026-03-19"
11
+ version: "1.0.1"
12
+ updated: "2026-04-27"
13
+ deprecated: true
14
+ deprecated_since: "5.4.0"
15
+ removal_version: "6.0.0"
16
+ canonical_owner: devap
17
+ canonical_path: "dev-autopilot/standards/flow/workflow-enforcement.ai.yaml"
8
18
  source: core/workflow-enforcement.md
9
- description: Machine-enforceable workflow gates that prevent phase skipping in development methodologies
10
-
11
- enforcement_modes:
12
- enforce:
13
- description: Block phase transition, show guidance to correct phase
14
- behavior: AI refuses to proceed and explains which prerequisite is missing
15
- default: true
16
-
17
- suggest:
18
- description: Show warning but allow override with user confirmation
19
- behavior: AI warns about skipped prerequisites but proceeds if user insists
20
-
21
- off:
22
- description: No enforcement checks
23
- behavior: AI follows workflow steps without gate checks
24
-
25
- config_location: ".uds/config.yaml"
26
- config_key: "workflow.enforcement_mode"
27
-
28
- gates:
29
- sdd:
30
- description: Spec-Driven Development phase gates
31
- phases:
32
- - phase: discuss
33
- prerequisites: []
34
- note: Entry point, no prerequisites
35
-
36
- - phase: create
37
- prerequisites:
38
- - check: orphan_specs
39
- command: "ls docs/specs/SPEC-*.md 2>/dev/null"
40
- condition: warn_if_non_terminal_specs_exist
41
- on_fail: warn_and_offer_cleanup
42
- blocking: false
43
-
44
- - phase: review
45
- prerequisites:
46
- - check: spec_exists
47
- command: "ls docs/specs/SPEC-*.md"
48
- condition: at_least_one_spec_exists
49
- on_fail: guide_to_create
50
- blocking: true
51
- - check: spec_status_draft
52
- command: "grep -m1 '^status:' docs/specs/SPEC-XXX.md"
53
- condition: status_is_draft
54
- on_fail: guide_to_create
55
- blocking: true
56
-
57
- - phase: approve
58
- prerequisites:
59
- - check: spec_in_review
60
- condition: status_is_review
61
- on_fail: guide_to_review
62
- blocking: true
63
- - check: review_comments_addressed
64
- condition: no_unresolved_comments
65
- on_fail: guide_to_resolve_comments
66
- blocking: true
67
-
68
- - phase: implement
69
- prerequisites:
70
- - check: spec_exists
71
- command: "ls docs/specs/SPEC-*.md"
72
- condition: at_least_one_spec_exists
73
- on_fail: guide_to_create
74
- blocking: true
75
- - check: spec_approved
76
- condition: status_is_approved
77
- on_fail: guide_to_approve
78
- blocking: true
79
- - check: workflow_state
80
- command: "ls .workflow-state/sdd-*.yaml 2>/dev/null"
81
- condition: check_for_resumable_state
82
- on_fail: start_fresh
83
- blocking: false
84
-
85
- - phase: verify
86
- prerequisites:
87
- - check: implementation_exists
88
- condition: spec_has_implementation_commits
89
- on_fail: guide_to_implement
90
- blocking: true
91
- - check: ac_coverage
92
- condition: all_ac_have_code_and_tests
93
- on_fail: list_incomplete_acs
94
- blocking: true
95
-
96
- tdd:
97
- description: Test-Driven Development phase gates
98
- phases:
99
- - phase: red
100
- prerequisites:
101
- - check: feature_defined
102
- condition: user_has_described_behavior
103
- on_fail: ask_for_behavior_description
104
- blocking: true
105
- - check: sdd_spec_if_applicable
106
- condition: if_sdd_project_spec_exists_and_approved
107
- on_fail: guide_to_sdd
108
- blocking: false
109
-
110
- - phase: green
111
- prerequisites:
112
- - check: failing_test_exists
113
- command: "npm test 2>&1 | grep -E 'FAIL|failing'"
114
- condition: at_least_one_test_failing
115
- on_fail: guide_to_red_phase
116
- blocking: true
117
-
118
- - phase: refactor
119
- prerequisites:
120
- - check: all_tests_passing
121
- command: "npm test"
122
- condition: zero_test_failures
123
- on_fail: guide_to_green_phase
124
- blocking: true
125
-
126
- bdd:
127
- description: Behavior-Driven Development phase gates
128
- phases:
129
- - phase: discovery
130
- prerequisites:
131
- - check: behavior_identified
132
- condition: user_has_identified_behavior
133
- on_fail: ask_for_behavior
134
- blocking: true
135
-
136
- - phase: formulation
137
- prerequisites:
138
- - check: examples_collected
139
- condition: discovery_produced_examples
140
- on_fail: guide_to_discovery
141
- blocking: true
142
-
143
- - phase: automation
144
- prerequisites:
145
- - check: feature_file_exists
146
- command: "ls tests/features/*.feature 2>/dev/null"
147
- condition: at_least_one_feature_file
148
- on_fail: guide_to_formulation
149
- blocking: true
150
- - check: gherkin_format
151
- condition: scenarios_use_given_when_then
152
- on_fail: fix_scenario_format
153
- blocking: true
154
-
155
- - phase: living_docs
156
- prerequisites:
157
- - check: steps_implemented
158
- condition: step_definitions_exist
159
- on_fail: guide_to_automation
160
- blocking: true
161
- - check: scenarios_passing
162
- condition: all_scenarios_pass
163
- on_fail: fix_failing_scenarios
164
- blocking: true
165
-
166
- commit:
167
- description: Commit workflow gates
168
- phases:
169
- - phase: commit
170
- prerequisites:
171
- - check: staged_changes
172
- command: "git diff --cached --stat"
173
- condition: has_staged_changes
174
- on_fail: guide_to_git_add
175
- blocking: true
176
- - check: no_merge_conflicts
177
- condition: no_conflict_markers_in_staged
178
- on_fail: resolve_conflicts
179
- blocking: true
180
- - check: tests_pass
181
- condition: tests_passing_for_feat_fix
182
- on_fail: fix_tests
183
- blocking: true
184
- - check: spec_reference
185
- condition: feat_fix_should_reference_spec
186
- on_fail: suggest_spec_reference
187
- blocking: false
19
+ description: >
20
+ DEPRECATED: This standard has moved to DevAP (flow orchestration layer).
21
+ Install DevAP and load standards/flow/workflow-enforcement.ai.yaml instead.
188
22
 
189
23
  rules:
190
- - id: enforce-phase-order
191
- trigger: AI assistant receives a workflow phase command
24
+ - id: deprecation-notice
25
+ trigger: any workflow enforcement check
192
26
  instruction: >
193
- Before executing any workflow phase (SDD, TDD, BDD), check the
194
- phase gate prerequisites defined in this standard. If any blocking
195
- prerequisite fails, STOP execution, explain what is missing, and
196
- guide the user to the correct prerequisite phase. Non-blocking
197
- prerequisites generate warnings but allow proceeding.
198
- priority: required
27
+ This standard (workflow-enforcement.ai.yaml) has been migrated to DevAP.
28
+ For the canonical executable definition, load:
29
+ dev-autopilot/standards/flow/workflow-enforcement.ai.yaml
199
30
 
200
- - id: respect-enforcement-mode
201
- trigger: checking workflow gates
202
- instruction: >
203
- Read the project's enforcement mode from .uds/config.yaml
204
- (workflow.enforcement_mode). If 'enforce' (default), block on
205
- failed prerequisites. If 'suggest', warn but allow override.
206
- If 'off', skip all checks.
207
- priority: required
31
+ The human-readable standard remains at:
32
+ universal-dev-standards/core/workflow-enforcement.md
208
33
 
209
- - id: guide-dont-block
210
- trigger: prerequisite check fails
211
- instruction: >
212
- When a prerequisite fails, provide actionable guidance:
213
- 1. Explain WHAT is missing (e.g., "No approved spec found")
214
- 2. Explain WHY it matters (e.g., "SDD requires approved specs before implementation")
215
- 3. Show HOW to fix it (e.g., "Run /sdd approve SPEC-XXX.md first")
216
- Never just say "blocked" — always provide the path forward.
34
+ To install DevAP: npm install -g @devap/cli
35
+ See: https://github.com/AsiaOstrich/dev-autopilot
217
36
  priority: required
218
37
 
219
- - id: resume-existing-workflow
220
- trigger: workflow command invoked with existing state
221
- instruction: >
222
- Before starting a fresh workflow, check .workflow-state/ for
223
- existing state files. If an active workflow exists for the same
224
- spec or feature, offer to resume instead of starting fresh.
225
- priority: required
226
-
227
- - id: feat-commit-spec-suggestion
228
- trigger: committing a feat or fix type change
38
+ - id: enforce-phase-order
39
+ trigger: AI assistant receives a workflow phase command
229
40
  instruction: >
230
- When generating a feat or fix commit message, check if active
231
- specs exist in docs/specs/. If yes, suggest adding Refs: SPEC-XXX
232
- to the commit footer. If no specs exist and the change is
233
- significant (>3 files changed or new API), suggest creating a
234
- spec via /sdd. This is advisory, not blocking.
235
- priority: recommended
236
-
237
- quick_reference:
238
- enforcement_modes:
239
- columns: [Mode, Behavior, Config Value]
240
- rows:
241
- - [Enforce, "Block + Guide", "enforce"]
242
- - [Suggest, "Warn + Allow", "suggest"]
243
- - [Off, "No checks", "off"]
41
+ DEPRECATED load dev-autopilot/standards/flow/workflow-enforcement.ai.yaml
42
+ for the current executable gate definitions.
244
43
 
245
- phase_gates:
246
- columns: [Workflow, Phase, Key Prerequisite]
247
- rows:
248
- - [SDD, implement, "Spec must be Approved"]
249
- - [SDD, verify, "All ACs must have code + tests"]
250
- - [TDD, green, "At least one failing test"]
251
- - [TDD, refactor, "All tests passing"]
252
- - [BDD, automation, ".feature file must exist"]
253
- - [Commit, feat/fix, "Suggest spec reference"]
44
+ Minimal fallback: Before executing any workflow phase, check that
45
+ prerequisites for the phase are met. If not, stop and guide the user
46
+ to the correct prerequisite phase.
47
+ priority: required
@@ -1,121 +1,45 @@
1
- # Workflow State Protocol - AI Optimized
2
- # Source: core/workflow-state-protocol.md
1
+ # Workflow State Protocol - DEPRECATED STUB
2
+ # This file has been migrated to DevAP per DEC-049 (UDS/DevAP responsibility split).
3
+ # Canonical location: dev-autopilot/standards/flow/workflow-state-protocol.ai.yaml
4
+ # Migration: XSPEC-086 Phase 2 (2026-04-27)
5
+ #
6
+ # Human-readable standard: core/workflow-state-protocol.md (remains in UDS)
7
+ # Deprecation schedule: UDS 5.4.0 deprecated → UDS 6.0.0 removed
3
8
 
4
9
  id: workflow-state-protocol
5
10
  meta:
6
- version: "1.0.0"
7
- updated: "2026-03-17"
11
+ version: "1.0.1"
12
+ updated: "2026-04-27"
13
+ deprecated: true
14
+ deprecated_since: "5.4.0"
15
+ removal_version: "6.0.0"
16
+ canonical_owner: devap
17
+ canonical_path: "dev-autopilot/standards/flow/workflow-state-protocol.ai.yaml"
8
18
  source: core/workflow-state-protocol.md
9
- description: Protocol for persisting and restoring workflow state across AI sessions
10
-
11
- principles:
12
- state_persistence:
13
- rule: Multi-phase workflows must save state at phase transitions
14
- rationale: Enables resumption after session boundaries without state loss
15
-
16
- event_sourcing:
17
- rule: Important decisions and transitions are logged in append-only event log
18
- rationale: Provides audit trail and enables understanding of workflow history
19
-
20
- session_independence:
21
- rule: Each AI session should be able to resume any workflow from saved state
22
- rationale: Context window limits make single-session completion unreliable
23
-
24
- state_file:
25
- location: ".workflow-state/{workflow}-{id}.yaml"
26
- required_fields:
27
- - workflow # Workflow type (sdd, feature-dev, etc.)
28
- - spec_id # Spec or task identifier
29
- - current_phase # Active phase ID
30
- - status # in-progress | paused | blocked | completed | abandoned
31
- - updated # Last update timestamp (ISO 8601)
32
- - phases_completed # Ordered list of completed phase IDs
33
- optional_fields:
34
- - title
35
- - iteration_count
36
- - created
37
- - artifacts
38
- - progress_summary
39
- - completed_steps
40
- - next_steps
41
- - open_questions
42
- - decisions
43
-
44
- event_log:
45
- location: ".workflow-state/{workflow}-{id}.log.yaml"
46
- format: append-only YAML list
47
- event_types:
48
- - phase_enter # Workflow enters a new phase
49
- - phase_exit # Workflow exits a phase
50
- - checkpoint # Notable milestone
51
- - decision # Important decision made
52
- - error # Error or failure
53
- - interruption # Workflow paused (HITL or context limit)
54
- - resumption # Workflow resumed from saved state
55
- required_event_fields:
56
- - timestamp
57
- - event_type
58
- - phase
59
- - summary
19
+ description: >
20
+ DEPRECATED: This standard has moved to DevAP (flow orchestration layer).
21
+ Install DevAP and load standards/flow/workflow-state-protocol.ai.yaml instead.
60
22
 
61
23
  rules:
62
- - id: state-save-on-phase-transition
63
- trigger: workflow phase changes
24
+ - id: deprecation-notice
25
+ trigger: any workflow state operation
64
26
  instruction: >
65
- When a workflow transitions between phases, update the state file
66
- with new current_phase, add the completed phase to phases_completed,
67
- and update the timestamp. Also append a phase_exit and phase_enter
68
- event to the event log.
27
+ This standard (workflow-state-protocol.ai.yaml) has been migrated to DevAP.
28
+ For the canonical executable definition, load:
29
+ dev-autopilot/standards/flow/workflow-state-protocol.ai.yaml
30
+
31
+ The human-readable standard remains at:
32
+ universal-dev-standards/core/workflow-state-protocol.md
33
+
34
+ To install DevAP: npm install -g @devap/cli
69
35
  priority: required
70
36
 
71
37
  - id: state-load-on-resume
72
38
  trigger: session start or workflow command invocation
73
39
  instruction: >
74
- At session start, check .workflow-state/ for any files with
75
- status 'in-progress' or 'paused'. If found, inform the user
76
- of active workflows and offer to resume. When a workflow command
77
- is invoked (e.g., /sdd implement SPEC-042), check for existing
78
- state before starting fresh.
79
- priority: required
40
+ DEPRECATED load dev-autopilot/standards/flow/workflow-state-protocol.ai.yaml
41
+ for the current executable state protocol.
80
42
 
81
- - id: state-save-on-session-end
82
- trigger: AI session ending with active workflow
83
- instruction: >
84
- Before ending a session during an active workflow, save current
85
- progress to the state file. Update progress_summary, next_steps,
86
- and open_questions to enable seamless resumption.
43
+ Minimal fallback: At session start, check .workflow-state/ for active workflows
44
+ and offer to resume if found.
87
45
  priority: required
88
-
89
- - id: event-log-on-decision
90
- trigger: important design or scope decision made
91
- instruction: >
92
- When a significant decision is made during a workflow (design choice,
93
- scope change, technology selection), append a 'decision' event to the
94
- event log with the decision summary and reasoning.
95
- priority: recommended
96
-
97
- - id: state-staleness-warning
98
- trigger: loading state file older than 7 days
99
- instruction: >
100
- If a state file's 'updated' timestamp is more than 7 days old,
101
- warn the user that the workflow state may be stale and suggest
102
- reviewing it before continuing.
103
- priority: recommended
104
-
105
- - id: gitignore-workflow-state
106
- trigger: creating .workflow-state/ directory
107
- instruction: >
108
- Recommend adding .workflow-state/ to .gitignore as workflow state
109
- is session-specific. Exception: teams sharing state across developers
110
- may version-control it but should clean up completed workflows.
111
- priority: recommended
112
-
113
- quick_reference:
114
- state_lifecycle:
115
- columns: [Event, Action]
116
- rows:
117
- - [Phase transition, Update state file + append event log]
118
- - [Important decision, Record in state decisions + event log]
119
- - [Session ending, Save progress_summary and next_steps]
120
- - [Session starting, Check .workflow-state/ for active workflows]
121
- - [Workflow complete, Set status to completed]
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  source: ../../CHANGELOG.md
3
- source_version: 5.3.1
4
- translation_version: 5.3.1
3
+ source_version: 5.4.0
4
+ translation_version: 5.4.0
5
5
  last_synced: 2026-04-27
6
6
  status: current
7
7
  ---
@@ -17,6 +17,13 @@ status: current
17
17
 
18
18
  ## [Unreleased]
19
19
 
20
+ ## [5.3.2] - 2026-04-27
21
+
22
+ > **修补版本发布**:Bug 修复 —— `uds update -y` 现在会自动安装/更新 Skills 和 Commands,不再只显示提示信息。
23
+
24
+ ### 修复
25
+ - **`uds update --yes` / `-y`**(`cli/src/commands/update.js`):`--yes` 标志此前对 Skills 和 Commands 安装完全跳过,只显示「New features available」提示。现在与交互模式行为一致 —— 缺少的 Skills/Commands 立即安装,过时的直接更新,并同步刷新 manifest 与集成文件。修复了 `uds update -y` 让 `.claude/` Skills 保持不变而交互式 `uds update` 正常更新的行为差异。
26
+
20
27
  ## [5.3.1] - 2026-04-27
21
28
 
22
29
  > **修补版本发布**:Bug 修复 —— `uds update` 后 `uds check` 不再误报「AGENTS.md 标准不同步」。
@@ -14,7 +14,7 @@ status: current
14
14
 
15
15
  > **语言**: [English](../../README.md) | [繁體中文](../zh-TW/README.md) | 简体中文
16
16
 
17
- **版本**: 5.3.1 | **发布日期**: 2026-04-13 | **授权**: [双重授权](../../LICENSE) (CC BY 4.0 + MIT)
17
+ **版本**: 5.4.0 | **发布日期**: 2026-04-13 | **授权**: [双重授权](../../LICENSE) (CC BY 4.0 + MIT)
18
18
 
19
19
  语言无关、框架无关的软件项目文档标准。通过 AI 原生工作流,确保不同技术栈之间的一致性、质量和可维护性。
20
20
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  source: ../../CHANGELOG.md
3
- source_version: 5.3.1
4
- translation_version: 5.3.1
3
+ source_version: 5.4.0
4
+ translation_version: 5.4.0
5
5
  last_synced: 2026-04-27
6
6
  status: current
7
7
  ---
@@ -17,6 +17,13 @@ status: current
17
17
 
18
18
  ## [Unreleased]
19
19
 
20
+ ## [5.3.2] - 2026-04-27
21
+
22
+ > **修補版本發布**:Bug 修復 —— `uds update -y` 現在會自動安裝/更新 Skills 和 Commands,不再只顯示提示訊息。
23
+
24
+ ### 修復
25
+ - **`uds update --yes` / `-y`**(`cli/src/commands/update.js`):`--yes` 旗標先前對 Skills 和 Commands 安裝完全跳過,只顯示「New features available」提示。現在與互動模式行為一致 —— 缺少的 Skills/Commands 立即安裝,過時的直接更新,並同步刷新 manifest 與整合檔案。修復了 `uds update -y` 讓 `.claude/` Skills 保持不變而互動式 `uds update` 正常更新的行為差異。
26
+
20
27
  ## [5.3.1] - 2026-04-27
21
28
 
22
29
  > **修補版本發布**:Bug 修復 —— `uds update` 後 `uds check` 不再誤報「AGENTS.md 標準不同步」。
@@ -14,7 +14,7 @@ status: current
14
14
 
15
15
  > **語言**: [English](../../README.md) | 繁體中文 | [简体中文](../zh-CN/README.md)
16
16
 
17
- **版本**: 5.3.1 | **發布日期**: 2026-04-13 | **授權**: [雙重授權](../../LICENSE) (CC BY 4.0 + MIT)
17
+ **版本**: 5.4.0 | **發布日期**: 2026-04-13 | **授權**: [雙重授權](../../LICENSE) (CC BY 4.0 + MIT)
18
18
 
19
19
  語言無關、框架無關的軟體專案文件標準。透過 AI 原生工作流,確保不同技術堆疊之間的一致性、品質和可維護性。
20
20
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "universal-dev-standards",
3
- "version": "5.3.1",
3
+ "version": "5.4.0",
4
4
  "description": "CLI tool for adopting Universal Development Standards",
5
5
  "keywords": [
6
6
  "documentation",
@@ -967,24 +967,96 @@ export async function updateCommand(options) {
967
967
  writeManifest(manifest, projectPath);
968
968
  }
969
969
  } else {
970
- // --yes mode: show hint but don't auto-install (conservative behavior)
971
- console.log();
972
- console.log(chalk.cyan(msg.newFeaturesAvailableHint || 'Note: New features available for your AI tools'));
970
+ // --yes mode: auto-install/update Skills and Commands (treat -y as confirming all prompts)
971
+ const skillsLocale = resolveLocale(manifest, projectPath);
972
+ let hasChanges = false;
973
+
973
974
  if (missingSkills.length > 0) {
974
- const toolNames = missingSkills.map(s => s.displayName).join(', ');
975
- console.log(chalk.gray(` • Skills (${toolNames}): run "uds update --skills" or "uds init" to install`));
975
+ const spinner = ora(msg.installingNewSkills || 'Installing Skills...').start();
976
+ const result = await installSkillsToMultipleAgents(missingSkills, null, projectPath, skillsLocale);
977
+ if (!manifest.skills) manifest.skills = {};
978
+ manifest.skills.installed = true;
979
+ manifest.skills.version = repoInfo.skills.version;
980
+ manifest.skills.installations = [...(manifest.skills.installations || []), ...missingSkills];
981
+ if (result.allFileHashes) {
982
+ if (!manifest.skillHashes) manifest.skillHashes = {};
983
+ Object.assign(manifest.skillHashes, result.allFileHashes);
984
+ }
985
+ if (result.totalErrors === 0) {
986
+ spinner.succeed((msg.newSkillsInstalled || 'Installed Skills for {count} AI tools').replace('{count}', missingSkills.length));
987
+ } else {
988
+ spinner.warn((msg.newSkillsInstalledWithErrors || 'Installed Skills with {errors} errors').replace('{errors}', result.totalErrors));
989
+ }
990
+ hasChanges = true;
976
991
  }
992
+
977
993
  if (outdatedSkills.length > 0) {
978
- const toolNames = outdatedSkills.map(s => `${s.displayName} (${s.currentVersion} ${s.latestVersion})`).join(', ');
979
- console.log(chalk.gray(` • Skills update (${toolNames}): run "uds update" interactively to update`));
994
+ const spinner = ora(msg.updatingSkills || 'Updating Skills...').start();
995
+ const result = await installSkillsToMultipleAgents(outdatedSkills, null, projectPath, skillsLocale);
996
+ if (!manifest.skills) manifest.skills = {};
997
+ manifest.skills.version = repoInfo.skills.version;
998
+ if (!manifest.skills.location && manifest.skills.installations?.length > 0) {
999
+ const levels = manifest.skills.installations.map(s => s.level).filter(Boolean);
1000
+ const uniqueLevels = [...new Set(levels)];
1001
+ manifest.skills.location = uniqueLevels.length === 1 ? uniqueLevels[0] : (uniqueLevels.length > 1 ? 'multiple' : undefined);
1002
+ }
1003
+ if (result.allFileHashes) {
1004
+ if (!manifest.skillHashes) manifest.skillHashes = {};
1005
+ Object.assign(manifest.skillHashes, result.allFileHashes);
1006
+ }
1007
+ if (result.totalErrors === 0) {
1008
+ spinner.succeed((msg.skillsUpdated || 'Updated Skills for {count} AI tools').replace('{count}', outdatedSkills.length));
1009
+ } else {
1010
+ spinner.warn((msg.skillsUpdatedWithErrors || 'Updated Skills with {errors} errors').replace('{errors}', result.totalErrors));
1011
+ }
1012
+ hasChanges = true;
980
1013
  }
1014
+
981
1015
  if (missingCommands.length > 0) {
982
- const toolNames = missingCommands.map(c => c.displayName).join(', ');
983
- console.log(chalk.gray(` • Commands (${toolNames}): run "uds update --commands" or "uds init" to install`));
1016
+ const spinner = ora(msg.installingNewCommands || 'Installing commands...').start();
1017
+ const result = await installCommandsToMultipleAgents(missingCommands, null, projectPath, skillsLocale);
1018
+ if (!manifest.commands) manifest.commands = {};
1019
+ manifest.commands.installed = true;
1020
+ manifest.commands.version = repoInfo.skills.version;
1021
+ manifest.commands.installations = [...(manifest.commands.installations || []), ...missingCommands];
1022
+ if (result.allFileHashes) {
1023
+ if (!manifest.commandHashes) manifest.commandHashes = {};
1024
+ replaceCommandHashesForUpdatedAgents(manifest.commandHashes, result.allFileHashes);
1025
+ }
1026
+ if (result.totalErrors === 0) {
1027
+ spinner.succeed((msg.newCommandsInstalled || 'Installed commands for {count} AI tools').replace('{count}', missingCommands.length));
1028
+ } else {
1029
+ spinner.warn((msg.newCommandsInstalledWithErrors || 'Installed commands with {errors} errors').replace('{errors}', result.totalErrors));
1030
+ }
1031
+ hasChanges = true;
984
1032
  }
1033
+
985
1034
  if (outdatedCommands.length > 0) {
986
- const toolNames = outdatedCommands.map(c => `${c.displayName} (${c.currentVersion} ${c.latestVersion})`).join(', ');
987
- console.log(chalk.gray(` • Commands update (${toolNames}): run "uds update" interactively to update`));
1035
+ const spinner = ora(msg.updatingCommands || 'Updating Commands...').start();
1036
+ const result = await installCommandsToMultipleAgents(outdatedCommands, null, projectPath, skillsLocale);
1037
+ if (!manifest.commands) manifest.commands = {};
1038
+ manifest.commands.version = repoInfo.skills.version;
1039
+ if (result.allFileHashes) {
1040
+ if (!manifest.commandHashes) manifest.commandHashes = {};
1041
+ replaceCommandHashesForUpdatedAgents(manifest.commandHashes, result.allFileHashes);
1042
+ }
1043
+ if (result.totalErrors === 0) {
1044
+ spinner.succeed((msg.commandsUpdated || 'Updated Commands for {count} AI tools').replace('{count}', outdatedCommands.length));
1045
+ } else {
1046
+ spinner.warn((msg.commandsUpdatedWithErrors || 'Updated Commands with {errors} errors').replace('{errors}', result.totalErrors));
1047
+ }
1048
+ hasChanges = true;
1049
+ }
1050
+
1051
+ if (hasChanges) {
1052
+ if (missingSkills.length > 0 || outdatedSkills.length > 0) {
1053
+ const regenResult = regenerateIntegrations(projectPath, manifest);
1054
+ if (regenResult.updated.length > 0) {
1055
+ console.log(chalk.green(` ✓ ${msg.syncedIntegrations.replace('{count}', regenResult.updated.length)}`));
1056
+ }
1057
+ }
1058
+ refreshIntegrationBlockHashes(manifest, projectPath);
1059
+ writeManifest(manifest, projectPath);
988
1060
  }
989
1061
  }
990
1062
  }