cloudwright-ai-cli 1.6.0__tar.gz → 1.7.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 (56) hide show
  1. {cloudwright_ai_cli-1.6.0 → cloudwright_ai_cli-1.7.0}/PKG-INFO +1 -1
  2. cloudwright_ai_cli-1.7.0/cloudwright_cli/__init__.py +1 -0
  3. {cloudwright_ai_cli-1.6.0 → cloudwright_ai_cli-1.7.0}/cloudwright_cli/commands/compare.py +14 -0
  4. {cloudwright_ai_cli-1.6.0 → cloudwright_ai_cli-1.7.0}/cloudwright_cli/commands/cost.py +13 -1
  5. cloudwright_ai_cli-1.7.0/cloudwright_cli/commands/integrate_cmd.py +618 -0
  6. {cloudwright_ai_cli-1.6.0 → cloudwright_ai_cli-1.7.0}/cloudwright_cli/decorators.py +16 -16
  7. {cloudwright_ai_cli-1.6.0 → cloudwright_ai_cli-1.7.0}/cloudwright_cli/main.py +28 -25
  8. {cloudwright_ai_cli-1.6.0 → cloudwright_ai_cli-1.7.0}/cloudwright_cli/output.py +25 -1
  9. {cloudwright_ai_cli-1.6.0 → cloudwright_ai_cli-1.7.0}/tests/test_cli.py +51 -0
  10. cloudwright_ai_cli-1.7.0/tests/test_integrate.py +273 -0
  11. cloudwright_ai_cli-1.6.0/cloudwright_cli/__init__.py +0 -1
  12. {cloudwright_ai_cli-1.6.0 → cloudwright_ai_cli-1.7.0}/.gitignore +0 -0
  13. {cloudwright_ai_cli-1.6.0 → cloudwright_ai_cli-1.7.0}/README.md +0 -0
  14. {cloudwright_ai_cli-1.6.0 → cloudwright_ai_cli-1.7.0}/cloudwright_cli/__main__.py +0 -0
  15. {cloudwright_ai_cli-1.6.0 → cloudwright_ai_cli-1.7.0}/cloudwright_cli/commands/__init__.py +0 -0
  16. {cloudwright_ai_cli-1.6.0 → cloudwright_ai_cli-1.7.0}/cloudwright_cli/commands/adr.py +0 -0
  17. {cloudwright_ai_cli-1.6.0 → cloudwright_ai_cli-1.7.0}/cloudwright_cli/commands/analyze_cmd.py +0 -0
  18. {cloudwright_ai_cli-1.6.0 → cloudwright_ai_cli-1.7.0}/cloudwright_cli/commands/catalog_cmd.py +0 -0
  19. {cloudwright_ai_cli-1.6.0 → cloudwright_ai_cli-1.7.0}/cloudwright_cli/commands/chat.py +0 -0
  20. {cloudwright_ai_cli-1.6.0 → cloudwright_ai_cli-1.7.0}/cloudwright_cli/commands/chat_session.py +0 -0
  21. {cloudwright_ai_cli-1.6.0 → cloudwright_ai_cli-1.7.0}/cloudwright_cli/commands/chat_streaming.py +0 -0
  22. {cloudwright_ai_cli-1.6.0 → cloudwright_ai_cli-1.7.0}/cloudwright_cli/commands/chat_ui.py +0 -0
  23. {cloudwright_ai_cli-1.6.0 → cloudwright_ai_cli-1.7.0}/cloudwright_cli/commands/compliance_cmd.py +0 -0
  24. {cloudwright_ai_cli-1.6.0 → cloudwright_ai_cli-1.7.0}/cloudwright_cli/commands/databricks_cmd.py +0 -0
  25. {cloudwright_ai_cli-1.6.0 → cloudwright_ai_cli-1.7.0}/cloudwright_cli/commands/design.py +0 -0
  26. {cloudwright_ai_cli-1.6.0 → cloudwright_ai_cli-1.7.0}/cloudwright_cli/commands/diff.py +0 -0
  27. {cloudwright_ai_cli-1.6.0 → cloudwright_ai_cli-1.7.0}/cloudwright_cli/commands/drift_cmd.py +0 -0
  28. {cloudwright_ai_cli-1.6.0 → cloudwright_ai_cli-1.7.0}/cloudwright_cli/commands/export.py +0 -0
  29. {cloudwright_ai_cli-1.6.0 → cloudwright_ai_cli-1.7.0}/cloudwright_cli/commands/import_cmd.py +0 -0
  30. {cloudwright_ai_cli-1.6.0 → cloudwright_ai_cli-1.7.0}/cloudwright_cli/commands/import_live_cmd.py +0 -0
  31. {cloudwright_ai_cli-1.6.0 → cloudwright_ai_cli-1.7.0}/cloudwright_cli/commands/init_cmd.py +0 -0
  32. {cloudwright_ai_cli-1.6.0 → cloudwright_ai_cli-1.7.0}/cloudwright_cli/commands/lint_cmd.py +0 -0
  33. {cloudwright_ai_cli-1.6.0 → cloudwright_ai_cli-1.7.0}/cloudwright_cli/commands/mcp_cmd.py +0 -0
  34. {cloudwright_ai_cli-1.6.0 → cloudwright_ai_cli-1.7.0}/cloudwright_cli/commands/modify_cmd.py +0 -0
  35. {cloudwright_ai_cli-1.6.0 → cloudwright_ai_cli-1.7.0}/cloudwright_cli/commands/plan_cmd.py +0 -0
  36. {cloudwright_ai_cli-1.6.0 → cloudwright_ai_cli-1.7.0}/cloudwright_cli/commands/policy.py +0 -0
  37. {cloudwright_ai_cli-1.6.0 → cloudwright_ai_cli-1.7.0}/cloudwright_cli/commands/refresh_cmd.py +0 -0
  38. {cloudwright_ai_cli-1.6.0 → cloudwright_ai_cli-1.7.0}/cloudwright_cli/commands/review_cmd.py +0 -0
  39. {cloudwright_ai_cli-1.6.0 → cloudwright_ai_cli-1.7.0}/cloudwright_cli/commands/schema_cmd.py +0 -0
  40. {cloudwright_ai_cli-1.6.0 → cloudwright_ai_cli-1.7.0}/cloudwright_cli/commands/score_cmd.py +0 -0
  41. {cloudwright_ai_cli-1.6.0 → cloudwright_ai_cli-1.7.0}/cloudwright_cli/commands/security_cmd.py +0 -0
  42. {cloudwright_ai_cli-1.6.0 → cloudwright_ai_cli-1.7.0}/cloudwright_cli/commands/validate.py +0 -0
  43. {cloudwright_ai_cli-1.6.0 → cloudwright_ai_cli-1.7.0}/cloudwright_cli/completions.py +0 -0
  44. {cloudwright_ai_cli-1.6.0 → cloudwright_ai_cli-1.7.0}/cloudwright_cli/project.py +0 -0
  45. {cloudwright_ai_cli-1.6.0 → cloudwright_ai_cli-1.7.0}/cloudwright_cli/py.typed +0 -0
  46. {cloudwright_ai_cli-1.6.0 → cloudwright_ai_cli-1.7.0}/cloudwright_cli/utils.py +0 -0
  47. {cloudwright_ai_cli-1.6.0 → cloudwright_ai_cli-1.7.0}/pyproject.toml +0 -0
  48. {cloudwright_ai_cli-1.6.0 → cloudwright_ai_cli-1.7.0}/tests/__init__.py +0 -0
  49. {cloudwright_ai_cli-1.6.0 → cloudwright_ai_cli-1.7.0}/tests/test_chat_commands.py +0 -0
  50. {cloudwright_ai_cli-1.6.0 → cloudwright_ai_cli-1.7.0}/tests/test_chat_debug.py +0 -0
  51. {cloudwright_ai_cli-1.6.0 → cloudwright_ai_cli-1.7.0}/tests/test_chat_persistence.py +0 -0
  52. {cloudwright_ai_cli-1.6.0 → cloudwright_ai_cli-1.7.0}/tests/test_chat_streaming.py +0 -0
  53. {cloudwright_ai_cli-1.6.0 → cloudwright_ai_cli-1.7.0}/tests/test_drift_cmd.py +0 -0
  54. {cloudwright_ai_cli-1.6.0 → cloudwright_ai_cli-1.7.0}/tests/test_init.py +0 -0
  55. {cloudwright_ai_cli-1.6.0 → cloudwright_ai_cli-1.7.0}/tests/test_modify_cmd.py +0 -0
  56. {cloudwright_ai_cli-1.6.0 → cloudwright_ai_cli-1.7.0}/tests/test_project.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cloudwright-ai-cli
3
- Version: 1.6.0
3
+ Version: 1.7.0
4
4
  Summary: CLI for Cloudwright architecture intelligence
5
5
  Project-URL: Homepage, https://github.com/xmpuspus/cloudwright
6
6
  Project-URL: Repository, https://github.com/xmpuspus/cloudwright
@@ -0,0 +1 @@
1
+ __version__ = "1.7.0"
@@ -37,11 +37,15 @@ def compare(
37
37
 
38
38
  if is_json_mode(ctx):
39
39
  origin_total = spec.cost_estimate.monthly_total if spec.cost_estimate else 0.0
40
+ origin_confidence = spec.cost_estimate.pricing_confidence if spec.cost_estimate else "-"
41
+ origin_confidence_detail = spec.cost_estimate.pricing_confidence_detail if spec.cost_estimate else ""
40
42
  data = {
41
43
  "baseline": spec.provider,
42
44
  "providers": {
43
45
  spec.provider: {
44
46
  "monthly_total": origin_total,
47
+ "pricing_confidence": origin_confidence,
48
+ "pricing_confidence_detail": origin_confidence_detail,
45
49
  "components": [c.model_dump() for c in spec.components],
46
50
  }
47
51
  },
@@ -49,6 +53,8 @@ def compare(
49
53
  for alt in alts:
50
54
  data["providers"][alt.provider] = {
51
55
  "monthly_total": alt.monthly_total,
56
+ "pricing_confidence": alt.pricing_confidence,
57
+ "pricing_confidence_detail": alt.pricing_confidence_detail,
52
58
  "key_differences": alt.key_differences,
53
59
  "components": [c.model_dump() for c in alt.spec.components] if alt.spec else [],
54
60
  }
@@ -79,12 +85,15 @@ def compare(
79
85
  totals_table = Table(title="Monthly Cost Totals", show_header=True)
80
86
  totals_table.add_column("Provider")
81
87
  totals_table.add_column("Monthly Total", justify="right")
88
+ totals_table.add_column("Confidence", justify="center")
82
89
  totals_table.add_column("Key Differences", style="dim")
83
90
 
84
91
  origin_total = spec.cost_estimate.monthly_total if spec.cost_estimate else 0.0
92
+ origin_confidence = spec.cost_estimate.pricing_confidence if spec.cost_estimate else "-"
85
93
  totals_table.add_row(
86
94
  spec.provider.upper(),
87
95
  f"${origin_total:,.2f}" if origin_total else "-",
96
+ origin_confidence,
88
97
  "(baseline)",
89
98
  )
90
99
  for alt in alts:
@@ -92,7 +101,12 @@ def compare(
92
101
  totals_table.add_row(
93
102
  alt.provider.upper(),
94
103
  f"${alt.monthly_total:,.2f}" if alt.monthly_total else "-",
104
+ alt.pricing_confidence,
95
105
  diffs,
96
106
  )
97
107
 
98
108
  console.print(totals_table)
109
+ console.print(
110
+ "[dim]Non-AWS estimates typically rely on formula/fallback pricing rather than "
111
+ "real catalog data. Check the Confidence column before treating totals as comparable.[/dim]"
112
+ )
@@ -115,10 +115,11 @@ def _print_single_cost_table(spec: ArchSpec) -> None:
115
115
  table.add_column("Notes", style="dim")
116
116
 
117
117
  comp_map = {c.id: c for c in spec.components}
118
+ conf_styles = {"high": "green", "medium": "yellow"}
118
119
  for item in est.breakdown:
119
120
  comp = comp_map.get(item.component_id)
120
121
  svc_label = comp.service if comp else item.service
121
- conf_style = "green" if item.confidence == "high" else "yellow"
122
+ conf_style = conf_styles.get(item.confidence, "red")
122
123
  table.add_row(
123
124
  item.component_id,
124
125
  svc_label,
@@ -129,6 +130,9 @@ def _print_single_cost_table(spec: ArchSpec) -> None:
129
130
 
130
131
  console.print(table)
131
132
 
133
+ prices_as_of = est.prices_as_of or est.as_of
134
+ console.print(f"[dim]Prices as of {prices_as_of}. {est.pricing_confidence_detail}.[/dim]")
135
+
132
136
  if est.pricing_confidence != "high":
133
137
  console.print(
134
138
  "[yellow]Pricing confidence: low[/yellow] — one or more services used formula/fallback "
@@ -170,16 +174,24 @@ def _print_multi_cloud_table(spec: ArchSpec, providers: list[str]) -> None:
170
174
 
171
175
  # Totals row
172
176
  totals = []
177
+ confidences = []
173
178
  for p in all_providers:
174
179
  s = alternatives_map.get(p)
175
180
  if s and s.cost_estimate:
176
181
  totals.append(f"${s.cost_estimate.monthly_total:,.2f}")
182
+ confidences.append(s.cost_estimate.pricing_confidence)
177
183
  else:
178
184
  totals.append("-")
185
+ confidences.append("-")
179
186
  table.add_section()
180
187
  table.add_row("[bold]TOTAL[/bold]", *totals)
188
+ table.add_row("[dim]Confidence[/dim]", *[f"[dim]{c}[/dim]" for c in confidences])
181
189
 
182
190
  console.print(table)
191
+ console.print(
192
+ "[dim]Non-AWS totals lean heavily on formula/fallback pricing, not catalog data. "
193
+ "See the Confidence row above.[/dim]"
194
+ )
183
195
 
184
196
 
185
197
  def _print_carbon_table(spec: ArchSpec, carbon: dict) -> None: