chatsbom 0.2.6__py3-none-any.whl → 0.2.8__py3-none-any.whl

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.
chatsbom/__main__.py CHANGED
@@ -1,5 +1,6 @@
1
1
  import typer
2
2
 
3
+ from chatsbom.__version__ import __version__
3
4
  from chatsbom.commands import chat
4
5
  from chatsbom.commands import collect
5
6
  from chatsbom.commands import convert
@@ -8,13 +9,35 @@ from chatsbom.commands import index
8
9
  from chatsbom.commands import query
9
10
  from chatsbom.commands import status
10
11
 
12
+
13
+ def version_callback(value: bool):
14
+ """Print version and exit."""
15
+ if value:
16
+ typer.echo(f"ChatSBOM version {__version__}")
17
+ raise typer.Exit()
18
+
19
+
11
20
  app = typer.Typer(
12
21
  help='ChatSBOM - Talk to your Supply Chain. Chat with SBOMs.',
13
22
  no_args_is_help=True,
14
23
  add_completion=False,
15
24
  )
16
25
 
17
- # Commands ordered by typical workflow
26
+
27
+ @app.callback()
28
+ def main(
29
+ version: bool = typer.Option(
30
+ None,
31
+ '--version',
32
+ '-v',
33
+ help='Show version and exit',
34
+ callback=version_callback,
35
+ is_eager=True,
36
+ ),
37
+ ):
38
+ """ChatSBOM - Talk to your Supply Chain. Chat with SBOMs."""
39
+
40
+
18
41
  app.command(name='collect')(collect.main)
19
42
  app.command(name='download')(download.main)
20
43
  app.command(name='convert')(convert.main)
@@ -0,0 +1,19 @@
1
+ """Version information for ChatSBOM."""
2
+ from importlib.metadata import PackageNotFoundError
3
+ from importlib.metadata import version
4
+
5
+
6
+ def get_version() -> str:
7
+ """
8
+ Get version from installed package metadata.
9
+
10
+ Returns:
11
+ Version string (e.g., "0.2.6")
12
+ """
13
+ try:
14
+ return version('chatsbom')
15
+ except PackageNotFoundError:
16
+ return '0.0.0-dev'
17
+
18
+
19
+ __version__ = get_version()
chatsbom/commands/chat.py CHANGED
@@ -2,6 +2,7 @@
2
2
  import asyncio
3
3
  import json
4
4
  import os
5
+ from contextlib import suppress
5
6
  from dataclasses import dataclass
6
7
  from dataclasses import field
7
8
  from datetime import datetime
@@ -127,6 +128,12 @@ class ChatSBOMApp(App):
127
128
  self._update_status()
128
129
 
129
130
  async def on_mount(self) -> None:
131
+ """Initialize the Claude Agent SDK client."""
132
+ import tempfile
133
+ stderr_file = tempfile.NamedTemporaryFile(
134
+ mode='w', delete=False, suffix='.log',
135
+ )
136
+
130
137
  opts = ClaudeAgentOptions(
131
138
  disallowed_tools=[
132
139
  'Read', 'Write', 'Edit',
@@ -139,9 +146,24 @@ class ChatSBOMApp(App):
139
146
  ),
140
147
  },
141
148
  system_prompt=SYSTEM_PROMPT,
149
+ env={
150
+ k: v for k, v in [
151
+ ('ANTHROPIC_BASE_URL', os.getenv('ANTHROPIC_BASE_URL')),
152
+ ] if v
153
+ },
154
+ debug_stderr=stderr_file,
142
155
  )
156
+
143
157
  self.client = ClaudeSDKClient(options=opts)
144
- await self.client.__aenter__()
158
+ try:
159
+ await self.client.__aenter__()
160
+ except Exception as e:
161
+ self._handle_init_error(e, stderr_file.name)
162
+ raise
163
+ finally:
164
+ stderr_file.close()
165
+ with suppress(OSError):
166
+ os.unlink(stderr_file.name)
145
167
 
146
168
  log = self.query_one('#log', RichLog)
147
169
  log.write('[bold green]ChatSBOM Agent[/] - Query examples:')
@@ -150,6 +172,33 @@ class ChatSBOMApp(App):
150
172
  self.query_one('#loading').add_class('hidden')
151
173
  self._update_status()
152
174
 
175
+ def _handle_init_error(self, error: Exception, stderr_path: str) -> None:
176
+ """Display initialization error with context."""
177
+ from rich.console import Console
178
+ from rich.panel import Panel
179
+ from pathlib import Path
180
+
181
+ lines = [
182
+ f'[red]{error}[/red]',
183
+ f'[dim]{type(error).__name__}[/dim]',
184
+ ]
185
+
186
+ if stderr := Path(stderr_path).read_text().strip():
187
+ lines += ['', '[yellow]stderr:[/yellow]', f'[dim]{stderr}[/dim]']
188
+
189
+ if os.geteuid() == 0:
190
+ lines += ['', '[yellow]⚠ Cannot use bypassPermissions as root. Run as non-root user.[/yellow]']
191
+
192
+ if url := os.getenv('ANTHROPIC_BASE_URL'):
193
+ lines += ['', f'[dim]API: {url}[/dim]']
194
+
195
+ Console().print(
196
+ Panel(
197
+ '\n'.join(lines),
198
+ title='[red]Init Failed[/red]', border_style='red',
199
+ ),
200
+ )
201
+
153
202
  async def on_unmount(self) -> None:
154
203
  if self.client:
155
204
  try:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: chatsbom
3
- Version: 0.2.6
3
+ Version: 0.2.8
4
4
  Summary: ChatSBOM - Talk to your Supply Chain. Chat with SBOMs.
5
5
  Requires-Python: >=3.12
6
6
  Requires-Dist: claude-agent-sdk>=0.1.0
@@ -1,7 +1,8 @@
1
1
  chatsbom/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- chatsbom/__main__.py,sha256=l85yHKwKPYJNIa9b1pRD_DlQVeZOofOOoPn2qR5cKjU,772
2
+ chatsbom/__main__.py,sha256=QVs4sO1YUqJt642_Gw4wyiDBwQ5YeL4I9v_xEDkTPdM,1228
3
+ chatsbom/__version__.py,sha256=JodF7HbCCwUPFhWltShEeNCAWHPTwRcPvSm7qWfMTCQ,411
3
4
  chatsbom/commands/__init__.py,sha256=vOL_QwoyFQhEIfs-rf0LVieAjStfkqlhqkjaZ_1p7gQ,15
4
- chatsbom/commands/chat.py,sha256=_X0bgXKIKTLAR-UKry0guCeRtnh08Bou5io5sTnYHBc,11236
5
+ chatsbom/commands/chat.py,sha256=jmToyhbg_yoKgX-yRf60Gl3u4oy00A1BzQDO0ktVoi8,12835
5
6
  chatsbom/commands/collect.py,sha256=ApweQztO889o4X4lBrxlIwdYorDUSiE01M4-XMO0HUM,16536
6
7
  chatsbom/commands/convert.py,sha256=etc6s_tT4VAvjOCZs8dnHppbTYEeAHI6kHJikkUWD64,8249
7
8
  chatsbom/commands/download.py,sha256=I9TwEXO1zrh9-DwvUUMh4iZ1W5ZCXbtE4jcJiK2KqnY,10218
@@ -18,7 +19,7 @@ chatsbom/core/validation.py,sha256=v4boiht4hK73nuZNYpzLTkZKsNSoFPMUDIX-8sP2E9g,3
18
19
  chatsbom/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
19
20
  chatsbom/models/framework.py,sha256=Whlsbnn64YwftMifMEMVvhsWADC9uupBV4QN1i1BoNQ,2833
20
21
  chatsbom/models/language.py,sha256=RgbBQZfG630uNZ7w-BtB1LZ5B5Q_nEExGrwUadfpRqE,3601
21
- chatsbom-0.2.6.dist-info/METADATA,sha256=-bRYOoS32S8Vrlajd1qWzA7CyDvLHJ6pwYjMX0GYxRo,4115
22
- chatsbom-0.2.6.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
23
- chatsbom-0.2.6.dist-info/entry_points.txt,sha256=906Ig6u2FwWk3ftNi4mth03N1NRgP4-B2p9kpppcqWA,51
24
- chatsbom-0.2.6.dist-info/RECORD,,
22
+ chatsbom-0.2.8.dist-info/METADATA,sha256=ySw9ndHHKi56MpsCgDkF-C735wy6oME9-JDAlabA9F0,4115
23
+ chatsbom-0.2.8.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
24
+ chatsbom-0.2.8.dist-info/entry_points.txt,sha256=906Ig6u2FwWk3ftNi4mth03N1NRgP4-B2p9kpppcqWA,51
25
+ chatsbom-0.2.8.dist-info/RECORD,,