cloudwright-ai-cli 0.2.12__tar.gz → 0.2.13__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-0.2.12 → cloudwright_ai_cli-0.2.13}/PKG-INFO +1 -1
- cloudwright_ai_cli-0.2.13/cloudwright_cli/__init__.py +1 -0
- {cloudwright_ai_cli-0.2.12 → cloudwright_ai_cli-0.2.13}/cloudwright_cli/commands/chat.py +23 -20
- cloudwright_ai_cli-0.2.12/cloudwright_cli/__init__.py +0 -1
- {cloudwright_ai_cli-0.2.12 → cloudwright_ai_cli-0.2.13}/.gitignore +0 -0
- {cloudwright_ai_cli-0.2.12 → cloudwright_ai_cli-0.2.13}/CLAUDE.md +0 -0
- {cloudwright_ai_cli-0.2.12 → cloudwright_ai_cli-0.2.13}/README.md +0 -0
- {cloudwright_ai_cli-0.2.12 → cloudwright_ai_cli-0.2.13}/cloudwright_cli/__main__.py +0 -0
- {cloudwright_ai_cli-0.2.12 → cloudwright_ai_cli-0.2.13}/cloudwright_cli/commands/__init__.py +0 -0
- {cloudwright_ai_cli-0.2.12 → cloudwright_ai_cli-0.2.13}/cloudwright_cli/commands/analyze_cmd.py +0 -0
- {cloudwright_ai_cli-0.2.12 → cloudwright_ai_cli-0.2.13}/cloudwright_cli/commands/catalog_cmd.py +0 -0
- {cloudwright_ai_cli-0.2.12 → cloudwright_ai_cli-0.2.13}/cloudwright_cli/commands/compare.py +0 -0
- {cloudwright_ai_cli-0.2.12 → cloudwright_ai_cli-0.2.13}/cloudwright_cli/commands/cost.py +0 -0
- {cloudwright_ai_cli-0.2.12 → cloudwright_ai_cli-0.2.13}/cloudwright_cli/commands/design.py +0 -0
- {cloudwright_ai_cli-0.2.12 → cloudwright_ai_cli-0.2.13}/cloudwright_cli/commands/diff.py +0 -0
- {cloudwright_ai_cli-0.2.12 → cloudwright_ai_cli-0.2.13}/cloudwright_cli/commands/drift_cmd.py +0 -0
- {cloudwright_ai_cli-0.2.12 → cloudwright_ai_cli-0.2.13}/cloudwright_cli/commands/export.py +0 -0
- {cloudwright_ai_cli-0.2.12 → cloudwright_ai_cli-0.2.13}/cloudwright_cli/commands/import_cmd.py +0 -0
- {cloudwright_ai_cli-0.2.12 → cloudwright_ai_cli-0.2.13}/cloudwright_cli/commands/init_cmd.py +0 -0
- {cloudwright_ai_cli-0.2.12 → cloudwright_ai_cli-0.2.13}/cloudwright_cli/commands/lint_cmd.py +0 -0
- {cloudwright_ai_cli-0.2.12 → cloudwright_ai_cli-0.2.13}/cloudwright_cli/commands/modify_cmd.py +0 -0
- {cloudwright_ai_cli-0.2.12 → cloudwright_ai_cli-0.2.13}/cloudwright_cli/commands/policy.py +0 -0
- {cloudwright_ai_cli-0.2.12 → cloudwright_ai_cli-0.2.13}/cloudwright_cli/commands/refresh_cmd.py +0 -0
- {cloudwright_ai_cli-0.2.12 → cloudwright_ai_cli-0.2.13}/cloudwright_cli/commands/score_cmd.py +0 -0
- {cloudwright_ai_cli-0.2.12 → cloudwright_ai_cli-0.2.13}/cloudwright_cli/commands/validate.py +0 -0
- {cloudwright_ai_cli-0.2.12 → cloudwright_ai_cli-0.2.13}/cloudwright_cli/main.py +0 -0
- {cloudwright_ai_cli-0.2.12 → cloudwright_ai_cli-0.2.13}/cloudwright_cli/project.py +0 -0
- {cloudwright_ai_cli-0.2.12 → cloudwright_ai_cli-0.2.13}/cloudwright_cli/py.typed +0 -0
- {cloudwright_ai_cli-0.2.12 → cloudwright_ai_cli-0.2.13}/cloudwright_cli/utils.py +0 -0
- {cloudwright_ai_cli-0.2.12 → cloudwright_ai_cli-0.2.13}/pyproject.toml +0 -0
- {cloudwright_ai_cli-0.2.12 → cloudwright_ai_cli-0.2.13}/tests/__init__.py +0 -0
- {cloudwright_ai_cli-0.2.12 → cloudwright_ai_cli-0.2.13}/tests/test_cli.py +0 -0
- {cloudwright_ai_cli-0.2.12 → cloudwright_ai_cli-0.2.13}/tests/test_drift_cmd.py +0 -0
- {cloudwright_ai_cli-0.2.12 → cloudwright_ai_cli-0.2.13}/tests/test_init.py +0 -0
- {cloudwright_ai_cli-0.2.12 → cloudwright_ai_cli-0.2.13}/tests/test_modify_cmd.py +0 -0
- {cloudwright_ai_cli-0.2.12 → cloudwright_ai_cli-0.2.13}/tests/test_project.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: cloudwright-ai-cli
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.13
|
|
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__ = "0.2.13"
|
|
@@ -22,7 +22,10 @@ Commands:
|
|
|
22
22
|
/validate [fw] Run compliance check (hipaa, pci-dss, soc2, fedramp, gdpr)
|
|
23
23
|
/export <fmt> Export last architecture (terraform, mermaid, d2, cloudformation, sbom, aibom)
|
|
24
24
|
/terraform Export last architecture as Terraform
|
|
25
|
+
/new Start a new architecture from scratch
|
|
25
26
|
/quit Exit
|
|
27
|
+
|
|
28
|
+
Follow-up messages modify the current architecture. Use /new to start over.
|
|
26
29
|
"""
|
|
27
30
|
|
|
28
31
|
|
|
@@ -99,6 +102,12 @@ def _run_terminal_chat() -> None:
|
|
|
99
102
|
console.print("[dim]Goodbye.[/dim]")
|
|
100
103
|
break
|
|
101
104
|
|
|
105
|
+
if text.lower() == "/new":
|
|
106
|
+
last_spec = None
|
|
107
|
+
history.clear()
|
|
108
|
+
console.print("[cyan]Starting fresh. Describe a new architecture.[/cyan]")
|
|
109
|
+
continue
|
|
110
|
+
|
|
102
111
|
if text.startswith("/save "):
|
|
103
112
|
path = text[6:].strip()
|
|
104
113
|
if not last_spec:
|
|
@@ -170,12 +179,12 @@ def _run_terminal_chat() -> None:
|
|
|
170
179
|
console.print(f"[red]Error:[/red] {e}")
|
|
171
180
|
continue
|
|
172
181
|
|
|
173
|
-
# Treat as architecture request
|
|
182
|
+
# Treat as architecture request — modify existing or design new
|
|
174
183
|
history.append({"role": "user", "content": text})
|
|
175
184
|
|
|
176
185
|
with console.status("Thinking..."):
|
|
177
186
|
try:
|
|
178
|
-
if last_spec
|
|
187
|
+
if last_spec is not None:
|
|
179
188
|
spec = architect.modify(last_spec, text)
|
|
180
189
|
else:
|
|
181
190
|
spec = architect.design(text)
|
|
@@ -184,8 +193,19 @@ def _run_terminal_chat() -> None:
|
|
|
184
193
|
history.pop()
|
|
185
194
|
continue
|
|
186
195
|
|
|
196
|
+
# Auto-reprice after each design/modify
|
|
197
|
+
if not spec.cost_estimate:
|
|
198
|
+
try:
|
|
199
|
+
from cloudwright.cost import CostEngine
|
|
200
|
+
|
|
201
|
+
estimate = CostEngine().estimate(spec)
|
|
202
|
+
spec = spec.model_copy(update={"cost_estimate": estimate})
|
|
203
|
+
except Exception:
|
|
204
|
+
pass # cost is best-effort
|
|
205
|
+
|
|
206
|
+
verb = "Modified" if last_spec is not None else "Designed"
|
|
187
207
|
last_spec = spec
|
|
188
|
-
history.append({"role": "assistant", "content": f"
|
|
208
|
+
history.append({"role": "assistant", "content": f"{verb}: {spec.name}"})
|
|
189
209
|
|
|
190
210
|
console.print(Rule(f"[bold cyan]{spec.name}[/bold cyan]"))
|
|
191
211
|
console.print(render_ascii(spec))
|
|
@@ -227,23 +247,6 @@ def _run_validate(spec: ArchSpec, framework: str | None) -> None:
|
|
|
227
247
|
console.print(f" [dim]{check.recommendation}[/dim]")
|
|
228
248
|
|
|
229
249
|
|
|
230
|
-
def _looks_like_modification(text: str) -> bool:
|
|
231
|
-
mod_verbs = (
|
|
232
|
-
"add",
|
|
233
|
-
"remove",
|
|
234
|
-
"change",
|
|
235
|
-
"update",
|
|
236
|
-
"replace",
|
|
237
|
-
"increase",
|
|
238
|
-
"decrease",
|
|
239
|
-
"modify",
|
|
240
|
-
"swap",
|
|
241
|
-
"upgrade",
|
|
242
|
-
"downgrade",
|
|
243
|
-
)
|
|
244
|
-
lower = text.lower()
|
|
245
|
-
return any(lower.startswith(v) or f" {v} " in lower for v in mod_verbs)
|
|
246
|
-
|
|
247
250
|
|
|
248
251
|
def _print_cost_summary(spec: ArchSpec) -> None:
|
|
249
252
|
from rich.table import Table
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__version__ = "0.2.12"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{cloudwright_ai_cli-0.2.12 → cloudwright_ai_cli-0.2.13}/cloudwright_cli/commands/__init__.py
RENAMED
|
File without changes
|
{cloudwright_ai_cli-0.2.12 → cloudwright_ai_cli-0.2.13}/cloudwright_cli/commands/analyze_cmd.py
RENAMED
|
File without changes
|
{cloudwright_ai_cli-0.2.12 → cloudwright_ai_cli-0.2.13}/cloudwright_cli/commands/catalog_cmd.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{cloudwright_ai_cli-0.2.12 → cloudwright_ai_cli-0.2.13}/cloudwright_cli/commands/drift_cmd.py
RENAMED
|
File without changes
|
|
File without changes
|
{cloudwright_ai_cli-0.2.12 → cloudwright_ai_cli-0.2.13}/cloudwright_cli/commands/import_cmd.py
RENAMED
|
File without changes
|
{cloudwright_ai_cli-0.2.12 → cloudwright_ai_cli-0.2.13}/cloudwright_cli/commands/init_cmd.py
RENAMED
|
File without changes
|
{cloudwright_ai_cli-0.2.12 → cloudwright_ai_cli-0.2.13}/cloudwright_cli/commands/lint_cmd.py
RENAMED
|
File without changes
|
{cloudwright_ai_cli-0.2.12 → cloudwright_ai_cli-0.2.13}/cloudwright_cli/commands/modify_cmd.py
RENAMED
|
File without changes
|
|
File without changes
|
{cloudwright_ai_cli-0.2.12 → cloudwright_ai_cli-0.2.13}/cloudwright_cli/commands/refresh_cmd.py
RENAMED
|
File without changes
|
{cloudwright_ai_cli-0.2.12 → cloudwright_ai_cli-0.2.13}/cloudwright_cli/commands/score_cmd.py
RENAMED
|
File without changes
|
{cloudwright_ai_cli-0.2.12 → cloudwright_ai_cli-0.2.13}/cloudwright_cli/commands/validate.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|