cloudwright-ai-cli 1.6.1__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.
- {cloudwright_ai_cli-1.6.1 → cloudwright_ai_cli-1.7.0}/PKG-INFO +1 -1
- cloudwright_ai_cli-1.7.0/cloudwright_cli/__init__.py +1 -0
- {cloudwright_ai_cli-1.6.1 → cloudwright_ai_cli-1.7.0}/cloudwright_cli/commands/compare.py +14 -0
- {cloudwright_ai_cli-1.6.1 → cloudwright_ai_cli-1.7.0}/cloudwright_cli/commands/cost.py +13 -1
- cloudwright_ai_cli-1.7.0/cloudwright_cli/commands/integrate_cmd.py +618 -0
- {cloudwright_ai_cli-1.6.1 → cloudwright_ai_cli-1.7.0}/cloudwright_cli/decorators.py +16 -16
- {cloudwright_ai_cli-1.6.1 → cloudwright_ai_cli-1.7.0}/cloudwright_cli/main.py +28 -25
- {cloudwright_ai_cli-1.6.1 → cloudwright_ai_cli-1.7.0}/cloudwright_cli/output.py +25 -1
- {cloudwright_ai_cli-1.6.1 → cloudwright_ai_cli-1.7.0}/tests/test_cli.py +51 -0
- cloudwright_ai_cli-1.7.0/tests/test_integrate.py +273 -0
- cloudwright_ai_cli-1.6.1/cloudwright_cli/__init__.py +0 -1
- {cloudwright_ai_cli-1.6.1 → cloudwright_ai_cli-1.7.0}/.gitignore +0 -0
- {cloudwright_ai_cli-1.6.1 → cloudwright_ai_cli-1.7.0}/README.md +0 -0
- {cloudwright_ai_cli-1.6.1 → cloudwright_ai_cli-1.7.0}/cloudwright_cli/__main__.py +0 -0
- {cloudwright_ai_cli-1.6.1 → cloudwright_ai_cli-1.7.0}/cloudwright_cli/commands/__init__.py +0 -0
- {cloudwright_ai_cli-1.6.1 → cloudwright_ai_cli-1.7.0}/cloudwright_cli/commands/adr.py +0 -0
- {cloudwright_ai_cli-1.6.1 → cloudwright_ai_cli-1.7.0}/cloudwright_cli/commands/analyze_cmd.py +0 -0
- {cloudwright_ai_cli-1.6.1 → cloudwright_ai_cli-1.7.0}/cloudwright_cli/commands/catalog_cmd.py +0 -0
- {cloudwright_ai_cli-1.6.1 → cloudwright_ai_cli-1.7.0}/cloudwright_cli/commands/chat.py +0 -0
- {cloudwright_ai_cli-1.6.1 → cloudwright_ai_cli-1.7.0}/cloudwright_cli/commands/chat_session.py +0 -0
- {cloudwright_ai_cli-1.6.1 → cloudwright_ai_cli-1.7.0}/cloudwright_cli/commands/chat_streaming.py +0 -0
- {cloudwright_ai_cli-1.6.1 → cloudwright_ai_cli-1.7.0}/cloudwright_cli/commands/chat_ui.py +0 -0
- {cloudwright_ai_cli-1.6.1 → cloudwright_ai_cli-1.7.0}/cloudwright_cli/commands/compliance_cmd.py +0 -0
- {cloudwright_ai_cli-1.6.1 → cloudwright_ai_cli-1.7.0}/cloudwright_cli/commands/databricks_cmd.py +0 -0
- {cloudwright_ai_cli-1.6.1 → cloudwright_ai_cli-1.7.0}/cloudwright_cli/commands/design.py +0 -0
- {cloudwright_ai_cli-1.6.1 → cloudwright_ai_cli-1.7.0}/cloudwright_cli/commands/diff.py +0 -0
- {cloudwright_ai_cli-1.6.1 → cloudwright_ai_cli-1.7.0}/cloudwright_cli/commands/drift_cmd.py +0 -0
- {cloudwright_ai_cli-1.6.1 → cloudwright_ai_cli-1.7.0}/cloudwright_cli/commands/export.py +0 -0
- {cloudwright_ai_cli-1.6.1 → cloudwright_ai_cli-1.7.0}/cloudwright_cli/commands/import_cmd.py +0 -0
- {cloudwright_ai_cli-1.6.1 → cloudwright_ai_cli-1.7.0}/cloudwright_cli/commands/import_live_cmd.py +0 -0
- {cloudwright_ai_cli-1.6.1 → cloudwright_ai_cli-1.7.0}/cloudwright_cli/commands/init_cmd.py +0 -0
- {cloudwright_ai_cli-1.6.1 → cloudwright_ai_cli-1.7.0}/cloudwright_cli/commands/lint_cmd.py +0 -0
- {cloudwright_ai_cli-1.6.1 → cloudwright_ai_cli-1.7.0}/cloudwright_cli/commands/mcp_cmd.py +0 -0
- {cloudwright_ai_cli-1.6.1 → cloudwright_ai_cli-1.7.0}/cloudwright_cli/commands/modify_cmd.py +0 -0
- {cloudwright_ai_cli-1.6.1 → cloudwright_ai_cli-1.7.0}/cloudwright_cli/commands/plan_cmd.py +0 -0
- {cloudwright_ai_cli-1.6.1 → cloudwright_ai_cli-1.7.0}/cloudwright_cli/commands/policy.py +0 -0
- {cloudwright_ai_cli-1.6.1 → cloudwright_ai_cli-1.7.0}/cloudwright_cli/commands/refresh_cmd.py +0 -0
- {cloudwright_ai_cli-1.6.1 → cloudwright_ai_cli-1.7.0}/cloudwright_cli/commands/review_cmd.py +0 -0
- {cloudwright_ai_cli-1.6.1 → cloudwright_ai_cli-1.7.0}/cloudwright_cli/commands/schema_cmd.py +0 -0
- {cloudwright_ai_cli-1.6.1 → cloudwright_ai_cli-1.7.0}/cloudwright_cli/commands/score_cmd.py +0 -0
- {cloudwright_ai_cli-1.6.1 → cloudwright_ai_cli-1.7.0}/cloudwright_cli/commands/security_cmd.py +0 -0
- {cloudwright_ai_cli-1.6.1 → cloudwright_ai_cli-1.7.0}/cloudwright_cli/commands/validate.py +0 -0
- {cloudwright_ai_cli-1.6.1 → cloudwright_ai_cli-1.7.0}/cloudwright_cli/completions.py +0 -0
- {cloudwright_ai_cli-1.6.1 → cloudwright_ai_cli-1.7.0}/cloudwright_cli/project.py +0 -0
- {cloudwright_ai_cli-1.6.1 → cloudwright_ai_cli-1.7.0}/cloudwright_cli/py.typed +0 -0
- {cloudwright_ai_cli-1.6.1 → cloudwright_ai_cli-1.7.0}/cloudwright_cli/utils.py +0 -0
- {cloudwright_ai_cli-1.6.1 → cloudwright_ai_cli-1.7.0}/pyproject.toml +0 -0
- {cloudwright_ai_cli-1.6.1 → cloudwright_ai_cli-1.7.0}/tests/__init__.py +0 -0
- {cloudwright_ai_cli-1.6.1 → cloudwright_ai_cli-1.7.0}/tests/test_chat_commands.py +0 -0
- {cloudwright_ai_cli-1.6.1 → cloudwright_ai_cli-1.7.0}/tests/test_chat_debug.py +0 -0
- {cloudwright_ai_cli-1.6.1 → cloudwright_ai_cli-1.7.0}/tests/test_chat_persistence.py +0 -0
- {cloudwright_ai_cli-1.6.1 → cloudwright_ai_cli-1.7.0}/tests/test_chat_streaming.py +0 -0
- {cloudwright_ai_cli-1.6.1 → cloudwright_ai_cli-1.7.0}/tests/test_drift_cmd.py +0 -0
- {cloudwright_ai_cli-1.6.1 → cloudwright_ai_cli-1.7.0}/tests/test_init.py +0 -0
- {cloudwright_ai_cli-1.6.1 → cloudwright_ai_cli-1.7.0}/tests/test_modify_cmd.py +0 -0
- {cloudwright_ai_cli-1.6.1 → 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.
|
|
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 =
|
|
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:
|