Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 11 additions & 16 deletions .cursor/skills/publish/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,9 @@
name: publish
description: >-
Publish the Octop Python package: cut a release branch from develop, bump
version, update CHANGELOG, open a PR to main, wait for merge, then tag on
main (triggers GitHub Actions for PyPI / Docker Hub), delete the release
branch, and sync develop. Use when the user asks to publish, release, bump
version, cut a release, or run /publish.
version, update CHANGELOG, open a PR to main; after merge, Actions tag on
main (PyPI / Docker Hub) and sync main into develop. Use when the user asks
to publish, release, bump version, cut a release, or run /publish.
disable-model-invocation: true
---

Expand Down Expand Up @@ -258,9 +257,10 @@ EOF

3. 提示用户到 Actions 确认:
- `Auto Tag On Release Merge` 成功;
- `Release` 与 `Docker Publish` 随 `v*` tag 触发并通过。
- `Release` 与 `Docker Publish` 随 `v*` tag 触发并通过;
- `Sync Main Into Develop` 在 GitHub Release 发布后把 `main` 同步回 `develop`。

### 步骤 7 — 删除 release 分支并同步 develop
### 步骤 7 — 删除 release 分支;develop 由 Action 同步

1. 删除远程与本地 release 分支:
```bash
Expand All @@ -269,15 +269,10 @@ EOF
```
删除失败则警告(非致命),提示手动删除。

2. 若 `main` 与 `develop` 有差异(merge commit 或仅在 main 上的修复),创建同步 PR:
```bash
gh pr create \
--base {INTEGRATION_BRANCH} \
--head {TARGET_BRANCH} \
--title "chore: sync main into develop after {version}" \
--body "Post-release sync so develop contains the shipped main tip."
```
若已快进无差异,跳过并说明。
2. **develop 同步**:GitHub Release 发布成功后,`sync-main-to-develop.yml` 会自动开 `main → develop` PR,并在无冲突时用 **merge commit** 合入。
- 若已快进无差异,Action 会跳过。
- 若有冲突或分支保护拦截,Action 留下 PR 并告警,需人工处理。
- 技能侧无需再手动创建 sync PR(除非 Action 失败)。

### 步骤 8 — 切回原分支

Expand Down Expand Up @@ -319,7 +314,7 @@ git checkout {original_branch}
**始终:**
- 从最新 `{REMOTE}/{INTEGRATION_BRANCH}` 切 release
- 先合入 `{TARGET_BRANCH}`,再由 Action 在 main tip 打 tag
- 发版后删除 `release/*`,并在需要时同步回 `develop`
- 发版后删除 `release/*`;`main → develop` 由 `sync-main-to-develop.yml` 自动同步(失败时再手动补)
- 中止前展示完整错误输出
- 插入新版本条目后保持 `[Unreleased]` 为空
- 推送 tag 后提示用户关注 GitHub Actions 的发布结果
80 changes: 80 additions & 0 deletions .github/workflows/sync-main-to-develop.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
name: Sync Main Into Develop

# After a GitHub Release is published (Release workflow: PyPI → github-release),
# open a main → develop sync PR and merge it when possible.
on:
release:
types:
- published

permissions:
contents: write
pull-requests: write

jobs:
sync:
name: Sync main into develop
if: startsWith(github.event.release.tag_name, 'v')
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Open or merge sync PR
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
TAG: ${{ github.event.release.tag_name }}
run: |
set -euo pipefail
version="${TAG#v}"
git fetch origin main develop

if git merge-base --is-ancestor origin/main origin/develop; then
echo "develop already contains main tip; nothing to sync."
exit 0
fi

existing="$(
gh pr list \
--base develop \
--head main \
--state open \
--json number \
--jq '.[0].number // empty'
)"

if [ -z "$existing" ]; then
url="$(
gh pr create \
--base develop \
--head main \
--title "chore: sync main into develop after ${version}" \
--body "Post-release sync so develop contains the shipped main tip (${TAG})."
)"
echo "Created sync PR: ${url}"
existing="$(
gh pr list \
--base develop \
--head main \
--state open \
--json number \
--jq '.[0].number // empty'
)"
else
echo "Sync PR already open: #${existing}"
fi

if [ -z "$existing" ]; then
echo "::error::Failed to resolve sync PR number."
exit 1
fi

# Prefer merge commit (not squash) so main stays an ancestor of develop.
if gh pr merge "$existing" --merge --delete-branch=false; then
echo "Merged #${existing} into develop."
else
echo "::warning::Could not auto-merge #${existing} (conflicts or branch protection). Merge manually."
gh pr view "$existing" --json url --jq .url
fi
7 changes: 7 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,13 @@

## [Unreleased]

## [0.9.15] - 2026-07-27

### 修复
- 加固聊天导航:切换专家时避免残留旧会话 URL,并稳定流式 Markdown 渲染
- 优化 Memory / Token Usage 页面布局,消除嵌套滚动并改善信息密度
- 补充企业微信客户群二维码相关文档说明

## [0.9.14] - 2026-07-25

### 新增
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
<p align="center">
<a href="https://www.python.org/downloads/"><img alt="Python 3.11+" src="https://img.shields.io/badge/python-3.11%2B-blue?logo=python&logoColor=white" /></a>
<a href="https://github.com/TencentCloud/Octop/blob/main/LICENSE"><img alt="License: MIT" src="https://img.shields.io/badge/license-MIT-green" /></a>
<a href="https://github.com/TencentCloud/Octop/releases"><img alt="Version" src="https://img.shields.io/badge/version-0.9.14-orange" /></a>
<a href="https://github.com/TencentCloud/Octop/releases"><img alt="Version" src="https://img.shields.io/badge/version-0.9.15-orange" /></a>
<a href="https://pypi.org/project/octop/"><img src="https://img.shields.io/pypi/v/octop" alt="PyPI" /></a>
<a href="https://github.com/astral-sh/ruff"><img alt="Code Style: Ruff" src="https://img.shields.io/badge/code%20style-ruff-000000?logo=ruff&logoColor=white" /></a>
<a href="https://github.com/TencentCloud/Octop"><img alt="GitHub stars" src="https://img.shields.io/github/stars/TencentCloud/Octop?style=social" /></a>
Expand Down
5 changes: 4 additions & 1 deletion dashboard/src/pages/Agent/Memory/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ import MemorySettings from "./MemorySettings";

import PageShell from "../../../layouts/PageShell";
import { useAgent } from "../../../context/AgentContext";
import { useIsMobile } from "../../../hooks/useIsMobile";
import memoryDashboardApi from "../../../api/modules/memoryDashboard";
import styles from "./index.module.less";

Expand Down Expand Up @@ -75,6 +76,7 @@ const TABS: TabDef[] = [
export default function MemoryPage() {
const { t } = useTranslation();
const { activeAgentId } = useAgent();
const isMobile = useIsMobile();

const [activeTab, setActiveTab] = useState<MemoryTab>("overview");
const [libraryView, setLibraryView] = useState<LibraryView>("tree");
Expand Down Expand Up @@ -249,7 +251,8 @@ export default function MemoryPage() {
title={t("pageShell.memory.title")}
subtitle={t("pageShell.memory.subtitle")}
agentScoped
fill
// Mobile CSS lets tab panes grow (overflow:visible); PageShell must scroll.
fill={!isMobile}
>
<Tabs
className={styles.memoryTabs}
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ build-backend = "hatchling.build"

[project]
name = "octop"
version = "0.9.14"
version = "0.9.15"
description = "Smarter self-hosted AI assistant for multiple users and agents, built on harness-agent"
readme = "README.md"
license = { text = "MIT" }
Expand Down
2 changes: 1 addition & 1 deletion src/octop/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,4 @@

from __future__ import annotations

__version__ = "0.9.14"
__version__ = "0.9.15"
Loading