# 架构决策记录 (ADR)

{% hint style="info" %}
对应的[官方页面地址](https://contributing.bitwarden.com/architecture/adr/)
{% endhint %}

> 架构决策记录：Architectural Decision Records，简称 ADR。

[架构决策 (AD)](https://en.wikipedia.org/wiki/Architectural_decision) 是一种软件设计选择，用于解决在架构上具有重要意义的功能性或非功能性需求。例如，对于实例，这可能是技术选择（例如 Java 与 JavaScript）、IDE 的选择（例如 IntelliJ 与 Eclipse IDE）、库之间的选择（例如 [SLF4J](https://www.slf4j.org/) 与 [java.util.logging](https://docs.oracle.com/javase/8/docs/api/java/util/logging/package-summary.html)），或功能上的决策（例如，无限撤消与有限撤消）。

## @Bitwarden

在 Bitwarden 的工程团队中引入架构决策 (AD) 的目的是引导开发朝着可维护和可扩展的代码库方向发展。同时努力确保所有团队的一致性。

AD 还将作为提议和规划技术债务的基础。

### 状态定义 <a href="#status-definition" id="status-definition"></a>

* **进行中** - ADR 已获批准，我们正在整个项目中采用它。
* **标准** - ADR 已实施并假定为标准。
* **已放弃** - ADR 已被放弃，和/或被另一个 ADR 取代。

### 标签 <a href="#tags" id="tags"></a>

请确保每个 ADR 都包含一个标签，标记它们适用于哪些项目（*客户端*、*移动端*和/或*服务器*）。如果需要，请随意创建更多标签。

## 流程 <a href="#process" id="process"></a>

虽然流程最初主要是为发起者讨论架构决策而创建的，但对我们来说保持流程对任何人的建议开放是很重要的。为此，任何人都可以自由地打开 PR 来建议 AD。然后将讨论这些建议，以便在采纳之前在发起者之间达成普遍共识。

## ADR <a href="#adrs" id="adrs"></a>

<table data-card-size="large" data-view="cards"><thead><tr><th></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td>0001 - Angular Reactive Forms</td><td><a href="/pages/CdrEfaxUzlN1ULejuCEO">/pages/CdrEfaxUzlN1ULejuCEO</a></td></tr><tr><td>0002 - Public API for modules</td><td><a href="/pages/fRixFKGMgN5KdHNSkY97">/pages/fRixFKGMgN5KdHNSkY97</a></td></tr><tr><td>0003 - Adopt Observable Data Services for Angular</td><td><a href="/pages/qfn2TE4r6GQc2IrypuC6">/pages/qfn2TE4r6GQc2IrypuC6</a></td></tr><tr><td>0004 - Refactor State Service</td><td><a href="/pages/XHcRhzUHXxSA7KVhrQEX">/pages/XHcRhzUHXxSA7KVhrQEX</a></td></tr><tr><td>0005 - Refactor Api Service</td><td><a href="/pages/E4Gt3niMCNXFDAPPZTAs">/pages/E4Gt3niMCNXFDAPPZTAs</a></td></tr><tr><td>0006 - Clients: Use Jest Mocks</td><td><a href="/pages/aOhqXBvw1Lm2nYSXr0MT">/pages/aOhqXBvw1Lm2nYSXr0MT</a></td></tr><tr><td>0007 - Manifest V3 sync Observables</td><td><a href="/pages/2elDdKbGQRlDKGXI5Y5s">/pages/2elDdKbGQRlDKGXI5Y5s</a></td></tr><tr><td>0008 - Server: Adopt CQRS</td><td><a href="/pages/eDK3SCtNQgkNrSHwNFov">/pages/eDK3SCtNQgkNrSHwNFov</a></td></tr><tr><td>0009 - Composition over inheritance</td><td><a href="/pages/SqEv5519euJ6PY9zgUq9">/pages/SqEv5519euJ6PY9zgUq9</a></td></tr><tr><td>0010 - Angular Modules</td><td><a href="/pages/eSaCaWrYeualjpa8btRH">/pages/eSaCaWrYeualjpa8btRH</a></td></tr><tr><td>0011 - Angular Clients folder structure</td><td><a href="/pages/3kc1BW3XGWad149gk7Cj">/pages/3kc1BW3XGWad149gk7Cj</a></td></tr><tr><td>0012 - Angular Filename convention</td><td><a href="/pages/vkYaHQSDEiUeveRdQUe3">/pages/vkYaHQSDEiUeveRdQUe3</a></td></tr><tr><td>0013 - Avoid layered folder structure</td><td><a href="/pages/y1AbjH7oEaxAHvQm1eyl">/pages/y1AbjH7oEaxAHvQm1eyl</a></td></tr><tr><td>0014 - Adopt Typescript Strict flag</td><td><a href="/pages/D7IoHtuD2Ob1zNp5VTa9">/pages/D7IoHtuD2Ob1zNp5VTa9</a></td></tr><tr><td>0015 - Short Lived Browser Services</td><td><a href="/pages/YwaQCWudc87xQExIogcZ">/pages/YwaQCWudc87xQExIogcZ</a></td></tr><tr><td>0016 - Move Decryption and Encryption to Views</td><td><a href="/pages/V2P4K07QxZ4FHxA19hWe">/pages/V2P4K07QxZ4FHxA19hWe</a></td></tr><tr><td>0017 - Use Swift to build watchOS app</td><td><a href="/pages/LkcdeFCpXa7D0lec4h6j">/pages/LkcdeFCpXa7D0lec4h6j</a></td></tr><tr><td>0018 - Feature management</td><td><a href="/pages/Mav7TqfQbZWvlGAFRVBK">/pages/Mav7TqfQbZWvlGAFRVBK</a></td></tr><tr><td>0019 - Adoption of Web Push</td><td><a href="/pages/63zO9V0qUV9SHLisxmkd">/pages/63zO9V0qUV9SHLisxmkd</a></td></tr><tr><td>0020 - Observability with OpenTelemetry</td><td><a href="/pages/ceccgiHSHU10egflR3xo">/pages/ceccgiHSHU10egflR3xo</a></td></tr><tr><td>0021 - Logging to Standard Output</td><td><a href="/pages/joTT0g9UoncKXQzKib7T">/pages/joTT0g9UoncKXQzKib7T</a></td></tr></tbody></table>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://dev.ppgg.in/architecture/adr.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
