code-constraints 0.1.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 (884) hide show
  1. code_constraints-0.1.0/.gitattributes +19 -0
  2. code_constraints-0.1.0/.github/actions/build-dist/action.yml +58 -0
  3. code_constraints-0.1.0/.github/scripts/verify_dist.py +115 -0
  4. code_constraints-0.1.0/.github/workflows/ci.yml +95 -0
  5. code_constraints-0.1.0/.github/workflows/publish.yml +94 -0
  6. code_constraints-0.1.0/.gitignore +37 -0
  7. code_constraints-0.1.0/LICENSE +21 -0
  8. code_constraints-0.1.0/Makefile +237 -0
  9. code_constraints-0.1.0/PKG-INFO +663 -0
  10. code_constraints-0.1.0/README.md +612 -0
  11. code_constraints-0.1.0/docs/CLI_REFERENCE.md +1346 -0
  12. code_constraints-0.1.0/docs/MCP.md +234 -0
  13. code_constraints-0.1.0/docs/RULES_CATALOGUE.md +1786 -0
  14. code_constraints-0.1.0/docs/TUTORIAL.md +1493 -0
  15. code_constraints-0.1.0/docs/languages/CSHARP.md +203 -0
  16. code_constraints-0.1.0/docs/languages/JULIA.md +321 -0
  17. code_constraints-0.1.0/docs/languages/LUA.md +331 -0
  18. code_constraints-0.1.0/docs/languages/ODIN.md +347 -0
  19. code_constraints-0.1.0/docs/languages/PYTHON.md +232 -0
  20. code_constraints-0.1.0/docs/languages/README.md +128 -0
  21. code_constraints-0.1.0/docs/languages/TYPESCRIPT-SVELTE.md +133 -0
  22. code_constraints-0.1.0/examples/README.md +210 -0
  23. code_constraints-0.1.0/examples/csharp_demo/.cdec/.gitignore +1 -0
  24. code_constraints-0.1.0/examples/csharp_demo/.cdec/README.md +48 -0
  25. code_constraints-0.1.0/examples/csharp_demo/.cdec/reference.xmi +282 -0
  26. code_constraints-0.1.0/examples/csharp_demo/.cdec/rules.yaml +227 -0
  27. code_constraints-0.1.0/examples/csharp_demo/Catalog/Author.cs +17 -0
  28. code_constraints-0.1.0/examples/csharp_demo/Catalog/Book.cs +32 -0
  29. code_constraints-0.1.0/examples/csharp_demo/Notifications/INotifier.cs +6 -0
  30. code_constraints-0.1.0/examples/csharp_demo/Notifications/SmsNotifier.cs +13 -0
  31. code_constraints-0.1.0/examples/csharp_demo/Notifications/WhatsAppNotifier.cs +15 -0
  32. code_constraints-0.1.0/examples/csharp_demo/Orders/Billing.cs +99 -0
  33. code_constraints-0.1.0/examples/csharp_demo/Orders/Cart.cs +57 -0
  34. code_constraints-0.1.0/examples/csharp_demo/Orders/Order.cs +40 -0
  35. code_constraints-0.1.0/examples/csharp_demo/Orders/OrderItem.cs +20 -0
  36. code_constraints-0.1.0/examples/csharp_demo/Orders/OrderStatus.cs +9 -0
  37. code_constraints-0.1.0/examples/csharp_demo/Users/Admin.cs +17 -0
  38. code_constraints-0.1.0/examples/csharp_demo/Users/Customer.cs +25 -0
  39. code_constraints-0.1.0/examples/csharp_demo/Users/User.cs +15 -0
  40. code_constraints-0.1.0/examples/csharp_demo/class_diagram.xmi +221 -0
  41. code_constraints-0.1.0/examples/csharp_demo/class_diagram_old.xmi +224 -0
  42. code_constraints-0.1.0/examples/csharp_mvc_demo/.cdec/.gitignore +1 -0
  43. code_constraints-0.1.0/examples/csharp_mvc_demo/.cdec/reference.xmi +89 -0
  44. code_constraints-0.1.0/examples/csharp_mvc_demo/.cdec/rules.yaml +128 -0
  45. code_constraints-0.1.0/examples/csharp_mvc_demo/Controller/IController.cs +15 -0
  46. code_constraints-0.1.0/examples/csharp_mvc_demo/Controller/TodoController.cs +46 -0
  47. code_constraints-0.1.0/examples/csharp_mvc_demo/Model/TodoItem.cs +33 -0
  48. code_constraints-0.1.0/examples/csharp_mvc_demo/Model/TodoRepository.cs +33 -0
  49. code_constraints-0.1.0/examples/csharp_mvc_demo/README.md +129 -0
  50. code_constraints-0.1.0/examples/csharp_mvc_demo/View/IView.cs +19 -0
  51. code_constraints-0.1.0/examples/csharp_mvc_demo/View/TodoConsoleView.cs +37 -0
  52. code_constraints-0.1.0/examples/julia_demo/.cdec/.gitignore +2 -0
  53. code_constraints-0.1.0/examples/julia_demo/.cdec/reference.xmi +105 -0
  54. code_constraints-0.1.0/examples/julia_demo/.cdec/rules.yaml +147 -0
  55. code_constraints-0.1.0/examples/julia_demo/CdecRules.jl +129 -0
  56. code_constraints-0.1.0/examples/julia_demo/catalog/Catalog.jl +20 -0
  57. code_constraints-0.1.0/examples/julia_demo/orders/Billing.jl +84 -0
  58. code_constraints-0.1.0/examples/julia_demo/orders/Cart.jl +25 -0
  59. code_constraints-0.1.0/examples/lua_demo/.cdec/.gitignore +2 -0
  60. code_constraints-0.1.0/examples/lua_demo/.cdec/reference.xmi +109 -0
  61. code_constraints-0.1.0/examples/lua_demo/.cdec/rules.yaml +147 -0
  62. code_constraints-0.1.0/examples/lua_demo/catalog/book.lua +30 -0
  63. code_constraints-0.1.0/examples/lua_demo/cdec_rules.lua +92 -0
  64. code_constraints-0.1.0/examples/lua_demo/orders/billing.lua +111 -0
  65. code_constraints-0.1.0/examples/lua_demo/orders/cart.lua +24 -0
  66. code_constraints-0.1.0/examples/odin_demo/.cdec/.gitignore +2 -0
  67. code_constraints-0.1.0/examples/odin_demo/.cdec/reference.xmi +105 -0
  68. code_constraints-0.1.0/examples/odin_demo/.cdec/rules.yaml +147 -0
  69. code_constraints-0.1.0/examples/odin_demo/catalog/book.odin +20 -0
  70. code_constraints-0.1.0/examples/odin_demo/cdec_rules.odin +67 -0
  71. code_constraints-0.1.0/examples/odin_demo/orders/billing.odin +90 -0
  72. code_constraints-0.1.0/examples/odin_demo/orders/cart.odin +21 -0
  73. code_constraints-0.1.0/examples/python_demo/.cdec/.gitignore +1 -0
  74. code_constraints-0.1.0/examples/python_demo/.cdec/README.md +51 -0
  75. code_constraints-0.1.0/examples/python_demo/.cdec/reference.xmi +334 -0
  76. code_constraints-0.1.0/examples/python_demo/.cdec/rules.yaml +228 -0
  77. code_constraints-0.1.0/examples/python_demo/catalog/__init__.py +1 -0
  78. code_constraints-0.1.0/examples/python_demo/catalog/author.py +11 -0
  79. code_constraints-0.1.0/examples/python_demo/catalog/book.py +28 -0
  80. code_constraints-0.1.0/examples/python_demo/cdec_rules.py +94 -0
  81. code_constraints-0.1.0/examples/python_demo/notifications/__init__.py +1 -0
  82. code_constraints-0.1.0/examples/python_demo/notifications/base.py +30 -0
  83. code_constraints-0.1.0/examples/python_demo/orders/__init__.py +1 -0
  84. code_constraints-0.1.0/examples/python_demo/orders/billing.py +97 -0
  85. code_constraints-0.1.0/examples/python_demo/orders/cart.py +49 -0
  86. code_constraints-0.1.0/examples/python_demo/orders/order.py +24 -0
  87. code_constraints-0.1.0/examples/python_demo/orders/status.py +10 -0
  88. code_constraints-0.1.0/examples/python_demo/users/__init__.py +1 -0
  89. code_constraints-0.1.0/examples/python_demo/users/user.py +37 -0
  90. code_constraints-0.1.0/examples/svelte_demo/README.md +73 -0
  91. code_constraints-0.1.0/examples/svelte_demo/src/components/BookCard.svelte +28 -0
  92. code_constraints-0.1.0/examples/svelte_demo/src/components/CartView.svelte +35 -0
  93. code_constraints-0.1.0/examples/svelte_demo/src/components/PriceTag.svelte +9 -0
  94. code_constraints-0.1.0/examples/svelte_demo/src/lib/cart.ts +30 -0
  95. code_constraints-0.1.0/examples/svelte_demo/src/lib/catalog.ts +29 -0
  96. code_constraints-0.1.0/examples/svelte_demo/src/routes/Storefront.svelte +39 -0
  97. code_constraints-0.1.0/examples/typescript_demo/README.md +47 -0
  98. code_constraints-0.1.0/examples/typescript_demo/src/catalog/author.ts +14 -0
  99. code_constraints-0.1.0/examples/typescript_demo/src/catalog/book.ts +26 -0
  100. code_constraints-0.1.0/examples/typescript_demo/src/notifications/base.ts +36 -0
  101. code_constraints-0.1.0/examples/typescript_demo/src/orders/cart.ts +53 -0
  102. code_constraints-0.1.0/examples/typescript_demo/src/orders/order.ts +28 -0
  103. code_constraints-0.1.0/examples/typescript_demo/src/orders/status.ts +7 -0
  104. code_constraints-0.1.0/examples/typescript_demo/src/users/user.ts +46 -0
  105. code_constraints-0.1.0/frontend/index.html +12 -0
  106. code_constraints-0.1.0/frontend/package-lock.json +1723 -0
  107. code_constraints-0.1.0/frontend/package.json +25 -0
  108. code_constraints-0.1.0/frontend/src/App.svelte +315 -0
  109. code_constraints-0.1.0/frontend/src/components/DiagramToolbar.svelte +199 -0
  110. code_constraints-0.1.0/frontend/src/components/DiagramViewer.svelte +449 -0
  111. code_constraints-0.1.0/frontend/src/components/DiffViewer.svelte +111 -0
  112. code_constraints-0.1.0/frontend/src/components/HomePage.svelte +782 -0
  113. code_constraints-0.1.0/frontend/src/components/ProjectPicker.svelte +83 -0
  114. code_constraints-0.1.0/frontend/src/components/diagram/ActivityDiagramFlow.svelte +192 -0
  115. code_constraints-0.1.0/frontend/src/components/diagram/ActivityNode.svelte +88 -0
  116. code_constraints-0.1.0/frontend/src/components/diagram/ClassDiagramFlow.svelte +339 -0
  117. code_constraints-0.1.0/frontend/src/components/diagram/ClassNode.svelte +286 -0
  118. code_constraints-0.1.0/frontend/src/components/diagram/DiagramLegend.svelte +112 -0
  119. code_constraints-0.1.0/frontend/src/components/diagram/EdgeFocusModal.svelte +143 -0
  120. code_constraints-0.1.0/frontend/src/components/diagram/FitOnSelect.svelte +31 -0
  121. code_constraints-0.1.0/frontend/src/components/diagram/FragmentNode.svelte +75 -0
  122. code_constraints-0.1.0/frontend/src/components/diagram/LifelineNode.svelte +100 -0
  123. code_constraints-0.1.0/frontend/src/components/diagram/MessageEdge.svelte +91 -0
  124. code_constraints-0.1.0/frontend/src/components/diagram/PackageDiagramFlow.svelte +185 -0
  125. code_constraints-0.1.0/frontend/src/components/diagram/PackageNode.svelte +89 -0
  126. code_constraints-0.1.0/frontend/src/components/diagram/SequenceDiagramFlow.svelte +233 -0
  127. code_constraints-0.1.0/frontend/src/components/diagram/sequenceTypes.ts +26 -0
  128. code_constraints-0.1.0/frontend/src/components/diagram/types.ts +19 -0
  129. code_constraints-0.1.0/frontend/src/components/diff/ActivityDiffWalkthrough.svelte +233 -0
  130. code_constraints-0.1.0/frontend/src/components/diff/DiffWalkthrough.svelte +202 -0
  131. code_constraints-0.1.0/frontend/src/components/diff/SequenceDiffWalkthrough.svelte +197 -0
  132. code_constraints-0.1.0/frontend/src/components/editor/AssociationEditModal.svelte +141 -0
  133. code_constraints-0.1.0/frontend/src/components/editor/AttributeEditModal.svelte +171 -0
  134. code_constraints-0.1.0/frontend/src/components/editor/ClassEditModal.svelte +440 -0
  135. code_constraints-0.1.0/frontend/src/components/editor/EdgeKindPickerModal.svelte +80 -0
  136. code_constraints-0.1.0/frontend/src/components/editor/EditableClassNode.svelte +253 -0
  137. code_constraints-0.1.0/frontend/src/components/editor/EditorCanvas.svelte +203 -0
  138. code_constraints-0.1.0/frontend/src/components/editor/EditorFlowView.svelte +263 -0
  139. code_constraints-0.1.0/frontend/src/components/editor/EditorModals.svelte +114 -0
  140. code_constraints-0.1.0/frontend/src/components/editor/EditorPage.svelte +229 -0
  141. code_constraints-0.1.0/frontend/src/components/editor/EditorTextPanel.svelte +145 -0
  142. code_constraints-0.1.0/frontend/src/components/editor/Modal.svelte +108 -0
  143. code_constraints-0.1.0/frontend/src/components/editor/OperationEditModal.svelte +230 -0
  144. code_constraints-0.1.0/frontend/src/components/panel/ActivityListPanel.svelte +275 -0
  145. code_constraints-0.1.0/frontend/src/components/panel/ClassDetailsPanel.svelte +170 -0
  146. code_constraints-0.1.0/frontend/src/components/panel/ClassListPanel.svelte +561 -0
  147. code_constraints-0.1.0/frontend/src/components/panel/CollapsibleSection.svelte +88 -0
  148. code_constraints-0.1.0/frontend/src/components/panel/LayerClassesModal.svelte +180 -0
  149. code_constraints-0.1.0/frontend/src/components/panel/LayerDependenciesModal.svelte +143 -0
  150. code_constraints-0.1.0/frontend/src/components/panel/PackageListPanel.svelte +288 -0
  151. code_constraints-0.1.0/frontend/src/components/panel/SavedViewsPanel.svelte +361 -0
  152. code_constraints-0.1.0/frontend/src/components/panel/SequenceListPanel.svelte +266 -0
  153. code_constraints-0.1.0/frontend/src/lib/api.ts +587 -0
  154. code_constraints-0.1.0/frontend/src/lib/kinds.ts +28 -0
  155. code_constraints-0.1.0/frontend/src/lib/layout/dagre.ts +68 -0
  156. code_constraints-0.1.0/frontend/src/lib/rules.ts +92 -0
  157. code_constraints-0.1.0/frontend/src/lib/state/diagram.svelte.ts +278 -0
  158. code_constraints-0.1.0/frontend/src/lib/state/edgeFocus.svelte.ts +57 -0
  159. code_constraints-0.1.0/frontend/src/lib/state/editor.svelte.ts +402 -0
  160. code_constraints-0.1.0/frontend/src/lib/state/layerClasses.svelte.ts +18 -0
  161. code_constraints-0.1.0/frontend/src/lib/state/layers.svelte.ts +19 -0
  162. code_constraints-0.1.0/frontend/src/lib/views.ts +184 -0
  163. code_constraints-0.1.0/frontend/src/main.ts +8 -0
  164. code_constraints-0.1.0/frontend/svelte.config.js +8 -0
  165. code_constraints-0.1.0/frontend/tsconfig.json +15 -0
  166. code_constraints-0.1.0/frontend/vite.config.ts +17 -0
  167. code_constraints-0.1.0/install/README.md +84 -0
  168. code_constraints-0.1.0/install/install.ps1 +209 -0
  169. code_constraints-0.1.0/install/install.sh +187 -0
  170. code_constraints-0.1.0/pyproject.toml +113 -0
  171. code_constraints-0.1.0/scripts/bootstrap.ps1 +69 -0
  172. code_constraints-0.1.0/scripts/bootstrap.sh +71 -0
  173. code_constraints-0.1.0/scripts/serve.ps1 +25 -0
  174. code_constraints-0.1.0/scripts/serve.sh +35 -0
  175. code_constraints-0.1.0/shims/csharp/CodeConstraintsRules.cs +94 -0
  176. code_constraints-0.1.0/shims/julia/CdecRules.jl +129 -0
  177. code_constraints-0.1.0/shims/lua/cdec_rules.lua +92 -0
  178. code_constraints-0.1.0/shims/odin/cdec_rules.odin +67 -0
  179. code_constraints-0.1.0/shims/python/cdec_rules.py +94 -0
  180. code_constraints-0.1.0/src/code_constraints/__init__.py +1 -0
  181. code_constraints-0.1.0/src/code_constraints/cli/__init__.py +0 -0
  182. code_constraints-0.1.0/src/code_constraints/cli/__main__.py +1555 -0
  183. code_constraints-0.1.0/src/code_constraints/cli/_assets/agents/cdec-architect.md +468 -0
  184. code_constraints-0.1.0/src/code_constraints/cli/_assets/agents/oop-refactor-architect.md +317 -0
  185. code_constraints-0.1.0/src/code_constraints/cli/_assets/skills/cdec-architecture-loop/SKILL.md +152 -0
  186. code_constraints-0.1.0/src/code_constraints/cli/depstamp.py +118 -0
  187. code_constraints-0.1.0/src/code_constraints/cli/detect.py +77 -0
  188. code_constraints-0.1.0/src/code_constraints/cli/interactive.py +304 -0
  189. code_constraints-0.1.0/src/code_constraints/cli/scaffold.py +602 -0
  190. code_constraints-0.1.0/src/code_constraints/cli/update.py +157 -0
  191. code_constraints-0.1.0/src/code_constraints/core/__init__.py +41 -0
  192. code_constraints-0.1.0/src/code_constraints/core/annotations.py +217 -0
  193. code_constraints-0.1.0/src/code_constraints/core/associations.py +134 -0
  194. code_constraints-0.1.0/src/code_constraints/core/diff.py +302 -0
  195. code_constraints-0.1.0/src/code_constraints/core/editor_io.py +280 -0
  196. code_constraints-0.1.0/src/code_constraints/core/graph_model.py +681 -0
  197. code_constraints-0.1.0/src/code_constraints/core/keys.py +105 -0
  198. code_constraints-0.1.0/src/code_constraints/core/model.py +294 -0
  199. code_constraints-0.1.0/src/code_constraints/core/model_io.py +65 -0
  200. code_constraints-0.1.0/src/code_constraints/core/receivers.py +34 -0
  201. code_constraints-0.1.0/src/code_constraints/core/rules.py +177 -0
  202. code_constraints-0.1.0/src/code_constraints/core/rulesdoc.py +208 -0
  203. code_constraints-0.1.0/src/code_constraints/core/tags.py +114 -0
  204. code_constraints-0.1.0/src/code_constraints/core/ts_fingerprint.py +88 -0
  205. code_constraints-0.1.0/src/code_constraints/core/xmi_reader.py +358 -0
  206. code_constraints-0.1.0/src/code_constraints/core/xmi_writer.py +373 -0
  207. code_constraints-0.1.0/src/code_constraints/csharp/__init__.py +3 -0
  208. code_constraints-0.1.0/src/code_constraints/csharp/activity.py +250 -0
  209. code_constraints-0.1.0/src/code_constraints/csharp/conformance.py +331 -0
  210. code_constraints-0.1.0/src/code_constraints/csharp/fingerprint.py +274 -0
  211. code_constraints-0.1.0/src/code_constraints/csharp/parser.py +436 -0
  212. code_constraints-0.1.0/src/code_constraints/csharp/rules_extract.py +78 -0
  213. code_constraints-0.1.0/src/code_constraints/csharp/sequence.py +295 -0
  214. code_constraints-0.1.0/src/code_constraints/enforce/__init__.py +15 -0
  215. code_constraints-0.1.0/src/code_constraints/enforce/engine.py +122 -0
  216. code_constraints-0.1.0/src/code_constraints/enforce/model.py +74 -0
  217. code_constraints-0.1.0/src/code_constraints/julia/__init__.py +5 -0
  218. code_constraints-0.1.0/src/code_constraints/julia/conformance.py +282 -0
  219. code_constraints-0.1.0/src/code_constraints/julia/fingerprint.py +226 -0
  220. code_constraints-0.1.0/src/code_constraints/julia/parser.py +523 -0
  221. code_constraints-0.1.0/src/code_constraints/julia/rules_extract.py +216 -0
  222. code_constraints-0.1.0/src/code_constraints/lint/__init__.py +10 -0
  223. code_constraints-0.1.0/src/code_constraints/lint/baseline.py +96 -0
  224. code_constraints-0.1.0/src/code_constraints/lint/config.py +239 -0
  225. code_constraints-0.1.0/src/code_constraints/lint/engine.py +179 -0
  226. code_constraints-0.1.0/src/code_constraints/lint/pipeline.py +108 -0
  227. code_constraints-0.1.0/src/code_constraints/lint/report.py +151 -0
  228. code_constraints-0.1.0/src/code_constraints/lint/rules/__init__.py +50 -0
  229. code_constraints-0.1.0/src/code_constraints/lint/rules/base.py +200 -0
  230. code_constraints-0.1.0/src/code_constraints/lint/rules/cyclic_package_dependencies.py +69 -0
  231. code_constraints-0.1.0/src/code_constraints/lint/rules/dangling_classes.py +98 -0
  232. code_constraints-0.1.0/src/code_constraints/lint/rules/forbidden_package_references.py +47 -0
  233. code_constraints-0.1.0/src/code_constraints/lint/rules/forbidden_references.py +48 -0
  234. code_constraints-0.1.0/src/code_constraints/lint/rules/frozen_members.py +67 -0
  235. code_constraints-0.1.0/src/code_constraints/lint/rules/frozen_rules.py +105 -0
  236. code_constraints-0.1.0/src/code_constraints/lint/rules/implementation_locks.py +156 -0
  237. code_constraints-0.1.0/src/code_constraints/lint/rules/layer_dependencies.py +92 -0
  238. code_constraints-0.1.0/src/code_constraints/lint/rules/max_class_fanout.py +41 -0
  239. code_constraints-0.1.0/src/code_constraints/lint/rules/no_new_classes.py +27 -0
  240. code_constraints-0.1.0/src/code_constraints/lint/rules/no_removed_classes.py +27 -0
  241. code_constraints-0.1.0/src/code_constraints/lint/rules/reference_architecture.py +111 -0
  242. code_constraints-0.1.0/src/code_constraints/lint/rules/subclass_naming.py +71 -0
  243. code_constraints-0.1.0/src/code_constraints/lint/rules/tag_conformance.py +76 -0
  244. code_constraints-0.1.0/src/code_constraints/lock/__init__.py +73 -0
  245. code_constraints-0.1.0/src/code_constraints/lock/engine.py +395 -0
  246. code_constraints-0.1.0/src/code_constraints/lock/model.py +235 -0
  247. code_constraints-0.1.0/src/code_constraints/lock/store.py +144 -0
  248. code_constraints-0.1.0/src/code_constraints/lua/__init__.py +5 -0
  249. code_constraints-0.1.0/src/code_constraints/lua/conformance.py +239 -0
  250. code_constraints-0.1.0/src/code_constraints/lua/fingerprint.py +252 -0
  251. code_constraints-0.1.0/src/code_constraints/lua/parser.py +500 -0
  252. code_constraints-0.1.0/src/code_constraints/lua/rules_extract.py +55 -0
  253. code_constraints-0.1.0/src/code_constraints/mcp/__init__.py +20 -0
  254. code_constraints-0.1.0/src/code_constraints/mcp/__main__.py +73 -0
  255. code_constraints-0.1.0/src/code_constraints/mcp/server.py +1203 -0
  256. code_constraints-0.1.0/src/code_constraints/odin/__init__.py +5 -0
  257. code_constraints-0.1.0/src/code_constraints/odin/conformance.py +244 -0
  258. code_constraints-0.1.0/src/code_constraints/odin/fingerprint.py +159 -0
  259. code_constraints-0.1.0/src/code_constraints/odin/parser.py +471 -0
  260. code_constraints-0.1.0/src/code_constraints/odin/rules_extract.py +38 -0
  261. code_constraints-0.1.0/src/code_constraints/python/__init__.py +3 -0
  262. code_constraints-0.1.0/src/code_constraints/python/activity.py +278 -0
  263. code_constraints-0.1.0/src/code_constraints/python/conformance.py +249 -0
  264. code_constraints-0.1.0/src/code_constraints/python/fingerprint.py +231 -0
  265. code_constraints-0.1.0/src/code_constraints/python/parser.py +330 -0
  266. code_constraints-0.1.0/src/code_constraints/python/rules_extract.py +83 -0
  267. code_constraints-0.1.0/src/code_constraints/python/sequence.py +257 -0
  268. code_constraints-0.1.0/src/code_constraints/reference/__init__.py +15 -0
  269. code_constraints-0.1.0/src/code_constraints/reference/compare.py +356 -0
  270. code_constraints-0.1.0/src/code_constraints/reference/report.py +38 -0
  271. code_constraints-0.1.0/src/code_constraints/svelte/__init__.py +3 -0
  272. code_constraints-0.1.0/src/code_constraints/svelte/parser.py +523 -0
  273. code_constraints-0.1.0/src/code_constraints/typescript/__init__.py +3 -0
  274. code_constraints-0.1.0/src/code_constraints/typescript/parser.py +590 -0
  275. code_constraints-0.1.0/src/code_constraints/waivers/__init__.py +89 -0
  276. code_constraints-0.1.0/src/code_constraints/waivers/collect.py +167 -0
  277. code_constraints-0.1.0/src/code_constraints/waivers/model.py +90 -0
  278. code_constraints-0.1.0/src/code_constraints/waivers/ops.py +150 -0
  279. code_constraints-0.1.0/src/code_constraints/waivers/review.py +156 -0
  280. code_constraints-0.1.0/src/code_constraints/waivers/store.py +300 -0
  281. code_constraints-0.1.0/src/code_constraints/web/__init__.py +0 -0
  282. code_constraints-0.1.0/src/code_constraints/web/_static/assets/index-3ivBsYY4.css +1 -0
  283. code_constraints-0.1.0/src/code_constraints/web/_static/assets/index-BTzTqGFp.js +9 -0
  284. code_constraints-0.1.0/src/code_constraints/web/_static/index.html +13 -0
  285. code_constraints-0.1.0/src/code_constraints/web/app.py +1076 -0
  286. code_constraints-0.1.0/tests/__init__.py +0 -0
  287. code_constraints-0.1.0/tests/case_runner.py +276 -0
  288. code_constraints-0.1.0/tests/cases/README.md +99 -0
  289. code_constraints-0.1.0/tests/cases/check/dangling-classes/csharp/README.md +109 -0
  290. code_constraints-0.1.0/tests/cases/check/dangling-classes/csharp/inputs/case.yaml +2 -0
  291. code_constraints-0.1.0/tests/cases/check/dangling-classes/csharp/inputs/rules.yaml +10 -0
  292. code_constraints-0.1.0/tests/cases/check/dangling-classes/csharp/inputs/src/Orders/Cart.cs +7 -0
  293. code_constraints-0.1.0/tests/cases/check/dangling-classes/csharp/inputs/src/Orders/Checkout.cs +10 -0
  294. code_constraints-0.1.0/tests/cases/check/dangling-classes/csharp/inputs/src/Orders/LegacyPricing.cs +7 -0
  295. code_constraints-0.1.0/tests/cases/check/dangling-classes/csharp/inputs/src/Web/Controller.cs +7 -0
  296. code_constraints-0.1.0/tests/cases/check/dangling-classes/csharp/outputs/violations.json +7 -0
  297. code_constraints-0.1.0/tests/cases/check/dangling-classes/julia/README.md +107 -0
  298. code_constraints-0.1.0/tests/cases/check/dangling-classes/julia/inputs/case.yaml +2 -0
  299. code_constraints-0.1.0/tests/cases/check/dangling-classes/julia/inputs/rules.yaml +9 -0
  300. code_constraints-0.1.0/tests/cases/check/dangling-classes/julia/inputs/src/orders/Orders.jl +19 -0
  301. code_constraints-0.1.0/tests/cases/check/dangling-classes/julia/outputs/violations.json +7 -0
  302. code_constraints-0.1.0/tests/cases/check/dangling-classes/lua/README.md +109 -0
  303. code_constraints-0.1.0/tests/cases/check/dangling-classes/lua/inputs/case.yaml +2 -0
  304. code_constraints-0.1.0/tests/cases/check/dangling-classes/lua/inputs/rules.yaml +9 -0
  305. code_constraints-0.1.0/tests/cases/check/dangling-classes/lua/inputs/src/orders/checkout.lua +10 -0
  306. code_constraints-0.1.0/tests/cases/check/dangling-classes/lua/inputs/src/orders/legacy.lua +7 -0
  307. code_constraints-0.1.0/tests/cases/check/dangling-classes/lua/inputs/src/orders/service.lua +7 -0
  308. code_constraints-0.1.0/tests/cases/check/dangling-classes/lua/outputs/violations.json +7 -0
  309. code_constraints-0.1.0/tests/cases/check/dangling-classes/odin/README.md +109 -0
  310. code_constraints-0.1.0/tests/cases/check/dangling-classes/odin/inputs/case.yaml +2 -0
  311. code_constraints-0.1.0/tests/cases/check/dangling-classes/odin/inputs/rules.yaml +9 -0
  312. code_constraints-0.1.0/tests/cases/check/dangling-classes/odin/inputs/src/orders/cart.odin +6 -0
  313. code_constraints-0.1.0/tests/cases/check/dangling-classes/odin/inputs/src/orders/checkout.odin +7 -0
  314. code_constraints-0.1.0/tests/cases/check/dangling-classes/odin/inputs/src/orders/legacy.odin +6 -0
  315. code_constraints-0.1.0/tests/cases/check/dangling-classes/odin/outputs/violations.json +7 -0
  316. code_constraints-0.1.0/tests/cases/check/dangling-classes/python/README.md +109 -0
  317. code_constraints-0.1.0/tests/cases/check/dangling-classes/python/inputs/case.yaml +2 -0
  318. code_constraints-0.1.0/tests/cases/check/dangling-classes/python/inputs/rules.yaml +12 -0
  319. code_constraints-0.1.0/tests/cases/check/dangling-classes/python/inputs/src/orders/cart.py +5 -0
  320. code_constraints-0.1.0/tests/cases/check/dangling-classes/python/inputs/src/orders/checkout.py +9 -0
  321. code_constraints-0.1.0/tests/cases/check/dangling-classes/python/inputs/src/orders/legacy_pricing.py +5 -0
  322. code_constraints-0.1.0/tests/cases/check/dangling-classes/python/inputs/src/web/controller.py +6 -0
  323. code_constraints-0.1.0/tests/cases/check/dangling-classes/python/outputs/violations.json +7 -0
  324. code_constraints-0.1.0/tests/cases/check/dangling-classes/svelte/README.md +105 -0
  325. code_constraints-0.1.0/tests/cases/check/dangling-classes/svelte/inputs/case.yaml +2 -0
  326. code_constraints-0.1.0/tests/cases/check/dangling-classes/svelte/inputs/rules.yaml +10 -0
  327. code_constraints-0.1.0/tests/cases/check/dangling-classes/svelte/inputs/src/lib/cart.ts +13 -0
  328. code_constraints-0.1.0/tests/cases/check/dangling-classes/svelte/inputs/src/lib/legacyPricing.ts +6 -0
  329. code_constraints-0.1.0/tests/cases/check/dangling-classes/svelte/inputs/src/routes/CartView.svelte +9 -0
  330. code_constraints-0.1.0/tests/cases/check/dangling-classes/svelte/outputs/violations.json +7 -0
  331. code_constraints-0.1.0/tests/cases/check/dangling-classes/typescript/README.md +109 -0
  332. code_constraints-0.1.0/tests/cases/check/dangling-classes/typescript/inputs/case.yaml +2 -0
  333. code_constraints-0.1.0/tests/cases/check/dangling-classes/typescript/inputs/rules.yaml +10 -0
  334. code_constraints-0.1.0/tests/cases/check/dangling-classes/typescript/inputs/src/orders/cart.ts +6 -0
  335. code_constraints-0.1.0/tests/cases/check/dangling-classes/typescript/inputs/src/orders/checkout.ts +11 -0
  336. code_constraints-0.1.0/tests/cases/check/dangling-classes/typescript/inputs/src/orders/legacyPricing.ts +6 -0
  337. code_constraints-0.1.0/tests/cases/check/dangling-classes/typescript/inputs/src/web/controller.ts +4 -0
  338. code_constraints-0.1.0/tests/cases/check/dangling-classes/typescript/outputs/violations.json +7 -0
  339. code_constraints-0.1.0/tests/cases/check/forbidden-package-references/csharp/README.md +112 -0
  340. code_constraints-0.1.0/tests/cases/check/forbidden-package-references/csharp/inputs/case.yaml +2 -0
  341. code_constraints-0.1.0/tests/cases/check/forbidden-package-references/csharp/inputs/rules.yaml +9 -0
  342. code_constraints-0.1.0/tests/cases/check/forbidden-package-references/csharp/inputs/src/Catalog/Author.cs +12 -0
  343. code_constraints-0.1.0/tests/cases/check/forbidden-package-references/csharp/inputs/src/Catalog/Book.cs +13 -0
  344. code_constraints-0.1.0/tests/cases/check/forbidden-package-references/csharp/inputs/src/Orders/Order.cs +11 -0
  345. code_constraints-0.1.0/tests/cases/check/forbidden-package-references/csharp/inputs/src/Users/Customer.cs +9 -0
  346. code_constraints-0.1.0/tests/cases/check/forbidden-package-references/csharp/outputs/violations.json +8 -0
  347. code_constraints-0.1.0/tests/cases/check/forbidden-package-references/julia/README.md +115 -0
  348. code_constraints-0.1.0/tests/cases/check/forbidden-package-references/julia/inputs/case.yaml +2 -0
  349. code_constraints-0.1.0/tests/cases/check/forbidden-package-references/julia/inputs/rules.yaml +9 -0
  350. code_constraints-0.1.0/tests/cases/check/forbidden-package-references/julia/inputs/src/catalog/Catalog.jl +15 -0
  351. code_constraints-0.1.0/tests/cases/check/forbidden-package-references/julia/inputs/src/orders/Orders.jl +9 -0
  352. code_constraints-0.1.0/tests/cases/check/forbidden-package-references/julia/inputs/src/users/Users.jl +8 -0
  353. code_constraints-0.1.0/tests/cases/check/forbidden-package-references/julia/outputs/violations.json +8 -0
  354. code_constraints-0.1.0/tests/cases/check/forbidden-package-references/lua/README.md +116 -0
  355. code_constraints-0.1.0/tests/cases/check/forbidden-package-references/lua/inputs/case.yaml +2 -0
  356. code_constraints-0.1.0/tests/cases/check/forbidden-package-references/lua/inputs/rules.yaml +9 -0
  357. code_constraints-0.1.0/tests/cases/check/forbidden-package-references/lua/inputs/src/catalog/book.lua +16 -0
  358. code_constraints-0.1.0/tests/cases/check/forbidden-package-references/lua/inputs/src/catalog/paperback.lua +9 -0
  359. code_constraints-0.1.0/tests/cases/check/forbidden-package-references/lua/inputs/src/orders/order.lua +12 -0
  360. code_constraints-0.1.0/tests/cases/check/forbidden-package-references/lua/inputs/src/users/customer.lua +7 -0
  361. code_constraints-0.1.0/tests/cases/check/forbidden-package-references/lua/outputs/violations.json +8 -0
  362. code_constraints-0.1.0/tests/cases/check/forbidden-package-references/odin/README.md +115 -0
  363. code_constraints-0.1.0/tests/cases/check/forbidden-package-references/odin/inputs/case.yaml +2 -0
  364. code_constraints-0.1.0/tests/cases/check/forbidden-package-references/odin/inputs/rules.yaml +9 -0
  365. code_constraints-0.1.0/tests/cases/check/forbidden-package-references/odin/inputs/src/catalog/book.odin +13 -0
  366. code_constraints-0.1.0/tests/cases/check/forbidden-package-references/odin/inputs/src/orders/order.odin +7 -0
  367. code_constraints-0.1.0/tests/cases/check/forbidden-package-references/odin/inputs/src/users/customer.odin +6 -0
  368. code_constraints-0.1.0/tests/cases/check/forbidden-package-references/odin/outputs/violations.json +8 -0
  369. code_constraints-0.1.0/tests/cases/check/forbidden-package-references/python/README.md +116 -0
  370. code_constraints-0.1.0/tests/cases/check/forbidden-package-references/python/inputs/case.yaml +2 -0
  371. code_constraints-0.1.0/tests/cases/check/forbidden-package-references/python/inputs/rules.yaml +9 -0
  372. code_constraints-0.1.0/tests/cases/check/forbidden-package-references/python/inputs/src/catalog/author.py +9 -0
  373. code_constraints-0.1.0/tests/cases/check/forbidden-package-references/python/inputs/src/catalog/book.py +9 -0
  374. code_constraints-0.1.0/tests/cases/check/forbidden-package-references/python/inputs/src/orders/order.py +8 -0
  375. code_constraints-0.1.0/tests/cases/check/forbidden-package-references/python/inputs/src/users/customer.py +5 -0
  376. code_constraints-0.1.0/tests/cases/check/forbidden-package-references/python/outputs/violations.json +8 -0
  377. code_constraints-0.1.0/tests/cases/check/forbidden-package-references/svelte/README.md +116 -0
  378. code_constraints-0.1.0/tests/cases/check/forbidden-package-references/svelte/inputs/case.yaml +2 -0
  379. code_constraints-0.1.0/tests/cases/check/forbidden-package-references/svelte/inputs/rules.yaml +9 -0
  380. code_constraints-0.1.0/tests/cases/check/forbidden-package-references/svelte/inputs/src/catalog/AuthorCard.svelte +11 -0
  381. code_constraints-0.1.0/tests/cases/check/forbidden-package-references/svelte/inputs/src/catalog/BookCard.svelte +13 -0
  382. code_constraints-0.1.0/tests/cases/check/forbidden-package-references/svelte/inputs/src/orders/OrderRow.svelte +5 -0
  383. code_constraints-0.1.0/tests/cases/check/forbidden-package-references/svelte/inputs/src/users/CustomerCard.svelte +6 -0
  384. code_constraints-0.1.0/tests/cases/check/forbidden-package-references/svelte/outputs/violations.json +8 -0
  385. code_constraints-0.1.0/tests/cases/check/forbidden-package-references/typescript/README.md +116 -0
  386. code_constraints-0.1.0/tests/cases/check/forbidden-package-references/typescript/inputs/case.yaml +2 -0
  387. code_constraints-0.1.0/tests/cases/check/forbidden-package-references/typescript/inputs/rules.yaml +9 -0
  388. code_constraints-0.1.0/tests/cases/check/forbidden-package-references/typescript/inputs/src/catalog/author.ts +11 -0
  389. code_constraints-0.1.0/tests/cases/check/forbidden-package-references/typescript/inputs/src/catalog/book.ts +11 -0
  390. code_constraints-0.1.0/tests/cases/check/forbidden-package-references/typescript/inputs/src/orders/order.ts +10 -0
  391. code_constraints-0.1.0/tests/cases/check/forbidden-package-references/typescript/inputs/src/users/customer.ts +8 -0
  392. code_constraints-0.1.0/tests/cases/check/forbidden-package-references/typescript/outputs/violations.json +8 -0
  393. code_constraints-0.1.0/tests/cases/check/forbidden-references/csharp/README.md +109 -0
  394. code_constraints-0.1.0/tests/cases/check/forbidden-references/csharp/inputs/case.yaml +2 -0
  395. code_constraints-0.1.0/tests/cases/check/forbidden-references/csharp/inputs/rules.yaml +9 -0
  396. code_constraints-0.1.0/tests/cases/check/forbidden-references/csharp/inputs/src/Catalog/Author.cs +9 -0
  397. code_constraints-0.1.0/tests/cases/check/forbidden-references/csharp/inputs/src/Catalog/Book.cs +16 -0
  398. code_constraints-0.1.0/tests/cases/check/forbidden-references/csharp/inputs/src/Orders/Order.cs +12 -0
  399. code_constraints-0.1.0/tests/cases/check/forbidden-references/csharp/inputs/src/Users/Customer.cs +8 -0
  400. code_constraints-0.1.0/tests/cases/check/forbidden-references/csharp/outputs/violations.json +8 -0
  401. code_constraints-0.1.0/tests/cases/check/forbidden-references/python/README.md +109 -0
  402. code_constraints-0.1.0/tests/cases/check/forbidden-references/python/inputs/case.yaml +2 -0
  403. code_constraints-0.1.0/tests/cases/check/forbidden-references/python/inputs/rules.yaml +10 -0
  404. code_constraints-0.1.0/tests/cases/check/forbidden-references/python/inputs/src/catalog/author.py +5 -0
  405. code_constraints-0.1.0/tests/cases/check/forbidden-references/python/inputs/src/catalog/book.py +9 -0
  406. code_constraints-0.1.0/tests/cases/check/forbidden-references/python/inputs/src/orders/order.py +9 -0
  407. code_constraints-0.1.0/tests/cases/check/forbidden-references/python/inputs/src/users/customer.py +3 -0
  408. code_constraints-0.1.0/tests/cases/check/forbidden-references/python/outputs/violations.json +8 -0
  409. code_constraints-0.1.0/tests/cases/check/frozen-members/csharp/README.md +129 -0
  410. code_constraints-0.1.0/tests/cases/check/frozen-members/csharp/inputs/baseline/Notifications/Base.cs +8 -0
  411. code_constraints-0.1.0/tests/cases/check/frozen-members/csharp/inputs/baseline/Notifications/Sms.cs +6 -0
  412. code_constraints-0.1.0/tests/cases/check/frozen-members/csharp/inputs/case.yaml +2 -0
  413. code_constraints-0.1.0/tests/cases/check/frozen-members/csharp/inputs/rules.yaml +10 -0
  414. code_constraints-0.1.0/tests/cases/check/frozen-members/csharp/inputs/src/Notifications/Base.cs +12 -0
  415. code_constraints-0.1.0/tests/cases/check/frozen-members/csharp/inputs/src/Notifications/Sms.cs +9 -0
  416. code_constraints-0.1.0/tests/cases/check/frozen-members/csharp/outputs/violations.json +14 -0
  417. code_constraints-0.1.0/tests/cases/check/frozen-members/python/README.md +129 -0
  418. code_constraints-0.1.0/tests/cases/check/frozen-members/python/inputs/baseline/notifications/base.py +8 -0
  419. code_constraints-0.1.0/tests/cases/check/frozen-members/python/inputs/baseline/notifications/sms.py +6 -0
  420. code_constraints-0.1.0/tests/cases/check/frozen-members/python/inputs/case.yaml +2 -0
  421. code_constraints-0.1.0/tests/cases/check/frozen-members/python/inputs/rules.yaml +12 -0
  422. code_constraints-0.1.0/tests/cases/check/frozen-members/python/inputs/src/notifications/base.py +11 -0
  423. code_constraints-0.1.0/tests/cases/check/frozen-members/python/inputs/src/notifications/sms.py +11 -0
  424. code_constraints-0.1.0/tests/cases/check/frozen-members/python/outputs/violations.json +14 -0
  425. code_constraints-0.1.0/tests/cases/check/frozen-rules/csharp/README.md +135 -0
  426. code_constraints-0.1.0/tests/cases/check/frozen-rules/csharp/inputs/baseline/Orders/Billing.cs +19 -0
  427. code_constraints-0.1.0/tests/cases/check/frozen-rules/csharp/inputs/baseline/Support/Audit.cs +11 -0
  428. code_constraints-0.1.0/tests/cases/check/frozen-rules/csharp/inputs/case.yaml +2 -0
  429. code_constraints-0.1.0/tests/cases/check/frozen-rules/csharp/inputs/rules.yaml +9 -0
  430. code_constraints-0.1.0/tests/cases/check/frozen-rules/csharp/inputs/src/Orders/Billing.cs +20 -0
  431. code_constraints-0.1.0/tests/cases/check/frozen-rules/csharp/inputs/src/Support/Audit.cs +9 -0
  432. code_constraints-0.1.0/tests/cases/check/frozen-rules/csharp/outputs/violations.json +20 -0
  433. code_constraints-0.1.0/tests/cases/check/frozen-rules/julia/README.md +127 -0
  434. code_constraints-0.1.0/tests/cases/check/frozen-rules/julia/inputs/baseline/orders/Orders.jl +13 -0
  435. code_constraints-0.1.0/tests/cases/check/frozen-rules/julia/inputs/baseline/support/Support.jl +9 -0
  436. code_constraints-0.1.0/tests/cases/check/frozen-rules/julia/inputs/case.yaml +2 -0
  437. code_constraints-0.1.0/tests/cases/check/frozen-rules/julia/inputs/rules.yaml +9 -0
  438. code_constraints-0.1.0/tests/cases/check/frozen-rules/julia/inputs/src/orders/Orders.jl +16 -0
  439. code_constraints-0.1.0/tests/cases/check/frozen-rules/julia/inputs/src/support/Support.jl +8 -0
  440. code_constraints-0.1.0/tests/cases/check/frozen-rules/julia/outputs/violations.json +14 -0
  441. code_constraints-0.1.0/tests/cases/check/frozen-rules/lua/README.md +127 -0
  442. code_constraints-0.1.0/tests/cases/check/frozen-rules/lua/inputs/baseline/orders/billing.lua +9 -0
  443. code_constraints-0.1.0/tests/cases/check/frozen-rules/lua/inputs/baseline/support/audit.lua +7 -0
  444. code_constraints-0.1.0/tests/cases/check/frozen-rules/lua/inputs/case.yaml +2 -0
  445. code_constraints-0.1.0/tests/cases/check/frozen-rules/lua/inputs/rules.yaml +9 -0
  446. code_constraints-0.1.0/tests/cases/check/frozen-rules/lua/inputs/src/orders/billing.lua +9 -0
  447. code_constraints-0.1.0/tests/cases/check/frozen-rules/lua/inputs/src/support/audit.lua +7 -0
  448. code_constraints-0.1.0/tests/cases/check/frozen-rules/lua/outputs/violations.json +14 -0
  449. code_constraints-0.1.0/tests/cases/check/frozen-rules/odin/README.md +127 -0
  450. code_constraints-0.1.0/tests/cases/check/frozen-rules/odin/inputs/baseline/orders/billing.odin +12 -0
  451. code_constraints-0.1.0/tests/cases/check/frozen-rules/odin/inputs/baseline/support/audit.odin +6 -0
  452. code_constraints-0.1.0/tests/cases/check/frozen-rules/odin/inputs/case.yaml +2 -0
  453. code_constraints-0.1.0/tests/cases/check/frozen-rules/odin/inputs/rules.yaml +9 -0
  454. code_constraints-0.1.0/tests/cases/check/frozen-rules/odin/inputs/src/orders/billing.odin +14 -0
  455. code_constraints-0.1.0/tests/cases/check/frozen-rules/odin/inputs/src/support/audit.odin +6 -0
  456. code_constraints-0.1.0/tests/cases/check/frozen-rules/odin/outputs/violations.json +14 -0
  457. code_constraints-0.1.0/tests/cases/check/frozen-rules/python/README.md +135 -0
  458. code_constraints-0.1.0/tests/cases/check/frozen-rules/python/inputs/baseline/orders/billing.py +15 -0
  459. code_constraints-0.1.0/tests/cases/check/frozen-rules/python/inputs/baseline/support/audit.py +7 -0
  460. code_constraints-0.1.0/tests/cases/check/frozen-rules/python/inputs/case.yaml +2 -0
  461. code_constraints-0.1.0/tests/cases/check/frozen-rules/python/inputs/rules.yaml +9 -0
  462. code_constraints-0.1.0/tests/cases/check/frozen-rules/python/inputs/src/orders/billing.py +19 -0
  463. code_constraints-0.1.0/tests/cases/check/frozen-rules/python/inputs/src/support/audit.py +6 -0
  464. code_constraints-0.1.0/tests/cases/check/frozen-rules/python/outputs/violations.json +20 -0
  465. code_constraints-0.1.0/tests/cases/check/layer-dependencies/csharp/README.md +122 -0
  466. code_constraints-0.1.0/tests/cases/check/layer-dependencies/csharp/inputs/case.yaml +2 -0
  467. code_constraints-0.1.0/tests/cases/check/layer-dependencies/csharp/inputs/rules.yaml +13 -0
  468. code_constraints-0.1.0/tests/cases/check/layer-dependencies/csharp/inputs/src/App/Handler.cs +14 -0
  469. code_constraints-0.1.0/tests/cases/check/layer-dependencies/csharp/inputs/src/Domain/Order.cs +17 -0
  470. code_constraints-0.1.0/tests/cases/check/layer-dependencies/csharp/inputs/src/Domain/Repository.cs +10 -0
  471. code_constraints-0.1.0/tests/cases/check/layer-dependencies/csharp/inputs/src/Infrastructure/Sql.cs +18 -0
  472. code_constraints-0.1.0/tests/cases/check/layer-dependencies/csharp/inputs/src/Support/Logger.cs +7 -0
  473. code_constraints-0.1.0/tests/cases/check/layer-dependencies/csharp/outputs/violations.json +8 -0
  474. code_constraints-0.1.0/tests/cases/check/layer-dependencies/julia/README.md +117 -0
  475. code_constraints-0.1.0/tests/cases/check/layer-dependencies/julia/inputs/case.yaml +2 -0
  476. code_constraints-0.1.0/tests/cases/check/layer-dependencies/julia/inputs/rules.yaml +12 -0
  477. code_constraints-0.1.0/tests/cases/check/layer-dependencies/julia/inputs/src/app/App.jl +10 -0
  478. code_constraints-0.1.0/tests/cases/check/layer-dependencies/julia/inputs/src/domain/Domain.jl +14 -0
  479. code_constraints-0.1.0/tests/cases/check/layer-dependencies/julia/inputs/src/infrastructure/Infrastructure.jl +9 -0
  480. code_constraints-0.1.0/tests/cases/check/layer-dependencies/julia/inputs/src/support/Support.jl +8 -0
  481. code_constraints-0.1.0/tests/cases/check/layer-dependencies/julia/outputs/violations.json +8 -0
  482. code_constraints-0.1.0/tests/cases/check/layer-dependencies/lua/README.md +113 -0
  483. code_constraints-0.1.0/tests/cases/check/layer-dependencies/lua/inputs/case.yaml +2 -0
  484. code_constraints-0.1.0/tests/cases/check/layer-dependencies/lua/inputs/rules.yaml +12 -0
  485. code_constraints-0.1.0/tests/cases/check/layer-dependencies/lua/inputs/src/app/handler.lua +10 -0
  486. code_constraints-0.1.0/tests/cases/check/layer-dependencies/lua/inputs/src/domain/order.lua +12 -0
  487. code_constraints-0.1.0/tests/cases/check/layer-dependencies/lua/inputs/src/infrastructure/record.lua +7 -0
  488. code_constraints-0.1.0/tests/cases/check/layer-dependencies/lua/outputs/violations.json +8 -0
  489. code_constraints-0.1.0/tests/cases/check/layer-dependencies/odin/README.md +117 -0
  490. code_constraints-0.1.0/tests/cases/check/layer-dependencies/odin/inputs/case.yaml +2 -0
  491. code_constraints-0.1.0/tests/cases/check/layer-dependencies/odin/inputs/rules.yaml +12 -0
  492. code_constraints-0.1.0/tests/cases/check/layer-dependencies/odin/inputs/src/app/handler.odin +7 -0
  493. code_constraints-0.1.0/tests/cases/check/layer-dependencies/odin/inputs/src/domain/order.odin +11 -0
  494. code_constraints-0.1.0/tests/cases/check/layer-dependencies/odin/inputs/src/infrastructure/sql.odin +6 -0
  495. code_constraints-0.1.0/tests/cases/check/layer-dependencies/odin/inputs/src/support/logger.odin +6 -0
  496. code_constraints-0.1.0/tests/cases/check/layer-dependencies/odin/outputs/violations.json +8 -0
  497. code_constraints-0.1.0/tests/cases/check/layer-dependencies/python/README.md +118 -0
  498. code_constraints-0.1.0/tests/cases/check/layer-dependencies/python/inputs/case.yaml +2 -0
  499. code_constraints-0.1.0/tests/cases/check/layer-dependencies/python/inputs/rules.yaml +13 -0
  500. code_constraints-0.1.0/tests/cases/check/layer-dependencies/python/inputs/src/app/handler.py +11 -0
  501. code_constraints-0.1.0/tests/cases/check/layer-dependencies/python/inputs/src/domain/order.py +15 -0
  502. code_constraints-0.1.0/tests/cases/check/layer-dependencies/python/inputs/src/domain/repository.py +10 -0
  503. code_constraints-0.1.0/tests/cases/check/layer-dependencies/python/inputs/src/infrastructure/sql.py +18 -0
  504. code_constraints-0.1.0/tests/cases/check/layer-dependencies/python/inputs/src/support/logger.py +6 -0
  505. code_constraints-0.1.0/tests/cases/check/layer-dependencies/python/outputs/violations.json +8 -0
  506. code_constraints-0.1.0/tests/cases/check/max-class-fanout/csharp/README.md +118 -0
  507. code_constraints-0.1.0/tests/cases/check/max-class-fanout/csharp/inputs/case.yaml +2 -0
  508. code_constraints-0.1.0/tests/cases/check/max-class-fanout/csharp/inputs/rules.yaml +11 -0
  509. code_constraints-0.1.0/tests/cases/check/max-class-fanout/csharp/inputs/src/App/Root.cs +37 -0
  510. code_constraints-0.1.0/tests/cases/check/max-class-fanout/csharp/inputs/src/Orders/Checkout.cs +34 -0
  511. code_constraints-0.1.0/tests/cases/check/max-class-fanout/csharp/inputs/src/Orders/Collaborators.cs +49 -0
  512. code_constraints-0.1.0/tests/cases/check/max-class-fanout/csharp/inputs/src/Orders/Pricing.cs +19 -0
  513. code_constraints-0.1.0/tests/cases/check/max-class-fanout/csharp/outputs/violations.json +7 -0
  514. code_constraints-0.1.0/tests/cases/check/max-class-fanout/python/README.md +118 -0
  515. code_constraints-0.1.0/tests/cases/check/max-class-fanout/python/inputs/case.yaml +2 -0
  516. code_constraints-0.1.0/tests/cases/check/max-class-fanout/python/inputs/rules.yaml +11 -0
  517. code_constraints-0.1.0/tests/cases/check/max-class-fanout/python/inputs/src/app/root.py +35 -0
  518. code_constraints-0.1.0/tests/cases/check/max-class-fanout/python/inputs/src/orders/checkout.py +34 -0
  519. code_constraints-0.1.0/tests/cases/check/max-class-fanout/python/inputs/src/orders/collaborators.py +47 -0
  520. code_constraints-0.1.0/tests/cases/check/max-class-fanout/python/inputs/src/orders/pricing.py +14 -0
  521. code_constraints-0.1.0/tests/cases/check/max-class-fanout/python/outputs/violations.json +7 -0
  522. code_constraints-0.1.0/tests/cases/check/no-cyclic-package-dependencies/csharp/README.md +113 -0
  523. code_constraints-0.1.0/tests/cases/check/no-cyclic-package-dependencies/csharp/inputs/case.yaml +2 -0
  524. code_constraints-0.1.0/tests/cases/check/no-cyclic-package-dependencies/csharp/inputs/rules.yaml +7 -0
  525. code_constraints-0.1.0/tests/cases/check/no-cyclic-package-dependencies/csharp/inputs/src/Catalog/Book.cs +9 -0
  526. code_constraints-0.1.0/tests/cases/check/no-cyclic-package-dependencies/csharp/inputs/src/Orders/Order.cs +13 -0
  527. code_constraints-0.1.0/tests/cases/check/no-cyclic-package-dependencies/csharp/inputs/src/Users/Customer.cs +11 -0
  528. code_constraints-0.1.0/tests/cases/check/no-cyclic-package-dependencies/csharp/outputs/violations.json +8 -0
  529. code_constraints-0.1.0/tests/cases/check/no-cyclic-package-dependencies/python/README.md +113 -0
  530. code_constraints-0.1.0/tests/cases/check/no-cyclic-package-dependencies/python/inputs/case.yaml +2 -0
  531. code_constraints-0.1.0/tests/cases/check/no-cyclic-package-dependencies/python/inputs/rules.yaml +8 -0
  532. code_constraints-0.1.0/tests/cases/check/no-cyclic-package-dependencies/python/inputs/src/catalog/book.py +6 -0
  533. code_constraints-0.1.0/tests/cases/check/no-cyclic-package-dependencies/python/inputs/src/orders/order.py +10 -0
  534. code_constraints-0.1.0/tests/cases/check/no-cyclic-package-dependencies/python/inputs/src/users/customer.py +8 -0
  535. code_constraints-0.1.0/tests/cases/check/no-cyclic-package-dependencies/python/outputs/violations.json +8 -0
  536. code_constraints-0.1.0/tests/cases/check/no-new-classes/csharp/README.md +112 -0
  537. code_constraints-0.1.0/tests/cases/check/no-new-classes/csharp/inputs/baseline/Notifications/Base.cs +11 -0
  538. code_constraints-0.1.0/tests/cases/check/no-new-classes/csharp/inputs/case.yaml +2 -0
  539. code_constraints-0.1.0/tests/cases/check/no-new-classes/csharp/inputs/rules.yaml +10 -0
  540. code_constraints-0.1.0/tests/cases/check/no-new-classes/csharp/inputs/src/Notifications/Base.cs +14 -0
  541. code_constraints-0.1.0/tests/cases/check/no-new-classes/csharp/inputs/src/Notifications/Express.cs +7 -0
  542. code_constraints-0.1.0/tests/cases/check/no-new-classes/csharp/inputs/src/Testing/Fake.cs +7 -0
  543. code_constraints-0.1.0/tests/cases/check/no-new-classes/csharp/outputs/violations.json +7 -0
  544. code_constraints-0.1.0/tests/cases/check/no-new-classes/python/README.md +112 -0
  545. code_constraints-0.1.0/tests/cases/check/no-new-classes/python/inputs/baseline/notifications/base.py +12 -0
  546. code_constraints-0.1.0/tests/cases/check/no-new-classes/python/inputs/case.yaml +2 -0
  547. code_constraints-0.1.0/tests/cases/check/no-new-classes/python/inputs/rules.yaml +10 -0
  548. code_constraints-0.1.0/tests/cases/check/no-new-classes/python/inputs/src/notifications/base.py +16 -0
  549. code_constraints-0.1.0/tests/cases/check/no-new-classes/python/inputs/src/notifications/express.py +8 -0
  550. code_constraints-0.1.0/tests/cases/check/no-new-classes/python/inputs/src/testing/fake.py +8 -0
  551. code_constraints-0.1.0/tests/cases/check/no-new-classes/python/outputs/violations.json +7 -0
  552. code_constraints-0.1.0/tests/cases/check/no-removed-classes/csharp/README.md +111 -0
  553. code_constraints-0.1.0/tests/cases/check/no-removed-classes/csharp/inputs/baseline/Notifications/Base.cs +16 -0
  554. code_constraints-0.1.0/tests/cases/check/no-removed-classes/csharp/inputs/case.yaml +2 -0
  555. code_constraints-0.1.0/tests/cases/check/no-removed-classes/csharp/inputs/rules.yaml +8 -0
  556. code_constraints-0.1.0/tests/cases/check/no-removed-classes/csharp/inputs/src/Notifications/Base.cs +20 -0
  557. code_constraints-0.1.0/tests/cases/check/no-removed-classes/csharp/outputs/violations.json +7 -0
  558. code_constraints-0.1.0/tests/cases/check/no-removed-classes/python/README.md +111 -0
  559. code_constraints-0.1.0/tests/cases/check/no-removed-classes/python/inputs/baseline/notifications/base.py +15 -0
  560. code_constraints-0.1.0/tests/cases/check/no-removed-classes/python/inputs/case.yaml +2 -0
  561. code_constraints-0.1.0/tests/cases/check/no-removed-classes/python/inputs/rules.yaml +8 -0
  562. code_constraints-0.1.0/tests/cases/check/no-removed-classes/python/inputs/src/notifications/base.py +21 -0
  563. code_constraints-0.1.0/tests/cases/check/no-removed-classes/python/outputs/violations.json +7 -0
  564. code_constraints-0.1.0/tests/cases/check/subclass-naming/csharp/README.md +123 -0
  565. code_constraints-0.1.0/tests/cases/check/subclass-naming/csharp/inputs/case.yaml +2 -0
  566. code_constraints-0.1.0/tests/cases/check/subclass-naming/csharp/inputs/rules.yaml +12 -0
  567. code_constraints-0.1.0/tests/cases/check/subclass-naming/csharp/inputs/src/Notifications/Base.cs +7 -0
  568. code_constraints-0.1.0/tests/cases/check/subclass-naming/csharp/inputs/src/Notifications/Email.cs +6 -0
  569. code_constraints-0.1.0/tests/cases/check/subclass-naming/csharp/inputs/src/Notifications/Legacy.cs +7 -0
  570. code_constraints-0.1.0/tests/cases/check/subclass-naming/csharp/inputs/src/Notifications/Slack.cs +7 -0
  571. code_constraints-0.1.0/tests/cases/check/subclass-naming/csharp/inputs/src/Orders/Order.cs +7 -0
  572. code_constraints-0.1.0/tests/cases/check/subclass-naming/csharp/outputs/violations.json +7 -0
  573. code_constraints-0.1.0/tests/cases/check/subclass-naming/julia/README.md +120 -0
  574. code_constraints-0.1.0/tests/cases/check/subclass-naming/julia/inputs/case.yaml +2 -0
  575. code_constraints-0.1.0/tests/cases/check/subclass-naming/julia/inputs/rules.yaml +12 -0
  576. code_constraints-0.1.0/tests/cases/check/subclass-naming/julia/inputs/src/notifications/Notifications.jl +21 -0
  577. code_constraints-0.1.0/tests/cases/check/subclass-naming/julia/inputs/src/orders/Orders.jl +8 -0
  578. code_constraints-0.1.0/tests/cases/check/subclass-naming/julia/outputs/violations.json +7 -0
  579. code_constraints-0.1.0/tests/cases/check/subclass-naming/lua/README.md +119 -0
  580. code_constraints-0.1.0/tests/cases/check/subclass-naming/lua/inputs/case.yaml +2 -0
  581. code_constraints-0.1.0/tests/cases/check/subclass-naming/lua/inputs/rules.yaml +12 -0
  582. code_constraints-0.1.0/tests/cases/check/subclass-naming/lua/inputs/src/notifications/base.lua +7 -0
  583. code_constraints-0.1.0/tests/cases/check/subclass-naming/lua/inputs/src/notifications/email.lua +8 -0
  584. code_constraints-0.1.0/tests/cases/check/subclass-naming/lua/inputs/src/notifications/legacy.lua +9 -0
  585. code_constraints-0.1.0/tests/cases/check/subclass-naming/lua/inputs/src/notifications/slack.lua +9 -0
  586. code_constraints-0.1.0/tests/cases/check/subclass-naming/lua/outputs/violations.json +7 -0
  587. code_constraints-0.1.0/tests/cases/check/subclass-naming/odin/README.md +120 -0
  588. code_constraints-0.1.0/tests/cases/check/subclass-naming/odin/inputs/case.yaml +2 -0
  589. code_constraints-0.1.0/tests/cases/check/subclass-naming/odin/inputs/rules.yaml +12 -0
  590. code_constraints-0.1.0/tests/cases/check/subclass-naming/odin/inputs/src/notifications/base.odin +25 -0
  591. code_constraints-0.1.0/tests/cases/check/subclass-naming/odin/inputs/src/orders/order.odin +6 -0
  592. code_constraints-0.1.0/tests/cases/check/subclass-naming/odin/outputs/violations.json +7 -0
  593. code_constraints-0.1.0/tests/cases/check/subclass-naming/python/README.md +119 -0
  594. code_constraints-0.1.0/tests/cases/check/subclass-naming/python/inputs/case.yaml +2 -0
  595. code_constraints-0.1.0/tests/cases/check/subclass-naming/python/inputs/rules.yaml +12 -0
  596. code_constraints-0.1.0/tests/cases/check/subclass-naming/python/inputs/src/notifications/base.py +6 -0
  597. code_constraints-0.1.0/tests/cases/check/subclass-naming/python/inputs/src/notifications/email.py +8 -0
  598. code_constraints-0.1.0/tests/cases/check/subclass-naming/python/inputs/src/notifications/legacy.py +8 -0
  599. code_constraints-0.1.0/tests/cases/check/subclass-naming/python/inputs/src/notifications/slack.py +8 -0
  600. code_constraints-0.1.0/tests/cases/check/subclass-naming/python/inputs/src/orders/order.py +5 -0
  601. code_constraints-0.1.0/tests/cases/check/subclass-naming/python/outputs/violations.json +7 -0
  602. code_constraints-0.1.0/tests/cases/check/subclass-naming/svelte/README.md +123 -0
  603. code_constraints-0.1.0/tests/cases/check/subclass-naming/svelte/inputs/case.yaml +2 -0
  604. code_constraints-0.1.0/tests/cases/check/subclass-naming/svelte/inputs/rules.yaml +12 -0
  605. code_constraints-0.1.0/tests/cases/check/subclass-naming/svelte/inputs/src/notifications/base.ts +5 -0
  606. code_constraints-0.1.0/tests/cases/check/subclass-naming/svelte/inputs/src/notifications/email.ts +5 -0
  607. code_constraints-0.1.0/tests/cases/check/subclass-naming/svelte/inputs/src/notifications/legacy.ts +6 -0
  608. code_constraints-0.1.0/tests/cases/check/subclass-naming/svelte/inputs/src/notifications/slack.ts +6 -0
  609. code_constraints-0.1.0/tests/cases/check/subclass-naming/svelte/inputs/src/routes/Page.svelte +7 -0
  610. code_constraints-0.1.0/tests/cases/check/subclass-naming/svelte/outputs/violations.json +7 -0
  611. code_constraints-0.1.0/tests/cases/check/subclass-naming/typescript/README.md +123 -0
  612. code_constraints-0.1.0/tests/cases/check/subclass-naming/typescript/inputs/case.yaml +2 -0
  613. code_constraints-0.1.0/tests/cases/check/subclass-naming/typescript/inputs/rules.yaml +12 -0
  614. code_constraints-0.1.0/tests/cases/check/subclass-naming/typescript/inputs/src/notifications/base.ts +4 -0
  615. code_constraints-0.1.0/tests/cases/check/subclass-naming/typescript/inputs/src/notifications/email.ts +5 -0
  616. code_constraints-0.1.0/tests/cases/check/subclass-naming/typescript/inputs/src/notifications/legacy.ts +6 -0
  617. code_constraints-0.1.0/tests/cases/check/subclass-naming/typescript/inputs/src/notifications/slack.ts +6 -0
  618. code_constraints-0.1.0/tests/cases/check/subclass-naming/typescript/inputs/src/orders/order.ts +6 -0
  619. code_constraints-0.1.0/tests/cases/check/subclass-naming/typescript/outputs/violations.json +7 -0
  620. code_constraints-0.1.0/tests/cases/enforce/factory/csharp/README.md +106 -0
  621. code_constraints-0.1.0/tests/cases/enforce/factory/csharp/inputs/case.yaml +2 -0
  622. code_constraints-0.1.0/tests/cases/enforce/factory/csharp/inputs/src/Orders/CheckoutService.cs +14 -0
  623. code_constraints-0.1.0/tests/cases/enforce/factory/csharp/inputs/src/Orders/Receipt.cs +8 -0
  624. code_constraints-0.1.0/tests/cases/enforce/factory/csharp/inputs/src/Orders/ReceiptFactory.cs +14 -0
  625. code_constraints-0.1.0/tests/cases/enforce/factory/csharp/outputs/findings.json +7 -0
  626. code_constraints-0.1.0/tests/cases/enforce/factory/julia/README.md +108 -0
  627. code_constraints-0.1.0/tests/cases/enforce/factory/julia/inputs/case.yaml +2 -0
  628. code_constraints-0.1.0/tests/cases/enforce/factory/julia/inputs/src/orders/Orders.jl +29 -0
  629. code_constraints-0.1.0/tests/cases/enforce/factory/julia/outputs/findings.json +7 -0
  630. code_constraints-0.1.0/tests/cases/enforce/factory/lua/README.md +110 -0
  631. code_constraints-0.1.0/tests/cases/enforce/factory/lua/inputs/case.yaml +2 -0
  632. code_constraints-0.1.0/tests/cases/enforce/factory/lua/inputs/src/orders/checkout.lua +17 -0
  633. code_constraints-0.1.0/tests/cases/enforce/factory/lua/inputs/src/orders/factory.lua +13 -0
  634. code_constraints-0.1.0/tests/cases/enforce/factory/lua/inputs/src/orders/receipt.lua +10 -0
  635. code_constraints-0.1.0/tests/cases/enforce/factory/lua/outputs/findings.json +7 -0
  636. code_constraints-0.1.0/tests/cases/enforce/factory/odin/README.md +104 -0
  637. code_constraints-0.1.0/tests/cases/enforce/factory/odin/inputs/case.yaml +2 -0
  638. code_constraints-0.1.0/tests/cases/enforce/factory/odin/inputs/src/orders/receipt.odin +25 -0
  639. code_constraints-0.1.0/tests/cases/enforce/factory/odin/outputs/findings.json +7 -0
  640. code_constraints-0.1.0/tests/cases/enforce/factory/python/README.md +106 -0
  641. code_constraints-0.1.0/tests/cases/enforce/factory/python/inputs/case.yaml +2 -0
  642. code_constraints-0.1.0/tests/cases/enforce/factory/python/inputs/src/orders/checkout.py +15 -0
  643. code_constraints-0.1.0/tests/cases/enforce/factory/python/inputs/src/orders/factory.py +12 -0
  644. code_constraints-0.1.0/tests/cases/enforce/factory/python/inputs/src/orders/receipt.py +3 -0
  645. code_constraints-0.1.0/tests/cases/enforce/factory/python/outputs/findings.json +7 -0
  646. code_constraints-0.1.0/tests/cases/enforce/immutable/csharp/README.md +111 -0
  647. code_constraints-0.1.0/tests/cases/enforce/immutable/csharp/inputs/case.yaml +2 -0
  648. code_constraints-0.1.0/tests/cases/enforce/immutable/csharp/inputs/src/Orders/Receipt.cs +32 -0
  649. code_constraints-0.1.0/tests/cases/enforce/immutable/csharp/outputs/findings.json +7 -0
  650. code_constraints-0.1.0/tests/cases/enforce/immutable/julia/README.md +110 -0
  651. code_constraints-0.1.0/tests/cases/enforce/immutable/julia/inputs/case.yaml +2 -0
  652. code_constraints-0.1.0/tests/cases/enforce/immutable/julia/inputs/src/orders/Orders.jl +29 -0
  653. code_constraints-0.1.0/tests/cases/enforce/immutable/julia/outputs/findings.json +7 -0
  654. code_constraints-0.1.0/tests/cases/enforce/immutable/lua/README.md +111 -0
  655. code_constraints-0.1.0/tests/cases/enforce/immutable/lua/inputs/case.yaml +2 -0
  656. code_constraints-0.1.0/tests/cases/enforce/immutable/lua/inputs/src/orders/receipt.lua +29 -0
  657. code_constraints-0.1.0/tests/cases/enforce/immutable/lua/outputs/findings.json +7 -0
  658. code_constraints-0.1.0/tests/cases/enforce/immutable/odin/README.md +110 -0
  659. code_constraints-0.1.0/tests/cases/enforce/immutable/odin/inputs/case.yaml +2 -0
  660. code_constraints-0.1.0/tests/cases/enforce/immutable/odin/inputs/src/orders/receipt.odin +24 -0
  661. code_constraints-0.1.0/tests/cases/enforce/immutable/odin/outputs/findings.json +7 -0
  662. code_constraints-0.1.0/tests/cases/enforce/immutable/python/README.md +106 -0
  663. code_constraints-0.1.0/tests/cases/enforce/immutable/python/inputs/case.yaml +2 -0
  664. code_constraints-0.1.0/tests/cases/enforce/immutable/python/inputs/src/orders/receipt.py +22 -0
  665. code_constraints-0.1.0/tests/cases/enforce/immutable/python/outputs/findings.json +7 -0
  666. code_constraints-0.1.0/tests/cases/enforce/no-instantiation/csharp/README.md +104 -0
  667. code_constraints-0.1.0/tests/cases/enforce/no-instantiation/csharp/inputs/case.yaml +2 -0
  668. code_constraints-0.1.0/tests/cases/enforce/no-instantiation/csharp/inputs/src/Orders/CheckoutService.cs +17 -0
  669. code_constraints-0.1.0/tests/cases/enforce/no-instantiation/csharp/inputs/src/Orders/Models.cs +15 -0
  670. code_constraints-0.1.0/tests/cases/enforce/no-instantiation/csharp/outputs/findings.json +7 -0
  671. code_constraints-0.1.0/tests/cases/enforce/no-instantiation/julia/README.md +103 -0
  672. code_constraints-0.1.0/tests/cases/enforce/no-instantiation/julia/inputs/case.yaml +2 -0
  673. code_constraints-0.1.0/tests/cases/enforce/no-instantiation/julia/inputs/src/orders/Orders.jl +28 -0
  674. code_constraints-0.1.0/tests/cases/enforce/no-instantiation/julia/outputs/findings.json +7 -0
  675. code_constraints-0.1.0/tests/cases/enforce/no-instantiation/lua/README.md +104 -0
  676. code_constraints-0.1.0/tests/cases/enforce/no-instantiation/lua/inputs/case.yaml +2 -0
  677. code_constraints-0.1.0/tests/cases/enforce/no-instantiation/lua/inputs/src/orders/checkout.lua +20 -0
  678. code_constraints-0.1.0/tests/cases/enforce/no-instantiation/lua/inputs/src/orders/models.lua +19 -0
  679. code_constraints-0.1.0/tests/cases/enforce/no-instantiation/lua/outputs/findings.json +7 -0
  680. code_constraints-0.1.0/tests/cases/enforce/no-instantiation/odin/README.md +103 -0
  681. code_constraints-0.1.0/tests/cases/enforce/no-instantiation/odin/inputs/case.yaml +2 -0
  682. code_constraints-0.1.0/tests/cases/enforce/no-instantiation/odin/inputs/src/orders/checkout.odin +25 -0
  683. code_constraints-0.1.0/tests/cases/enforce/no-instantiation/odin/outputs/findings.json +7 -0
  684. code_constraints-0.1.0/tests/cases/enforce/no-instantiation/python/README.md +108 -0
  685. code_constraints-0.1.0/tests/cases/enforce/no-instantiation/python/inputs/case.yaml +2 -0
  686. code_constraints-0.1.0/tests/cases/enforce/no-instantiation/python/inputs/src/orders/checkout.py +17 -0
  687. code_constraints-0.1.0/tests/cases/enforce/no-instantiation/python/inputs/src/orders/models.py +8 -0
  688. code_constraints-0.1.0/tests/cases/enforce/no-instantiation/python/outputs/findings.json +7 -0
  689. code_constraints-0.1.0/tests/cases/enforce/sealed/csharp/README.md +105 -0
  690. code_constraints-0.1.0/tests/cases/enforce/sealed/csharp/inputs/case.yaml +2 -0
  691. code_constraints-0.1.0/tests/cases/enforce/sealed/csharp/inputs/src/Orders/AnnotatedReceipt.cs +14 -0
  692. code_constraints-0.1.0/tests/cases/enforce/sealed/csharp/inputs/src/Orders/DiscountedReceipt.cs +9 -0
  693. code_constraints-0.1.0/tests/cases/enforce/sealed/csharp/inputs/src/Orders/Receipt.cs +12 -0
  694. code_constraints-0.1.0/tests/cases/enforce/sealed/csharp/outputs/findings.json +7 -0
  695. code_constraints-0.1.0/tests/cases/enforce/sealed/julia/README.md +107 -0
  696. code_constraints-0.1.0/tests/cases/enforce/sealed/julia/inputs/case.yaml +2 -0
  697. code_constraints-0.1.0/tests/cases/enforce/sealed/julia/inputs/src/orders/Orders.jl +20 -0
  698. code_constraints-0.1.0/tests/cases/enforce/sealed/julia/outputs/findings.json +7 -0
  699. code_constraints-0.1.0/tests/cases/enforce/sealed/lua/README.md +109 -0
  700. code_constraints-0.1.0/tests/cases/enforce/sealed/lua/inputs/case.yaml +2 -0
  701. code_constraints-0.1.0/tests/cases/enforce/sealed/lua/inputs/src/orders/annotated.lua +15 -0
  702. code_constraints-0.1.0/tests/cases/enforce/sealed/lua/inputs/src/orders/discounted.lua +10 -0
  703. code_constraints-0.1.0/tests/cases/enforce/sealed/lua/inputs/src/orders/receipt.lua +11 -0
  704. code_constraints-0.1.0/tests/cases/enforce/sealed/lua/outputs/findings.json +7 -0
  705. code_constraints-0.1.0/tests/cases/enforce/sealed/odin/README.md +107 -0
  706. code_constraints-0.1.0/tests/cases/enforce/sealed/odin/inputs/case.yaml +2 -0
  707. code_constraints-0.1.0/tests/cases/enforce/sealed/odin/inputs/src/orders/receipt.odin +20 -0
  708. code_constraints-0.1.0/tests/cases/enforce/sealed/odin/outputs/findings.json +7 -0
  709. code_constraints-0.1.0/tests/cases/enforce/sealed/python/README.md +105 -0
  710. code_constraints-0.1.0/tests/cases/enforce/sealed/python/inputs/case.yaml +2 -0
  711. code_constraints-0.1.0/tests/cases/enforce/sealed/python/inputs/src/orders/annotated.py +10 -0
  712. code_constraints-0.1.0/tests/cases/enforce/sealed/python/inputs/src/orders/discounted.py +9 -0
  713. code_constraints-0.1.0/tests/cases/enforce/sealed/python/inputs/src/orders/receipt.py +9 -0
  714. code_constraints-0.1.0/tests/cases/enforce/sealed/python/outputs/findings.json +7 -0
  715. code_constraints-0.1.0/tests/cases/lock/locked/csharp/changed/README.md +106 -0
  716. code_constraints-0.1.0/tests/cases/lock/locked/csharp/changed/inputs/baseline/Orders/Billing.cs +14 -0
  717. code_constraints-0.1.0/tests/cases/lock/locked/csharp/changed/inputs/case.yaml +2 -0
  718. code_constraints-0.1.0/tests/cases/lock/locked/csharp/changed/inputs/src/Orders/Billing.cs +14 -0
  719. code_constraints-0.1.0/tests/cases/lock/locked/csharp/changed/outputs/lock_violations.json +6 -0
  720. code_constraints-0.1.0/tests/cases/lock/locked/csharp/reformat/README.md +99 -0
  721. code_constraints-0.1.0/tests/cases/lock/locked/csharp/reformat/inputs/baseline/Orders/Billing.cs +14 -0
  722. code_constraints-0.1.0/tests/cases/lock/locked/csharp/reformat/inputs/case.yaml +2 -0
  723. code_constraints-0.1.0/tests/cases/lock/locked/csharp/reformat/inputs/src/Orders/Billing.cs +22 -0
  724. code_constraints-0.1.0/tests/cases/lock/locked/csharp/reformat/outputs/lock_violations.json +1 -0
  725. code_constraints-0.1.0/tests/cases/lock/locked/csharp/unlocked/README.md +99 -0
  726. code_constraints-0.1.0/tests/cases/lock/locked/csharp/unlocked/inputs/baseline/Orders/Billing.cs +14 -0
  727. code_constraints-0.1.0/tests/cases/lock/locked/csharp/unlocked/inputs/case.yaml +2 -0
  728. code_constraints-0.1.0/tests/cases/lock/locked/csharp/unlocked/inputs/src/Orders/Billing.cs +13 -0
  729. code_constraints-0.1.0/tests/cases/lock/locked/csharp/unlocked/outputs/lock_violations.json +6 -0
  730. code_constraints-0.1.0/tests/cases/lock/locked/julia/changed/README.md +106 -0
  731. code_constraints-0.1.0/tests/cases/lock/locked/julia/changed/inputs/baseline/billing/Invoice.jl +13 -0
  732. code_constraints-0.1.0/tests/cases/lock/locked/julia/changed/inputs/case.yaml +2 -0
  733. code_constraints-0.1.0/tests/cases/lock/locked/julia/changed/inputs/src/billing/Invoice.jl +13 -0
  734. code_constraints-0.1.0/tests/cases/lock/locked/julia/changed/outputs/lock_violations.json +6 -0
  735. code_constraints-0.1.0/tests/cases/lock/locked/julia/reformat/README.md +97 -0
  736. code_constraints-0.1.0/tests/cases/lock/locked/julia/reformat/inputs/baseline/billing/Invoice.jl +13 -0
  737. code_constraints-0.1.0/tests/cases/lock/locked/julia/reformat/inputs/case.yaml +2 -0
  738. code_constraints-0.1.0/tests/cases/lock/locked/julia/reformat/inputs/src/billing/Invoice.jl +17 -0
  739. code_constraints-0.1.0/tests/cases/lock/locked/julia/reformat/outputs/lock_violations.json +1 -0
  740. code_constraints-0.1.0/tests/cases/lock/locked/lua/changed/README.md +106 -0
  741. code_constraints-0.1.0/tests/cases/lock/locked/lua/changed/inputs/baseline/billing/invoice.lua +15 -0
  742. code_constraints-0.1.0/tests/cases/lock/locked/lua/changed/inputs/case.yaml +2 -0
  743. code_constraints-0.1.0/tests/cases/lock/locked/lua/changed/inputs/src/billing/invoice.lua +15 -0
  744. code_constraints-0.1.0/tests/cases/lock/locked/lua/changed/outputs/lock_violations.json +6 -0
  745. code_constraints-0.1.0/tests/cases/lock/locked/lua/reformat/README.md +97 -0
  746. code_constraints-0.1.0/tests/cases/lock/locked/lua/reformat/inputs/baseline/billing/invoice.lua +15 -0
  747. code_constraints-0.1.0/tests/cases/lock/locked/lua/reformat/inputs/case.yaml +2 -0
  748. code_constraints-0.1.0/tests/cases/lock/locked/lua/reformat/inputs/src/billing/invoice.lua +19 -0
  749. code_constraints-0.1.0/tests/cases/lock/locked/lua/reformat/outputs/lock_violations.json +1 -0
  750. code_constraints-0.1.0/tests/cases/lock/locked/odin/changed/README.md +106 -0
  751. code_constraints-0.1.0/tests/cases/lock/locked/odin/changed/inputs/baseline/billing/invoice.odin +11 -0
  752. code_constraints-0.1.0/tests/cases/lock/locked/odin/changed/inputs/case.yaml +2 -0
  753. code_constraints-0.1.0/tests/cases/lock/locked/odin/changed/inputs/src/billing/invoice.odin +11 -0
  754. code_constraints-0.1.0/tests/cases/lock/locked/odin/changed/outputs/lock_violations.json +6 -0
  755. code_constraints-0.1.0/tests/cases/lock/locked/odin/reformat/README.md +107 -0
  756. code_constraints-0.1.0/tests/cases/lock/locked/odin/reformat/inputs/baseline/billing/invoice.odin +11 -0
  757. code_constraints-0.1.0/tests/cases/lock/locked/odin/reformat/inputs/case.yaml +2 -0
  758. code_constraints-0.1.0/tests/cases/lock/locked/odin/reformat/inputs/src/billing/invoice.odin +20 -0
  759. code_constraints-0.1.0/tests/cases/lock/locked/odin/reformat/outputs/lock_violations.json +1 -0
  760. code_constraints-0.1.0/tests/cases/lock/locked/python/changed/README.md +106 -0
  761. code_constraints-0.1.0/tests/cases/lock/locked/python/changed/inputs/baseline/orders/billing.py +11 -0
  762. code_constraints-0.1.0/tests/cases/lock/locked/python/changed/inputs/case.yaml +2 -0
  763. code_constraints-0.1.0/tests/cases/lock/locked/python/changed/inputs/src/orders/billing.py +11 -0
  764. code_constraints-0.1.0/tests/cases/lock/locked/python/changed/outputs/lock_violations.json +6 -0
  765. code_constraints-0.1.0/tests/cases/lock/locked/python/glob/README.md +99 -0
  766. code_constraints-0.1.0/tests/cases/lock/locked/python/glob/inputs/baseline/orders/pricing.py +4 -0
  767. code_constraints-0.1.0/tests/cases/lock/locked/python/glob/inputs/case.yaml +3 -0
  768. code_constraints-0.1.0/tests/cases/lock/locked/python/glob/inputs/src/orders/pricing.py +4 -0
  769. code_constraints-0.1.0/tests/cases/lock/locked/python/glob/outputs/lock_violations.json +6 -0
  770. code_constraints-0.1.0/tests/cases/lock/locked/python/missing/README.md +93 -0
  771. code_constraints-0.1.0/tests/cases/lock/locked/python/missing/inputs/case.yaml +2 -0
  772. code_constraints-0.1.0/tests/cases/lock/locked/python/missing/inputs/src/orders/billing.py +11 -0
  773. code_constraints-0.1.0/tests/cases/lock/locked/python/missing/outputs/lock_violations.json +6 -0
  774. code_constraints-0.1.0/tests/cases/lock/locked/python/reformat/README.md +101 -0
  775. code_constraints-0.1.0/tests/cases/lock/locked/python/reformat/inputs/baseline/orders/billing.py +11 -0
  776. code_constraints-0.1.0/tests/cases/lock/locked/python/reformat/inputs/case.yaml +2 -0
  777. code_constraints-0.1.0/tests/cases/lock/locked/python/reformat/inputs/src/orders/billing.py +20 -0
  778. code_constraints-0.1.0/tests/cases/lock/locked/python/reformat/outputs/lock_violations.json +1 -0
  779. code_constraints-0.1.0/tests/cases/lock/locked/python/removed/README.md +99 -0
  780. code_constraints-0.1.0/tests/cases/lock/locked/python/removed/inputs/baseline/orders/billing.py +11 -0
  781. code_constraints-0.1.0/tests/cases/lock/locked/python/removed/inputs/case.yaml +2 -0
  782. code_constraints-0.1.0/tests/cases/lock/locked/python/removed/inputs/src/orders/billing.py +7 -0
  783. code_constraints-0.1.0/tests/cases/lock/locked/python/removed/outputs/lock_violations.json +6 -0
  784. code_constraints-0.1.0/tests/cases/lock/locked/python/unlocked/README.md +99 -0
  785. code_constraints-0.1.0/tests/cases/lock/locked/python/unlocked/inputs/baseline/orders/billing.py +11 -0
  786. code_constraints-0.1.0/tests/cases/lock/locked/python/unlocked/inputs/case.yaml +2 -0
  787. code_constraints-0.1.0/tests/cases/lock/locked/python/unlocked/inputs/src/orders/billing.py +10 -0
  788. code_constraints-0.1.0/tests/cases/lock/locked/python/unlocked/outputs/lock_violations.json +6 -0
  789. code_constraints-0.1.0/tests/cases/reference/gate/csharp/README.md +119 -0
  790. code_constraints-0.1.0/tests/cases/reference/gate/csharp/inputs/baseline/Catalog/Author.cs +14 -0
  791. code_constraints-0.1.0/tests/cases/reference/gate/csharp/inputs/baseline/Catalog/Book.cs +8 -0
  792. code_constraints-0.1.0/tests/cases/reference/gate/csharp/inputs/case.yaml +2 -0
  793. code_constraints-0.1.0/tests/cases/reference/gate/csharp/inputs/src/Catalog/Author.cs +17 -0
  794. code_constraints-0.1.0/tests/cases/reference/gate/csharp/inputs/src/Catalog/Book.cs +9 -0
  795. code_constraints-0.1.0/tests/cases/reference/gate/csharp/outputs/deviations.json +21 -0
  796. code_constraints-0.1.0/tests/cases/reference/gate/julia/README.md +117 -0
  797. code_constraints-0.1.0/tests/cases/reference/gate/julia/inputs/baseline/catalog/Catalog.jl +12 -0
  798. code_constraints-0.1.0/tests/cases/reference/gate/julia/inputs/case.yaml +2 -0
  799. code_constraints-0.1.0/tests/cases/reference/gate/julia/inputs/src/catalog/Catalog.jl +17 -0
  800. code_constraints-0.1.0/tests/cases/reference/gate/julia/outputs/deviations.json +21 -0
  801. code_constraints-0.1.0/tests/cases/reference/gate/lua/README.md +125 -0
  802. code_constraints-0.1.0/tests/cases/reference/gate/lua/inputs/baseline/catalog/book.lua +13 -0
  803. code_constraints-0.1.0/tests/cases/reference/gate/lua/inputs/baseline/catalog/series.lua +6 -0
  804. code_constraints-0.1.0/tests/cases/reference/gate/lua/inputs/case.yaml +2 -0
  805. code_constraints-0.1.0/tests/cases/reference/gate/lua/inputs/src/catalog/book.lua +15 -0
  806. code_constraints-0.1.0/tests/cases/reference/gate/lua/outputs/deviations.json +26 -0
  807. code_constraints-0.1.0/tests/cases/reference/gate/odin/README.md +117 -0
  808. code_constraints-0.1.0/tests/cases/reference/gate/odin/inputs/baseline/catalog/book.odin +10 -0
  809. code_constraints-0.1.0/tests/cases/reference/gate/odin/inputs/case.yaml +2 -0
  810. code_constraints-0.1.0/tests/cases/reference/gate/odin/inputs/src/catalog/book.odin +15 -0
  811. code_constraints-0.1.0/tests/cases/reference/gate/odin/outputs/deviations.json +21 -0
  812. code_constraints-0.1.0/tests/cases/reference/gate/python/README.md +135 -0
  813. code_constraints-0.1.0/tests/cases/reference/gate/python/inputs/baseline/catalog/author.py +12 -0
  814. code_constraints-0.1.0/tests/cases/reference/gate/python/inputs/baseline/catalog/book.py +3 -0
  815. code_constraints-0.1.0/tests/cases/reference/gate/python/inputs/baseline/catalog/legacy.py +3 -0
  816. code_constraints-0.1.0/tests/cases/reference/gate/python/inputs/case.yaml +2 -0
  817. code_constraints-0.1.0/tests/cases/reference/gate/python/inputs/src/catalog/author.py +15 -0
  818. code_constraints-0.1.0/tests/cases/reference/gate/python/inputs/src/catalog/book.py +5 -0
  819. code_constraints-0.1.0/tests/cases/reference/gate/python/inputs/src/catalog/series.py +3 -0
  820. code_constraints-0.1.0/tests/cases/reference/gate/python/outputs/deviations.json +30 -0
  821. code_constraints-0.1.0/tests/cases/reference/gate/svelte/README.md +120 -0
  822. code_constraints-0.1.0/tests/cases/reference/gate/svelte/inputs/baseline/lib/cart.ts +8 -0
  823. code_constraints-0.1.0/tests/cases/reference/gate/svelte/inputs/baseline/routes/CartView.svelte +7 -0
  824. code_constraints-0.1.0/tests/cases/reference/gate/svelte/inputs/case.yaml +2 -0
  825. code_constraints-0.1.0/tests/cases/reference/gate/svelte/inputs/src/lib/cart.ts +8 -0
  826. code_constraints-0.1.0/tests/cases/reference/gate/svelte/inputs/src/routes/CartView.svelte +8 -0
  827. code_constraints-0.1.0/tests/cases/reference/gate/svelte/outputs/deviations.json +22 -0
  828. code_constraints-0.1.0/tests/cases/reference/gate/typescript/README.md +123 -0
  829. code_constraints-0.1.0/tests/cases/reference/gate/typescript/inputs/baseline/catalog/book.ts +13 -0
  830. code_constraints-0.1.0/tests/cases/reference/gate/typescript/inputs/case.yaml +2 -0
  831. code_constraints-0.1.0/tests/cases/reference/gate/typescript/inputs/src/catalog/book.ts +17 -0
  832. code_constraints-0.1.0/tests/cases/reference/gate/typescript/outputs/deviations.json +25 -0
  833. code_constraints-0.1.0/tests/fixtures/csharp_demo/Animals.cs +46 -0
  834. code_constraints-0.1.0/tests/fixtures/csharp_demo/Store.cs +47 -0
  835. code_constraints-0.1.0/tests/fixtures/csharp_rules/Shop.cs +51 -0
  836. code_constraints-0.1.0/tests/fixtures/julia_demo/billing/invoice.jl +36 -0
  837. code_constraints-0.1.0/tests/fixtures/lua_demo/billing/invoice.lua +39 -0
  838. code_constraints-0.1.0/tests/fixtures/odin_demo/billing/invoice.odin +41 -0
  839. code_constraints-0.1.0/tests/fixtures/python_demo/.cdec/.gitignore +1 -0
  840. code_constraints-0.1.0/tests/fixtures/python_demo/.cdec/README.md +25 -0
  841. code_constraints-0.1.0/tests/fixtures/python_demo/.cdec/reference.xmi +88 -0
  842. code_constraints-0.1.0/tests/fixtures/python_demo/.cdec/rules.yaml +128 -0
  843. code_constraints-0.1.0/tests/fixtures/python_demo/animals/__init__.py +0 -0
  844. code_constraints-0.1.0/tests/fixtures/python_demo/animals/base.py +37 -0
  845. code_constraints-0.1.0/tests/fixtures/python_demo/store/__init__.py +0 -0
  846. code_constraints-0.1.0/tests/fixtures/python_demo/store/cart.py +22 -0
  847. code_constraints-0.1.0/tests/fixtures/python_rules/shop.py +50 -0
  848. code_constraints-0.1.0/tests/fixtures/svelte_demo/src/components/Badge.svelte +9 -0
  849. code_constraints-0.1.0/tests/fixtures/svelte_demo/src/components/CartView.svelte +21 -0
  850. code_constraints-0.1.0/tests/fixtures/svelte_demo/src/lib/store.ts +16 -0
  851. code_constraints-0.1.0/tests/fixtures/typescript_demo/zoo/animals/animal.ts +30 -0
  852. code_constraints-0.1.0/tests/fixtures/typescript_demo/zoo/store/cart.ts +35 -0
  853. code_constraints-0.1.0/tests/test_annotations.py +112 -0
  854. code_constraints-0.1.0/tests/test_case_folders.py +56 -0
  855. code_constraints-0.1.0/tests/test_csharp_parser.py +366 -0
  856. code_constraints-0.1.0/tests/test_depstamp.py +79 -0
  857. code_constraints-0.1.0/tests/test_diff.py +219 -0
  858. code_constraints-0.1.0/tests/test_enforce.py +168 -0
  859. code_constraints-0.1.0/tests/test_exceptions_cli.py +395 -0
  860. code_constraints-0.1.0/tests/test_graph_model.py +514 -0
  861. code_constraints-0.1.0/tests/test_julia_parser.py +154 -0
  862. code_constraints-0.1.0/tests/test_lint_cli.py +447 -0
  863. code_constraints-0.1.0/tests/test_lint_engine.py +610 -0
  864. code_constraints-0.1.0/tests/test_lock_cli.py +350 -0
  865. code_constraints-0.1.0/tests/test_lock_engine.py +297 -0
  866. code_constraints-0.1.0/tests/test_lock_fingerprint.py +403 -0
  867. code_constraints-0.1.0/tests/test_lua_parser.py +132 -0
  868. code_constraints-0.1.0/tests/test_mcp_server.py +456 -0
  869. code_constraints-0.1.0/tests/test_model_io.py +126 -0
  870. code_constraints-0.1.0/tests/test_new_language_engines.py +225 -0
  871. code_constraints-0.1.0/tests/test_odin_parser.py +124 -0
  872. code_constraints-0.1.0/tests/test_proposal_api.py +133 -0
  873. code_constraints-0.1.0/tests/test_python_parser.py +234 -0
  874. code_constraints-0.1.0/tests/test_reference_compare.py +159 -0
  875. code_constraints-0.1.0/tests/test_rule_tags.py +126 -0
  876. code_constraints-0.1.0/tests/test_rules_file.py +305 -0
  877. code_constraints-0.1.0/tests/test_serve_parse.py +121 -0
  878. code_constraints-0.1.0/tests/test_source_rules.py +270 -0
  879. code_constraints-0.1.0/tests/test_svelte_parser.py +93 -0
  880. code_constraints-0.1.0/tests/test_typescript_parser.py +129 -0
  881. code_constraints-0.1.0/tests/test_update.py +30 -0
  882. code_constraints-0.1.0/tests/test_waivers.py +295 -0
  883. code_constraints-0.1.0/tests/test_web_api.py +544 -0
  884. code_constraints-0.1.0/tests/test_xmi_roundtrip.py +359 -0
@@ -0,0 +1,19 @@
1
+ # Normalize to LF in the repository regardless of a contributor's core.autocrlf.
2
+ * text=auto eol=lf
3
+
4
+ # Scripts must stay LF even in a Windows working tree, or they fail on Linux
5
+ # and in git-bash/WSL with "bad interpreter".
6
+ *.sh text eol=lf
7
+ Makefile text eol=lf
8
+
9
+ # Windows-native scripts keep CRLF.
10
+ *.ps1 text eol=crlf
11
+ *.bat text eol=crlf
12
+ *.cmd text eol=crlf
13
+
14
+ # Binary / generated — never touch, never diff.
15
+ *.png binary
16
+ *.jpg binary
17
+ *.ico binary
18
+ *.svg -text
19
+ package-lock.json -diff
@@ -0,0 +1,58 @@
1
+ name: Build distributions
2
+ description: >
3
+ Build the Svelte UI, embed it in the package, then build and validate the
4
+ wheel + sdist. CI and the PyPI release both use this, so the artifact that is
5
+ tested is the artifact that ships.
6
+
7
+ inputs:
8
+ python-version:
9
+ description: Python version used to build the distributions.
10
+ required: false
11
+ default: "3.12"
12
+ node-version:
13
+ description: Node version used to build the frontend.
14
+ required: false
15
+ default: "20"
16
+
17
+ runs:
18
+ using: composite
19
+ steps:
20
+ - uses: actions/setup-python@v5
21
+ with:
22
+ python-version: ${{ inputs.python-version }}
23
+
24
+ - uses: actions/setup-node@v4
25
+ with:
26
+ node-version: ${{ inputs.node-version }}
27
+ cache: npm
28
+ cache-dependency-path: frontend/package-lock.json
29
+
30
+ # The wheel serves the web UI from package data. Without these two steps
31
+ # `python -m build` still succeeds, but produces an API-only wheel whose
32
+ # `/` returns a JSON placeholder instead of the app.
33
+ - name: Install frontend dependencies
34
+ run: npm ci
35
+ shell: bash
36
+ working-directory: frontend
37
+
38
+ - name: Build the web UI
39
+ run: npm run build
40
+ shell: bash
41
+ working-directory: frontend
42
+
43
+ - name: Embed the web UI in the package
44
+ run: make frontend-embed
45
+ shell: bash
46
+
47
+ - name: Build wheel + sdist
48
+ run: |
49
+ python -m pip install --upgrade pip build twine
50
+ python -m build
51
+ python -m twine check dist/*
52
+ shell: bash
53
+
54
+ # A packaging regression here is silent and, once published, permanent:
55
+ # PyPI does not allow re-uploading a version. Fail the build instead.
56
+ - name: Verify the wheel ships the web UI
57
+ run: python .github/scripts/verify_dist.py
58
+ shell: bash
@@ -0,0 +1,115 @@
1
+ """Check that the built distributions are complete before they are published.
2
+
3
+ A wheel that is missing the web UI still installs and still serves the API, so
4
+ nothing fails until a user opens `/` and gets a JSON placeholder. PyPI does not
5
+ allow re-uploading a version, so that mistake is permanent. This script turns it
6
+ into a failed build.
7
+
8
+ Run from the repository root, after `python -m build`:
9
+
10
+ python .github/scripts/verify_dist.py
11
+ """
12
+
13
+ from __future__ import annotations
14
+
15
+ import re
16
+ import sys
17
+ import tarfile
18
+ import zipfile
19
+ from pathlib import Path
20
+
21
+ STATIC = "code_constraints/web/_static"
22
+ SHIMS = "code_constraints/cli/_assets/shims"
23
+
24
+ problems: list[str] = []
25
+ notes: list[str] = []
26
+
27
+
28
+ def fail(msg: str) -> None:
29
+ problems.append(msg)
30
+
31
+
32
+ def ok(msg: str) -> None:
33
+ notes.append(msg)
34
+
35
+
36
+ def find_one(pattern: str) -> Path | None:
37
+ matches = sorted(Path("dist").glob(pattern))
38
+ if not matches:
39
+ fail(f"no {pattern} in dist/")
40
+ return None
41
+ if len(matches) > 1:
42
+ fail(f"expected one {pattern} in dist/, found {len(matches)}: "
43
+ f"{[m.name for m in matches]} — stale artifacts would be published too")
44
+ return None
45
+ return matches[0]
46
+
47
+
48
+ wheel = find_one("*.whl")
49
+ sdist = find_one("*.tar.gz")
50
+
51
+ if wheel is not None:
52
+ names = set(zipfile.ZipFile(wheel).namelist())
53
+ z = zipfile.ZipFile(wheel)
54
+
55
+ index = f"{STATIC}/index.html"
56
+ if index not in names:
57
+ fail(f"{wheel.name}: no {index} — the web UI was not built or not embedded. "
58
+ f"Run `npm run build` in frontend/, then `make frontend-embed`.")
59
+ else:
60
+ html = z.read(index).decode("utf-8")
61
+
62
+ # Every asset the page asks for must actually be in the wheel, or the
63
+ # app loads to a blank screen.
64
+ refs = [r for r in re.findall(r'(?:src|href)="([^"]+)"', html) if r.startswith("/")]
65
+ if not refs:
66
+ fail(f"{wheel.name}: index.html references no local assets — suspect build output")
67
+ for ref in refs:
68
+ member = STATIC + ref
69
+ if member not in names:
70
+ fail(f"{wheel.name}: index.html references {ref}, which is not in the wheel")
71
+ ok(f"web UI present, {len(refs)} referenced asset(s) all resolve")
72
+
73
+ # A dev-server entry point would 'work' locally and break for users.
74
+ for marker in ("/@vite/client", "/src/main", "__vite_ping"):
75
+ if marker in html:
76
+ fail(f"{wheel.name}: index.html contains {marker!r} — this is a dev build, "
77
+ f"not a production bundle")
78
+
79
+ js = [n for n in names if n.startswith(f"{STATIC}/assets/") and n.endswith(".js")]
80
+ if not js:
81
+ fail(f"{wheel.name}: no JS bundle under {STATIC}/assets/")
82
+ else:
83
+ ok(f"JS bundle: {', '.join(Path(n).name for n in sorted(js))}")
84
+
85
+ shims = sorted(n for n in names if n.startswith(SHIMS))
86
+ if len(shims) != 5:
87
+ fail(f"{wheel.name}: expected 5 rule shims under {SHIMS}, found {len(shims)}: {shims}")
88
+ else:
89
+ ok("all 5 rule shims present")
90
+
91
+ # These were removed with the Graphviz dependency; catch an accidental revival.
92
+ for gone in ("code_constraints/core/dot.py", "code_constraints/core/render.py"):
93
+ if gone in names:
94
+ fail(f"{wheel.name}: {gone} is back — the project must not depend on Graphviz")
95
+
96
+ if sdist is not None:
97
+ sdist_names = set(tarfile.open(sdist).getnames())
98
+ # `python -m build` builds the wheel FROM the sdist, so the embedded UI has
99
+ # to travel in the sdist or the wheel above was a lucky local build.
100
+ if not any(f"/src/{STATIC}/index.html" in n for n in sdist_names):
101
+ fail(f"{sdist.name}: the embedded web UI is missing from the sdist, so a wheel "
102
+ f"built from this sdist would have no UI")
103
+ else:
104
+ ok("sdist carries the embedded web UI")
105
+
106
+ for line in notes:
107
+ print(f" ok {line}")
108
+ for line in problems:
109
+ print(f" FAIL {line}", file=sys.stderr)
110
+
111
+ if problems:
112
+ print(f"\n{len(problems)} packaging problem(s) — refusing to publish.", file=sys.stderr)
113
+ sys.exit(1)
114
+
115
+ print("\nDistributions look complete.")
@@ -0,0 +1,95 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ workflow_dispatch:
8
+
9
+ concurrency:
10
+ group: ci-${{ github.ref }}
11
+ cancel-in-progress: true
12
+
13
+ jobs:
14
+ verify:
15
+ name: lint + typecheck + tests (py${{ matrix.python-version }})
16
+ runs-on: ubuntu-latest
17
+ strategy:
18
+ fail-fast: false
19
+ matrix:
20
+ python-version: ["3.11", "3.12", "3.13", "3.14"]
21
+ steps:
22
+ - uses: actions/checkout@v4
23
+ with:
24
+ # The suite exercises real git history (git-info, diff against
25
+ # HEAD~1). The default fetch-depth of 1 leaves HEAD's parent object
26
+ # missing, which makes those tests fail or vacuously skip.
27
+ fetch-depth: 0
28
+
29
+ - uses: actions/setup-python@v5
30
+ with:
31
+ python-version: ${{ matrix.python-version }}
32
+ cache: pip
33
+ cache-dependency-path: pyproject.toml
34
+
35
+ - name: Install
36
+ run: |
37
+ python -m pip install --upgrade pip
38
+ python -m pip install -e ".[dev,mcp]"
39
+
40
+ - name: Tests (pytest)
41
+ run: python -m pytest -q
42
+
43
+ # Advisory, not blocking. Both gates were already failing before this
44
+ # repo was split out: mypy reports 112 errors, and ruff reports ~366
45
+ # (mostly UP045 Optional[X] -> X | None, plus B008 against typer's
46
+ # `= typer.Option(...)` idiom, which is a false positive for a CLI).
47
+ # `dev` pins ruff>=0.6 / mypy>=1.10 unbounded, so a fresh install also
48
+ # picks up newer default rules. Clear the backlog, then drop
49
+ # continue-on-error to make these real gates again.
50
+ - name: Lint (ruff) [advisory]
51
+ continue-on-error: true
52
+ run: python -m ruff check src tests
53
+
54
+ - name: Type-check (mypy) [advisory]
55
+ continue-on-error: true
56
+ run: python -m mypy src
57
+
58
+ frontend:
59
+ name: frontend build + svelte-check
60
+ runs-on: ubuntu-latest
61
+ steps:
62
+ - uses: actions/checkout@v4
63
+
64
+ - uses: actions/setup-node@v4
65
+ with:
66
+ node-version: "20"
67
+ cache: npm
68
+ cache-dependency-path: frontend/package-lock.json
69
+
70
+ - name: Install
71
+ run: npm ci
72
+ working-directory: frontend
73
+
74
+ - name: Type-check
75
+ run: npm run check
76
+ working-directory: frontend
77
+
78
+ - name: Build
79
+ run: npm run build
80
+ working-directory: frontend
81
+
82
+ # Builds exactly the way the release does, so a packaging break shows up on
83
+ # the pull request instead of on a tag that cannot be re-published.
84
+ build-dist:
85
+ name: build wheel + sdist (with web UI)
86
+ runs-on: ubuntu-latest
87
+ steps:
88
+ - uses: actions/checkout@v4
89
+
90
+ - uses: ./.github/actions/build-dist
91
+
92
+ - uses: actions/upload-artifact@v4
93
+ with:
94
+ name: dist
95
+ path: dist/
@@ -0,0 +1,94 @@
1
+ name: Publish to PyPI
2
+
3
+ # Publishes on a version tag (v0.1.0), or manually. Uses PyPI Trusted
4
+ # Publishing (OIDC) — no API token is stored in the repository. Configure the
5
+ # publisher once at https://pypi.org/manage/project/code-constraints/settings/publishing/
6
+ # owner: fleskovar repo: code-constraints
7
+ # workflow: publish.yml environment: pypi
8
+ #
9
+ # `ci.yml` runs on branches and pull requests, not on tags, so this workflow
10
+ # runs the test suite itself. A PyPI version cannot be re-uploaded, so every
11
+ # gate has to pass before the upload step, not after.
12
+ on:
13
+ push:
14
+ tags: ["v*"]
15
+ workflow_dispatch:
16
+
17
+ concurrency:
18
+ group: publish-${{ github.ref }}
19
+ cancel-in-progress: false
20
+
21
+ permissions:
22
+ contents: read
23
+
24
+ jobs:
25
+ test:
26
+ name: tests (py${{ matrix.python-version }})
27
+ runs-on: ubuntu-latest
28
+ strategy:
29
+ fail-fast: true
30
+ matrix:
31
+ python-version: ["3.11", "3.12", "3.13", "3.14"]
32
+ steps:
33
+ - uses: actions/checkout@v4
34
+ with:
35
+ # The suite exercises real git history (git-info, diff against
36
+ # HEAD~1). The default fetch-depth of 1 leaves HEAD's parent object
37
+ # missing, which makes those tests fail or vacuously skip.
38
+ fetch-depth: 0
39
+
40
+ - uses: actions/setup-python@v5
41
+ with:
42
+ python-version: ${{ matrix.python-version }}
43
+ cache: pip
44
+ cache-dependency-path: pyproject.toml
45
+
46
+ - name: Install
47
+ run: |
48
+ python -m pip install --upgrade pip
49
+ python -m pip install -e ".[dev,mcp]"
50
+
51
+ - name: Tests
52
+ run: python -m pytest -q
53
+
54
+ build:
55
+ name: build distributions
56
+ needs: test
57
+ runs-on: ubuntu-latest
58
+ steps:
59
+ - uses: actions/checkout@v4
60
+
61
+ # A tag that disagrees with pyproject.toml publishes the wrong version
62
+ # under the right name, and it cannot be taken back.
63
+ - name: Check the tag matches the package version
64
+ if: startsWith(github.ref, 'refs/tags/v')
65
+ run: |
66
+ tag="${GITHUB_REF_NAME#v}"
67
+ pkg=$(python3 -c "import tomllib,pathlib; print(tomllib.loads(pathlib.Path('pyproject.toml').read_text())['project']['version'])")
68
+ echo "tag=$tag pyproject=$pkg"
69
+ if [ "$tag" != "$pkg" ]; then
70
+ echo "::error::tag v$tag does not match pyproject version $pkg"
71
+ exit 1
72
+ fi
73
+
74
+ - uses: ./.github/actions/build-dist
75
+
76
+ - uses: actions/upload-artifact@v4
77
+ with:
78
+ name: dist
79
+ path: dist/
80
+
81
+ publish:
82
+ name: upload to PyPI
83
+ needs: build
84
+ runs-on: ubuntu-latest
85
+ environment: pypi
86
+ permissions:
87
+ id-token: write # required for Trusted Publishing
88
+ steps:
89
+ - uses: actions/download-artifact@v4
90
+ with:
91
+ name: dist
92
+ path: dist/
93
+
94
+ - uses: pypa/gh-action-pypi-publish@release/v1
@@ -0,0 +1,37 @@
1
+ # Python
2
+ __pycache__/
3
+ *.py[cod]
4
+ *.egg-info/
5
+ .venv/
6
+ venv/
7
+ .pytest_cache/
8
+ .mypy_cache/
9
+ .ruff_cache/
10
+ dist/
11
+ build/
12
+
13
+ # code-constraints cache & default script output
14
+ .cdec_cache/
15
+ out/
16
+
17
+ # Node / Svelte
18
+ node_modules/
19
+ frontend/dist/
20
+ frontend/.svelte-kit/
21
+
22
+ # IDE
23
+ .vscode/
24
+ .idea/
25
+
26
+ # OS
27
+ .DS_Store
28
+ Thumbs.db
29
+
30
+ # Claude Code: local config and session state are private. The agents/skills
31
+ # that ship with the package live in src/code_constraints/cli/_assets/.
32
+ .claude/
33
+ .mcp.json
34
+ .hcm
35
+ CLAUDE.md
36
+ # Built SPA copied into the package by `make frontend-embed` for packaging.
37
+ src/code_constraints/web/_static/
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 fleskovar
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,237 @@
1
+ # code-constraints (cdec) — development, build, and packaging entry points.
2
+ #
3
+ # Recipes run through `sh`. On Windows use Git Bash (or any shell that provides
4
+ # `sh` on PATH) so the venv-layout detection and the recipe bodies behave.
5
+ #
6
+ # make setup one-time development environment (venv + deps + frontend)
7
+ # make test run the test suite
8
+ # make dist build the wheel + sdist into dist/
9
+ # make help list every target
10
+ #
11
+ # Override the interpreter or venv location on the command line:
12
+ # make setup BASE_PYTHON=python3.12 VENV=/tmp/cdec-venv
13
+
14
+ SHELL := /bin/sh
15
+ .DEFAULT_GOAL := help
16
+
17
+ # ---------------------------------------------------------------------------
18
+ # Layout / tool discovery
19
+ # ---------------------------------------------------------------------------
20
+
21
+ VENV ?= .venv
22
+
23
+ # Windows venvs put executables in Scripts/ and keep the .exe suffix.
24
+ ifeq ($(OS),Windows_NT)
25
+ VENV_BIN := $(VENV)/Scripts
26
+ PY := $(VENV_BIN)/python.exe
27
+ BASE_PYTHON ?= python
28
+ else
29
+ VENV_BIN := $(VENV)/bin
30
+ PY := $(VENV_BIN)/python
31
+ BASE_PYTHON ?= python3
32
+ endif
33
+
34
+ PIP := $(PY) -m pip
35
+ CDEC := $(PY) -m code_constraints.cli
36
+
37
+ FRONTEND := frontend
38
+ NPM ?= npm
39
+
40
+ # `serve` defaults. Port 8000 is administratively reserved by http.sys on some
41
+ # Windows machines, so the project default is 8765 (see CLAUDE.md).
42
+ HOST ?= 127.0.0.1
43
+ PORT ?= 8765
44
+
45
+ .PHONY: help venv setup dev install-dev install install-pipx uninstall \
46
+ frontend-deps frontend-build frontend-check frontend clean-frontend \
47
+ frontend-embed build dist package check-dist test test-cov lint format typecheck \
48
+ verify test-cases test-case debug-case update-cases demo serve clean clean-venv distclean
49
+
50
+ # ---------------------------------------------------------------------------
51
+ # Help
52
+ # ---------------------------------------------------------------------------
53
+
54
+ help: ## Show this help
55
+ @echo "code-constraints (cdec) - make targets"
56
+ @echo
57
+ @grep -hE '^[a-zA-Z_-]+:.*?## ' $(MAKEFILE_LIST) \
58
+ | sort \
59
+ | awk 'BEGIN {FS = ":.*?## "}; {printf " \033[36m%-18s\033[0m %s\n", $$1, $$2}'
60
+ @echo
61
+ @echo "Variables: VENV=$(VENV) BASE_PYTHON=$(BASE_PYTHON) HOST=$(HOST) PORT=$(PORT)"
62
+
63
+ # ---------------------------------------------------------------------------
64
+ # Environment setup
65
+ # ---------------------------------------------------------------------------
66
+
67
+ venv: ## Create the virtualenv if it does not exist
68
+ @if [ ! -x "$(PY)" ]; then \
69
+ echo ">> creating virtualenv at $(VENV)"; \
70
+ $(BASE_PYTHON) -m venv "$(VENV)"; \
71
+ else \
72
+ echo ">> virtualenv already present at $(VENV)"; \
73
+ fi
74
+
75
+ setup: venv install-dev frontend ## One-time dev environment: venv + editable install + frontend build
76
+ @echo
77
+ @echo "Ready. Next:"
78
+ @echo " make serve # http://$(HOST):$(PORT)"
79
+ @echo " make test"
80
+ @echo " make demo"
81
+
82
+ dev: setup ## Alias for `setup`
83
+
84
+ install-dev: venv ## Editable install with dev extras (the development version)
85
+ @echo ">> installing code-constraints (editable, dev + mcp extras)"
86
+ $(PIP) install --upgrade pip
87
+ $(PIP) install -e ".[dev,mcp]"
88
+ @echo ">> cdec available as: $(VENV_BIN)/cdec"
89
+ @echo ">> MCP server available as: $(VENV_BIN)/cdec-mcp"
90
+
91
+ install: venv frontend-embed ## Install from source into the venv (non-editable)
92
+ @echo ">> installing code-constraints from source (non-editable)"
93
+ $(PIP) install --upgrade pip
94
+ $(PIP) install .
95
+ @echo ">> cdec available as: $(VENV_BIN)/cdec"
96
+
97
+ install-pipx: frontend-embed ## Install the cdec CLI + MCP server globally from this checkout via pipx
98
+ @command -v pipx >/dev/null 2>&1 || { echo "pipx not found — see https://pipx.pypa.io"; exit 1; }
99
+ pipx install --force ".[mcp]"
100
+ @echo ">> cdec installed globally; run: cdec --help"
101
+ @echo ">> cdec-mcp on PATH too, so a harness .mcp.json can just say \"command\": \"cdec-mcp\""
102
+
103
+ uninstall: ## Remove code-constraints from the venv
104
+ -$(PIP) uninstall -y code-constraints
105
+
106
+ # ---------------------------------------------------------------------------
107
+ # Frontend (Svelte 5 + Vite)
108
+ # ---------------------------------------------------------------------------
109
+
110
+ frontend-deps: ## npm install for the frontend
111
+ @echo ">> installing frontend deps"
112
+ cd $(FRONTEND) && $(NPM) install
113
+
114
+ frontend-build: ## Build the Svelte SPA into frontend/dist
115
+ @echo ">> building frontend"
116
+ cd $(FRONTEND) && $(NPM) run build
117
+
118
+ frontend-check: ## Run svelte-check
119
+ cd $(FRONTEND) && $(NPM) run check
120
+
121
+ frontend: frontend-deps frontend-build ## Install frontend deps and build the SPA
122
+
123
+ # The wheel serves the SPA from package data, so the built bundle has to sit
124
+ # inside the package before hatchling collects it. Skipped (with a warning)
125
+ # when the bundle is not built, so `pip install .` on a bare clone still works.
126
+ EMBED := src/code_constraints/web/_static
127
+
128
+ frontend-embed: ## Copy frontend/dist into the package as web/_static
129
+ @rm -rf $(EMBED)
130
+ @if [ -d "$(FRONTEND)/dist" ]; then \
131
+ echo ">> embedding $(FRONTEND)/dist -> $(EMBED)"; \
132
+ mkdir -p $(EMBED) && cp -r $(FRONTEND)/dist/. $(EMBED)/; \
133
+ else \
134
+ echo "warning: $(FRONTEND)/dist not built - the wheel serves the API only"; \
135
+ fi
136
+
137
+ clean-frontend: ## Remove frontend build output
138
+ rm -rf $(FRONTEND)/dist $(EMBED)
139
+
140
+ # ---------------------------------------------------------------------------
141
+ # Build / package
142
+ # ---------------------------------------------------------------------------
143
+
144
+ build: dist ## Alias for `dist`
145
+
146
+ dist: clean-dist frontend-build frontend-embed ## Build the wheel + sdist into dist/
147
+ @echo ">> building distributable"
148
+ $(PY) -m build
149
+ @echo
150
+ @ls -l dist
151
+ @echo
152
+ @echo "NOTE: the wheel ships the Python packages, the rule shims, the Claude"
153
+ @echo " assets, and the built SPA (as package data at web/_static), so"
154
+ @echo " an installed wheel serves the web UI at / as well as the API."
155
+
156
+ package: dist ## Alias for `dist`
157
+
158
+ check-dist: dist ## Build, then validate the artifacts with twine
159
+ @$(PIP) install --quiet twine
160
+ $(PY) -m twine check dist/*
161
+
162
+ clean-dist:
163
+ rm -rf dist build *.egg-info src/*.egg-info
164
+
165
+ # ---------------------------------------------------------------------------
166
+ # Quality gates
167
+ # ---------------------------------------------------------------------------
168
+
169
+ test: ## Run the test suite
170
+ $(PY) -m pytest
171
+
172
+ test-cov: ## Run the test suite with a coverage report
173
+ $(PY) -m pytest --cov=code_constraints --cov-report=term-missing
174
+
175
+ lint: ## Lint with ruff
176
+ $(PY) -m ruff check src tests
177
+
178
+ format: ## Auto-fix lint findings with ruff
179
+ $(PY) -m ruff check --fix src tests
180
+
181
+ typecheck: ## Type-check with mypy
182
+ $(PY) -m mypy src
183
+
184
+ verify: lint typecheck test ## Run lint + typecheck + tests
185
+
186
+ test-cases: ## Run every human-readable case folder under tests/cases/
187
+ $(PY) -m pytest tests/test_case_folders.py
188
+
189
+ test-case: ## Run one case folder: make test-case CASE=check/subclass-naming/python
190
+ $(PY) -m pytest "tests/test_case_folders.py::test_case[$(CASE)]"
191
+
192
+ debug-case: ## Debug one case folder under pdb: make debug-case CASE=...
193
+ $(PY) -m pytest "tests/test_case_folders.py::test_case[$(CASE)]" --pdb -s
194
+
195
+ update-cases: ## Regenerate every case baseline from current behaviour (REVIEW THE DIFF)
196
+ UPDATE_BASELINES=1 $(PY) -m pytest tests/test_case_folders.py
197
+
198
+ # ---------------------------------------------------------------------------
199
+ # Running
200
+ # ---------------------------------------------------------------------------
201
+
202
+ serve: ## Start the web server (HOST/PORT overridable)
203
+ @if [ ! -f "$(FRONTEND)/dist/index.html" ]; then \
204
+ echo "warning: $(FRONTEND)/dist not built — run 'make frontend-build'"; \
205
+ fi
206
+ $(CDEC) serve --host $(HOST) --port $(PORT)
207
+
208
+ # Every language with rule-tag support ships a demo with the same shape: a
209
+ # tagged billing slice, a committed lock, and one seeded conformance violation.
210
+ # See docs/languages/ for a guide per language.
211
+ DEMO_LANGS := python csharp odin lua julia
212
+
213
+ demo: ## Run `cdec check` against the bundled example projects
214
+ @echo "Every rule in .cdec/rules.yaml runs in one command, so this is the"
215
+ @echo "whole gate: architectural rules, tag conformance, locks and the"
216
+ @echo "reference check together."
217
+ @echo "(each demo carries one seeded violation - non-zero exit is expected)"
218
+ @echo
219
+ @for lang in $(DEMO_LANGS); do \
220
+ echo "--- $$lang"; \
221
+ $(CDEC) check --config examples/$${lang}_demo/.cdec --source examples/$${lang}_demo || true; \
222
+ echo; \
223
+ done
224
+
225
+ # ---------------------------------------------------------------------------
226
+ # Cleaning
227
+ # ---------------------------------------------------------------------------
228
+
229
+ clean: clean-dist ## Remove build artifacts and caches (keeps the venv)
230
+ rm -rf .pytest_cache .ruff_cache .mypy_cache .cdec_cache htmlcov .coverage
231
+ find . -type d -name __pycache__ -not -path "./$(VENV)/*" -not -path "./$(FRONTEND)/node_modules/*" -exec rm -rf {} + 2>/dev/null || true
232
+
233
+ clean-venv: ## Delete the virtualenv
234
+ rm -rf $(VENV)
235
+
236
+ distclean: clean clean-frontend clean-venv ## Remove everything generated, including node_modules
237
+ rm -rf $(FRONTEND)/node_modules