ros_checker 0.1.0__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 (32) hide show
  1. ros_checker-0.1.0/.gitignore +126 -0
  2. ros_checker-0.1.0/LICENSE +21 -0
  3. ros_checker-0.1.0/PKG-INFO +190 -0
  4. ros_checker-0.1.0/README.md +177 -0
  5. ros_checker-0.1.0/pyproject.toml +62 -0
  6. ros_checker-0.1.0/src/ros_checker/__init__.py +5 -0
  7. ros_checker-0.1.0/src/ros_checker/graph/__init__.py +34 -0
  8. ros_checker-0.1.0/src/ros_checker/graph/cli.py +151 -0
  9. ros_checker-0.1.0/src/ros_checker/graph/collector.py +163 -0
  10. ros_checker-0.1.0/src/ros_checker/graph/mock.py +118 -0
  11. ros_checker-0.1.0/src/ros_checker/graph/models.py +108 -0
  12. ros_checker-0.1.0/src/ros_checker/graph/source.py +88 -0
  13. ros_checker-0.1.0/src/ros_checker/health/__init__.py +16 -0
  14. ros_checker-0.1.0/src/ros_checker/health/engine.py +40 -0
  15. ros_checker-0.1.0/src/ros_checker/health/models.py +59 -0
  16. ros_checker-0.1.0/src/ros_checker/health/nav2.py +144 -0
  17. ros_checker-0.1.0/src/ros_checker/health/rules.py +131 -0
  18. ros_checker-0.1.0/src/ros_checker/llm/__init__.py +12 -0
  19. ros_checker-0.1.0/src/ros_checker/llm/azure.py +64 -0
  20. ros_checker-0.1.0/src/ros_checker/llm/ollama.py +51 -0
  21. ros_checker-0.1.0/src/ros_checker/llm/prompt.py +50 -0
  22. ros_checker-0.1.0/src/ros_checker/llm/provider.py +46 -0
  23. ros_checker-0.1.0/src/ros_checker/main.py +381 -0
  24. ros_checker-0.1.0/src/ros_checker/report/__init__.py +15 -0
  25. ros_checker-0.1.0/src/ros_checker/report/render.py +107 -0
  26. ros_checker-0.1.0/tests/test_cli_source.py +53 -0
  27. ros_checker-0.1.0/tests/test_collector_integration.py +56 -0
  28. ros_checker-0.1.0/tests/test_config_cmd.py +98 -0
  29. ros_checker-0.1.0/tests/test_graph.py +44 -0
  30. ros_checker-0.1.0/tests/test_health.py +64 -0
  31. ros_checker-0.1.0/tests/test_llm.py +47 -0
  32. ros_checker-0.1.0/tests/test_smoke.py +8 -0
@@ -0,0 +1,126 @@
1
+ # Created by expert developer assistant
2
+ # Optimized for ROS-based Python project
3
+
4
+ ### Project Specific ###
5
+ # ROS home and logs
6
+ .ros-home/
7
+ *.log
8
+
9
+ # Local uv cache (CI에서 UV_CACHE_DIR=.uv-cache 사용)
10
+ .uv-cache/
11
+
12
+ # Binary and Data files
13
+ *.msgpack
14
+ *.rkyv
15
+ *.so
16
+ *.pem
17
+ # *.lock
18
+ *.tag
19
+ *.rev
20
+
21
+ # Environment variables
22
+ .env
23
+ !.env.example
24
+
25
+ ### Python ###
26
+ # Byte-compiled / optimized / DLL files
27
+ __pycache__/
28
+ *.py[cod]
29
+ *$py.class
30
+
31
+ # C extensions
32
+ *.so
33
+
34
+ # Distribution / packaging
35
+ .Python
36
+ build/
37
+ develop-eggs/
38
+ dist/
39
+ downloads/
40
+ eggs/
41
+ .eggs/
42
+ lib/
43
+ lib64/
44
+ parts/
45
+ sdist/
46
+ var/
47
+ wheels/
48
+ share/python-wheels/
49
+ *.egg-info/
50
+ .installed.cfg
51
+ *.egg
52
+ MANIFEST
53
+
54
+ # Unit test / coverage reports
55
+ htmlcov/
56
+ .tox/
57
+ .nox/
58
+ .coverage
59
+ .coverage.*
60
+ .cache
61
+ nosetests.xml
62
+ coverage.xml
63
+ *.cover
64
+ *.py,cover
65
+ .hypothesis/
66
+ .pytest_cache/
67
+ cover/
68
+
69
+ # Environments
70
+ .venv
71
+ env/
72
+ venv/
73
+ ENV/
74
+ env.bak/
75
+ venv.bak/
76
+
77
+ # Mypy / Ruff / Pyright
78
+ .mypy_cache/
79
+ .dmypy.json
80
+ dmypy.json
81
+ .ruff_cache/
82
+ pyrightconfig.json
83
+
84
+ ### IDEs ###
85
+ # Visual Studio Code
86
+ .vscode/*
87
+ !.vscode/settings.json
88
+ !.vscode/tasks.json
89
+ !.vscode/launch.json
90
+ !.vscode/extensions.json
91
+ !.vscode/*.code-snippets
92
+ .history/
93
+
94
+ # PyCharm / JetBrains
95
+ .idea/
96
+
97
+ ### OS Specific ###
98
+ # macOS
99
+ .DS_Store
100
+ .AppleDouble
101
+ .LSOverride
102
+ ._*
103
+ .DocumentRevisions-V100
104
+ .fseventsd
105
+ .Spotlight-V100
106
+ .TemporaryItems
107
+ .Trashes
108
+ .VolumeIcon.icns
109
+ .com.apple.timemachine.donotpresent
110
+
111
+ # Windows
112
+ Thumbs.db
113
+ Thumbs.db:encryptable
114
+ ehthumbs.db
115
+ ehthumbs_vista.db
116
+ *.stackdump
117
+ [Dd]esktop.ini
118
+ $RECYCLE.BIN/
119
+ *.lnk
120
+
121
+ # Linux
122
+ *~
123
+ .fuse_hidden*
124
+ .directory
125
+ .Trash-*
126
+ .nfs*
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 ros_checker contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,190 @@
1
+ Metadata-Version: 2.5
2
+ Name: ros_checker
3
+ Version: 0.1.0
4
+ Summary: ROS2 토픽/노드/서비스/액션을 분석하고 Nav2 구동 여부를 LLM으로 진단하는 CLI 앱
5
+ License-File: LICENSE
6
+ Requires-Python: >=3.12
7
+ Requires-Dist: httpx>=0.27
8
+ Requires-Dist: numpy
9
+ Requires-Dist: wpycli
10
+ Requires-Dist: wpyconf
11
+ Requires-Dist: wpylog
12
+ Description-Content-Type: text/markdown
13
+
14
+ # ros_checker
15
+
16
+ ROS2 토픽/노드/서비스/액션을 분석해 **신호 수신 여부**와 **Nav2 구동 가능성**을 체크하고, **LLM(ollama / Azure OpenAI)**으로 자연어 진단을 제공하는 CLI 앱입니다.
17
+
18
+ 로컬(호스트 ROS2)과 Docker(컨테이너 ROS2) 환경 모두에서 동작합니다.
19
+
20
+ ## 기능
21
+
22
+ | 커맨드 | 설명 |
23
+ |---|---|
24
+ | `ros-checker scan` | ROS2 그래프 스캔 — 토픽/노드/서비스/액션, 토픽별 hz·대역폭 |
25
+ | `ros-checker health` | 토픽 신호 수신, 노드 존재, 서비스 호출 헬스 체크 |
26
+ | `ros-checker nav2` | Nav2 구동 가능성 체크 (라이프사이클, costmap, cmd_vel, 액션) |
27
+ | `ros-checker analyze` | 수집 데이터를 LLM으로 자연어 진단 |
28
+ | `ros-checker config` | 설정 출력 (`config init`/`set`으로 생성·수정) |
29
+
30
+ ## 문서
31
+
32
+ - [AGENTS.md](AGENTS.md) — 에이전트/개발자용 개발 가이드 (TDD, 스타일, 명령어)
33
+ - [CONTRIBUTING.md](CONTRIBUTING.md) — 기여 가이드
34
+ - [SECURITY.md](SECURITY.md) — 보안 취약점 보고 절차
35
+ - [docs/PLAN.md](docs/PLAN.md) — 초기 구현 계획
36
+
37
+ ## 요구사항
38
+
39
+ - Python 3.12
40
+ - ROS2 (Jazzy 등) — `rclpy` 필요. `source /opt/ros/<distro>/setup.bash` 후 실행
41
+ - LLM: ollama(로컬) 또는 Azure OpenAI(클라우드)
42
+
43
+ ## 설치 및 실행 (로컬)
44
+
45
+ ```bash
46
+ uv sync --group dev
47
+ source /opt/ros/<distro>/setup.bash
48
+
49
+ # 그래프 스캔
50
+ uv run ros-checker scan
51
+
52
+ # 헬스 체크
53
+ uv run ros-checker health
54
+
55
+ # Nav2 구동 가능성
56
+ uv run ros-checker nav2
57
+
58
+ # LLM 진단 (ollama 기본)
59
+ uv run ros-checker analyze
60
+ ```
61
+
62
+ > ROS2가 없는 환경에서도 `--mock` 플래그로 Mock 그래프를 사용해 기능을 확인할 수 있습니다.
63
+ > `uv run ros-checker nav2 --mock`
64
+
65
+ ## 설정
66
+
67
+ 설정은 **플랫폼 표준 설정 디렉터리**의 `config.toml`에서 읽습니다.
68
+
69
+ | 플랫폼 | 기본 경로 |
70
+ |---|---|
71
+ | Linux | `$XDG_CONFIG_HOME/ros-checker/config.toml` (기본 `~/.config/ros-checker/config.toml`) |
72
+ | macOS | `~/Library/Application Support/ros-checker/config.toml` |
73
+ | Windows | `%APPDATA%\ros-checker\config.toml` |
74
+
75
+ `config` 커맨드로 관리합니다.
76
+
77
+ ```bash
78
+ # 기본 config.toml 생성
79
+ ros-checker config init
80
+
81
+ # 항목 수정·저장 (점 표기 키)
82
+ ros-checker config set llm.provider azure
83
+ ros-checker config set llm.model gpt-4o
84
+ ros-checker config set llm.timeout 30
85
+
86
+ # 현재 유효 설정 출력
87
+ ros-checker config
88
+ ```
89
+
90
+ 설정 파일이나 `.env`가 없어도 **내장 기본값으로 동작**하므로, uvx 등에서 별도 파일 없이 바로 실행할 수 있습니다. 파일을 지정하려면 `-c/--config`와 `--dotenv` 플래그를 사용합니다.
91
+
92
+ ## LLM 설정
93
+
94
+ `config init`/`config set`으로 생성한 설정 파일이나 `.env`로 프로바이더를 선택합니다.
95
+
96
+ **ollama (기본)**
97
+ ```toml
98
+ [llm]
99
+ provider = "ollama"
100
+ base_url = "http://localhost:11434"
101
+ model = "llama3.2"
102
+ ```
103
+
104
+ **Azure OpenAI**
105
+ ```toml
106
+ [llm]
107
+ provider = "azure"
108
+ base_url = "https://<resource>.openai.azure.com"
109
+ model = "<deployment-name>"
110
+ api_key = "<your-api-key>"
111
+ ```
112
+
113
+ 환경 변수로도 설정 가능합니다 (`ROS_CHECKER_LLM__PROVIDER` 등, `.env.example` 참고).
114
+
115
+ ## uvx로 실행 (로봇에서)
116
+
117
+ 패키지를 PyPI에 배포하면 로봇에서 `uvx`로 설치 없이 실행할 수 있습니다.
118
+
119
+ ```bash
120
+ # ROS2 환경 source 후
121
+ source /opt/ros/<distro>/setup.bash
122
+
123
+ # 그래프 스캔 (rclpy 없으면 자동으로 ros2 CLI 사용)
124
+ uvx ros-checker scan
125
+
126
+ # CLI 소스 명시 (ros2 CLI만 필요, 가장 견고)
127
+ uvx ros-checker scan --source cli
128
+
129
+ # Nav2 체크 / LLM 진단
130
+ uvx ros-checker nav2 --source cli
131
+ uvx ros-checker analyze --source cli
132
+ ```
133
+
134
+ > **동작 원리**: `uvx`는 격리 환경을 만들지만 시스템 파이썬을 사용하므로 rclpy가 import 가능한 경우 rclpy 소스가 동작합니다. rclpy가 없거나 `~/.ros` 로그 문제가 있으면 `--source cli`로 `ros2` CLI만 사용해 동작합니다. 로봇에는 `ros2` CLI가 항상 있으므로 `--source cli`가 가장 안정적입니다.
135
+ >
136
+ > 설정은 cwd가 아닌 **플랫폼 기본 경로**에서 읽으므로, 설정 파일이 없어도 기본값으로 동작합니다. 사용자 설정이 필요하면 `uvx ros-checker config init`로 기본 config를 만든 뒤 `config set`으로 수정하세요.
137
+
138
+ ## Docker 사용
139
+
140
+ 체커는 ROS2 그래프의 **노드로 참여**하므로, ROS2 컨테이너와 **같은 네트워크 + 동일 `ROS_DOMAIN_ID`**로 실행해야 합니다.
141
+
142
+ ```bash
143
+ docker compose build
144
+ docker compose up -d ros2-system # ROS2 시스템(예: talker) 기동
145
+ docker compose run --rm checker scan
146
+ docker compose run --rm checker nav2
147
+ docker compose run --rm checker analyze
148
+ ```
149
+
150
+ 실제 Nav2/로봇 시스템을 사용한다면 `docker-compose.yml`의 `ros2-system` 서비스를 해당 이미지로 교체하세요.
151
+
152
+ ## 개발
153
+
154
+ ```bash
155
+ uv sync --group dev
156
+ uv run ruff check .
157
+ uv run ruff format --check .
158
+ uv run pytest
159
+ ```
160
+
161
+ > rclpy 통합 테스트는 `~/.ros`에 로그를 쓰므로, 읽기 전용 환경에서는
162
+ > `ROS_LOG_DIR`을 임시 경로로 지정하세요. 통합 테스트는 자체적으로 임시
163
+ > 디렉터리를 사용합니다.
164
+
165
+ ## 아키텍처
166
+
167
+ ```
168
+ ┌─────────────────────────────────────────────────────┐
169
+ │ ros-checker CLI (wpycli 기반) │
170
+ │ ┌──────────────┐ ┌──────────────┐ ┌───────────┐ │
171
+ │ │ Graph │ │ Health │ │ LLM │ │
172
+ │ │ Introspection│→ │ Check Engine │→ │ Analyzer │ │
173
+ │ │ (rclpy) │ │ (rules) │ │ (provider)│ │
174
+ │ └──────────────┘ └──────────────┘ └───────────┘ │
175
+ │ │ │ │ │
176
+ │ ┌─────▼─────┐ ┌─────▼─────┐ ┌─────▼─────┐ │
177
+ │ │ ROS2 Graph│ │ Nav2 │ │ ollama / │ │
178
+ │ │ (DDS) │ │ Checker │ │ AzureOpenAI│ │
179
+ │ └───────────┘ └───────────┘ └───────────┘ │
180
+ └─────────────────────────────────────────────────────┘
181
+ ```
182
+
183
+ - `src/ros_checker/graph/` — ROS2 그래프 인트로스펙션 (rclpy + Mock)
184
+ - `src/ros_checker/health/` — 헬스 체크 엔진 + Nav2 규칙
185
+ - `src/ros_checker/llm/` — LLM 프로바이더 추상화 (ollama/Azure OpenAI)
186
+ - `src/ros_checker/report/` — 테이블/JSON 리포트 렌더링
187
+
188
+ ## 라이선스
189
+
190
+ [MIT](LICENSE) 라이선스로 배포됩니다.
@@ -0,0 +1,177 @@
1
+ # ros_checker
2
+
3
+ ROS2 토픽/노드/서비스/액션을 분석해 **신호 수신 여부**와 **Nav2 구동 가능성**을 체크하고, **LLM(ollama / Azure OpenAI)**으로 자연어 진단을 제공하는 CLI 앱입니다.
4
+
5
+ 로컬(호스트 ROS2)과 Docker(컨테이너 ROS2) 환경 모두에서 동작합니다.
6
+
7
+ ## 기능
8
+
9
+ | 커맨드 | 설명 |
10
+ |---|---|
11
+ | `ros-checker scan` | ROS2 그래프 스캔 — 토픽/노드/서비스/액션, 토픽별 hz·대역폭 |
12
+ | `ros-checker health` | 토픽 신호 수신, 노드 존재, 서비스 호출 헬스 체크 |
13
+ | `ros-checker nav2` | Nav2 구동 가능성 체크 (라이프사이클, costmap, cmd_vel, 액션) |
14
+ | `ros-checker analyze` | 수집 데이터를 LLM으로 자연어 진단 |
15
+ | `ros-checker config` | 설정 출력 (`config init`/`set`으로 생성·수정) |
16
+
17
+ ## 문서
18
+
19
+ - [AGENTS.md](AGENTS.md) — 에이전트/개발자용 개발 가이드 (TDD, 스타일, 명령어)
20
+ - [CONTRIBUTING.md](CONTRIBUTING.md) — 기여 가이드
21
+ - [SECURITY.md](SECURITY.md) — 보안 취약점 보고 절차
22
+ - [docs/PLAN.md](docs/PLAN.md) — 초기 구현 계획
23
+
24
+ ## 요구사항
25
+
26
+ - Python 3.12
27
+ - ROS2 (Jazzy 등) — `rclpy` 필요. `source /opt/ros/<distro>/setup.bash` 후 실행
28
+ - LLM: ollama(로컬) 또는 Azure OpenAI(클라우드)
29
+
30
+ ## 설치 및 실행 (로컬)
31
+
32
+ ```bash
33
+ uv sync --group dev
34
+ source /opt/ros/<distro>/setup.bash
35
+
36
+ # 그래프 스캔
37
+ uv run ros-checker scan
38
+
39
+ # 헬스 체크
40
+ uv run ros-checker health
41
+
42
+ # Nav2 구동 가능성
43
+ uv run ros-checker nav2
44
+
45
+ # LLM 진단 (ollama 기본)
46
+ uv run ros-checker analyze
47
+ ```
48
+
49
+ > ROS2가 없는 환경에서도 `--mock` 플래그로 Mock 그래프를 사용해 기능을 확인할 수 있습니다.
50
+ > `uv run ros-checker nav2 --mock`
51
+
52
+ ## 설정
53
+
54
+ 설정은 **플랫폼 표준 설정 디렉터리**의 `config.toml`에서 읽습니다.
55
+
56
+ | 플랫폼 | 기본 경로 |
57
+ |---|---|
58
+ | Linux | `$XDG_CONFIG_HOME/ros-checker/config.toml` (기본 `~/.config/ros-checker/config.toml`) |
59
+ | macOS | `~/Library/Application Support/ros-checker/config.toml` |
60
+ | Windows | `%APPDATA%\ros-checker\config.toml` |
61
+
62
+ `config` 커맨드로 관리합니다.
63
+
64
+ ```bash
65
+ # 기본 config.toml 생성
66
+ ros-checker config init
67
+
68
+ # 항목 수정·저장 (점 표기 키)
69
+ ros-checker config set llm.provider azure
70
+ ros-checker config set llm.model gpt-4o
71
+ ros-checker config set llm.timeout 30
72
+
73
+ # 현재 유효 설정 출력
74
+ ros-checker config
75
+ ```
76
+
77
+ 설정 파일이나 `.env`가 없어도 **내장 기본값으로 동작**하므로, uvx 등에서 별도 파일 없이 바로 실행할 수 있습니다. 파일을 지정하려면 `-c/--config`와 `--dotenv` 플래그를 사용합니다.
78
+
79
+ ## LLM 설정
80
+
81
+ `config init`/`config set`으로 생성한 설정 파일이나 `.env`로 프로바이더를 선택합니다.
82
+
83
+ **ollama (기본)**
84
+ ```toml
85
+ [llm]
86
+ provider = "ollama"
87
+ base_url = "http://localhost:11434"
88
+ model = "llama3.2"
89
+ ```
90
+
91
+ **Azure OpenAI**
92
+ ```toml
93
+ [llm]
94
+ provider = "azure"
95
+ base_url = "https://<resource>.openai.azure.com"
96
+ model = "<deployment-name>"
97
+ api_key = "<your-api-key>"
98
+ ```
99
+
100
+ 환경 변수로도 설정 가능합니다 (`ROS_CHECKER_LLM__PROVIDER` 등, `.env.example` 참고).
101
+
102
+ ## uvx로 실행 (로봇에서)
103
+
104
+ 패키지를 PyPI에 배포하면 로봇에서 `uvx`로 설치 없이 실행할 수 있습니다.
105
+
106
+ ```bash
107
+ # ROS2 환경 source 후
108
+ source /opt/ros/<distro>/setup.bash
109
+
110
+ # 그래프 스캔 (rclpy 없으면 자동으로 ros2 CLI 사용)
111
+ uvx ros-checker scan
112
+
113
+ # CLI 소스 명시 (ros2 CLI만 필요, 가장 견고)
114
+ uvx ros-checker scan --source cli
115
+
116
+ # Nav2 체크 / LLM 진단
117
+ uvx ros-checker nav2 --source cli
118
+ uvx ros-checker analyze --source cli
119
+ ```
120
+
121
+ > **동작 원리**: `uvx`는 격리 환경을 만들지만 시스템 파이썬을 사용하므로 rclpy가 import 가능한 경우 rclpy 소스가 동작합니다. rclpy가 없거나 `~/.ros` 로그 문제가 있으면 `--source cli`로 `ros2` CLI만 사용해 동작합니다. 로봇에는 `ros2` CLI가 항상 있으므로 `--source cli`가 가장 안정적입니다.
122
+ >
123
+ > 설정은 cwd가 아닌 **플랫폼 기본 경로**에서 읽으므로, 설정 파일이 없어도 기본값으로 동작합니다. 사용자 설정이 필요하면 `uvx ros-checker config init`로 기본 config를 만든 뒤 `config set`으로 수정하세요.
124
+
125
+ ## Docker 사용
126
+
127
+ 체커는 ROS2 그래프의 **노드로 참여**하므로, ROS2 컨테이너와 **같은 네트워크 + 동일 `ROS_DOMAIN_ID`**로 실행해야 합니다.
128
+
129
+ ```bash
130
+ docker compose build
131
+ docker compose up -d ros2-system # ROS2 시스템(예: talker) 기동
132
+ docker compose run --rm checker scan
133
+ docker compose run --rm checker nav2
134
+ docker compose run --rm checker analyze
135
+ ```
136
+
137
+ 실제 Nav2/로봇 시스템을 사용한다면 `docker-compose.yml`의 `ros2-system` 서비스를 해당 이미지로 교체하세요.
138
+
139
+ ## 개발
140
+
141
+ ```bash
142
+ uv sync --group dev
143
+ uv run ruff check .
144
+ uv run ruff format --check .
145
+ uv run pytest
146
+ ```
147
+
148
+ > rclpy 통합 테스트는 `~/.ros`에 로그를 쓰므로, 읽기 전용 환경에서는
149
+ > `ROS_LOG_DIR`을 임시 경로로 지정하세요. 통합 테스트는 자체적으로 임시
150
+ > 디렉터리를 사용합니다.
151
+
152
+ ## 아키텍처
153
+
154
+ ```
155
+ ┌─────────────────────────────────────────────────────┐
156
+ │ ros-checker CLI (wpycli 기반) │
157
+ │ ┌──────────────┐ ┌──────────────┐ ┌───────────┐ │
158
+ │ │ Graph │ │ Health │ │ LLM │ │
159
+ │ │ Introspection│→ │ Check Engine │→ │ Analyzer │ │
160
+ │ │ (rclpy) │ │ (rules) │ │ (provider)│ │
161
+ │ └──────────────┘ └──────────────┘ └───────────┘ │
162
+ │ │ │ │ │
163
+ │ ┌─────▼─────┐ ┌─────▼─────┐ ┌─────▼─────┐ │
164
+ │ │ ROS2 Graph│ │ Nav2 │ │ ollama / │ │
165
+ │ │ (DDS) │ │ Checker │ │ AzureOpenAI│ │
166
+ │ └───────────┘ └───────────┘ └───────────┘ │
167
+ └─────────────────────────────────────────────────────┘
168
+ ```
169
+
170
+ - `src/ros_checker/graph/` — ROS2 그래프 인트로스펙션 (rclpy + Mock)
171
+ - `src/ros_checker/health/` — 헬스 체크 엔진 + Nav2 규칙
172
+ - `src/ros_checker/llm/` — LLM 프로바이더 추상화 (ollama/Azure OpenAI)
173
+ - `src/ros_checker/report/` — 테이블/JSON 리포트 렌더링
174
+
175
+ ## 라이선스
176
+
177
+ [MIT](LICENSE) 라이선스로 배포됩니다.
@@ -0,0 +1,62 @@
1
+ [project]
2
+ name = "ros_checker"
3
+ version = "0.1.0"
4
+ description = "ROS2 토픽/노드/서비스/액션을 분석하고 Nav2 구동 여부를 LLM으로 진단하는 CLI 앱"
5
+ readme = "README.md"
6
+ requires-python = ">=3.12"
7
+ dependencies = [
8
+ "wpyconf",
9
+ "wpylog",
10
+ "wpycli",
11
+ "httpx>=0.27",
12
+ "numpy"
13
+ ]
14
+
15
+ [project.scripts]
16
+ ros-checker = "ros_checker.main:main"
17
+ [build-system]
18
+ requires = ["hatchling"]
19
+ build-backend = "hatchling.build"
20
+
21
+ [tool.hatch.metadata]
22
+ allow-direct-references = true
23
+
24
+ [tool.hatch.build]
25
+ exclude = [
26
+ "/.git",
27
+ "/.venv",
28
+ "/.uv-cache",
29
+ "/.ros-home",
30
+ "/.pytest_cache",
31
+ "/.ruff_cache",
32
+ "/build",
33
+ "/dist",
34
+ "*.egg-info",
35
+ ]
36
+
37
+ # PyPI 소스 배포는 필요한 파일만 화이트리스트로 포함
38
+ [tool.hatch.build.targets.sdist]
39
+ include = [
40
+ "/src",
41
+ "/tests",
42
+ "/README.md",
43
+ "/LICENSE",
44
+ ]
45
+
46
+ [tool.uv]
47
+ package = true
48
+
49
+ [tool.ruff]
50
+ target-version = "py312"
51
+ line-length = 100
52
+
53
+ [tool.ruff.lint]
54
+ select = ["E4", "E7", "E9", "F", "I"]
55
+
56
+ [dependency-groups]
57
+ dev = ["ruff", "pytest"]
58
+
59
+ [tool.pytest.ini_options]
60
+ # ROS2 환경이 source된 셸에서 launch_testing 등 ROS2 pytest 플러그인이
61
+ # 자동 로드되어 실패하는 것을 방지한다.
62
+ addopts = "-p no:launch_testing -p no:launch_ros"
@@ -0,0 +1,5 @@
1
+ """ros_checker — ROS2 토픽/노드/서비스/액션 분석 및 Nav2 구동 진단 CLI."""
2
+
3
+ __version__ = "0.1.0"
4
+
5
+ __all__ = ["__version__"]
@@ -0,0 +1,34 @@
1
+ """ROS2 그래프 인트로스펙션 패키지."""
2
+
3
+ from .cli import Ros2CliGraphSource
4
+ from .mock import MockGraphSource, build_mock_snapshot
5
+ from .models import (
6
+ ActionInfo,
7
+ GraphSnapshot,
8
+ NodeInfo,
9
+ ServiceInfo,
10
+ TopicInfo,
11
+ )
12
+ from .source import (
13
+ GraphSource,
14
+ RclpyGraphSource,
15
+ detect_domain_id,
16
+ detect_ros_distro,
17
+ rclpy_available,
18
+ )
19
+
20
+ __all__ = [
21
+ "ActionInfo",
22
+ "GraphSnapshot",
23
+ "GraphSource",
24
+ "MockGraphSource",
25
+ "NodeInfo",
26
+ "RclpyGraphSource",
27
+ "Ros2CliGraphSource",
28
+ "ServiceInfo",
29
+ "TopicInfo",
30
+ "build_mock_snapshot",
31
+ "detect_domain_id",
32
+ "detect_ros_distro",
33
+ "rclpy_available",
34
+ ]