@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,73 +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-coverage-suggest-XXXXXX")"
6
- trap 'rm -rf "$ROOT"' EXIT
7
- OUT="$ROOT/out.txt"
8
-
9
- python3 "$SCRIPT" init --root "$ROOT" >/dev/null
10
- cat >"$ROOT/.codex/context/bad-cases.md" <<'MD'
11
- # Bad Case Register
12
-
13
- ### BC-20260707-113: GPU 监控点击没有打开 Grafana 页面
14
-
15
- - Status: resolved
16
- - Tags: #gpu #grafana #ui
17
- - Display summary: 点击 GPU 监控按钮后,前端没有打开包含 grafana_url 的监控页。
18
- - Phenomenon: 用户点击 GPU 监控后页面卡住,或者跳转 URL 为空。
19
- - Trigger / reproduction: job payload 缺少 grafana_url,前端仍把它当成可打开的监控入口。
20
-
21
- ### BC-20260707-114: 后端返回监控 URL 为空
22
-
23
- - Status: resolved
24
- - Tags: #gpu #backend
25
- - Display summary: 后端没有给 GPU 监控按钮返回 grafana_url。
26
-
27
- ### BC-20260707-115: Worker keepalive 状态丢失
28
-
29
- - Status: resolved
30
- - Tags: #worker #lifecycle
31
- - Display summary: 空闲 worker 没有进入 keepalive_running。
32
- MD
33
-
34
- ADD_OUTPUT="$(python3 "$SCRIPT" feature-chain-add \
35
- --root "$ROOT" \
36
- --title "GPU 监控按钮" \
37
- --entry "点击 GPU 监控按钮" \
38
- --exit-check "打开包含有效 grafana_url 的 Grafana 监控页")"
39
- CHAIN_ID="$(printf '%s\n' "$ADD_OUTPUT" | sed -n 's/.*feature chain: //p')"
40
-
41
- python3 "$SCRIPT" feature-chain-attach-bc \
42
- --root "$ROOT" \
43
- --chain-id "$CHAIN_ID" \
44
- --node-title "后端返回监控 URL" \
45
- --bad-case "BC-20260707-114" \
46
- --check "grafana_url 不为空" >/dev/null
47
-
48
- python3 "$SCRIPT" feature-chain-attach-bc \
49
- --root "$ROOT" \
50
- --chain-id "$CHAIN_ID" \
51
- --node-title "前端打开 Grafana 监控页" \
52
- --bad-case "BC-20260707-000" \
53
- --check "点击后进入 grafana_url 页面" >/dev/null
54
-
55
- BEFORE="$(cat "$ROOT/.codex/context/test-hub/feature-chains.json")"
56
- python3 "$SCRIPT" feature-chain-coverage --root "$ROOT" >"$OUT"
57
- AFTER="$(cat "$ROOT/.codex/context/test-hub/feature-chains.json")"
58
-
59
- grep -q "covered by feature chains: 1" "$OUT"
60
- grep -q "unassigned candidates: 2" "$OUT"
61
- grep -q "candidate: BC-20260707-113 | GPU 监控点击没有打开 Grafana 页面" "$OUT"
62
- grep -q "possible chain: $CHAIN_ID" "$OUT"
63
- grep -q "possible checkpoint: 前端打开 Grafana 监控页" "$OUT"
64
- grep -q "match evidence:" "$OUT"
65
- grep -q "grafana" "$OUT"
66
- grep -q "candidate: BC-20260707-115 | Worker keepalive 状态丢失" "$OUT"
67
- if awk '/candidate: BC-20260707-115/{flag=1; next} flag && /possible chain/{exit 1} flag && /registry:/{exit 0}' "$OUT"; then
68
- :
69
- else
70
- cat "$OUT"
71
- exit 1
72
- fi
73
- test "$BEFORE" = "$AFTER"
@@ -1,77 +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-plan-XXXXXX")"
6
- trap 'rm -rf "$ROOT"' EXIT
7
- STRONG_OUT="$ROOT/strong.txt"
8
- WEAK_OUT="$ROOT/weak.txt"
9
-
10
- python3 "$SCRIPT" init --root "$ROOT" >/dev/null
11
- cat >"$ROOT/.codex/context/bad-cases.md" <<'MD'
12
- # Bad Case Register
13
-
14
- ### BC-20260707-115: GPU 监控点击没有打开 Grafana 页面
15
-
16
- - Status: resolved
17
- - Tags: #gpu #grafana #ui
18
- - Display summary: 点击 GPU 监控按钮后,前端没有打开包含 grafana_url 的监控页。
19
- - Phenomenon: 用户点击 GPU 监控后页面卡住,或者跳转 URL 为空。
20
- - Trigger / reproduction: job payload 缺少 grafana_url,前端仍把它当成可打开的监控入口。
21
-
22
- ### BC-20260707-116: Worker keepalive 状态丢失
23
-
24
- - Status: resolved
25
- - Tags: #worker #lifecycle
26
- - Display summary: 空闲 worker 没有进入 keepalive_running。
27
- MD
28
-
29
- ADD_OUTPUT="$(python3 "$SCRIPT" feature-chain-add \
30
- --root "$ROOT" \
31
- --title "GPU 监控按钮" \
32
- --entry "点击 GPU 监控按钮" \
33
- --exit-check "打开包含有效 grafana_url 的 Grafana 监控页")"
34
- CHAIN_ID="$(printf '%s\n' "$ADD_OUTPUT" | sed -n 's/.*feature chain: //p')"
35
-
36
- python3 "$SCRIPT" feature-chain-attach-bc \
37
- --root "$ROOT" \
38
- --chain-id "$CHAIN_ID" \
39
- --node-title "前端打开 Grafana 监控页" \
40
- --bad-case "BC-20260707-115" \
41
- --check "点击后进入 grafana_url 页面" >/dev/null
42
-
43
- BEFORE="$(cat "$ROOT/.codex/context/test-hub/feature-chains.json")"
44
- python3 "$SCRIPT" feature-chain-plan --root "$ROOT" --query "BC-20260707-115" >"$STRONG_OUT"
45
- python3 "$SCRIPT" feature-chain-plan --root "$ROOT" --query "BC-20260707-116" >"$WEAK_OUT"
46
- AFTER="$(cat "$ROOT/.codex/context/test-hub/feature-chains.json")"
47
-
48
- grep -q "action: review-existing-chain" "$STRONG_OUT"
49
- grep -q "chain: $CHAIN_ID" "$STRONG_OUT"
50
- grep -q "checkpoint: 前端打开 Grafana 监控页" "$STRONG_OUT"
51
- grep -q "match evidence:" "$STRONG_OUT"
52
- grep -q "after-confirmation command: .*feature-chain-attach-bc" "$STRONG_OUT"
53
- grep -q -- "--bad-case BC-20260707-115" "$STRONG_OUT"
54
- grep -q "tighten checkpoint based on confirmed symptom" "$STRONG_OUT"
55
- grep -q "next: if the user confirms the match" "$STRONG_OUT"
56
-
57
- grep -q "action: propose-new-chain" "$WEAK_OUT"
58
- grep -q "confirmation prompt: 测试创建识别" "$WEAK_OUT"
59
- grep -q "Worker keepalive 状态丢失" "$WEAK_OUT"
60
- grep -q "after-confirmation command: .*feature-chain-propose" "$WEAK_OUT"
61
- grep -q "confirmed feature title" "$WEAK_OUT"
62
- grep -q -- "--node-title 'Worker keepalive 状态丢失'" "$WEAK_OUT"
63
- grep -q -- "--bad-cases BC-20260707-116" "$WEAK_OUT"
64
- if grep -q "after-confirmation command: .*feature-chain-add" "$WEAK_OUT"; then
65
- cat "$WEAK_OUT"
66
- exit 1
67
- fi
68
- if grep -q "从「BC-20260707-116」相关入口" "$WEAK_OUT"; then
69
- cat "$WEAK_OUT"
70
- exit 1
71
- fi
72
- if grep -q "action: review-existing-chain" "$WEAK_OUT"; then
73
- cat "$WEAK_OUT"
74
- exit 1
75
- fi
76
-
77
- test "$BEFORE" = "$AFTER"
@@ -1,77 +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-candidates-XXXXXX")"
6
- trap 'rm -rf "$ROOT"' EXIT
7
- OUT="$ROOT/out.txt"
8
-
9
- python3 "$SCRIPT" init --root "$ROOT" >/dev/null
10
- cat >"$ROOT/.codex/context/bad-cases.md" <<'MD'
11
- # Bad Case Register
12
-
13
- ### BC-20260707-116: Roadmap 卡片标题看不懂
14
-
15
- - Status: resolved
16
- - Tags: #roadmap-ux #readability
17
- - Display summary: 路线图卡片标题像实现日志,不像用户任务。
18
-
19
- ### BC-20260707-117: Roadmap 详情页太啰嗦
20
-
21
- - Status: resolved
22
- - Tags: #roadmap-ux #readability
23
- - Display summary: 点击节点后看到太多字段,无法快速理解任务。
24
-
25
- ### BC-20260707-118: Context 没有在新会话恢复
26
-
27
- - Status: resolved
28
- - Tags: #context-loss
29
- - Display summary: 新会话不知道之前已经讨论过的路线。
30
-
31
- ### BC-20260707-119: Context 写到远程服务器路径
32
-
33
- - Status: resolved
34
- - Tags: #context-loss #remote
35
- - Display summary: SSH 开发时 context 被写到远程路径。
36
-
37
- ### BC-20260707-120: 已覆盖的 roadmap 旧问题
38
-
39
- - Status: resolved
40
- - Tags: #roadmap-ux
41
- - Display summary: 已经挂到功能链的旧路线图问题。
42
- MD
43
-
44
- ADD_OUTPUT="$(python3 "$SCRIPT" feature-chain-add \
45
- --root "$ROOT" \
46
- --title "路线图展示体验" \
47
- --entry "打开 roadmap.html" \
48
- --exit-check "用户能快速看懂路线图节点")"
49
- CHAIN_ID="$(printf '%s\n' "$ADD_OUTPUT" | sed -n 's/.*feature chain: //p')"
50
- python3 "$SCRIPT" feature-chain-attach-bc \
51
- --root "$ROOT" \
52
- --chain-id "$CHAIN_ID" \
53
- --node-title "路线图卡片可读" \
54
- --bad-case "BC-20260707-120" \
55
- --check "卡片标题能直接说明任务" >/dev/null
56
-
57
- BEFORE="$(cat "$ROOT/.codex/context/test-hub/feature-chains.json")"
58
- python3 "$SCRIPT" feature-chain-candidates --root "$ROOT" --min-cases 2 >"$OUT"
59
- AFTER="$(cat "$ROOT/.codex/context/test-hub/feature-chains.json")"
60
-
61
- grep -q "feature-chain candidates" "$OUT"
62
- grep -q "candidate chain: 路线图展示体验 / 可读性 | 2 unassigned bad cases | new coverage: 2 | tags: #roadmap-ux, #readability" "$OUT"
63
- grep -q "candidate chain: Context 持久化 | 2 unassigned bad cases | new coverage: 2 | tags: #context-loss" "$OUT"
64
- grep -q "confirmation prompt: 测试创建识别" "$OUT"
65
- grep -q "BC-20260707-116" "$OUT"
66
- grep -q "BC-20260707-117" "$OUT"
67
- grep -q "BC-20260707-118" "$OUT"
68
- grep -q "BC-20260707-119" "$OUT"
69
- if grep -q "BC-20260707-120" "$OUT"; then
70
- cat "$OUT"
71
- exit 1
72
- fi
73
- if grep -q "candidate chain: 路线图展示体验 | 2 unassigned bad cases | tags: #roadmap-ux" "$OUT"; then
74
- cat "$OUT"
75
- exit 1
76
- fi
77
- test "$BEFORE" = "$AFTER"
@@ -1,115 +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_FAIL="$(mktemp -d "${TMPDIR:-/tmp}/context-guard-feature-chain-closed-loop-fail-XXXXXX")"
6
- ROOT_PASS="$(mktemp -d "${TMPDIR:-/tmp}/context-guard-feature-chain-closed-loop-pass-XXXXXX")"
7
- trap 'rm -rf "$ROOT_FAIL" "$ROOT_PASS"' EXIT
8
- OUT="$ROOT_FAIL/out.txt"
9
-
10
- create_chain() {
11
- local root="$1"
12
- local command_text="$2"
13
- local mode="${3:-approve}"
14
- python3 "$SCRIPT" init --root "$root" >/dev/null
15
- local add_output
16
- add_output="$(python3 "$SCRIPT" feature-chain-add \
17
- --root "$root" \
18
- --title "Markdown 公式预览" \
19
- --entry "输入包含单行、多行和矩阵公式的 Markdown" \
20
- --exit-check "预览区完成 MathJax 渲染且没有空白或错误占位")"
21
- local chain_id
22
- chain_id="$(printf '%s\n' "$add_output" | sed -n 's/.*feature chain: //p')"
23
- test -n "$chain_id"
24
-
25
- python3 "$SCRIPT" feature-chain-attach-bc \
26
- --root "$root" \
27
- --chain-id "$chain_id" \
28
- --node-title "公式输入进入预览流程" \
29
- --bad-case "BC-20260707-118-input" \
30
- --check "单行、多行和矩阵公式都进入同一预览流程" >/dev/null
31
-
32
- python3 "$SCRIPT" feature-chain-attach-bc \
33
- --root "$root" \
34
- --chain-id "$chain_id" \
35
- --node-title "MathJax 渲染完成" \
36
- --bad-case "BC-20260707-118-render" \
37
- --check "预览区展示渲染后的公式且没有空白或错误占位" >/dev/null
38
-
39
- if [[ "$mode" == "direct-approved" ]]; then
40
- python3 - "$root/.codex/context/test-hub/feature-chains.json" "$chain_id" "$command_text" <<'PY'
41
- from pathlib import Path
42
- import json
43
- import sys
44
- path = Path(sys.argv[1])
45
- chain_id = sys.argv[2]
46
- command = sys.argv[3]
47
- data = json.loads(path.read_text(encoding="utf-8"))
48
- chain = next(item for item in data["chains"] if item["id"] == chain_id)
49
- chain["status"] = "approved"
50
- chain["type"] = "command"
51
- chain["command"] = command
52
- path.write_text(json.dumps(data, ensure_ascii=False, indent=2) + "\n", encoding="utf-8")
53
- PY
54
- else
55
- python3 "$SCRIPT" feature-chain-approve \
56
- --root "$root" \
57
- --chain-id "$chain_id" \
58
- --command-text "$command_text" >/dev/null
59
- fi
60
-
61
- python3 "$SCRIPT" validate-feature-chains --root "$root" | grep -q "feature-chain validation passed"
62
- }
63
-
64
- FAIL_COMMAND='printf "CG_CHECKPOINT:公式输入进入预览流程:PASS\nCG_CHECKPOINT:MathJax 渲染完成:FAIL:预览区为空\n"; printf "render empty\n" > "$CONTEXT_GUARD_TEST_RUN_DIR/render-diagnostic.txt"'
65
- create_chain "$ROOT_FAIL" "$FAIL_COMMAND" direct-approved
66
-
67
- if python3 "$SCRIPT" dev-complete --root "$ROOT_FAIL" >"$OUT" 2>&1; then
68
- cat "$OUT"
69
- exit 1
70
- fi
71
- grep -q "0 passed, 1 failed, 0 blocked" "$OUT"
72
- grep -q "checkpoint failed: MathJax 渲染完成 - 预览区为空" "$OUT"
73
- grep -q "evidence preserved" "$OUT"
74
-
75
- python3 - "$ROOT_FAIL/.codex/context/test-hub/last-run.json" <<'PY'
76
- from pathlib import Path
77
- import json
78
- import sys
79
-
80
- run = json.loads(Path(sys.argv[1]).read_text(encoding="utf-8"))
81
- result = run["results"][0]
82
- assert result["status"] == "failed"
83
- assert result["reason"] == "checkpoint failed: MathJax 渲染完成 - 预览区为空"
84
- assert [item["label"] for item in result["checkpoints"]] == ["公式输入进入预览流程", "MathJax 渲染完成"]
85
- log_path = Path(result["log"])
86
- run_dir = log_path.parent
87
- assert run_dir.exists(), run_dir
88
- assert (run_dir / "render-diagnostic.txt").exists()
89
- PY
90
-
91
- PASS_COMMAND='tmp=.codex/context/test-hub/feature-chain-closed-loop.tmp; printf "CG_CHECKPOINT:公式输入进入预览流程:PASS\nCG_CHECKPOINT:MathJax 渲染完成:PASS\n" > "$tmp"; cat "$tmp"; rm -f "$tmp"'
92
- create_chain "$ROOT_PASS" "$PASS_COMMAND"
93
-
94
- python3 "$SCRIPT" dev-complete --root "$ROOT_PASS" >"$OUT"
95
- grep -q "1 passed, 0 failed, 0 blocked" "$OUT"
96
- grep -q "success artifacts cleaned" "$OUT"
97
- test ! -e "$ROOT_PASS/.codex/context/test-hub/feature-chain-closed-loop.tmp"
98
- if find "$ROOT_PASS/.codex/context/test-hub/runs" -mindepth 1 -maxdepth 1 2>/dev/null | grep -q .; then
99
- find "$ROOT_PASS/.codex/context/test-hub/runs" -mindepth 1 -maxdepth 1
100
- exit 1
101
- fi
102
-
103
- python3 - "$ROOT_PASS/.codex/context/test-hub/feature-chains.json" "$ROOT_PASS/.codex/context/test-hub/last-run.json" <<'PY'
104
- from pathlib import Path
105
- import json
106
- import sys
107
-
108
- registry = json.loads(Path(sys.argv[1]).read_text(encoding="utf-8"))
109
- chain = registry["chains"][0]
110
- covered = sorted(bc for node in chain["nodes"] for bc in node["bad_cases"])
111
- assert covered == ["BC-20260707-118-input", "BC-20260707-118-render"]
112
- result = json.loads(Path(sys.argv[2]).read_text(encoding="utf-8"))["results"][0]
113
- assert result["status"] == "passed"
114
- assert result["missing_checkpoints"] == []
115
- PY
@@ -1,47 +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-propose-XXXXXX")"
6
- trap 'rm -rf "$ROOT"' EXIT
7
- OUT="$ROOT/out.txt"
8
-
9
- python3 "$SCRIPT" init --root "$ROOT" >/dev/null
10
-
11
- python3 "$SCRIPT" feature-chain-propose \
12
- --root "$ROOT" \
13
- --title "路线图节点阅读" \
14
- --entry "用户点击路线图节点" \
15
- --exit-check "节点详情页用自然语言展示用户问题、相关 bad case、方法和进度" \
16
- --node-title "节点详情可读" \
17
- --bad-cases "BC-20260707-119-title, BC-20260707-119-detail" \
18
- --check "详情页能一眼看懂节点对应任务" >"$OUT"
19
-
20
- grep -q "feature chain proposed:" "$OUT"
21
- grep -q "status: proposed; this chain is not executable and will not run in dev-complete" "$OUT"
22
- grep -q "checkpoint: 节点详情可读 | covers BC-20260707-119-title, BC-20260707-119-detail" "$OUT"
23
- grep -q "next: after the user confirms the automation" "$OUT"
24
-
25
- python3 "$SCRIPT" validate-feature-chains --root "$ROOT" >"$OUT"
26
- grep -q "feature-chain validation passed: 1 chain(s), 0 warning(s)" "$OUT"
27
-
28
- python3 "$SCRIPT" dev-complete --root "$ROOT" >"$OUT"
29
- grep -q "test hub: no approved every-dev-completion tests" "$OUT"
30
-
31
- python3 - "$ROOT/.codex/context/test-hub/feature-chains.json" <<'PY'
32
- from pathlib import Path
33
- import json
34
- import sys
35
-
36
- registry = json.loads(Path(sys.argv[1]).read_text(encoding="utf-8"))
37
- chain = registry["chains"][0]
38
- assert chain["status"] == "proposed"
39
- assert chain["type"] == "manual"
40
- assert chain["command"] == ""
41
- assert chain["run_policy"] == "every-dev-completion"
42
- assert chain["proposal_note"].startswith("Human-confirmed draft only")
43
- node = chain["nodes"][0]
44
- assert node["title"] == "节点详情可读"
45
- assert node["bad_cases"] == ["BC-20260707-119-title", "BC-20260707-119-detail"]
46
- assert node["checks"] == ["详情页能一眼看懂节点对应任务"]
47
- PY
@@ -1,60 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
-
4
- ROOT="$(mktemp -d "${TMPDIR:-/tmp}/context-guard-feature-dry-run.XXXXXX")"
5
- trap 'rm -rf "$ROOT"' EXIT
6
-
7
- SCRIPT="/Users/bytedance/.agents/skills/context-guard/scripts/context_guard.py"
8
-
9
- python3 "$SCRIPT" init --root "$ROOT" >/dev/null
10
- python3 "$SCRIPT" set-language --root "$ROOT" --language zh >/dev/null
11
-
12
- python3 "$SCRIPT" feature-chain-propose \
13
- --root "$ROOT" \
14
- --title "Markdown 公式预览" \
15
- --entry "在编辑器输入公式" \
16
- --exit-check "预览区正确渲染公式" \
17
- --node-title "公式渲染完成" \
18
- --bad-cases "BC-TEST-001, BC-TEST-002" \
19
- --check "确认单行和多行公式都进入渲染结果" >/dev/null
20
-
21
- PASS_OUTPUT="$(
22
- python3 "$SCRIPT" feature-chain-dry-run \
23
- --root "$ROOT" \
24
- --chain-id FC-20260707-001 \
25
- --command-text "printf 'CG_CHECKPOINT:公式渲染完成:PASS\n'"
26
- )"
27
-
28
- grep -q "feature-chain dry run: passed" <<<"$PASS_OUTPUT"
29
- grep -q "checkpoint pass: 公式渲染完成" <<<"$PASS_OUTPUT"
30
- grep -q "dry-run success artifacts cleaned" <<<"$PASS_OUTPUT"
31
-
32
- set +e
33
- FAIL_OUTPUT="$(
34
- python3 "$SCRIPT" feature-chain-dry-run \
35
- --root "$ROOT" \
36
- --chain-id FC-20260707-001 \
37
- --command-text "true" 2>&1
38
- )"
39
- FAIL_STATUS=$?
40
- set -e
41
-
42
- test "$FAIL_STATUS" -ne 0
43
- grep -q "feature-chain dry run: failed" <<<"$FAIL_OUTPUT"
44
- grep -q "missing checkpoint marker: 公式渲染完成" <<<"$FAIL_OUTPUT"
45
- grep -q "dry-run evidence preserved" <<<"$FAIL_OUTPUT"
46
-
47
- python3 - "$ROOT/.codex/context/test-hub/feature-chains.json" <<'PY'
48
- import json
49
- import sys
50
- path = sys.argv[1]
51
- data = json.load(open(path, encoding="utf-8"))
52
- chain = data["chains"][0]
53
- assert chain["status"] == "proposed", chain
54
- assert chain["type"] == "manual", chain
55
- assert chain["command"] == "", chain
56
- assert chain["nodes"][0]["bad_cases"] == ["BC-TEST-001", "BC-TEST-002"], chain
57
- PY
58
-
59
- python3 "$SCRIPT" dev-complete --root "$ROOT" | grep -q "no approved every-dev-completion tests"
60
- test -f "$ROOT/.codex/context/test-hub/last-dry-run.json"
@@ -1,66 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
-
4
- ROOT="$(mktemp -d "${TMPDIR:-/tmp}/context-guard-approval-preflight.XXXXXX")"
5
- trap 'rm -rf "$ROOT"' EXIT
6
-
7
- SCRIPT="/Users/bytedance/.agents/skills/context-guard/scripts/context_guard.py"
8
- OUT="$ROOT/out.txt"
9
-
10
- python3 "$SCRIPT" init --root "$ROOT" >/dev/null
11
- python3 "$SCRIPT" set-language --root "$ROOT" --language zh >/dev/null
12
-
13
- python3 "$SCRIPT" feature-chain-propose \
14
- --root "$ROOT" \
15
- --title "Markdown 公式预览" \
16
- --entry "在编辑器输入公式" \
17
- --exit-check "预览区正确渲染公式" \
18
- --node-title "公式渲染完成" \
19
- --bad-cases "BC-TEST-001" \
20
- --check "确认公式进入渲染结果" >/dev/null
21
-
22
- set +e
23
- python3 "$SCRIPT" feature-chain-approve \
24
- --root "$ROOT" \
25
- --chain-id FC-20260707-001 \
26
- --command-text "true" >"$OUT" 2>&1
27
- STATUS=$?
28
- set -e
29
-
30
- test "$STATUS" -ne 0
31
- grep -q "approval dry-run failed" "$OUT"
32
- grep -q "missing checkpoint marker: 公式渲染完成" "$OUT"
33
- grep -q "requires a passing dry run before approval" "$OUT"
34
-
35
- python3 - "$ROOT/.codex/context/test-hub/feature-chains.json" <<'PY'
36
- import json
37
- import sys
38
- chain = json.load(open(sys.argv[1], encoding="utf-8"))["chains"][0]
39
- assert chain["status"] == "proposed", chain
40
- assert chain["type"] == "manual", chain
41
- assert chain["command"] == "", chain
42
- PY
43
-
44
- python3 "$SCRIPT" dev-complete --root "$ROOT" | grep -q "no approved every-dev-completion tests"
45
- test -f "$ROOT/.codex/context/test-hub/last-approval-dry-run.json"
46
-
47
- python3 "$SCRIPT" feature-chain-approve \
48
- --root "$ROOT" \
49
- --chain-id FC-20260707-001 \
50
- --command-text "printf 'CG_CHECKPOINT:公式渲染完成:PASS\n'" >"$OUT"
51
-
52
- grep -q "feature chain approved" "$OUT"
53
- grep -q "approval dry-run: passed" "$OUT"
54
-
55
- python3 - "$ROOT/.codex/context/test-hub/feature-chains.json" <<'PY'
56
- import json
57
- import sys
58
- chain = json.load(open(sys.argv[1], encoding="utf-8"))["chains"][0]
59
- assert chain["status"] == "approved", chain
60
- assert chain["type"] == "command", chain
61
- assert "CG_CHECKPOINT:公式渲染完成:PASS" in chain["command"], chain
62
- PY
63
-
64
- python3 "$SCRIPT" dev-complete --root "$ROOT" >"$OUT"
65
- grep -q "1 passed, 0 failed, 0 blocked" "$OUT"
66
- grep -q "success artifacts cleaned" "$OUT"
@@ -1,48 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
-
4
- ROOT="$(mktemp -d "${TMPDIR:-/tmp}/context-guard-add-approved-bypass.XXXXXX")"
5
- trap 'rm -rf "$ROOT"' EXIT
6
-
7
- SCRIPT="/Users/bytedance/.agents/skills/context-guard/scripts/context_guard.py"
8
- OUT="$ROOT/out.txt"
9
-
10
- python3 "$SCRIPT" init --root "$ROOT" >/dev/null
11
-
12
- set +e
13
- python3 "$SCRIPT" feature-chain-add \
14
- --root "$ROOT" \
15
- --title "GPU 监控按钮" \
16
- --entry "点击 GPU 监控按钮" \
17
- --exit-check "打开监控页" \
18
- --command-text "printf 'CG_CHECKPOINT:后端返回监控 URL:PASS\n'" \
19
- --test-status approved >"$OUT" 2>&1
20
- STATUS=$?
21
- set -e
22
-
23
- test "$STATUS" -ne 0
24
- grep -q "feature-chain-add cannot create approved every-dev-completion chains" "$OUT"
25
-
26
- python3 - "$ROOT/.codex/context/test-hub/feature-chains.json" <<'PY'
27
- from pathlib import Path
28
- import json
29
- import sys
30
- path = Path(sys.argv[1])
31
- data = json.loads(path.read_text(encoding="utf-8")) if path.exists() else {"chains": []}
32
- assert data["chains"] == [], data
33
- PY
34
-
35
- python3 "$SCRIPT" feature-chain-add \
36
- --root "$ROOT" \
37
- --title "GPU 监控按钮" \
38
- --entry "点击 GPU 监控按钮" \
39
- --exit-check "打开监控页" >"$OUT"
40
- grep -q "feature chain:" "$OUT"
41
-
42
- python3 - "$ROOT/.codex/context/test-hub/feature-chains.json" <<'PY'
43
- import json
44
- import sys
45
- chain = json.load(open(sys.argv[1], encoding="utf-8"))["chains"][0]
46
- assert chain["status"] == "proposed", chain
47
- assert chain["command"] == "", chain
48
- PY
@@ -1,43 +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-natural-test-intake-XXXXXX")"
6
- trap 'rm -rf "$ROOT"' EXIT
7
- OUT="$ROOT/plan.out"
8
-
9
- python3 "$SCRIPT" init --root "$ROOT" >/dev/null
10
-
11
- python3 "$SCRIPT" feature-chain-plan \
12
- --root "$ROOT" \
13
- --query "写一个测试,检验每次开发完成后 Markdown 编辑器里的单行、多行和矩阵公式都能正常渲染" >"$OUT"
14
-
15
- grep -q "action: propose-new-chain" "$OUT"
16
- grep -q "confirmation prompt: 测试创建识别" "$OUT"
17
- grep -q "Markdown 编辑器里的单行、多行和矩阵公式能正常渲染" "$OUT"
18
- grep -q "after-confirmation command: .*feature-chain-propose" "$OUT"
19
- grep -q -- "--node-title '<confirmed recurrence checkpoint>'" "$OUT"
20
- grep -q -- "--coverage-pending-reason '<confirmed reason this chain has no linked bad case yet>'" "$OUT"
21
- if grep -q "after-confirmation command: .*feature-chain-add" "$OUT"; then
22
- cat "$OUT"
23
- exit 1
24
- fi
25
-
26
- if grep -q "confirmation prompt: .*从「写一个测试" "$OUT"; then
27
- cat "$OUT"
28
- exit 1
29
- fi
30
- if grep -q "confirmation prompt: .*每次开发完成后 Markdown" "$OUT"; then
31
- cat "$OUT"
32
- exit 1
33
- fi
34
-
35
- python3 - "$ROOT/.codex/context/test-hub/feature-chains.json" <<'PY'
36
- from pathlib import Path
37
- import json
38
- import sys
39
-
40
- path = Path(sys.argv[1])
41
- data = json.loads(path.read_text(encoding="utf-8")) if path.exists() else {"chains": []}
42
- assert data.get("chains", []) == [], data
43
- PY
@@ -1,56 +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-from-to-intake-XXXXXX")"
6
- trap 'rm -rf "$ROOT"' EXIT
7
- OUT="$ROOT/plan.out"
8
-
9
- python3 "$SCRIPT" init --root "$ROOT" >/dev/null
10
-
11
- python3 "$SCRIPT" feature-chain-plan \
12
- --root "$ROOT" \
13
- --query "创建一个测试任务:从编辑器输入 Markdown 到预览正确渲染,主要验证公式渲染回归" >"$OUT"
14
-
15
- grep -q "action: propose-new-chain" "$OUT"
16
- grep -q "confirmation prompt: 测试创建识别" "$OUT"
17
- grep -q "从「编辑器输入 Markdown」到「预览正确渲染」" "$OUT"
18
- grep -q "主要验证「公式渲染回归」" "$OUT"
19
- grep -q "suggested checkpoint after confirmation: 公式渲染回归" "$OUT"
20
- grep -q "after-confirmation command: .*feature-chain-propose" "$OUT"
21
- grep -q -- "--entry '编辑器输入 Markdown'" "$OUT"
22
- grep -q -- "--exit-check '预览正确渲染'" "$OUT"
23
- grep -q -- "--node-title '公式渲染回归'" "$OUT"
24
- grep -q -- "--check '<confirmed checkpoint check>'" "$OUT"
25
- grep -q -- "--coverage-pending-reason '<confirmed reason this chain has no linked bad case yet>'" "$OUT"
26
- if grep -q "after-confirmation command: .*feature-chain-add" "$OUT"; then
27
- cat "$OUT"
28
- exit 1
29
- fi
30
-
31
- if grep -q "从「创建一个测试任务" "$OUT"; then
32
- cat "$OUT"
33
- exit 1
34
- fi
35
- if grep -q "相关入口到用户可见的正确结果" "$OUT"; then
36
- cat "$OUT"
37
- exit 1
38
- fi
39
- if grep -q "<confirmed user-visible entry>" "$OUT"; then
40
- cat "$OUT"
41
- exit 1
42
- fi
43
- if grep -q "<confirmed strict final green condition>" "$OUT"; then
44
- cat "$OUT"
45
- exit 1
46
- fi
47
-
48
- python3 - "$ROOT/.codex/context/test-hub/feature-chains.json" <<'PY'
49
- from pathlib import Path
50
- import json
51
- import sys
52
-
53
- path = Path(sys.argv[1])
54
- data = json.loads(path.read_text(encoding="utf-8")) if path.exists() else {"chains": []}
55
- assert data.get("chains", []) == [], data
56
- PY