@furongjun1999/dsh-memory 0.7.5 → 0.8.1
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.
- package/README.md +43 -15
- package/docs/eval/issue64_replay_check_/346/240/270/351/252/214/344/270/216/344/277/256/345/244/215_v1.0.md +284 -0
- package/docs/eval/issue65_session_recall_/344/274/232/350/257/235/351/232/224/347/246/273_/346/240/270/351/252/214/344/270/216/344/277/256/345/244/215_v1.0.md +329 -0
- package/docs/eval//345/217/221/345/270/20313_/344/270/212/344/270/213/346/226/207/350/207/252/347/256/241/347/220/206/346/234/272/345/210/266_v1.0.md +2 -2
- package/docs/eval//345/217/221/345/270/20314_/350/272/253/344/275/223/303/227/350/204/221/347/273/204/345/220/210_v1.0.md +160 -0
- package/docs/eval//345/217/221/345/270/20315_/344/274/232/350/257/235/351/232/224/347/246/273/344/277/256/345/244/215/344/270/216/350/272/253/344/275/223/345/272/223/345/261/225/347/244/272_v1.0.md +88 -0
- package/docs/eval//351/262/270/345/250/230/344/270/203/347/261/273/347/212/266/346/200/201/350/277/275/350/270/252_v1.0.md +176 -0
- package/docs/mdcg//344/270/226/347/225/214/346/250/241/345/236/213/345/212/237/350/203/275/347/253/257_/344/275/277/347/224/250/344/270/216/350/277/220/347/273/264_v1.0.md +92 -13
- package/docs/mdcg//345/212/237/350/203/275/350/260/203/347/224/250/346/230/240/345/260/204/350/241/250_v0.1.md +43 -43
- package/docs/mdcg//345/217/221/345/270/203/351/227/250/347/246/201/351/223/276_v0.1.md +14 -3
- package/docs/mdcg//347/235/241/347/234/240/345/221/250/346/234/237_/350/277/220/347/273/264/345/211/215/346/217/220/344/270/216/347/273/264/346/212/244/346/214/207/345/215/227_v1.0.md +9 -4
- package/docs/plans//347/201/265/346/236/242/350/272/253/344/275/223/303/227/350/204/221_/344/270/226/347/225/214/346/250/241/345/236/213/345/257/271/346/216/245/350/256/276/350/256/241_v0.1.md +45 -2
- package/md_cg/chain.py +23 -7
- package/md_cg/consolidate.py +81 -10
- package/md_cg/lifecycle.py +7 -0
- package/md_cg/mcp_server.py +22 -0
- package/md_cg/mdcg.py +6 -1
- package/md_cg/mdcos.py +24 -1
- package/md_cg/scrub.py +4 -2
- package/md_cg/sleep.py +60 -10
- package/md_cg/test_lifecycle_retire_leak.py +90 -0
- package/md_cg/test_p45_session_identity.py +250 -3
- package/md_cg/test_p6_consolidate.py +389 -7
- package/md_cg/test_sleep_gitlock.py +134 -0
- package/md_cg/test_spatial_coords3d.py +292 -0
- package/package.json +2 -2
- package/skills/plugin.json +1 -1
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
"""test_spatial_coords3d · spatial 直存透传守卫(0.8.0 身体×脑对接 · 四条裁定之二)。
|
|
3
|
+
|
|
4
|
+
契约:`docs/plans/灵枢身体×脑_世界模型对接设计_v0.1.md` §四.2——
|
|
5
|
+
`spatial.coords3d` 自定义键**直存**米制(可选 bbox 投影后补);不改既有
|
|
6
|
+
`fm.spatial.bbox` 的 2D 语义、stg 四 op 零位移。
|
|
7
|
+
|
|
8
|
+
断言分组:
|
|
9
|
+
|
|
10
|
+
A 落盘直存——`remember_gated(gated=False)` 带 spatial → 节点 fm["spatial"] 与
|
|
11
|
+
输入**逐位相等**;索引条目在场;**新实例重载**(磁盘回读)逐位不变。
|
|
12
|
+
B 形态与边界——coords3d 与 bbox 并存原样落;零值/负值原样;spatial 缺省
|
|
13
|
+
**不落键**(fm 形态零回归);spatial 非 dict 原样透传(透传层不校验——
|
|
14
|
+
形态校验归调用方,如实边界)。
|
|
15
|
+
C MCP 面接线——`mcp_server._dispatch` 经 mdcg_remember(gated=false)带 spatial
|
|
16
|
+
→ 落盘可见(上游半段);且三处映射在场:gated 分支透传 / 复现 meta 键 /
|
|
17
|
+
非 gated add 透传 / TOOLS schema 声明(防未来只删一处致两路径元数据不等价)。
|
|
18
|
+
D 既有语义零位移——同节点不带 spatial 写入形态与旧口径一致(无 spatial 键);
|
|
19
|
+
spatial 不影响 conditions/tags/importance 各既有键。
|
|
20
|
+
|
|
21
|
+
隔离:全部落临时目录(`tempfile.mkdtemp`);env 里的根变量全程移除,**绝不动
|
|
22
|
+
在役库**(本文件不含任何真实数据根路径字面量)。
|
|
23
|
+
|
|
24
|
+
运行:python -X utf8 -m md_cg.test_spatial_coords3d
|
|
25
|
+
python -X utf8 -m md_cg.test_spatial_coords3d --mutate # 定点变异自证
|
|
26
|
+
|
|
27
|
+
退出码(fail-closed):0 = 全绿 / 变异自证 PASS;1 = 断言失败 / 变异未按预期转红;
|
|
28
|
+
2 = ANCHOR-MISS(变异锚点在当前源码里找不到——实现改了却没同步本表即硬失败)。
|
|
29
|
+
"""
|
|
30
|
+
from __future__ import annotations
|
|
31
|
+
|
|
32
|
+
import json
|
|
33
|
+
import os
|
|
34
|
+
import shutil
|
|
35
|
+
import sys
|
|
36
|
+
import tempfile
|
|
37
|
+
|
|
38
|
+
from .mdcos import MdCGOS
|
|
39
|
+
|
|
40
|
+
_PASS = []
|
|
41
|
+
_FAIL = []
|
|
42
|
+
_GEN = [0]
|
|
43
|
+
_TMP = tempfile.mkdtemp(prefix="mdcg_sp_")
|
|
44
|
+
_SAVED = {}
|
|
45
|
+
_REPO = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def ok(cond, msg, extra=""):
|
|
49
|
+
(_PASS if cond else _FAIL).append(msg)
|
|
50
|
+
print((" PASS " if cond else " FAIL ") + msg
|
|
51
|
+
+ ((" ← " + str(extra)) if (extra and not cond) else ""))
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
# 生效条件:无入参;把根相关与**行为类** env 键现值存入 _SAVED 并逐个移除(隔离:
|
|
55
|
+
# 任何经 env 取根/改行为(自治档/限流/检索管线等)的路径都不得落到在役库或改变判据)。
|
|
56
|
+
# 注:档位/限流 env 字面量按「单点结构」守卫(test_autonomy_modes G 组)要求
|
|
57
|
+
# **拼接构造**——带引号的字面量只许出现在唯一入口模块。
|
|
58
|
+
def _sandbox_env():
|
|
59
|
+
keys = ("MDCG_ROOT", "MDCG_STATE_ROOT", "MDCG_AUX_ROOT", "MDCG_DATA_ROOT",
|
|
60
|
+
"MDCG_STG_STATE", "MDCG_" + "AUTONOMY", "MDCG_" + "WRITELIMIT",
|
|
61
|
+
"MDCG_RETRIEVAL_PIPELINE", "MDCG_POLICY_FILE", "MDCG_SESSION")
|
|
62
|
+
for k in keys:
|
|
63
|
+
_SAVED[k] = os.environ.get(k)
|
|
64
|
+
os.environ.pop(k, None)
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
# 生效条件:无入参;把 _SAVED 逐个还原(原值 None 则移除键)。
|
|
68
|
+
def _restore_env():
|
|
69
|
+
for k, v in _SAVED.items():
|
|
70
|
+
if v is None:
|
|
71
|
+
os.environ.pop(k, None)
|
|
72
|
+
else:
|
|
73
|
+
os.environ[k] = v
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
# 生效条件:无入参;在 _TMP 下新建自增代次目录并返回其上的 MdCGOS 实例(组间零串味)。
|
|
77
|
+
def _fresh_cg():
|
|
78
|
+
_GEN[0] += 1
|
|
79
|
+
return MdCGOS(os.path.join(_TMP, "gen%d" % _GEN[0], "root"))
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
# 生效条件:cg 为沙箱实例、spatial 为附加键(可为 None=不带)、gated 选直写/闸门路径时写一条场景节点并返回 (nid, 写入返回体)。
|
|
83
|
+
def _write_scene(cg, nid, spatial, content=None, gated=False):
|
|
84
|
+
kw = dict(layer="contextual", gated=gated, importance=0.6,
|
|
85
|
+
tags=["spatial", "cat:fatfish", "ent:肥鱼", "world_model"])
|
|
86
|
+
if spatial is not None:
|
|
87
|
+
kw["spatial"] = spatial
|
|
88
|
+
content = content or "场景实体 肥鱼(fatfish)位于 (0,0.85,5.0),状态 shy"
|
|
89
|
+
return nid, cg.remember_gated(nid, content, **kw)
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
# 生效条件:cg 为新实例、nid 为节点 id 时返回其 frontmatter(无节点返回 {})。
|
|
93
|
+
def _entry_fm(cg, nid):
|
|
94
|
+
e = cg.get(nid) or {}
|
|
95
|
+
return e.get("frontmatter") or {}
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
# 生效条件:同上;返回 frontmatter.spatial(键缺返回哨兵 '__MISSING__',与 None 值区分)。
|
|
99
|
+
def _entry_spatial(cg, nid):
|
|
100
|
+
return _entry_fm(cg, nid).get("spatial", "__MISSING__")
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
SP_A = {"coords3d": {"x": 0.0, "y": 0.85, "z": 5.0}}
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
# 生效条件:无入参;A 组——直存逐位 + 索引在场 + 磁盘重载逐位(返回红项数)。
|
|
107
|
+
def group_a():
|
|
108
|
+
n0 = len(_FAIL)
|
|
109
|
+
cg = _fresh_cg()
|
|
110
|
+
nid, out = _write_scene(cg, "sp_a1", SP_A)
|
|
111
|
+
ok(out.get("verdict") == "ACCEPT", "A1 写入 ACCEPT(bypass 直写路径)", out)
|
|
112
|
+
ok(_entry_spatial(cg, nid) == SP_A, "A2 索引条目 spatial 与输入逐位相等",
|
|
113
|
+
_entry_spatial(cg, nid))
|
|
114
|
+
cg2 = MdCGOS(cg.root) # 新实例:从磁盘重载索引(落盘不回读不算数)
|
|
115
|
+
ok(_entry_spatial(cg2, nid) == SP_A, "A3 新实例重载后 spatial 逐位不变",
|
|
116
|
+
_entry_spatial(cg2, nid))
|
|
117
|
+
fm, _content = cg2._read(cg2.get(nid))
|
|
118
|
+
ok((fm or {}).get("spatial") == SP_A, "A4 磁盘 fm.spatial 逐位相等(_read 直读)",
|
|
119
|
+
(fm or {}).get("spatial"))
|
|
120
|
+
return len(_FAIL) - n0
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
# 生效条件:无入参;B 组——形态与边界(返回红项数)。
|
|
124
|
+
def group_b():
|
|
125
|
+
n0 = len(_FAIL)
|
|
126
|
+
cg = _fresh_cg()
|
|
127
|
+
sp_b = {"coords3d": {"x": -1.5, "y": 0.0, "z": 2.25}, "bbox": [10, 20, 30, 40]}
|
|
128
|
+
nid, _ = _write_scene(cg, "sp_b1", sp_b)
|
|
129
|
+
ok(_entry_spatial(cg, nid) == sp_b, "B1 coords3d 与 bbox 并存原样落盘(零重写)",
|
|
130
|
+
_entry_spatial(cg, nid))
|
|
131
|
+
# 缺省不落键(键缺,而非值 None)
|
|
132
|
+
nid2, _ = _write_scene(cg, "sp_b2", None)
|
|
133
|
+
ok("spatial" not in _entry_fm(cg, nid2),
|
|
134
|
+
"B2 spatial 缺省不落键(fm 形态零回归)", sorted(_entry_fm(cg, nid2).keys()))
|
|
135
|
+
# 非 dict 原样透传(透传层不校验)
|
|
136
|
+
nid3, out3 = _write_scene(cg, "sp_b3", "not-a-dict")
|
|
137
|
+
ok(out3.get("verdict") == "ACCEPT" and _entry_spatial(cg, nid3) == "not-a-dict",
|
|
138
|
+
"B3 spatial 非 dict 原样透传不抛(边界如实)", _entry_spatial(cg, nid3))
|
|
139
|
+
return len(_FAIL) - n0
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
# 生效条件:无入参;C 组——MCP 面上游半段行为 + 四处映射在场(返回红项数)。
|
|
143
|
+
def group_c():
|
|
144
|
+
n0 = len(_FAIL)
|
|
145
|
+
from . import mcp_server
|
|
146
|
+
cg = _fresh_cg()
|
|
147
|
+
res = mcp_server._dispatch(cg, "mdcg_remember", {
|
|
148
|
+
"node_id": "sp_c1", "layer": "contextual", "gated": False,
|
|
149
|
+
"content": "场景实体 桌子(table)位于 (1.5,0.45,6.0),状态 neutral",
|
|
150
|
+
"importance": 0.6,
|
|
151
|
+
"tags": ["spatial", "cat:table", "ent:桌子", "world_model"],
|
|
152
|
+
"spatial": {"coords3d": {"x": 1.5, "y": 0.45, "z": 6.0}},
|
|
153
|
+
})
|
|
154
|
+
ok(bool(res.get("ok")), "C1 _dispatch(mdcg_remember) 经 MCP 面写入 ok", res)
|
|
155
|
+
ok(_entry_spatial(cg, "sp_c1") == {"coords3d": {"x": 1.5, "y": 0.45, "z": 6.0}},
|
|
156
|
+
"C2 经 MCP 面 spatial 同样直存", _entry_spatial(cg, "sp_c1"))
|
|
157
|
+
src = open(os.path.join(_REPO, "md_cg", "mcp_server.py"), encoding="utf-8").read()
|
|
158
|
+
ok(src.count("**_spatial_kw(a)") >= 2 and "def _spatial_kw(a)" in src,
|
|
159
|
+
"C3 透传映射在场:gated 分支与非 gated add 两处经同一单点(≥2 次+助手定义)",
|
|
160
|
+
src.count("**_spatial_kw(a)"))
|
|
161
|
+
i = src.find("_meta = {k: a[k] for k in")
|
|
162
|
+
ok(i >= 0 and '"spatial"' in src[i:i + 900],
|
|
163
|
+
"C4 复现 meta 键在场(入队后 accept 与直接落盘的元数据等价)")
|
|
164
|
+
ok('spatial=_p("object"' in src, "C5 TOOLS schema 声明 spatial 参数(客户端可见)")
|
|
165
|
+
return len(_FAIL) - n0
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
# 生效条件:无入参;D 组——既有键零位移(返回红项数)。
|
|
169
|
+
def group_d():
|
|
170
|
+
n0 = len(_FAIL)
|
|
171
|
+
cg = _fresh_cg()
|
|
172
|
+
nid, _ = _write_scene(cg, "sp_d1", SP_A)
|
|
173
|
+
e = _entry_fm(cg, nid)
|
|
174
|
+
ok(e.get("tags") == ["spatial", "cat:fatfish", "ent:肥鱼", "world_model"],
|
|
175
|
+
"D1 tags 原样(spatial 不干扰)", e.get("tags"))
|
|
176
|
+
ok(e.get("importance") == 0.6, "D2 importance 原样", e.get("importance"))
|
|
177
|
+
ok(not (e.get("condition_space") or {}).get("spatial"),
|
|
178
|
+
"D3 既定 condition_space 零位移(spatial 走独立键)")
|
|
179
|
+
return len(_FAIL) - n0
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
# 生效条件:无入参;E 组——**gated=true 闸门路径行为透传**(复核观察项②收口:
|
|
183
|
+
# 此前 gated 分支仅静态判据,现补行为断言;返回红项数)。
|
|
184
|
+
def group_e():
|
|
185
|
+
n0 = len(_FAIL)
|
|
186
|
+
cg = _fresh_cg()
|
|
187
|
+
nid, out = _write_scene(cg, "sp_e1", SP_A, gated=True)
|
|
188
|
+
ok(out.get("verdict") == "ACCEPT", "E1 gated=true 写入走闸门且 ACCEPT", out)
|
|
189
|
+
ok(_entry_spatial(cg, nid) == SP_A, "E2 gated=true spatial 落盘逐位(行为面)",
|
|
190
|
+
_entry_spatial(cg, nid))
|
|
191
|
+
nid2, _ = _write_scene(cg, "sp_e2", None, gated=True,
|
|
192
|
+
content="场景实体 桌子(table)位于 (1.5,0.45,6.0),状态 neutral")
|
|
193
|
+
ok("spatial" not in _entry_fm(cg, nid2), "E3 gated=true 缺省不落键",
|
|
194
|
+
sorted(_entry_fm(cg, nid2).keys()))
|
|
195
|
+
return len(_FAIL) - n0
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
def run_all():
|
|
199
|
+
print("== A 落盘直存 =="); group_a()
|
|
200
|
+
print("== B 形态与边界 =="); group_b()
|
|
201
|
+
print("== C MCP 面接线 =="); group_c()
|
|
202
|
+
print("== D 既有键零位移 =="); group_d()
|
|
203
|
+
print("== E gated 闸门路径 =="); group_e()
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
# ---------------------------------------------------------------------------
|
|
207
|
+
# 定点变异自证
|
|
208
|
+
# ---------------------------------------------------------------------------
|
|
209
|
+
|
|
210
|
+
_ANCHOR = "**_spatial_kw(a)"
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
# 生效条件:无入参;M1 行为变异——把 MdCGOS.add 的 spatial 剔除(模拟透传丢失),
|
|
214
|
+
# A2(直写面)与 E2(gated 面)同款断言应**恰好**转红 2 项;结束还原原方法。
|
|
215
|
+
def _mut_m1():
|
|
216
|
+
real = MdCGOS.add
|
|
217
|
+
|
|
218
|
+
def _stripped(self, node_id, content, layer="knowledge", **kw):
|
|
219
|
+
kw.pop("spatial", None)
|
|
220
|
+
return real(self, node_id, content, layer=layer, **kw)
|
|
221
|
+
|
|
222
|
+
MdCGOS.add = _stripped
|
|
223
|
+
try:
|
|
224
|
+
n0 = len(_FAIL)
|
|
225
|
+
cg = _fresh_cg()
|
|
226
|
+
nid, _ = _write_scene(cg, "sp_m1", SP_A)
|
|
227
|
+
ok(_entry_spatial(cg, nid) == SP_A, "M1 变异下 A2 断言(应转红)",
|
|
228
|
+
_entry_spatial(cg, nid))
|
|
229
|
+
nid2, _ = _write_scene(cg, "sp_m1g", SP_A, gated=True,
|
|
230
|
+
content="场景实体 树(tree)位于 (-2,1,7.0),状态 neutral")
|
|
231
|
+
ok(_entry_spatial(cg, nid2) == SP_A, "M1 变异下 E2 断言(应转红)",
|
|
232
|
+
_entry_spatial(cg, nid2))
|
|
233
|
+
return len(_FAIL) - n0
|
|
234
|
+
finally:
|
|
235
|
+
MdCGOS.add = real
|
|
236
|
+
|
|
237
|
+
|
|
238
|
+
# 生效条件:无入参;M2 源码变异——删一处透传调用,C3 计数断言应恰好转红 1 项。
|
|
239
|
+
def _mut_m2():
|
|
240
|
+
p = os.path.join(_REPO, "md_cg", "mcp_server.py")
|
|
241
|
+
src = open(p, encoding="utf-8").read()
|
|
242
|
+
if _ANCHOR not in src:
|
|
243
|
+
return None # ANCHOR-MISS 由调用方判 2
|
|
244
|
+
mut = src.replace(_ANCHOR, "None # mutated", 1)
|
|
245
|
+
n0 = len(_FAIL)
|
|
246
|
+
ok(mut.count(_ANCHOR) >= 2 and "def _spatial_kw(a)" in mut,
|
|
247
|
+
"M2 变异下 C3 计数断言(应转红)", mut.count(_ANCHOR))
|
|
248
|
+
return len(_FAIL) - n0
|
|
249
|
+
|
|
250
|
+
|
|
251
|
+
def run_mutate():
|
|
252
|
+
ok(len(_FAIL) == 0, "前置:变异轮前无失败")
|
|
253
|
+
print("== 定点变异自证 ==")
|
|
254
|
+
verdict = 0
|
|
255
|
+
base_fail = len(_FAIL)
|
|
256
|
+
red1 = _mut_m1()
|
|
257
|
+
if red1 != 2:
|
|
258
|
+
print(f" FAIL M1 预期恰好 2 红(A2 直写面 + E2 gated 面),实得 {red1}")
|
|
259
|
+
verdict = 1
|
|
260
|
+
red2 = _mut_m2()
|
|
261
|
+
if red2 is None:
|
|
262
|
+
print(" ANCHOR-MISS:源码透传锚点不在场(实现已改而本表未同步)")
|
|
263
|
+
verdict = 2
|
|
264
|
+
elif red2 != 1:
|
|
265
|
+
print(f" FAIL M2 预期恰好 1 红,实得 {red2}")
|
|
266
|
+
verdict = 1
|
|
267
|
+
if verdict == 0:
|
|
268
|
+
print(" MUTATE=PASS(M1 两断言面各 1 红=2;M2 恰好 1 红)")
|
|
269
|
+
# 变异轮的落红不计入正式判定
|
|
270
|
+
del _FAIL[base_fail:]
|
|
271
|
+
return verdict
|
|
272
|
+
|
|
273
|
+
|
|
274
|
+
def main(argv=None) -> int:
|
|
275
|
+
argv = argv if argv is not None else sys.argv[1:]
|
|
276
|
+
_sandbox_env()
|
|
277
|
+
try:
|
|
278
|
+
if "--mutate" in argv:
|
|
279
|
+
rc = run_mutate()
|
|
280
|
+
else:
|
|
281
|
+
run_all()
|
|
282
|
+
print()
|
|
283
|
+
print(f"===== SUMMARY {len(_PASS)}/{len(_PASS) + len(_FAIL)} 通过 =====")
|
|
284
|
+
rc = 1 if _FAIL else 0
|
|
285
|
+
return rc
|
|
286
|
+
finally:
|
|
287
|
+
_restore_env()
|
|
288
|
+
shutil.rmtree(_TMP, ignore_errors=True)
|
|
289
|
+
|
|
290
|
+
|
|
291
|
+
if __name__ == "__main__":
|
|
292
|
+
sys.exit(main())
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@furongjun1999/dsh-memory",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.1",
|
|
4
4
|
"description": "灵枢(Lingshu·líng shū)DeepSeek Harness 插件:完整大脑——长期记忆/知识飞轮/自我认知/递归反思接入 DSH,对话自动沉淀进 md_cg 认知图(md 文档)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "lib/index.js",
|
|
@@ -86,7 +86,7 @@
|
|
|
86
86
|
"build": "node -e \"require('node:fs').rmSync('lib',{recursive:true,force:true})\" && tsc -p tsconfig.json",
|
|
87
87
|
"test": "npm run build && node --import tsx --test \"test/*.test.ts\"",
|
|
88
88
|
"prepare": "node -e \"const fs=require('fs');const tsc='node_modules/typescript/bin/tsc';fs.existsSync(tsc)?(fs.rmSync('lib',{recursive:true,force:true}),require('child_process').execFileSync(process.execPath,[tsc,'-p','tsconfig.json'],{stdio:'inherit'})):console.log('[prepare] 跳过构建:typescript 未安装(NODE_ENV=production 或 --omit=dev 会省略 devDependencies)——需要构建请用 npm install --include=dev')\"",
|
|
89
|
-
"gate": "python scripts/check_unreachable.py && python scripts/check_publish_artifact.py && python scripts/check_publish_smoke.py && python scripts/cogmap_sync.py check && python scripts/link_check.py && python scripts/workspace_index.py --check && python scripts/discipline_nodes.py --init --write --cg-root .tmp/discipline-cg && python scripts/verify_discipline.py --allow-missing --cg-root .tmp/discipline-cg && python scripts/gate_rust_crate_test.py && python scripts/gate_rust_parity.py && python scripts/check_local_paths.py",
|
|
89
|
+
"gate": "python scripts/check_unreachable.py && python scripts/check_publish_artifact.py && python scripts/check_publish_smoke.py && python scripts/cogmap_sync.py check && python scripts/link_check.py && python scripts/workspace_index.py --check && python scripts/discipline_nodes.py --init --write --cg-root .tmp/discipline-cg && python scripts/verify_discipline.py --allow-missing --cg-root .tmp/discipline-cg && python scripts/gate_rust_crate_test.py && python scripts/gate_rust_parity.py && python scripts/check_local_paths.py && python scripts/body_e2e_smoke.py",
|
|
90
90
|
"prepublishOnly": "npm run build && npm test && npm run gate"
|
|
91
91
|
},
|
|
92
92
|
"repository": {
|
package/skills/plugin.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
|
|
3
3
|
"name": "lingshu-skills",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.8.1",
|
|
5
5
|
"description": "灵枢(AEIS)自我认知技能包——白箱条件化知识(Agent Skills 兼容导出)。本质是灵枢了解自身的工具:每个技能描述灵枢在什么条件下能做什么、怎么执行、克制什么(KCCS 四要素),由条件路由图精确路由,由灵枢 MCP 工具执行验证(物理基底)。",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "灵枢(AEIS)· CommonTrustProtocol"
|