@sanqianx/project-knowledge 5.0.23 → 5.0.25

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 (401) hide show
  1. package/.agents/plugins/marketplace.json +20 -20
  2. package/.claude-plugin/marketplace.json +1 -1
  3. package/CHANGELOG.md +1361 -1346
  4. package/LICENSE +201 -201
  5. package/NOTICE +5 -5
  6. package/README.md +349 -349
  7. package/_modules/knowledge-engine/package.json +1 -1
  8. package/_modules/knowledge-engine/src/coordinator.js +48 -3
  9. package/_modules/knowledge-engine/src/runtime/automation-config.js +140 -140
  10. package/_modules/knowledge-engine/src/runtime/commit-conversation-binder.js +238 -238
  11. package/_modules/knowledge-engine/src/runtime/commit-processing-ledger.js +26 -26
  12. package/_modules/knowledge-engine/src/runtime/commit-prompt.js +193 -193
  13. package/_modules/knowledge-engine/src/runtime/commit-reconciler.js +394 -394
  14. package/_modules/knowledge-engine/src/runtime/contracts.js +282 -282
  15. package/_modules/knowledge-engine/src/runtime/conversation-store.js +389 -389
  16. package/_modules/knowledge-engine/src/runtime/evidence-bundle.js +228 -228
  17. package/_modules/knowledge-engine/src/runtime/git-runner.js +62 -62
  18. package/_modules/knowledge-engine/src/runtime/knowledge-promotion.js +505 -505
  19. package/_modules/knowledge-engine/src/runtime/knowledge-retrieval-service.js +400 -400
  20. package/_modules/knowledge-engine/src/runtime/markdown-knowledge-indexer.js +171 -171
  21. package/_modules/knowledge-engine/src/runtime/scanner.js +298 -298
  22. package/_modules/knowledge-engine/ui/app.js +23 -2
  23. package/_site/README.md +30 -30
  24. package/_site/_test/agent-capture-mcp-ui-test.js +68 -68
  25. package/_site/_test/agent-capture-ui-test.js +101 -101
  26. package/_site/_test/ai-profile-resolver-test.js +137 -137
  27. package/_site/_test/ai-profile-test.js +75 -75
  28. package/_site/_test/ai-vendor-presets-test.js +91 -91
  29. package/_site/_test/automatic-context-test.js +70 -70
  30. package/_site/_test/automation-queue-test.js +14 -14
  31. package/_site/_test/automation-ui-test.js +40 -40
  32. package/_site/_test/background-task-registry-test.js +43 -43
  33. package/_site/_test/baseline-schema-test.js +91 -91
  34. package/_site/_test/bin-cli-test.js +230 -230
  35. package/_site/_test/bridge-adapter-test.js +95 -95
  36. package/_site/_test/bridge-consumer-service-test.js +310 -310
  37. package/_site/_test/candidate-bin-content-test.js +35 -35
  38. package/_site/_test/candidate-product-assets-test.js +13 -13
  39. package/_site/_test/candidate-release-contract-test.js +14 -14
  40. package/_site/_test/capture-hook-dedup-test.js +158 -158
  41. package/_site/_test/cdp-browser-failure-test.js +103 -103
  42. package/_site/_test/chat-claudecodeui-match-test.js +92 -92
  43. package/_site/_test/claude-executable-discovery-test.js +90 -90
  44. package/_site/_test/claude-session-lifecycle-sweep-test.js +252 -252
  45. package/_site/_test/claude-workbench-test.js +174 -174
  46. package/_site/_test/cli-instance-management-test.js +62 -62
  47. package/_site/_test/client-capture-restart-e2e-test.js +189 -189
  48. package/_site/_test/codex-conversation-projection-test.js +60 -60
  49. package/_site/_test/codex-marketplace-scoped-path-test.js +186 -186
  50. package/_site/_test/codex-notify-capture-e2e-test.js +101 -101
  51. package/_site/_test/codex-notify-fanout-test.js +141 -134
  52. package/_site/_test/codex-notify-upgrade-test.js +253 -253
  53. package/_site/_test/commit-boundary-freeze-test.js +147 -147
  54. package/_site/_test/commit-conversation-binding-test.js +99 -99
  55. package/_site/_test/commit-evidence-test.js +110 -110
  56. package/_site/_test/configuration-generation-test.js +22 -22
  57. package/_site/_test/context-pack-test.js +200 -200
  58. package/_site/_test/conversation-api-test.js +119 -119
  59. package/_site/_test/conversation-origin-test.js +15 -15
  60. package/_site/_test/conversation-store-test.js +138 -138
  61. package/_site/_test/cross-repo-isolation-e2e-test.js +187 -187
  62. package/_site/_test/desktop-browser-compat-test.js +28 -28
  63. package/_site/_test/desktop-hook-runtime-regression-test.js +204 -204
  64. package/_site/_test/embedding-config-test.js +32 -32
  65. package/_site/_test/explicit-commit-processor-test.js +37 -37
  66. package/_site/_test/fixtures/fake-browser-exit.js +10 -10
  67. package/_site/_test/fixtures/fake-browser-hang.js +10 -10
  68. package/_site/_test/fixtures/integration-busy-worker.cjs +6 -6
  69. package/_site/_test/fixtures/make-git-repos.js +92 -92
  70. package/_site/_test/fixtures/retrieval-gold-queries.json +32 -32
  71. package/_site/_test/folder-picker-output-test.js +19 -19
  72. package/_site/_test/fresh-hook-reimport-test.js +53 -53
  73. package/_site/_test/fresh-product-data-test.js +56 -56
  74. package/_site/_test/full-integration-e2e-test.js +167 -167
  75. package/_site/_test/git-path-compatibility-test.js +80 -80
  76. package/_site/_test/git-validation-test.js +81 -81
  77. package/_site/_test/glm-ui-refresh-review-test.js +313 -404
  78. package/_site/_test/harness-isolation-test.js +138 -0
  79. package/_site/_test/helpers/cdp-browser.js +383 -0
  80. package/_site/_test/helpers/cdp-network-capture.js +66 -0
  81. package/_site/_test/helpers/find-chrome.js +34 -0
  82. package/_site/_test/helpers/free-port.js +8 -0
  83. package/_site/_test/helpers/logging-ui-fixture.js +131 -0
  84. package/_site/_test/helpers/module-fixture.js +282 -0
  85. package/_site/_test/helpers/parallel-engine-advanced-engine-child.js +45 -0
  86. package/_site/_test/helpers/parallel-engine-advanced-fault-writer.js +171 -0
  87. package/_site/_test/helpers/parallel-engine-advanced-harness.js +245 -0
  88. package/_site/_test/helpers/parallel-engine-advanced-standin-analyzer.js +80 -0
  89. package/_site/_test/helpers/parallel-engine-advanced-ui-host.js +177 -0
  90. package/_site/_test/helpers/parallel-engine-final-harness.js +314 -0
  91. package/_site/_test/helpers/parallel-engine-final-standin-analyzer.js +159 -0
  92. package/_site/_test/helpers/parallel-knowledge-fixture.js +255 -0
  93. package/_site/_test/helpers/parallel-logging-acceptance-fixture.js +111 -0
  94. package/_site/_test/helpers/parallel-logging-acceptance-proxy.js +106 -0
  95. package/_site/_test/helpers/parallel-logging-fix-r2-proxy.js +205 -0
  96. package/_site/_test/helpers/parallel-logging-integration-5025-env.js +432 -0
  97. package/_site/_test/helpers/parallel-memory-analyzer.js +81 -0
  98. package/_site/_test/helpers/parallel-memory-event-bridge.js +128 -0
  99. package/_site/_test/helpers/parallel-memory-shell.js +470 -0
  100. package/_site/_test/helpers/parallel-nav-isolation-env.js +389 -0
  101. package/_site/_test/helpers/parallel-nav-module-ui.js +186 -0
  102. package/_site/_test/helpers/parallel-nav-proxy.js +148 -0
  103. package/_site/_test/helpers/parallel-nav-shell.js +361 -0
  104. package/_site/_test/helpers/parallel-qa-engine-endpoint-guard.js +206 -0
  105. package/_site/_test/helpers/parallel-qa-engine-endpoint-isolate.js +257 -0
  106. package/_site/_test/helpers/parallel-retrieval-followup-corpus.js +293 -0
  107. package/_site/_test/helpers/parallel-retrieval-followup-next-session.js +70 -0
  108. package/_site/_test/helpers/parallel-retrieval-followup-r2-shell.js +737 -0
  109. package/_site/_test/helpers/parallel-retrieval-followup-r2-wb-host.js +82 -0
  110. package/_site/_test/helpers/parallel-retrieval-followup-shell.js +279 -0
  111. package/_site/_test/helpers/parallel-workbench-fixture.js +371 -0
  112. package/_site/_test/helpers/parallel-workbench-host.js +80 -0
  113. package/_site/_test/helpers/parallel-workbench-integration-5025-fixture.js +408 -0
  114. package/_site/_test/helpers/parallel-workbench-integration-5025-harness.js +593 -0
  115. package/_site/_test/helpers/parallel-workbench-integration-5025-host.js +70 -0
  116. package/_site/_test/helpers/parallel-workbench-integration-5025-launcher.js +240 -0
  117. package/_site/_test/helpers/parallel-workbench-integration-5025-runtime-harness.js +630 -0
  118. package/_site/_test/helpers/parallel-workbench-source-map.js +196 -0
  119. package/_site/_test/helpers/spawn-server.js +106 -0
  120. package/_site/_test/helpers/version-visibility-fixture.js +251 -0
  121. package/_site/_test/hook-runtime-endpoint-test.js +88 -88
  122. package/_site/_test/hook-status-repair-api-test.js +152 -152
  123. package/_site/_test/hook-trigger-test.js +85 -85
  124. package/_site/_test/hook-worktree-test.js +42 -42
  125. package/_site/_test/import-preflight-api-test.js +234 -234
  126. package/_site/_test/index-builder-test.js +41 -41
  127. package/_site/_test/index-error-display-contract-test.js +10 -10
  128. package/_site/_test/index-writer-concurrency-test.js +135 -135
  129. package/_site/_test/integration-adapters-test.js +262 -262
  130. package/_site/_test/integration-auto-repair-test.js +113 -113
  131. package/_site/_test/integration-capture-setup-test.js +118 -118
  132. package/_site/_test/integration-intent-test.js +81 -81
  133. package/_site/_test/integration-runtime-binding-a2-test.js +566 -566
  134. package/_site/_test/integration-runtime-binding-a3-test.js +227 -227
  135. package/_site/_test/integration-runtime-binding-test.js +473 -473
  136. package/_site/_test/integration-status-scan-test.js +29 -29
  137. package/_site/_test/integration-surface-coverage-test.js +164 -164
  138. package/_site/_test/kb-framework-test.js +57 -57
  139. package/_site/_test/kbpath-follow-test.js +63 -63
  140. package/_site/_test/knowledge-db-test.js +144 -144
  141. package/_site/_test/knowledge-engine-client-test.js +120 -109
  142. package/_site/_test/knowledge-language-control-test.js +170 -170
  143. package/_site/_test/knowledge-maintenance-test.js +40 -40
  144. package/_site/_test/knowledge-promotion-recovery-test.js +260 -260
  145. package/_site/_test/knowledge-query-test.js +54 -54
  146. package/_site/_test/knowledge-retrieval-service-test.js +77 -77
  147. package/_site/_test/knowledge-scopes-test.js +37 -37
  148. package/_site/_test/knowledge-storage-location-test.js +28 -28
  149. package/_site/_test/knowledge-storage-startup-test.js +52 -52
  150. package/_site/_test/knowledge-store-logs-supervision-test.js +89 -89
  151. package/_site/_test/launcher-readiness-test.js +80 -80
  152. package/_site/_test/legacy-claude-session-alias-test.js +106 -106
  153. package/_site/_test/legacy-routes-removed-test.js +47 -47
  154. package/_site/_test/legacy-workbench-exclusion-test.js +92 -92
  155. package/_site/_test/live-gateway-test.js +48 -48
  156. package/_site/_test/local-marketplace-test.js +16 -16
  157. package/_site/_test/log-redaction-test.js +58 -58
  158. package/_site/_test/logging-api-test.js +89 -89
  159. package/_site/_test/logging-sse-no-gap-test.js +88 -88
  160. package/_site/_test/logging-ui-test.js +107 -107
  161. package/_site/_test/markdown-delta-overlay-test.js +85 -85
  162. package/_site/_test/markdown-maintenance-api-test.js +75 -75
  163. package/_site/_test/markdown-maintenance-test.js +11 -11
  164. package/_site/_test/mcp-server-test.js +149 -149
  165. package/_site/_test/model-context-windows-test.js +89 -89
  166. package/_site/_test/module-agent-start-proxy-test.js +65 -65
  167. package/_site/_test/module-artifact-integrity-test.js +27 -27
  168. package/_site/_test/module-boundary-test.js +30 -30
  169. package/_site/_test/module-bridge-eventbridge-test.js +202 -202
  170. package/_site/_test/module-dynamic-port-test.js +118 -118
  171. package/_site/_test/module-index-proxy-test.js +33 -33
  172. package/_site/_test/module-model-configuration-test.js +44 -44
  173. package/_site/_test/module-process-lifecycle-test.js +35 -35
  174. package/_site/_test/module-stream-proxy-test.js +34 -34
  175. package/_site/_test/module-terminal-restart-test.js +63 -63
  176. package/_site/_test/module-wiring-unbind-race-test.js +59 -59
  177. package/_site/_test/native-context-integrations-test.js +86 -86
  178. package/_site/_test/non-release-ci-test.js +34 -34
  179. package/_site/_test/offline-boundary-isolation-test.js +32 -32
  180. package/_site/_test/orphaned-claim-recovery-test.js +80 -80
  181. package/_site/_test/package-boundary-test.js +43 -43
  182. package/_site/_test/package-startup-test.js +56 -56
  183. package/_site/_test/packaged-ui-smoke-test.js +88 -88
  184. package/_site/_test/parallel-ci-r9-posix-socket-budget-test.js +156 -0
  185. package/_site/_test/parallel-engine-advanced-eng005-test.js +136 -0
  186. package/_site/_test/parallel-engine-advanced-eng006-test.js +171 -0
  187. package/_site/_test/parallel-engine-advanced-eng007-reconcile-test.js +231 -0
  188. package/_site/_test/parallel-engine-advanced-eng009-test.js +208 -0
  189. package/_site/_test/parallel-engine-advanced-eng010-test.js +213 -0
  190. package/_site/_test/parallel-engine-advanced-eng011-ui-probe.js +459 -0
  191. package/_site/_test/parallel-engine-final-eng002-test.js +255 -0
  192. package/_site/_test/parallel-engine-final-eng007-test.js +269 -0
  193. package/_site/_test/parallel-engine-final-eng011-test.js +197 -0
  194. package/_site/_test/parallel-engine-final-eng012-test.js +354 -0
  195. package/_site/_test/parallel-knowledge-client-error-code-test.js +184 -0
  196. package/_site/_test/parallel-knowledge-engine-test.js +353 -0
  197. package/_site/_test/parallel-knowledge-retrieval-test.js +292 -0
  198. package/_site/_test/parallel-knowledge-vector-test.js +168 -0
  199. package/_site/_test/parallel-linux-ci-r7-log007-day-test.js +110 -0
  200. package/_site/_test/parallel-logging-acceptance-log003-test.js +224 -0
  201. package/_site/_test/parallel-logging-acceptance-log004-test.js +231 -0
  202. package/_site/_test/parallel-logging-acceptance-log005-test.js +208 -0
  203. package/_site/_test/parallel-logging-acceptance-log006-test.js +214 -0
  204. package/_site/_test/parallel-logging-acceptance-log007-test.js +223 -0
  205. package/_site/_test/parallel-logging-acceptance-log008-test.js +180 -0
  206. package/_site/_test/parallel-logging-fix-r2-crash-probe.js +271 -0
  207. package/_site/_test/parallel-logging-fix-r2-gap-test.js +294 -0
  208. package/_site/_test/parallel-logging-fix-r2-normalhook-test.js +330 -0
  209. package/_site/_test/parallel-logging-integration-5025-portability-test.js +554 -0
  210. package/_site/_test/parallel-memory-candidate-test.js +301 -0
  211. package/_site/_test/parallel-memory-manual-test.js +197 -0
  212. package/_site/_test/parallel-memory-scope-test.js +228 -0
  213. package/_site/_test/parallel-memory-source-test.js +227 -0
  214. package/_site/_test/parallel-memory-sync-test.js +238 -0
  215. package/_site/_test/parallel-memory-view-r8-reload-gate-test.js +123 -0
  216. package/_site/_test/parallel-nav-failure-test.js +119 -0
  217. package/_site/_test/parallel-nav-isolation-test.js +308 -0
  218. package/_site/_test/parallel-nav-isolation-vector-path-test.js +90 -0
  219. package/_site/_test/parallel-nav-offline-test.js +272 -0
  220. package/_site/_test/parallel-nav-operability-test.js +257 -0
  221. package/_site/_test/parallel-nav-switch-test.js +247 -0
  222. package/_site/_test/parallel-nav-theme-test.js +130 -0
  223. package/_site/_test/parallel-nav-viewport-test.js +310 -0
  224. package/_site/_test/parallel-qa-engine-endpoint-guard-test.js +273 -0
  225. package/_site/_test/parallel-retrieval-followup-citation-test.js +219 -0
  226. package/_site/_test/parallel-retrieval-followup-corpus-test.js +287 -0
  227. package/_site/_test/parallel-workbench-independent-host.js +262 -0
  228. package/_site/_test/parallel-workbench-integration-5025-abort-probe.js +340 -0
  229. package/_site/_test/parallel-workbench-integration-5025-drafts-probe.js +588 -0
  230. package/_site/_test/parallel-workbench-integration-5025-env-check.js +317 -0
  231. package/_site/_test/parallel-workbench-integration-5025-model-probe.js +342 -0
  232. package/_site/_test/parallel-workbench-integration-5025-ordering-probe.js +326 -0
  233. package/_site/_test/parallel-workbench-model-probe.js +336 -0
  234. package/_site/_test/parallel-workbench-offline-test.js +169 -0
  235. package/_site/_test/parallel-workbench-provenance-trace.js +134 -0
  236. package/_site/_test/parallel-workbench-source-match.js +206 -0
  237. package/_site/_test/parallel-workbench-standalone-turn.js +349 -0
  238. package/_site/_test/path-consistency-test.js +151 -151
  239. package/_site/_test/pending-sweep-test.js +9 -9
  240. package/_site/_test/post-commit-automation-test.js +87 -87
  241. package/_site/_test/pr-consumer-contract-test.js +55 -55
  242. package/_site/_test/product-brand-contract-test.js +25 -25
  243. package/_site/_test/product-diagnostics-ui-test.js +93 -93
  244. package/_site/_test/product-empty-state-test.js +148 -0
  245. package/_site/_test/product-import-ui-test.js +219 -104
  246. package/_site/_test/product-navigation-test.js +152 -0
  247. package/_site/_test/product-progress-status-test.js +84 -84
  248. package/_site/_test/project-delete-recovery-test.js +64 -64
  249. package/_site/_test/project-domain-create-test.js +91 -0
  250. package/_site/_test/project-domain-scope-retrieval-test.js +214 -0
  251. package/_site/_test/project-git-init-confirm-test.js +115 -0
  252. package/_site/_test/project-goal-editor-test.js +144 -144
  253. package/_site/_test/project-import-duplicate-alias-test.js +134 -0
  254. package/_site/_test/project-import-unicode-restart-test.js +140 -0
  255. package/_site/_test/project-lifecycle-transaction-test.js +106 -106
  256. package/_site/_test/project-module-partial-recovery-test.js +222 -0
  257. package/_site/_test/project-remove-running-guard-test.js +79 -79
  258. package/_site/_test/project-store-test.js +90 -90
  259. package/_site/_test/project-unbind-late-read-ui-test.js +250 -0
  260. package/_site/_test/project-unbind-writer-guard-test.js +231 -0
  261. package/_site/_test/prompt-settings-test.js +115 -115
  262. package/_site/_test/protected-architecture-gate-test.js +122 -122
  263. package/_site/_test/refactor-characterization-test.js +36 -36
  264. package/_site/_test/registry-events-test.js +38 -38
  265. package/_site/_test/release-version-sync-test.js +115 -115
  266. package/_site/_test/requirement-binding-test.js +113 -113
  267. package/_site/_test/requirement-recorder-test.js +173 -173
  268. package/_site/_test/run-all-tests.js +173 -161
  269. package/_site/_test/runtime-endpoint-test.js +64 -64
  270. package/_site/_test/scanner-test.js +83 -83
  271. package/_site/_test/server-security-test.js +96 -96
  272. package/_site/_test/sessions-stream-test.js +93 -93
  273. package/_site/_test/shared-contracts-test.js +58 -58
  274. package/_site/_test/shared-scope-root-binding-test.js +74 -67
  275. package/_site/_test/simple-import-test.js +98 -98
  276. package/_site/_test/startup-analysis-disabled-test.js +16 -16
  277. package/_site/_test/storage-foundation-test.js +78 -78
  278. package/_site/_test/structured-logger-test.js +101 -101
  279. package/_site/_test/t07b-cln-005-coverage-test.js +212 -0
  280. package/_site/_test/team-knowledge-store-sparse-checkout-test.js +196 -196
  281. package/_site/_test/team-knowledge-store-test.js +132 -132
  282. package/_site/_test/test-server-cleanup-test.js +35 -35
  283. package/_site/_test/test-server-module-isolation-test.js +37 -37
  284. package/_site/_test/tracking-start-test.js +144 -144
  285. package/_site/_test/vector-storage-root-test.js +75 -75
  286. package/_site/_test/version-visibility-browser-probe.js +249 -0
  287. package/_site/_test/version-visibility-test.js +92 -0
  288. package/_site/_test/workbench-context-receipts-test.js +22 -22
  289. package/_site/_test/workbench-permission-test.js +117 -117
  290. package/_site/_test/zcode-capture-integration-test.js +112 -112
  291. package/_site/lib/ai-profile-resolver.js +78 -78
  292. package/_site/lib/ai-vendor-presets.js +83 -83
  293. package/_site/lib/ai-workspace.js +104 -104
  294. package/_site/lib/atomic-file.js +204 -204
  295. package/_site/lib/automation-config.js +140 -140
  296. package/_site/lib/bridge-adapter.js +260 -260
  297. package/_site/lib/bridge-consumer-service.js +402 -402
  298. package/_site/lib/capture-hook-config.js +108 -108
  299. package/_site/lib/claude-cli-runner.js +1599 -1599
  300. package/_site/lib/cli-instances.js +43 -43
  301. package/_site/lib/codex-context-status.js +17 -17
  302. package/_site/lib/codex-notify-config.js +193 -193
  303. package/_site/lib/commit-conversation-binder.js +247 -247
  304. package/_site/lib/commit-processing-ledger.js +27 -27
  305. package/_site/lib/commit-prompt.js +202 -202
  306. package/_site/lib/commit-reconciler.js +444 -444
  307. package/_site/lib/context-pack-builder.js +299 -299
  308. package/_site/lib/contracts.js +291 -291
  309. package/_site/lib/conversation-exclusions.js +204 -204
  310. package/_site/lib/conversation-query-service.js +161 -161
  311. package/_site/lib/conversation-store.js +387 -387
  312. package/_site/lib/data-dir.js +13 -13
  313. package/_site/lib/embedding-service.js +85 -85
  314. package/_site/lib/engine-connection.js +93 -93
  315. package/_site/lib/engine-knowledge-client.js +76 -72
  316. package/_site/lib/evidence-bundle.js +228 -228
  317. package/_site/lib/folder-picker-output.js +24 -24
  318. package/_site/lib/git-path.js +14 -14
  319. package/_site/lib/git-runner.js +62 -62
  320. package/_site/lib/github-team-store.js +1175 -1175
  321. package/_site/lib/hook-manager.js +203 -203
  322. package/_site/lib/index-builder.js +157 -157
  323. package/_site/lib/index-service.js +173 -173
  324. package/_site/lib/integration-auto-repair.js +77 -77
  325. package/_site/lib/integration-installer.js +1240 -1240
  326. package/_site/lib/integration-intent.js +88 -88
  327. package/_site/lib/integration-status-scan.js +99 -99
  328. package/_site/lib/integration-status-worker.js +14 -14
  329. package/_site/lib/kb-framework.js +191 -191
  330. package/_site/lib/kb-validator.js +124 -124
  331. package/_site/lib/knowledge-db.js +363 -363
  332. package/_site/lib/knowledge-promotion.js +435 -435
  333. package/_site/lib/knowledge-retrieval-service.js +401 -401
  334. package/_site/lib/knowledge-schema.js +121 -121
  335. package/_site/lib/knowledge-tool-runtime.js +366 -366
  336. package/_site/lib/live-gateway.js +78 -78
  337. package/_site/lib/llm-client.js +173 -173
  338. package/_site/lib/markdown-knowledge-indexer.js +230 -230
  339. package/_site/lib/model-context-windows.js +82 -82
  340. package/_site/lib/module-bridge.js +874 -874
  341. package/_site/lib/module-port-resolver.js +57 -57
  342. package/_site/lib/post-commit-automation.js +141 -141
  343. package/_site/lib/product-data.js +35 -35
  344. package/_site/lib/project-lifecycle-service.js +554 -554
  345. package/_site/lib/project-registry-store.js +129 -129
  346. package/_site/lib/project-store.js +268 -268
  347. package/_site/lib/prompt-registry.js +148 -148
  348. package/_site/lib/public-version-info.js +37 -0
  349. package/_site/lib/registry-events.js +16 -16
  350. package/_site/lib/requirement-adapters.js +10 -10
  351. package/_site/lib/requirement-binder.js +112 -112
  352. package/_site/lib/requirement-recorder.js +278 -278
  353. package/_site/lib/runtime-control.js +89 -89
  354. package/_site/lib/runtime-endpoint.js +160 -160
  355. package/_site/lib/scanner.js +298 -298
  356. package/_site/lib/server-app.js +1672 -1664
  357. package/_site/lib/settings-store.js +153 -153
  358. package/_site/lib/storage-layout.js +166 -166
  359. package/_site/lib/structured-logger.js +574 -574
  360. package/_site/lib/zcode-context-integration.js +60 -60
  361. package/_site/scripts/codex-notify-fanout.cjs +95 -95
  362. package/_site/scripts/folder-picker.ps1 +156 -156
  363. package/_site/scripts/hook-trigger.js +158 -158
  364. package/_site/scripts/install-module-candidates.js +69 -69
  365. package/_site/scripts/pack-module-candidates.js +89 -89
  366. package/_site/scripts/sync-product-content.js +28 -28
  367. package/_site/scripts/sync-release-version.js +164 -164
  368. package/_site/scripts/vendor-modules.js +49 -49
  369. package/_site/scripts/verify-module-runtime.js +50 -50
  370. package/_site/scripts/verify-product-runtime.js +36 -36
  371. package/_site/scripts/verify-retrieval-gold.js +83 -83
  372. package/_site/server.js +15 -15
  373. package/_site/start.bat +26 -26
  374. package/_site/stop.bat +11 -11
  375. package/bin/project-knowledge-integrations.js +254 -254
  376. package/bin/project-knowledge-kb.js +67 -67
  377. package/bin/project-knowledge-mcp.js +201 -201
  378. package/bin/project-knowledge.js +269 -170
  379. package/claude-prompts.json +21 -21
  380. package/docs/README.zh-CN.md +207 -205
  381. package/docs/assets/architecture.svg +181 -181
  382. package/docs/assets/logo.svg +49 -49
  383. package/docs/fresh-v5-start.md +44 -44
  384. package/docs/leader-glm-workbench-playbook.md +122 -122
  385. package/docs/project-registry-schema.md +33 -33
  386. package/docs/release-5.0.16-acceptance.md +176 -176
  387. package/docs/release-5.0.17-acceptance.md +117 -117
  388. package/docs/release-5.0.19-acceptance.md +39 -39
  389. package/docs/team-knowledge-mode-a-plan.md +73 -73
  390. package/docs/testing-strategy.md +33 -33
  391. package/module-runtime-manifest.json +70 -67
  392. package/package.json +113 -110
  393. package/plugins/project-knowledge/.claude-plugin/plugin.json +1 -1
  394. package/plugins/project-knowledge/.codex-plugin/plugin.json +1 -1
  395. package/plugins/project-knowledge/.mcp.json +1 -1
  396. package/templates/change.md +30 -30
  397. package/templates/project-readme.md +52 -52
  398. package/ui/index.html +3 -2
  399. package/ui/version-info.css +44 -0
  400. package/ui/version-info.js +24 -0
  401. package/vendor-manifest.json +55 -55
@@ -0,0 +1,432 @@
1
+ 'use strict';
2
+ // _site/_test/helpers/parallel-logging-integration-5025-env.js
3
+ //
4
+ // Canonical, tracked isolation environment for the logging acceptance and
5
+ // logging-safety regression entries (lane P-QA-LOG-INTEGRATION-5025, extended
6
+ // by lane P-LOGGING-ISOLATION-R2).
7
+ //
8
+ // Why this helper exists
9
+ // ----------------------
10
+ // The logging entries used to hardcode one developer's temp root
11
+ // ('D:/SanQian.Xu/.project-knowledge-test-temp'). That path cannot be entered
12
+ // into a cross-platform canonical `npm test`, and it also left the entries
13
+ // running with the developer's real HOME/APPDATA/LOCALAPPDATA, so a child
14
+ // process could still reach real user configuration.
15
+ //
16
+ // P-LOGGING-ISOLATION-R2 closed the remaining gap: redirecting a few
17
+ // directories is not isolation. The ambient environment still reached the
18
+ // driver itself and, through it, every child process - provider keys and
19
+ // tokens, credential-bearing proxies, NODE_OPTIONS, module URLs/ports and
20
+ // other CLI-injected configuration were inherited verbatim. The helper now
21
+ // sanitizes the driver's own environment BEFORE any product module loads.
22
+ //
23
+ // Contract implemented here
24
+ // -------------------------
25
+ // * browser capture first: the real Chrome executable is resolved BEFORE
26
+ // HOME/LOCALAPPDATA move. A per-user Chrome lives under LOCALAPPDATA, so
27
+ // redirecting it first would make findChrome() fall back to the
28
+ // developer's real browser profile. The captured path is re-exported as
29
+ // KB_CHROME_PATH, which find-chrome consults first.
30
+ // * environment whitelist: only the system baseline and this tool's own
31
+ // knobs survive. Everything else - provider keys/tokens, proxies,
32
+ // NODE_OPTIONS, module URLs/ports, CLI-injected configuration - is
33
+ // removed from the driver, so every child inherits the clean base.
34
+ // * temp root: PK_TEST_TEMP_ROOT when set (must be absolute), otherwise
35
+ // os.tmpdir(). The resolved root must live OUTSIDE the source repository
36
+ // - a temp root inside the checkout would put test data into the tree
37
+ // that CI packs and publishes. Violations throw; they never degrade into
38
+ // a "test passed" state.
39
+ // * every entry installs, BEFORE any other module is loaded, its own
40
+ // HOME / USERPROFILE / CODEX_HOME / CLAUDE_CONFIG_DIR / APPDATA /
41
+ // LOCALAPPDATA / TEMP / TMP / TMPDIR, its own dual product data root
42
+ // (KB_DATA_DIR + KB_KNOWLEDGE_DATA_DIR), its own Bridge journal home and
43
+ // its own Workbench / agent-terminal data root. The developer's real
44
+ // configuration is never read or overwritten by a test.
45
+ // * PSModuleAnalysisCachePath points at a FILE inside the lane tree whose
46
+ // parent directory exists, so PowerShell (used by the browser cleanup
47
+ // helper) cannot write its module analysis cache into the developer's
48
+ // real profile.
49
+ // * module endpoints are explicit and dead: the module URL keys point at
50
+ // the loopback dead address, the module flags are '0' (the product tests
51
+ // `=== '0'`) and the module command keys are empty strings (the product
52
+ // tests truthiness, so '0' would be read as a configured command).
53
+ // KB_MODULES_AUTOSTART=0 / KB_MODULES_REGISTER=0 keep the product from
54
+ // registering or starting real modules.
55
+ // * Chrome >= 136 refuses --remote-debugging-port unless the default user
56
+ // data directory resolves. With HOME/APPDATA/LOCALAPPDATA redirected, the
57
+ // platform default directory is scaffolded empty so the real browser
58
+ // still launches. The browser itself stays real: no stub, no fake PASS.
59
+ // * evidence: PK_TEST_EVIDENCE_ROOT overrides the per-case evidence
60
+ // directory (the default stays in the repository's gitignored
61
+ // qa-autopilot/artifacts tree).
62
+ // * explicit lane endpoints / stand-ins (extraEnv) are applied AFTER the
63
+ // sanitization and are never removed afterwards.
64
+ //
65
+ // The helper is dependency-free on purpose: it must be requirable before the
66
+ // product modules so the environment is already isolated when they load.
67
+
68
+ const fs = require('node:fs');
69
+ const os = require('node:os');
70
+ const path = require('node:path');
71
+
72
+ const REPO_ROOT = path.resolve(__dirname, '..', '..', '..');
73
+
74
+ // The system variables a test process may inherit. Everything that is not
75
+ // listed here is ambient state and is removed before the product loads.
76
+ const SYSTEM_ENV_ALLOWLIST = [
77
+ 'PATH',
78
+ 'PATHEXT',
79
+ 'SystemRoot',
80
+ 'WINDIR',
81
+ 'ComSpec',
82
+ 'SystemDrive',
83
+ 'NUMBER_OF_PROCESSORS',
84
+ 'PROCESSOR_ARCHITECTURE',
85
+ 'PROCESSOR_ARCHITEW6432',
86
+ 'PROCESSOR_IDENTIFIER',
87
+ 'PROCESSOR_LEVEL',
88
+ 'PROCESSOR_REVISION',
89
+ 'OS',
90
+ 'ProgramData',
91
+ 'ProgramFiles',
92
+ 'ProgramFiles(x86)',
93
+ 'CommonProgramFiles',
94
+ 'CommonProgramFiles(x86)',
95
+ 'CommonProgramW6432',
96
+ 'ALLUSERSPROFILE',
97
+ 'PUBLIC',
98
+ 'USERNAME',
99
+ 'USERDOMAIN',
100
+ 'COMPUTERNAME',
101
+ 'LOGONSERVER',
102
+ 'SESSIONNAME',
103
+ 'LANG',
104
+ 'LANGUAGE',
105
+ 'LC_ALL',
106
+ 'LC_CTYPE',
107
+ 'TZ',
108
+ 'TERM',
109
+ 'SHELL',
110
+ 'DISPLAY',
111
+ 'WAYLAND_DISPLAY',
112
+ 'XAUTHORITY',
113
+ 'CI',
114
+ ];
115
+
116
+ // The knobs this tool (and its runner) controls. They are kept across the
117
+ // sanitization so the caller can still select the temp root, the evidence
118
+ // root and the gate mode.
119
+ const TOOL_ENV_KEYS = [
120
+ 'PK_TEST_TEMP_ROOT',
121
+ 'PK_TEST_EVIDENCE_ROOT',
122
+ 'PK_LOGGING_GATE_STRICT_TRACKED',
123
+ 'PK_TEST_TIMEOUT_MS',
124
+ ];
125
+
126
+ // The module endpoints / switches the product understands. Reset semantics
127
+ // follow qa-autopilot/lib/isolation.cjs: URLs need a legal port (1..65535,
128
+ // the product rejects port 0 as INVALID_MODULE_URL), flags are '0' and
129
+ // commands are empty strings.
130
+ const MODULE_URL_KEYS = [
131
+ 'KB_KNOWLEDGE_ENGINE_URL',
132
+ 'KB_EVENTBRIDGE_URL',
133
+ 'KB_EVENT_BRIDGE_URL',
134
+ 'KB_TERMINAL_URL',
135
+ 'KB_VECTORHUB_URL',
136
+ ];
137
+ const MODULE_FLAG_KEYS = ['KB_MODULES_REGISTER', 'KB_MODULES_AUTOSTART'];
138
+ const MODULE_COMMAND_KEYS = [
139
+ 'KB_KNOWLEDGE_ENGINE_COMMAND',
140
+ 'KB_EVENTBRIDGE_COMMAND',
141
+ 'KB_TERMINAL_COMMAND',
142
+ 'KB_VECTORHUB_COMMAND',
143
+ 'AI_CODING_EVENT_BRIDGE_MODULE',
144
+ 'KB_WORKBENCH_RUNTIME_TOKEN',
145
+ ];
146
+ const DEAD_MODULE_URL = 'http://127.0.0.1:1';
147
+
148
+ // Hard deny: even if a future allowlist entry would keep a key, nothing
149
+ // credential-, proxy-, token- or injection-shaped may survive. The lane
150
+ // variables are assigned after this check, so they are never affected.
151
+ const DENY_KEY_PATTERNS = [
152
+ /(^|_)(API_?KEY|KEYS|TOKEN|SECRET|PASSWORD|PASSWD|CREDENTIALS?)$/i,
153
+ /^AWS_/i,
154
+ /^AZURE_/i,
155
+ /^GOOGLE_API/i,
156
+ /^GOOGLE_APPLICATION_CREDENTIALS$/i,
157
+ /^(HTTP|HTTPS|ALL|NO)_PROXY$/i,
158
+ /^PROXY$/i,
159
+ /^NODE_OPTIONS$/i,
160
+ /^NODE_EXTRA_CA_CERTS$/i,
161
+ /^NODE_PATH$/i,
162
+ /^ANTHROPIC_/i,
163
+ /^CLAUDE_/i,
164
+ /^CODEX_/i,
165
+ /^MINIMAX_/i,
166
+ /^OPENAI_/i,
167
+ /^GEMINI_/i,
168
+ /^GIT_/i,
169
+ /^NPM_/i,
170
+ /^SSH_AUTH_SOCK$/i,
171
+ /^DOCKER_CONFIG$/i,
172
+ /^KUBECONFIG$/i,
173
+ /^AI_CODING_EVENT_BRIDGE_/i,
174
+ /^KB_(KNOWLEDGE_ENGINE|EVENTBRIDGE|EVENT_BRIDGE|TERMINAL|VECTORHUB)_/i,
175
+ ];
176
+
177
+ // The environment keys this helper owns. Every one of them is redirected to
178
+ // a directory owned by the current run.
179
+ const ISOLATED_ENV_KEYS = [
180
+ 'HOME',
181
+ 'USERPROFILE',
182
+ 'HOMEDRIVE',
183
+ 'HOMEPATH',
184
+ 'APPDATA',
185
+ 'LOCALAPPDATA',
186
+ 'TEMP',
187
+ 'TMP',
188
+ 'TMPDIR',
189
+ 'PSModuleAnalysisCachePath',
190
+ 'CODEX_HOME',
191
+ 'CLAUDE_CONFIG_DIR',
192
+ 'KB_DATA_DIR',
193
+ 'KB_KNOWLEDGE_DATA_DIR',
194
+ 'AI_CODING_EVENT_BRIDGE_HOME',
195
+ 'AGENT_TERMINAL_DATA_DIR',
196
+ 'CLAUDE_AI_WORKBENCH_DATA_DIR',
197
+ ];
198
+
199
+ // Windows environment variables are case-insensitive; POSIX ones are not.
200
+ const normalizeKey = key => (process.platform === 'win32' ? String(key).toUpperCase() : String(key));
201
+
202
+ function isInsideRepo(candidate, repoRoot = REPO_ROOT) {
203
+ const relative = path.relative(repoRoot, candidate);
204
+ return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));
205
+ }
206
+
207
+ // Resolves the absolute temp root for a test run. PK_TEST_TEMP_ROOT wins when
208
+ // it is set; CI points it at the runner temp, which lives outside the
209
+ // checkout. os.tmpdir() is the portable fallback.
210
+ function resolveTempRoot(env = process.env) {
211
+ const configured = env.PK_TEST_TEMP_ROOT;
212
+ if (configured && !path.isAbsolute(configured)) {
213
+ throw new Error(`PK_TEST_TEMP_ROOT must be an absolute path (got: ${configured})`);
214
+ }
215
+ // os.tmpdir() is used verbatim (no realpath): on Windows the runner temp
216
+ // can be an 8.3 short path, and expanding it would change the path the
217
+ // caller configured.
218
+ const root = configured ? path.resolve(configured) : path.resolve(os.tmpdir());
219
+ if (!path.isAbsolute(root)) throw new Error(`test temp root must be absolute (got: ${root})`);
220
+ if (isInsideRepo(root)) {
221
+ throw new Error(`test temp root must live outside the source repository (got: ${root}; repo: ${REPO_ROOT})`);
222
+ }
223
+ fs.mkdirSync(root, { recursive: true });
224
+ return root;
225
+ }
226
+
227
+ // The evidence directory for one case. PK_TEST_EVIDENCE_ROOT overrides the
228
+ // root and keeps the per-case subdirectory name of the default location.
229
+ function resolveEvidenceDir(defaultDir, env = process.env) {
230
+ const configured = env.PK_TEST_EVIDENCE_ROOT;
231
+ if (!configured) return defaultDir;
232
+ if (!path.isAbsolute(configured)) {
233
+ throw new Error(`PK_TEST_EVIDENCE_ROOT must be an absolute path (got: ${configured})`);
234
+ }
235
+ fs.mkdirSync(configured, { recursive: true });
236
+ return path.join(configured, path.basename(defaultDir));
237
+ }
238
+
239
+ // The real browser executable, captured BEFORE any path moves. A per-user
240
+ // Chrome lives under LOCALAPPDATA; once LOCALAPPDATA points into the lane
241
+ // tree the developer's install is no longer discoverable, so the path has to
242
+ // be captured first and re-exported as KB_CHROME_PATH (find-chrome consults
243
+ // that key first).
244
+ function captureChrome() {
245
+ try {
246
+ // Required lazily: the helper must stay loadable before the product.
247
+ const { findChromeDetailed } = require('./find-chrome');
248
+ const found = findChromeDetailed();
249
+ return { path: found.path, source: found.source };
250
+ } catch {
251
+ return null;
252
+ }
253
+ }
254
+
255
+ // Removes the ambient environment from the driver itself, so every child
256
+ // process inherits the same clean base. Returns what was removed, for the
257
+ // gate's evidence.
258
+ function sanitizeEnv(env = process.env, options = {}) {
259
+ const allowed = new Set(
260
+ (options.allowedKeys || [...SYSTEM_ENV_ALLOWLIST, ...TOOL_ENV_KEYS]).map(normalizeKey),
261
+ );
262
+ const removed = [];
263
+ for (const key of Object.keys(env)) {
264
+ if (!allowed.has(normalizeKey(key))) removed.push(key);
265
+ }
266
+ for (const key of removed) delete env[key];
267
+
268
+ const denied = [];
269
+ for (const key of Object.keys(env)) {
270
+ if (DENY_KEY_PATTERNS.some(pattern => pattern.test(key))) denied.push(key);
271
+ }
272
+ for (const key of denied) delete env[key];
273
+
274
+ return { removed, denied };
275
+ }
276
+
277
+ // Empty default user-data directories for the platform's Chrome profile
278
+ // location. Chrome >= 136 checks the default directory even when
279
+ // --user-data-dir points elsewhere; with HOME/APPDATA/LOCALAPPDATA redirected
280
+ // that directory must exist inside the isolated tree.
281
+ //
282
+ // On Windows the probe does not only follow LOCALAPPDATA: Chrome also derives
283
+ // <USERPROFILE>\AppData\Local\Google\Chrome\User Data on its own. USERPROFILE
284
+ // points at the lane home here, so that derived location is scaffolded empty
285
+ // under the owned home as well - never the developer's real default profile.
286
+ function chromeDefaultProfileDirs(dirs) {
287
+ const created = [];
288
+ const add = dir => {
289
+ fs.mkdirSync(dir, { recursive: true });
290
+ created.push(dir);
291
+ };
292
+ if (process.platform === 'win32') {
293
+ add(path.join(dirs.localAppData, 'Google', 'Chrome', 'User Data'));
294
+ add(path.join(dirs.appData, 'Google', 'Chrome', 'User Data'));
295
+ add(path.join(dirs.home, 'AppData', 'Local', 'Google', 'Chrome', 'User Data'));
296
+ } else if (process.platform === 'darwin') {
297
+ add(path.join(dirs.home, 'Library', 'Application Support', 'Google', 'Chrome'));
298
+ } else {
299
+ add(path.join(dirs.home, '.config', 'google-chrome'));
300
+ add(path.join(dirs.home, '.config', 'chromium'));
301
+ }
302
+ return created;
303
+ }
304
+
305
+ // Installs the isolated environment for one entry and returns the handles the
306
+ // entry needs. Call this before requiring any product or helper module.
307
+ //
308
+ // Phase order matters:
309
+ // 1. capture the real browser executable (before LOCALAPPDATA moves)
310
+ // 2. resolve the temp root (os.tmpdir() reads TEMP/TMP)
311
+ // 3. sanitize the ambient environment (driver level)
312
+ // 4. create the lane tree
313
+ // 5. assign the lane variables (never removed afterwards)
314
+ // 6. apply the entry's explicit lane endpoints / stand-ins
315
+ function installLoggingTestEnv({ caseId, prefix, env = process.env, extraEnv = {} } = {}) {
316
+ const label = prefix || caseId || 'logging';
317
+
318
+ // Phase 1: the browser executable is captured from the untouched
319
+ // environment. Losing it would make findChrome() fall back to the
320
+ // developer's real browser profile once LOCALAPPDATA is redirected.
321
+ const chrome = captureChrome();
322
+
323
+ // Phase 2: the temp root is resolved before the cleanup, because
324
+ // os.tmpdir() reads TEMP/TMP and those are part of what gets cleaned.
325
+ const tempRoot = resolveTempRoot(env);
326
+
327
+ // Phase 3: the ambient environment is removed from the driver itself.
328
+ const sanitized = sanitizeEnv(env);
329
+
330
+ // Phase 4: the lane tree.
331
+ const laneTmp = fs.mkdtempSync(path.join(tempRoot, `${label}-`));
332
+ const dirs = {
333
+ home: path.join(laneTmp, 'home'),
334
+ appData: path.join(laneTmp, 'appdata-roaming'),
335
+ localAppData: path.join(laneTmp, 'appdata-local'),
336
+ temp: path.join(laneTmp, 'temp'),
337
+ claudeConfig: path.join(laneTmp, 'claude-config'),
338
+ codexHome: path.join(laneTmp, 'codex-home'),
339
+ bridgeHome: path.join(laneTmp, 'bridge-home'),
340
+ dataHome: path.join(laneTmp, 'kb-data'),
341
+ knowledgeHome: path.join(laneTmp, 'kb-knowledge-data'),
342
+ agentTerminalData: path.join(laneTmp, 'agent-terminal-data'),
343
+ workbenchData: path.join(laneTmp, 'workbench-data'),
344
+ // The PARENT directory of the PowerShell module analysis cache. The
345
+ // environment variable must carry a FILE path whose parent exists, so
346
+ // only the parent is created here (PowerShell writes the cache file).
347
+ psModuleCache: path.join(laneTmp, 'ps-module-cache'),
348
+ };
349
+ for (const dir of Object.values(dirs)) fs.mkdirSync(dir, { recursive: true });
350
+
351
+ // Phase 5: the lane variables. They are assigned after the sanitization, so
352
+ // nothing here can be removed by the ambient cleanup.
353
+ if (chrome) env.KB_CHROME_PATH = chrome.path;
354
+ env.HOME = dirs.home;
355
+ env.USERPROFILE = dirs.home;
356
+ const homeRoot = path.parse(dirs.home).root;
357
+ env.HOMEDRIVE = homeRoot;
358
+ env.HOMEPATH = path.relative(homeRoot, dirs.home) || '\\';
359
+ env.APPDATA = dirs.appData;
360
+ env.LOCALAPPDATA = dirs.localAppData;
361
+ env.TEMP = dirs.temp;
362
+ env.TMP = dirs.temp;
363
+ env.TMPDIR = dirs.temp;
364
+ // PowerShell reads PSModuleAnalysisCachePath as the FILE that holds the
365
+ // module analysis cache; pointing it at a directory is wrong. The parent
366
+ // directory exists (created above), the cache file is PowerShell's to write.
367
+ env.PSModuleAnalysisCachePath = path.join(dirs.psModuleCache, 'ModuleAnalysisCache');
368
+ env.CODEX_HOME = dirs.codexHome;
369
+ env.CLAUDE_CONFIG_DIR = dirs.claudeConfig;
370
+ env.KB_DATA_DIR = dirs.dataHome;
371
+ env.KB_KNOWLEDGE_DATA_DIR = dirs.knowledgeHome;
372
+ env.AI_CODING_EVENT_BRIDGE_HOME = dirs.bridgeHome;
373
+ env.AGENT_TERMINAL_DATA_DIR = dirs.agentTerminalData;
374
+ env.CLAUDE_AI_WORKBENCH_DATA_DIR = dirs.workbenchData;
375
+ // Explicit, dead module endpoints: the product must never be able to reach
376
+ // a developer's live module through an inherited URL.
377
+ for (const key of MODULE_URL_KEYS) env[key] = DEAD_MODULE_URL;
378
+ for (const key of MODULE_FLAG_KEYS) env[key] = '0';
379
+ for (const key of MODULE_COMMAND_KEYS) env[key] = '';
380
+ if (process.platform !== 'win32') {
381
+ // Keep Chrome's XDG lookups inside the isolated home as well.
382
+ env.XDG_CONFIG_HOME = path.join(dirs.home, '.config');
383
+ env.XDG_CACHE_HOME = path.join(dirs.home, '.cache');
384
+ fs.mkdirSync(env.XDG_CONFIG_HOME, { recursive: true });
385
+ fs.mkdirSync(env.XDG_CACHE_HOME, { recursive: true });
386
+ }
387
+
388
+ const chromeProfileDirs = chromeDefaultProfileDirs(dirs);
389
+
390
+ // Phase 6: the entry's explicit lane endpoints / stand-ins. They are
391
+ // applied last and are never sanitized away.
392
+ const appliedOverrides = [];
393
+ for (const [key, value] of Object.entries(extraEnv || {})) {
394
+ env[key] = String(value);
395
+ appliedOverrides.push(key);
396
+ }
397
+
398
+ return {
399
+ caseId: caseId || label,
400
+ prefix: label,
401
+ tempRoot,
402
+ laneTmp,
403
+ dirs,
404
+ chrome,
405
+ chromePath: chrome ? chrome.path : null,
406
+ chromeProfileDirs,
407
+ isolatedEnvKeys: ISOLATED_ENV_KEYS.slice(),
408
+ sanitized,
409
+ appliedOverrides,
410
+ cleanup() {
411
+ try { fs.rmSync(laneTmp, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch {}
412
+ },
413
+ };
414
+ }
415
+
416
+ module.exports = {
417
+ REPO_ROOT,
418
+ ISOLATED_ENV_KEYS,
419
+ SYSTEM_ENV_ALLOWLIST,
420
+ TOOL_ENV_KEYS,
421
+ DENY_KEY_PATTERNS,
422
+ MODULE_URL_KEYS,
423
+ MODULE_FLAG_KEYS,
424
+ MODULE_COMMAND_KEYS,
425
+ DEAD_MODULE_URL,
426
+ isInsideRepo,
427
+ resolveTempRoot,
428
+ resolveEvidenceDir,
429
+ captureChrome,
430
+ sanitizeEnv,
431
+ installLoggingTestEnv,
432
+ };
@@ -0,0 +1,81 @@
1
+ 'use strict';
2
+ // Lane-owned stand-in analyzer for the P-MEMORY-01 memory lane.
3
+ //
4
+ // HONEST SCOPE LABEL: this analyzer replaces the model-driven analysis step
5
+ // of the knowledge engine. It writes a real staged Markdown file and a real
6
+ // knowledge-staging-manifest through the engine's REAL promotion path, and it
7
+ // can declare memory candidates, but it proves nothing about model quality,
8
+ // prompt adherence or the headless Agent SDK worker. Every case that relies on
9
+ // it is evidence about the engine's memory admission, scope and injection
10
+ // machinery, never about the model.
11
+ //
12
+ // The manifest it writes is the engine's own schema. The engine's own
13
+ // KnowledgePromotionService validates it, promotes the staged file into the
14
+ // project knowledge directory and hands the run's staging to the real
15
+ // MemoryService.capture(), which applies the real provenance gate.
16
+ //
17
+ // The candidates it declares come from the test's plan. The test owns them
18
+ // because the engine's own gate requires them to quote a real human
19
+ // conversation event, and only the test knows that event's id and hash.
20
+
21
+ const path = require('node:path');
22
+ const crypto = require('node:crypto');
23
+ const AtomicFile = require('../../../_modules/knowledge-engine/src/runtime/atomic-file.js');
24
+
25
+ /**
26
+ * A long enough sentence that the engine's own capture gate accepts it as a
27
+ * quote (the gate requires at least eight characters) and that the promoted
28
+ * Markdown always contains, so the promoted file can be checked against the
29
+ * candidate's quote on disk.
30
+ */
31
+ const EVIDENCE_QUOTE = '候选记忆依据:以下文字来自冻结的提交与人工对话,可用于验证记忆候选的来源可追溯性。';
32
+
33
+ function hashBuffer(value) {
34
+ return `sha256:${crypto.createHash('sha256').update(value).digest('hex')}`;
35
+ }
36
+
37
+ /**
38
+ * @param {object} options
39
+ * @param {object} options.plan Mutable plan the test owns. `plan.document` is
40
+ * the staged Markdown, `plan.memoryCandidates` are the candidates the
41
+ * stand-in proposes to the real capture path.
42
+ */
43
+ function createMemoryStandinAnalyzer({ plan = {} } = {}) {
44
+ return {
45
+ sourceReadMode: 'isolated-frozen-evidence',
46
+ async runClaim(input) {
47
+ const relative = `changes/${input.claim.commitSha.slice(0, 12)}.md`;
48
+ const base = plan.document
49
+ || `# 维护产物 ${input.projectId}\n\nCommit ${input.claim.commitSha} 的冻结提交证据。\n`;
50
+ const document = base.includes(EVIDENCE_QUOTE) ? base : `${base}\n${EVIDENCE_QUOTE}\n`;
51
+ AtomicFile.writeFileAtomic(path.join(input.stagingPath, 'files', relative), document);
52
+ const evidenceReferences = [
53
+ `commit:${input.claim.commitSha}`,
54
+ input.claim.patchHash && `patch:${input.claim.patchHash}`,
55
+ input.claim.conversationSnapshotHash && `conversation:${input.claim.conversationSnapshotHash}`,
56
+ input.claim.retrievalManifestHash && `retrieval:${input.claim.retrievalManifestHash}`,
57
+ ].filter(Boolean);
58
+ const memoryCandidates = (plan.memoryCandidates || []).map(candidate => ({
59
+ ...candidate,
60
+ entryId: candidate.entryId || relative,
61
+ }));
62
+ AtomicFile.writeJsonAtomic(input.manifestPath, {
63
+ schema: 'knowledge-staging-manifest/v1',
64
+ projectId: input.projectId,
65
+ runId: input.claim.runId,
66
+ commitSha: input.claim.commitSha,
67
+ operations: [{
68
+ path: relative,
69
+ operation: 'create',
70
+ sha256: hashBuffer(document),
71
+ reason: 'Frozen Git evidence from the fixture commit (stand-in analyzer, no real model output)',
72
+ evidenceReferences,
73
+ }],
74
+ memoryCandidates,
75
+ });
76
+ return { ok: true };
77
+ },
78
+ };
79
+ }
80
+
81
+ module.exports = { createMemoryStandinAnalyzer, EVIDENCE_QUOTE };
@@ -0,0 +1,128 @@
1
+ 'use strict';
2
+ // _site/_test/helpers/parallel-memory-event-bridge.js
3
+ //
4
+ // Lane-owned stand-in for the event-bridge console.
5
+ //
6
+ // WHY THIS EXISTS (and why the shared module fixture cannot be used here):
7
+ // the product's module bridge sends the event-bridge project id to the
8
+ // knowledge engine as a `conversationBaselineCursors` key. The engine accepts
9
+ // only 'global' or `sha256:<64 hex>` as such a key. The real event-bridge
10
+ // console derives its project id from the Git workspace identity, which is
11
+ // exactly that `sha256:` form. The shared test fixture instead answers with
12
+ // `bridge-1`, which the engine rejects with 400 "会话跟踪基线无效。" and the
13
+ // project is never registered with the engine — so no memory run can happen.
14
+ //
15
+ // The shared helper is read-only for this lane, so this stand-in reproduces
16
+ // the real console's id derivation instead of inventing one: it calls the
17
+ // installed bridge package's own `resolveRepoContext`, the same function the
18
+ // product's bridge adapter calls.
19
+ //
20
+ // HONEST SCOPE LABEL: this is a stand-in for the event-bridge console. It
21
+ // serves the project registry and the journal high-watermark endpoints that
22
+ // the product's module bridge calls. It stores no conversation and writes no
23
+ // journal; the memory lane drives the engine's own conversation store
24
+ // directly, and it says so in its own report.
25
+
26
+ const http = require('node:http');
27
+ const path = require('node:path');
28
+ const { resolveRepoContext } = require('@sanqianx/ai-coding-event-bridge-console/src/bridge/core/repo-context');
29
+
30
+ function readBody(req) {
31
+ return new Promise((resolve, reject) => {
32
+ const chunks = [];
33
+ req.on('data', chunk => chunks.push(chunk));
34
+ req.on('end', () => resolve(Buffer.concat(chunks)));
35
+ req.on('error', reject);
36
+ });
37
+ }
38
+
39
+ function sendJson(res, status, payload) {
40
+ const body = JSON.stringify(payload);
41
+ res.writeHead(status, { 'Content-Type': 'application/json; charset=utf-8', 'Content-Length': Buffer.byteLength(body) });
42
+ res.end(body);
43
+ }
44
+
45
+ async function createEventBridgeStandin({ tag = 'event-bridge' } = {}) {
46
+ const state = { projects: [], requests: [] };
47
+
48
+ const server = http.createServer(async (req, res) => {
49
+ const url = new URL(req.url, 'http://127.0.0.1');
50
+ const raw = await readBody(req);
51
+ let body = null;
52
+ if (raw.length) { try { body = JSON.parse(raw.toString('utf8')); } catch { body = null; } }
53
+ state.requests.push({ method: req.method, path: url.pathname + url.search, body, at: Date.now() });
54
+
55
+ if (req.method === 'GET' && url.pathname === '/api/projects') {
56
+ sendJson(res, 200, { projects: state.projects });
57
+ return;
58
+ }
59
+ if (req.method === 'POST' && url.pathname === '/api/projects') {
60
+ const projectPath = String(body?.path || '');
61
+ if (!projectPath) {
62
+ sendJson(res, 400, { error: { code: 'PROJECT_PATH_REQUIRED', message: 'project path required' } });
63
+ return;
64
+ }
65
+ if (state.projects.some(project => String(project.path).toLowerCase() === projectPath.toLowerCase())) {
66
+ sendJson(res, 409, { error: { code: 'PROJECT_DUPLICATE', message: 'project path already imported' } });
67
+ return;
68
+ }
69
+ let identity = null;
70
+ let resolvedPath = projectPath;
71
+ try {
72
+ const context = await resolveRepoContext(projectPath);
73
+ identity = context.repoIdentity;
74
+ resolvedPath = context.projectPath || projectPath;
75
+ } catch (error) {
76
+ sendJson(res, 422, { error: { code: 'PROJECT_NOT_GIT', message: `not a Git work tree: ${projectPath}` } });
77
+ return;
78
+ }
79
+ const project = {
80
+ id: identity.workspaceId,
81
+ name: path.basename(resolvedPath),
82
+ path: projectPath,
83
+ store: String(body?.store || ''),
84
+ remote: identity.remote || null,
85
+ auto: false,
86
+ createdAt: new Date().toISOString(),
87
+ };
88
+ state.projects.push(project);
89
+ sendJson(res, 201, { project });
90
+ return;
91
+ }
92
+ if (req.method === 'DELETE' && url.pathname === '/api/projects') {
93
+ const id = url.searchParams.get('id');
94
+ state.projects = state.projects.filter(project => project.id !== id);
95
+ sendJson(res, 200, { ok: true });
96
+ return;
97
+ }
98
+ if (req.method === 'GET' && url.pathname === '/api/journal/high-watermark') {
99
+ const journalId = url.searchParams.get('journalId') || 'global';
100
+ // The lane writes no journal: the high watermark is always 0.
101
+ sendJson(res, 200, { journalId, sequence: 0 });
102
+ return;
103
+ }
104
+ sendJson(res, 404, { ok: false, error: { code: 'NOT_FOUND', message: '未实现的模块接口' } });
105
+ });
106
+
107
+ return {
108
+ kind: 'eventBridge',
109
+ tag,
110
+ state,
111
+ requests: state.requests,
112
+ url: null,
113
+ async start() {
114
+ await new Promise(resolve => server.listen(0, '127.0.0.1', resolve));
115
+ this.url = `http://127.0.0.1:${server.address().port}`;
116
+ return this.url;
117
+ },
118
+ countRequests(method, pathPrefix) {
119
+ return state.requests.filter(entry => entry.method === method && (!pathPrefix || entry.path.startsWith(pathPrefix))).length;
120
+ },
121
+ async close() {
122
+ server.closeAllConnections();
123
+ await new Promise(resolve => server.close(resolve));
124
+ },
125
+ };
126
+ }
127
+
128
+ module.exports = { createEventBridgeStandin };