---
document_type: "implementation_guide"
service: "MOMENTRY_CORE"
title: "Momentry Core 版本紀錄"
date: "2026-04-25"
version: "V1.0"
status: "active"
owner: "Warren"
created_by: "OpenCode"
tags:
  - "momentry"
  - "core"
  - "版本紀錄"
ai_query_hints:
  - "查詢 Momentry Core 版本紀錄 的內容"
  - "Momentry Core 版本紀錄 的主要目的是什麼？"
  - "如何操作或實施 Momentry Core 版本紀錄？"
---

# Momentry Core 版本紀錄

## 版本命名規則

### Main Version (主版本)
```
v{major}.{minor}
例: v0.1, v0.2, v1.0
```

### Build Version (建置版本)
```
v{major}.{minor}.{YYYYMMDD_HHMMSS}
例: v0.1.20260325_143000
```

---

## 版本紀錄存放位置

```
/Users/accusys/momentry/versions/
├── current/                    # 目前使用版本
│   ├── binary                 # 當前 binary
│   └── version.json           # 版本資訊
│
├── releases/                  # Release 版本存放
│   ├── v0.1/
│   │   ├── v0.1.20260325_143000/
│   │   │   ├── binary
│   │   │   └── version.json
│   │   ├── v0.1.20260324_100000/
│   │   │   └── ...
│   │   └── release.json      # v0.1 版本總覽
│   │
│   └── v0.2/
│       └── ...
│
└── changelog.json             # 全域版本變更記錄
```

---

## version.json 格式

```json
{
  "version": "v0.1.20260325_143000",
  "main_version": "v0.1",
  "build_timestamp": "2026-03-25T14:30:00+08:00",
  "git_commit": "83ae050",
  "git_branch": "main",
  "git_message": "fix: save probe.json to OUTPUT_DIR instead of current directory",
  "features": [
    "API Key Authentication",
    "Job Worker System"
  ],
  "fixes": [
    "get_processor_results_by_job column mapping"
  ],
  "deployed_at": "2026-03-25T15:00:00+08:00",
  "deployed_by": "opencode",
  "status": "production"
}
```

---

## release.json 格式 (主版本總覽)

```json
{
  "version": "v0.1",
  "status": "production",
  "created_at": "2026-03-14T10:00:00+08:00",
  "current_build": "v0.1.20260325_143000",
  "builds": [
    {
      "build": "v0.1.20260325_143000",
      "date": "2026-03-25",
      "commits": ["83ae050", "171c36a"],
      "summary": "fix: save probe.json, add v2 backup versioning"
    },
    {
      "build": "v0.1.20260324_100000",
      "date": "2026-03-24",
      "commits": ["89fbfd6", "3edaf01"],
      "summary": "feat: add POST /api/v1/probe endpoint"
    }
  ],
  "changelog": [
    "## v0.1.20260325_143000",
    "- 修復 processor_results 欄位映射錯誤",
    "- 添加 API Key 認證",
    "",
    "## v0.1.20260324_100000",
    "- 新增 Probe API"
  ]
}
```

---

## changelog.json 格式 (全域變更記錄)

```json
{
  "updated_at": "2026-03-25T14:30:00+08:00",
  "versions": {
    "v0.1": {
      "status": "production",
      "current_build": "v0.1.20260325_143000",
      "build_count": 12
    },
    "v0.0": {
      "status": "deprecated",
      "final_build": "v0.0.20260310_090000"
    }
  },
  "recent_changes": [
    {
      "version": "v0.1.20260325_143000",
      "date": "2026-03-25",
      "changes": [
        {"type": "fix", "description": "get_processor_results_by_job column mapping"},
        {"type": "feat", "description": "API Key Authentication"}
      ]
    }
  ]
}
```

---

## Release Script

### /Users/accusys/momentry/scripts/release.sh

```bash
#!/bin/bash
set -e

SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
PROJECT_DIR="/Users/accusys/momentry_core_0.1"
VERSIONS_DIR="/Users/accusys/momentry/versions"
BACKUP_DIR="/Users/accusys/momentry/backup/bin"
CURRENT_BIN="/Users/accusys/momentry/bin/momentry"

# 顏色輸出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'

log_info() { echo -e "${GREEN}[INFO]${NC} $1"; }
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }

# 解析命令列參數
MAIN_VERSION=""
while [[ $# -gt 0 ]]; do
  case $1 in
    -v|--version)
      MAIN_VERSION="$2"
      shift 2
      ;;
    *)
      log_error "Unknown option: $1"
      exit 1
      ;;
  esac
done

if [ -z "$MAIN_VERSION" ]; then
  log_error "請指定主版本: ./release.sh -v v0.1"
  exit 1
fi

log_info "開始 Release ${MAIN_VERSION}..."

# 1. 取得 Git 資訊
GIT_COMMIT=$(git -C "$PROJECT_DIR" rev-parse --short HEAD)
GIT_BRANCH=$(git -C "$PROJECT_DIR" rev-parse --abbrev-ref HEAD)
GIT_MESSAGE=$(git -C "$PROJECT_DIR" log -1 --pretty=%s)
BUILD_TIMESTAMP=$(date +%Y%m%d_%H%M%S)
BUILD_VERSION="${MAIN_VERSION}.${BUILD_TIMESTAMP}"

log_info "Build Version: ${BUILD_VERSION}"
log_info "Git Commit: ${GIT_COMMIT}"

# 2. 創建版本目錄
BUILD_DIR="${VERSIONS_DIR}/releases/${MAIN_VERSION}/${BUILD_VERSION}"
mkdir -p "$BUILD_DIR"
mkdir -p "${VERSIONS_DIR}/current"
mkdir -p "$BACKUP_DIR"

# 3. 停止 Production Service
log_info "停止 Production Service..."
sudo launchctl unload /Library/LaunchDaemons/com.momentry.api.plist 2>/dev/null || true

# 4. 備份當前 Binary
if [ -f "$CURRENT_BIN" ]; then
  OLD_VERSION=$(cat "${VERSIONS_DIR}/current/version.json" 2>/dev/null | jq -r '.version // "unknown"')
  log_info "備份當前版本: $OLD_VERSION"
  cp "$CURRENT_BIN" "${BACKUP_DIR}/momentry_${OLD_VERSION}_$(date +%Y%m%d_%H%M%S)"
fi

# 5. 編譯 Release 版本
log_info "編譯 Release 版本..."
cd "$PROJECT_DIR"
cargo build --release --bin momentry

# 6. 複製到版本目錄
log_info "複製到版本目錄..."
cp target/release/momentry "${BUILD_DIR}/binary"
cp target/release/momentry "$CURRENT_BIN"

# 7. 生成 version.json
cat > "${BUILD_DIR}/version.json" << EOF
{
  "version": "${BUILD_VERSION}",
  "main_version": "${MAIN_VERSION}",
  "build_timestamp": "$(date -Iseconds)",
  "git_commit": "${GIT_COMMIT}",
  "git_branch": "${GIT_BRANCH}",
  "git_message": "${GIT_MESSAGE}",
  "features": [],
  "fixes": [],
  "deployed_at": null,
  "deployed_by": null,
  "status": "built"
}
EOF

# 8. 更新 current
cp "${BUILD_DIR}/version.json" "${VERSIONS_DIR}/current/version.json"

# 9. 更新 changelog.json
UPDATE_CHANGELOG="
import json
from datetime import datetime

changelog_path = '${VERSIONS_DIR}/changelog.json'
build_info = {
    'version': '${BUILD_VERSION}',
    'date': datetime.now().strftime('%Y-%m-%d'),
    'commit': '${GIT_COMMIT}',
    'message': '${GIT_MESSAGE}'
}

try:
    with open(changelog_path, 'r') as f:
        changelog = json.load(f)
except FileNotFoundError:
    changelog = {'updated_at': '', 'versions': {}, 'recent_changes': []}

changelog['updated_at'] = datetime.now().isoformat()
if '${MAIN_VERSION}' not in changelog['versions']:
    changelog['versions']['${MAIN_VERSION}'] = {'status': 'building', 'build_count': 0}

changelog['versions']['${MAIN_VERSION}']['build_count'] += 1
changelog['versions']['${MAIN_VERSION}']['current_build'] = '${BUILD_VERSION}'
changelog['recent_changes'].insert(0, build_info)

with open(changelog_path, 'w') as f:
    json.dump(changelog, f, indent=2, ensure_ascii=False)
"
python3 -c "$UPDATE_CHANGELOG"

# 10. 啟動 Production Service
log_info "啟動 Production Service..."
sudo launchctl load /Library/LaunchDaemons/com.momentry.api.plist

# 11. 驗證
sleep 3
if curl -s http://localhost:3002/health > /dev/null; then
  log_info "✓ Release 成功！"
  log_info "版本: ${BUILD_VERSION}"
  log_info "目錄: ${BUILD_DIR}"
else
  log_error "✗ Release 失敗！請檢查服務狀態。"
  exit 1
fi
```

---

## 查詢版本指令

### 查詢目前版本
```bash
cat /Users/accusys/momentry/versions/current/version.json
```

### 查詢所有 Release
```bash
ls -la /Users/accusys/momentry/versions/releases/
```

### 查詢版本歷史
```bash
cat /Users/accusys/momentry/versions/changelog.json | python3 -m json.tool
```

### 查詢特定主版本
```bash
ls /Users/accusys/momentry/versions/releases/v0.1/
```

---

## 版本狀態

| 狀態 | 說明 |
|------|------|
| `building` | 建置中 |
| `built` | 已建置，未部署 |
| `testing` | 測試中 |
| `production` | 正式環境使用中 |
| `deprecated` | 已棄用 |
| `archived` | 已封存 |

---

## 版本流程圖

```
develop (git branch)
    │
    ▼
feature/bugfix commit
    │
    ▼
develop ──────────────────┐
    │                    │
    │ (merge to main)   │
    ▼                    │
main (git)               │
    │                    │
    ▼                    │
Build v0.1.20260325_143000
    │                    │
    ├──► testing (3003) │
    │                    │
    │ (approve)          │
    ▼                    ▼
v0.1 ───────────────────┘
    │
    ├──► releases/v0.1/v0.1.20260325_143000/
    │
    ├──► current/ (production)
    │
    ▼
changelog.json (update)
```

---

## Release Note (版本發布說明)

### Release Note 存放位置

```
/Users/accusys/momentry/versions/releases/{主版本}/{建置版本}/
├── binary
├── version.json
└── RELEASE_NOTE.md    # 發布說明 (Markdown)
```

### Release Note 範本

```markdown
# Momentry Core v0.1.20260325_143000 Release Note

## 版本資訊
- **Build Version**: v0.1.20260325_143000
- **Main Version**: v0.1
- **Build Date**: 2026-03-25 14:30:00
- **Git Commit**: 83ae050

## 新功能 (Features)

### API Key 認證系統
- 添加 API Key 認證中介層
- 所有 `/api/v1/*` 端點需要 `X-API-Key` header
- 支援 API Key 使用追蹤和審計日誌

### Job Worker 系統
- 新增 Job Worker 二進位檔
- 支援最多 2 個並發處理器
- 新增 `/api/v1/jobs/:uuid` 端點查詢任務詳情

## 錯誤修復 (Bug Fixes)

| Issue | 描述 |
|-------|------|
| #001 | 修復 `get_processor_results_by_job` 欄位映射錯誤 |
| #002 | 修復 API Key 驗證時區處理問題 |

## API 變更 (API Changes)

### 新增端點
| Method | Endpoint | 說明 |
|--------|----------|------|
| GET | `/api/v1/jobs` | 取得所有任務列表 |
| GET | `/api/v1/jobs/:uuid` | 取得特定任務詳情 |

### 認證變更
| 端點 | 舊版 | 新版 |
|------|------|------|
| `/api/v1/*` | 公開 | 需要 API Key |

## 升級指南

### 從舊版升級
1. 備份當前版本
2. 停止服務
3. 替換 binary
4. 重啟服務
5. 更新 API Key 配置

### API Key 配置
```bash
# 請求範例
curl -H "X-API-Key: your_api_key" \
  "http://localhost:3002/api/v1/videos"
```

## 已知問題 (Known Issues)

- 暫無

## 相關文檔

- [API 文檔](../docs_v1.0/REFERENCE/API_INDEX.md)
- [版本管理規範](../docs_v1.0/REFERENCE/VERSION_MANAGEMENT.md)

---

## Release Note 自動生成 Script

### /Users/accusys/momentry/scripts/generate_release_note.sh

```bash
#!/bin/bash
set -e

BUILD_VERSION=$1
MAIN_VERSION=$2
BUILD_DIR="/Users/accusys/momentry/versions/releases/${MAIN_VERSION}/${BUILD_VERSION}"

# 取得 Git 資訊
GIT_COMMITS=$(git log --oneline -10)
GIT_CHANGES=$(git diff --stat HEAD~5..HEAD)

cat > "${BUILD_DIR}/RELEASE_NOTE.md" << EOF
# Momentry Core ${BUILD_VERSION} Release Note

## 版本資訊
- **Build Version**: ${BUILD_VERSION}
- **Main Version**: ${MAIN_VERSION}
- **Build Date**: $(date '+%Y-%m-%d %H:%M:%S')
- **Git Commit**: $(git rev-parse --short HEAD)

## 變更內容

### Commit 記錄
\`\`\`
${GIT_COMMITS}
\`\`\`

### 變更統計
\`\`\`
${GIT_CHANGES}
\`\`\`

## 新功能

## 錯誤修復

## API 變更

## 升級指南

## 已知問題

EOF

echo "Release Note 生成完成: ${BUILD_DIR}/RELEASE_NOTE.md"
```

---

## Release Note 查詢

### 查詢所有 Release Note
```bash
find /Users/accusys/momentry/versions/releases -name "RELEASE_NOTE.md"
```

### 查看特定版本 Release Note
```bash
cat /Users/accusys/momentry/versions/releases/v0.1/v0.1.20260325_143000/RELEASE_NOTE.md
```

### 查詢最新版本 Release Note
```bash
cat /Users/accusys/momentry/versions/current/RELEASE_NOTE.md
```

---

## Release Note 範例

### 完整 Release Note 範例

\`\`\`markdown
# Momentry Core v0.1.20260325_143000 Release Note

## 版本資訊
| 項目 | 內容 |
|------|------|
| Build Version | v0.1.20260325_143000 |
| Main Version | v0.1 |
| Build Date | 2026-03-25 14:30:00 |
| Git Commit | 83ae050 |
| Status | ✅ Production |

## 新功能 (Features)

### 1. API Key 認證系統
添加完整的 API Key 認證系統，保護所有 API 端點。

**功能:**
- SHA256 key hash 驗證
- 使用統計追蹤
- 審計日誌記錄
- 異常檢測

**API 使用方式:**
\`\`\`bash
curl -H "X-API-Key: your_key" \\
  "http://localhost:3002/api/v1/videos"
\`\`\`

### 2. Job Worker 系統
新增獨立的 Job Worker 處理影片處理任務。

**特性:**
- 最多 2 個並發處理器
- Polling-based 任務獲取
- 自動進度追蹤

## 錯誤修復 (Bug Fixes)

| Issue | 描述 | 嚴重性 |
|-------|------|--------|
| #001 | 修復 `get_processor_results_by_job` TIMESTAMP 欄位映射 | 🔴 高 |
| #002 | 修復 3002 port 衝突問題 | 🟡 中 |

## API 變更

### 新增端點
| Method | Endpoint | 說明 |
|--------|----------|------|
| GET | `/api/v1/jobs` | 取得任務列表 |
| GET | `/api/v1/jobs/:uuid` | 取得任務詳情 |

### 端點認證狀態
| 端點 | 認證需求 |
|------|----------|
| `/health` | ❌ 不需要 |
| `/api/v1/*` | ✅ 需要 `X-API-Key` |

## 升級指南

### 前置需求
- PostgreSQL 資料庫
- Redis 伺服器
- MongoDB 快取

### 升級步驟
1. **備份當前版本**
   \`\`\`bash
   cp /Users/accusys/momentry/bin/momentry \\
     /Users/accusys/momentry/backup/bin/momentry_$(date +%Y%m%d)
   \`\`\`

2. **停止服務**
   \`\`\`bash
   sudo launchctl unload /Library/LaunchDaemons/com.momentry.api.plist
   \`\`\`

3. **替換 Binary**
   \`\`\`bash
   cp v0.1.20260325_143000/binary /Users/accusys/momentry/bin/momentry
   \`\`\`

4. **重啟服務**
   \`\`\`bash
   sudo launchctl load /Library/LaunchDaemons/com.momentry.api.plist
   \`\`\`

5. **驗證**
   \`\`\`bash
   curl http://localhost:3002/health
   \`\`\`

## 已知問題 (Known Issues)

- 暫無

## 技術細節

### 認證流程
\`\`\`
Client Request
     │
     ▼
[X-API-Key Header] ──► Middleware
     │                        │
     │                        ▼
     │                   Hash Key (SHA256)
     │                        │
     │                        ▼
     │                   DB Lookup
     │                        │
     │                        ▼
     │                   Validate Status
     │                        │
     ▼                        ▼
Handler ◄────────────────────┘
\`\`\`

### 資料庫變更
\`\`\`sql
-- 新增 duration_secs 欄位
ALTER TABLE processor_results 
ADD COLUMN IF NOT EXISTS duration_secs DOUBLE PRECISION;
\`\`\`

## 回滾指南

如需回滾到上一版本：
\`\`\`bash
# 1. 停止服務
sudo launchctl unload /Library/LaunchDaemons/com.momentry.api.plist

# 2. 恢復舊版
cp /Users/accusys/momentry/backup/bin/momentry_v0.1.20260324_100000 \\
   /Users/accusys/momentry/bin/momentry

# 3. 重啟服務
sudo launchctl load /Library/LaunchDaemons/com.momentry.api.plist
\`\`\`

## 聯繫與支援

- **Issue Tracker**: https://gitea.momentry.ddns.net/momentry/momentry_core/issues
- **文檔**: https://docs.momentry.ddns.net

---

*Generated: $(date '+%Y-%m-%d %H:%M:%S')*
\`\`\`

```
