@sanqianx/project-knowledge 5.0.24 → 5.0.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/plugins/marketplace.json +20 -20
- package/.claude-plugin/marketplace.json +1 -1
- package/CHANGELOG.md +1361 -1353
- package/LICENSE +201 -201
- package/NOTICE +5 -5
- package/README.md +349 -349
- package/_modules/knowledge-engine/package.json +1 -1
- package/_modules/knowledge-engine/src/coordinator.js +48 -3
- package/_modules/knowledge-engine/src/runtime/automation-config.js +140 -140
- package/_modules/knowledge-engine/src/runtime/commit-conversation-binder.js +238 -238
- package/_modules/knowledge-engine/src/runtime/commit-processing-ledger.js +26 -26
- package/_modules/knowledge-engine/src/runtime/commit-prompt.js +193 -193
- package/_modules/knowledge-engine/src/runtime/commit-reconciler.js +394 -394
- package/_modules/knowledge-engine/src/runtime/contracts.js +282 -282
- package/_modules/knowledge-engine/src/runtime/conversation-store.js +389 -389
- package/_modules/knowledge-engine/src/runtime/evidence-bundle.js +228 -228
- package/_modules/knowledge-engine/src/runtime/git-runner.js +62 -62
- package/_modules/knowledge-engine/src/runtime/knowledge-promotion.js +505 -505
- package/_modules/knowledge-engine/src/runtime/knowledge-retrieval-service.js +400 -400
- package/_modules/knowledge-engine/src/runtime/markdown-knowledge-indexer.js +171 -171
- package/_modules/knowledge-engine/src/runtime/scanner.js +298 -298
- package/_modules/knowledge-engine/ui/app.js +23 -2
- package/_site/README.md +30 -30
- package/_site/_test/agent-capture-mcp-ui-test.js +68 -68
- package/_site/_test/agent-capture-ui-test.js +101 -101
- package/_site/_test/ai-profile-resolver-test.js +137 -137
- package/_site/_test/ai-profile-test.js +75 -75
- package/_site/_test/ai-vendor-presets-test.js +91 -91
- package/_site/_test/automatic-context-test.js +70 -70
- package/_site/_test/automation-queue-test.js +14 -14
- package/_site/_test/automation-ui-test.js +40 -40
- package/_site/_test/background-task-registry-test.js +43 -43
- package/_site/_test/baseline-schema-test.js +91 -91
- package/_site/_test/bin-cli-test.js +230 -230
- package/_site/_test/bridge-adapter-test.js +95 -95
- package/_site/_test/bridge-consumer-service-test.js +310 -310
- package/_site/_test/candidate-bin-content-test.js +35 -35
- package/_site/_test/candidate-product-assets-test.js +13 -13
- package/_site/_test/candidate-release-contract-test.js +14 -14
- package/_site/_test/capture-hook-dedup-test.js +158 -158
- package/_site/_test/cdp-browser-failure-test.js +103 -103
- package/_site/_test/chat-claudecodeui-match-test.js +92 -92
- package/_site/_test/claude-executable-discovery-test.js +90 -90
- package/_site/_test/claude-session-lifecycle-sweep-test.js +252 -252
- package/_site/_test/claude-workbench-test.js +174 -174
- package/_site/_test/cli-instance-management-test.js +62 -62
- package/_site/_test/client-capture-restart-e2e-test.js +189 -189
- package/_site/_test/codex-conversation-projection-test.js +60 -60
- package/_site/_test/codex-marketplace-scoped-path-test.js +186 -186
- package/_site/_test/codex-notify-capture-e2e-test.js +101 -101
- package/_site/_test/codex-notify-fanout-test.js +141 -134
- package/_site/_test/codex-notify-upgrade-test.js +253 -253
- package/_site/_test/commit-boundary-freeze-test.js +147 -147
- package/_site/_test/commit-conversation-binding-test.js +99 -99
- package/_site/_test/commit-evidence-test.js +110 -110
- package/_site/_test/configuration-generation-test.js +22 -22
- package/_site/_test/context-pack-test.js +200 -200
- package/_site/_test/conversation-api-test.js +119 -119
- package/_site/_test/conversation-origin-test.js +15 -15
- package/_site/_test/conversation-store-test.js +138 -138
- package/_site/_test/cross-repo-isolation-e2e-test.js +187 -187
- package/_site/_test/desktop-browser-compat-test.js +28 -28
- package/_site/_test/desktop-hook-runtime-regression-test.js +204 -204
- package/_site/_test/embedding-config-test.js +32 -32
- package/_site/_test/explicit-commit-processor-test.js +37 -37
- package/_site/_test/fixtures/fake-browser-exit.js +10 -10
- package/_site/_test/fixtures/fake-browser-hang.js +10 -10
- package/_site/_test/fixtures/integration-busy-worker.cjs +6 -6
- package/_site/_test/fixtures/make-git-repos.js +92 -92
- package/_site/_test/fixtures/retrieval-gold-queries.json +32 -32
- package/_site/_test/folder-picker-output-test.js +19 -19
- package/_site/_test/fresh-hook-reimport-test.js +53 -53
- package/_site/_test/fresh-product-data-test.js +56 -56
- package/_site/_test/full-integration-e2e-test.js +167 -167
- package/_site/_test/git-path-compatibility-test.js +80 -80
- package/_site/_test/git-validation-test.js +81 -81
- package/_site/_test/glm-ui-refresh-review-test.js +313 -404
- package/_site/_test/harness-isolation-test.js +138 -0
- package/_site/_test/helpers/cdp-browser.js +383 -0
- package/_site/_test/helpers/cdp-network-capture.js +66 -0
- package/_site/_test/helpers/find-chrome.js +34 -0
- package/_site/_test/helpers/free-port.js +8 -0
- package/_site/_test/helpers/logging-ui-fixture.js +131 -0
- package/_site/_test/helpers/module-fixture.js +282 -0
- package/_site/_test/helpers/parallel-engine-advanced-engine-child.js +45 -0
- package/_site/_test/helpers/parallel-engine-advanced-fault-writer.js +171 -0
- package/_site/_test/helpers/parallel-engine-advanced-harness.js +245 -0
- package/_site/_test/helpers/parallel-engine-advanced-standin-analyzer.js +80 -0
- package/_site/_test/helpers/parallel-engine-advanced-ui-host.js +177 -0
- package/_site/_test/helpers/parallel-engine-final-harness.js +314 -0
- package/_site/_test/helpers/parallel-engine-final-standin-analyzer.js +159 -0
- package/_site/_test/helpers/parallel-knowledge-fixture.js +255 -0
- package/_site/_test/helpers/parallel-logging-acceptance-fixture.js +111 -0
- package/_site/_test/helpers/parallel-logging-acceptance-proxy.js +106 -0
- package/_site/_test/helpers/parallel-logging-fix-r2-proxy.js +205 -0
- package/_site/_test/helpers/parallel-logging-integration-5025-env.js +432 -0
- package/_site/_test/helpers/parallel-memory-analyzer.js +81 -0
- package/_site/_test/helpers/parallel-memory-event-bridge.js +128 -0
- package/_site/_test/helpers/parallel-memory-shell.js +470 -0
- package/_site/_test/helpers/parallel-nav-isolation-env.js +389 -0
- package/_site/_test/helpers/parallel-nav-module-ui.js +186 -0
- package/_site/_test/helpers/parallel-nav-proxy.js +148 -0
- package/_site/_test/helpers/parallel-nav-shell.js +361 -0
- package/_site/_test/helpers/parallel-qa-engine-endpoint-guard.js +206 -0
- package/_site/_test/helpers/parallel-qa-engine-endpoint-isolate.js +257 -0
- package/_site/_test/helpers/parallel-retrieval-followup-corpus.js +293 -0
- package/_site/_test/helpers/parallel-retrieval-followup-next-session.js +70 -0
- package/_site/_test/helpers/parallel-retrieval-followup-r2-shell.js +737 -0
- package/_site/_test/helpers/parallel-retrieval-followup-r2-wb-host.js +82 -0
- package/_site/_test/helpers/parallel-retrieval-followup-shell.js +279 -0
- package/_site/_test/helpers/parallel-workbench-fixture.js +371 -0
- package/_site/_test/helpers/parallel-workbench-host.js +80 -0
- package/_site/_test/helpers/parallel-workbench-integration-5025-fixture.js +408 -0
- package/_site/_test/helpers/parallel-workbench-integration-5025-harness.js +593 -0
- package/_site/_test/helpers/parallel-workbench-integration-5025-host.js +70 -0
- package/_site/_test/helpers/parallel-workbench-integration-5025-launcher.js +240 -0
- package/_site/_test/helpers/parallel-workbench-integration-5025-runtime-harness.js +630 -0
- package/_site/_test/helpers/parallel-workbench-source-map.js +196 -0
- package/_site/_test/helpers/spawn-server.js +106 -0
- package/_site/_test/helpers/version-visibility-fixture.js +251 -0
- package/_site/_test/hook-runtime-endpoint-test.js +88 -88
- package/_site/_test/hook-status-repair-api-test.js +152 -152
- package/_site/_test/hook-trigger-test.js +85 -85
- package/_site/_test/hook-worktree-test.js +42 -42
- package/_site/_test/import-preflight-api-test.js +234 -234
- package/_site/_test/index-builder-test.js +41 -41
- package/_site/_test/index-error-display-contract-test.js +10 -10
- package/_site/_test/index-writer-concurrency-test.js +135 -135
- package/_site/_test/integration-adapters-test.js +262 -262
- package/_site/_test/integration-auto-repair-test.js +113 -113
- package/_site/_test/integration-capture-setup-test.js +118 -118
- package/_site/_test/integration-intent-test.js +81 -81
- package/_site/_test/integration-runtime-binding-a2-test.js +566 -566
- package/_site/_test/integration-runtime-binding-a3-test.js +227 -227
- package/_site/_test/integration-runtime-binding-test.js +473 -473
- package/_site/_test/integration-status-scan-test.js +29 -29
- package/_site/_test/integration-surface-coverage-test.js +164 -164
- package/_site/_test/kb-framework-test.js +57 -57
- package/_site/_test/kbpath-follow-test.js +63 -63
- package/_site/_test/knowledge-db-test.js +144 -144
- package/_site/_test/knowledge-engine-client-test.js +120 -109
- package/_site/_test/knowledge-language-control-test.js +170 -170
- package/_site/_test/knowledge-maintenance-test.js +40 -40
- package/_site/_test/knowledge-promotion-recovery-test.js +260 -260
- package/_site/_test/knowledge-query-test.js +54 -54
- package/_site/_test/knowledge-retrieval-service-test.js +77 -77
- package/_site/_test/knowledge-scopes-test.js +37 -37
- package/_site/_test/knowledge-storage-location-test.js +28 -28
- package/_site/_test/knowledge-storage-startup-test.js +52 -52
- package/_site/_test/knowledge-store-logs-supervision-test.js +89 -89
- package/_site/_test/launcher-readiness-test.js +80 -80
- package/_site/_test/legacy-claude-session-alias-test.js +106 -106
- package/_site/_test/legacy-routes-removed-test.js +47 -47
- package/_site/_test/legacy-workbench-exclusion-test.js +92 -92
- package/_site/_test/live-gateway-test.js +48 -48
- package/_site/_test/local-marketplace-test.js +16 -16
- package/_site/_test/log-redaction-test.js +58 -58
- package/_site/_test/logging-api-test.js +89 -89
- package/_site/_test/logging-sse-no-gap-test.js +88 -88
- package/_site/_test/logging-ui-test.js +107 -107
- package/_site/_test/markdown-delta-overlay-test.js +85 -85
- package/_site/_test/markdown-maintenance-api-test.js +75 -75
- package/_site/_test/markdown-maintenance-test.js +11 -11
- package/_site/_test/mcp-server-test.js +149 -149
- package/_site/_test/model-context-windows-test.js +89 -89
- package/_site/_test/module-agent-start-proxy-test.js +65 -65
- package/_site/_test/module-artifact-integrity-test.js +27 -27
- package/_site/_test/module-boundary-test.js +30 -30
- package/_site/_test/module-bridge-eventbridge-test.js +202 -202
- package/_site/_test/module-dynamic-port-test.js +118 -118
- package/_site/_test/module-index-proxy-test.js +33 -33
- package/_site/_test/module-model-configuration-test.js +44 -44
- package/_site/_test/module-process-lifecycle-test.js +35 -35
- package/_site/_test/module-stream-proxy-test.js +34 -34
- package/_site/_test/module-terminal-restart-test.js +63 -63
- package/_site/_test/module-wiring-unbind-race-test.js +59 -59
- package/_site/_test/native-context-integrations-test.js +86 -86
- package/_site/_test/non-release-ci-test.js +34 -34
- package/_site/_test/offline-boundary-isolation-test.js +32 -32
- package/_site/_test/orphaned-claim-recovery-test.js +80 -80
- package/_site/_test/package-boundary-test.js +43 -43
- package/_site/_test/package-startup-test.js +56 -56
- package/_site/_test/packaged-ui-smoke-test.js +88 -88
- package/_site/_test/parallel-ci-r9-posix-socket-budget-test.js +156 -0
- package/_site/_test/parallel-engine-advanced-eng005-test.js +136 -0
- package/_site/_test/parallel-engine-advanced-eng006-test.js +171 -0
- package/_site/_test/parallel-engine-advanced-eng007-reconcile-test.js +231 -0
- package/_site/_test/parallel-engine-advanced-eng009-test.js +208 -0
- package/_site/_test/parallel-engine-advanced-eng010-test.js +213 -0
- package/_site/_test/parallel-engine-advanced-eng011-ui-probe.js +459 -0
- package/_site/_test/parallel-engine-final-eng002-test.js +255 -0
- package/_site/_test/parallel-engine-final-eng007-test.js +269 -0
- package/_site/_test/parallel-engine-final-eng011-test.js +197 -0
- package/_site/_test/parallel-engine-final-eng012-test.js +354 -0
- package/_site/_test/parallel-knowledge-client-error-code-test.js +184 -0
- package/_site/_test/parallel-knowledge-engine-test.js +353 -0
- package/_site/_test/parallel-knowledge-retrieval-test.js +292 -0
- package/_site/_test/parallel-knowledge-vector-test.js +168 -0
- package/_site/_test/parallel-linux-ci-r7-log007-day-test.js +110 -0
- package/_site/_test/parallel-logging-acceptance-log003-test.js +224 -0
- package/_site/_test/parallel-logging-acceptance-log004-test.js +231 -0
- package/_site/_test/parallel-logging-acceptance-log005-test.js +208 -0
- package/_site/_test/parallel-logging-acceptance-log006-test.js +214 -0
- package/_site/_test/parallel-logging-acceptance-log007-test.js +223 -0
- package/_site/_test/parallel-logging-acceptance-log008-test.js +180 -0
- package/_site/_test/parallel-logging-fix-r2-crash-probe.js +271 -0
- package/_site/_test/parallel-logging-fix-r2-gap-test.js +294 -0
- package/_site/_test/parallel-logging-fix-r2-normalhook-test.js +330 -0
- package/_site/_test/parallel-logging-integration-5025-portability-test.js +554 -0
- package/_site/_test/parallel-memory-candidate-test.js +301 -0
- package/_site/_test/parallel-memory-manual-test.js +197 -0
- package/_site/_test/parallel-memory-scope-test.js +228 -0
- package/_site/_test/parallel-memory-source-test.js +227 -0
- package/_site/_test/parallel-memory-sync-test.js +238 -0
- package/_site/_test/parallel-memory-view-r8-reload-gate-test.js +123 -0
- package/_site/_test/parallel-nav-failure-test.js +119 -0
- package/_site/_test/parallel-nav-isolation-test.js +308 -0
- package/_site/_test/parallel-nav-isolation-vector-path-test.js +90 -0
- package/_site/_test/parallel-nav-offline-test.js +272 -0
- package/_site/_test/parallel-nav-operability-test.js +257 -0
- package/_site/_test/parallel-nav-switch-test.js +247 -0
- package/_site/_test/parallel-nav-theme-test.js +130 -0
- package/_site/_test/parallel-nav-viewport-test.js +310 -0
- package/_site/_test/parallel-qa-engine-endpoint-guard-test.js +273 -0
- package/_site/_test/parallel-retrieval-followup-citation-test.js +219 -0
- package/_site/_test/parallel-retrieval-followup-corpus-test.js +287 -0
- package/_site/_test/parallel-workbench-independent-host.js +262 -0
- package/_site/_test/parallel-workbench-integration-5025-abort-probe.js +340 -0
- package/_site/_test/parallel-workbench-integration-5025-drafts-probe.js +588 -0
- package/_site/_test/parallel-workbench-integration-5025-env-check.js +317 -0
- package/_site/_test/parallel-workbench-integration-5025-model-probe.js +342 -0
- package/_site/_test/parallel-workbench-integration-5025-ordering-probe.js +326 -0
- package/_site/_test/parallel-workbench-model-probe.js +336 -0
- package/_site/_test/parallel-workbench-offline-test.js +169 -0
- package/_site/_test/parallel-workbench-provenance-trace.js +134 -0
- package/_site/_test/parallel-workbench-source-match.js +206 -0
- package/_site/_test/parallel-workbench-standalone-turn.js +349 -0
- package/_site/_test/path-consistency-test.js +151 -151
- package/_site/_test/pending-sweep-test.js +9 -9
- package/_site/_test/post-commit-automation-test.js +87 -87
- package/_site/_test/pr-consumer-contract-test.js +55 -55
- package/_site/_test/product-brand-contract-test.js +25 -25
- package/_site/_test/product-diagnostics-ui-test.js +93 -93
- package/_site/_test/product-empty-state-test.js +148 -0
- package/_site/_test/product-import-ui-test.js +219 -104
- package/_site/_test/product-navigation-test.js +152 -0
- package/_site/_test/product-progress-status-test.js +84 -84
- package/_site/_test/project-delete-recovery-test.js +64 -64
- package/_site/_test/project-domain-create-test.js +91 -0
- package/_site/_test/project-domain-scope-retrieval-test.js +214 -0
- package/_site/_test/project-git-init-confirm-test.js +115 -0
- package/_site/_test/project-goal-editor-test.js +144 -144
- package/_site/_test/project-import-duplicate-alias-test.js +134 -0
- package/_site/_test/project-import-unicode-restart-test.js +140 -0
- package/_site/_test/project-lifecycle-transaction-test.js +106 -106
- package/_site/_test/project-module-partial-recovery-test.js +222 -0
- package/_site/_test/project-remove-running-guard-test.js +79 -79
- package/_site/_test/project-store-test.js +90 -90
- package/_site/_test/project-unbind-late-read-ui-test.js +250 -0
- package/_site/_test/project-unbind-writer-guard-test.js +231 -0
- package/_site/_test/prompt-settings-test.js +115 -115
- package/_site/_test/protected-architecture-gate-test.js +122 -122
- package/_site/_test/refactor-characterization-test.js +36 -36
- package/_site/_test/registry-events-test.js +38 -38
- package/_site/_test/release-version-sync-test.js +115 -115
- package/_site/_test/requirement-binding-test.js +113 -113
- package/_site/_test/requirement-recorder-test.js +173 -173
- package/_site/_test/run-all-tests.js +173 -161
- package/_site/_test/runtime-endpoint-test.js +64 -64
- package/_site/_test/scanner-test.js +83 -83
- package/_site/_test/server-security-test.js +96 -96
- package/_site/_test/sessions-stream-test.js +93 -93
- package/_site/_test/shared-contracts-test.js +58 -58
- package/_site/_test/shared-scope-root-binding-test.js +74 -67
- package/_site/_test/simple-import-test.js +98 -98
- package/_site/_test/startup-analysis-disabled-test.js +16 -16
- package/_site/_test/storage-foundation-test.js +78 -78
- package/_site/_test/structured-logger-test.js +101 -101
- package/_site/_test/t07b-cln-005-coverage-test.js +212 -0
- package/_site/_test/team-knowledge-store-sparse-checkout-test.js +196 -196
- package/_site/_test/team-knowledge-store-test.js +132 -132
- package/_site/_test/test-server-cleanup-test.js +35 -35
- package/_site/_test/test-server-module-isolation-test.js +37 -37
- package/_site/_test/tracking-start-test.js +144 -144
- package/_site/_test/vector-storage-root-test.js +75 -75
- package/_site/_test/version-visibility-browser-probe.js +249 -0
- package/_site/_test/version-visibility-test.js +92 -0
- package/_site/_test/workbench-context-receipts-test.js +22 -22
- package/_site/_test/workbench-permission-test.js +117 -117
- package/_site/_test/zcode-capture-integration-test.js +112 -112
- package/_site/lib/ai-profile-resolver.js +78 -78
- package/_site/lib/ai-vendor-presets.js +83 -83
- package/_site/lib/ai-workspace.js +104 -104
- package/_site/lib/atomic-file.js +204 -204
- package/_site/lib/automation-config.js +140 -140
- package/_site/lib/bridge-adapter.js +260 -260
- package/_site/lib/bridge-consumer-service.js +402 -402
- package/_site/lib/capture-hook-config.js +108 -108
- package/_site/lib/claude-cli-runner.js +1599 -1599
- package/_site/lib/cli-instances.js +43 -43
- package/_site/lib/codex-context-status.js +17 -17
- package/_site/lib/codex-notify-config.js +193 -193
- package/_site/lib/commit-conversation-binder.js +247 -247
- package/_site/lib/commit-processing-ledger.js +27 -27
- package/_site/lib/commit-prompt.js +202 -202
- package/_site/lib/commit-reconciler.js +444 -444
- package/_site/lib/context-pack-builder.js +299 -299
- package/_site/lib/contracts.js +291 -291
- package/_site/lib/conversation-exclusions.js +204 -204
- package/_site/lib/conversation-query-service.js +161 -161
- package/_site/lib/conversation-store.js +387 -387
- package/_site/lib/data-dir.js +13 -13
- package/_site/lib/embedding-service.js +85 -85
- package/_site/lib/engine-connection.js +93 -93
- package/_site/lib/engine-knowledge-client.js +76 -72
- package/_site/lib/evidence-bundle.js +228 -228
- package/_site/lib/folder-picker-output.js +24 -24
- package/_site/lib/git-path.js +14 -14
- package/_site/lib/git-runner.js +62 -62
- package/_site/lib/github-team-store.js +1175 -1175
- package/_site/lib/hook-manager.js +203 -203
- package/_site/lib/index-builder.js +157 -157
- package/_site/lib/index-service.js +173 -173
- package/_site/lib/integration-auto-repair.js +77 -77
- package/_site/lib/integration-installer.js +1240 -1240
- package/_site/lib/integration-intent.js +88 -88
- package/_site/lib/integration-status-scan.js +99 -99
- package/_site/lib/integration-status-worker.js +14 -14
- package/_site/lib/kb-framework.js +191 -191
- package/_site/lib/kb-validator.js +124 -124
- package/_site/lib/knowledge-db.js +363 -363
- package/_site/lib/knowledge-promotion.js +435 -435
- package/_site/lib/knowledge-retrieval-service.js +401 -401
- package/_site/lib/knowledge-schema.js +121 -121
- package/_site/lib/knowledge-tool-runtime.js +366 -366
- package/_site/lib/live-gateway.js +78 -78
- package/_site/lib/llm-client.js +173 -173
- package/_site/lib/markdown-knowledge-indexer.js +230 -230
- package/_site/lib/model-context-windows.js +82 -82
- package/_site/lib/module-bridge.js +874 -874
- package/_site/lib/module-port-resolver.js +57 -57
- package/_site/lib/post-commit-automation.js +141 -141
- package/_site/lib/product-data.js +35 -35
- package/_site/lib/project-lifecycle-service.js +554 -554
- package/_site/lib/project-registry-store.js +129 -129
- package/_site/lib/project-store.js +268 -268
- package/_site/lib/prompt-registry.js +148 -148
- package/_site/lib/public-version-info.js +37 -0
- package/_site/lib/registry-events.js +16 -16
- package/_site/lib/requirement-adapters.js +10 -10
- package/_site/lib/requirement-binder.js +112 -112
- package/_site/lib/requirement-recorder.js +278 -278
- package/_site/lib/runtime-control.js +89 -89
- package/_site/lib/runtime-endpoint.js +160 -160
- package/_site/lib/scanner.js +298 -298
- package/_site/lib/server-app.js +1672 -1664
- package/_site/lib/settings-store.js +153 -153
- package/_site/lib/storage-layout.js +166 -166
- package/_site/lib/structured-logger.js +574 -574
- package/_site/lib/zcode-context-integration.js +60 -60
- package/_site/scripts/codex-notify-fanout.cjs +95 -95
- package/_site/scripts/folder-picker.ps1 +156 -156
- package/_site/scripts/hook-trigger.js +158 -158
- package/_site/scripts/install-module-candidates.js +69 -69
- package/_site/scripts/pack-module-candidates.js +89 -89
- package/_site/scripts/sync-product-content.js +28 -28
- package/_site/scripts/sync-release-version.js +164 -164
- package/_site/scripts/vendor-modules.js +49 -49
- package/_site/scripts/verify-module-runtime.js +50 -50
- package/_site/scripts/verify-product-runtime.js +36 -36
- package/_site/scripts/verify-retrieval-gold.js +83 -83
- package/_site/server.js +15 -15
- package/_site/start.bat +26 -26
- package/_site/stop.bat +11 -11
- package/bin/project-knowledge-integrations.js +254 -254
- package/bin/project-knowledge-kb.js +67 -67
- package/bin/project-knowledge-mcp.js +201 -201
- package/bin/project-knowledge.js +269 -170
- package/claude-prompts.json +21 -21
- package/docs/README.zh-CN.md +207 -205
- package/docs/assets/architecture.svg +181 -181
- package/docs/assets/logo.svg +49 -49
- package/docs/fresh-v5-start.md +44 -44
- package/docs/leader-glm-workbench-playbook.md +122 -122
- package/docs/project-registry-schema.md +33 -33
- package/docs/release-5.0.16-acceptance.md +176 -176
- package/docs/release-5.0.17-acceptance.md +117 -117
- package/docs/release-5.0.19-acceptance.md +39 -39
- package/docs/team-knowledge-mode-a-plan.md +73 -73
- package/docs/testing-strategy.md +33 -33
- package/module-runtime-manifest.json +68 -65
- package/package.json +113 -110
- package/plugins/project-knowledge/.claude-plugin/plugin.json +1 -1
- package/plugins/project-knowledge/.codex-plugin/plugin.json +1 -1
- package/plugins/project-knowledge/.mcp.json +1 -1
- package/templates/change.md +30 -30
- package/templates/project-readme.md +52 -52
- package/ui/index.html +3 -2
- package/ui/version-info.css +44 -0
- package/ui/version-info.js +24 -0
- 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 };
|