symkit-mcp 1.0.0__tar.gz

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 (125) hide show
  1. symkit_mcp-1.0.0/.editorconfig +47 -0
  2. symkit_mcp-1.0.0/.env.example +22 -0
  3. symkit_mcp-1.0.0/.github/ISSUE_TEMPLATE/bug_report.md +33 -0
  4. symkit_mcp-1.0.0/.github/ISSUE_TEMPLATE/feature_request.md +22 -0
  5. symkit_mcp-1.0.0/.github/bylaws/ddd-architecture.md +219 -0
  6. symkit_mcp-1.0.0/.github/bylaws/git-workflow.md +43 -0
  7. symkit_mcp-1.0.0/.github/bylaws/python-environment.md +251 -0
  8. symkit_mcp-1.0.0/.github/copilot-instructions.md +73 -0
  9. symkit_mcp-1.0.0/.github/workflows/release.yml +79 -0
  10. symkit_mcp-1.0.0/.github/zotero-research-workflow.md +116 -0
  11. symkit_mcp-1.0.0/.gitignore +74 -0
  12. symkit_mcp-1.0.0/.python-version +1 -0
  13. symkit_mcp-1.0.0/AGENTS.md +79 -0
  14. symkit_mcp-1.0.0/ARCHITECTURE.md +153 -0
  15. symkit_mcp-1.0.0/CHANGELOG.md +107 -0
  16. symkit_mcp-1.0.0/CLAUDE.md +111 -0
  17. symkit_mcp-1.0.0/CODE_OF_CONDUCT.md +35 -0
  18. symkit_mcp-1.0.0/CONSTITUTION.md +90 -0
  19. symkit_mcp-1.0.0/CONTRIBUTING.md +69 -0
  20. symkit_mcp-1.0.0/LICENSE +190 -0
  21. symkit_mcp-1.0.0/PKG-INFO +340 -0
  22. symkit_mcp-1.0.0/README.md +303 -0
  23. symkit_mcp-1.0.0/README.zh-CN.md +284 -0
  24. symkit_mcp-1.0.0/ROADMAP.md +50 -0
  25. symkit_mcp-1.0.0/SECURITY.md +35 -0
  26. symkit_mcp-1.0.0/docs/composable-formula-modification-engine.md +964 -0
  27. symkit_mcp-1.0.0/docs/design-evolution-derivation-framework.md +415 -0
  28. symkit_mcp-1.0.0/docs/reproducible-derivation-tools.md +661 -0
  29. symkit_mcp-1.0.0/docs/symkit-design.md +655 -0
  30. symkit_mcp-1.0.0/docs/symkit-design.zh-CN.md +653 -0
  31. symkit_mcp-1.0.0/docs/symkit-vs-sympy-mcp.md +305 -0
  32. symkit_mcp-1.0.0/docs/template-system-design.md +469 -0
  33. symkit_mcp-1.0.0/docs/value-proposition-analysis.md +347 -0
  34. symkit_mcp-1.0.0/formulas/README.md +73 -0
  35. symkit_mcp-1.0.0/formulas/README.zh-CN.md +70 -0
  36. symkit_mcp-1.0.0/formulas/library/README.md +39 -0
  37. symkit_mcp-1.0.0/formulas/library/fluid_dynamics/continuity_incompressible.yaml +24 -0
  38. symkit_mcp-1.0.0/formulas/library/fluid_dynamics/euler_equations_inviscid.yaml +33 -0
  39. symkit_mcp-1.0.0/formulas/library/fluid_dynamics/ns_incompressible.yaml +33 -0
  40. symkit_mcp-1.0.0/formulas/library/fluid_dynamics/reynolds_number.yaml +32 -0
  41. symkit_mcp-1.0.0/formulas/library/mechanics/newtons_second_law.yaml +29 -0
  42. symkit_mcp-1.0.0/formulas/library/thermodynamics/ideal_gas_law.yaml +35 -0
  43. symkit_mcp-1.0.0/pyproject.toml +144 -0
  44. symkit_mcp-1.0.0/src/symkit/__init__.py +34 -0
  45. symkit_mcp-1.0.0/src/symkit/application/__init__.py +6 -0
  46. symkit_mcp-1.0.0/src/symkit/application/use_cases.py +297 -0
  47. symkit_mcp-1.0.0/src/symkit/domain/__init__.py +6 -0
  48. symkit_mcp-1.0.0/src/symkit/domain/assumption_engine.py +178 -0
  49. symkit_mcp-1.0.0/src/symkit/domain/derivation_goal.py +284 -0
  50. symkit_mcp-1.0.0/src/symkit/domain/derivation_pattern.py +230 -0
  51. symkit_mcp-1.0.0/src/symkit/domain/derivation_planner.py +204 -0
  52. symkit_mcp-1.0.0/src/symkit/domain/derivation_session.py +1692 -0
  53. symkit_mcp-1.0.0/src/symkit/domain/entities.py +86 -0
  54. symkit_mcp-1.0.0/src/symkit/domain/expression_parser.py +655 -0
  55. symkit_mcp-1.0.0/src/symkit/domain/formula.py +892 -0
  56. symkit_mcp-1.0.0/src/symkit/domain/formula_library.py +333 -0
  57. symkit_mcp-1.0.0/src/symkit/domain/formula_recommender.py +254 -0
  58. symkit_mcp-1.0.0/src/symkit/domain/formula_search_query.py +194 -0
  59. symkit_mcp-1.0.0/src/symkit/domain/math_domain.py +79 -0
  60. symkit_mcp-1.0.0/src/symkit/domain/paths.py +109 -0
  61. symkit_mcp-1.0.0/src/symkit/domain/services.py +237 -0
  62. symkit_mcp-1.0.0/src/symkit/domain/step_verifier.py +528 -0
  63. symkit_mcp-1.0.0/src/symkit/domain/symbol_registry.py +382 -0
  64. symkit_mcp-1.0.0/src/symkit/domain/value_objects.py +134 -0
  65. symkit_mcp-1.0.0/src/symkit/infrastructure/__init__.py +6 -0
  66. symkit_mcp-1.0.0/src/symkit/infrastructure/adapters/__init__.py +46 -0
  67. symkit_mcp-1.0.0/src/symkit/infrastructure/adapters/base.py +117 -0
  68. symkit_mcp-1.0.0/src/symkit/infrastructure/adapters/biomodels.py +443 -0
  69. symkit_mcp-1.0.0/src/symkit/infrastructure/adapters/local_formula.py +80 -0
  70. symkit_mcp-1.0.0/src/symkit/infrastructure/adapters/scipy_constants.py +411 -0
  71. symkit_mcp-1.0.0/src/symkit/infrastructure/adapters/wikidata_formulas.py +705 -0
  72. symkit_mcp-1.0.0/src/symkit/infrastructure/derivation_repository.py +299 -0
  73. symkit_mcp-1.0.0/src/symkit/infrastructure/sympy_engine.py +590 -0
  74. symkit_mcp-1.0.0/src/symkit/infrastructure/verifier.py +195 -0
  75. symkit_mcp-1.0.0/src/symkit/py.typed +2 -0
  76. symkit_mcp-1.0.0/src/symkit/resources/__init__.py +20 -0
  77. symkit_mcp-1.0.0/src/symkit/resources/formula_search_config.yaml +103 -0
  78. symkit_mcp-1.0.0/src/symkit/resources/seed_formulas/fluid_dynamics/continuity_incompressible.yaml +24 -0
  79. symkit_mcp-1.0.0/src/symkit/resources/seed_formulas/fluid_dynamics/euler_equations_inviscid.yaml +33 -0
  80. symkit_mcp-1.0.0/src/symkit/resources/seed_formulas/fluid_dynamics/ns_incompressible.yaml +33 -0
  81. symkit_mcp-1.0.0/src/symkit/resources/seed_formulas/fluid_dynamics/reynolds_number.yaml +32 -0
  82. symkit_mcp-1.0.0/src/symkit/resources/seed_formulas/mechanics/newtons_second_law.yaml +29 -0
  83. symkit_mcp-1.0.0/src/symkit/resources/seed_formulas/thermodynamics/ideal_gas_law.yaml +35 -0
  84. symkit_mcp-1.0.0/src/symkit_mcp/__init__.py +8 -0
  85. symkit_mcp-1.0.0/src/symkit_mcp/py.typed +2 -0
  86. symkit_mcp-1.0.0/src/symkit_mcp/server.py +47 -0
  87. symkit_mcp-1.0.0/src/symkit_mcp/tools/__init__.py +54 -0
  88. symkit_mcp-1.0.0/src/symkit_mcp/tools/_expression_parser.py +14 -0
  89. symkit_mcp-1.0.0/src/symkit_mcp/tools/_state.py +44 -0
  90. symkit_mcp-1.0.0/src/symkit_mcp/tools/assumptions.py +172 -0
  91. symkit_mcp-1.0.0/src/symkit_mcp/tools/codegen.py +358 -0
  92. symkit_mcp-1.0.0/src/symkit_mcp/tools/formula.py +504 -0
  93. symkit_mcp-1.0.0/src/symkit_mcp/tools/math.py +762 -0
  94. symkit_mcp-1.0.0/src/symkit_mcp/tools/orchestration.py +634 -0
  95. symkit_mcp-1.0.0/src/symkit_mcp/tools/session.py +1005 -0
  96. symkit_mcp-1.0.0/src/symkit_mcp/tools/symbols.py +190 -0
  97. symkit_mcp-1.0.0/templates/archive/README.md +30 -0
  98. symkit_mcp-1.0.0/templates/archive/rc_lowpass.yaml +323 -0
  99. symkit_mcp-1.0.0/tests/__init__.py +3 -0
  100. symkit_mcp-1.0.0/tests/conftest.py +99 -0
  101. symkit_mcp-1.0.0/tests/test_derivation_engine.py +176 -0
  102. symkit_mcp-1.0.0/tests/test_derivation_examples.py +437 -0
  103. symkit_mcp-1.0.0/tests/test_derivation_examples_extended.py +446 -0
  104. symkit_mcp-1.0.0/tests/test_derivation_goal.py +103 -0
  105. symkit_mcp-1.0.0/tests/test_derivation_planner.py +198 -0
  106. symkit_mcp-1.0.0/tests/test_domain.py +107 -0
  107. symkit_mcp-1.0.0/tests/test_domain_services.py +151 -0
  108. symkit_mcp-1.0.0/tests/test_expression_parser.py +269 -0
  109. symkit_mcp-1.0.0/tests/test_external_adapters.py +114 -0
  110. symkit_mcp-1.0.0/tests/test_formula_recommender.py +269 -0
  111. symkit_mcp-1.0.0/tests/test_formula_search.py +442 -0
  112. symkit_mcp-1.0.0/tests/test_math_transforms.py +101 -0
  113. symkit_mcp-1.0.0/tests/test_mcp_e2e.py +109 -0
  114. symkit_mcp-1.0.0/tests/test_mcp_minimal.py +57 -0
  115. symkit_mcp-1.0.0/tests/test_orchestration_external.py +173 -0
  116. symkit_mcp-1.0.0/tests/test_orchestration_tools.py +189 -0
  117. symkit_mcp-1.0.0/tests/test_session_goal_tools.py +183 -0
  118. symkit_mcp-1.0.0/tests/test_session_tools.py +134 -0
  119. symkit_mcp-1.0.0/tests/test_session_verification.py +114 -0
  120. symkit_mcp-1.0.0/tests/test_session_verify_tools.py +121 -0
  121. symkit_mcp-1.0.0/tests/test_step_crud.py +181 -0
  122. symkit_mcp-1.0.0/tests/test_step_verifier.py +218 -0
  123. symkit_mcp-1.0.0/tests/test_sympy_engine.py +182 -0
  124. symkit_mcp-1.0.0/tests/test_unified_math_coverage.py +113 -0
  125. symkit_mcp-1.0.0/uv.lock +1609 -0
@@ -0,0 +1,47 @@
1
+ # EditorConfig - 跨編輯器格式一致性
2
+ # https://editorconfig.org
3
+
4
+ root = true
5
+
6
+ # 所有檔案的預設設定
7
+ [*]
8
+ charset = utf-8
9
+ end_of_line = lf
10
+ insert_final_newline = true
11
+ trim_trailing_whitespace = true
12
+ indent_style = space
13
+ indent_size = 4
14
+
15
+ # Python
16
+ [*.py]
17
+ indent_size = 4
18
+ max_line_length = 88
19
+
20
+ # JavaScript / TypeScript
21
+ [*.{js,jsx,ts,tsx}]
22
+ indent_size = 2
23
+
24
+ # JSON / YAML
25
+ [*.{json,yml,yaml}]
26
+ indent_size = 2
27
+
28
+ # Markdown
29
+ [*.md]
30
+ trim_trailing_whitespace = false
31
+ indent_size = 2
32
+
33
+ # TOML
34
+ [*.toml]
35
+ indent_size = 4
36
+
37
+ # Makefile (必須用 tab)
38
+ [Makefile]
39
+ indent_style = tab
40
+
41
+ # Shell scripts
42
+ [*.sh]
43
+ indent_size = 2
44
+
45
+ # Git
46
+ [.git*]
47
+ indent_size = 2
@@ -0,0 +1,22 @@
1
+ # 環境變數範例
2
+ # 複製此檔案為 .env 並填入實際值
3
+
4
+ # 應用程式設定
5
+ APP_NAME=workspace251215
6
+ APP_ENV=development
7
+ APP_DEBUG=true
8
+
9
+ # 資料庫設定
10
+ DB_HOST=localhost
11
+ DB_PORT=5432
12
+ DB_NAME=mydb
13
+ DB_USER=user
14
+ DB_PASSWORD=
15
+
16
+ # API 金鑰(請勿提交真實金鑰)
17
+ API_KEY=
18
+ SECRET_KEY=
19
+
20
+ # 外部服務
21
+ # OPENAI_API_KEY=
22
+ # ANTHROPIC_API_KEY=
@@ -0,0 +1,33 @@
1
+ ---
2
+ name: 🐛 Bug 回报
3
+ about: 回报一个问题
4
+ title: '[Bug] '
5
+ labels: bug
6
+ assignees: ''
7
+ ---
8
+
9
+ ## 问题描述
10
+ 简要描述这个 bug。
11
+
12
+ ## 重现步骤
13
+ 1. 前往 '...'
14
+ 2. 点击 '...'
15
+ 3. 滚动到 '...'
16
+ 4. 看到错误
17
+
18
+ ## 预期行为
19
+ 描述你预期会发生什么。
20
+
21
+ ## 实际行为
22
+ 描述实际发生了什么。
23
+
24
+ ## 截屏
25
+ 如果适用,添加截屏来帮助解释你的问题。
26
+
27
+ ## 环境信息
28
+ - OS: [例如 Windows 11]
29
+ - 版本: [例如 0.1.0]
30
+ - 其他相关信息
31
+
32
+ ## 额外备注
33
+ 其他关于这个问题的信息。
@@ -0,0 +1,22 @@
1
+ ---
2
+ name: ✨ 功能建议
3
+ about: 为此项目建议一个想法
4
+ title: '[Feature] '
5
+ labels: enhancement
6
+ assignees: ''
7
+ ---
8
+
9
+ ## 这个功能建议是否与某个问题相关?
10
+ 清楚简洁地描述问题是什么。例如:「每次 [...] 时我都很沮丧」
11
+
12
+ ## 描述你想要的解决方案
13
+ 清楚简洁地描述你希望发生什么。
14
+
15
+ ## 描述你考虑过的替代方案
16
+ 清楚简洁地描述你考虑过的任何替代解决方案或功能。
17
+
18
+ ## 使用场景
19
+ 描述这个功能会在什么情况下被使用。
20
+
21
+ ## 额外备注
22
+ 关于此功能建议的任何其他信息或截屏。
@@ -0,0 +1,219 @@
1
+ # 子法:DDD 架构规范
2
+
3
+ > 父法:CONSTITUTION.md 第一章
4
+
5
+ ## 第 1 条:目录结构
6
+
7
+ ```
8
+ src/
9
+ ├── Domain/ # 领域层(内核)
10
+ │ ├── Entities/ # 实体
11
+ │ ├── ValueObjects/ # 值对象
12
+ │ ├── Aggregates/ # 聚合根
13
+ │ ├── DomainServices/ # 领域服务
14
+ │ ├── DomainEvents/ # 领域事件
15
+ │ └── Repositories/ # Repository 接口(仅接口)
16
+
17
+ ├── Application/ # 应用层
18
+ │ ├── UseCases/ # 用例
19
+ │ ├── DTOs/ # 数据传输对象
20
+ │ ├── Services/ # 应用服务
21
+ │ └── Interfaces/ # 外部服务接口
22
+
23
+ ├── Infrastructure/ # 基础设施层
24
+ │ ├── Persistence/ # DAL 数据访问
25
+ │ │ ├── Repositories/ # Repository 实作
26
+ │ │ ├── DbContext/ # 数据库上下文
27
+ │ │ └── Migrations/ # 数据迁移
28
+ │ ├── ExternalServices/ # 外部服务实作
29
+ │ └── Messaging/ # 消息队列
30
+
31
+ └── Presentation/ # 呈现层
32
+ ├── API/ # REST API
33
+ ├── GraphQL/ # GraphQL(可选)
34
+ └── CLI/ # 命令行接口
35
+ ```
36
+
37
+ ## 第 2 条:依赖方向
38
+
39
+ ```
40
+ Presentation → Application → Domain
41
+
42
+ Infrastructure
43
+ ```
44
+
45
+ - Domain 不依赖任何外层
46
+ - Infrastructure 实作 Domain 定义的接口
47
+
48
+ ## 第 3 条:DAL 规范
49
+
50
+ ### 3.1 Repository 接口(在 Domain 层)
51
+ ```python
52
+ # Domain/Repositories/IUserRepository.py
53
+ class IUserRepository(ABC):
54
+ @abstractmethod
55
+ def get_by_id(self, id: UserId) -> Optional[User]: ...
56
+
57
+ @abstractmethod
58
+ def save(self, user: User) -> None: ...
59
+ ```
60
+
61
+ ### 3.2 Repository 实作(在 Infrastructure 层)
62
+ ```python
63
+ # Infrastructure/Persistence/Repositories/UserRepository.py
64
+ class UserRepository(IUserRepository):
65
+ def __init__(self, db_context: DbContext):
66
+ self._db = db_context
67
+
68
+ def get_by_id(self, id: UserId) -> Optional[User]:
69
+ # 实际数据库操作
70
+ ...
71
+ ```
72
+
73
+ ## 第 4 条:命名惯例
74
+
75
+ | 类型 | 命名规则 | 范例 |
76
+ |------|----------|------|
77
+ | Entity | 名词单数 | `User`, `Order` |
78
+ | Value Object | 描述性名词 | `EmailAddress`, `Money` |
79
+ | Repository | `I{Entity}Repository` | `IUserRepository` |
80
+ | Use Case | 动词 + 名词 | `CreateOrder`, `GetUserById` |
81
+ | Domain Event | 过去式 | `OrderCreated`, `UserRegistered` |
82
+
83
+ ---
84
+
85
+ ## 第 5 条:模块化规范
86
+
87
+ > 依据宪法第 7.3 条「主动重构原则」订定
88
+
89
+ ### 5.1 文件长度限制
90
+
91
+ | 类型 | 建议上限 | 硬性上限 | 超过时动作 |
92
+ |------|----------|----------|------------|
93
+ | 单一文件 | 200 行 | 400 行 | 必须拆分 |
94
+ | 类别 (Class) | 150 行 | 300 行 | 提取子类别或组合 |
95
+ | 函数 (Function) | 30 行 | 50 行 | 提取私有方法 |
96
+ | 模块 (目录) | 10 文件 | 15 文件 | 创建子模块 |
97
+
98
+ ### 5.2 复杂度指针
99
+
100
+ ```python
101
+ # 圈复杂度 (Cyclomatic Complexity)
102
+ # 建议 ≤ 10,硬性上限 15
103
+
104
+ # ❌ 过于复杂
105
+ def process_order(order):
106
+ if order.status == "pending":
107
+ if order.payment:
108
+ if order.payment.verified:
109
+ if order.items:
110
+ for item in order.items:
111
+ if item.in_stock:
112
+ # ... 更多嵌套
113
+
114
+ # ✅ 重构后
115
+ def process_order(order):
116
+ validate_order_status(order)
117
+ verify_payment(order.payment)
118
+ process_items(order.items)
119
+ ```
120
+
121
+ ### 5.3 模块拆分策略
122
+
123
+ 当 Domain 模块过大时,按 **子领域** 拆分:
124
+
125
+ ```
126
+ # Before: 单一 Domain
127
+ src/Domain/
128
+ ├── Entities/
129
+ │ ├── User.py
130
+ │ ├── Order.py
131
+ │ ├── Product.py
132
+ │ ├── Payment.py
133
+ │ └── Shipping.py # 太多了!
134
+
135
+ # After: 按子领域拆分
136
+ src/Domain/
137
+ ├── Identity/ # 身份子领域
138
+ │ ├── Entities/
139
+ │ │ └── User.py
140
+ │ └── ValueObjects/
141
+ │ └── Email.py
142
+
143
+ ├── Ordering/ # 订单子领域
144
+ │ ├── Entities/
145
+ │ │ └── Order.py
146
+ │ ├── ValueObjects/
147
+ │ │ └── OrderStatus.py
148
+ │ └── DomainServices/
149
+ │ └── OrderPricing.py
150
+
151
+ ├── Catalog/ # 商品目录子领域
152
+ │ └── Entities/
153
+ │ └── Product.py
154
+
155
+ └── Shipping/ # 物流子领域
156
+ └── Entities/
157
+ └── Shipment.py
158
+ ```
159
+
160
+ ### 5.4 Application 层拆分
161
+
162
+ 按 **功能群组** 或 **用例** 拆分:
163
+
164
+ ```
165
+ src/Application/
166
+ ├── Identity/ # 对应 Domain/Identity
167
+ │ ├── Commands/
168
+ │ │ ├── RegisterUser.py
169
+ │ │ └── ChangePassword.py
170
+ │ └── Queries/
171
+ │ └── GetUserProfile.py
172
+
173
+ ├── Ordering/ # 对应 Domain/Ordering
174
+ │ ├── Commands/
175
+ │ │ ├── CreateOrder.py
176
+ │ │ └── CancelOrder.py
177
+ │ └── Queries/
178
+ │ └── GetOrderHistory.py
179
+ ```
180
+
181
+ ### 5.5 重构触发条件
182
+
183
+ AI 应在以下情况 **主动建议** 重构:
184
+
185
+ | 触发条件 | 建议动作 |
186
+ |----------|----------|
187
+ | 文件超过 200 行 | 「这个文件有点长,建议拆分成...」 |
188
+ | 函数超过 30 行 | 「这个函数可以提取出...」 |
189
+ | 圈复杂度 > 10 | 「这段逻辑较复杂,建议...」 |
190
+ | 重复代码 | 「发现重复模式,建议抽取为...」 |
191
+ | 跨层依赖 | 「这里违反了 DDD 分层,应该...」 |
192
+
193
+ ---
194
+
195
+ ## 第 6 条:重构安全网
196
+
197
+ ### 6.1 重构前必须
198
+
199
+ 1. ✅ 确保有测试覆盖(覆盖率 ≥ 70%)
200
+ 2. ✅ 运行现有测试确认通过
201
+ 3. ✅ 记录重构原因到 `decisionLog.md`
202
+
203
+ ### 6.2 重构后必须
204
+
205
+ 1. ✅ 运行全部测试
206
+ 2. ✅ 检查架构是否仍符合 DDD
207
+ 3. ✅ 更新相关文档
208
+ 4. ✅ 更新 ARCHITECTURE.md
209
+
210
+ ### 6.3 重构模式参考
211
+
212
+ | 问题 | 重构模式 | 说明 |
213
+ |------|----------|------|
214
+ | 函数过长 | Extract Method | 提取私有方法 |
215
+ | 类别过大 | Extract Class | 提取新类别 |
216
+ | 重复代码 | Extract Superclass / Trait | 抽取共用逻辑 |
217
+ | 过多参数 | Introduce Parameter Object | 创建参数对象 |
218
+ | 条件过复杂 | Replace Conditional with Polymorphism | 用多态取代条件 |
219
+ | 跨层依赖 | Dependency Injection | 依赖注入 |
@@ -0,0 +1,43 @@
1
+ # 子法:Git 工作流规范
2
+
3
+ > 父法:CONSTITUTION.md 第三章
4
+
5
+ ## 第 1 条:提交前检查清单
6
+
7
+ 依序运行以下步骤:
8
+
9
+ | 顺序 | 项目 | 说明 | 可跳过 |
10
+ |------|------|------|--------|
11
+ | 1 | 运行测试 | `uv run pytest` | ❌ |
12
+ | 2 | Lint 检查 | `uv run ruff check src/ tests/` | ❌ |
13
+ | 3 | 类型检查 | `uv run mypy src/` | ❌ |
14
+ | 4 | README 更新 | 如用户可见行为变更 | ✅ |
15
+ | 5 | CHANGELOG 更新 | 如版本或功能变更 | ✅ |
16
+ | 6 | ROADMAP 标记 | 如进度推进 | ✅ |
17
+
18
+ ## 第 2 条:Commit Message 格式
19
+
20
+ ```
21
+ <type>(<scope>): <subject>
22
+
23
+ <body>
24
+
25
+ <footer>
26
+ ```
27
+
28
+ ### Type 类型
29
+ - `feat`: 新功能
30
+ - `fix`: 修复
31
+ - `docs`: 文档
32
+ - `refactor`: 重构
33
+ - `test`: 测试
34
+ - `chore`: 杂项
35
+
36
+ ## 第 3 条:分支策略
37
+
38
+ | 分支 | 用途 | 保护 |
39
+ |------|------|------|
40
+ | `main` | 稳定版本 | ✅ |
41
+ | `develop` | 开发集成 | ✅ |
42
+ | `feature/*` | 功能开发 | ❌ |
43
+ | `hotfix/*` | 紧急修复 | ❌ |
@@ -0,0 +1,251 @@
1
+ # Python 环境管理子法
2
+
3
+ > 依据宪法第 7.2 条「环境即代码」订定
4
+
5
+ ---
6
+
7
+ ## 第 1 条:套件管理器优先级
8
+
9
+ ```
10
+ uv > pip-tools > pip
11
+ ```
12
+
13
+ ### 1.1 uv 优先原则
14
+ 1. **新项目必须使用 uv** 作为套件管理器
15
+ 2. uv 速度比 pip 快 10-100 倍
16
+ 3. 原生支持 lockfile 和虚拟环境
17
+
18
+ ### 1.2 降级条件
19
+ 仅在以下情况可使用 pip:
20
+ - 旧项目迁移成本过高
21
+ - CI 环境不支持 uv
22
+ - 特殊依赖冲突
23
+
24
+ ---
25
+
26
+ ## 第 2 条:虚拟环境规范
27
+
28
+ ### 2.1 必须使用虚拟环境
29
+ ```bash
30
+ # ✅ 正确
31
+ uv venv
32
+ source .venv/bin/activate # Linux/macOS
33
+ .venv\Scripts\activate # Windows
34
+
35
+ # ❌ 禁止全域安装
36
+ pip install package # 在系统 Python 中
37
+ ```
38
+
39
+ ### 2.2 虚拟环境位置
40
+ ```
41
+ project/
42
+ ├── .venv/ # 虚拟环境(gitignore)
43
+ ├── pyproject.toml # 项目配置
44
+ └── uv.lock # 依赖锁定(版控)
45
+ ```
46
+
47
+ ### 2.3 Python 版本
48
+ - 本项目使用 Python 3.12+
49
+ - 版本在 `pyproject.toml` 中明确指定
50
+
51
+ ---
52
+
53
+ ## 第 3 条:依赖管理
54
+
55
+ ### 3.1 文件结构
56
+ ```
57
+ pyproject.toml # 主要依赖定义(必须)
58
+ uv.lock # 依赖锁定档(必须,纳入版控)
59
+ requirements.txt # 兼容性导出(可选,CI 用)
60
+ ```
61
+
62
+ ### 3.2 pyproject.toml 范本
63
+ ```toml
64
+ [project]
65
+ name = "my-project"
66
+ version = "0.1.0"
67
+ requires-python = ">=3.11"
68
+ dependencies = [
69
+ "fastapi>=0.104.0",
70
+ "sqlalchemy>=2.0.0",
71
+ ]
72
+
73
+ [project.optional-dependencies]
74
+ dev = [
75
+ "pytest>=7.4.0",
76
+ "pytest-cov>=4.1.0",
77
+ "ruff>=0.1.0",
78
+ "mypy>=1.5.0",
79
+ ]
80
+
81
+ [build-system]
82
+ requires = ["hatchling"]
83
+ build-backend = "hatchling.build"
84
+
85
+ [tool.uv]
86
+ dev-dependencies = [
87
+ "pytest>=7.4.0",
88
+ "ruff>=0.1.0",
89
+ ]
90
+ ```
91
+
92
+ ### 3.3 常用 uv 指令
93
+ ```bash
94
+ # 初始化项目
95
+ uv init my-project
96
+ cd my-project
97
+
98
+ # 创建虚拟环境
99
+ uv venv
100
+
101
+ # 安装依赖
102
+ uv pip install -e ".[dev]"
103
+ uv sync # 根据 uv.lock 同步
104
+
105
+ # 添加依赖
106
+ uv add fastapi
107
+ uv add --dev pytest
108
+
109
+ # 移除依赖
110
+ uv remove package-name
111
+
112
+ # 更新依赖
113
+ uv lock --upgrade
114
+
115
+ # 导出 requirements.txt(兼容 CI)
116
+ uv pip compile pyproject.toml -o requirements.txt
117
+ ```
118
+
119
+ ---
120
+
121
+ ## 第 4 条:项目初始化流程
122
+
123
+ ### 4.1 新项目(使用 uv)
124
+ ```bash
125
+ # 1. 创建项目
126
+ uv init my-project
127
+ cd my-project
128
+
129
+ # 2. 设置 Python 版本
130
+ uv python pin 3.12
131
+
132
+ # 3. 安装开发依赖
133
+ uv add --dev pytest ruff mypy
134
+
135
+ # 4. 创建目录结构
136
+ mkdir -p src/domain src/application src/infrastructure src/presentation
137
+ mkdir -p tests/unit tests/integration tests/e2e
138
+ touch src/__init__.py tests/__init__.py
139
+ ```
140
+
141
+ ### 4.2 现有项目迁移
142
+ ```bash
143
+ # 1. 从 requirements.txt 迁移
144
+ uv pip compile requirements.txt -o requirements.lock
145
+ uv venv
146
+ uv pip sync requirements.lock
147
+
148
+ # 2. 创建 pyproject.toml
149
+ uv init --no-workspace
150
+
151
+ # 3. 迁移依赖
152
+ uv add $(cat requirements.txt | grep -v "^#" | tr '\n' ' ')
153
+
154
+ # 4. 锁定依赖
155
+ uv lock
156
+ ```
157
+
158
+ ---
159
+
160
+ ## 第 5 条:CI/CD 集成
161
+
162
+ ### 5.1 GitHub Actions 使用 uv
163
+ ```yaml
164
+ jobs:
165
+ test:
166
+ runs-on: ubuntu-latest
167
+ steps:
168
+ - uses: actions/checkout@v4
169
+
170
+ - name: Install uv
171
+ uses: astral-sh/setup-uv@v4
172
+ with:
173
+ version: "latest"
174
+
175
+ - name: Set up Python
176
+ run: uv python install 3.11
177
+
178
+ - name: Install dependencies
179
+ run: uv sync --all-extras
180
+
181
+ - name: Run tests
182
+ run: uv run pytest
183
+ ```
184
+
185
+ ### 5.2 Docker 使用 uv
186
+ ```dockerfile
187
+ FROM python:3.11-slim
188
+
189
+ # 安装 uv(从官方映像拷贝)
190
+ COPY --from=ghcr.io/astral-sh/uv:latest /uv /usr/local/bin/uv
191
+
192
+ WORKDIR /app
193
+ COPY pyproject.toml uv.lock ./
194
+
195
+ # 安装依赖(不使用虚拟环境)
196
+ RUN uv pip install --system --no-cache -r pyproject.toml
197
+
198
+ COPY . .
199
+ CMD ["python", "-m", "src.main"]
200
+ ```
201
+
202
+ ### 5.3 uvx 工具运行(类似 npx)
203
+ ```bash
204
+ # 临时运行工具(不安装)
205
+ uvx ruff check .
206
+ uvx black --check .
207
+ uvx mypy src/
208
+
209
+ # 运行特定版本
210
+ uvx ruff@0.1.0 check .
211
+ ```
212
+
213
+ ---
214
+
215
+ ## 第 6 条:常见问题
216
+
217
+ ### Q1: uv 和 pip 可以混用吗?
218
+ A: 不建议。混用可能导致依赖冲突。若必须,先用 `uv pip` 取代 `pip`。
219
+
220
+ ### Q2: 为什么不用 Poetry/Pipenv?
221
+ A: uv 比 Poetry 快 10-100 倍,且与 pip 完全兼容。Poetry 的 resolver 较慢。
222
+
223
+ ### Q3: Windows 支持如何?
224
+ A: uv 完整支持 Windows。安装:`powershell -c "irm https://astral.sh/uv/install.ps1 | iex"`
225
+
226
+ ### Q4: 如何处理私有套件?
227
+ A: 在 `pyproject.toml` 中设置:
228
+ ```toml
229
+ [tool.uv]
230
+ index-url = "https://pypi.org/simple"
231
+ extra-index-url = ["https://your-private-pypi.com/simple"]
232
+ ```
233
+
234
+ ---
235
+
236
+ ## 附录:快速参考卡
237
+
238
+ | 操作 | uv 指令 | pip 对应 |
239
+ |------|---------|----------|
240
+ | 创建 venv | `uv venv` | `python -m venv .venv` |
241
+ | 安装套件 | `uv add package` | `pip install package` |
242
+ | 安装开发依赖 | `uv add --dev package` | `pip install package` |
243
+ | 安装全部 | `uv sync` | `pip install -r requirements.txt` |
244
+ | 更新 lock | `uv lock` | `pip-compile` |
245
+ | 运行命令 | `uv run pytest` | `pytest` |
246
+ | 查看依赖 | `uv pip list` | `pip list` |
247
+
248
+ ---
249
+
250
+ *本子法版本:v1.0.0*
251
+ *依据:宪法第 7.2 条*
@@ -0,0 +1,73 @@
1
+ # Copilot Custom Instructions
2
+
3
+ This document provides project context for VS Code GitHub Copilot Agent Mode.
4
+
5
+ ---
6
+
7
+ ## Development Philosophy
8
+
9
+ - Write or update design docs before changing behavior.
10
+ - Add tests to `tests/` for any new logic.
11
+ - Keep the Domain Layer free of external dependencies.
12
+
13
+ ---
14
+
15
+ ## Governance
16
+
17
+ You must follow this hierarchy:
18
+
19
+ 1. **Constitution**: `CONSTITUTION.md` — top-level principles, must not be violated
20
+ 2. **Bylaws**: `.github/bylaws/*.md` — detailed rules
21
+
22
+ ---
23
+
24
+ ## Architecture Principles
25
+
26
+ - **Domain-Driven Design (DDD)**
27
+ - **Data Access Layer (DAL) must be independent**
28
+ - Dependency direction: `Presentation → Application → Domain ← Infrastructure`
29
+
30
+ See `.github/bylaws/ddd-architecture.md` for details.
31
+
32
+ ---
33
+
34
+ ## Python Environment (uv preferred)
35
+
36
+ - Prefer **uv** for package and virtual environment management.
37
+ - New projects must create `pyproject.toml` + `uv.lock`.
38
+ - Do not install packages globally.
39
+
40
+ ```bash
41
+ # Initialize environment
42
+ uv venv
43
+ uv sync --all-extras
44
+
45
+ # Install dependencies
46
+ uv add package-name
47
+ uv add --dev pytest ruff
48
+ ```
49
+
50
+ See `.github/bylaws/python-environment.md` for details.
51
+
52
+ ---
53
+
54
+ ## Git Workflow
55
+
56
+ Before committing, run this checklist:
57
+
58
+ 1. ✅ Run tests: `uv run pytest`
59
+ 2. ✅ Run lint: `uv run ruff check src/ tests/`
60
+ 3. ✅ Run type check: `uv run mypy src/`
61
+ 4. 📖 Update README if user-facing behavior changed
62
+ 5. 📋 Update CHANGELOG if applicable
63
+ 6. 🗺️ Update ROADMAP if progress was made
64
+
65
+ See `.github/bylaws/git-workflow.md` for details.
66
+
67
+ ---
68
+
69
+ ## Project Notes
70
+
71
+ - SymKit is a **domain-agnostic** symbolic formula derivation engine.
72
+ - It exposes **43 MCP tools** for math, derivation sessions, assumptions, verification, and orchestration.
73
+ - Respond in Simplified Chinese when the user writes in Chinese.