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.
Files changed (36) hide show
  1. {cloudwright_ai_cli-0.2.12 → cloudwright_ai_cli-0.2.13}/PKG-INFO +1 -1
  2. cloudwright_ai_cli-0.2.13/cloudwright_cli/__init__.py +1 -0
  3. {cloudwright_ai_cli-0.2.12 → cloudwright_ai_cli-0.2.13}/cloudwright_cli/commands/chat.py +23 -20
  4. cloudwright_ai_cli-0.2.12/cloudwright_cli/__init__.py +0 -1
  5. {cloudwright_ai_cli-0.2.12 → cloudwright_ai_cli-0.2.13}/.gitignore +0 -0
  6. {cloudwright_ai_cli-0.2.12 → cloudwright_ai_cli-0.2.13}/CLAUDE.md +0 -0
  7. {cloudwright_ai_cli-0.2.12 → cloudwright_ai_cli-0.2.13}/README.md +0 -0
  8. {cloudwright_ai_cli-0.2.12 → cloudwright_ai_cli-0.2.13}/cloudwright_cli/__main__.py +0 -0
  9. {cloudwright_ai_cli-0.2.12 → cloudwright_ai_cli-0.2.13}/cloudwright_cli/commands/__init__.py +0 -0
  10. {cloudwright_ai_cli-0.2.12 → cloudwright_ai_cli-0.2.13}/cloudwright_cli/commands/analyze_cmd.py +0 -0
  11. {cloudwright_ai_cli-0.2.12 → cloudwright_ai_cli-0.2.13}/cloudwright_cli/commands/catalog_cmd.py +0 -0
  12. {cloudwright_ai_cli-0.2.12 → cloudwright_ai_cli-0.2.13}/cloudwright_cli/commands/compare.py +0 -0
  13. {cloudwright_ai_cli-0.2.12 → cloudwright_ai_cli-0.2.13}/cloudwright_cli/commands/cost.py +0 -0
  14. {cloudwright_ai_cli-0.2.12 → cloudwright_ai_cli-0.2.13}/cloudwright_cli/commands/design.py +0 -0
  15. {cloudwright_ai_cli-0.2.12 → cloudwright_ai_cli-0.2.13}/cloudwright_cli/commands/diff.py +0 -0
  16. {cloudwright_ai_cli-0.2.12 → cloudwright_ai_cli-0.2.13}/cloudwright_cli/commands/drift_cmd.py +0 -0
  17. {cloudwright_ai_cli-0.2.12 → cloudwright_ai_cli-0.2.13}/cloudwright_cli/commands/export.py +0 -0
  18. {cloudwright_ai_cli-0.2.12 → cloudwright_ai_cli-0.2.13}/cloudwright_cli/commands/import_cmd.py +0 -0
  19. {cloudwright_ai_cli-0.2.12 → cloudwright_ai_cli-0.2.13}/cloudwright_cli/commands/init_cmd.py +0 -0
  20. {cloudwright_ai_cli-0.2.12 → cloudwright_ai_cli-0.2.13}/cloudwright_cli/commands/lint_cmd.py +0 -0
  21. {cloudwright_ai_cli-0.2.12 → cloudwright_ai_cli-0.2.13}/cloudwright_cli/commands/modify_cmd.py +0 -0
  22. {cloudwright_ai_cli-0.2.12 → cloudwright_ai_cli-0.2.13}/cloudwright_cli/commands/policy.py +0 -0
  23. {cloudwright_ai_cli-0.2.12 → cloudwright_ai_cli-0.2.13}/cloudwright_cli/commands/refresh_cmd.py +0 -0
  24. {cloudwright_ai_cli-0.2.12 → cloudwright_ai_cli-0.2.13}/cloudwright_cli/commands/score_cmd.py +0 -0
  25. {cloudwright_ai_cli-0.2.12 → cloudwright_ai_cli-0.2.13}/cloudwright_cli/commands/validate.py +0 -0
  26. {cloudwright_ai_cli-0.2.12 → cloudwright_ai_cli-0.2.13}/cloudwright_cli/main.py +0 -0
  27. {cloudwright_ai_cli-0.2.12 → cloudwright_ai_cli-0.2.13}/cloudwright_cli/project.py +0 -0
  28. {cloudwright_ai_cli-0.2.12 → cloudwright_ai_cli-0.2.13}/cloudwright_cli/py.typed +0 -0
  29. {cloudwright_ai_cli-0.2.12 → cloudwright_ai_cli-0.2.13}/cloudwright_cli/utils.py +0 -0
  30. {cloudwright_ai_cli-0.2.12 → cloudwright_ai_cli-0.2.13}/pyproject.toml +0 -0
  31. {cloudwright_ai_cli-0.2.12 → cloudwright_ai_cli-0.2.13}/tests/__init__.py +0 -0
  32. {cloudwright_ai_cli-0.2.12 → cloudwright_ai_cli-0.2.13}/tests/test_cli.py +0 -0
  33. {cloudwright_ai_cli-0.2.12 → cloudwright_ai_cli-0.2.13}/tests/test_drift_cmd.py +0 -0
  34. {cloudwright_ai_cli-0.2.12 → cloudwright_ai_cli-0.2.13}/tests/test_init.py +0 -0
  35. {cloudwright_ai_cli-0.2.12 → cloudwright_ai_cli-0.2.13}/tests/test_modify_cmd.py +0 -0
  36. {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.12
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 and _looks_like_modification(text):
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"Designed: {spec.name}"})
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"