@michelj/context-guard 0.4.3 → 0.6.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/Coordinator.md +88 -0
- package/Executor.md +53 -0
- package/README.md +89 -224
- package/README.zh-CN.md +89 -224
- package/SKILL.md +26 -684
- package/THIRD_PARTY_NOTICES.md +47 -0
- package/Tester.md +53 -0
- package/agents/openai.yaml +2 -2
- package/bin/build-runtime.mjs +96 -0
- package/bin/context-guard-skill.js +399 -78
- package/bin/postinstall.js +2 -2
- package/hooks.json +89 -13
- package/licenses/JSONParse-MIT.txt +24 -0
- package/licenses/Marked-MIT.txt +44 -0
- package/licenses/Portless-Apache-2.0.txt +201 -0
- package/package.json +35 -6
- package/prototype/LICENSES/Marked-MIT.txt +44 -0
- package/prototype/LICENSES/Ready-redistribution.txt +14 -0
- package/prototype/attachments.mjs +75 -0
- package/prototype/coordinator-markdown.mjs +283 -0
- package/prototype/coordinator-working-blot.mjs +124 -0
- package/prototype/vendor/marked.mjs +2189 -0
- package/prototype/workbench-app.js +5197 -0
- package/prototype/workbench-data.js +33 -0
- package/prototype/workbench-sync.mjs +898 -0
- package/prototype/workbench.css +1050 -0
- package/prototype/workbench.html +211 -0
- package/prototype/working-blot-atlas.png +0 -0
- package/references/agent-handoff.md +40 -0
- package/references/claude-runtime.md +120 -0
- package/references/cloud-sync-interface.md +66 -0
- package/references/design-current.md +14 -0
- package/references/map-mount.md +41 -0
- package/references/map-read.md +50 -0
- package/references/memory-definition.md +120 -0
- package/references/memory-filesystem-v2/Bug.en.md +162 -0
- package/references/memory-filesystem-v2/Bug.md +162 -0
- package/references/memory-filesystem-v2/Bug_Coordinater.md +8 -0
- package/references/memory-filesystem-v2/Bug_Executor.md +8 -0
- package/references/memory-filesystem-v2/Bug_Tester.md +7 -0
- package/references/memory-filesystem-v2/Idea.en.md +36 -0
- package/references/memory-filesystem-v2/Idea.md +36 -0
- package/references/memory-filesystem-v2/Node_Module_Index.en.md +88 -0
- package/references/memory-filesystem-v2/Node_Module_Index.md +88 -0
- package/references/memory-filesystem-v2/README.md +60 -0
- package/references/memory-filesystem-v2/Todo.en.md +137 -0
- package/references/memory-filesystem-v2/Todo.md +137 -0
- package/references/memory-filesystem-v2/Todo_Coordinater.md +7 -0
- package/references/memory-filesystem-v2/Todo_Executor.md +7 -0
- package/references/memory-filesystem-v2/Todo_Tester.md +7 -0
- package/references/named-workbench.md +124 -0
- package/references/plan-review.md +12 -0
- package/references/server-memory.md +276 -0
- package/references/test-check.md +7 -0
- package/references/user-reply.md +38 -0
- package/references/workbench-interface.md +531 -0
- package/roles.md +13 -0
- package/scripts/context_guard.py +1366 -7602
- package/scripts/context_guard_hook.py +1960 -711
- package/scripts/map_owns.py +699 -0
- package/scripts/shared/LICENSES/JSONParse-MIT.txt +24 -0
- package/scripts/shared/filesystem-v2.mjs +430 -0
- package/scripts/shared/io.mjs +117 -0
- package/scripts/shared/map-model.mjs +506 -0
- package/scripts/shared/memory-schema.mjs +13 -0
- package/scripts/shared/protocol-blobs.mjs +112 -0
- package/scripts/shared/protocol-map.mjs +146 -0
- package/scripts/shared/protocol-snapshots.mjs +84 -0
- package/scripts/shared/protocol-store.mjs +624 -0
- package/scripts/shared/protocol-workflow.mjs +226 -0
- package/scripts/shared/protocol.mjs +125 -0
- package/scripts/shared/vendor/jsonparse.cjs +413 -0
- package/scripts/workbench/access.mjs +496 -0
- package/scripts/workbench/attachments.mjs +92 -0
- package/scripts/workbench/browser-login.mjs +78 -0
- package/scripts/workbench/claude-runtime.mjs +372 -0
- package/scripts/workbench/cli.mjs +980 -0
- package/scripts/workbench/device-heartbeat.mjs +72 -0
- package/scripts/workbench/hook-status.mjs +38 -0
- package/scripts/workbench/inbox.mjs +155 -0
- package/scripts/workbench/journal.mjs +56 -0
- package/scripts/workbench/memory-merge.mjs +65 -0
- package/scripts/workbench/memory.mjs +252 -0
- package/scripts/workbench/named-proxy.mjs +108 -0
- package/scripts/workbench/named.mjs +152 -0
- package/scripts/workbench/portless-routes.mjs +51 -0
- package/scripts/workbench/project.mjs +327 -0
- package/scripts/workbench/projections.mjs +68 -0
- package/scripts/workbench/protocol-client.mjs +165 -0
- package/scripts/workbench/protocol-delivery.mjs +133 -0
- package/scripts/workbench/protocol-device.mjs +316 -0
- package/scripts/workbench/protocol-events.mjs +53 -0
- package/scripts/workbench/protocol-repository.mjs +58 -0
- package/scripts/workbench/reconcile.mjs +244 -0
- package/scripts/workbench/registry.mjs +111 -0
- package/scripts/workbench/runtime.mjs +54 -0
- package/scripts/workbench/server.mjs +1171 -0
- package/scripts/workbench/store.mjs +243 -0
- package/scripts/workbench/sync-coordinator.mjs +518 -0
- package/scripts/workbench/sync.mjs +86 -0
- package/references/context-template.md +0 -341
- package/references/feature-chain-methodology.md +0 -228
- package/references/register-template.md +0 -85
- package/references/task-case-template.md +0 -63
- package/tests/BC-20260618-063.sh +0 -116
- package/tests/BC-20260618-065.sh +0 -66
- package/tests/BC-20260626-080.sh +0 -48
- package/tests/BC-20260626-081.sh +0 -40
- package/tests/BC-20260626-082.sh +0 -32
- package/tests/BC-20260626-083.sh +0 -66
- package/tests/BC-20260627-084.sh +0 -74
- package/tests/BC-20260630-086.sh +0 -50
- package/tests/BC-20260630-087.sh +0 -103
- package/tests/BC-20260630-088.sh +0 -32
- package/tests/BC-20260630-089.sh +0 -63
- package/tests/BC-20260701-090.sh +0 -84
- package/tests/BC-20260702-096.sh +0 -48
- package/tests/BC-20260706-098.sh +0 -66
- package/tests/BC-20260707-099.sh +0 -47
- package/tests/BC-20260707-100.sh +0 -46
- package/tests/BC-20260707-101.sh +0 -47
- package/tests/BC-20260707-102.sh +0 -68
- package/tests/BC-20260707-103.sh +0 -59
- package/tests/BC-20260707-104.sh +0 -103
- package/tests/BC-20260707-105.sh +0 -109
- package/tests/BC-20260707-106.sh +0 -80
- package/tests/BC-20260707-107.sh +0 -74
- package/tests/BC-20260707-108.sh +0 -48
- package/tests/BC-20260707-109.sh +0 -56
- package/tests/BC-20260707-110.sh +0 -71
- package/tests/BC-20260707-111.sh +0 -70
- package/tests/BC-20260707-112.sh +0 -45
- package/tests/BC-20260707-113.sh +0 -73
- package/tests/BC-20260707-115.sh +0 -77
- package/tests/BC-20260707-116.sh +0 -77
- package/tests/BC-20260707-118.sh +0 -115
- package/tests/BC-20260707-119.sh +0 -47
- package/tests/BC-20260707-120.sh +0 -60
- package/tests/BC-20260707-121.sh +0 -66
- package/tests/BC-20260707-122.sh +0 -48
- package/tests/BC-20260707-123.sh +0 -43
- package/tests/BC-20260707-124.sh +0 -56
- package/tests/BC-20260707-125.sh +0 -64
- package/tests/BC-20260707-126.sh +0 -80
- package/tests/BC-20260707-127.sh +0 -88
- package/tests/BC-20260707-129.sh +0 -59
- package/tests/BC-20260707-130.sh +0 -69
- package/tests/BC-20260707-131.sh +0 -140
- package/tests/BC-20260707-132.sh +0 -150
- package/tests/BC-20260707-133.sh +0 -70
- package/tests/BC-20260708-136.sh +0 -210
- package/tests/BC-20260708-137.sh +0 -106
- package/tests/BC-20260708-138.sh +0 -168
- package/tests/BC-20260708-139.sh +0 -79
- package/tests/BC-20260709-002.sh +0 -63
- package/tests/BC-20260709-003.sh +0 -239
- package/tests/BC-20260709-006.sh +0 -76
- package/tests/BC-20260709-008.sh +0 -168
- package/tests/BC-20260710-001.sh +0 -61
- package/tests/BC-20260710-002.sh +0 -111
- package/tests/npm-install-smoke.sh +0 -53
package/tests/BC-20260630-087.sh
DELETED
|
@@ -1,103 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
set -euo pipefail
|
|
3
|
-
|
|
4
|
-
SCRIPT="${1:-$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)/scripts/context_guard.py}"
|
|
5
|
-
ROOT="$(mktemp -d "${TMPDIR:-/tmp}/context-guard-single-route-XXXXXX")"
|
|
6
|
-
trap 'rm -rf "$ROOT"' EXIT
|
|
7
|
-
|
|
8
|
-
python3 "$SCRIPT" init --root "$ROOT" >/dev/null
|
|
9
|
-
python3 "$SCRIPT" set-language --language zh --root "$ROOT" >/dev/null
|
|
10
|
-
|
|
11
|
-
CTX="$ROOT/.codex/context"
|
|
12
|
-
cat > "$CTX/roadmap.md" <<'MD'
|
|
13
|
-
# Context Roadmap
|
|
14
|
-
|
|
15
|
-
## Nodes
|
|
16
|
-
|
|
17
|
-
### NODE-20260630-001: 收敛到模型记忆定位问题
|
|
18
|
-
|
|
19
|
-
- Date: 2026-06-30
|
|
20
|
-
- Status: done
|
|
21
|
-
- Level: major
|
|
22
|
-
- Branch: Main
|
|
23
|
-
- User request: 用户明确核心研究问题是模型的哪些层或部分能够记住目标数据,而不是训练流程本身。
|
|
24
|
-
- Outcome: 用户明确核心研究问题是模型的哪些层或部分能够记住目标数据,需要让路线图摘要完整可读。
|
|
25
|
-
- Next: 继续推进单主线。
|
|
26
|
-
- Linked bad cases: none
|
|
27
|
-
|
|
28
|
-
### NODE-20260630-002: 完成本地按需启动聊天原型
|
|
29
|
-
|
|
30
|
-
- Date: 2026-06-30
|
|
31
|
-
- Status: done
|
|
32
|
-
- Level: major
|
|
33
|
-
- Branch: Main
|
|
34
|
-
- User request: 用户希望完成本地 Web 聊天原型,并把相关问题案例和测试链路挂到节点下。
|
|
35
|
-
- Outcome: 创建了本地 Web 聊天原型,前端页面可调用 Qwen3-1.7B-Base。
|
|
36
|
-
- Next: 观察 worker 长时间运行问题。
|
|
37
|
-
- Linked bad cases: BC-20260630-001, BC-20260630-002
|
|
38
|
-
MD
|
|
39
|
-
|
|
40
|
-
cat > "$CTX/bad-cases.md" <<'MD'
|
|
41
|
-
# Bad Case Register
|
|
42
|
-
|
|
43
|
-
### BC-20260630-001: Base 模型回复重复对话模板
|
|
44
|
-
- Status: resolved
|
|
45
|
-
- Roadmap nodes: NODE-20260630-002
|
|
46
|
-
- Tags: #chat #model
|
|
47
|
-
- Phenomenon: Base 模型可能重复输出对话模板。
|
|
48
|
-
- Guard / verification: 运行短聊天请求,确认不会重复 continued chat transcript。
|
|
49
|
-
|
|
50
|
-
### BC-20260630-002: 默认生成长度导致 worker 长时间运行
|
|
51
|
-
- Status: resolved
|
|
52
|
-
- Roadmap nodes: NODE-20260630-002
|
|
53
|
-
- Tags: #runtime
|
|
54
|
-
- Phenomenon: 默认生成长度过长导致 worker 持续运行。
|
|
55
|
-
- Guard / verification: 运行短请求,确认响应能在合理时间返回。
|
|
56
|
-
MD
|
|
57
|
-
|
|
58
|
-
python3 "$SCRIPT" show-roadmap --root "$ROOT" >/dev/null
|
|
59
|
-
HTML="$CTX/roadmap/roadmap.html"
|
|
60
|
-
|
|
61
|
-
grep -q 'class="route-stack"' "$HTML"
|
|
62
|
-
if grep -q 'class="route-stack branch-map"' "$HTML"; then
|
|
63
|
-
echo "single-route roadmap should not use branch-map layout" >&2
|
|
64
|
-
exit 1
|
|
65
|
-
fi
|
|
66
|
-
grep -q '.route-stack:not(.branch-map) .track-grid' "$HTML"
|
|
67
|
-
grep -q 'min-height: auto;' "$HTML"
|
|
68
|
-
grep -q 'single-mainline' "$HTML"
|
|
69
|
-
grep -q '.track-column.route-column.no-test-line' "$HTML"
|
|
70
|
-
grep -q -- '-webkit-line-clamp: 3;' "$HTML"
|
|
71
|
-
|
|
72
|
-
if grep -q 'min-height: 430px;' "$HTML"; then
|
|
73
|
-
echo "single-route roadmap still reserves a large empty canvas" >&2
|
|
74
|
-
exit 1
|
|
75
|
-
fi
|
|
76
|
-
|
|
77
|
-
BODY="$(python3 - "$HTML" <<'PY'
|
|
78
|
-
from pathlib import Path
|
|
79
|
-
import sys
|
|
80
|
-
html = Path(sys.argv[1]).read_text()
|
|
81
|
-
print(html.split("</style>", 1)[1])
|
|
82
|
-
PY
|
|
83
|
-
)"
|
|
84
|
-
|
|
85
|
-
if grep -q 'track-label-column' <<<"$BODY"; then
|
|
86
|
-
echo "single-route roadmap should not show a left lane label column" >&2
|
|
87
|
-
exit 1
|
|
88
|
-
fi
|
|
89
|
-
|
|
90
|
-
if grep -q 'data-lane="bad-cases"' <<<"$BODY"; then
|
|
91
|
-
echo "single-route roadmap should not render bad-case lanes in the overview" >&2
|
|
92
|
-
exit 1
|
|
93
|
-
fi
|
|
94
|
-
|
|
95
|
-
if grep -q 'data-lane="test-chain"' <<<"$BODY"; then
|
|
96
|
-
echo "single-route roadmap should not render test-chain lanes in the overview" >&2
|
|
97
|
-
exit 1
|
|
98
|
-
fi
|
|
99
|
-
|
|
100
|
-
if grep -q 'route-test-line' <<<"$BODY"; then
|
|
101
|
-
echo "single-route roadmap should not render the compact test route" >&2
|
|
102
|
-
exit 1
|
|
103
|
-
fi
|
package/tests/BC-20260630-088.sh
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
set -euo pipefail
|
|
3
|
-
|
|
4
|
-
SCRIPT="${1:-$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)/scripts/context_guard.py}"
|
|
5
|
-
ROOT="$(mktemp -d "${TMPDIR:-/tmp}/context-guard-display-title-XXXXXX")"
|
|
6
|
-
trap 'rm -rf "$ROOT"' EXIT
|
|
7
|
-
|
|
8
|
-
python3 "$SCRIPT" init --root "$ROOT" >/dev/null
|
|
9
|
-
python3 "$SCRIPT" set-language --language zh --root "$ROOT" >/dev/null
|
|
10
|
-
|
|
11
|
-
CTX="$ROOT/.codex/context"
|
|
12
|
-
python3 "$SCRIPT" checkpoint-roadmap-node \
|
|
13
|
-
--root "$ROOT" \
|
|
14
|
-
--title "用用户请求字段驱动节点详情" \
|
|
15
|
-
--display-title "按用户原话解释节点" \
|
|
16
|
-
--branch "Main" \
|
|
17
|
-
--level major \
|
|
18
|
-
--user-request "用户希望节点标题和详情问题摘要更接近自己的原话。" \
|
|
19
|
-
--outcome "路线图节点现在可以用独立的人类展示标题。" \
|
|
20
|
-
--decision "source title 可以服务检索,但 overview 标题必须先服务阅读。" \
|
|
21
|
-
--next-step "后续创建节点时同时填写 Display title 和 User request。" >/dev/null
|
|
22
|
-
|
|
23
|
-
python3 "$SCRIPT" show-roadmap --root "$ROOT" >/dev/null
|
|
24
|
-
|
|
25
|
-
grep -q -- "- Display title: 按用户原话解释节点" "$CTX/roadmap.md"
|
|
26
|
-
grep -q "按用户原话解释节点" "$CTX/roadmap/roadmap.html"
|
|
27
|
-
grep -q "按用户原话解释节点" "$CTX/roadmap/roadmap-details.html"
|
|
28
|
-
|
|
29
|
-
if grep -q "用用户请求字段驱动节点详情" "$CTX/roadmap/roadmap.html"; then
|
|
30
|
-
echo "human roadmap should not expose the implementation-oriented source title" >&2
|
|
31
|
-
exit 1
|
|
32
|
-
fi
|
package/tests/BC-20260630-089.sh
DELETED
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
set -euo pipefail
|
|
3
|
-
|
|
4
|
-
SCRIPT="${1:-$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)/scripts/context_guard.py}"
|
|
5
|
-
ROOT="$(mktemp -d "${TMPDIR:-/tmp}/context-guard-detail-summary-XXXXXX")"
|
|
6
|
-
trap 'rm -rf "$ROOT"' EXIT
|
|
7
|
-
|
|
8
|
-
python3 "$SCRIPT" init --root "$ROOT" >/dev/null
|
|
9
|
-
python3 "$SCRIPT" set-language --language zh --root "$ROOT" >/dev/null
|
|
10
|
-
|
|
11
|
-
CTX="$ROOT/.codex/context"
|
|
12
|
-
python3 "$SCRIPT" checkpoint-roadmap-node \
|
|
13
|
-
--root "$ROOT" \
|
|
14
|
-
--title "新增详情摘要字段并调整渲染优先级" \
|
|
15
|
-
--display-title "节点详情读起来更顺" \
|
|
16
|
-
--branch "Main" \
|
|
17
|
-
--level major \
|
|
18
|
-
--user-request "用户希望节点详情里的进度、问题案例和方法都读起来通顺。" \
|
|
19
|
-
--progress-summary "已经让节点详情优先显示人类进度摘要,避免把 schema、CLI 和 HTML 投影说明直接展示给用户。" \
|
|
20
|
-
--method-summary "把 agent 源字段和用户阅读字段分开;有摘要时优先显示摘要,没有摘要时才回退到旧字段。" \
|
|
21
|
-
--outcome "roadmap node schema、CLI 和 HTML projection now support human-readable detail summaries." \
|
|
22
|
-
--decision "The renderer used raw source fields, which sounded like implementation logs." \
|
|
23
|
-
--linked-bad-cases "BC-20260630-089" >/dev/null
|
|
24
|
-
|
|
25
|
-
cat >> "$CTX/bad-cases.md" <<'EOF'
|
|
26
|
-
|
|
27
|
-
### BC-20260630-089: 节点详情字段拼接导致阅读不顺
|
|
28
|
-
|
|
29
|
-
- Status: resolved
|
|
30
|
-
- First observed: 2026-06-30
|
|
31
|
-
- Last checked: 2026-06-30
|
|
32
|
-
- Scope: roadmap details
|
|
33
|
-
- Roadmap nodes: NODE-20260630-001
|
|
34
|
-
- Tags: #roadmap-ux #readability
|
|
35
|
-
- Display summary: 详情页把实现记录直接展示出来,用户读起来像在看流水账。
|
|
36
|
-
- Phenomenon: User-facing detail sections reused roadmap outcome, decision, avoid, and bad-case phenomenon fields directly, creating stiff implementation prose.
|
|
37
|
-
- Fix method: Prefer human-written progress, method, and case display summaries before falling back to source fields.
|
|
38
|
-
- Guard / verification: Run this script and inspect node detail output.
|
|
39
|
-
EOF
|
|
40
|
-
|
|
41
|
-
python3 "$SCRIPT" show-roadmap --root "$ROOT" >/dev/null
|
|
42
|
-
DETAIL="$CTX/roadmap/roadmap-details.html"
|
|
43
|
-
|
|
44
|
-
grep -q -- "- Progress summary: 已经让节点详情优先显示人类进度摘要" "$CTX/roadmap.md"
|
|
45
|
-
grep -q -- "- Method summary: 把 agent 源字段和用户阅读字段分开" "$CTX/roadmap.md"
|
|
46
|
-
grep -q -- "- Display summary: 详情页把实现记录直接展示出来" "$CTX/bad-cases.md"
|
|
47
|
-
|
|
48
|
-
python3 - "$DETAIL" <<'PY'
|
|
49
|
-
from pathlib import Path
|
|
50
|
-
import re
|
|
51
|
-
import sys
|
|
52
|
-
|
|
53
|
-
html = Path(sys.argv[1]).read_text(encoding="utf-8")
|
|
54
|
-
card = re.search(r'<section class="detail-card" id="node-1">(?P<body>.*?)</section>\s*</div>\s*</section>', html, re.S)
|
|
55
|
-
assert card, "node detail card should exist"
|
|
56
|
-
body = card.group("body")
|
|
57
|
-
assert "已经让节点详情优先显示人类进度摘要" in body
|
|
58
|
-
assert "把 agent 源字段和用户阅读字段分开" in body
|
|
59
|
-
assert "详情页把实现记录直接展示出来,用户读起来像在看流水账" in body
|
|
60
|
-
assert "roadmap node schema、CLI 和 HTML projection" not in body
|
|
61
|
-
assert "The renderer used raw source fields" not in body
|
|
62
|
-
assert "User-facing detail sections reused" not in body
|
|
63
|
-
PY
|
package/tests/BC-20260701-090.sh
DELETED
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
set -euo pipefail
|
|
3
|
-
|
|
4
|
-
SCRIPT="${1:-$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)/scripts/context_guard.py}"
|
|
5
|
-
ROOT="$(mktemp -d "${TMPDIR:-/tmp}/context-guard-approved-tests-XXXXXX")"
|
|
6
|
-
trap 'rm -rf "$ROOT"' EXIT
|
|
7
|
-
|
|
8
|
-
python3 "$SCRIPT" init --root "$ROOT" >/dev/null
|
|
9
|
-
python3 "$SCRIPT" set-language --language zh --root "$ROOT" >/dev/null
|
|
10
|
-
|
|
11
|
-
CTX="$ROOT/.codex/context"
|
|
12
|
-
cat > "$CTX/roadmap.md" <<'MD'
|
|
13
|
-
# Context Roadmap
|
|
14
|
-
|
|
15
|
-
## Nodes
|
|
16
|
-
|
|
17
|
-
### NODE-20260701-001: 主线阶段
|
|
18
|
-
|
|
19
|
-
- Date: 2026-07-01
|
|
20
|
-
- Status: done
|
|
21
|
-
- Level: major
|
|
22
|
-
- Branch: Main
|
|
23
|
-
- Display title: 主线阶段
|
|
24
|
-
- Outcome: 主线阶段完成。
|
|
25
|
-
- Linked bad cases: BC-20260701-001
|
|
26
|
-
|
|
27
|
-
### NODE-20260701-002: 支线阶段
|
|
28
|
-
|
|
29
|
-
- Date: 2026-07-01
|
|
30
|
-
- Status: done
|
|
31
|
-
- Level: major
|
|
32
|
-
- Branch: 支线
|
|
33
|
-
- Parent: NODE-20260701-001
|
|
34
|
-
- Display title: 支线阶段
|
|
35
|
-
- Outcome: 支线阶段完成。
|
|
36
|
-
- Linked bad cases: BC-20260701-002
|
|
37
|
-
MD
|
|
38
|
-
|
|
39
|
-
cat > "$CTX/bad-cases.md" <<'MD'
|
|
40
|
-
# Bad Case Register
|
|
41
|
-
|
|
42
|
-
### BC-20260701-001: 普通 bad case guard 不应显示为测试
|
|
43
|
-
- Status: resolved
|
|
44
|
-
- Roadmap nodes: NODE-20260701-001
|
|
45
|
-
- Tags: #roadmap-ux
|
|
46
|
-
- Phenomenon: 普通 bad case guard 被误当成用户测试。
|
|
47
|
-
- Guard / verification: 这是普通复发检查,不是用户批准测试。
|
|
48
|
-
|
|
49
|
-
### BC-20260701-002: 用户批准测试也不应显示在概览
|
|
50
|
-
- Status: resolved
|
|
51
|
-
- Roadmap nodes: NODE-20260701-002
|
|
52
|
-
- Tags: #roadmap-ux
|
|
53
|
-
- Phenomenon: 用户批准的测试不应在路线图概览下方形成第二行卡片。
|
|
54
|
-
- Guard / verification: 运行用户确认的测试。
|
|
55
|
-
- Run policy: every-dev-completion
|
|
56
|
-
MD
|
|
57
|
-
|
|
58
|
-
python3 "$SCRIPT" show-roadmap --root "$ROOT" >/dev/null
|
|
59
|
-
HTML="$CTX/roadmap/roadmap.html"
|
|
60
|
-
BODY="$(python3 - "$HTML" <<'PY'
|
|
61
|
-
from pathlib import Path
|
|
62
|
-
import sys
|
|
63
|
-
html = Path(sys.argv[1]).read_text()
|
|
64
|
-
print(html.split("</style>", 1)[1])
|
|
65
|
-
PY
|
|
66
|
-
)"
|
|
67
|
-
|
|
68
|
-
python3 - <<'PY' "$HTML"
|
|
69
|
-
from pathlib import Path
|
|
70
|
-
import sys
|
|
71
|
-
import re
|
|
72
|
-
html = Path(sys.argv[1]).read_text()
|
|
73
|
-
body = html.split("</style>", 1)[1]
|
|
74
|
-
notes = re.findall(r'<a class="route-test-note"[^>]*>(.*?)</a>', body, re.S)
|
|
75
|
-
joined = "\n".join(notes)
|
|
76
|
-
if "普通 bad case guard 不应显示为测试" in joined:
|
|
77
|
-
raise SystemExit("ordinary linked bad-case guard appeared as a test route item")
|
|
78
|
-
if "用户批准测试也不应显示在概览" in joined:
|
|
79
|
-
raise SystemExit("approved test appeared as a compact overview route item")
|
|
80
|
-
if notes:
|
|
81
|
-
raise SystemExit(f"overview should not render compact route test notes, got {len(notes)}")
|
|
82
|
-
if 'class="route-test-line' in body:
|
|
83
|
-
raise SystemExit("overview should not render compact route test line containers")
|
|
84
|
-
PY
|
package/tests/BC-20260702-096.sh
DELETED
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
set -euo pipefail
|
|
3
|
-
|
|
4
|
-
SCRIPT="${1:-$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)/scripts/context_guard.py}"
|
|
5
|
-
ROOT="$(mktemp -d "${TMPDIR:-/tmp}/context-guard-feature-chain-XXXXXX")"
|
|
6
|
-
trap 'rm -rf "$ROOT"' EXIT
|
|
7
|
-
|
|
8
|
-
python3 "$SCRIPT" init --root "$ROOT" >/dev/null
|
|
9
|
-
|
|
10
|
-
ADD_OUTPUT="$(python3 "$SCRIPT" feature-chain-add \
|
|
11
|
-
--root "$ROOT" \
|
|
12
|
-
--title "GPU 监控按钮" \
|
|
13
|
-
--entry "点击 GPU 监控按钮" \
|
|
14
|
-
--exit-check "打开包含有效 grafana_url 的监控页")"
|
|
15
|
-
|
|
16
|
-
CHAIN_ID="$(printf '%s\n' "$ADD_OUTPUT" | awk '/feature chain:/ {print $NF}')"
|
|
17
|
-
test -n "$CHAIN_ID"
|
|
18
|
-
|
|
19
|
-
python3 "$SCRIPT" feature-chain-attach-bc \
|
|
20
|
-
--root "$ROOT" \
|
|
21
|
-
--chain-id "$CHAIN_ID" \
|
|
22
|
-
--node-title "后端返回监控 URL" \
|
|
23
|
-
--bad-case "BC-20260702-000" \
|
|
24
|
-
--check "grafana_url 不为空,前端不会卡住" >/dev/null
|
|
25
|
-
|
|
26
|
-
python3 "$SCRIPT" feature-chain-approve \
|
|
27
|
-
--root "$ROOT" \
|
|
28
|
-
--chain-id "$CHAIN_ID" \
|
|
29
|
-
--command-text "printf 'CG_CHECKPOINT:后端返回监控 URL:PASS\n'" >/dev/null
|
|
30
|
-
|
|
31
|
-
python3 "$SCRIPT" feature-chain-list --root "$ROOT" | grep -q "BC-20260702-000"
|
|
32
|
-
|
|
33
|
-
python3 - "$ROOT/.codex/context/test-hub/feature-chains.json" "$CHAIN_ID" <<'PY'
|
|
34
|
-
from pathlib import Path
|
|
35
|
-
import json
|
|
36
|
-
import sys
|
|
37
|
-
|
|
38
|
-
data = json.loads(Path(sys.argv[1]).read_text(encoding="utf-8"))
|
|
39
|
-
chain = next(item for item in data["chains"] if item["id"] == sys.argv[2])
|
|
40
|
-
assert chain["entry"] == "点击 GPU 监控按钮"
|
|
41
|
-
assert chain["exit_check"] == "打开包含有效 grafana_url 的监控页"
|
|
42
|
-
assert chain["nodes"][0]["bad_cases"] == ["BC-20260702-000"]
|
|
43
|
-
assert "grafana_url 不为空" in chain["nodes"][0]["checks"][0]
|
|
44
|
-
PY
|
|
45
|
-
|
|
46
|
-
RUN_OUTPUT="$(python3 "$SCRIPT" dev-complete --root "$ROOT")"
|
|
47
|
-
printf '%s\n' "$RUN_OUTPUT" | grep -q "1 passed, 0 failed, 0 blocked"
|
|
48
|
-
printf '%s\n' "$RUN_OUTPUT" | grep -q "success artifacts cleaned"
|
package/tests/BC-20260706-098.sh
DELETED
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
set -euo pipefail
|
|
3
|
-
|
|
4
|
-
SCRIPT="${1:-$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)/scripts/context_guard.py}"
|
|
5
|
-
ROOT="$(mktemp -d "${TMPDIR:-/tmp}/context-guard-feature-chain-method-XXXXXX")"
|
|
6
|
-
trap 'rm -rf "$ROOT"' EXIT
|
|
7
|
-
|
|
8
|
-
python3 "$SCRIPT" init --root "$ROOT" >/dev/null
|
|
9
|
-
|
|
10
|
-
ADD_OUTPUT="$(python3 "$SCRIPT" feature-chain-add \
|
|
11
|
-
--root "$ROOT" \
|
|
12
|
-
--title "Markdown 公式预览" \
|
|
13
|
-
--entry "用户输入包含单行和多行公式的 Markdown" \
|
|
14
|
-
--exit-check "预览区展示 MathJax 渲染结果且没有空白或报错")"
|
|
15
|
-
|
|
16
|
-
CHAIN_ID="$(printf '%s\n' "$ADD_OUTPUT" | awk '/feature chain:/ {print $NF}')"
|
|
17
|
-
test -n "$CHAIN_ID"
|
|
18
|
-
|
|
19
|
-
python3 "$SCRIPT" feature-chain-attach-bc \
|
|
20
|
-
--root "$ROOT" \
|
|
21
|
-
--chain-id "$CHAIN_ID" \
|
|
22
|
-
--node-title "公式输入进入预览流程" \
|
|
23
|
-
--bad-case "BC-20260706-001" \
|
|
24
|
-
--check "输入包含 $ 和 $$ 公式时预览流程没有丢弃公式文本" >/dev/null
|
|
25
|
-
|
|
26
|
-
python3 "$SCRIPT" feature-chain-attach-bc \
|
|
27
|
-
--root "$ROOT" \
|
|
28
|
-
--chain-id "$CHAIN_ID" \
|
|
29
|
-
--node-title "MathJax 渲染完成" \
|
|
30
|
-
--bad-case "BC-20260706-002" \
|
|
31
|
-
--check "渲染完成后页面不显示原始 LaTeX、空白或错误占位" >/dev/null
|
|
32
|
-
|
|
33
|
-
python3 "$SCRIPT" feature-chain-attach-bc \
|
|
34
|
-
--root "$ROOT" \
|
|
35
|
-
--chain-id "$CHAIN_ID" \
|
|
36
|
-
--node-title "MathJax 渲染完成" \
|
|
37
|
-
--bad-case "BC-20260706-003" \
|
|
38
|
-
--check "重复开发后单行、多行、矩阵公式仍共用同一预览链路验证" >/dev/null
|
|
39
|
-
|
|
40
|
-
COMMAND="tmp=.codex/context/test-hub/feature-chain-evidence.tmp; printf 'CG_CHECKPOINT:公式输入进入预览流程:PASS\nCG_CHECKPOINT:MathJax 渲染完成:PASS\n' > \"\$tmp\"; cat \"\$tmp\"; rm -f \"\$tmp\""
|
|
41
|
-
python3 "$SCRIPT" feature-chain-approve \
|
|
42
|
-
--root "$ROOT" \
|
|
43
|
-
--chain-id "$CHAIN_ID" \
|
|
44
|
-
--command-text "$COMMAND" >/dev/null
|
|
45
|
-
|
|
46
|
-
python3 "$SCRIPT" feature-chain-list --root "$ROOT" | grep -q "covers BC-20260706-001, BC-20260706-002, BC-20260706-003"
|
|
47
|
-
|
|
48
|
-
python3 - "$ROOT/.codex/context/test-hub/feature-chains.json" "$CHAIN_ID" <<'PY'
|
|
49
|
-
from pathlib import Path
|
|
50
|
-
import json
|
|
51
|
-
import sys
|
|
52
|
-
|
|
53
|
-
data = json.loads(Path(sys.argv[1]).read_text(encoding="utf-8"))
|
|
54
|
-
chain = next(item for item in data["chains"] if item["id"] == sys.argv[2])
|
|
55
|
-
assert chain["title"] == "Markdown 公式预览"
|
|
56
|
-
assert len(chain["nodes"]) == 2
|
|
57
|
-
covered = sorted(bc for node in chain["nodes"] for bc in node["bad_cases"])
|
|
58
|
-
assert covered == ["BC-20260706-001", "BC-20260706-002", "BC-20260706-003"]
|
|
59
|
-
assert chain["run_policy"] == "every-dev-completion"
|
|
60
|
-
assert chain["status"] == "approved"
|
|
61
|
-
PY
|
|
62
|
-
|
|
63
|
-
RUN_OUTPUT="$(python3 "$SCRIPT" dev-complete --root "$ROOT")"
|
|
64
|
-
printf '%s\n' "$RUN_OUTPUT" | grep -q "1 passed, 0 failed, 0 blocked"
|
|
65
|
-
printf '%s\n' "$RUN_OUTPUT" | grep -q "success artifacts cleaned"
|
|
66
|
-
test ! -e "$ROOT/.codex/context/test-hub/feature-chain-evidence.tmp"
|
package/tests/BC-20260707-099.sh
DELETED
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
set -euo pipefail
|
|
3
|
-
|
|
4
|
-
SCRIPT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)/scripts/context_guard.py"
|
|
5
|
-
ROOT="$(mktemp -d "${TMPDIR:-/tmp}/context-guard-feature-chain-validate-XXXXXX")"
|
|
6
|
-
trap 'rm -rf "$ROOT"' EXIT
|
|
7
|
-
OUT="$ROOT/validate.out"
|
|
8
|
-
|
|
9
|
-
python3 "$SCRIPT" init --root "$ROOT" >/dev/null
|
|
10
|
-
|
|
11
|
-
ADD_OUTPUT="$(python3 "$SCRIPT" feature-chain-add \
|
|
12
|
-
--root "$ROOT" \
|
|
13
|
-
--title "Markdown 公式预览" \
|
|
14
|
-
--entry "用户输入 Markdown 公式" \
|
|
15
|
-
--exit-check "预览区显示 MathJax 渲染结果" \
|
|
16
|
-
--command-text "printf 'ok\n'")"
|
|
17
|
-
|
|
18
|
-
CHAIN_ID="$(printf '%s\n' "$ADD_OUTPUT" | sed -n 's/.*feature chain: //p')"
|
|
19
|
-
|
|
20
|
-
python3 - "$ROOT/.codex/context/test-hub/feature-chains.json" "$CHAIN_ID" <<'PY'
|
|
21
|
-
from pathlib import Path
|
|
22
|
-
import json
|
|
23
|
-
import sys
|
|
24
|
-
path = Path(sys.argv[1])
|
|
25
|
-
chain_id = sys.argv[2]
|
|
26
|
-
data = json.loads(path.read_text(encoding="utf-8"))
|
|
27
|
-
chain = next(item for item in data["chains"] if item["id"] == chain_id)
|
|
28
|
-
chain["status"] = "approved"
|
|
29
|
-
chain["type"] = "command"
|
|
30
|
-
path.write_text(json.dumps(data, ensure_ascii=False, indent=2) + "\n", encoding="utf-8")
|
|
31
|
-
PY
|
|
32
|
-
|
|
33
|
-
if python3 "$SCRIPT" validate-feature-chains --root "$ROOT" >"$OUT" 2>&1; then
|
|
34
|
-
cat "$OUT"
|
|
35
|
-
exit 1
|
|
36
|
-
fi
|
|
37
|
-
grep -q "approved every-dev-completion chain must have at least one checkpoint node" "$OUT"
|
|
38
|
-
|
|
39
|
-
python3 "$SCRIPT" feature-chain-attach-bc \
|
|
40
|
-
--root "$ROOT" \
|
|
41
|
-
--chain-id "$CHAIN_ID" \
|
|
42
|
-
--node-title "MathJax 渲染完成" \
|
|
43
|
-
--bad-case "BC-20260707-099" \
|
|
44
|
-
--check "预览区包含渲染后的公式且没有空白" >/dev/null
|
|
45
|
-
|
|
46
|
-
python3 "$SCRIPT" validate-feature-chains --root "$ROOT" >"$OUT"
|
|
47
|
-
grep -q "feature-chain validation passed: 1 chain(s), 0 warning(s)" "$OUT"
|
package/tests/BC-20260707-100.sh
DELETED
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
set -euo pipefail
|
|
3
|
-
|
|
4
|
-
SCRIPT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)/scripts/context_guard.py"
|
|
5
|
-
ROOT="$(mktemp -d "${TMPDIR:-/tmp}/context-guard-feature-chain-suggest-XXXXXX")"
|
|
6
|
-
trap 'rm -rf "$ROOT"' EXIT
|
|
7
|
-
OUT="$ROOT/suggest.out"
|
|
8
|
-
|
|
9
|
-
python3 "$SCRIPT" init --root "$ROOT" >/dev/null
|
|
10
|
-
|
|
11
|
-
ADD_OUTPUT="$(python3 "$SCRIPT" feature-chain-add \
|
|
12
|
-
--root "$ROOT" \
|
|
13
|
-
--title "Markdown 公式预览" \
|
|
14
|
-
--entry "用户输入 Markdown 公式" \
|
|
15
|
-
--exit-check "预览区显示 MathJax 渲染结果")"
|
|
16
|
-
CHAIN_ID="$(printf '%s\n' "$ADD_OUTPUT" | sed -n 's/.*feature chain: //p')"
|
|
17
|
-
|
|
18
|
-
python3 "$SCRIPT" feature-chain-attach-bc \
|
|
19
|
-
--root "$ROOT" \
|
|
20
|
-
--chain-id "$CHAIN_ID" \
|
|
21
|
-
--node-title "MathJax 渲染完成" \
|
|
22
|
-
--bad-case "BC-20260707-100" \
|
|
23
|
-
--check "预览区包含渲染后的公式且没有空白" >/dev/null
|
|
24
|
-
|
|
25
|
-
python3 "$SCRIPT" feature-chain-add \
|
|
26
|
-
--root "$ROOT" \
|
|
27
|
-
--title "GPU 监控按钮" \
|
|
28
|
-
--entry "点击 GPU 监控按钮" \
|
|
29
|
-
--exit-check "打开包含 grafana_url 的监控页" >/dev/null
|
|
30
|
-
|
|
31
|
-
python3 "$SCRIPT" feature-chain-suggest \
|
|
32
|
-
--root "$ROOT" \
|
|
33
|
-
--query "Markdown 数学公式预览 MathJax 渲染空白" >"$OUT"
|
|
34
|
-
grep -q "Markdown 公式预览" "$OUT"
|
|
35
|
-
grep -q "MathJax 渲染完成" "$OUT"
|
|
36
|
-
grep -q "next: attach the bad case to a candidate checkpoint" "$OUT"
|
|
37
|
-
if grep -q "GPU 监控按钮" "$OUT"; then
|
|
38
|
-
cat "$OUT"
|
|
39
|
-
exit 1
|
|
40
|
-
fi
|
|
41
|
-
|
|
42
|
-
python3 "$SCRIPT" feature-chain-suggest \
|
|
43
|
-
--root "$ROOT" \
|
|
44
|
-
--query "worker lease keepalive 释放失败" >"$OUT"
|
|
45
|
-
grep -q "feature-chain candidates: none" "$OUT"
|
|
46
|
-
grep -q "proposal-needed" "$OUT"
|
package/tests/BC-20260707-101.sh
DELETED
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
set -euo pipefail
|
|
3
|
-
|
|
4
|
-
SCRIPT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)/scripts/context_guard.py"
|
|
5
|
-
ROOT="$(mktemp -d "${TMPDIR:-/tmp}/context-guard-feature-chain-proposed-XXXXXX")"
|
|
6
|
-
trap 'rm -rf "$ROOT"' EXIT
|
|
7
|
-
OUT="$ROOT/out.txt"
|
|
8
|
-
|
|
9
|
-
python3 "$SCRIPT" init --root "$ROOT" >/dev/null
|
|
10
|
-
|
|
11
|
-
ADD_OUTPUT="$(python3 "$SCRIPT" feature-chain-add \
|
|
12
|
-
--root "$ROOT" \
|
|
13
|
-
--title "Markdown 公式预览" \
|
|
14
|
-
--entry "用户输入 Markdown 公式" \
|
|
15
|
-
--exit-check "预览区显示 MathJax 渲染结果" \
|
|
16
|
-
--command-text "printf 'should not run unless approved\n'")"
|
|
17
|
-
CHAIN_ID="$(printf '%s\n' "$ADD_OUTPUT" | sed -n 's/.*feature chain: //p')"
|
|
18
|
-
|
|
19
|
-
python3 - "$ROOT/.codex/context/test-hub/feature-chains.json" "$CHAIN_ID" <<'PY'
|
|
20
|
-
from pathlib import Path
|
|
21
|
-
import json
|
|
22
|
-
import sys
|
|
23
|
-
|
|
24
|
-
registry = json.loads(Path(sys.argv[1]).read_text(encoding="utf-8"))
|
|
25
|
-
chain = next(item for item in registry["chains"] if item["id"] == sys.argv[2])
|
|
26
|
-
assert chain["status"] == "proposed", chain
|
|
27
|
-
assert chain["source"] == "feature-chain", chain
|
|
28
|
-
PY
|
|
29
|
-
|
|
30
|
-
python3 "$SCRIPT" dev-complete --root "$ROOT" >"$OUT"
|
|
31
|
-
grep -q "no approved every-dev-completion tests" "$OUT"
|
|
32
|
-
|
|
33
|
-
python3 "$SCRIPT" test-hub-add \
|
|
34
|
-
--root "$ROOT" \
|
|
35
|
-
--title "Context 初始化冒烟测试" \
|
|
36
|
-
--command-text "printf 'ok\n'" >/dev/null
|
|
37
|
-
|
|
38
|
-
python3 - "$ROOT/.codex/context/test-hub/registry.json" <<'PY'
|
|
39
|
-
from pathlib import Path
|
|
40
|
-
import json
|
|
41
|
-
import sys
|
|
42
|
-
|
|
43
|
-
registry = json.loads(Path(sys.argv[1]).read_text(encoding="utf-8"))
|
|
44
|
-
test = registry["tests"][0]
|
|
45
|
-
assert test["status"] == "approved", test
|
|
46
|
-
assert test["run_policy"] == "every-dev-completion", test
|
|
47
|
-
PY
|
package/tests/BC-20260707-102.sh
DELETED
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
set -euo pipefail
|
|
3
|
-
|
|
4
|
-
SCRIPT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)/scripts/context_guard.py"
|
|
5
|
-
ROOT="$(mktemp -d "${TMPDIR:-/tmp}/context-guard-feature-chain-approve-XXXXXX")"
|
|
6
|
-
trap 'rm -rf "$ROOT"' EXIT
|
|
7
|
-
OUT="$ROOT/out.txt"
|
|
8
|
-
|
|
9
|
-
python3 "$SCRIPT" init --root "$ROOT" >/dev/null
|
|
10
|
-
ADD_OUTPUT="$(python3 "$SCRIPT" feature-chain-add \
|
|
11
|
-
--root "$ROOT" \
|
|
12
|
-
--title "Markdown 公式预览" \
|
|
13
|
-
--entry "用户输入 Markdown 公式" \
|
|
14
|
-
--exit-check "预览区显示 MathJax 渲染结果")"
|
|
15
|
-
CHAIN_ID="$(printf '%s\n' "$ADD_OUTPUT" | sed -n 's/.*feature chain: //p')"
|
|
16
|
-
|
|
17
|
-
if python3 "$SCRIPT" feature-chain-approve \
|
|
18
|
-
--root "$ROOT" \
|
|
19
|
-
--chain-id "$CHAIN_ID" \
|
|
20
|
-
--command-text "printf 'ok\n'" >"$OUT" 2>&1; then
|
|
21
|
-
cat "$OUT"
|
|
22
|
-
exit 1
|
|
23
|
-
fi
|
|
24
|
-
grep -q "requires at least one checkpoint" "$OUT"
|
|
25
|
-
|
|
26
|
-
python3 "$SCRIPT" feature-chain-attach-bc \
|
|
27
|
-
--root "$ROOT" \
|
|
28
|
-
--chain-id "$CHAIN_ID" \
|
|
29
|
-
--node-title "MathJax 渲染完成" \
|
|
30
|
-
--bad-case "BC-20260707-102" \
|
|
31
|
-
--check "预览区包含渲染后的公式且没有空白" >/dev/null
|
|
32
|
-
|
|
33
|
-
if python3 "$SCRIPT" feature-chain-approve \
|
|
34
|
-
--root "$ROOT" \
|
|
35
|
-
--chain-id "$CHAIN_ID" >"$OUT" 2>&1; then
|
|
36
|
-
cat "$OUT"
|
|
37
|
-
exit 1
|
|
38
|
-
fi
|
|
39
|
-
grep -q "requires --command-text" "$OUT"
|
|
40
|
-
|
|
41
|
-
python3 "$SCRIPT" feature-chain-approve \
|
|
42
|
-
--root "$ROOT" \
|
|
43
|
-
--chain-id "$CHAIN_ID" \
|
|
44
|
-
--command-text "printf 'CG_CHECKPOINT:MathJax 渲染完成:PASS\n'" >"$OUT"
|
|
45
|
-
grep -q "feature chain approved" "$OUT"
|
|
46
|
-
|
|
47
|
-
python3 - "$ROOT/.codex/context/test-hub/feature-chains.json" "$CHAIN_ID" <<'PY'
|
|
48
|
-
from pathlib import Path
|
|
49
|
-
import json
|
|
50
|
-
import sys
|
|
51
|
-
|
|
52
|
-
chain = next(
|
|
53
|
-
item
|
|
54
|
-
for item in json.loads(Path(sys.argv[1]).read_text(encoding="utf-8"))["chains"]
|
|
55
|
-
if item["id"] == sys.argv[2]
|
|
56
|
-
)
|
|
57
|
-
assert chain["status"] == "approved"
|
|
58
|
-
assert chain["run_policy"] == "every-dev-completion"
|
|
59
|
-
assert chain["type"] == "command"
|
|
60
|
-
assert "CG_CHECKPOINT:MathJax 渲染完成:PASS" in chain["command"]
|
|
61
|
-
PY
|
|
62
|
-
|
|
63
|
-
python3 "$SCRIPT" validate-feature-chains --root "$ROOT" >"$OUT"
|
|
64
|
-
grep -q "feature-chain validation passed: 1 chain(s), 0 warning(s)" "$OUT"
|
|
65
|
-
|
|
66
|
-
python3 "$SCRIPT" dev-complete --root "$ROOT" >"$OUT"
|
|
67
|
-
grep -q "1 passed, 0 failed, 0 blocked" "$OUT"
|
|
68
|
-
grep -q "success artifacts cleaned" "$OUT"
|
package/tests/BC-20260707-103.sh
DELETED
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
set -euo pipefail
|
|
3
|
-
|
|
4
|
-
SCRIPT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)/scripts/context_guard.py"
|
|
5
|
-
ROOT="$(mktemp -d "${TMPDIR:-/tmp}/context-guard-feature-chain-policy-XXXXXX")"
|
|
6
|
-
trap 'rm -rf "$ROOT"' EXIT
|
|
7
|
-
OUT="$ROOT/out.txt"
|
|
8
|
-
|
|
9
|
-
python3 "$SCRIPT" init --root "$ROOT" >/dev/null
|
|
10
|
-
ADD_OUTPUT="$(python3 "$SCRIPT" feature-chain-add \
|
|
11
|
-
--root "$ROOT" \
|
|
12
|
-
--title "GPU 监控按钮" \
|
|
13
|
-
--entry "点击 GPU 监控按钮" \
|
|
14
|
-
--exit-check "打开包含有效 grafana_url 的监控页")"
|
|
15
|
-
CHAIN_ID="$(printf '%s\n' "$ADD_OUTPUT" | sed -n 's/.*feature chain: //p')"
|
|
16
|
-
|
|
17
|
-
python3 "$SCRIPT" feature-chain-attach-bc \
|
|
18
|
-
--root "$ROOT" \
|
|
19
|
-
--chain-id "$CHAIN_ID" \
|
|
20
|
-
--node-title "后端返回监控 URL" \
|
|
21
|
-
--bad-case "BC-20260707-103" \
|
|
22
|
-
--check "grafana_url 不为空" >/dev/null
|
|
23
|
-
|
|
24
|
-
python3 "$SCRIPT" feature-chain-approve \
|
|
25
|
-
--root "$ROOT" \
|
|
26
|
-
--chain-id "$CHAIN_ID" \
|
|
27
|
-
--command-text "printf 'CG_CHECKPOINT:后端返回监控 URL:PASS\n'" >/dev/null
|
|
28
|
-
|
|
29
|
-
python3 "$SCRIPT" dev-complete --root "$ROOT" >"$OUT"
|
|
30
|
-
grep -q "1 passed, 0 failed, 0 blocked" "$OUT"
|
|
31
|
-
|
|
32
|
-
python3 "$SCRIPT" feature-chain-set-policy \
|
|
33
|
-
--root "$ROOT" \
|
|
34
|
-
--chain-id "$CHAIN_ID" \
|
|
35
|
-
--run-policy "relevant-only" \
|
|
36
|
-
--reason "用户要求只在修改 GPU 监控流程时运行" >"$OUT"
|
|
37
|
-
grep -q "feature chain policy updated" "$OUT"
|
|
38
|
-
|
|
39
|
-
python3 - "$ROOT/.codex/context/test-hub/feature-chains.json" "$CHAIN_ID" <<'PY'
|
|
40
|
-
from pathlib import Path
|
|
41
|
-
import json
|
|
42
|
-
import sys
|
|
43
|
-
|
|
44
|
-
chain = next(
|
|
45
|
-
item
|
|
46
|
-
for item in json.loads(Path(sys.argv[1]).read_text(encoding="utf-8"))["chains"]
|
|
47
|
-
if item["id"] == sys.argv[2]
|
|
48
|
-
)
|
|
49
|
-
assert chain["status"] == "approved"
|
|
50
|
-
assert chain["run_policy"] == "relevant-only"
|
|
51
|
-
assert "GPU 监控" in chain["policy_reason"]
|
|
52
|
-
PY
|
|
53
|
-
|
|
54
|
-
python3 "$SCRIPT" dev-complete --root "$ROOT" >"$OUT"
|
|
55
|
-
grep -q "no approved every-dev-completion tests" "$OUT"
|
|
56
|
-
if grep -q "后端返回监控 URL" "$OUT"; then
|
|
57
|
-
cat "$OUT"
|
|
58
|
-
exit 1
|
|
59
|
-
fi
|