cloudwright-ai 0.3.0__tar.gz → 0.3.2__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 (203) hide show
  1. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/PKG-INFO +9 -6
  2. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/__init__.py +1 -1
  3. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/exporter/__init__.py +9 -1
  4. cloudwright_ai-0.3.2/cloudwright/exporter/ascii.py +107 -0
  5. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/llm/base.py +4 -0
  6. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/pyproject.toml +4 -3
  7. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/.gitignore +0 -0
  8. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/README.md +0 -0
  9. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/adapters/__init__.py +0 -0
  10. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/adapters/aws.py +0 -0
  11. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/adapters/azure.py +0 -0
  12. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/adapters/databricks.py +0 -0
  13. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/adapters/gcp.py +0 -0
  14. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/analyzer.py +0 -0
  15. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/architect.py +0 -0
  16. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/ascii_diagram.py +0 -0
  17. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/catalog/__init__.py +0 -0
  18. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/catalog/formula.py +0 -0
  19. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/catalog/refresh.py +0 -0
  20. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/catalog/store.py +0 -0
  21. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/cost.py +0 -0
  22. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/catalog.db +0 -0
  23. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/icons/_generate_icons.py +0 -0
  24. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/icons/aws/alb.svg +0 -0
  25. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/icons/aws/api_gateway.svg +0 -0
  26. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/icons/aws/cloudfront.svg +0 -0
  27. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/icons/aws/cloudtrail.svg +0 -0
  28. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/icons/aws/cloudwatch.svg +0 -0
  29. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/icons/aws/cognito.svg +0 -0
  30. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/icons/aws/dynamodb.svg +0 -0
  31. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/icons/aws/ebs.svg +0 -0
  32. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/icons/aws/ec2.svg +0 -0
  33. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/icons/aws/ecr.svg +0 -0
  34. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/icons/aws/ecs.svg +0 -0
  35. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/icons/aws/eks.svg +0 -0
  36. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/icons/aws/elasticache.svg +0 -0
  37. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/icons/aws/emr.svg +0 -0
  38. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/icons/aws/glue.svg +0 -0
  39. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/icons/aws/guardduty.svg +0 -0
  40. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/icons/aws/kinesis.svg +0 -0
  41. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/icons/aws/kms.svg +0 -0
  42. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/icons/aws/lambda.svg +0 -0
  43. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/icons/aws/nlb.svg +0 -0
  44. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/icons/aws/rds.svg +0 -0
  45. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/icons/aws/redshift.svg +0 -0
  46. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/icons/aws/route53.svg +0 -0
  47. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/icons/aws/s3.svg +0 -0
  48. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/icons/aws/sagemaker.svg +0 -0
  49. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/icons/aws/sns.svg +0 -0
  50. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/icons/aws/sqs.svg +0 -0
  51. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/icons/aws/step_functions.svg +0 -0
  52. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/icons/aws/waf.svg +0 -0
  53. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/icons/azure/aks.svg +0 -0
  54. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/icons/azure/app_gateway.svg +0 -0
  55. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/icons/azure/azure_cache.svg +0 -0
  56. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/icons/azure/azure_functions.svg +0 -0
  57. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/icons/azure/azure_sql.svg +0 -0
  58. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/icons/azure/blob_storage.svg +0 -0
  59. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/icons/azure/cosmos_db.svg +0 -0
  60. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/icons/azure/service_bus.svg +0 -0
  61. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/icons/azure/virtual_machines.svg +0 -0
  62. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/icons/gcp/bigquery.svg +0 -0
  63. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/icons/gcp/cloud_cdn.svg +0 -0
  64. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/icons/gcp/cloud_functions.svg +0 -0
  65. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/icons/gcp/cloud_load_balancing.svg +0 -0
  66. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/icons/gcp/cloud_run.svg +0 -0
  67. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/icons/gcp/cloud_sql.svg +0 -0
  68. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/icons/gcp/cloud_storage.svg +0 -0
  69. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/icons/gcp/compute_engine.svg +0 -0
  70. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/icons/gcp/gke.svg +0 -0
  71. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/icons/gcp/memorystore.svg +0 -0
  72. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/icons/gcp/pub_sub.svg +0 -0
  73. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/icons/generic/cache.svg +0 -0
  74. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/icons/generic/cdn.svg +0 -0
  75. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/icons/generic/compute.svg +0 -0
  76. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/icons/generic/database.svg +0 -0
  77. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/icons/generic/firewall.svg +0 -0
  78. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/icons/generic/internet.svg +0 -0
  79. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/icons/generic/load_balancer.svg +0 -0
  80. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/icons/generic/queue.svg +0 -0
  81. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/icons/generic/storage.svg +0 -0
  82. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/icons/generic/user.svg +0 -0
  83. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/registry/analytics.yaml +0 -0
  84. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/registry/cache.yaml +0 -0
  85. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/registry/compute.yaml +0 -0
  86. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/registry/containers.yaml +0 -0
  87. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/registry/database_nosql.yaml +0 -0
  88. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/registry/database_relational.yaml +0 -0
  89. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/registry/messaging.yaml +0 -0
  90. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/registry/ml.yaml +0 -0
  91. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/registry/networking_api.yaml +0 -0
  92. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/registry/networking_cdn.yaml +0 -0
  93. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/registry/networking_dns.yaml +0 -0
  94. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/registry/networking_lb.yaml +0 -0
  95. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/registry/orchestration.yaml +0 -0
  96. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/registry/security_auth.yaml +0 -0
  97. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/registry/security_waf.yaml +0 -0
  98. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/registry/serverless.yaml +0 -0
  99. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/registry/storage_block.yaml +0 -0
  100. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/registry/storage_object.yaml +0 -0
  101. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/registry/streaming.yaml +0 -0
  102. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/templates/_index.yaml +0 -0
  103. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/templates/azure-microservices.yaml +0 -0
  104. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/templates/azure-serverless-api.yaml +0 -0
  105. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/templates/azure-three-tier-web.yaml +0 -0
  106. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/templates/batch-processing.yaml +0 -0
  107. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/templates/data-lake.yaml +0 -0
  108. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/templates/databricks-lakehouse.yaml +0 -0
  109. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/templates/databricks-ml-platform.yaml +0 -0
  110. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/templates/event-driven.yaml +0 -0
  111. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/templates/gcp-microservices.yaml +0 -0
  112. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/templates/gcp-serverless-api.yaml +0 -0
  113. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/templates/gcp-three-tier-web.yaml +0 -0
  114. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/templates/microservices.yaml +0 -0
  115. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/templates/ml_pipeline.yaml +0 -0
  116. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/templates/serverless_api.yaml +0 -0
  117. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/templates/static-site.yaml +0 -0
  118. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/data/templates/three_tier_web.yaml +0 -0
  119. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/differ.py +0 -0
  120. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/drift.py +0 -0
  121. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/evolution.py +0 -0
  122. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/exporter/aibom.py +0 -0
  123. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/exporter/c4.py +0 -0
  124. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/exporter/cloudformation.py +0 -0
  125. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/exporter/compliance_report.py +0 -0
  126. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/exporter/d2.py +0 -0
  127. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/exporter/diff_diagram.py +0 -0
  128. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/exporter/mermaid.py +0 -0
  129. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/exporter/presentation.py +0 -0
  130. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/exporter/renderer.py +0 -0
  131. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/exporter/sbom.py +0 -0
  132. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/exporter/terraform.py +0 -0
  133. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/icons.py +0 -0
  134. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/importer/__init__.py +0 -0
  135. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/importer/cloudformation.py +0 -0
  136. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/importer/terraform_state.py +0 -0
  137. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/importer/utils.py +0 -0
  138. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/layout.py +0 -0
  139. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/linter.py +0 -0
  140. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/llm/__init__.py +0 -0
  141. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/llm/anthropic.py +0 -0
  142. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/llm/openai.py +0 -0
  143. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/plugins.py +0 -0
  144. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/policy.py +0 -0
  145. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/providers/__init__.py +0 -0
  146. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/providers/aws.py +0 -0
  147. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/providers/azure.py +0 -0
  148. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/providers/databricks.py +0 -0
  149. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/providers/gcp.py +0 -0
  150. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/py.typed +0 -0
  151. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/registry.py +0 -0
  152. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/scorer.py +0 -0
  153. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/security.py +0 -0
  154. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/spec.py +0 -0
  155. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/templates.py +0 -0
  156. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/cloudwright/validator.py +0 -0
  157. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/tests/conftest.py +0 -0
  158. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/tests/fixtures/aws.tfstate +0 -0
  159. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/tests/fixtures/aws_serverless.tfstate +0 -0
  160. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/tests/fixtures/azure.tfstate +0 -0
  161. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/tests/fixtures/cloudformation_template.json +0 -0
  162. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/tests/fixtures/gcp.tfstate +0 -0
  163. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/tests/fixtures/serverless_api.json +0 -0
  164. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/tests/fixtures/three_tier.yaml +0 -0
  165. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/tests/test_adapter_aws.py +0 -0
  166. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/tests/test_adapter_azure.py +0 -0
  167. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/tests/test_adapter_databricks.py +0 -0
  168. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/tests/test_adapter_gcp.py +0 -0
  169. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/tests/test_adr.py +0 -0
  170. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/tests/test_analyzer.py +0 -0
  171. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/tests/test_architect.py +0 -0
  172. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/tests/test_architect_chat.py +0 -0
  173. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/tests/test_ascii_diagram.py +0 -0
  174. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/tests/test_c4_exporter.py +0 -0
  175. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/tests/test_catalog.py +0 -0
  176. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/tests/test_cfn_importer.py +0 -0
  177. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/tests/test_constraint_propagation.py +0 -0
  178. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/tests/test_cost.py +0 -0
  179. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/tests/test_databricks.py +0 -0
  180. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/tests/test_diff_viz.py +0 -0
  181. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/tests/test_differ.py +0 -0
  182. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/tests/test_drift.py +0 -0
  183. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/tests/test_e2e.py +0 -0
  184. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/tests/test_evolution.py +0 -0
  185. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/tests/test_exporter.py +0 -0
  186. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/tests/test_formula.py +0 -0
  187. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/tests/test_icons.py +0 -0
  188. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/tests/test_importer.py +0 -0
  189. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/tests/test_importer_cfn.py +0 -0
  190. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/tests/test_layout_engine.py +0 -0
  191. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/tests/test_linter.py +0 -0
  192. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/tests/test_packaging.py +0 -0
  193. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/tests/test_plugins.py +0 -0
  194. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/tests/test_policy.py +0 -0
  195. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/tests/test_presentation.py +0 -0
  196. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/tests/test_refresh.py +0 -0
  197. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/tests/test_registry.py +0 -0
  198. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/tests/test_renderer.py +0 -0
  199. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/tests/test_scorer.py +0 -0
  200. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/tests/test_security.py +0 -0
  201. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/tests/test_spec.py +0 -0
  202. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/tests/test_validator.py +0 -0
  203. {cloudwright_ai-0.3.0 → cloudwright_ai-0.3.2}/tests/test_validator_fedramp_gdpr.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cloudwright-ai
3
- Version: 0.3.0
3
+ Version: 0.3.2
4
4
  Summary: Architecture intelligence for cloud engineers — design, cost, compare, export
5
5
  Project-URL: Homepage, https://github.com/xmpuspus/cloudwright
6
6
  Project-URL: Repository, https://github.com/xmpuspus/cloudwright
@@ -22,19 +22,22 @@ Requires-Dist: openai<3,>=1.50
22
22
  Requires-Dist: pydantic<3,>=2.11
23
23
  Requires-Dist: pyyaml<7,>=6.0
24
24
  Provides-Extra: all
25
- Requires-Dist: cloudwright-ai-cli==0.3.0; extra == 'all'
26
- Requires-Dist: cloudwright-ai-web==0.3.0; extra == 'all'
25
+ Requires-Dist: cloudwright-ai-cli==0.3.1; extra == 'all'
26
+ Requires-Dist: cloudwright-ai-mcp==0.3.1; extra == 'all'
27
+ Requires-Dist: cloudwright-ai-web==0.3.1; extra == 'all'
27
28
  Requires-Dist: databricks-sdk>=0.38.0; extra == 'all'
28
29
  Provides-Extra: cli
29
- Requires-Dist: cloudwright-ai-cli==0.3.0; extra == 'cli'
30
+ Requires-Dist: cloudwright-ai-cli==0.3.1; extra == 'cli'
30
31
  Provides-Extra: databricks
31
32
  Requires-Dist: databricks-sdk>=0.38.0; extra == 'databricks'
33
+ Provides-Extra: mcp
34
+ Requires-Dist: cloudwright-ai-mcp==0.3.1; extra == 'mcp'
32
35
  Provides-Extra: pdf
33
36
  Requires-Dist: markdown2; extra == 'pdf'
34
37
  Requires-Dist: weasyprint; extra == 'pdf'
35
38
  Provides-Extra: web
36
- Requires-Dist: cloudwright-ai-cli==0.3.0; extra == 'web'
37
- Requires-Dist: cloudwright-ai-web==0.3.0; extra == 'web'
39
+ Requires-Dist: cloudwright-ai-cli==0.3.1; extra == 'web'
40
+ Requires-Dist: cloudwright-ai-web==0.3.1; extra == 'web'
38
41
  Description-Content-Type: text/markdown
39
42
 
40
43
  # Cloudwright
@@ -17,7 +17,7 @@ from cloudwright.spec import (
17
17
  ValidationResult,
18
18
  )
19
19
 
20
- __version__ = "0.3.0"
20
+ __version__ = "0.3.2"
21
21
 
22
22
  __all__ = [
23
23
  "Alternative",
@@ -9,7 +9,7 @@ from typing import TYPE_CHECKING
9
9
  if TYPE_CHECKING:
10
10
  from cloudwright.spec import ArchSpec
11
11
 
12
- FORMATS = ("terraform", "cloudformation", "mermaid", "d2", "svg", "png", "c4", "sbom", "aibom", "compliance")
12
+ FORMATS = ("terraform", "cloudformation", "mermaid", "d2", "ascii", "svg", "png", "c4", "sbom", "aibom", "compliance")
13
13
 
14
14
 
15
15
  class ExporterPlugin(ABC):
@@ -74,6 +74,14 @@ def export_spec(spec: ArchSpec, fmt: str, output: str | None = None, output_dir:
74
74
  Path(output).write_text(content)
75
75
  return content
76
76
 
77
+ if fmt in ("ascii", "text"):
78
+ from cloudwright.exporter.ascii import render
79
+
80
+ content = render(spec)
81
+ if output:
82
+ Path(output).write_text(content)
83
+ return content
84
+
77
85
  if fmt == "c4":
78
86
  from cloudwright.exporter.c4 import render
79
87
 
@@ -0,0 +1,107 @@
1
+ """Render an ArchSpec as an ASCII architecture diagram for terminal display."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import TYPE_CHECKING
6
+
7
+ if TYPE_CHECKING:
8
+ from cloudwright.spec import ArchSpec
9
+
10
+ _TIER_LABELS = {
11
+ 0: "Edge",
12
+ 1: "Ingress",
13
+ 2: "Compute",
14
+ 3: "Data",
15
+ 4: "Storage",
16
+ }
17
+
18
+ _WIDTH = 72
19
+ _TIER_INNER = _WIDTH - 8 # content area inside tier boxes
20
+ _MAX_CELL = 20 # max width per component cell
21
+
22
+
23
+ def render(spec: "ArchSpec") -> str:
24
+ """Render an ArchSpec as a boxed ASCII architecture diagram."""
25
+ tiers: dict[int, list[tuple[str, str]]] = {}
26
+ for c in spec.components:
27
+ tiers.setdefault(c.tier, []).append((c.service, c.label))
28
+
29
+ lines: list[str] = []
30
+ inner = _WIDTH - 4 # inside the outer box
31
+
32
+ # Header
33
+ lines.append("+" + "=" * (_WIDTH - 2) + "+")
34
+ lines.append(_pad(f" {spec.name}", inner))
35
+ region = spec.region or ""
36
+ provider = (spec.provider or "").upper()
37
+ meta = f" {provider} / {region} -- {len(spec.components)} services -- {len(spec.connections)} connections"
38
+ lines.append(_pad(meta, inner))
39
+ lines.append("+" + "=" * (_WIDTH - 2) + "+")
40
+
41
+ # Tiers
42
+ sorted_tiers = sorted(tiers.keys())
43
+ for i, tier_num in enumerate(sorted_tiers):
44
+ components = tiers[tier_num]
45
+ tier_label = _TIER_LABELS.get(tier_num, f"Tier {tier_num}")
46
+
47
+ lines.append(_pad("", inner))
48
+
49
+ # Tier box top with label
50
+ box_w = inner - 4 # tier box width
51
+ label_part = f"-- {tier_label} "
52
+ dash_rest = "-" * (box_w - len(label_part) - 1)
53
+ lines.append(_pad(f" +{label_part}{dash_rest}+", inner))
54
+
55
+ # Component rows (fit within tier box)
56
+ for row_start in range(0, len(components), 3):
57
+ row = components[row_start : row_start + 3]
58
+ cells = []
59
+ for service, _label in row:
60
+ cells.append(f"[{service}]")
61
+ row_text = " | " + " ".join(cells)
62
+ # Pad to tier box width
63
+ pad_needed = box_w - len(row_text) + 2
64
+ if pad_needed > 0:
65
+ row_text += " " * pad_needed + "|"
66
+ else:
67
+ row_text = row_text[: box_w + 2] + "|"
68
+ lines.append(_pad(row_text, inner))
69
+
70
+ # Tier box bottom
71
+ lines.append(_pad(" +" + "-" * box_w + "+", inner))
72
+
73
+ # Arrow between tiers
74
+ if i < len(sorted_tiers) - 1:
75
+ mid = inner // 2
76
+ lines.append(_pad(" " * mid + "|", inner))
77
+ lines.append(_pad(" " * mid + "v", inner))
78
+
79
+ lines.append(_pad("", inner))
80
+
81
+ # Connection summary
82
+ if spec.connections:
83
+ lines.append(_pad(" Connections:", inner))
84
+ shown = min(6, len(spec.connections))
85
+ for conn in spec.connections[:shown]:
86
+ arrow = f" {conn.source} --> {conn.target}"
87
+ if conn.label:
88
+ max_label = inner - len(arrow) - 5
89
+ lbl = conn.label if len(conn.label) <= max_label else conn.label[: max_label - 2] + ".."
90
+ arrow += f" ({lbl})"
91
+ if len(arrow) > inner:
92
+ arrow = arrow[: inner - 3] + "..."
93
+ lines.append(_pad(arrow, inner))
94
+ if len(spec.connections) > shown:
95
+ lines.append(_pad(f" ... +{len(spec.connections) - shown} more", inner))
96
+
97
+ lines.append(_pad("", inner))
98
+ lines.append("+" + "=" * (_WIDTH - 2) + "+")
99
+
100
+ return "\n".join(lines)
101
+
102
+
103
+ def _pad(text: str, inner: int) -> str:
104
+ """Wrap text in outer box borders, padded to fixed width."""
105
+ if len(text) > inner:
106
+ text = text[:inner]
107
+ return "| " + text + " " * (inner - len(text)) + " |"
@@ -24,3 +24,7 @@ class BaseLLM(ABC):
24
24
  @abstractmethod
25
25
  def generate_stream(self, messages: list[dict], system: str, max_tokens: int = 2000) -> Iterator[str]:
26
26
  """Stream generation using the capable model. Yields text chunks."""
27
+
28
+ def estimate_tokens(self, text: str) -> int:
29
+ """Rough token count estimate (~4 chars per token for English)."""
30
+ return len(text) // 4
@@ -28,9 +28,10 @@ dependencies = [
28
28
  ]
29
29
 
30
30
  [project.optional-dependencies]
31
- cli = ["cloudwright-ai-cli==0.3.0"]
32
- web = ["cloudwright-ai-cli==0.3.0", "cloudwright-ai-web==0.3.0"]
33
- all = ["cloudwright-ai-cli==0.3.0", "cloudwright-ai-web==0.3.0", "databricks-sdk>=0.38.0"]
31
+ cli = ["cloudwright-ai-cli==0.3.1"]
32
+ web = ["cloudwright-ai-cli==0.3.1", "cloudwright-ai-web==0.3.1"]
33
+ mcp = ["cloudwright-ai-mcp==0.3.1"]
34
+ all = ["cloudwright-ai-cli==0.3.1", "cloudwright-ai-web==0.3.1", "cloudwright-ai-mcp==0.3.1", "databricks-sdk>=0.38.0"]
34
35
  pdf = ["weasyprint", "markdown2"]
35
36
  databricks = ["databricks-sdk>=0.38.0"]
36
37
 
File without changes