@sanqianx/project-knowledge 5.0.24 → 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 -1353
  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 +66 -63
  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,314 @@
1
+ 'use strict';
2
+
3
+ // P-ENG-FINAL lane-exclusive harness (parallel-20261023 batch, engine-final).
4
+ //
5
+ // Self-contained: this lane does NOT require the P-ENG-ADVANCED helpers (those
6
+ // are frozen read-only for the Leader). Everything the drivers need is real:
7
+ //
8
+ // * real fixture Git repositories (isolated git config, repo-local only)
9
+ // * a REAL post-commit hook (separate OS process running the real
10
+ // ai-coding-event-bridge commit-boundary CLI from the pinned package)
11
+ // * the real ai-coding-event-bridge console server (in-process, isolated
12
+ // --home journal; pinned @sanqianx package by default, source checkout
13
+ // only via PK_TEST_BRIDGE_ROOT)
14
+ // * the real vector-hub server (in-process, isolated root + deterministic
15
+ // test embeddings: the paid embedding API is NOT exercised; pinned
16
+ // @sanqianx/vector-hub package by default, source checkout only via
17
+ // PK_TEST_VECTOR_ROOT)
18
+ // * the real VENDORED knowledge-engine (in-process, isolated data dir)
19
+ //
20
+ // Isolation: lane temp root at PK_TEST_TEMP_ROOT or os.tmpdir() (never inside
21
+ // the repo), ephemeral 127.0.0.1 ports,
22
+ // scrubbed child env (no KB_*/KNOWLEDGE_*/ANTHROPIC_*/CLAUDE*/GLM/MINIMAX
23
+ // leakage), isolated HOME/USERPROFILE/APPDATA/TEMP, GIT_CONFIG_NOSYSTEM=1 and
24
+ // GIT_CONFIG_GLOBAL pointed at a non-existent file (the user's global git
25
+ // config and hooks are never read or written).
26
+
27
+ const { spawnSync } = require('node:child_process');
28
+ const fs = require('node:fs');
29
+ const http = require('node:http');
30
+ const os = require('node:os');
31
+ const path = require('node:path');
32
+
33
+ const REPO_ROOT = path.resolve(__dirname, '..', '..', '..');
34
+ const VENDORED_ENGINE_SERVER = path.join(REPO_ROOT, '_modules', 'knowledge-engine', 'src', 'server.js');
35
+ const VENDORED_ATOMIC_FILE = path.join(REPO_ROOT, '_modules', 'knowledge-engine', 'src', 'runtime', 'atomic-file.js');
36
+
37
+ // Pinned runtime by default: the root repo's installed
38
+ // versions declared by the root package (identity-checked below), so the drivers are portable to any checkout of this
39
+ // repo. A sibling SOURCE checkout may be substituted only through the explicit
40
+ // env overrides PK_TEST_BRIDGE_ROOT / PK_TEST_VECTOR_ROOT.
41
+ function resolveRuntimeRoot(envVar, pinnedDir, pinnedVersion) {
42
+ const fromEnv = process.env[envVar];
43
+ const root = path.resolve(fromEnv || pinnedDir);
44
+ if (!fs.existsSync(root)) throw new Error(`runtime root ${root} does not exist (${fromEnv ? `${envVar} override` : `pinned ${pinnedVersion} install`} is missing)`);
45
+ const manifest = JSON.parse(fs.readFileSync(path.join(root, 'package.json'), 'utf8'));
46
+ if (!fromEnv && manifest.version !== pinnedVersion) {
47
+ throw new Error(`pinned runtime at ${root} is ${manifest.version}, expected ${pinnedVersion}`);
48
+ }
49
+ return { root, version: manifest.version, origin: fromEnv ? `env ${envVar}` : 'pinned package' };
50
+ }
51
+
52
+ function declaredModuleVersion(name) {
53
+ const version = JSON.parse(fs.readFileSync(path.join(REPO_ROOT, 'package.json'), 'utf8')).dependencies[name];
54
+ if (!/^\d+\.\d+\.\d+(?:-rc\.\d+)?$/.test(version || '')) throw new Error(`exact module dependency required: ${name}`);
55
+ return version;
56
+ }
57
+ const BRIDGE = resolveRuntimeRoot('PK_TEST_BRIDGE_ROOT', path.join(REPO_ROOT, 'node_modules', '@sanqianx', 'ai-coding-event-bridge-console'), declaredModuleVersion('@sanqianx/ai-coding-event-bridge-console'));
58
+ const VECTOR = resolveRuntimeRoot('PK_TEST_VECTOR_ROOT', path.join(REPO_ROOT, 'node_modules', '@sanqianx', 'vector-hub'), declaredModuleVersion('@sanqianx/vector-hub'));
59
+ const BRIDGE_ROOT = BRIDGE.root;
60
+ const BRIDGE_CLI = path.join(BRIDGE_ROOT, 'src', 'bridge', 'bin', 'commit-boundary.js');
61
+ const VECTOR_ROOT = VECTOR.root;
62
+
63
+ // Temp root: PK_TEST_TEMP_ROOT or the OS temp dir; never inside the repository.
64
+ const TEMP_ROOT = (() => {
65
+ const base = path.resolve(process.env.PK_TEST_TEMP_ROOT || path.join(os.tmpdir(), 'project-knowledge-engine-test'));
66
+ if (base === REPO_ROOT || base.startsWith(REPO_ROOT + path.sep)) {
67
+ throw new Error(`temp root must live outside the repository (got ${base})`);
68
+ }
69
+ return base;
70
+ })();
71
+
72
+ function ensureTempRoot() {
73
+ fs.mkdirSync(TEMP_ROOT, { recursive: true });
74
+ return TEMP_ROOT;
75
+ }
76
+
77
+ function makeLaneDir(label) {
78
+ ensureTempRoot();
79
+ return fs.mkdtempSync(path.join(TEMP_ROOT, `${label}-`));
80
+ }
81
+
82
+ // Scrubbed environment: no profile/quota/credential leakage, isolated HOME and
83
+ // TEMP, isolated git config. Nothing here relies on the caller unsetting vars.
84
+ function isolatedEnv(extra = {}) {
85
+ const home = extra.ISOLATED_HOME || path.join(ensureTempRoot(), 'isolated-home');
86
+ fs.mkdirSync(home, { recursive: true });
87
+ const env = { ...process.env };
88
+ for (const name of Object.keys(env)) {
89
+ if (/^(KB_|KNOWLEDGE_|ANTHROPIC_|CLAUDE|OPENAI_|CODEX|MINIMAX|GLM|AI_CODING_EVENT_BRIDGE|PK_TEST_)/i.test(name)) delete env[name];
90
+ }
91
+ const tmp = path.join(ensureTempRoot(), 'tmp');
92
+ fs.mkdirSync(tmp, { recursive: true });
93
+ env.HOME = home;
94
+ env.USERPROFILE = home;
95
+ env.APPDATA = path.join(home, 'AppData', 'Roaming');
96
+ env.LOCALAPPDATA = path.join(home, 'AppData', 'Local');
97
+ env.TEMP = tmp;
98
+ env.TMP = tmp;
99
+ env.TMPDIR = tmp;
100
+ env.GIT_CONFIG_NOSYSTEM = '1';
101
+ env.GIT_CONFIG_GLOBAL = path.join(home, 'does-not-exist.gitconfig');
102
+ env.AI_CODING_EVENT_BRIDGE_HOME = path.join(home, 'bridge-home');
103
+ env.BRIDGE_CONSOLE_PICK_FOLDER = '0';
104
+ return { ...env, ...extra };
105
+ }
106
+
107
+ // git with the isolated config; returns {code, stdout, stderr} so a driver can
108
+ // assert the real exit code of a commit whose hook failed.
109
+ function gitRun(repoPath, args) {
110
+ const result = spawnSync('git', args, { cwd: repoPath, windowsHide: true, encoding: 'utf8', env: isolatedEnv() });
111
+ return { code: result.status, stdout: (result.stdout || '').trim(), stderr: (result.stderr || '').trim() };
112
+ }
113
+
114
+ function git(repoPath, args) {
115
+ const result = gitRun(repoPath, args);
116
+ if (result.code !== 0) throw new Error(`git ${args.join(' ')} failed (${result.code}): ${result.stderr}`);
117
+ return result.stdout;
118
+ }
119
+
120
+ // Real fixture repository: init + baseline + one labeled commit per entry.
121
+ function buildFixtureRepo(root, name, commits = []) {
122
+ const repoPath = path.join(root, `repo-${name}`);
123
+ fs.mkdirSync(repoPath, { recursive: true });
124
+ git(repoPath, ['init', '-q']);
125
+ git(repoPath, ['config', 'user.email', 'engine-final@test.invalid']);
126
+ git(repoPath, ['config', 'user.name', 'P-ENG-FINAL']);
127
+ fs.writeFileSync(path.join(repoPath, 'README.md'), `# ${name}\n\nFixture repository.\n`);
128
+ git(repoPath, ['add', '.']);
129
+ git(repoPath, ['commit', '-qm', 'baseline']);
130
+ const baseline = git(repoPath, ['rev-parse', 'HEAD']);
131
+ const shas = {};
132
+ for (const label of commits) {
133
+ fs.writeFileSync(path.join(repoPath, `${label}.txt`), `change ${name} ${label}\n` + 'x'.repeat(64) + '\n');
134
+ git(repoPath, ['add', '.']);
135
+ git(repoPath, ['commit', '-qm', `feature ${label}`]);
136
+ shas[label] = git(repoPath, ['rev-parse', 'HEAD']);
137
+ }
138
+ return { repoPath, baseline, shas };
139
+ }
140
+
141
+ // Real git hook inside the FIXTURE repository only (.git/hooks/post-commit).
142
+ // The user's global git config and global hooks are never touched.
143
+ function installPostCommitHook(repoPath, { home, mode = 'ok' }) {
144
+ const hookPath = path.join(repoPath, '.git', 'hooks', 'post-commit');
145
+ const slash = value => value.replace(/\\/g, '/');
146
+ const cli = mode === 'ok' ? slash(BRIDGE_CLI) : slash(path.join(BRIDGE_ROOT, 'src', 'bridge', 'bin', 'commit-boundary.missing.js'));
147
+ const script = [
148
+ '#!/bin/sh',
149
+ mode === 'ok' ? `"${slash(process.execPath)}" "${cli}" --home "${slash(home)}" --cwd "${slash(repoPath)}" >/dev/null 2>&1` : `"${slash(process.execPath)}" "${cli}" --home "${slash(home)}" --cwd "${slash(repoPath)}"`,
150
+ 'exit 1',
151
+ '',
152
+ ].join('\n');
153
+ fs.mkdirSync(path.dirname(hookPath), { recursive: true });
154
+ fs.writeFileSync(hookPath, script, { mode: 0o755 });
155
+ return { hookPath, mode, content: script };
156
+ }
157
+
158
+ // Real bridge console + journal, isolated home, ephemeral loopback port.
159
+ function startBridge(home) {
160
+ fs.mkdirSync(home, { recursive: true });
161
+ const { createBridge, projectRegistry, resolveRepoContext } = require(path.join(BRIDGE_ROOT, 'src', 'bridge'));
162
+ const { createConsoleServer } = require(path.join(BRIDGE_ROOT, 'src', 'server'));
163
+ const bridge = createBridge({ homeDir: home });
164
+ const server = http.createServer(createConsoleServer({ home }));
165
+ return {
166
+ home, bridge, projectRegistry, resolveRepoContext, server,
167
+ async listen() {
168
+ await new Promise(resolve => server.listen(0, '127.0.0.1', resolve));
169
+ return `http://127.0.0.1:${server.address().port}`;
170
+ },
171
+ async close() { server.closeAllConnections(); await new Promise(resolve => server.close(resolve)); },
172
+ };
173
+ }
174
+
175
+ // Real vector-hub server on an isolated root. Embeddings are deterministic test
176
+ // vectors (the paid embedding API is NOT exercised - stated as a boundary).
177
+ function startVector(root) {
178
+ fs.mkdirSync(root, { recursive: true });
179
+ const { HubManager } = require(path.join(VECTOR_ROOT, 'dist', 'cjs', 'server', 'manager'));
180
+ const { createServer } = require(path.join(VECTOR_ROOT, 'dist', 'cjs', 'server', 'server'));
181
+ const embeddingsFactory = () => ({
182
+ maxTokens: 500,
183
+ async createEmbeddings(inputs) {
184
+ const texts = Array.isArray(inputs) ? inputs : [inputs];
185
+ return { status: 'success', output: texts.map((text, index) => [1, 0, index / 1000]) };
186
+ },
187
+ });
188
+ return HubManager.load({
189
+ rootPath: path.join(root, 'indexes'),
190
+ configPath: path.join(root, 'vector-config.json'),
191
+ embeddingsFactory,
192
+ }).then(async manager => {
193
+ await manager.saveSettings({ provider: 'minimax', apiKey: 'embedding-test-marker' });
194
+ const server = http.createServer(createServer(manager));
195
+ await new Promise(resolve => server.listen(0, '127.0.0.1', resolve));
196
+ return {
197
+ manager, server,
198
+ url: `http://127.0.0.1:${server.address().port}`,
199
+ async close() { server.closeAllConnections(); await new Promise(resolve => server.close(resolve)); manager.close?.(); },
200
+ };
201
+ });
202
+ }
203
+
204
+ // Real vendored knowledge-engine, in-process, isolated data dir.
205
+ function startEngine({ dataDir, bridgeUrl, vectorUrl, analyzer, debug = true, consume = true, runtimeToken = null }) {
206
+ fs.mkdirSync(dataDir, { recursive: true });
207
+ // Fail-closed endpoint guard: the coordinator ignores env and silently
208
+ // defaults its vector/bridge legs to LIVE 8787/8790, so an engine without
209
+ // explicit OWN endpoints is refused instead of defaulting live.
210
+ const { assertOwnedEndpoint } = require('./parallel-qa-engine-endpoint-guard');
211
+ assertOwnedEndpoint(vectorUrl, { role: 'vectorUrl' });
212
+ assertOwnedEndpoint(bridgeUrl, { role: 'bridgeUrl' });
213
+ const { createEngineServer } = require(VENDORED_ENGINE_SERVER);
214
+ const runtime = createEngineServer({ dataDir, consume, debug, analyzer, bridgeUrl, vectorUrl, runtimeToken });
215
+ return {
216
+ runtime,
217
+ async listen() {
218
+ await runtime.ready;
219
+ await new Promise(resolve => runtime.server.listen(0, '127.0.0.1', resolve));
220
+ return `http://127.0.0.1:${runtime.server.address().port}`;
221
+ },
222
+ async close() { await runtime.close(); },
223
+ };
224
+ }
225
+
226
+ async function waitUntil(fn, timeoutMs, describe) {
227
+ const started = Date.now();
228
+ for (;;) {
229
+ const value = await fn();
230
+ if (value) return value;
231
+ if (Date.now() - started > timeoutMs) throw new Error(`waitUntil timed out after ${timeoutMs}ms: ${describe}`);
232
+ await new Promise(resolve => setTimeout(resolve, 25));
233
+ }
234
+ }
235
+
236
+ async function callJson(base, route, body, init = {}) {
237
+ const response = await fetch(`${base}${route}`, {
238
+ ...init,
239
+ method: body === undefined && !init.method ? 'GET' : init.method || 'POST',
240
+ headers: { 'Content-Type': 'application/json', ...(init.headers || {}) },
241
+ body: body === undefined && (!init.method || init.method === 'GET') ? undefined : JSON.stringify(body),
242
+ });
243
+ let payload = null;
244
+ try { payload = await response.json(); } catch { payload = null; }
245
+ return { status: response.status, body: payload };
246
+ }
247
+
248
+ // Fire a request and drop the response (simulates a lost network answer).
249
+ function callJsonAndLoseResponse(base, route, body) {
250
+ return new Promise(resolve => {
251
+ const url = new URL(route, base);
252
+ const payload = JSON.stringify(body || {});
253
+ const request = http.request({
254
+ hostname: url.hostname, port: url.port, path: url.pathname + url.search, method: 'POST',
255
+ headers: { 'Content-Type': 'application/json', 'Content-Length': Buffer.byteLength(payload) },
256
+ });
257
+ request.on('error', () => resolve({ lost: true, error: 'socket-error' }));
258
+ request.end(payload);
259
+ setTimeout(() => { request.destroy(); resolve({ lost: true, error: 'response-dropped' }); }, 120);
260
+ });
261
+ }
262
+
263
+ function listFilesRecursive(root) {
264
+ const out = [];
265
+ if (!fs.existsSync(root)) return out;
266
+ for (const entry of fs.readdirSync(root, { withFileTypes: true })) {
267
+ const absolute = path.join(root, entry.name);
268
+ if (entry.isDirectory()) out.push(...listFilesRecursive(absolute).map(sub => `${entry.name}/${sub}`));
269
+ else out.push(entry.name);
270
+ }
271
+ return out.sort();
272
+ }
273
+
274
+ function readJsonl(file) {
275
+ if (!fs.existsSync(file)) return [];
276
+ return fs.readFileSync(file, 'utf8').split('\n').filter(Boolean).map(line => JSON.parse(line));
277
+ }
278
+
279
+ function saveEvidence(laneDir, name, value) {
280
+ fs.mkdirSync(laneDir, { recursive: true });
281
+ fs.writeFileSync(path.join(laneDir, name), JSON.stringify(value, null, 2));
282
+ }
283
+
284
+ function hashText(value) {
285
+ return require('node:crypto').createHash('sha256').update(value).digest('hex');
286
+ }
287
+
288
+ module.exports = {
289
+ REPO_ROOT,
290
+ VENDORED_ENGINE_SERVER,
291
+ VENDORED_ATOMIC_FILE,
292
+ RUNTIME_IDENTITY: { bridge: BRIDGE, vector: VECTOR },
293
+ BRIDGE_ROOT,
294
+ BRIDGE_CLI,
295
+ VECTOR_ROOT,
296
+ TEMP_ROOT,
297
+ ensureTempRoot,
298
+ makeLaneDir,
299
+ isolatedEnv,
300
+ git,
301
+ gitRun,
302
+ buildFixtureRepo,
303
+ installPostCommitHook,
304
+ startBridge,
305
+ startVector,
306
+ startEngine,
307
+ waitUntil,
308
+ callJson,
309
+ callJsonAndLoseResponse,
310
+ listFilesRecursive,
311
+ readJsonl,
312
+ saveEvidence,
313
+ hashText,
314
+ };
@@ -0,0 +1,159 @@
1
+ 'use strict';
2
+
3
+ // P-ENG-FINAL deterministic analyzer stand-in.
4
+ //
5
+ // SCOPE (declared): this stand-in writes REAL staged Markdown bytes and a REAL
6
+ // staging manifest through the engine's real promotion path (journal, backups,
7
+ // hashing, state advance, index sync). It does NOT exercise a real model, a
8
+ // real prompt, or any paid API - the promoted text is fixture content, and the
9
+ // memory candidates it emits are engine-validated against the frozen
10
+ // conversation snapshot exactly like a real analyzer's would be.
11
+ //
12
+ // The stand-in exists to make timing and failure deterministic; every engine
13
+ // behaviour asserted by the drivers (journal, claim binding, promotion,
14
+ // eligibility gate, dedup, retry) is the production code path.
15
+
16
+ const fs = require('node:fs');
17
+ const path = require('node:path');
18
+ const crypto = require('node:crypto');
19
+
20
+ function hashBuffer(value) {
21
+ return `sha256:${crypto.createHash('sha256').update(value).digest('hex')}`;
22
+ }
23
+
24
+ function createStandinAnalyzer(options = {}) {
25
+ const {
26
+ eventsFile = null,
27
+ failShas = new Set(),
28
+ // Transient fault model: the FIRST invocation for a listed SHA fails, the
29
+ // retry succeeds (models a one-off fault, not a permanently broken commit).
30
+ failOnceShas = new Set(),
31
+ readSnapshot = null,
32
+ humanQuote = null,
33
+ delegatedQuote = null,
34
+ emitMemoryCandidates = false,
35
+ extraOperations = [],
36
+ } = options;
37
+
38
+ function record(entry) {
39
+ if (!eventsFile) return;
40
+ fs.mkdirSync(path.dirname(eventsFile), { recursive: true });
41
+ fs.appendFileSync(eventsFile, `${JSON.stringify({ ...entry, at: new Date().toISOString(), pid: process.pid })}\n`);
42
+ }
43
+
44
+ const attemptsBySha = new Map();
45
+
46
+ function pickEvent(snapshot, origin) {
47
+ const turns = snapshot?.turns || [];
48
+ for (const turn of turns) {
49
+ for (const event of turn.userEvents || []) {
50
+ if ((event.inputOrigin || 'unknown') === origin) return event;
51
+ }
52
+ }
53
+ return null;
54
+ }
55
+
56
+ return {
57
+ sourceReadMode: 'isolated-frozen-evidence',
58
+ async runClaim(input) {
59
+ const claim = input.claim;
60
+ const sha = claim.commitSha;
61
+ const attempt = (attemptsBySha.get(sha) || 0) + 1;
62
+ attemptsBySha.set(sha, attempt);
63
+ record({ kind: 'start', projectId: input.projectId, runId: claim.runId, commitSha: sha, attempt });
64
+ try {
65
+ if (failShas.has(sha) || (failOnceShas.has(sha) && attempt === 1)) {
66
+ const error = new Error('stand-in analyzer failure (injected)');
67
+ error.code = 'STANDIN_ANALYZER_FAILURE';
68
+ throw error;
69
+ }
70
+ const filename = `changes/${sha.slice(0, 12)}.md`;
71
+ const lines = [
72
+ '---',
73
+ `commit: ${sha}`,
74
+ `run: ${claim.runId}`,
75
+ '---',
76
+ `# Fixture knowledge ${input.projectId}`,
77
+ '',
78
+ `Commit ${sha} promoted by the deterministic stand-in analyzer (no real model output).`,
79
+ '',
80
+ ];
81
+ if (humanQuote) lines.push(`用户原话:${humanQuote}`, '');
82
+ if (delegatedQuote) lines.push(`维护指令:${delegatedQuote}`, '');
83
+ const markdown = lines.join('\n');
84
+
85
+ const AtomicFile = require('../../../_modules/knowledge-engine/src/runtime/atomic-file.js');
86
+ AtomicFile.writeFileAtomic(path.join(input.stagingPath, 'files', ...filename.split('/')), markdown);
87
+
88
+ const references = [
89
+ `commit:${claim.commitSha}`,
90
+ `patch:${claim.patchHash}`,
91
+ `conversation:${claim.conversationSnapshotHash}`,
92
+ `retrieval:${claim.retrievalManifestHash}`,
93
+ ];
94
+ const operations = [{
95
+ operation: 'create',
96
+ path: filename,
97
+ reason: 'Deterministic stand-in knowledge for acceptance coverage',
98
+ sha256: hashBuffer(markdown),
99
+ evidenceReferences: references,
100
+ }];
101
+ for (const extra of extraOperations) {
102
+ operations.push({
103
+ operation: extra.operation,
104
+ path: extra.path,
105
+ reason: extra.reason || 'Deterministic stand-in extra operation',
106
+ sha256: extra.operation === 'delete' ? undefined : hashBuffer(extra.content || ''),
107
+ evidenceReferences: references,
108
+ });
109
+ if (extra.operation !== 'delete' && extra.content) {
110
+ AtomicFile.writeFileAtomic(path.join(input.stagingPath, 'files', ...extra.path.split('/')), extra.content);
111
+ }
112
+ }
113
+
114
+ const memoryCandidates = [];
115
+ if (emitMemoryCandidates && readSnapshot) {
116
+ const snapshot = readSnapshot(input.projectId, sha);
117
+ const human = pickEvent(snapshot, 'human');
118
+ const delegated = pickEvent(snapshot, 'agent-delegation');
119
+ if (human && humanQuote) {
120
+ memoryCandidates.push({
121
+ text: humanQuote,
122
+ entryId: filename,
123
+ quote: humanQuote,
124
+ sourceEventId: human.eventId,
125
+ sourceHash: human.contentHash,
126
+ scopeType: 'global',
127
+ eligibility: { durable: true, crossProject: true, reason: 'fixture durable owner preference', scopeReason: 'fixture scope reason' },
128
+ });
129
+ }
130
+ if (delegated && delegatedQuote) {
131
+ memoryCandidates.push({
132
+ text: delegatedQuote,
133
+ entryId: filename,
134
+ quote: delegatedQuote,
135
+ sourceEventId: delegated.eventId,
136
+ sourceHash: delegated.contentHash,
137
+ scopeType: 'global',
138
+ eligibility: { durable: true, crossProject: true, reason: 'fixture delegated maintenance instruction', scopeReason: 'fixture scope reason' },
139
+ });
140
+ }
141
+ }
142
+
143
+ AtomicFile.writeJsonAtomic(input.manifestPath, {
144
+ schema: 'knowledge-staging-manifest/v1',
145
+ projectId: input.projectId,
146
+ runId: claim.runId,
147
+ commitSha: claim.commitSha,
148
+ operations,
149
+ memoryCandidates,
150
+ });
151
+ return { ok: true };
152
+ } finally {
153
+ record({ kind: 'finish', projectId: input.projectId, runId: claim.runId, commitSha: sha });
154
+ }
155
+ },
156
+ };
157
+ }
158
+
159
+ module.exports = { createStandinAnalyzer };