@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,408 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
// P-WB-QA-INTEGRATION-5025 fixture — the canonical, clean-checkout isolation
|
|
3
|
+
// fixture for the Workbench QA suite, carried forward from the accepted R5
|
|
4
|
+
// isolation contract (helpers/parallel-workbench-drafts-r5-fixture.js, frozen)
|
|
5
|
+
// with the portability and identity-chain upgrades the integration dispatch
|
|
6
|
+
// requires. The frozen originals stay untouched.
|
|
7
|
+
//
|
|
8
|
+
// Canonical contract:
|
|
9
|
+
// * every directory is created below PK_TEST_TEMP_ROOT when set, otherwise
|
|
10
|
+
// the shared temp root next to the repository when it exists, otherwise
|
|
11
|
+
// TEMP/TMP/TMPDIR, otherwise the OS temp dir — never inside the repository
|
|
12
|
+
// and never a hardcoded drive or user directory;
|
|
13
|
+
// * the Workbench data directory, the knowledge data directory, the Bridge
|
|
14
|
+
// home, HOME/USERPROFILE, CLAUDE_CONFIG_DIR, CODEX_HOME, APPDATA,
|
|
15
|
+
// LOCALAPPDATA and TEMP are ALL isolated below the per-run layout root
|
|
16
|
+
// (the R4 boundary gaps stay closed); each run owns its own root;
|
|
17
|
+
// * an empty default-shaped Chrome "User Data" scaffold is pre-created under
|
|
18
|
+
// the isolated home so Chrome >= 136 accepts the separate, real
|
|
19
|
+
// browser-profile directory as non-default (bisect-proven R5 fix);
|
|
20
|
+
// * the live product ports are refused; ambient module addresses and every
|
|
21
|
+
// ambient Anthropic credential variable are dropped;
|
|
22
|
+
// * NO real-profile machinery: no read-only facade, no
|
|
23
|
+
// PK_WB_REAL_PROFILE_DIR, no digest of real credential files. Pure-UI
|
|
24
|
+
// tools (the drafts probe) must never carry a real profile source.
|
|
25
|
+
// realWorkbenchProfileDir() survives only as a pure path string for guards;
|
|
26
|
+
// * module identity is an INDEPENDENT chain: the expected version defaults
|
|
27
|
+
// to the root package's exact dependency constraint
|
|
28
|
+
// ("claude-ai-workbench": "npm:@sanqianx/claude-ai-workbench@<version>"),
|
|
29
|
+
// never to the module's own self-description; a candidate release can pass
|
|
30
|
+
// an explicit expectedVersion/expectedPin instead.
|
|
31
|
+
const fs = require('node:fs');
|
|
32
|
+
const os = require('node:os');
|
|
33
|
+
const path = require('node:path');
|
|
34
|
+
const net = require('node:net');
|
|
35
|
+
const crypto = require('node:crypto');
|
|
36
|
+
const sourceMap = require('./parallel-workbench-source-map');
|
|
37
|
+
|
|
38
|
+
const REPO_ROOT = path.resolve(__dirname, '..', '..', '..');
|
|
39
|
+
|
|
40
|
+
// The developer's live surfaces. A test may never bind or talk to them.
|
|
41
|
+
const FORBIDDEN_PORTS = new Set([5757, 5760, 5789, 5790, 8787, 8790]);
|
|
42
|
+
|
|
43
|
+
// Ambient module addresses that would point a test at a live instance.
|
|
44
|
+
const AMBIENT_MODULE_URLS = [
|
|
45
|
+
'KB_KNOWLEDGE_ENGINE_URL',
|
|
46
|
+
'KB_VECTORHUB_URL',
|
|
47
|
+
'KB_TERMINAL_URL',
|
|
48
|
+
'KB_EVENTBRIDGE_URL',
|
|
49
|
+
'KB_EVENT_BRIDGE_URL',
|
|
50
|
+
'KB_WORKBENCH_RUNTIME_TOKEN',
|
|
51
|
+
'KB_MODULES_AUTOSTART',
|
|
52
|
+
];
|
|
53
|
+
|
|
54
|
+
// Ambient Anthropic credentials: a test must only ever use the credential it
|
|
55
|
+
// injects itself, never one that happens to sit in the shell.
|
|
56
|
+
const AMBIENT_MODEL_ENV = [
|
|
57
|
+
'ANTHROPIC_API_KEY',
|
|
58
|
+
'ANTHROPIC_AUTH_TOKEN',
|
|
59
|
+
'ANTHROPIC_BASE_URL',
|
|
60
|
+
'ANTHROPIC_MODEL',
|
|
61
|
+
'ANTHROPIC_DEFAULT_THINKING_MODEL',
|
|
62
|
+
'ANTHROPIC_DEFAULT_HAIKU_MODEL',
|
|
63
|
+
'ANTHROPIC_DEFAULT_SONNET_MODEL',
|
|
64
|
+
'ANTHROPIC_DEFAULT_OPUS_MODEL',
|
|
65
|
+
'API_TIMEOUT_MS',
|
|
66
|
+
'CLAUDE_CODE_OAUTH_TOKEN',
|
|
67
|
+
'CLAUDE_CODE_USE_BEDROCK',
|
|
68
|
+
'CLAUDE_CODE_USE_VERTEX',
|
|
69
|
+
'CLAUDE_CODE_USE_FOUNDRY',
|
|
70
|
+
];
|
|
71
|
+
|
|
72
|
+
// Captured before any isolation changes HOME.
|
|
73
|
+
const REAL_HOME = os.homedir();
|
|
74
|
+
const REAL_USERPROFILE = process.env.USERPROFILE || REAL_HOME;
|
|
75
|
+
|
|
76
|
+
// Captured at MODULE LOAD — this fixture is required by every probe BEFORE
|
|
77
|
+
// its launcher boot applies isolation, so the load-time environment is still
|
|
78
|
+
// the real one (or the safe runner's captured overrides). An AppData install
|
|
79
|
+
// resolved HERE keeps its identity no matter what the environment says later;
|
|
80
|
+
// an isolated APPDATA can no longer mislabel it as a repository pin.
|
|
81
|
+
const INSTALLED_PRODUCT_PACKAGE_AT_LOAD = sourceMap.resolveInstalledProductPackage();
|
|
82
|
+
|
|
83
|
+
// The installed-product package root, safe to call at ANY time: the explicit
|
|
84
|
+
// capture carried through by the launcher boot wins, then the load-time
|
|
85
|
+
// capture, and only a process that never isolated falls back to a live read.
|
|
86
|
+
function installedProductPackage() {
|
|
87
|
+
const override = String(process.env.PK_WB_INSTALLED_PRODUCT_MODULE || '').trim();
|
|
88
|
+
if (override) return fs.existsSync(override) ? override : null;
|
|
89
|
+
return INSTALLED_PRODUCT_PACKAGE_AT_LOAD;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// The absolute-path members of the isolation whitelist. KB_MODULES_AUTOSTART
|
|
93
|
+
// is a flag ('0'), HOMEDRIVE/HOMEPATH are drive-relative companions; none of
|
|
94
|
+
// them is a directory of its own.
|
|
95
|
+
const ISOLATION_PATH_KEYS = [
|
|
96
|
+
'HOME',
|
|
97
|
+
'USERPROFILE',
|
|
98
|
+
'CODEX_HOME',
|
|
99
|
+
'CLAUDE_CONFIG_DIR',
|
|
100
|
+
'APPDATA',
|
|
101
|
+
'LOCALAPPDATA',
|
|
102
|
+
'TEMP',
|
|
103
|
+
'TMP',
|
|
104
|
+
'TMPDIR',
|
|
105
|
+
'PSModuleAnalysisCachePath',
|
|
106
|
+
'KB_DATA_DIR',
|
|
107
|
+
'KB_KNOWLEDGE_DATA_DIR',
|
|
108
|
+
'AI_CODING_EVENT_BRIDGE_HOME',
|
|
109
|
+
'AGENT_TERMINAL_DATA_DIR',
|
|
110
|
+
'CLAUDE_AI_WORKBENCH_DATA_DIR',
|
|
111
|
+
];
|
|
112
|
+
|
|
113
|
+
function isInside(candidate, parent) {
|
|
114
|
+
const relative = path.relative(parent, candidate);
|
|
115
|
+
return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function resolveTempRoot() {
|
|
119
|
+
const sharedRoot = path.join(path.dirname(REPO_ROOT), '.project-knowledge-test-temp');
|
|
120
|
+
const candidates = [
|
|
121
|
+
process.env.PK_TEST_TEMP_ROOT,
|
|
122
|
+
fs.existsSync(sharedRoot) ? sharedRoot : null,
|
|
123
|
+
process.env.TEMP,
|
|
124
|
+
process.env.TMP,
|
|
125
|
+
process.env.TMPDIR,
|
|
126
|
+
];
|
|
127
|
+
const chosen = candidates.find(value => value && String(value).trim());
|
|
128
|
+
const root = path.resolve(chosen ? String(chosen).trim() : os.tmpdir());
|
|
129
|
+
if (isInside(root, REPO_ROOT)) throw new Error(`refusing to use a temp root inside the repository: ${root}`);
|
|
130
|
+
return root;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
function ensureTempRoot() {
|
|
134
|
+
const root = resolveTempRoot();
|
|
135
|
+
fs.mkdirSync(root, { recursive: true });
|
|
136
|
+
return root;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
function makeTempDir(prefix = 'parallel-workbench') {
|
|
140
|
+
const root = ensureTempRoot();
|
|
141
|
+
const dir = fs.mkdtempSync(path.join(root, `${prefix}-`));
|
|
142
|
+
if (isInside(dir, REPO_ROOT)) throw new Error(`refusing to create a fixture inside the repository: ${dir}`);
|
|
143
|
+
return dir;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
function removeTree(dir) {
|
|
147
|
+
if (!dir) return;
|
|
148
|
+
fs.rmSync(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 });
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
async function freePort() {
|
|
152
|
+
return new Promise((resolve, reject) => {
|
|
153
|
+
const server = net.createServer();
|
|
154
|
+
server.unref();
|
|
155
|
+
server.on('error', reject);
|
|
156
|
+
server.listen(0, '127.0.0.1', () => {
|
|
157
|
+
const { port } = server.address();
|
|
158
|
+
server.close(() => {
|
|
159
|
+
if (FORBIDDEN_PORTS.has(Number(port))) { reject(new Error(`refusing to use the live port ${port}`)); return; }
|
|
160
|
+
resolve(Number(port));
|
|
161
|
+
});
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
function assertAllowedEndpoint(url, what = 'endpoint') {
|
|
167
|
+
const parsed = new URL(String(url));
|
|
168
|
+
const port = parsed.port ? Number(parsed.port) : (parsed.protocol === 'https:' ? 443 : 80);
|
|
169
|
+
if (FORBIDDEN_PORTS.has(port)) throw new Error(`refusing to contact the live ${what} ${url}`);
|
|
170
|
+
return url;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
async function waitForHttp(url, timeoutMs = 30000) {
|
|
174
|
+
assertAllowedEndpoint(url, 'service');
|
|
175
|
+
const until = Date.now() + timeoutMs;
|
|
176
|
+
let lastError = null;
|
|
177
|
+
while (Date.now() < until) {
|
|
178
|
+
try {
|
|
179
|
+
const response = await fetch(url, { signal: AbortSignal.timeout(2000) });
|
|
180
|
+
if (response.ok) return true;
|
|
181
|
+
lastError = new Error(`HTTP ${response.status}`);
|
|
182
|
+
} catch (error) { lastError = error; }
|
|
183
|
+
await new Promise(resolve => setTimeout(resolve, 100));
|
|
184
|
+
}
|
|
185
|
+
throw new Error(`Timed out waiting for ${url}: ${lastError && lastError.message}`);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
// The explicit SYSTEM whitelist: the ONLY ambient variables a process of this
|
|
189
|
+
// suite may inherit. Matching is case-insensitive because Windows treats
|
|
190
|
+
// Path/PATH and SystemRoot/SYSTEMROOT as the same variable. Everything else —
|
|
191
|
+
// provider credentials (OPENAI/MINIMAX/GOOGLE/AWS/ANTHROPIC…), NODE_OPTIONS,
|
|
192
|
+
// proxy URLs, CODEX/Claude CLI injection vars — is dropped BY CONSTRUCTION:
|
|
193
|
+
// the child env is rebuilt from this list, never derived by blacklisting.
|
|
194
|
+
const SYSTEM_ENV_WHITELIST = [
|
|
195
|
+
'SystemRoot', 'SystemDrive', 'windir', 'ComSpec', 'PATHEXT',
|
|
196
|
+
'PROCESSOR_ARCHITECTURE', 'PROCESSOR_ARCHITECTURE_W6432', 'PROCESSOR_IDENTIFIER',
|
|
197
|
+
'PROCESSOR_LEVEL', 'PROCESSOR_REVISION', 'NUMBER_OF_PROCESSORS',
|
|
198
|
+
'PATH', 'TEMP', 'TMP', 'TMPDIR',
|
|
199
|
+
];
|
|
200
|
+
|
|
201
|
+
function systemBaseEnv(source = process.env) {
|
|
202
|
+
const allow = new Set(SYSTEM_ENV_WHITELIST.map(name => name.toLowerCase()));
|
|
203
|
+
const base = {};
|
|
204
|
+
for (const [key, value] of Object.entries(source)) {
|
|
205
|
+
if (value !== undefined && allow.has(key.toLowerCase())) base[key] = value;
|
|
206
|
+
}
|
|
207
|
+
return base;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
// Child base env: rebuild from the system whitelist, then layer the caller's
|
|
211
|
+
// explicit values (isolation map + lane endpoints/fake markers). Lane-specified
|
|
212
|
+
// keys win; ambient anything-else never enters. The old ambient delete lists
|
|
213
|
+
// stay exported for guard assertions only — scrubbing no longer depends on them.
|
|
214
|
+
function sanitizedEnv(extra = {}) {
|
|
215
|
+
return { ...systemBaseEnv(), ...extra };
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
function spawnNode(args, env = {}) {
|
|
219
|
+
const { spawn } = require('node:child_process');
|
|
220
|
+
const child = spawn(process.execPath, args, {
|
|
221
|
+
env: sanitizedEnv(env),
|
|
222
|
+
windowsHide: true,
|
|
223
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
224
|
+
});
|
|
225
|
+
const output = { stdout: '', stderr: '' };
|
|
226
|
+
child.stdout.on('data', chunk => { output.stdout += chunk; });
|
|
227
|
+
child.stderr.on('data', chunk => { output.stderr += chunk; });
|
|
228
|
+
const exited = new Promise(resolve => child.once('close', code => resolve({ code, ...output })));
|
|
229
|
+
return { child, exited, output };
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
// --- the isolation directories of one run -----------------------------------
|
|
233
|
+
function createIsolationLayout(prefix = 'parallel-workbench') {
|
|
234
|
+
const root = makeTempDir(prefix);
|
|
235
|
+
const layout = {
|
|
236
|
+
root,
|
|
237
|
+
dataDir: path.join(root, 'workbench-data'),
|
|
238
|
+
knowledgeDataDir: path.join(root, 'knowledge-data'),
|
|
239
|
+
bridgeHome: path.join(root, 'bridge-home'),
|
|
240
|
+
home: path.join(root, 'home'),
|
|
241
|
+
claudeConfigDir: path.join(root, 'claude-config'),
|
|
242
|
+
codexHome: path.join(root, 'codex-home'),
|
|
243
|
+
appData: path.join(root, 'appdata'),
|
|
244
|
+
localAppData: path.join(root, 'localappdata'),
|
|
245
|
+
workspace: path.join(root, 'workspace'),
|
|
246
|
+
temp: path.join(root, 'temp'),
|
|
247
|
+
};
|
|
248
|
+
for (const dir of Object.values(layout)) {
|
|
249
|
+
if (typeof dir === 'string') fs.mkdirSync(dir, { recursive: true });
|
|
250
|
+
}
|
|
251
|
+
fs.writeFileSync(path.join(layout.workspace, 'README.md'), '# Workbench fixture workspace\n', 'utf8');
|
|
252
|
+
// Chrome >= 136 refuses --remote-debugging-port unless it can resolve its
|
|
253
|
+
// DEFAULT user data dir and confirm the passed --user-data-dir differs.
|
|
254
|
+
// The default is derived from %USERPROFILE% (bisect evidence: overriding
|
|
255
|
+
// USERPROFILE alone trips the gate; APPDATA/LOCALAPPDATA/TEMP/HOME do not).
|
|
256
|
+
// An empty default-shaped scaffold under the isolated home lets the
|
|
257
|
+
// resolution succeed, so the real, separate browser-profile directory
|
|
258
|
+
// below this layout is accepted as non-default. The scaffold stays inside
|
|
259
|
+
// the isolated root — nothing of the real machine is touched.
|
|
260
|
+
fs.mkdirSync(path.join(layout.home, 'AppData', 'Local', 'Google', 'Chrome', 'User Data'), { recursive: true });
|
|
261
|
+
fs.mkdirSync(path.join(layout.home, 'AppData', 'Roaming'), { recursive: true });
|
|
262
|
+
return layout;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
// The complete isolation whitelist: every value an own child (probe, host,
|
|
266
|
+
// browser, census powershell) may resolve through its environment points into
|
|
267
|
+
// this layout. Building the map MATERIALIZES the directories it names — the
|
|
268
|
+
// env-pointed TEMP dirs and the PSModuleAnalysisCachePath parent must actually
|
|
269
|
+
// exist on disk, not merely as strings (a powershell census child that resolves
|
|
270
|
+
// a missing cache dir would fall back to the real home).
|
|
271
|
+
function isolationEnvMap(layout) {
|
|
272
|
+
const parsed = path.parse(layout.home);
|
|
273
|
+
const psModuleCache = path.join(layout.root, 'ps-module-analysis-cache', 'AnalysisCache');
|
|
274
|
+
fs.mkdirSync(layout.temp, { recursive: true });
|
|
275
|
+
fs.mkdirSync(path.dirname(psModuleCache), { recursive: true });
|
|
276
|
+
if (!fs.statSync(layout.temp).isDirectory()) throw new Error(`isolation TEMP does not exist on disk: ${layout.temp}`);
|
|
277
|
+
if (!fs.statSync(path.dirname(psModuleCache)).isDirectory()) throw new Error(`PSModuleAnalysisCachePath parent does not exist on disk: ${psModuleCache}`);
|
|
278
|
+
return {
|
|
279
|
+
HOME: layout.home,
|
|
280
|
+
USERPROFILE: layout.home,
|
|
281
|
+
HOMEDRIVE: parsed.root,
|
|
282
|
+
HOMEPATH: parsed.root === path.sep ? layout.home.slice(1) : layout.home.slice(parsed.root.length),
|
|
283
|
+
CODEX_HOME: layout.codexHome,
|
|
284
|
+
CLAUDE_CONFIG_DIR: layout.claudeConfigDir,
|
|
285
|
+
APPDATA: layout.appData,
|
|
286
|
+
LOCALAPPDATA: layout.localAppData,
|
|
287
|
+
TEMP: layout.temp,
|
|
288
|
+
TMP: layout.temp,
|
|
289
|
+
TMPDIR: layout.temp,
|
|
290
|
+
PSModuleAnalysisCachePath: psModuleCache,
|
|
291
|
+
KB_DATA_DIR: layout.knowledgeDataDir,
|
|
292
|
+
KB_KNOWLEDGE_DATA_DIR: layout.knowledgeDataDir,
|
|
293
|
+
AI_CODING_EVENT_BRIDGE_HOME: layout.bridgeHome,
|
|
294
|
+
AGENT_TERMINAL_DATA_DIR: layout.dataDir,
|
|
295
|
+
CLAUDE_AI_WORKBENCH_DATA_DIR: layout.dataDir,
|
|
296
|
+
KB_MODULES_AUTOSTART: '0',
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
// The environment a host child may inherit. No real profile directory is
|
|
301
|
+
// passed: this canonical fixture has no real profile source at all.
|
|
302
|
+
function hostEnv(layout, extra = {}) {
|
|
303
|
+
return sanitizedEnv({ ...isolationEnvMap(layout), ...extra });
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
// --- the real profile location (path string ONLY) ----------------------------
|
|
307
|
+
// Where the product keeps its real profiles, resolved from the real home
|
|
308
|
+
// captured at module load. Guards use this string exclusively to prove that
|
|
309
|
+
// no isolated env value points there; this helper never touches the
|
|
310
|
+
// filesystem.
|
|
311
|
+
function realWorkbenchProfileDir() {
|
|
312
|
+
return path.join(REAL_HOME, '.project-knowledge-v5', 'workbench');
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
// The module that is hosted: the copy the installed product ships, unless
|
|
316
|
+
// the caller pins another one explicitly. Callers must resolve this BEFORE
|
|
317
|
+
// applying isolationEnvMap to their own process.env — the discovery reads
|
|
318
|
+
// the real APPDATA.
|
|
319
|
+
function resolveHostModuleRoot(options = {}) {
|
|
320
|
+
const override = String(options.moduleRoot || process.env.PK_WB_MODULE_ROOT || '').trim();
|
|
321
|
+
if (override) return path.resolve(override);
|
|
322
|
+
const appData = String(process.env.APPDATA || '').trim();
|
|
323
|
+
if (appData) {
|
|
324
|
+
const candidate = path.join(appData, 'npm', 'node_modules', '@sanqianx', 'project-knowledge', 'node_modules', 'claude-ai-workbench');
|
|
325
|
+
if (fs.existsSync(path.join(candidate, 'packages', 'server', 'package.json'))) return candidate;
|
|
326
|
+
}
|
|
327
|
+
const repoPin = path.join(REPO_ROOT, 'node_modules', 'claude-ai-workbench');
|
|
328
|
+
if (fs.existsSync(path.join(repoPin, 'packages', 'server', 'package.json'))) return repoPin;
|
|
329
|
+
return null;
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
// --- the independent module identity chain -----------------------------------
|
|
333
|
+
//
|
|
334
|
+
// The expected Workbench version is NOT read from the hosted module and
|
|
335
|
+
// compared with itself: it defaults to the root product package's exact
|
|
336
|
+
// dependency constraint, which is a separate, independently written pin. A
|
|
337
|
+
// candidate release overrides it with an explicit expectedVersion (and
|
|
338
|
+
// optionally an expectedPin of exact file digests).
|
|
339
|
+
function sha256File(file) {
|
|
340
|
+
try { return crypto.createHash('sha256').update(fs.readFileSync(file)).digest('hex'); } catch { return null; }
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
function rootWorkbenchDependency() {
|
|
344
|
+
const rootPackage = JSON.parse(fs.readFileSync(path.join(REPO_ROOT, 'package.json'), 'utf8'));
|
|
345
|
+
const raw = String((rootPackage.dependencies || {})['claude-ai-workbench'] || '');
|
|
346
|
+
const version = raw.includes('@') ? raw.slice(raw.lastIndexOf('@') + 1) : raw;
|
|
347
|
+
return { raw, version };
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
function verifyModuleIdentity(options = {}) {
|
|
351
|
+
const moduleRoot = options.moduleRoot;
|
|
352
|
+
if (!moduleRoot) throw new Error('verifyModuleIdentity requires a moduleRoot');
|
|
353
|
+
const dependency = rootWorkbenchDependency();
|
|
354
|
+
const expectedVersion = options.expectedVersion || dependency.version;
|
|
355
|
+
const identity = sourceMap.packageIdentity(moduleRoot) || {};
|
|
356
|
+
const pin = options.expectedPin || null;
|
|
357
|
+
const pinFiles = {};
|
|
358
|
+
let pinOk = true;
|
|
359
|
+
for (const rel of Object.keys(pin || {})) {
|
|
360
|
+
const actual = sha256File(path.join(moduleRoot, rel));
|
|
361
|
+
pinFiles[rel] = { expected: pin[rel], actual, match: actual === pin[rel] };
|
|
362
|
+
if (actual !== pin[rel]) pinOk = false;
|
|
363
|
+
}
|
|
364
|
+
const versionMatches = identity.version === expectedVersion;
|
|
365
|
+
return {
|
|
366
|
+
moduleRoot,
|
|
367
|
+
expected: {
|
|
368
|
+
source: options.expectedVersion ? 'explicit (candidate release)' : 'root-package-dependency',
|
|
369
|
+
dependencyRaw: dependency.raw || null,
|
|
370
|
+
version: expectedVersion,
|
|
371
|
+
},
|
|
372
|
+
actual: { name: identity.name || null, version: identity.version || null },
|
|
373
|
+
versionMatches,
|
|
374
|
+
pin: pin ? { checked: Object.keys(pin), ok: pinOk, files: pinFiles } : null,
|
|
375
|
+
ok: versionMatches && pinOk,
|
|
376
|
+
};
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
module.exports = {
|
|
380
|
+
REPO_ROOT,
|
|
381
|
+
FORBIDDEN_PORTS,
|
|
382
|
+
AMBIENT_MODULE_URLS,
|
|
383
|
+
AMBIENT_MODEL_ENV,
|
|
384
|
+
REAL_HOME,
|
|
385
|
+
REAL_USERPROFILE,
|
|
386
|
+
INSTALLED_PRODUCT_PACKAGE_AT_LOAD,
|
|
387
|
+
installedProductPackage,
|
|
388
|
+
ISOLATION_PATH_KEYS,
|
|
389
|
+
SYSTEM_ENV_WHITELIST,
|
|
390
|
+
systemBaseEnv,
|
|
391
|
+
resolveTempRoot,
|
|
392
|
+
ensureTempRoot,
|
|
393
|
+
makeTempDir,
|
|
394
|
+
removeTree,
|
|
395
|
+
freePort,
|
|
396
|
+
assertAllowedEndpoint,
|
|
397
|
+
waitForHttp,
|
|
398
|
+
sanitizedEnv,
|
|
399
|
+
spawnNode,
|
|
400
|
+
createIsolationLayout,
|
|
401
|
+
isolationEnvMap,
|
|
402
|
+
hostEnv,
|
|
403
|
+
realWorkbenchProfileDir,
|
|
404
|
+
resolveHostModuleRoot,
|
|
405
|
+
sha256File,
|
|
406
|
+
rootWorkbenchDependency,
|
|
407
|
+
verifyModuleIdentity,
|
|
408
|
+
};
|