daybook-mcp 3.2.2__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.
- daybook_mcp-3.2.2/LICENSE +39 -0
- daybook_mcp-3.2.2/PKG-INFO +78 -0
- daybook_mcp-3.2.2/README.md +61 -0
- daybook_mcp-3.2.2/pyproject.toml +32 -0
- daybook_mcp-3.2.2/setup.cfg +4 -0
- daybook_mcp-3.2.2/src/daybook_mcp/__init__.py +5 -0
- daybook_mcp-3.2.2/src/daybook_mcp/cli.py +134 -0
- daybook_mcp-3.2.2/src/daybook_mcp/payload/CHANGELOG.md +446 -0
- daybook_mcp-3.2.2/src/daybook_mcp/payload/CLA.md +167 -0
- daybook_mcp-3.2.2/src/daybook_mcp/payload/I18N.md +88 -0
- daybook_mcp-3.2.2/src/daybook_mcp/payload/LICENSE +39 -0
- daybook_mcp-3.2.2/src/daybook_mcp/payload/LICENSING.md +71 -0
- daybook_mcp-3.2.2/src/daybook_mcp/payload/README.en.md +126 -0
- daybook_mcp-3.2.2/src/daybook_mcp/payload/README.md +59 -0
- daybook_mcp-3.2.2/src/daybook_mcp/payload/agent_registry.py +188 -0
- daybook_mcp-3.2.2/src/daybook_mcp/payload/cross_ref.py +224 -0
- daybook_mcp-3.2.2/src/daybook_mcp/payload/daybook.conf +77 -0
- daybook_mcp-3.2.2/src/daybook_mcp/payload/daybook.py +735 -0
- daybook_mcp-3.2.2/src/daybook_mcp/payload/daybook_append.py +131 -0
- daybook_mcp-3.2.2/src/daybook_mcp/payload/daybook_multidx.py +351 -0
- daybook_mcp-3.2.2/src/daybook_mcp/payload/mcp_prompts.py +140 -0
- daybook_mcp-3.2.2/src/daybook_mcp/payload/mcp_resources.py +293 -0
- daybook_mcp-3.2.2/src/daybook_mcp/payload/mcp_server.py +215 -0
- daybook_mcp-3.2.2/src/daybook_mcp/payload/mcp_subscribe.py +191 -0
- daybook_mcp-3.2.2/src/daybook_mcp/payload/mcp_tools.py +749 -0
- daybook_mcp-3.2.2/src/daybook_mcp/payload/mcp_transport.py +153 -0
- daybook_mcp-3.2.2/src/daybook_mcp/payload/safeio.py +178 -0
- daybook_mcp-3.2.2/src/daybook_mcp/payload/sample/README.md +35 -0
- daybook_mcp-3.2.2/src/daybook_mcp/payload/sample//345/215/217/344/275/234/345/215/267.txt +24 -0
- daybook_mcp-3.2.2/src/daybook_mcp/payload/sample//347/231/276/347/247/221/345/215/267.txt +29 -0
- daybook_mcp-3.2.2/src/daybook_mcp/payload/sample//350/257/255/346/261/207/345/215/267.txt +26 -0
- daybook_mcp-3.2.2/src/daybook_mcp/payload/version.txt +5 -0
- daybook_mcp-3.2.2/src/daybook_mcp/payload/volume_format_spec.md +112 -0
- daybook_mcp-3.2.2/src/daybook_mcp.egg-info/PKG-INFO +78 -0
- daybook_mcp-3.2.2/src/daybook_mcp.egg-info/SOURCES.txt +37 -0
- daybook_mcp-3.2.2/src/daybook_mcp.egg-info/dependency_links.txt +1 -0
- daybook_mcp-3.2.2/src/daybook_mcp.egg-info/entry_points.txt +2 -0
- daybook_mcp-3.2.2/src/daybook_mcp.egg-info/tmplzlqay41 +78 -0
- daybook_mcp-3.2.2/src/daybook_mcp.egg-info/top_level.txt +1 -0
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 手艺人老宋 <songliansheng@vip.sina.com>
|
|
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.
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
DAYBOOK · 白箱记忆体范式
|
|
26
|
+
- 纯文本,人机可查
|
|
27
|
+
- 白箱,黑箱对照
|
|
28
|
+
- 条目体系清楚易管理
|
|
29
|
+
- 单机查询快
|
|
30
|
+
- 绝对本地
|
|
31
|
+
- 超大容量而文件小
|
|
32
|
+
- 不用维护
|
|
33
|
+
- 跨平台,跨 AI
|
|
34
|
+
- 跨年代
|
|
35
|
+
- 跨计算机年代
|
|
36
|
+
- 移动端可读
|
|
37
|
+
- 记忆不依赖引擎存活
|
|
38
|
+
- 海量可通读
|
|
39
|
+
- 明档可见
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: daybook-mcp
|
|
3
|
+
Version: 3.2.2
|
|
4
|
+
Summary: DAYBOOK 璇玑:把纯文本账本暴露成 MCP 服务(resources / tools / prompts)
|
|
5
|
+
Author-email: 手艺人老宋 <songliansheng@vip.sina.com>
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Homepage, https://daybooksuite.com
|
|
8
|
+
Project-URL: Repository, https://github.com/songliansheng1972/daybook-suite
|
|
9
|
+
Keywords: daybook,mcp,model-context-protocol,llm-memory,agent-memory,zero-dependency
|
|
10
|
+
Classifier: Programming Language :: Python :: 3
|
|
11
|
+
Classifier: Operating System :: OS Independent
|
|
12
|
+
Classifier: Topic :: Office/Business
|
|
13
|
+
Requires-Python: >=3.8
|
|
14
|
+
Description-Content-Type: text/markdown
|
|
15
|
+
License-File: LICENSE
|
|
16
|
+
Dynamic: license-file
|
|
17
|
+
|
|
18
|
+
# daybook-mcp
|
|
19
|
+
|
|
20
|
+
DAYBOOK 璇玑:把纯文本账本暴露成 MCP 服务(resources / tools / prompts)
|
|
21
|
+
|
|
22
|
+
## 安装
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
pip install daybook-mcp
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## 用法
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
daybook-mcp # 以 stdio 起 MCP 服务(JSON-RPC 2.0)
|
|
32
|
+
# 供支持 MCP 的客户端挂载:resources=各卷·tools=query/append/cross_ref·prompts=4 模板
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## 你的数据放在哪(重要)
|
|
36
|
+
|
|
37
|
+
第一次运行会在**运行目录**就位 `daybook.conf` 与 `sample/`(示例三卷),
|
|
38
|
+
账本、索引、备份、各数据卷**全部落在该目录**,不会写进 Python 安装目录。
|
|
39
|
+
|
|
40
|
+
运行目录的挑选次序:
|
|
41
|
+
|
|
42
|
+
1. `--home=/path`(当次指定)
|
|
43
|
+
2. 环境变量 `DAYBOOK_HOME`
|
|
44
|
+
3. **当前目录**(仅当它已含 `daybook.conf` —— 即"用我自己那本账")
|
|
45
|
+
4. 默认 `~/.daybook`(首次自动创建)
|
|
46
|
+
|
|
47
|
+
产品代码留在包内(以软链接入运行目录),`pip install -U` 升级代码时**不会动你的数据**。
|
|
48
|
+
要用自己的账本:把 `daybook.conf` 里 `[卷]` 的路径改成你自己的纯文本卷即可(相对该目录或绝对路径都行)。
|
|
49
|
+
|
|
50
|
+
## 八件要紧的事
|
|
51
|
+
|
|
52
|
+
1. **纯文本** —— 卷是纯文本,任何编辑器、任何年代都能打开。
|
|
53
|
+
2. **零依赖** —— 只用 Python 标准库,不装任何第三方包。
|
|
54
|
+
3. **只增不改** —— 追加写,旧的条目不删不改(append-only 纪律)。
|
|
55
|
+
4. **多写者安全** —— 带锁写入,多人/多进程同时记不会互相踩。
|
|
56
|
+
5. **图是引用** —— 结构以引用表达,不复制正文。
|
|
57
|
+
6. **可挂长期记忆** —— 可作为 AI 智能体的可读长期记忆底座。
|
|
58
|
+
7. **够快** —— 索引随取随算,日常规模下即时完成。
|
|
59
|
+
8. **跨年代** —— 不依赖特定工具链,十年后仍读得出。
|
|
60
|
+
|
|
61
|
+
## 三件套
|
|
62
|
+
|
|
63
|
+
| 件 | 名 | 作用 | 许可 |
|
|
64
|
+
|---|---|---|---|
|
|
65
|
+
| `daybook-suite` | 起居注 | 账本体:索引 / 查询 / 备份 / 监视 | MIT |
|
|
66
|
+
| `daybook-mcp` | 璇玑 | MCP 接口(resources / tools / prompts) | MIT |
|
|
67
|
+
| `daybook-orch` | 司南 | 智能体编排中心 | AGPL-3.0-or-later(共享件仍 MIT) |
|
|
68
|
+
|
|
69
|
+
## 授权分层
|
|
70
|
+
|
|
71
|
+
本包**全件 MIT**(璇玑=MCP 接口:`mcp_{server,tools,resources,prompts,subscribe,transport}.py`,连同共享原语 `agent_registry.py`/`cross_ref.py` 与基座件)。
|
|
72
|
+
|
|
73
|
+
逐件以文件头 `SPDX-License-Identifier` 为准;包内另附 `LICENSING.md`(分层说明)。
|
|
74
|
+
|
|
75
|
+
## 链接
|
|
76
|
+
|
|
77
|
+
- 官网:<https://daybooksuite.com>
|
|
78
|
+
- 仓库:<https://github.com/songliansheng1972/daybook-suite>
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# daybook-mcp
|
|
2
|
+
|
|
3
|
+
DAYBOOK 璇玑:把纯文本账本暴露成 MCP 服务(resources / tools / prompts)
|
|
4
|
+
|
|
5
|
+
## 安装
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
pip install daybook-mcp
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## 用法
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
daybook-mcp # 以 stdio 起 MCP 服务(JSON-RPC 2.0)
|
|
15
|
+
# 供支持 MCP 的客户端挂载:resources=各卷·tools=query/append/cross_ref·prompts=4 模板
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## 你的数据放在哪(重要)
|
|
19
|
+
|
|
20
|
+
第一次运行会在**运行目录**就位 `daybook.conf` 与 `sample/`(示例三卷),
|
|
21
|
+
账本、索引、备份、各数据卷**全部落在该目录**,不会写进 Python 安装目录。
|
|
22
|
+
|
|
23
|
+
运行目录的挑选次序:
|
|
24
|
+
|
|
25
|
+
1. `--home=/path`(当次指定)
|
|
26
|
+
2. 环境变量 `DAYBOOK_HOME`
|
|
27
|
+
3. **当前目录**(仅当它已含 `daybook.conf` —— 即"用我自己那本账")
|
|
28
|
+
4. 默认 `~/.daybook`(首次自动创建)
|
|
29
|
+
|
|
30
|
+
产品代码留在包内(以软链接入运行目录),`pip install -U` 升级代码时**不会动你的数据**。
|
|
31
|
+
要用自己的账本:把 `daybook.conf` 里 `[卷]` 的路径改成你自己的纯文本卷即可(相对该目录或绝对路径都行)。
|
|
32
|
+
|
|
33
|
+
## 八件要紧的事
|
|
34
|
+
|
|
35
|
+
1. **纯文本** —— 卷是纯文本,任何编辑器、任何年代都能打开。
|
|
36
|
+
2. **零依赖** —— 只用 Python 标准库,不装任何第三方包。
|
|
37
|
+
3. **只增不改** —— 追加写,旧的条目不删不改(append-only 纪律)。
|
|
38
|
+
4. **多写者安全** —— 带锁写入,多人/多进程同时记不会互相踩。
|
|
39
|
+
5. **图是引用** —— 结构以引用表达,不复制正文。
|
|
40
|
+
6. **可挂长期记忆** —— 可作为 AI 智能体的可读长期记忆底座。
|
|
41
|
+
7. **够快** —— 索引随取随算,日常规模下即时完成。
|
|
42
|
+
8. **跨年代** —— 不依赖特定工具链,十年后仍读得出。
|
|
43
|
+
|
|
44
|
+
## 三件套
|
|
45
|
+
|
|
46
|
+
| 件 | 名 | 作用 | 许可 |
|
|
47
|
+
|---|---|---|---|
|
|
48
|
+
| `daybook-suite` | 起居注 | 账本体:索引 / 查询 / 备份 / 监视 | MIT |
|
|
49
|
+
| `daybook-mcp` | 璇玑 | MCP 接口(resources / tools / prompts) | MIT |
|
|
50
|
+
| `daybook-orch` | 司南 | 智能体编排中心 | AGPL-3.0-or-later(共享件仍 MIT) |
|
|
51
|
+
|
|
52
|
+
## 授权分层
|
|
53
|
+
|
|
54
|
+
本包**全件 MIT**(璇玑=MCP 接口:`mcp_{server,tools,resources,prompts,subscribe,transport}.py`,连同共享原语 `agent_registry.py`/`cross_ref.py` 与基座件)。
|
|
55
|
+
|
|
56
|
+
逐件以文件头 `SPDX-License-Identifier` 为准;包内另附 `LICENSING.md`(分层说明)。
|
|
57
|
+
|
|
58
|
+
## 链接
|
|
59
|
+
|
|
60
|
+
- 官网:<https://daybooksuite.com>
|
|
61
|
+
- 仓库:<https://github.com/songliansheng1972/daybook-suite>
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=77"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "daybook-mcp"
|
|
7
|
+
version = "3.2.2"
|
|
8
|
+
description = "DAYBOOK 璇玑:把纯文本账本暴露成 MCP 服务(resources / tools / prompts)"
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
requires-python = ">=3.8"
|
|
11
|
+
license = "MIT"
|
|
12
|
+
license-files = ["LICENSE"]
|
|
13
|
+
authors = [{ name = "手艺人老宋", email = "songliansheng@vip.sina.com" }]
|
|
14
|
+
keywords = ["daybook", "mcp", "model-context-protocol", "llm-memory", "agent-memory", "zero-dependency"]
|
|
15
|
+
classifiers = [
|
|
16
|
+
"Programming Language :: Python :: 3",
|
|
17
|
+
"Operating System :: OS Independent",
|
|
18
|
+
"Topic :: Office/Business",
|
|
19
|
+
]
|
|
20
|
+
|
|
21
|
+
[project.urls]
|
|
22
|
+
Homepage = "https://daybooksuite.com"
|
|
23
|
+
Repository = "https://github.com/songliansheng1972/daybook-suite"
|
|
24
|
+
|
|
25
|
+
[project.scripts]
|
|
26
|
+
daybook-mcp = "daybook_mcp.cli:main"
|
|
27
|
+
|
|
28
|
+
[tool.setuptools.packages.find]
|
|
29
|
+
where = ["src"]
|
|
30
|
+
|
|
31
|
+
[tool.setuptools.package-data]
|
|
32
|
+
daybook_mcp = ["payload/*", "payload/sample/*"]
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# SPDX-License-Identifier: MIT
|
|
4
|
+
# Copyright (c) 2026 手艺人老宋 <songliansheng@vip.sina.com>
|
|
5
|
+
"""daybook-mcp · 薄入口(pip 发行版)
|
|
6
|
+
|
|
7
|
+
本件由 `packaging/pack_pypi.py` 生成,**请勿手改**:要改就改仓内模板
|
|
8
|
+
`packaging/cli_shim.py` 再重生成。
|
|
9
|
+
|
|
10
|
+
设计缘由(为什么要这一层壳)
|
|
11
|
+
----------------------------
|
|
12
|
+
DAYBOOK 的产品件是「进目录直接跑」的形态:`daybook.py` 用
|
|
13
|
+
`HERE = dirname(abspath(__file__))` 锚定 `daybook.conf` 与「账本根」,mcp/orch 各件亦用
|
|
14
|
+
`HERE` 取数据卷(任务卷/注册卷/租约卷/心跳卷/消息卷)。这在解压即用的整装包里很干净;
|
|
15
|
+
但一装进 site-packages 就出问题:conf 不在脚本旁会直接报错;就算把 conf 随包装进去,
|
|
16
|
+
账本与各类数据卷也会写进**程序安装目录** —— 用户无处安放自己的东西。
|
|
17
|
+
|
|
18
|
+
故本壳把「代码目录」与「运行目录」分开:
|
|
19
|
+
· 代码目录 = 包内 `payload/`(随 pip 升级自动生效)
|
|
20
|
+
· 运行目录 = 见 `resolve_home()`
|
|
21
|
+
· 首次在该目录就位:`daybook.conf` 与 `sample/` **各复制一份**(用户可改),
|
|
22
|
+
其余件(产品 `.py`、配置、文档)**一律建软链**指回 `payload/`
|
|
23
|
+
· 随后 `runpy` 跑「运行目录里的 mcp_server.py」⇒ `HERE` = 运行目录
|
|
24
|
+
⇒ conf / 账本 / 索引 / 备份 / 各数据卷 **全部落在用户自己的目录**
|
|
25
|
+
|
|
26
|
+
前提(已探针实测):`os.path.abspath` **不解析软链**,故经软链执行时 `HERE` 等于软链所在目录。
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
import os
|
|
30
|
+
import runpy
|
|
31
|
+
import shutil
|
|
32
|
+
import sys
|
|
33
|
+
|
|
34
|
+
__all__ = ["main", "resolve_home"]
|
|
35
|
+
|
|
36
|
+
_DIST = "daybook-mcp"
|
|
37
|
+
_CMD = "daybook-mcp"
|
|
38
|
+
_ENTRY = "mcp_server.py"
|
|
39
|
+
_CONF = "daybook.conf"
|
|
40
|
+
_SAMPLE = "sample"
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def payload_dir():
|
|
44
|
+
"""包内产品件目录。"""
|
|
45
|
+
return os.path.join(os.path.dirname(os.path.abspath(__file__)), "payload")
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def resolve_home(argv):
|
|
49
|
+
"""挑运行目录,并把 `--home` 从参数里摘掉。
|
|
50
|
+
|
|
51
|
+
优先次序:`--home=X` > 环境变量 `DAYBOOK_HOME` > **当前目录**(仅当它已含 `daybook.conf`,
|
|
52
|
+
即「用我自己那本账」)> `~/.daybook`
|
|
53
|
+
"""
|
|
54
|
+
rest = []
|
|
55
|
+
home = None
|
|
56
|
+
i = 0
|
|
57
|
+
while i < len(argv):
|
|
58
|
+
a = argv[i]
|
|
59
|
+
if a == "--home":
|
|
60
|
+
i += 1
|
|
61
|
+
if i < len(argv):
|
|
62
|
+
home = argv[i]
|
|
63
|
+
elif a.startswith("--home="):
|
|
64
|
+
home = a.split("=", 1)[1]
|
|
65
|
+
else:
|
|
66
|
+
rest.append(a)
|
|
67
|
+
i += 1
|
|
68
|
+
if home:
|
|
69
|
+
return os.path.abspath(os.path.expanduser(home)), rest
|
|
70
|
+
env = os.environ.get("DAYBOOK_HOME", "").strip()
|
|
71
|
+
if env:
|
|
72
|
+
return os.path.abspath(os.path.expanduser(env)), rest
|
|
73
|
+
if os.path.isfile(os.path.join(os.getcwd(), _CONF)):
|
|
74
|
+
return os.getcwd(), rest
|
|
75
|
+
return os.path.join(os.path.expanduser("~"), ".daybook"), rest
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def _ensure_home(home, payload):
|
|
79
|
+
"""在运行目录就位:conf/sample 缺失才复制;其余件一律软链指回 payload。"""
|
|
80
|
+
os.makedirs(home, exist_ok=True)
|
|
81
|
+
fresh = not os.path.exists(os.path.join(home, _CONF))
|
|
82
|
+
if fresh:
|
|
83
|
+
shutil.copyfile(os.path.join(payload, _CONF), os.path.join(home, _CONF))
|
|
84
|
+
if fresh and not os.path.exists(os.path.join(home, _SAMPLE)):
|
|
85
|
+
shutil.copytree(os.path.join(payload, _SAMPLE), os.path.join(home, _SAMPLE))
|
|
86
|
+
made = []
|
|
87
|
+
for name in sorted(os.listdir(payload)):
|
|
88
|
+
if name in (_CONF, _SAMPLE):
|
|
89
|
+
continue
|
|
90
|
+
link = os.path.join(home, name)
|
|
91
|
+
target = os.path.join(payload, name)
|
|
92
|
+
if os.path.islink(link):
|
|
93
|
+
if os.path.realpath(link) != os.path.realpath(target):
|
|
94
|
+
os.remove(link)
|
|
95
|
+
os.symlink(target, link)
|
|
96
|
+
made.append(name)
|
|
97
|
+
continue
|
|
98
|
+
if os.path.exists(link):
|
|
99
|
+
continue # 用户自留的实体件:不动
|
|
100
|
+
os.symlink(target, link)
|
|
101
|
+
made.append(name)
|
|
102
|
+
return made, fresh
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
def main(argv=None):
|
|
106
|
+
argv = list(sys.argv[1:] if argv is None else argv)
|
|
107
|
+
payload = payload_dir()
|
|
108
|
+
home, rest = resolve_home(argv)
|
|
109
|
+
made, fresh = _ensure_home(home, payload)
|
|
110
|
+
runner = os.path.join(home, _ENTRY)
|
|
111
|
+
if not os.path.exists(runner):
|
|
112
|
+
sys.stderr.write("%s: 运行目录内缺 %s:%s\n" % (_CMD, _ENTRY, runner))
|
|
113
|
+
return 2
|
|
114
|
+
sys.path.insert(0, home)
|
|
115
|
+
sys.path.insert(0, payload)
|
|
116
|
+
# mcp/orch 各件支持 DAYBOOK_ROOT 覆盖(其自带测试逃生门)·一并设上以求一致
|
|
117
|
+
os.environ.setdefault("DAYBOOK_ROOT", home)
|
|
118
|
+
if made or fresh:
|
|
119
|
+
sys.stderr.write(
|
|
120
|
+
"%s: 运行目录 = %s%s(%s)\n"
|
|
121
|
+
% (_CMD, home, ",已初始化" if fresh else "",
|
|
122
|
+
"新建链接 %d 条" % len(made) if made else "无需新建链接")
|
|
123
|
+
)
|
|
124
|
+
sys.argv = [runner] + rest
|
|
125
|
+
try:
|
|
126
|
+
runpy.run_path(runner, run_name="__main__")
|
|
127
|
+
except SystemExit as exc:
|
|
128
|
+
code = exc.code
|
|
129
|
+
return code if isinstance(code, int) else (0 if code is None else 1)
|
|
130
|
+
return 0
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
if __name__ == "__main__":
|
|
134
|
+
raise SystemExit(main())
|