sky-dev 0.0.6__tar.gz → 0.0.7__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 (49) hide show
  1. {sky_dev-0.0.6 → sky_dev-0.0.7}/CHANGELOG.md +17 -9
  2. {sky_dev-0.0.6 → sky_dev-0.0.7}/PKG-INFO +4 -7
  3. {sky_dev-0.0.6 → sky_dev-0.0.7}/README.md +3 -6
  4. {sky_dev-0.0.6 → sky_dev-0.0.7}/pyproject.toml +1 -1
  5. {sky_dev-0.0.6 → sky_dev-0.0.7}/sky/__init__.py +1 -1
  6. {sky_dev-0.0.6 → sky_dev-0.0.7}/sky/cli.py +46 -16
  7. {sky_dev-0.0.6 → sky_dev-0.0.7}/sky/core/chat.py +5 -0
  8. {sky_dev-0.0.6 → sky_dev-0.0.7}/sky/core/fast_loop.py +6 -6
  9. {sky_dev-0.0.6 → sky_dev-0.0.7}/sky_dev.egg-info/PKG-INFO +4 -7
  10. {sky_dev-0.0.6 → sky_dev-0.0.7}/.env.example +0 -0
  11. {sky_dev-0.0.6 → sky_dev-0.0.7}/CONTRIBUTING.md +0 -0
  12. {sky_dev-0.0.6 → sky_dev-0.0.7}/LICENSE +0 -0
  13. {sky_dev-0.0.6 → sky_dev-0.0.7}/MANIFEST.in +0 -0
  14. {sky_dev-0.0.6 → sky_dev-0.0.7}/SECURITY.md +0 -0
  15. {sky_dev-0.0.6 → sky_dev-0.0.7}/setup.cfg +0 -0
  16. {sky_dev-0.0.6 → sky_dev-0.0.7}/sky/config/__init__.py +0 -0
  17. {sky_dev-0.0.6 → sky_dev-0.0.7}/sky/config/models.yaml +0 -0
  18. {sky_dev-0.0.6 → sky_dev-0.0.7}/sky/config/schema.py +0 -0
  19. {sky_dev-0.0.6 → sky_dev-0.0.7}/sky/core/__init__.py +0 -0
  20. {sky_dev-0.0.6 → sky_dev-0.0.7}/sky/core/approval.py +0 -0
  21. {sky_dev-0.0.6 → sky_dev-0.0.7}/sky/core/benchmark.py +0 -0
  22. {sky_dev-0.0.6 → sky_dev-0.0.7}/sky/core/mode_prompts.py +0 -0
  23. {sky_dev-0.0.6 → sky_dev-0.0.7}/sky/core/router.py +0 -0
  24. {sky_dev-0.0.6 → sky_dev-0.0.7}/sky/core/subagent.py +0 -0
  25. {sky_dev-0.0.6 → sky_dev-0.0.7}/sky/core/workflow.py +0 -0
  26. {sky_dev-0.0.6 → sky_dev-0.0.7}/sky/errors.py +0 -0
  27. {sky_dev-0.0.6 → sky_dev-0.0.7}/sky/memory/__init__.py +0 -0
  28. {sky_dev-0.0.6 → sky_dev-0.0.7}/sky/memory/indexer.py +0 -0
  29. {sky_dev-0.0.6 → sky_dev-0.0.7}/sky/memory/vectorstore.py +0 -0
  30. {sky_dev-0.0.6 → sky_dev-0.0.7}/sky/security/__init__.py +0 -0
  31. {sky_dev-0.0.6 → sky_dev-0.0.7}/sky/security/audit.py +0 -0
  32. {sky_dev-0.0.6 → sky_dev-0.0.7}/sky/security/detection.py +0 -0
  33. {sky_dev-0.0.6 → sky_dev-0.0.7}/sky/security/guardrails.py +0 -0
  34. {sky_dev-0.0.6 → sky_dev-0.0.7}/sky/security/prompts.py +0 -0
  35. {sky_dev-0.0.6 → sky_dev-0.0.7}/sky/security/rate_limit.py +0 -0
  36. {sky_dev-0.0.6 → sky_dev-0.0.7}/sky/security/sanitize.py +0 -0
  37. {sky_dev-0.0.6 → sky_dev-0.0.7}/sky/storage/__init__.py +0 -0
  38. {sky_dev-0.0.6 → sky_dev-0.0.7}/sky/storage/db.py +0 -0
  39. {sky_dev-0.0.6 → sky_dev-0.0.7}/sky/tools/__init__.py +0 -0
  40. {sky_dev-0.0.6 → sky_dev-0.0.7}/sky/tools/fs_tools.py +0 -0
  41. {sky_dev-0.0.6 → sky_dev-0.0.7}/sky/tools/git_tools.py +0 -0
  42. {sky_dev-0.0.6 → sky_dev-0.0.7}/sky/tools/registry.py +0 -0
  43. {sky_dev-0.0.6 → sky_dev-0.0.7}/sky/tools/search_tools.py +0 -0
  44. {sky_dev-0.0.6 → sky_dev-0.0.7}/sky/tools/shell_tools.py +0 -0
  45. {sky_dev-0.0.6 → sky_dev-0.0.7}/sky_dev.egg-info/SOURCES.txt +0 -0
  46. {sky_dev-0.0.6 → sky_dev-0.0.7}/sky_dev.egg-info/dependency_links.txt +0 -0
  47. {sky_dev-0.0.6 → sky_dev-0.0.7}/sky_dev.egg-info/entry_points.txt +0 -0
  48. {sky_dev-0.0.6 → sky_dev-0.0.7}/sky_dev.egg-info/requires.txt +0 -0
  49. {sky_dev-0.0.6 → sky_dev-0.0.7}/sky_dev.egg-info/top_level.txt +0 -0
@@ -2,17 +2,25 @@
2
2
 
3
3
  All notable changes to Sky will be documented in this file.
4
4
 
5
- ## [0.0.6] - 2026-08-28
6
-
7
- ### Added
8
- - Comprehensive test suite for core functionality.
9
- - Automated test environment setup script (`setup_test_env.ps1`).
5
+ ## [0.0.7] - 2026-09-01
10
6
 
11
7
  ### Fixed
12
- - Fixed context length limits triggering 400 Invalid Request errors from the Groq API.
13
- - Re-implemented recursive truncation retry in model router for oversized context.
14
- - Fixed UnicodeEncodeError crashing CLI during pytest reporting on Windows.
15
- - Missing imports in semantic context search.
8
+ - `sky init` now creates .env file with API keys
9
+ - Missing `Tuple` import in fast_loop.py (NameError fixed)
10
+ - Infinite tool validation loop (circuit breaker added)
11
+ - `install.py` now properly suppresses pip output
12
+ - `sky ask` no longer crashes on fresh install
13
+ - Fixed context length limits triggering 400 Invalid Request errors from the Groq API
14
+ - Re-implemented recursive truncation retry in model router for oversized context
15
+ - Fixed UnicodeEncodeError crashing CLI during pytest reporting on Windows
16
+ - Missing imports in semantic context search
17
+
18
+ ### Added
19
+ - `sky clean` command to remove all config files
20
+ - `sky reset` alias for `sky clean`
21
+ - API key validation in `sky init`
22
+ - Comprehensive test suite for core functionality
23
+ - Automated test environment setup script (`setup_test_env.ps1`)
16
24
 
17
25
  ## [0.0.5] - 2026-08-27
18
26
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sky-dev
3
- Version: 0.0.6
3
+ Version: 0.0.7
4
4
  Summary: Sky - Agentic coding assistant. Build without boundaries.
5
5
  Author-email: Aaditya A <aaditya@corover.ai>
6
6
  License: MIT
@@ -60,20 +60,17 @@ Sky is a local, CLI-based, agentic software development assistant that helps you
60
60
 
61
61
  ## Installation
62
62
 
63
- Choose one of the following installation methods:
64
-
65
- ### Option 1: Quick Install (Standard)
63
+ ### Quick Install
66
64
  ```bash
67
65
  pip install sky-dev
68
66
  ```
69
67
 
70
- ### Option 2: Clean Install (Less Output)
68
+ ### Clean Install (Recommended)
71
69
  ```bash
72
70
  pip install sky-dev --quiet
73
71
  ```
74
72
 
75
- ### Option 3: Branded Install Script
76
- If you have downloaded the repository, you can run:
73
+ ### Branded Install
77
74
  ```bash
78
75
  python install.py
79
76
  ```
@@ -11,20 +11,17 @@ Sky is a local, CLI-based, agentic software development assistant that helps you
11
11
 
12
12
  ## Installation
13
13
 
14
- Choose one of the following installation methods:
15
-
16
- ### Option 1: Quick Install (Standard)
14
+ ### Quick Install
17
15
  ```bash
18
16
  pip install sky-dev
19
17
  ```
20
18
 
21
- ### Option 2: Clean Install (Less Output)
19
+ ### Clean Install (Recommended)
22
20
  ```bash
23
21
  pip install sky-dev --quiet
24
22
  ```
25
23
 
26
- ### Option 3: Branded Install Script
27
- If you have downloaded the repository, you can run:
24
+ ### Branded Install
28
25
  ```bash
29
26
  python install.py
30
27
  ```
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "sky-dev"
7
- version = "0.0.6"
7
+ version = "0.0.7"
8
8
  description = "Sky - Agentic coding assistant. Build without boundaries."
9
9
  readme = "README.md"
10
10
  license = {text = "MIT"}
@@ -1,6 +1,6 @@
1
1
  """Sky - Build without boundaries."""
2
2
 
3
- __version__ = "0.0.6"
3
+ __version__ = "0.0.7"
4
4
  __author__ = "Aaditya A"
5
5
  __author_email__ = "aaditya@corover.ai"
6
6
  __description__ = "Local, CLI-based, agentic software development assistant"
@@ -32,6 +32,15 @@ def version_callback(value: bool) -> None:
32
32
  console.print(f"SKY CLI Version: {__version__}")
33
33
  raise typer.Exit()
34
34
 
35
+ def _handle_error(e):
36
+ if "GROQ_API_KEY" in str(e):
37
+ return "🔑 Missing GROQ_API_KEY. Run 'sky init'."
38
+ if "NVIDIA_NIM_API_KEY" in str(e):
39
+ return "🔑 Missing NVIDIA_NIM_API_KEY. Run 'sky init'."
40
+ if "models.yaml" in str(e):
41
+ return "⚠️ Configuration error. Run 'sky init --force'."
42
+ return f"Error: {e}"
43
+
35
44
 
36
45
  @app.callback()
37
46
  def main(
@@ -655,20 +664,19 @@ def init(
655
664
  nim_key = typer.prompt("Enter your NVIDIA NIM API Key (or press Enter to skip)", default="", show_default=False)
656
665
  groq_key = typer.prompt("Enter your GROQ API Key (or press Enter to skip)", default="", show_default=False)
657
666
 
658
- env_content = ""
659
- env_path = Path(".env")
660
- if env_path.exists():
661
- env_content = env_path.read_text()
662
-
663
- if nim_key and "NIM_API_KEY" not in env_content:
664
- with open(env_path, "a") as f:
665
- f.write(f"\nNIM_API_KEY={nim_key}\n")
666
- console.print("[green]Added NIM_API_KEY to .env[/green]")
667
+ if groq_key and not groq_key.startswith("gsk_"):
668
+ console.print("[red]⚠️ Groq API key should start with 'gsk_'[/red]")
669
+ groq_key = Prompt.ask("Re-enter Groq API key")
667
670
 
668
- if groq_key and "GROQ_API_KEY" not in env_content:
669
- with open(env_path, "a") as f:
670
- f.write(f"\nGROQ_API_KEY={groq_key}\n")
671
- console.print("[green]Added GROQ_API_KEY to .env[/green]")
671
+ def _save_env(groq_key: str, nim_key: str):
672
+ with open(".env", "w") as f:
673
+ if groq_key:
674
+ f.write(f"GROQ_API_KEY={groq_key}\n")
675
+ if nim_key:
676
+ f.write(f"NVIDIA_NIM_API_KEY={nim_key}\n")
677
+ console.print("[green]✅ API keys saved to .env[/green]")
678
+
679
+ _save_env(groq_key, nim_key)
672
680
 
673
681
  # 2. Generate local models.yaml
674
682
  models_yaml_path = Path("models.yaml")
@@ -875,7 +883,8 @@ def check_providers():
875
883
  )
876
884
  else:
877
885
  try:
878
- nim_base = models_config.providers.get("nim").base_url if models_config.providers.get("nim") else "https://integrate.api.nvidia.com/v1"
886
+ nim_provider = models_config.providers.get("nim")
887
+ nim_base = nim_provider.base_url if (nim_provider and nim_provider.base_url) else "https://integrate.api.nvidia.com/v1"
879
888
  res = httpx.get(f"{nim_base.rstrip('/')}/models", headers={"Authorization": f"Bearer {nim_key}"})
880
889
  if res.status_code == 200:
881
890
  print_provider_info("nim", "✅ [green]Connected[/green]")
@@ -897,7 +906,8 @@ def check_providers():
897
906
  )
898
907
  else:
899
908
  try:
900
- groq_base = models_config.providers.get("groq").base_url if models_config.providers.get("groq") else "https://api.groq.com/openai/v1"
909
+ groq_provider = models_config.providers.get("groq")
910
+ groq_base = groq_provider.base_url if (groq_provider and groq_provider.base_url) else "https://api.groq.com/openai/v1"
901
911
  res = httpx.get(f"{groq_base.rstrip('/')}/models", headers={"Authorization": f"Bearer {groq_key}"})
902
912
  if res.status_code == 200:
903
913
  print_provider_info("groq", "✅ [green]Connected[/green]")
@@ -919,5 +929,25 @@ def check_providers():
919
929
  import sys
920
930
  sys.exit(1)
921
931
 
932
+ @app.command("clean")
933
+ def clean():
934
+ """Remove all Sky configuration files."""
935
+ from rich.prompt import Confirm
936
+ import shutil
937
+ if Confirm.ask("Delete all Sky configuration files (.env, models.yaml, .sky/)?", default=False):
938
+ for f in [".env", "models.yaml", ".sky/"]:
939
+ if Path(f).exists():
940
+ shutil.rmtree(f) if Path(f).is_dir() else Path(f).unlink()
941
+ console.print("[green]✅ Sky configuration cleaned.[/green]")
942
+
943
+ @app.command("reset")
944
+ def reset():
945
+ """Reset Sky configuration (same as sky clean)."""
946
+ clean()
947
+
922
948
  if __name__ == "__main__":
923
- app()
949
+ try:
950
+ app()
951
+ except Exception as e:
952
+ console.print(f"[bold red]{_handle_error(e)}[/bold red]")
953
+ sys.exit(1)
@@ -66,6 +66,11 @@ class ChatEngine:
66
66
 
67
67
  def run(self, initial_prompt: Optional[str] = None):
68
68
  """Run the chat loop."""
69
+ import os
70
+ if not os.getenv("GROQ_API_KEY") and not os.getenv("NVIDIA_NIM_API_KEY"):
71
+ self.console.print("[yellow]⚠️ No API keys found. Run 'sky init' first.[/yellow]")
72
+ return
73
+
69
74
  self.console.print(Panel(
70
75
  Markdown(self.get_welcome_message()),
71
76
  title="☁️ Sky Chat",
@@ -2,7 +2,7 @@
2
2
 
3
3
  import asyncio
4
4
  import json
5
- from typing import Any, AsyncIterator, Dict, List, Optional
5
+ from typing import Any, AsyncIterator, Dict, List, Optional, Tuple
6
6
 
7
7
  from sky.config import DexProjectConfig
8
8
  from sky.core.approval import ApprovalGate
@@ -121,7 +121,7 @@ class FastLoopEngine:
121
121
  "content": result_str,
122
122
  }
123
123
 
124
- def _validate_tool_calls(self, tool_calls: List[Dict[str, Any]]) -> Tuple[List[Dict[str, Any]], List[Dict[str, Any]]]:
124
+ def _validate_tool_calls(self, tool_calls: List[Dict[str, Any]]) -> tuple[List[Dict[str, Any]], List[Dict[str, Any]]]:
125
125
  """Validate that tool calls are well-formed JSON. Returns (valid_calls, error_results)."""
126
126
  valid_calls = []
127
127
  error_results = []
@@ -215,7 +215,7 @@ class FastLoopEngine:
215
215
  if not context:
216
216
  return ""
217
217
 
218
- return context
218
+ return str(context)
219
219
  MAX_MESSAGES = 10
220
220
  MAX_MESSAGE_LENGTH = 2000
221
221
 
@@ -313,9 +313,9 @@ class FastLoopEngine:
313
313
 
314
314
  if "tool call validation failed" in error_str or "invalid_request_error" in error_str or "400" in error_str:
315
315
  consecutive_tool_failures += 1
316
- if consecutive_tool_failures > 2:
317
- yield {"type": "error", "content": "Model failed to format tool calls correctly multiple times. Aborting."}
318
- break
316
+ if consecutive_tool_failures >= 2:
317
+ yield {"type": "error", "error": "Model stuck in tool validation loop. Aborting.", "suggestion": "Try rephrasing your request."}
318
+ return
319
319
 
320
320
  from rich.console import Console
321
321
  Console().print(f"[yellow]Model tool validation failed: {error_str}. Feeding error back to model...[/yellow]")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sky-dev
3
- Version: 0.0.6
3
+ Version: 0.0.7
4
4
  Summary: Sky - Agentic coding assistant. Build without boundaries.
5
5
  Author-email: Aaditya A <aaditya@corover.ai>
6
6
  License: MIT
@@ -60,20 +60,17 @@ Sky is a local, CLI-based, agentic software development assistant that helps you
60
60
 
61
61
  ## Installation
62
62
 
63
- Choose one of the following installation methods:
64
-
65
- ### Option 1: Quick Install (Standard)
63
+ ### Quick Install
66
64
  ```bash
67
65
  pip install sky-dev
68
66
  ```
69
67
 
70
- ### Option 2: Clean Install (Less Output)
68
+ ### Clean Install (Recommended)
71
69
  ```bash
72
70
  pip install sky-dev --quiet
73
71
  ```
74
72
 
75
- ### Option 3: Branded Install Script
76
- If you have downloaded the repository, you can run:
73
+ ### Branded Install
77
74
  ```bash
78
75
  python install.py
79
76
  ```
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
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
File without changes
File without changes