docs: archive Reviewer cline PASS report and update submodule doc links
This commit is contained in:
@@ -0,0 +1,350 @@
|
||||
# Cross-Code Review Report — Job 869d7874
|
||||
|
||||
- **Reviewer**: cline (session: `herdr:canary-projects-multi-agent-mux-creator-cline`)
|
||||
- **Job ID**: 869d7874
|
||||
- **Review Target**: Commit `12ba30b` — `docs: move PRIVATE_SERVER.md and NATS_REPORT.md to nats-docker submodule`
|
||||
- **Base**: `origin/main` (commit `629a67f`)
|
||||
- **Date**: 2026-08-23
|
||||
- **Scope**: Pre-push review of all local commits ahead of remote (`origin/main..HEAD`), focusing on Git submodule configuration, test guard submodule compatibility, and legacy file removal/migration.
|
||||
|
||||
---
|
||||
|
||||
## 1. Executive Summary
|
||||
|
||||
Commit `12ba30b` migrates two documentation files (`PRIVATE_SERVER.md`, `NATS_REPORT.md`) from the repository root into the `nats-docker` Git submodule and updates the deploy-freshness test suite to resolve their new locations dynamically. The submodule pointer is bumped from `c86cc98` → `a4b6e49`.
|
||||
|
||||
**Changeset**: 4 files changed, +26 insertions, -772 deletions:
|
||||
- `NATS_REPORT.md` — **deleted** from root (176 lines)
|
||||
- `PRIVATE_SERVER.md` — **deleted** from root (584 lines)
|
||||
- `nats-docker` — submodule pointer updated (`c86cc98` → `a4b6e49`)
|
||||
- `tests/test_deploy_freshness.py` — added `_resolve_private_server_doc()`, updated D-11~D-19 + D-23 to use `PRIVATE_SERVER_DOC_PATH`
|
||||
|
||||
**Verdict**: **[VERDICT: PASS]** — The migration is clean, byte-identical, and test-compatible. Two non-blocking documentation findings (orphaned markdown links and stale text references in `implementation_plan.md`).
|
||||
|
||||
---
|
||||
|
||||
## 2. Changeset Overview
|
||||
|
||||
```
|
||||
12ba30b docs: move PRIVATE_SERVER.md and NATS_REPORT.md to nats-docker submodule
|
||||
|
||||
NATS_REPORT.md | 176 ---
|
||||
PRIVATE_SERVER.md | 584 ----
|
||||
nats-docker | 2 +-
|
||||
tests/test_deploy_freshness.py | 36 ++-
|
||||
4 files changed, 26 insertions(+), 772 deletions(-)
|
||||
```
|
||||
|
||||
| File | Change | Lines |
|
||||
|---|---|---|
|
||||
| `NATS_REPORT.md` | Deleted from root; content now lives at `nats-docker/NATS_REPORT.md` | -176 |
|
||||
| `PRIVATE_SERVER.md` | Deleted from root; content now lives at `nats-docker/PRIVATE_SERVER.md` | -584 |
|
||||
| `nats-docker` | Submodule gitlink pointer updated `c86cc98` → `a4b6e49` | ±1 |
|
||||
| `tests/test_deploy_freshness.py` | New `_resolve_private_server_doc()` resolver; 9 test functions updated to use `PRIVATE_SERVER_DOC_PATH` | +26/-10 |
|
||||
|
||||
### Commit Context (Accumulated Changeset `3523b9b..12ba30b`)
|
||||
|
||||
The brief references the broader range `3523b9b..12ba30b` (4 commits). The first 3 commits (`3523b9b`, `b09d420`, `629a67f`) were already reviewed in job `1ed5cf56` (Track 1R Docker assets + D-22~D-30 guards). This review focuses on the new unpushed commit `12ba30b`, which is the final step in the submodule migration chain:
|
||||
|
||||
| Commit | Description | Reviewed In |
|
||||
|---|---|---|
|
||||
| `3523b9b` | Established remote Docker deployment plan + D-15~D-21 guards | Job `1ed5cf56` |
|
||||
| `b09d420` | Created `docker/` assets + D-22~D-30 guards | Job `1ed5cf56` |
|
||||
| `629a67f` | Converted `docker/` to `nats-docker` submodule | Job `1ed5cf56` (prior state) |
|
||||
| **`12ba30b`** | **Moved docs to submodule + test resolver update** | **This review** |
|
||||
|
||||
---
|
||||
|
||||
## 3. Review Area 1 — Git Submodule Configuration
|
||||
|
||||
### 3.1 `.gitmodules` ✅
|
||||
|
||||
```ini
|
||||
[submodule "nats-docker"]
|
||||
path = nats-docker
|
||||
url = https://git.godopu.com/laa/nats-docker
|
||||
```
|
||||
|
||||
- **Path**: `nats-docker` (relative to repo root) — correct
|
||||
- **URL**: `https://git.godopu.com/laa/nats-docker` — well-formed HTTPS URL
|
||||
- **Single submodule**: Only one submodule entry; no orphan or duplicate entries
|
||||
|
||||
### 3.2 Submodule Pointer ✅
|
||||
|
||||
```
|
||||
Parent records: Subproject commit a4b6e49a1f01dac4974fcd3c7e4e9382be665e33
|
||||
Submodule HEAD: a4b6e49a1f01dac4974fcd3c7e4e9382be665e33
|
||||
git submodule status: a4b6e49a1f01dac4974fcd3c7e4e9382be665e33 nats-docker (heads/main)
|
||||
```
|
||||
|
||||
- Parent repo's gitlink and submodule's actual HEAD are **identical** (`a4b6e49`) — no detached/dirty state.
|
||||
- Mode `160000` (gitlink) — correct submodule entry type.
|
||||
- Previous pointer `c86cc98` → new pointer `a4b6e49` — the bump corresponds to the commit that added `PRIVATE_SERVER.md` and `NATS_REPORT.md` to the submodule.
|
||||
|
||||
### 3.3 Submodule Git Directory ✅
|
||||
|
||||
```
|
||||
nats-docker/.git → gitdir: ../.git/modules/docker
|
||||
.git/modules/docker/HEAD → ref: refs/heads/main
|
||||
```
|
||||
|
||||
- Submodule's `.git` file correctly points to the parent's `.git/modules/docker/` directory (standard Git submodule layout).
|
||||
- HEAD tracks `refs/heads/main` — clean checkout, not detached.
|
||||
|
||||
### 3.4 Submodule Contents ✅
|
||||
|
||||
```
|
||||
nats-docker/
|
||||
├── .agents/
|
||||
├── .git (gitdir)
|
||||
├── .gitignore
|
||||
├── docker/
|
||||
│ ├── .env.example
|
||||
│ ├── docker-compose.yaml
|
||||
│ ├── nats.conf
|
||||
│ └── README.md
|
||||
├── NATS_REPORT.md
|
||||
├── PRIVATE_SERVER.md
|
||||
└── README.md
|
||||
```
|
||||
|
||||
All expected assets are present. The `docker/` directory (moved in commit `629a67f`) and the two documentation files (moved in this commit `12ba30b`) coexist cleanly in the submodule.
|
||||
|
||||
### 3.5 Byte-Level Content Verification ✅
|
||||
|
||||
Verified that the moved files are **byte-for-byte identical** to the originals deleted from root:
|
||||
|
||||
| File | Old root path | New submodule path | `diff` result |
|
||||
|---|---|---|---|
|
||||
| `PRIVATE_SERVER.md` | 584 lines (deleted) | `nats-docker/PRIVATE_SERVER.md` (584 lines) | **MATCH** (0 diff) |
|
||||
| `NATS_REPORT.md` | 176 lines (deleted) | `nats-docker/NATS_REPORT.md` (176 lines) | **MATCH** (0 diff) |
|
||||
|
||||
No content was modified during the migration — pure file move.
|
||||
|
||||
### 3.6 Submodule `.gitignore` ✅
|
||||
|
||||
```gitignore
|
||||
# Environment files
|
||||
.env
|
||||
*.env
|
||||
!*.env.example
|
||||
|
||||
# Runtime data & volumes
|
||||
docker/volumes/
|
||||
volumes/
|
||||
|
||||
# Logs
|
||||
*.log
|
||||
```
|
||||
|
||||
- `.env` and `*.env` are ignored; `!*.env.example` un-ignores the template — consistent with the parent repo's secret hygiene pattern.
|
||||
- `docker/volumes/` is ignored — runtime data won't leak into the submodule repo.
|
||||
|
||||
---
|
||||
|
||||
## 4. Review Area 2 — Test Guards (Submodule Compatibility)
|
||||
|
||||
### 4.1 `_resolve_docker_dir()` ✅ (pre-existing, from commit `629a67f`)
|
||||
|
||||
```python
|
||||
def _resolve_docker_dir() -> str:
|
||||
for candidate in [
|
||||
os.path.join(REPO_ROOT, "nats-docker", "docker"), # submodule path (canonical)
|
||||
os.path.join(REPO_ROOT, "nats-docker"), # flat submodule layout
|
||||
os.path.join(REPO_ROOT, "docker"), # legacy root path
|
||||
]:
|
||||
if os.path.exists(os.path.join(candidate, "docker-compose.yaml")):
|
||||
return candidate
|
||||
return os.path.join(REPO_ROOT, "nats-docker", "docker") # fail-safe default
|
||||
```
|
||||
|
||||
- **Search order**: submodule → flat submodule → legacy root. Correct priority (new canonical first, legacy fallback last).
|
||||
- **Existence check**: Probes for `docker-compose.yaml` specifically, preventing false matches from empty directories.
|
||||
- **Fail-safe default**: Returns the expected canonical path even if nothing exists, so downstream assertions produce meaningful "file missing" errors rather than `None`-related crashes.
|
||||
- All D-22~D-30 guards use `DOCKER_DIR`, `COMPOSE_PATH`, `NATS_CONF_PATH`, `ENV_EXAMPLE_PATH`, `DOCKER_README_PATH` — all derived from this resolver. ✅
|
||||
|
||||
### 4.2 `_resolve_private_server_doc()` ✅ (new in this commit)
|
||||
|
||||
```python
|
||||
def _resolve_private_server_doc() -> str:
|
||||
for candidate in [
|
||||
os.path.join(REPO_ROOT, "nats-docker", "PRIVATE_SERVER.md"), # submodule (canonical)
|
||||
os.path.join(REPO_ROOT, "nats-docker", "docs", "PRIVATE_SERVER.md"), # alternate layout
|
||||
os.path.join(REPO_ROOT, "PRIVATE_SERVER.md"), # legacy root
|
||||
]:
|
||||
if os.path.exists(candidate):
|
||||
return candidate
|
||||
return os.path.join(REPO_ROOT, "nats-docker", "PRIVATE_SERVER.md") # fail-safe default
|
||||
```
|
||||
|
||||
- **Symmetrical design**: Mirrors `_resolve_docker_dir()`'s pattern — submodule first, legacy fallback last, fail-safe default.
|
||||
- **Alternate layout**: Includes `nats-docker/docs/` as a candidate, future-proofing against a potential reorganization within the submodule.
|
||||
- **Module-level constant**: `PRIVATE_SERVER_DOC_PATH = _resolve_private_server_doc()` is evaluated once at import time, not per-test — consistent with `DOCKER_DIR`.
|
||||
|
||||
### 4.3 D-11 ~ D-19 Migration ✅
|
||||
|
||||
Nine test functions updated from hardcoded `os.path.join(REPO_ROOT, "PRIVATE_SERVER.md")` to the new `PRIVATE_SERVER_DOC_PATH`:
|
||||
|
||||
| Guard | What it checks | Path source |
|
||||
|---|---|---|
|
||||
| D-11 | PRIVATE_SERVER.md env names valid | `PRIVATE_SERVER_DOC_PATH` ✅ |
|
||||
| D-12 | No deprecated MAM_MQTT_* in code fences | `PRIVATE_SERVER_DOC_PATH` ✅ |
|
||||
| D-13 | nats config blocks valid (mqtt {) | `PRIVATE_SERVER_DOC_PATH` ✅ |
|
||||
| D-14 | CLI args valid | `PRIVATE_SERVER_DOC_PATH` ✅ |
|
||||
| D-15 | store_dir valid + unquoted heredoc | `PRIVATE_SERVER_DOC_PATH` ✅ |
|
||||
| D-16 | nats image alpine-pinned | `PRIVATE_SERVER_DOC_PATH` ✅ |
|
||||
| D-17 | Port 8222 localhost-bound | `PRIVATE_SERVER_DOC_PATH` ✅ |
|
||||
| D-18 | TLS examples use domain names | `PRIVATE_SERVER_DOC_PATH` ✅ |
|
||||
| D-19 | Subject literals match topic root | `PRIVATE_SERVER_DOC_PATH` ✅ |
|
||||
|
||||
All 9 functions now resolve the document through the submodule-aware resolver. The assertion message in D-11 was also improved: `"PRIVATE_SERVER.md missing"` → `f"PRIVATE_SERVER.md missing at {doc_path}"` — provides the resolved path in the error, aiding debugging.
|
||||
|
||||
### 4.4 D-23 Cross-Document Tag Matching ✅
|
||||
|
||||
D-23 verifies that the compose image tag appears in `PRIVATE_SERVER.md`. This test was updated to use `PRIVATE_SERVER_DOC_PATH` instead of the hardcoded root path. Since the content is byte-identical (§3.5), the tag-matching logic produces the same result.
|
||||
|
||||
### 4.5 D-22 ~ D-30 (Docker Assets Guards) ✅
|
||||
|
||||
These guards use `DOCKER_DIR` (from `_resolve_docker_dir()`) and were **not modified** in this commit — they were already submodule-compatible from commit `629a67f`. Verified all 9 guards resolve through the correct paths:
|
||||
|
||||
| Guard | Path variables used | Submodule-aware? |
|
||||
|---|---|---|
|
||||
| D-22 | `COMPOSE_PATH`, `NATS_CONF_PATH`, `ENV_EXAMPLE_PATH`, `DOCKER_README_PATH` | ✅ (via `DOCKER_DIR`) |
|
||||
| D-23 | `COMPOSE_PATH` + `PRIVATE_SERVER_DOC_PATH` | ✅ |
|
||||
| D-24 | `COMPOSE_PATH` | ✅ |
|
||||
| D-25 | `NATS_CONF_PATH`, `ENV_EXAMPLE_PATH` | ✅ |
|
||||
| D-26 | `NATS_CONF_PATH`, `COMPOSE_PATH` | ✅ |
|
||||
| D-27 | `NATS_CONF_PATH` + `mqtt_common.DEFAULT_TOPIC_ROOT` | ✅ |
|
||||
| D-28 | `COMPOSE_PATH` | ✅ |
|
||||
| D-29 | `DOCKER_DIR`, `ENV_EXAMPLE_PATH` + submodule-aware git commands | ✅ |
|
||||
| D-30 | `NATS_CONF_PATH` | ✅ |
|
||||
|
||||
### 4.6 D-29 Submodule-Aware Git Commands ✅ (pre-existing, critical)
|
||||
|
||||
D-29 is the most submodule-sensitive guard. It runs `git check-ignore` and `git ls-files` to verify `.env` is ignored and untracked:
|
||||
|
||||
```python
|
||||
is_submodule = os.path.exists(os.path.join(REPO_ROOT, ".gitmodules")) and "nats-docker" in DOCKER_DIR
|
||||
target_repo = os.path.join(REPO_ROOT, "nats-docker") if is_submodule else REPO_ROOT
|
||||
rel_env = os.path.relpath(os.path.join(DOCKER_DIR, ".env"), target_repo)
|
||||
# ... runs git check-ignore / ls-files with cwd=target_repo
|
||||
```
|
||||
|
||||
- **Submodule detection**: Checks both `.gitmodules` existence AND that `DOCKER_DIR` contains `nats-docker` — robust dual-condition check.
|
||||
- **Correct repo target**: When submodule is detected, git commands run with `cwd=nats-docker` (the submodule's own git repo), not the parent — ensuring the submodule's `.gitignore` is the one being checked.
|
||||
- **Relative path calculation**: `os.path.relpath(...)` computes the correct relative path from the submodule root to `docker/.env`.
|
||||
|
||||
This is correctly implemented and will catch secrets leakage in both submodule and non-submodule layouts.
|
||||
|
||||
---
|
||||
|
||||
## 5. Review Area 3 — Legacy File Removal & Migration
|
||||
|
||||
### 5.1 Root-Level Deletions ✅
|
||||
|
||||
```
|
||||
git diff-tree --name-status -r 12ba30b:
|
||||
D NATS_REPORT.md
|
||||
D PRIVATE_SERVER.md
|
||||
M nats-docker
|
||||
M tests/test_deploy_freshness.py
|
||||
```
|
||||
|
||||
- `NATS_REPORT.md` — deleted from root (176 lines). Confirmed absent: `ls NATS_REPORT.md` → "No such file or directory".
|
||||
- `PRIVATE_SERVER.md` — deleted from root (584 lines). Confirmed absent: `ls PRIVATE_SERVER.md` → "No such file or directory".
|
||||
- `docker/` — already removed in prior commit `629a67f`; confirmed absent from root.
|
||||
|
||||
### 5.2 Submodule Migration Verification ✅
|
||||
|
||||
| File | Root (deleted) | Submodule (new home) | Content match |
|
||||
|---|---|---|---|
|
||||
| `PRIVATE_SERVER.md` | 584 lines | `nats-docker/PRIVATE_SERVER.md` (584 lines) | **byte-identical** (diff: 0 lines) |
|
||||
| `NATS_REPORT.md` | 176 lines | `nats-docker/NATS_REPORT.md` (176 lines) | **byte-identical** (diff: 0 lines) |
|
||||
|
||||
The migration is a pure file move — no content was modified, truncated, or reformatted. This preserves all documentation parity guarantees established in the prior review (job `1ed5cf56`).
|
||||
|
||||
### 5.3 No Orphaned Imports or Code References ✅
|
||||
|
||||
Searched all `.py`, `.sh`, `.md`, `.json` files (excluding `.mam/jobs`, `.agents/reports`, `nats-docker/`, `tests/test_deploy_freshness.py`) for references to the old root paths:
|
||||
|
||||
- **No Python/shell code** references root-level `PRIVATE_SERVER.md` or `NATS_REPORT.md` — only the test file (already updated) and documentation files contain references.
|
||||
- **No `docker/` bare path references** in code — the test file's `_resolve_docker_dir()` handles this via the fallback chain.
|
||||
|
||||
### 5.4 Submodule as Single Source of Truth ✅
|
||||
|
||||
The `nats-docker` submodule now contains the complete deployment stack:
|
||||
- `docker/` — canonical deployment assets (compose, nats.conf, .env.example, README)
|
||||
- `PRIVATE_SERVER.md` — deployment guide with §9 verification playbook
|
||||
- `NATS_REPORT.md` — MQTT vs NATS feasibility analysis
|
||||
- `README.md` — submodule-level overview
|
||||
|
||||
This consolidates all deployment-related artifacts in one versioned repository, enabling independent updates to the deployment stack without coupling to the MAM framework release cycle.
|
||||
|
||||
---
|
||||
|
||||
## 6. Findings
|
||||
|
||||
### M-1: Orphaned Markdown Links in `implementation_plan.md` — Medium
|
||||
|
||||
**Location**: `implementation_plan.md` lines 7, 147
|
||||
|
||||
```
|
||||
Line 7: [`NATS_REPORT.md`](NATS_REPORT.md), [`PRIVATE_SERVER.md`](PRIVATE_SERVER.md)
|
||||
Line 147: | [`PRIVATE_SERVER.md`](PRIVATE_SERVER.md) | 스파이크 결과 반영 및 최종 가이드 확정 |
|
||||
```
|
||||
|
||||
**Issue**: These markdown links use relative paths to the repository root. Since both files moved to the `nats-docker/` submodule, the links now resolve to non-existent paths and will 404 in GitHub/rendered markdown.
|
||||
|
||||
**Recommendation**: Update to `[NATS_REPORT.md](nats-docker/NATS_REPORT.md)` and `[PRIVATE_SERVER.md](nats-docker/PRIVATE_SERVER.md)`.
|
||||
|
||||
### L-1: Stale Text References in `implementation_plan.md` — Low
|
||||
|
||||
**Location**: Lines 23, 39, 112, 156, 172, 179 — text references to `PRIVATE_SERVER.md` and `docker/` without `nats-docker/` prefix. Not broken links, but don't indicate the new location.
|
||||
|
||||
### L-2: Stale Text References in `IMPROVEMENTS.md` — Low
|
||||
|
||||
**Location**: Lines 3, 4, 21, 77, 83, 84, 91, 100, 271 — text citations to `NATS_REPORT.md` sections. Content is accurate (section numbers unchanged) but file location moved.
|
||||
|
||||
### Positive Highlights
|
||||
|
||||
- **Byte-identical migration**: Both files moved with zero content modification.
|
||||
- **Symmetrical resolver design**: `_resolve_private_server_doc()` mirrors the proven `_resolve_docker_dir()` pattern.
|
||||
- **Backward-compatible fallback**: Both resolvers include legacy root path as fallback.
|
||||
- **D-29 submodule-awareness**: Correctly detects submodule layout and runs git commands against the correct repo.
|
||||
- **D-11 error improvement**: Assertion now includes resolved path for better debugging.
|
||||
- **Clean atomic commit**: Deletion, pointer bump, and test update in one commit — no intermediate broken states.
|
||||
- **No secrets in submodule**: `.gitignore` enforces same `.env` exclusion pattern.
|
||||
|
||||
### No Escalation Required
|
||||
|
||||
All findings are documentation-level (M/L severity). No blocking defects, security vulnerabilities, or correctness errors.
|
||||
|
||||
---
|
||||
|
||||
## 7. Full Test Suite
|
||||
|
||||
Command: `.venv/bin/python -m pytest tests/ -q`
|
||||
|
||||
```
|
||||
........................................................................ [ 23%]
|
||||
........................................................................ [ 47%]
|
||||
........................................................................ [ 70%]
|
||||
........................................................................ [ 94%]
|
||||
.................. [100%]
|
||||
306 passed in 352.84s (0:05:52)
|
||||
```
|
||||
|
||||
| Metric | Value |
|
||||
|---|---|
|
||||
| Total tests collected | 306 |
|
||||
| Passed | 306 |
|
||||
| Failed | 0 |
|
||||
| Errors | 0 |
|
||||
| Skipped | 0 |
|
||||
| Duration | 352.84s (5:52) |
|
||||
|
||||
**Result**: 100% pass rate, 0 regressions. Identical to the baseline established in job `1ed5cf56` (306 passed, 353.84s). The submodule migration introduced no test breakage — all D-11~D-30 guards correctly resolve the new submodule paths and pass.
|
||||
|
||||
---
|
||||
|
||||
[VERDICT: PASS]
|
||||
@@ -4,7 +4,7 @@
|
||||
- **작성/관리 주체**: Multi-Agent Orchestration Team (`claude`, `agy`, `cline`)
|
||||
- **기준 커밋**: `a9934ad` (276/276 baseline tests passing)
|
||||
- **문서 목적**: MAM의 메시징 인프라를 공개 HiveMQ 브로커에서 `nats-server` 전용 사설 브로커로 무중단 전환하기 위한 4개 트랙(Track 0~3)과 5단계 마일스톤(M0~M4)의 구체적 실행 지침 및 진행 상황 추적.
|
||||
- **연계 문서**: [`NATS_REPORT.md`](NATS_REPORT.md), [`PRIVATE_SERVER.md`](PRIVATE_SERVER.md), [`IMPROVEMENTS.md`](IMPROVEMENTS.md)
|
||||
- **연계 문서**: [`NATS_REPORT.md`](nats-docker/NATS_REPORT.md), [`PRIVATE_SERVER.md`](nats-docker/PRIVATE_SERVER.md), [`IMPROVEMENTS.md`](IMPROVEMENTS.md)
|
||||
|
||||
---
|
||||
|
||||
@@ -144,7 +144,7 @@ M0 (문서 정합성) ──> M1 (Track 0 내결함성) ──> M2a (로컬 스
|
||||
| [`MESSAGING.md`](MESSAGING.md) | 브로커 표준을 `nats-server`로 갱신, F-1/C1 해소 기록, F-5 영속 세션 서술 정정 |
|
||||
| [`IMPROVEMENTS.md`](IMPROVEMENTS.md) | A-2 완료 전환, B-14/B-15/B-16/O-5 해결 상태 갱신, B-17/B-18 신설 등록 |
|
||||
| [`VERSIONS.md`](VERSIONS.md) | `v2.0.0` 릴리스 노트에 메시징 백플레인 고도화 및 내결함성 패치 기록 |
|
||||
| [`PRIVATE_SERVER.md`](PRIVATE_SERVER.md) | 스파이크 결과 반영 및 최종 가이드 확정 |
|
||||
| [`PRIVATE_SERVER.md`](nats-docker/PRIVATE_SERVER.md) | 스파이크 결과 반영 및 최종 가이드 확정 |
|
||||
| [`deploy/install.sh`](deploy/install.sh) | `requirements.txt` 확인 (paho 유지) 및 개인 브로커 안내 추가 |
|
||||
| [`.mam.env`](.mam.env) | `MQTT_BROKER`, `MQTT_PORT`, `MQTT_TLS` 기본 템플릿 확정 |
|
||||
|
||||
|
||||
Reference in New Issue
Block a user