| name | ctos-architecture |
| description | CTOS(ching-tech-os)架構導覽與改動定位指南。當使用者要在 ching-tech-os 加新功能、新前端 App、新後端內建模組、extends 外部模組,或新增 CTOS AI Skill 時使用。提供「改哪一層」決策樹、內建 App 逐檔 checklist、contributes.yaml 四種貢獻規格,以及 CTOS AI Skill 與 Claude Code skill 的區分。 |
CTOS 架構與功能擴充指南
CTOS 是 FastAPI + PostgreSQL(asyncpg + Alembic)+ 原生 JS(IIFE,無框架)的內部平台。
加功能前先用下面的決策樹定位「要動哪一層」,再照對應 checklist 逐檔處理。
本 skill 只給骨架;細節以 repo 內文件為準,動手前先讀「必讀文件」一節列的檔案。
1. 決策樹:功能該放哪一層
這個需求是?
├─ 修改/擴充既有功能(加欄位、加端點、改 UI)
│ → 直接改既有模組。先查 docs/module-index.md 的
│ 「常見修改場景速查」定位檔案,不要新開模組。
│
├─ 全新的平台功能,所有部署都該有(如知識庫、分享管理這類)
│ → 內建新 App:在 backend/src/ching_tech_os/modules.py 的
│ BUILTIN_MODULES 加 entry。見第 2 節 checklist。
│
├─ 需要獨立授權 / 獨立版控 / 客戶特定(如 his、law、erpnext)
│ → extends 外部模組:git submodule + contributes.yaml 宣告,
│ 不修改主系統任何程式碼。見第 3 節。
│
└─ 要給 CTOS 的 AI(Bot / AI 助手)新能力(prompt + 工具 + 可選前端 App)
→ CTOS AI Skill:SKILL.md(frontmatter 含 metadata.ctos /
contributes),由 SkillManager 掃描載入。見第 4 節。
判斷補充:
- 模組啟停由
.env 的 ENABLED_MODULES 控制(* 全開,或逗號分隔清單;core 永遠啟用)。modules.py 的 is_module_enabled() 是判斷點。
- extends 模組裡的工具有三種提供方式(in-process
mcp_tools / 外部 mcp_servers / Skill Script),選擇矩陣在 docs/extends-module.md 的「三種工具提供方式的選擇」表格,別憑感覺選。
2. 內建新 App 逐檔 checklist
2.1 後端
2.2 前端
2.3 收尾
3. extends 外部模組:contributes.yaml 四種貢獻
主系統啟動時掃描 extends/*/contributes.yaml 自動整合,模組不需要也不應該改主系統程式碼。module_id 對應 ENABLED_MODULES;不設定則永遠啟用。
3.1 四種貢獻的精確 YAML 規格
module_id: my-module
mcp_tools: core/mcp_tools.py
mcp_servers:
server-name:
command: bash
args: ["-c", "set -a && source ${PROJECT_ROOT}/.env && set +a && uvx some-mcp"]
lifespan:
startup:
callable: core.some_module.start
kwargs:
param1: ${ENV_VAR}
param2: 30
shutdown:
callable: core.some_module.stop
routers:
- module: my_router
attr: router
kwargs:
prefix: /api/my-module
tags: [my-module]
3.2 現成範例模組對照表
| 模組 | 使用欄位 | 工具提供方式 | 參考重點 |
|---|
extends/voice | module_id + lifespan + routers | 主系統 in-process MCP 工具 | lifespan 預載 Whisper 模型;routers 掛 /api/voice TTS 下載 API |
extends/printer | module_id + mcp_servers | 外部 MCP Server(uvx printer-mcp) | 最小 mcp_servers 範例 |
extends/his | module_id + lifespan(含 ${CTHIS_DATA_PATH} kwargs) | Skill Script(不用 in-process MCP) | lifespan 背景輪詢 DBF + skills/*/SKILL.md 帶前端 App 貢獻 |
另:extends/law 是 module_id + mcp_tools(in-process)的範例,見 docs/extends-module.md 的「現有模組參考」表。
注意:模組根目錄的 SKILL.md 只是說明文件,SkillManager 不掃描;會被載入的是 extends/{module}/skills/{name}/SKILL.md。
4. CTOS AI Skill 不是 Claude Code skill
兩者同名 SKILL.md,是完全不同的東西,別混:
| CTOS AI Skill | Claude Code skill |
|---|
| 給誰用 | CTOS 平台內的 AI(Bot、AI 助手) | 開發者本機的 Claude Code |
| 位置 | backend/.../skills/、extends/*/skills/{name}/、外部 ~/SDD/external-skills/ | .claude/skills/(本檔就是一個) |
| 載入者 | CTOS 的 SkillManager | Claude Code CLI |
CTOS AI Skill 的 frontmatter(規格見 docs/extends-module.md):
---
name: skill-name
description: 一句話描述
allowed-tools: "tool_a tool_b"
metadata:
ctos:
requires_app: app-id
mcp_servers: ""
contributes:
app:
id: app-id
name: 顯示名稱
icon: mdi-xxx
loader:
src: frontend/xxx-app.js
globalName: XxxApp
css: frontend/xxx-app.css
permissions:
app-id:
default: false
display_name: 顯示名稱
---
分工:contributes.yaml 的 mcp_tools 負責載入註冊工具;SKILL.md 的 allowed-tools 負責控制 AI 在該情境可以用哪些。一個模組可有多個 Skill,各開放不同工具子集。實例參考 extends/his/skills/his-integration/SKILL.md(contributes.app + permissions 完整範例)。
5. 必讀文件指引
| 時機 | 讀什麼 |
|---|
| 動任何功能前(定位檔案) | docs/module-index.md |
| 開發 extends 模組 / CTOS AI Skill | docs/extends-module.md(contributes.yaml 完整規格、Skill Script 模式、多租戶、驗證指令、常見問題) |
| 寫程式前的專案規範(migration、版本號三處同步、CSS 變數、子路徑部署、圖示規則) | 根目錄 CLAUDE.md |
| 測試與 CI 門檻 | docs/testing-ci.md、.github/workflows/backend-tests.yml |
本 skill 刻意精簡——上表文件才是單一事實來源,規格細節(完整欄位、錯誤排查)一律回到 repo 文件查證,不要憑本 skill 的摘要硬寫。