@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.
Files changed (161) hide show
  1. package/Coordinator.md +88 -0
  2. package/Executor.md +53 -0
  3. package/README.md +89 -224
  4. package/README.zh-CN.md +89 -224
  5. package/SKILL.md +26 -684
  6. package/THIRD_PARTY_NOTICES.md +47 -0
  7. package/Tester.md +53 -0
  8. package/agents/openai.yaml +2 -2
  9. package/bin/build-runtime.mjs +96 -0
  10. package/bin/context-guard-skill.js +399 -78
  11. package/bin/postinstall.js +2 -2
  12. package/hooks.json +89 -13
  13. package/licenses/JSONParse-MIT.txt +24 -0
  14. package/licenses/Marked-MIT.txt +44 -0
  15. package/licenses/Portless-Apache-2.0.txt +201 -0
  16. package/package.json +35 -6
  17. package/prototype/LICENSES/Marked-MIT.txt +44 -0
  18. package/prototype/LICENSES/Ready-redistribution.txt +14 -0
  19. package/prototype/attachments.mjs +75 -0
  20. package/prototype/coordinator-markdown.mjs +283 -0
  21. package/prototype/coordinator-working-blot.mjs +124 -0
  22. package/prototype/vendor/marked.mjs +2189 -0
  23. package/prototype/workbench-app.js +5197 -0
  24. package/prototype/workbench-data.js +33 -0
  25. package/prototype/workbench-sync.mjs +898 -0
  26. package/prototype/workbench.css +1050 -0
  27. package/prototype/workbench.html +211 -0
  28. package/prototype/working-blot-atlas.png +0 -0
  29. package/references/agent-handoff.md +40 -0
  30. package/references/claude-runtime.md +120 -0
  31. package/references/cloud-sync-interface.md +66 -0
  32. package/references/design-current.md +14 -0
  33. package/references/map-mount.md +41 -0
  34. package/references/map-read.md +50 -0
  35. package/references/memory-definition.md +120 -0
  36. package/references/memory-filesystem-v2/Bug.en.md +162 -0
  37. package/references/memory-filesystem-v2/Bug.md +162 -0
  38. package/references/memory-filesystem-v2/Bug_Coordinater.md +8 -0
  39. package/references/memory-filesystem-v2/Bug_Executor.md +8 -0
  40. package/references/memory-filesystem-v2/Bug_Tester.md +7 -0
  41. package/references/memory-filesystem-v2/Idea.en.md +36 -0
  42. package/references/memory-filesystem-v2/Idea.md +36 -0
  43. package/references/memory-filesystem-v2/Node_Module_Index.en.md +88 -0
  44. package/references/memory-filesystem-v2/Node_Module_Index.md +88 -0
  45. package/references/memory-filesystem-v2/README.md +60 -0
  46. package/references/memory-filesystem-v2/Todo.en.md +137 -0
  47. package/references/memory-filesystem-v2/Todo.md +137 -0
  48. package/references/memory-filesystem-v2/Todo_Coordinater.md +7 -0
  49. package/references/memory-filesystem-v2/Todo_Executor.md +7 -0
  50. package/references/memory-filesystem-v2/Todo_Tester.md +7 -0
  51. package/references/named-workbench.md +124 -0
  52. package/references/plan-review.md +12 -0
  53. package/references/server-memory.md +276 -0
  54. package/references/test-check.md +7 -0
  55. package/references/user-reply.md +38 -0
  56. package/references/workbench-interface.md +531 -0
  57. package/roles.md +13 -0
  58. package/scripts/context_guard.py +1366 -7602
  59. package/scripts/context_guard_hook.py +1960 -711
  60. package/scripts/map_owns.py +699 -0
  61. package/scripts/shared/LICENSES/JSONParse-MIT.txt +24 -0
  62. package/scripts/shared/filesystem-v2.mjs +430 -0
  63. package/scripts/shared/io.mjs +117 -0
  64. package/scripts/shared/map-model.mjs +506 -0
  65. package/scripts/shared/memory-schema.mjs +13 -0
  66. package/scripts/shared/protocol-blobs.mjs +112 -0
  67. package/scripts/shared/protocol-map.mjs +146 -0
  68. package/scripts/shared/protocol-snapshots.mjs +84 -0
  69. package/scripts/shared/protocol-store.mjs +624 -0
  70. package/scripts/shared/protocol-workflow.mjs +226 -0
  71. package/scripts/shared/protocol.mjs +125 -0
  72. package/scripts/shared/vendor/jsonparse.cjs +413 -0
  73. package/scripts/workbench/access.mjs +496 -0
  74. package/scripts/workbench/attachments.mjs +92 -0
  75. package/scripts/workbench/browser-login.mjs +78 -0
  76. package/scripts/workbench/claude-runtime.mjs +372 -0
  77. package/scripts/workbench/cli.mjs +980 -0
  78. package/scripts/workbench/device-heartbeat.mjs +72 -0
  79. package/scripts/workbench/hook-status.mjs +38 -0
  80. package/scripts/workbench/inbox.mjs +155 -0
  81. package/scripts/workbench/journal.mjs +56 -0
  82. package/scripts/workbench/memory-merge.mjs +65 -0
  83. package/scripts/workbench/memory.mjs +252 -0
  84. package/scripts/workbench/named-proxy.mjs +108 -0
  85. package/scripts/workbench/named.mjs +152 -0
  86. package/scripts/workbench/portless-routes.mjs +51 -0
  87. package/scripts/workbench/project.mjs +327 -0
  88. package/scripts/workbench/projections.mjs +68 -0
  89. package/scripts/workbench/protocol-client.mjs +165 -0
  90. package/scripts/workbench/protocol-delivery.mjs +133 -0
  91. package/scripts/workbench/protocol-device.mjs +316 -0
  92. package/scripts/workbench/protocol-events.mjs +53 -0
  93. package/scripts/workbench/protocol-repository.mjs +58 -0
  94. package/scripts/workbench/reconcile.mjs +244 -0
  95. package/scripts/workbench/registry.mjs +111 -0
  96. package/scripts/workbench/runtime.mjs +54 -0
  97. package/scripts/workbench/server.mjs +1171 -0
  98. package/scripts/workbench/store.mjs +243 -0
  99. package/scripts/workbench/sync-coordinator.mjs +518 -0
  100. package/scripts/workbench/sync.mjs +86 -0
  101. package/references/context-template.md +0 -341
  102. package/references/feature-chain-methodology.md +0 -228
  103. package/references/register-template.md +0 -85
  104. package/references/task-case-template.md +0 -63
  105. package/tests/BC-20260618-063.sh +0 -116
  106. package/tests/BC-20260618-065.sh +0 -66
  107. package/tests/BC-20260626-080.sh +0 -48
  108. package/tests/BC-20260626-081.sh +0 -40
  109. package/tests/BC-20260626-082.sh +0 -32
  110. package/tests/BC-20260626-083.sh +0 -66
  111. package/tests/BC-20260627-084.sh +0 -74
  112. package/tests/BC-20260630-086.sh +0 -50
  113. package/tests/BC-20260630-087.sh +0 -103
  114. package/tests/BC-20260630-088.sh +0 -32
  115. package/tests/BC-20260630-089.sh +0 -63
  116. package/tests/BC-20260701-090.sh +0 -84
  117. package/tests/BC-20260702-096.sh +0 -48
  118. package/tests/BC-20260706-098.sh +0 -66
  119. package/tests/BC-20260707-099.sh +0 -47
  120. package/tests/BC-20260707-100.sh +0 -46
  121. package/tests/BC-20260707-101.sh +0 -47
  122. package/tests/BC-20260707-102.sh +0 -68
  123. package/tests/BC-20260707-103.sh +0 -59
  124. package/tests/BC-20260707-104.sh +0 -103
  125. package/tests/BC-20260707-105.sh +0 -109
  126. package/tests/BC-20260707-106.sh +0 -80
  127. package/tests/BC-20260707-107.sh +0 -74
  128. package/tests/BC-20260707-108.sh +0 -48
  129. package/tests/BC-20260707-109.sh +0 -56
  130. package/tests/BC-20260707-110.sh +0 -71
  131. package/tests/BC-20260707-111.sh +0 -70
  132. package/tests/BC-20260707-112.sh +0 -45
  133. package/tests/BC-20260707-113.sh +0 -73
  134. package/tests/BC-20260707-115.sh +0 -77
  135. package/tests/BC-20260707-116.sh +0 -77
  136. package/tests/BC-20260707-118.sh +0 -115
  137. package/tests/BC-20260707-119.sh +0 -47
  138. package/tests/BC-20260707-120.sh +0 -60
  139. package/tests/BC-20260707-121.sh +0 -66
  140. package/tests/BC-20260707-122.sh +0 -48
  141. package/tests/BC-20260707-123.sh +0 -43
  142. package/tests/BC-20260707-124.sh +0 -56
  143. package/tests/BC-20260707-125.sh +0 -64
  144. package/tests/BC-20260707-126.sh +0 -80
  145. package/tests/BC-20260707-127.sh +0 -88
  146. package/tests/BC-20260707-129.sh +0 -59
  147. package/tests/BC-20260707-130.sh +0 -69
  148. package/tests/BC-20260707-131.sh +0 -140
  149. package/tests/BC-20260707-132.sh +0 -150
  150. package/tests/BC-20260707-133.sh +0 -70
  151. package/tests/BC-20260708-136.sh +0 -210
  152. package/tests/BC-20260708-137.sh +0 -106
  153. package/tests/BC-20260708-138.sh +0 -168
  154. package/tests/BC-20260708-139.sh +0 -79
  155. package/tests/BC-20260709-002.sh +0 -63
  156. package/tests/BC-20260709-003.sh +0 -239
  157. package/tests/BC-20260709-006.sh +0 -76
  158. package/tests/BC-20260709-008.sh +0 -168
  159. package/tests/BC-20260710-001.sh +0 -61
  160. package/tests/BC-20260710-002.sh +0 -111
  161. package/tests/npm-install-smoke.sh +0 -53
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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"
@@ -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"
@@ -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"
@@ -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"
@@ -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
@@ -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"
@@ -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