jarvis-ai-assistant 0.5.0__py3-none-any.whl → 0.5.1__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.
@@ -6,6 +6,8 @@ import signal
6
6
  import subprocess
7
7
  import sys
8
8
  import time
9
+ import atexit
10
+ import errno
9
11
  from pathlib import Path
10
12
  from typing import Any, Callable, Dict, List, Optional, Tuple
11
13
  from datetime import datetime, date
@@ -205,6 +207,130 @@ def _setup_signal_handler() -> None:
205
207
  signal.signal(signal.SIGINT, sigint_handler)
206
208
 
207
209
 
210
+ # ----------------------------
211
+ # 单实例文件锁(放置于初始化早期使用)
212
+ # ----------------------------
213
+ _INSTANCE_LOCK_PATH: Optional[Path] = None
214
+
215
+
216
+ def _get_instance_lock_path(lock_name: str = "instance.lock") -> Path:
217
+ try:
218
+ data_dir = Path(str(get_data_dir()))
219
+ except Exception:
220
+ data_dir = Path(os.path.expanduser("~/.jarvis"))
221
+ data_dir.mkdir(parents=True, exist_ok=True)
222
+ return data_dir / lock_name
223
+
224
+
225
+ def _read_lock_owner_pid(lock_path: Path) -> Optional[int]:
226
+ try:
227
+ txt = lock_path.read_text(encoding="utf-8", errors="ignore").strip()
228
+ if not txt:
229
+ return None
230
+ try:
231
+ info = json.loads(txt)
232
+ pid = info.get("pid")
233
+ return int(pid) if pid is not None else None
234
+ except Exception:
235
+ # 兼容纯数字PID
236
+ return int(txt)
237
+ except Exception:
238
+ return None
239
+
240
+
241
+ def _is_process_alive(pid: int) -> bool:
242
+ if pid is None or pid <= 0:
243
+ return False
244
+ try:
245
+ os.kill(pid, 0)
246
+ except ProcessLookupError:
247
+ return False
248
+ except PermissionError:
249
+ # 无权限但进程存在
250
+ return True
251
+ except OSError as e:
252
+ # 某些平台上,EPERM 表示进程存在但无权限
253
+ if getattr(e, "errno", None) == errno.EPERM:
254
+ return True
255
+ return False
256
+ else:
257
+ return True
258
+
259
+
260
+ def _release_instance_lock() -> None:
261
+ global _INSTANCE_LOCK_PATH
262
+ try:
263
+ if _INSTANCE_LOCK_PATH and _INSTANCE_LOCK_PATH.exists():
264
+ _INSTANCE_LOCK_PATH.unlink()
265
+ except Exception:
266
+ # 清理失败不影响退出
267
+ pass
268
+ _INSTANCE_LOCK_PATH = None
269
+
270
+
271
+ def _acquire_single_instance_lock(lock_name: str = "instance.lock") -> None:
272
+ """
273
+ 在数据目录(~/.jarvis 或配置的数据目录)下创建实例锁,防止重复启动。
274
+ 如果检测到已有存活实例,提示后退出。
275
+ """
276
+ global _INSTANCE_LOCK_PATH
277
+ lock_path = _get_instance_lock_path(lock_name)
278
+
279
+ # 已存在锁:检查是否为有效存活实例
280
+ if lock_path.exists():
281
+ pid = _read_lock_owner_pid(lock_path)
282
+ if pid and _is_process_alive(pid):
283
+ PrettyOutput.print(
284
+ f"检测到已有一个 Jarvis 实例正在运行 (PID: {pid})。\n"
285
+ f"如果确认不存在正在运行的实例,请删除锁文件后重试:{lock_path}",
286
+ OutputType.WARNING,
287
+ )
288
+ sys.exit(0)
289
+ # 尝试移除陈旧锁
290
+ try:
291
+ lock_path.unlink()
292
+ except Exception:
293
+ PrettyOutput.print(
294
+ f"无法删除旧锁文件:{lock_path},请手动清理后重试。",
295
+ OutputType.ERROR,
296
+ )
297
+ sys.exit(1)
298
+
299
+ # 原子创建锁文件,避免并发竞争
300
+ flags = os.O_CREAT | os.O_EXCL | os.O_WRONLY
301
+ try:
302
+ fd = os.open(str(lock_path), flags)
303
+ with os.fdopen(fd, "w", encoding="utf-8") as fp:
304
+ payload = {
305
+ "pid": os.getpid(),
306
+ "time": int(time.time()),
307
+ "argv": sys.argv[:10],
308
+ }
309
+ try:
310
+ fp.write(json.dumps(payload, ensure_ascii=False))
311
+ except Exception:
312
+ fp.write(str(os.getpid()))
313
+ _INSTANCE_LOCK_PATH = lock_path
314
+ atexit.register(_release_instance_lock)
315
+ except FileExistsError:
316
+ # 极端并发下再次校验
317
+ pid = _read_lock_owner_pid(lock_path)
318
+ if pid and _is_process_alive(pid):
319
+ PrettyOutput.print(
320
+ f"检测到已有一个 Jarvis 实例正在运行 (PID: {pid})。",
321
+ OutputType.WARNING,
322
+ )
323
+ sys.exit(0)
324
+ PrettyOutput.print(
325
+ f"锁文件已存在但可能为陈旧状态:{lock_path},请手动删除后重试。",
326
+ OutputType.ERROR,
327
+ )
328
+ sys.exit(1)
329
+ except Exception as e:
330
+ PrettyOutput.print(f"创建实例锁失败: {e}", OutputType.ERROR)
331
+ sys.exit(1)
332
+
333
+
208
334
  def _check_pip_updates() -> bool:
209
335
  """检查pip安装的Jarvis是否有更新
210
336
 
@@ -1289,12 +1415,21 @@ def _collect_optional_config_interactively(
1289
1415
  )
1290
1416
  or changed
1291
1417
  )
1418
+ # 规划相关:最大递归层数(仅在启用规划时生效,CLI --plan/--no-plan 控制启用)
1419
+ changed = (
1420
+ _ask_and_set_int(
1421
+ "JARVIS_PLAN_MAX_DEPTH",
1422
+ "任务规划的最大层数(限制递归拆分深度,默认2;仅在启用规划时生效)",
1423
+ 3,
1424
+ )
1425
+ or changed
1426
+ )
1292
1427
  # 新增:自动总结轮次与脚本超时
1293
1428
  changed = (
1294
1429
  _ask_and_set_int(
1295
1430
  "JARVIS_AUTO_SUMMARY_ROUNDS",
1296
- "基于对话轮次的自动总结阈值(达到该轮次后自动总结并清理历史,默认20)",
1297
- 20,
1431
+ "基于对话轮次的自动总结阈值(达到该轮次后自动总结并清理历史,默认50)",
1432
+ 50,
1298
1433
  )
1299
1434
  or changed
1300
1435
  )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: jarvis-ai-assistant
3
- Version: 0.5.0
3
+ Version: 0.5.1
4
4
  Summary: Jarvis: An AI assistant that uses tools to interact with the system
5
5
  Home-page: https://github.com/skyfireitdiy/Jarvis
6
6
  Author: skyfire
@@ -1,5 +1,5 @@
1
- jarvis/__init__.py,sha256=oTkuIy1EsFy9C2D4yYth5JohcbEgLLtiPlfbyY7LvrM,73
2
- jarvis/jarvis_agent/__init__.py,sha256=uq8p8ruYW5CjN8J8fncYAe7YrRORXjm183TSu_0ST2Y,51837
1
+ jarvis/__init__.py,sha256=sOKEklWEZaCxQadO6f1UkOMRanbgJ3rJjjBTWjm6JC4,73
2
+ jarvis/jarvis_agent/__init__.py,sha256=uEd9UrrHK5CRpOVSCxPESfxcAclMfoRacQrzVzQLiEk,56763
3
3
  jarvis/jarvis_agent/agent_manager.py,sha256=Q0S-mYTPt8Xd7RKGoLWoWU_RP_wEXFWxCjve8_t2f2A,3807
4
4
  jarvis/jarvis_agent/builtin_input_handler.py,sha256=wS-FqpT3pIXwHn1dfL3SpXonUKWgVThbQueUIeyRc2U,2917
5
5
  jarvis/jarvis_agent/config_editor.py,sha256=hlb9EYxKWcR_qdW2O89CgNDdciR9Isi743JU_1gD8j4,1927
@@ -8,7 +8,7 @@ jarvis/jarvis_agent/event_bus.py,sha256=pRdfk7d0OG18K6yNfWlCvAh_dW5p9sBtT2Yc3jGm
8
8
  jarvis/jarvis_agent/events.py,sha256=rmFQ37PasImCh7OCdCzNBvubk-kHwcUiYLgzmL0t0_4,3689
9
9
  jarvis/jarvis_agent/file_context_handler.py,sha256=2MPn_O_2llX39meFg272Cjk3wMPn5nmgbGMUyX06YQo,2113
10
10
  jarvis/jarvis_agent/file_methodology_manager.py,sha256=LnhgTx5xQXCBK8esjCkFbgFm9iEyFX7TryUlC40Kzpw,4428
11
- jarvis/jarvis_agent/jarvis.py,sha256=4HlG4Wfs0HRqLq3mLHx3kt5MV--yjLpAkK7KtIhskwQ,48591
11
+ jarvis/jarvis_agent/jarvis.py,sha256=eZpONtA7mFZtG6v-xQeVElXAWtl3ZZrrp4jgvtlK96c,48925
12
12
  jarvis/jarvis_agent/main.py,sha256=IgS7d3rng2vFlu983OUeCkOAosKjFAn1sFCk3gT9J9Q,4563
13
13
  jarvis/jarvis_agent/memory_manager.py,sha256=WSyUffx9xTmkcj4QrSLEfsjI3sTMUwZmkkC9_N_gTjo,8042
14
14
  jarvis/jarvis_agent/methodology_share_manager.py,sha256=AB_J9BwRgaeENQfL6bH83FOLeLrgHhppMb7psJNevKs,6874
@@ -25,6 +25,7 @@ jarvis/jarvis_agent/shell_input_handler.py,sha256=wiAPjB-9uTkcLszbO5dlOUwIfaeR39
25
25
  jarvis/jarvis_agent/stdio_redirect.py,sha256=xqF-sENitpefCT3TA9oRwATFqbDrU2dvqM-UiMZRhbE,9944
26
26
  jarvis/jarvis_agent/task_analyzer.py,sha256=JXc-63hnTD7oSX-nIfRcgxqCMhh4fM4QYVc7C1gp--M,7813
27
27
  jarvis/jarvis_agent/task_manager.py,sha256=lme_aN8vaF_a4Tvv2kaSEnWATy8RPSjogTxeLnEYZdg,6504
28
+ jarvis/jarvis_agent/task_planner.py,sha256=MaoyyMkpbs-QmYjLZOKmNLsDXmlKwM89_UaqGI1geGw,10600
28
29
  jarvis/jarvis_agent/tool_executor.py,sha256=k73cKhZEZpljvui4ZxALlFEIE-iLzJ32Softsmiwzqk,1896
29
30
  jarvis/jarvis_agent/tool_share_manager.py,sha256=Do08FRxis0ynwR2a6iRoa6Yq0qCP8NkuhMbPrimaxMA,5169
30
31
  jarvis/jarvis_agent/user_interaction.py,sha256=tifFN49GkO_Q80sqOTVmhxwbNWTazF3K0cr8AnnvzdU,1453
@@ -33,7 +34,7 @@ jarvis/jarvis_agent/web_bridge.py,sha256=h15PXuPWWfZynWt8bPW4BDeCpIVoIOlRXfO0je6
33
34
  jarvis/jarvis_agent/web_output_sink.py,sha256=sZ6WbLZnuCdT5dS9d8msHY_g-pnj-dvML-I6uJ7-sbc,1733
34
35
  jarvis/jarvis_agent/web_server.py,sha256=oZZy4nAOPhRWJn7K8VjBlho1F9AsvLEYiusKgipjO94,28204
35
36
  jarvis/jarvis_code_agent/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
36
- jarvis/jarvis_code_agent/code_agent.py,sha256=JtUZ6maMxOic5g5THCoOpgv9hyYecJZL71QR7nE2KDM,42269
37
+ jarvis/jarvis_code_agent/code_agent.py,sha256=1jdIZUgHFoevFljoZiDOO0Zxs_oKR_vJS4-eUSTSqPY,42720
37
38
  jarvis/jarvis_code_agent/lint.py,sha256=_qLJB_bC3PuoHG-j4EGOnYzNGO26jHlKLbkysfyQW1c,3954
38
39
  jarvis/jarvis_code_analysis/code_review.py,sha256=48r0UE4pmOUaRgBJIJrpPW307sKGo1rnTNkWdsqkOrY,29889
39
40
  jarvis/jarvis_code_analysis/checklists/__init__.py,sha256=LIXAYa1sW3l7foP6kohLWnE98I_EQ0T7z5bYKHq6rJA,78
@@ -56,7 +57,7 @@ jarvis/jarvis_code_analysis/checklists/shell.py,sha256=aRFYhQQvTgbYd-uY5pc8UHIUA
56
57
  jarvis/jarvis_code_analysis/checklists/sql.py,sha256=vR0T6qC7b4dURjJVAd7kSVxyvZEQXPG1Jqc2sNTGp5c,2355
57
58
  jarvis/jarvis_code_analysis/checklists/swift.py,sha256=TPx4I6Gupvs6tSerRKmTSKEPQpOLEbH2Y7LXg1uBgxc,2566
58
59
  jarvis/jarvis_code_analysis/checklists/web.py,sha256=25gGD7pDadZQybNFvALYxWvK0VRjGQb1NVJQElwjyk0,3943
59
- jarvis/jarvis_data/config_schema.json,sha256=1c8h8kDlcBqqiX2uHhajgT70F9o88QR1ee-zk2GJJ6w,15093
60
+ jarvis/jarvis_data/config_schema.json,sha256=5tNhALZ61smZP7VzppWxs99LP21RY3gB1wrqemQ-xoo,15358
60
61
  jarvis/jarvis_data/tiktoken/9b5ad71b2ce5302211f9c61530b329a4922fc6a4,sha256=Ijkht27pm96ZW3_3OFE-7xAPtR0YyTWXoRO8_-hlsqc,1681126
61
62
  jarvis/jarvis_git_squash/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
62
63
  jarvis/jarvis_git_squash/main.py,sha256=BRbsEQVXwseVFKliVqV8_JPh1om6QT6dLTHw0jQ7OE0,2474
@@ -91,6 +92,16 @@ jarvis/jarvis_rag/query_rewriter.py,sha256=LGAWZ8kwH_dpquuYqc4QWC7IXmHX3SsnPSYMW
91
92
  jarvis/jarvis_rag/rag_pipeline.py,sha256=aaTuxiArtVaPemWeySApw64q204JeLNXpOEtq7Adn1I,13797
92
93
  jarvis/jarvis_rag/reranker.py,sha256=7Azc3y5fngwfPKtzZ8tx6iGKNeqC8uDy8yo8VCyLyL4,2670
93
94
  jarvis/jarvis_rag/retriever.py,sha256=J4jO0492yHEwxJz_Cp2WP3vGHRHKj56rDyWZQ2W0XdA,18374
95
+ jarvis/jarvis_sec/README.md,sha256=0GpTAOAupOGEAv0juLJXEBBfaa6KL74t2nRbj0N5Mkw,7621
96
+ jarvis/jarvis_sec/__init__.py,sha256=SYgHZcxoV4xgjdal1S04u7QXCQJdgPpwiAxmEcK1pYg,25690
97
+ jarvis/jarvis_sec/cli.py,sha256=_DWWcYscLWCyIs5k7bKjXSBkQPxLbYLJKkU0QuTaeZs,3494
98
+ jarvis/jarvis_sec/prompts.py,sha256=ObGFNvrCtbIhsWlJHYQ5tcsTkuBlID0FozncYCv8S8k,14165
99
+ jarvis/jarvis_sec/report.py,sha256=5wLKqK-CDFZ2fPtwP3sGYgjAi69TKoYizyLK1cchDVA,8516
100
+ jarvis/jarvis_sec/types.py,sha256=_C3IHwnni3kApryP3c_UTYdvFdmlJSVXQLLefX94zl0,365
101
+ jarvis/jarvis_sec/workflow.py,sha256=DokD8ZBcAfyiq078OM7rmZdpWrOXAL_7ZGkLF2TOqcc,20187
102
+ jarvis/jarvis_sec/checkers/__init__.py,sha256=ZF7zHJS6P6cu9VE3kMc66DK7m-Ki2bmMkwkap5mm26g,786
103
+ jarvis/jarvis_sec/checkers/c_checker.py,sha256=ezW_-9wwzLxYEENd3HhdgDnLfJiLccJacJklTOnVXgw,53498
104
+ jarvis/jarvis_sec/checkers/rust_checker.py,sha256=SBobyUjN1rDzFPESZ6uif3PR3HUW6Mux2ofxeqRUJ2Q,13483
94
105
  jarvis/jarvis_smart_shell/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
95
106
  jarvis/jarvis_smart_shell/main.py,sha256=lUJPwLR9RlaaVv0lx3ojjjv5dELHOaindlsLDDkpssQ,14960
96
107
  jarvis/jarvis_stats/__init__.py,sha256=jJzgP43nxzLbNGs8Do4Jfta1PNCJMf1Oq9YTPd6EnFM,342
@@ -112,15 +123,15 @@ jarvis/jarvis_tools/registry.py,sha256=KDDuaQC_Ej8nGKk2P5W7uMV22BQQx_lSf9dLrLZ6o
112
123
  jarvis/jarvis_tools/retrieve_memory.py,sha256=hhhGSr7jebPHICY9oEKICyI8mfqsRtKjh58qZNZApKc,8624
113
124
  jarvis/jarvis_tools/save_memory.py,sha256=RQtNxcpU53FFv_EBjH0i0oyQ7jWubm-trD1BHuqaGjI,6985
114
125
  jarvis/jarvis_tools/search_web.py,sha256=Hi8WBxcRH02qjOF1qcJP2qSqs3kVOKGFAARfh548Ii4,6370
115
- jarvis/jarvis_tools/sub_agent.py,sha256=Fn2RZ7jLD4cZCWt0HnpSLkdIbeqeZq-1h97Nfg2RAqE,8485
116
- jarvis/jarvis_tools/sub_code_agent.py,sha256=KpwTCU89kq_RGNpfyA1C0bTl-f0dTvsCyDKplU-hrds,9600
126
+ jarvis/jarvis_tools/sub_agent.py,sha256=oV_-R5kAnocA3X8yrxtccGKa6UIo08_YbMQB0ozCPzU,8534
127
+ jarvis/jarvis_tools/sub_code_agent.py,sha256=F9iY0XgYsHJEdfMo_0UR646qYbj61t4jIUVnrq9zPuE,9479
117
128
  jarvis/jarvis_tools/virtual_tty.py,sha256=L7-J00ARQvIa25T45Hhqg2eCBl6W2LFgqDlWMWf-7dk,25275
118
129
  jarvis/jarvis_tools/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
119
130
  jarvis/jarvis_tools/cli/main.py,sha256=WL2GNV7WqYl7G1-btRGvCkzDCMk4fPfNvzCrnUFVPxs,9323
120
131
  jarvis/jarvis_utils/__init__.py,sha256=67h0ldisGlh3oK4DAeNEL2Bl_VsI3tSmfclasyVlueM,850
121
132
  jarvis/jarvis_utils/builtin_replace_map.py,sha256=z8iAqsbZUiGFaozxG1xSu128op8udqHOeEw-GxNt4bU,1708
122
133
  jarvis/jarvis_utils/clipboard.py,sha256=D3wzQeqg_yiH7Axs4d6MRxyNa9XxdnenH-ND2uj2WVQ,2967
123
- jarvis/jarvis_utils/config.py,sha256=jOVCrlD597U6FTu8j-lyO93Mpoyqv3Do7Seja_XrRfE,22580
134
+ jarvis/jarvis_utils/config.py,sha256=7aGTlZMpXC0PhZeu3WD3asBAC0hf4xlAmFep-ObwtR0,22918
124
135
  jarvis/jarvis_utils/embedding.py,sha256=x6mrkL7Bc3qgfuBDsjc4fg4nKG8ofGxVLVVydbsb8PY,2838
125
136
  jarvis/jarvis_utils/file_processors.py,sha256=XiM248SHS7lLgQDCbORVFWqinbVDUawYxWDOsLXDxP8,3043
126
137
  jarvis/jarvis_utils/fzf.py,sha256=vCs0Uh5dUqGbWzXn2JCtLLCOYE2B39ZNdNveR9PK4DA,1681
@@ -131,10 +142,10 @@ jarvis/jarvis_utils/input.py,sha256=4VXpUZoAocW1mldlZd4bmXI8a_CmcQj7IPLBNgNLGSI,
131
142
  jarvis/jarvis_utils/methodology.py,sha256=YuuKBjr58cu8QWcniU7QVlEM9Cem6wo4IYcq1iwSDMw,13158
132
143
  jarvis/jarvis_utils/output.py,sha256=y2fVcao_2ZowFl0IxUrJZCi8T6ZM0z-iPzpk8T8eLxc,13623
133
144
  jarvis/jarvis_utils/tag.py,sha256=f211opbbbTcSyzCDwuIK_oCnKhXPNK-RknYyGzY1yD0,431
134
- jarvis/jarvis_utils/utils.py,sha256=uBWPwVmzM23HUDjnFdEOEsPF50cjJvC7lMvJqXHyjJ0,74276
135
- jarvis_ai_assistant-0.5.0.dist-info/licenses/LICENSE,sha256=AGgVgQmTqFvaztRtCAXsAMryUymB18gZif7_l2e1XOg,1063
136
- jarvis_ai_assistant-0.5.0.dist-info/METADATA,sha256=Y1rxsB9YwcJmuEDvCayrnpUAVx87Nq-yVdjuBWo_g8U,18751
137
- jarvis_ai_assistant-0.5.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
138
- jarvis_ai_assistant-0.5.0.dist-info/entry_points.txt,sha256=4GcWKFxRJD-QU14gw_3ZaW4KuEVxOcZK9i270rwPdjA,1395
139
- jarvis_ai_assistant-0.5.0.dist-info/top_level.txt,sha256=1BOxyWfzOP_ZXj8rVTDnNCJ92bBGB0rwq8N1PCpoMIs,7
140
- jarvis_ai_assistant-0.5.0.dist-info/RECORD,,
145
+ jarvis/jarvis_utils/utils.py,sha256=bN7HxVBs3Hoa8xM4NtOaKXpSm7WbhwwRyU4jE0v8NjY,78702
146
+ jarvis_ai_assistant-0.5.1.dist-info/licenses/LICENSE,sha256=AGgVgQmTqFvaztRtCAXsAMryUymB18gZif7_l2e1XOg,1063
147
+ jarvis_ai_assistant-0.5.1.dist-info/METADATA,sha256=DeO39HTIYe-SziDd5J0lWoiPuADScAqzRdC7hIgiL6o,18751
148
+ jarvis_ai_assistant-0.5.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
149
+ jarvis_ai_assistant-0.5.1.dist-info/entry_points.txt,sha256=wS5YtI-Patr7PIB_DaKzlbDuQ2cDmQSDljA6psIkjbM,1469
150
+ jarvis_ai_assistant-0.5.1.dist-info/top_level.txt,sha256=1BOxyWfzOP_ZXj8rVTDnNCJ92bBGB0rwq8N1PCpoMIs,7
151
+ jarvis_ai_assistant-0.5.1.dist-info/RECORD,,
@@ -11,6 +11,7 @@ jarvis-methodology = jarvis.jarvis_methodology.main:main
11
11
  jarvis-multi-agent = jarvis.jarvis_multi_agent.main:main
12
12
  jarvis-platform-manager = jarvis.jarvis_platform_manager.main:main
13
13
  jarvis-rag = jarvis.jarvis_rag.cli:main
14
+ jarvis-sec = jarvis.jarvis_sec.cli:main
14
15
  jarvis-smart-shell = jarvis.jarvis_smart_shell.main:main
15
16
  jarvis-stats = jarvis.jarvis_stats.cli:main
16
17
  jarvis-tool = jarvis.jarvis_tools.cli.main:main
@@ -23,6 +24,7 @@ jma = jarvis.jarvis_multi_agent.main:main
23
24
  jmo = jarvis.jarvis_memory_organizer.memory_organizer:main
24
25
  jpm = jarvis.jarvis_platform_manager.main:main
25
26
  jrg = jarvis.jarvis_rag.cli:main
27
+ jsec = jarvis.jarvis_sec.cli:main
26
28
  jss = jarvis.jarvis_smart_shell.main:main
27
29
  jst = jarvis.jarvis_stats.cli:main
28
30
  jt = jarvis.jarvis_tools.cli.main:main