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