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 +24 -1
- chatsbom/__version__.py +19 -0
- chatsbom/commands/chat.py +50 -1
- {chatsbom-0.2.6.dist-info → chatsbom-0.2.8.dist-info}/METADATA +1 -1
- {chatsbom-0.2.6.dist-info → chatsbom-0.2.8.dist-info}/RECORD +7 -6
- {chatsbom-0.2.6.dist-info → chatsbom-0.2.8.dist-info}/WHEEL +0 -0
- {chatsbom-0.2.6.dist-info → chatsbom-0.2.8.dist-info}/entry_points.txt +0 -0
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
|
-
|
|
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)
|
chatsbom/__version__.py
ADDED
|
@@ -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
|
-
|
|
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,7 +1,8 @@
|
|
|
1
1
|
chatsbom/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2
|
-
chatsbom/__main__.py,sha256=
|
|
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=
|
|
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.
|
|
22
|
-
chatsbom-0.2.
|
|
23
|
-
chatsbom-0.2.
|
|
24
|
-
chatsbom-0.2.
|
|
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,,
|
|
File without changes
|
|
File without changes
|