universal-dev-standards 5.0.0 → 5.1.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/bin/uds.js +34 -11
  2. package/bundled/ai/standards/ai-response-navigation.ai.yaml +70 -0
  3. package/bundled/ai/standards/context-aware-loading.ai.yaml +5 -4
  4. package/bundled/core/ai-response-navigation.md +289 -0
  5. package/bundled/locales/zh-CN/README.md +1 -1
  6. package/bundled/locales/zh-CN/core/ai-response-navigation.md +297 -0
  7. package/bundled/locales/zh-TW/README.md +1 -1
  8. package/bundled/locales/zh-TW/core/ai-response-navigation.md +297 -0
  9. package/bundled/skills/ac-coverage-assistant/SKILL.md +1 -1
  10. package/bundled/skills/ai-collaboration-standards/SKILL.md +11 -0
  11. package/bundled/skills/ai-friendly-architecture/SKILL.md +11 -0
  12. package/bundled/skills/ai-instruction-standards/SKILL.md +11 -0
  13. package/bundled/skills/api-design-assistant/SKILL.md +1 -1
  14. package/bundled/skills/atdd-assistant/SKILL.md +1 -1
  15. package/bundled/skills/audit-assistant/SKILL.md +1 -1
  16. package/bundled/skills/bdd-assistant/SKILL.md +1 -1
  17. package/bundled/skills/brainstorm-assistant/SKILL.md +1 -1
  18. package/bundled/skills/changelog-guide/SKILL.md +1 -1
  19. package/bundled/skills/checkin-assistant/SKILL.md +1 -1
  20. package/bundled/skills/ci-cd-assistant/SKILL.md +1 -1
  21. package/bundled/skills/code-review-assistant/SKILL.md +1 -1
  22. package/bundled/skills/commands/release.md +27 -7
  23. package/bundled/skills/commit-standards/SKILL.md +1 -1
  24. package/bundled/skills/database-assistant/SKILL.md +1 -1
  25. package/bundled/skills/dev-workflow-guide/SKILL.md +1 -1
  26. package/bundled/skills/docs-generator/SKILL.md +1 -1
  27. package/bundled/skills/documentation-guide/SKILL.md +11 -0
  28. package/bundled/skills/durable-execution-assistant/SKILL.md +1 -1
  29. package/bundled/skills/error-code-guide/SKILL.md +11 -0
  30. package/bundled/skills/forward-derivation/SKILL.md +1 -1
  31. package/bundled/skills/git-workflow-guide/SKILL.md +11 -0
  32. package/bundled/skills/incident-response-assistant/SKILL.md +1 -1
  33. package/bundled/skills/logging-guide/SKILL.md +11 -0
  34. package/bundled/skills/methodology-system/SKILL.md +1 -1
  35. package/bundled/skills/metrics-dashboard-assistant/SKILL.md +1 -1
  36. package/bundled/skills/migration-assistant/SKILL.md +1 -1
  37. package/bundled/skills/pr-automation-assistant/SKILL.md +1 -1
  38. package/bundled/skills/project-discovery/SKILL.md +1 -1
  39. package/bundled/skills/project-structure-guide/SKILL.md +11 -0
  40. package/bundled/skills/refactoring-assistant/SKILL.md +1 -1
  41. package/bundled/skills/release-standards/SKILL.md +31 -7
  42. package/bundled/skills/requirement-assistant/SKILL.md +1 -1
  43. package/bundled/skills/reverse-engineer/SKILL.md +1 -1
  44. package/bundled/skills/security-assistant/SKILL.md +1 -1
  45. package/bundled/skills/security-scan-assistant/SKILL.md +1 -1
  46. package/bundled/skills/spec-driven-dev/SKILL.md +1 -1
  47. package/bundled/skills/tdd-assistant/SKILL.md +1 -1
  48. package/bundled/skills/test-coverage-assistant/SKILL.md +1 -1
  49. package/bundled/skills/testing-guide/SKILL.md +11 -0
  50. package/package.json +3 -3
  51. package/src/commands/config.js +35 -2
  52. package/src/commands/init.js +17 -1
  53. package/src/commands/release.js +378 -0
  54. package/src/flows/init-flow.js +7 -2
  55. package/src/i18n/messages.js +87 -0
  56. package/src/installers/manifest-installer.js +2 -1
  57. package/src/prompts/init.js +52 -0
  58. package/src/utils/build-manifest.js +46 -0
  59. package/src/utils/deployment-tracker.js +73 -0
  60. package/src/utils/release-config.js +94 -0
  61. package/src/utils/update-checker.js +17 -0
  62. package/src/utils/version-promote.js +73 -0
  63. package/standards-registry.json +14 -3
package/bin/uds.js CHANGED
@@ -20,16 +20,39 @@ import { auditCommand } from '../src/commands/audit.js';
20
20
  import { uninstallCommand } from '../src/commands/uninstall.js';
21
21
  import { specCreateCommand, specListCommand, specShowCommand, specConfirmCommand, specArchiveCommand, specDeleteCommand } from '../src/commands/spec.js';
22
22
  import { startCommand, missionStatusCommand, missionPauseCommand, missionResumeCommand, missionCancelCommand, missionListCommand } from '../src/commands/start.js';
23
+ import { releaseCommand } from '../src/commands/release.js';
23
24
  import { setLanguage, setLanguageExplicit, detectLanguage, t } from '../src/i18n/messages.js';
24
- import { maybeCheckForUpdates, formatUpdateNotice } from '../src/utils/update-checker.js';
25
+ import { maybeCheckForUpdates, formatUpdateNotice, shouldCheckUpdateForCommand } from '../src/utils/update-checker.js';
25
26
 
26
27
  const require = createRequire(import.meta.url);
27
28
  const pkg = require('../package.json');
28
29
 
30
+ /**
31
+ * Perform update check and print notice if a newer version is available.
32
+ * Resolves silently on error so it never breaks CLI flow.
33
+ */
34
+ async function printUpdateNoticeIfAvailable() {
35
+ try {
36
+ const result = await maybeCheckForUpdates(pkg.version);
37
+ if (result?.shouldNotify) {
38
+ console.log(formatUpdateNotice(result, t()));
39
+ }
40
+ } catch {
41
+ // Silent failure — update check should never break CLI
42
+ }
43
+ }
44
+
29
45
  program
30
46
  .name('uds')
31
47
  .description('CLI tool for adopting Universal Development Standards')
32
48
  .version(pkg.version)
49
+ .configureOutput({
50
+ outputVersion: (str) => {
51
+ process.stdout.write(str);
52
+ // Intercept version output to append update notice before exit
53
+ printUpdateNoticeIfAvailable().finally(() => process.exit(0));
54
+ }
55
+ })
33
56
  .option('--ui-lang <lang>', 'UI language (en, zh-tw, auto) [default: auto]')
34
57
  .hook('preAction', (thisCommand) => {
35
58
  const opts = thisCommand.opts();
@@ -44,16 +67,8 @@ program
44
67
  })
45
68
  .hook('postAction', async (thisCommand) => {
46
69
  const cmd = thisCommand.name();
47
- const notifyCommands = ['init', 'list', 'add', 'config'];
48
- if (!notifyCommands.includes(cmd)) return;
49
- try {
50
- const result = await maybeCheckForUpdates(pkg.version);
51
- if (result?.shouldNotify) {
52
- console.log(formatUpdateNotice(result, t()));
53
- }
54
- } catch {
55
- // Silent failure — update check should never break CLI
56
- }
70
+ if (!shouldCheckUpdateForCommand(cmd)) return;
71
+ await printUpdateNoticeIfAvailable();
57
72
  });
58
73
 
59
74
  program
@@ -196,6 +211,14 @@ program
196
211
  .option('-y, --yes', 'Skip confirmation prompts')
197
212
  .action(uninstallCommand);
198
213
 
214
+ // Release command with subcommands (Manual Deployment Mode)
215
+ program
216
+ .command('release [subcommand] [args]')
217
+ .description('Manage release process (promote, deploy, manifest, verify)')
218
+ .option('--result <result>', 'Test result for deploy command (passed/failed)')
219
+ .option('--checksum <hash>', 'Package checksum for manifest command')
220
+ .action(releaseCommand);
221
+
199
222
  // Spec command with subcommands (Vibe Coding)
200
223
  const specCommand = program
201
224
  .command('spec')
@@ -0,0 +1,70 @@
1
+ # AI Response Navigation Standards (AI-Optimized)
2
+ # Source: core/ai-response-navigation.md
3
+
4
+ id: ai-response-navigation
5
+ meta:
6
+ version: "1.0.0"
7
+ updated: "2026-03-25"
8
+ source: core/ai-response-navigation.md
9
+ description: Every substantive AI response must include contextual next-step suggestions with recommended options
10
+
11
+ rules:
12
+ - id: navigation-footer
13
+ trigger: completing any substantive AI response (task completion, analysis, question, error report, code change)
14
+ instruction: >
15
+ Append a Navigation Footer at the end of every logical response unit using Markdown blockquote (>).
16
+ Exempt ultra-short confirmations like "OK", "Done", "Got it" that are not independent logical units.
17
+ priority: required
18
+
19
+ - id: recommendation-marking
20
+ trigger: providing 2 or more next-step options
21
+ instruction: >
22
+ Mark the recommended option with ⭐ **Recommended** (or localized equivalent like ⭐ **推薦**).
23
+ Append the reason after " — ". If no option is clearly better, describe each option's use case instead.
24
+ If only one reasonable next step exists, suggest it directly without marking.
25
+ priority: required
26
+
27
+ - id: contextual-templates
28
+ trigger: generating a Navigation Footer
29
+ instruction: >
30
+ Select the template based on response type:
31
+ - Task completed → title "Suggested next steps" / "建議下一步", 2-3 options
32
+ - User question → title "Please choose" / "請選擇", 2-5 options with (A)(B)(C) labels
33
+ - Error/failure → title "Suggested resolution" / "建議修復方向", 1-3 options
34
+ - In progress → title "Progress: [N/M]. Next" / "目前進度:[N/M]。下一步", 1-2 options
35
+ - Informational reply → title "Suggested next steps" / "建議下一步", 1-3 options
36
+ priority: required
37
+
38
+ - id: adaptive-quantity
39
+ trigger: deciding how many options to include in Navigation Footer
40
+ instruction: >
41
+ Adjust option count based on context complexity. Minimum 1, maximum 5.
42
+ Task completed: 2-3. User question: 2-5. Error: 1-3. In progress: 1-2. Info reply: 1-3.
43
+ Never exceed 5 options — prune to the most relevant ones.
44
+ priority: required
45
+
46
+ - id: slash-command-preference
47
+ trigger: a next-step suggestion corresponds to a known slash command
48
+ instruction: >
49
+ Reference the command using `/command` format so users can copy and execute directly.
50
+ For steps without corresponding commands, use natural language descriptions.
51
+ priority: recommended
52
+
53
+ - id: tool-agnostic
54
+ trigger: implementing navigation behavior in any AI tool
55
+ instruction: >
56
+ This standard applies to all UDS-supported AI tools (Claude Code, Cursor, Windsurf, Copilot, etc.).
57
+ Behavioral rules are consistent across tools; rendering format may adapt to tool UI capabilities.
58
+ priority: required
59
+
60
+ - id: skill-next-steps-unification
61
+ trigger: creating or modifying a skill's "Next Steps Guidance" section
62
+ instruction: >
63
+ Align the format with this standard's templates. Keep skill-specific contextual recommendations
64
+ but ensure format consistency — use blockquote, recommendation marking, and appropriate template.
65
+ priority: recommended
66
+
67
+ related_standards:
68
+ - ai-command-behavior
69
+ - ai-instruction-standards
70
+ - ai-agreement-standards
@@ -154,11 +154,12 @@ standard:
154
154
  priority: required
155
155
 
156
156
  - id: version-check-on-uds-operation
157
- trigger: "user invokes a UDS slash command or UDS-related operation"
157
+ trigger: "user invokes a UDS slash command, Skill, or UDS-related operation"
158
158
  instruction: >
159
159
  When the user invokes a UDS-related slash command (/commit, /sdd,
160
- /review, /release, /tdd, /bdd, /docs, /changelog, etc.) for the
161
- FIRST TIME in the current conversation, check for UDS updates:
160
+ /review, /release, /tdd, /bdd, /docs, /changelog, etc.) or uses
161
+ a UDS Skill for the FIRST TIME in the current conversation,
162
+ check for UDS updates:
162
163
 
163
164
  1. Read .standards/manifest.json → extract upstream.version
164
165
  2. Run: npm view universal-dev-standards dist-tags --json
@@ -168,7 +169,7 @@ standard:
168
169
  5. If versions match or npm is unreachable, skip silently
169
170
  6. Only check ONCE per conversation — do not repeat on subsequent
170
171
  UDS operations in the same session
171
- priority: optional
172
+ priority: required
172
173
 
173
174
  architecture:
174
175
  classification: always-on-protocol
@@ -0,0 +1,289 @@
1
+ # AI Response Navigation Standards
2
+
3
+ > **Language**: English | [繁體中文](../locales/zh-TW/core/ai-response-navigation.md) | [简体中文](../locales/zh-CN/core/ai-response-navigation.md)
4
+
5
+ **Version**: 1.0.0
6
+ **Last Updated**: 2026-03-25
7
+ **Applicability**: All projects using AI-assisted development
8
+ **Scope**: universal
9
+ **Industry Standards**: None (Emerging AI tool practice)
10
+ **References**: [SPEC-STD-08](../docs/specs/standards/SPEC-STD-08-ai-response-navigation.md)
11
+
12
+ ---
13
+
14
+ ## Purpose
15
+
16
+ This standard defines navigation behavior for AI responses: every substantive AI response MUST include contextual next-step suggestions with recommended options. This ensures users are continuously guided through development workflows without needing to memorize available commands.
17
+
18
+ **Problem**: Users don't know what to do next after receiving an AI response. With 30+ slash commands available, the cognitive load is high and workflow continuity is broken.
19
+
20
+ **Solution**: A standard "Navigation Footer" appended to every substantive AI response, with contextual templates, recommendation marking, and adaptive option quantities.
21
+
22
+ ---
23
+
24
+ ## Core Rules
25
+
26
+ ### Rule 1: Every Substantive Response Includes Navigation
27
+
28
+ Every AI response that constitutes a "logical response unit" MUST end with a Navigation Footer.
29
+
30
+ **A response is a logical response unit when it:**
31
+
32
+ 1. Completes a task or subtask
33
+ 2. Provides analysis, explanation, or advice
34
+ 3. Asks the user a question or requests a choice
35
+ 4. Reports an error or abnormal state
36
+ 5. Shows code change results
37
+
38
+ **Exemption**: Ultra-short confirmations (e.g., "OK", "Done", "Got it") that do not constitute an independent logical unit MAY omit the Navigation Footer.
39
+
40
+ ### Rule 2: Recommend and Explain
41
+
42
+ When providing multiple options, mark the recommended option with ⭐ **Recommended** and append the reason after ` — `.
43
+
44
+ | Situation | Marking |
45
+ |-----------|---------|
46
+ | One option is clearly better | ⭐ **Recommended** — [reason] |
47
+ | No clear best option | Describe each option's use case, no ⭐ |
48
+ | Only one reasonable next step | Suggest directly, no ⭐ needed |
49
+
50
+ ### Rule 3: Match the Context
51
+
52
+ Use the appropriate template based on response type (see [Contextual Templates](#contextual-templates)).
53
+
54
+ ### Rule 4: Adaptive Quantity
55
+
56
+ Adjust the number of options based on context complexity:
57
+
58
+ | Context | Options | Rationale |
59
+ |---------|---------|-----------|
60
+ | Task completed | 2–3 | Suggest workflow continuation |
61
+ | User question | 2–5 | Scale with question complexity |
62
+ | Error/failure | 1–3 | Focus on resolution paths |
63
+ | In progress | 1–2 | Continue or adjust |
64
+ | Informational reply | 1–3 | Exploration directions |
65
+
66
+ **Hard limit**: Never exceed 5 options. Prune to the most relevant ones.
67
+
68
+ ### Rule 5: Prefer Slash Commands
69
+
70
+ When a next-step suggestion corresponds to a known slash command, reference it using `` `/command` `` format so users can copy and execute directly. Use natural language descriptions for steps without corresponding commands.
71
+
72
+ ---
73
+
74
+ ## Contextual Templates
75
+
76
+ ### Template 1: Task Completed
77
+
78
+ Use when a task, skill execution, or code modification is finished.
79
+
80
+ ```markdown
81
+ > **Suggested next steps:**
82
+ > - Run `/command1` to do X
83
+ > - Run `/command2` to do Y ⭐ **Recommended** — [reason]
84
+ > - Run `/command3` to do Z
85
+ ```
86
+
87
+ ### Template 2: User Question
88
+
89
+ Use when the AI needs the user to make a choice or provide information.
90
+
91
+ ```markdown
92
+ > **Please choose:**
93
+ > - **(A) Option description** — supplementary info
94
+ > - **(B) Option description** ⭐ **Recommended** — [reason]
95
+ > - **(C) Option description** — supplementary info
96
+ ```
97
+
98
+ ### Template 3: Error / Failure
99
+
100
+ Use when reporting an error, failure, or abnormal state.
101
+
102
+ ```markdown
103
+ > **Suggested resolution:**
104
+ > - Option description ⭐ **Recommended** — [reason]
105
+ > - Option description
106
+ ```
107
+
108
+ ### Template 4: In Progress
109
+
110
+ Use when completing an intermediate stage of a multi-step task.
111
+
112
+ ```markdown
113
+ > **Progress: [N/M]. Next:**
114
+ > - Continue to next stage ⭐ **Recommended**
115
+ > - Adjust direction or parameters
116
+ ```
117
+
118
+ ### Template 5: Informational Reply
119
+
120
+ Use when answering a knowledge question or providing explanation.
121
+
122
+ ```markdown
123
+ > **Suggested next steps:**
124
+ > - Explore [related topic] in more depth
125
+ > - Run `/command` to apply this to implementation
126
+ ```
127
+
128
+ ---
129
+
130
+ ## Format Specification
131
+
132
+ ### Structure
133
+
134
+ All Navigation Footers use Markdown blockquote (`>`):
135
+
136
+ ```markdown
137
+ > **[Title]:**
138
+ > - [Option/suggestion] ⭐ **Recommended** — [reason]
139
+ > - [Option/suggestion] — [supplementary info]
140
+ ```
141
+
142
+ ### Titles by Context
143
+
144
+ | Context | Title |
145
+ |---------|-------|
146
+ | Task completed | `Suggested next steps` |
147
+ | User question | `Please choose` |
148
+ | Error/failure | `Suggested resolution` |
149
+ | In progress | `Progress: [N/M]. Next` |
150
+ | Informational reply | `Suggested next steps` |
151
+
152
+ ### Localization
153
+
154
+ For bilingual projects, the Navigation Footer follows the conversation language. The titles above are the English variants. Localized equivalents:
155
+
156
+ | English | 繁體中文 | 简体中文 |
157
+ |---------|----------|----------|
158
+ | Suggested next steps | 建議下一步 | 建议下一步 |
159
+ | Please choose | 請選擇 | 请选择 |
160
+ | Suggested resolution | 建議修復方向 | 建议修复方向 |
161
+ | Progress: [N/M]. Next | 目前進度:[N/M]。下一步 | 当前进度:[N/M]。下一步 |
162
+ | Recommended | 推薦 | 推荐 |
163
+
164
+ ---
165
+
166
+ ## Integration with Skills
167
+
168
+ ### Existing Skills
169
+
170
+ Skills that already have a `## Next Steps Guidance | 下一步引導` section:
171
+
172
+ 1. **Keep** the skill-specific suggested content (contextual recommendations)
173
+ 2. **Align** the format to match the templates defined in this standard
174
+ 3. **Add** recommendation marking (⭐) where applicable
175
+
176
+ ### New Skills
177
+
178
+ New skills SHOULD include a `## Next Steps Guidance | 下一步引導` section that follows this standard's templates.
179
+
180
+ ### Beyond Skills
181
+
182
+ This standard applies to **all AI responses**, not just skill executions. General conversations, code reviews, debugging sessions, and any other interaction MUST follow these navigation rules when producing substantive responses.
183
+
184
+ ---
185
+
186
+ ## Applicability Across AI Tools
187
+
188
+ This standard is tool-agnostic. It applies to all AI tools that consume UDS standards:
189
+
190
+ - Claude Code
191
+ - Cursor
192
+ - Windsurf
193
+ - GitHub Copilot
194
+ - Cline
195
+ - Roo Code
196
+ - Augment Code
197
+ - Trae
198
+ - Other compatible tools
199
+
200
+ Each tool's integration layer is responsible for rendering the Navigation Footer according to its UI capabilities, but the behavioral rules remain consistent.
201
+
202
+ ---
203
+
204
+ ## Examples
205
+
206
+ ### Example 1: After Completing a Feature Implementation
207
+
208
+ ```markdown
209
+ > **Suggested next steps:**
210
+ > - Run `/test` to write tests for the new feature
211
+ > - Run `/commit` to commit changes ⭐ **Recommended** — changes are complete and verified
212
+ > - Run `/review` for self-review
213
+ ```
214
+
215
+ ### Example 2: Asking the User a Design Question
216
+
217
+ ```markdown
218
+ > **Please choose:**
219
+ > - **(A) Use a new database table** — more flexible, higher migration cost
220
+ > - **(B) Extend existing table with columns** ⭐ **Recommended** — simpler migration, sufficient for current needs
221
+ > - **(C) Use a NoSQL store** — best for unstructured data but adds infrastructure
222
+ ```
223
+
224
+ ### Example 3: Reporting a Test Failure
225
+
226
+ ```markdown
227
+ > **Suggested resolution:**
228
+ > - Check the failing assertion at `tests/auth.test.js:42` ⭐ **Recommended** — the error message points to a null reference
229
+ > - Run `/debug` for systematic debugging
230
+ > - Revert the last change and investigate
231
+ ```
232
+
233
+ ### Example 4: Mid-workflow Progress Update
234
+
235
+ ```markdown
236
+ > **Progress: [2/5]. Next:**
237
+ > - Continue to Phase 3: Implementation ⭐ **Recommended**
238
+ > - Revisit Phase 2 requirements before proceeding
239
+ ```
240
+
241
+ ### Example 5: Answering a Technical Question
242
+
243
+ ```markdown
244
+ > **Suggested next steps:**
245
+ > - Explore the related configuration in `config/auth.yaml`
246
+ > - Run `/sdd` to create a spec if you plan to modify this behavior
247
+ ```
248
+
249
+ ---
250
+
251
+ ## Quick Reference Card
252
+
253
+ | Rule | Summary |
254
+ |------|---------|
255
+ | R1 | Every substantive response → Navigation Footer |
256
+ | R2 | Multiple options → ⭐ mark the best + reason |
257
+ | R3 | Match template to response type |
258
+ | R4 | 1–5 options, adapt to context |
259
+ | R5 | Use `/command` format when applicable |
260
+
261
+ | Exempt | Not Exempt |
262
+ |--------|------------|
263
+ | "OK", "Done", "Got it" | Task completion reports |
264
+ | Single-word acknowledgments | Error explanations |
265
+ | | Analysis or advice |
266
+ | | Questions to user |
267
+ | | Code change summaries |
268
+
269
+ ---
270
+
271
+ ## Related Standards
272
+
273
+ - [AI Command Behavior Standards](ai-command-behavior.md) — defines how AI executes commands (complementary: behavior = execution, navigation = post-response guidance)
274
+ - [AI Instruction Standards](ai-instruction-standards.md) — file structure for AI instruction files
275
+ - [AI Agreement Standards](ai-agreement-standards.md) — human-AI collaboration agreements
276
+
277
+ ---
278
+
279
+ ## Version History
280
+
281
+ | Version | Date | Changes |
282
+ |---------|------|---------|
283
+ | 1.0.0 | 2026-03-25 | Initial release |
284
+
285
+ ---
286
+
287
+ ## License
288
+
289
+ This standard is released under [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/).
@@ -6,7 +6,7 @@
6
6
 
7
7
  > **语言**: [English](../../README.md) | [繁體中文](../zh-TW/README.md) | 简体中文
8
8
 
9
- **版本**: 5.0.0 | **发布日期**: 2026-03-24 | **授权**: [双重授权](../../LICENSE) (CC BY 4.0 + MIT)
9
+ **版本**: 5.1.0-beta.1 | **发布日期**: 2026-03-25 | **授权**: [双重授权](../../LICENSE) (CC BY 4.0 + MIT)
10
10
 
11
11
  语言无关、框架无关的软件项目文档标准。通过 AI 原生工作流,确保不同技术栈之间的一致性、质量和可维护性。
12
12