@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
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sanqianx/ai-coding-knowledge-engine",
|
|
3
|
-
"version": "0.2.7-rc.
|
|
3
|
+
"version": "0.2.7-rc.11",
|
|
4
4
|
"description": "Knowledge engine module for project-knowledge: commit-boundary triggered knowledge analysis/generation (trigger plane) and retrieval for development assistants (retrieval plane).",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"main": "src/server.js",
|
|
@@ -187,10 +187,34 @@ class EngineCoordinator extends EventEmitter {
|
|
|
187
187
|
if (event.schema === 'ai-coding-event/v1' && ['user_prompt', 'assistant_response'].includes(event.eventType)) await this.conversations.appendBridgeEvent(p.projectId, { ...event, journalId: journal.journalId });
|
|
188
188
|
if (event.schema === 'git-commit-boundary/v1' && /^[a-f0-9]{7,64}$/i.test(event.commitSha || '')) {
|
|
189
189
|
if (!fs.existsSync(this.layout.getProjectCommitBoundaryPath(p.projectId, event.commitSha))) this.conversations.writeBoundary(p.projectId, { ...event, journalId: journal.journalId, parentShas: event.parents || [], bridgeCursorAtCommit: event.sequence, journalSequence: event.sequence, operationId: event.operationId || `bridge-${journal.journalId}-${event.sequence}`, committedAt: event.committedAt || event.capturedAt });
|
|
190
|
-
|
|
190
|
+
// The history floor is the tracking baseline: commits at or before it
|
|
191
|
+
// are pre-existing history and are never analysed. The analysed head
|
|
192
|
+
// is not the floor - a captured commit behind the head that was never
|
|
193
|
+
// completed and never attempted was MISSED (its boundary event
|
|
194
|
+
// arrived after the head moved past it), and dropping it would
|
|
195
|
+
// discard durable evidence for good. But auto-analysing it is worse:
|
|
196
|
+
// promotion would advance the head BACKWARDS to the old commit and
|
|
197
|
+
// its replace/delete operations could overwrite the newer knowledge
|
|
198
|
+
// the head already promoted at the same paths. Safety and existing
|
|
199
|
+
// commit order win: the late commit is flagged into a durable
|
|
200
|
+
// registry awaiting CONTROLLED handling - no run, no pointer
|
|
201
|
+
// movement, no fake success, no silent drop. A completed commit is
|
|
202
|
+
// held by the processing ledger; a previously failed or interrupted
|
|
203
|
+
// commit keeps its claim snapshot and is only re-run on an explicit
|
|
204
|
+
// user retry.
|
|
205
|
+
const floor = p.trackingStartCommit || null;
|
|
206
|
+
const head = p.runtime.lastAnalyzedCommit || null;
|
|
207
|
+
const isAncestorOf = async ancestor => (await execGit(p.repoPath, ['merge-base', '--is-ancestor', event.commitSha, ancestor])).ok;
|
|
208
|
+
const preBaseline = Boolean(floor) && (floor === event.commitSha || await isAncestorOf(floor));
|
|
209
|
+
const atHead = Boolean(head) && head === event.commitSha;
|
|
210
|
+
const behindHead = Boolean(head) && !atHead && await isAncestorOf(head);
|
|
191
211
|
const completed = this.reconciler.processingLedger.read(p.projectId, event.commitSha);
|
|
192
|
-
const
|
|
193
|
-
|
|
212
|
+
const attempted = fs.existsSync(this.reconciler.claimStore.filePath(p.projectId, event.commitSha));
|
|
213
|
+
const skip = Boolean(completed) || preBaseline || atHead || (behindHead && attempted);
|
|
214
|
+
if (!skip && this.store.getProject(p.projectId)?.enabled) {
|
|
215
|
+
if (behindHead) await this.flagLateCommit(p, { commitSha: event.commitSha, journalId: journal.journalId, journalSequence: event.sequence, analysedHead: head });
|
|
216
|
+
else this.enqueue({ projectId: p.projectId, commitSha: event.commitSha, trigger: 'git-hook', journalId: journal.journalId, journalSequence: event.sequence });
|
|
217
|
+
}
|
|
194
218
|
}
|
|
195
219
|
}
|
|
196
220
|
} catch (error) { error.journalContext = { projectId: p?.projectId, sequence: event.sequence, source: event.source }; throw error; }
|
|
@@ -200,6 +224,27 @@ class EngineCoordinator extends EventEmitter {
|
|
|
200
224
|
if (through > cursor) this.store.setJournalCursor(journal.journalId, through);
|
|
201
225
|
await this.bridge.ackConsumerCursor('knowledge-engine', through, { journalId: journal.journalId });
|
|
202
226
|
}
|
|
227
|
+
// A late captured commit is durable evidence, but it can never be auto-healed
|
|
228
|
+
// here: promoting it would regress lastAnalyzedCommit and could overwrite
|
|
229
|
+
// newer knowledge at the same paths. It is registered (idempotently) for
|
|
230
|
+
// CONTROLLED handling instead - the registry is part of the project runtime,
|
|
231
|
+
// so it survives restarts and surfaces via /api/snapshot; the event log and
|
|
232
|
+
// the warn diagnostic make the out-of-order state visible without any fake
|
|
233
|
+
// success. Discharging a late commit is an explicit operator decision.
|
|
234
|
+
async flagLateCommit(project, { commitSha, journalId, journalSequence, analysedHead }) {
|
|
235
|
+
const runtime = this.store.readRuntime(project.projectId);
|
|
236
|
+
const known = (runtime.lateCommits || []).some(entry => entry.commitSha === commitSha)
|
|
237
|
+
|| this.store.listRuns(project.projectId).some(run => run.commitSha === commitSha);
|
|
238
|
+
if (known) return;
|
|
239
|
+
await this.store.updateRuntime(project.projectId, draft => {
|
|
240
|
+
draft.lateCommits = draft.lateCommits || [];
|
|
241
|
+
if (!draft.lateCommits.some(entry => entry.commitSha === commitSha)) {
|
|
242
|
+
draft.lateCommits.push({ commitSha, firstSeenAt: new Date().toISOString(), journalId, journalSequence, analysedHeadAtCapture: analysedHead });
|
|
243
|
+
}
|
|
244
|
+
});
|
|
245
|
+
this.store.addEvent({ type: 'knowledge.journal', projectId: project.projectId, commitSha, summary: `捕获到晚到的旧提交 ${commitSha.slice(0, 12)},已登记为需受控处理,未自动分析` });
|
|
246
|
+
await this.diagnostics.warn('reconcile.late_commit_flagged', '晚到的旧提交已登记为待受控处理:不自动分析、不推进分析头、不修改知识树。', { projectId: project.projectId, commitSha, phase: 'consuming', context: { journalId, journalSequence, analysedHead } });
|
|
247
|
+
}
|
|
203
248
|
pump() {
|
|
204
249
|
if (this.closed || !this.executionEnabled) return;
|
|
205
250
|
const queued = this.store.state.runs.filter(r => r.state === 'queued' && (!this.allowedProjects || this.allowedProjects.has(r.projectId))).sort((a, b) => a.sequence - b.sequence);
|
|
@@ -1,140 +1,140 @@
|
|
|
1
|
-
const path = require('path');
|
|
2
|
-
|
|
3
|
-
const PERMISSION_MODES = new Set(['plan', 'default', 'acceptEdits', 'auto', 'bypassPermissions']);
|
|
4
|
-
const PROMPT_TEMPLATE_VERSION = 2;
|
|
5
|
-
|
|
6
|
-
const DEFAULT_COMMIT_PROMPT_TEMPLATE = `你正在根据一个 Git Commit 的冻结证据维护项目知识库。
|
|
7
|
-
|
|
8
|
-
用户需求:
|
|
9
|
-
{{userRequirement}}
|
|
10
|
-
|
|
11
|
-
Commit 信息:
|
|
12
|
-
{{commitMetadata}}
|
|
13
|
-
|
|
14
|
-
Commit 实际变更文件:
|
|
15
|
-
{{actualChanges}}
|
|
16
|
-
|
|
17
|
-
Commit 实际 Patch:
|
|
18
|
-
{{actualPatch}}
|
|
19
|
-
|
|
20
|
-
现有相关知识:
|
|
21
|
-
{{existingKnowledge}}
|
|
22
|
-
|
|
23
|
-
请完成以下判断,并只输出符合 staging manifest 合同的知识变更:
|
|
24
|
-
1. 比较用户需求与实际实现是否一致;没有可靠需求时不得猜测业务目的。
|
|
25
|
-
2. 只记录 Commit、Patch 和现有知识能够证明的事实。
|
|
26
|
-
3. 明确需要新增、更新或删除哪些知识;删除必须有实际变更证据。
|
|
27
|
-
4. 不得修改源码、最终知识目录、其他项目或派生索引。
|
|
28
|
-
5. Patch 使用 chunk evidence 时,必须从只读 manifest 按序读取所需 chunk;不得从源码工作树补读或猜测。`;
|
|
29
|
-
|
|
30
|
-
const READ_TOOLS = ['Read'];
|
|
31
|
-
const WRITE_TOOLS = ['Edit', 'Write', 'MultiEdit'];
|
|
32
|
-
|
|
33
|
-
function normalizePermissionMode(value) {
|
|
34
|
-
return PERMISSION_MODES.has(value) ? value : 'default';
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
function normalizeAutomationConfig(input) {
|
|
38
|
-
const source = input && typeof input === 'object' ? input : {};
|
|
39
|
-
const explicit = typeof source.commitPromptTemplate === 'string' && source.commitPromptTemplate.trim();
|
|
40
|
-
const legacy = typeof source.hookPromptTemplate === 'string' && source.hookPromptTemplate.trim();
|
|
41
|
-
return {
|
|
42
|
-
enabled: source.enabled !== false,
|
|
43
|
-
commitPromptTemplate: explicit || legacy || DEFAULT_COMMIT_PROMPT_TEMPLATE,
|
|
44
|
-
promptTemplateVersion: PROMPT_TEMPLATE_VERSION,
|
|
45
|
-
legacyPromptOverride: !explicit && Boolean(legacy),
|
|
46
|
-
};
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
function normalizeClaudeWorkbenchConfig(input) {
|
|
50
|
-
const source = input && typeof input === 'object' ? input : {};
|
|
51
|
-
return { permissionMode: normalizePermissionMode(source.permissionMode) };
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
function renderTemplate(template, vars) {
|
|
55
|
-
const source = typeof template === 'string' && template.trim() ? template : DEFAULT_COMMIT_PROMPT_TEMPLATE;
|
|
56
|
-
const safeVars = vars && typeof vars === 'object' ? vars : {};
|
|
57
|
-
return source.replace(/\{\{\s*([A-Za-z][A-Za-z0-9_]*)\s*\}\}/g, (match, name) => {
|
|
58
|
-
if (!Object.prototype.hasOwnProperty.call(safeVars, name)) return match;
|
|
59
|
-
const value = safeVars[name];
|
|
60
|
-
return value == null ? '' : String(value);
|
|
61
|
-
});
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
function normalizePathForCompare(value) {
|
|
65
|
-
if (!value || typeof value !== 'string') return '';
|
|
66
|
-
const normalized = path.resolve(value).replace(/[\\/]+$/, '');
|
|
67
|
-
return process.platform === 'win32' ? normalized.toLowerCase() : normalized;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
function pathsReferToSameLocation(leftValue, rightValue) {
|
|
71
|
-
const left = normalizePathForCompare(leftValue);
|
|
72
|
-
const right = normalizePathForCompare(rightValue);
|
|
73
|
-
return Boolean(left && right && left === right);
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
function isInsidePath(root, target) {
|
|
77
|
-
if (!root || !target) return false;
|
|
78
|
-
const rootAbs = path.resolve(root);
|
|
79
|
-
const targetAbs = path.resolve(rootAbs, target);
|
|
80
|
-
const relative = path.relative(rootAbs, targetAbs);
|
|
81
|
-
return relative === '' || Boolean(relative && !relative.startsWith('..') && !path.isAbsolute(relative));
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
function extractToolPaths(toolName, input) {
|
|
85
|
-
if (!input || typeof input !== 'object') return [];
|
|
86
|
-
const candidates = [];
|
|
87
|
-
for (const key of ['file_path', 'path', 'notebook_path']) {
|
|
88
|
-
if (typeof input[key] === 'string') candidates.push(input[key]);
|
|
89
|
-
}
|
|
90
|
-
if (toolName === 'MultiEdit' && typeof input.file_path === 'string') candidates.push(input.file_path);
|
|
91
|
-
return [...new Set(candidates)];
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
function buildAutomationToolPolicy(options = {}) {
|
|
95
|
-
const stagingPath = options.stagingPath || options.kbPath || '';
|
|
96
|
-
const evidenceRoot = options.evidenceRoot || '';
|
|
97
|
-
return {
|
|
98
|
-
kind: 'knowledge-staging',
|
|
99
|
-
stagingPath,
|
|
100
|
-
evidenceRoot,
|
|
101
|
-
readRoots: [evidenceRoot, stagingPath].filter(Boolean),
|
|
102
|
-
writeRoot: stagingPath,
|
|
103
|
-
allowedTools: [...READ_TOOLS, ...WRITE_TOOLS],
|
|
104
|
-
canWriteKb: false,
|
|
105
|
-
canWriteStaging: true,
|
|
106
|
-
allowReadOnlyBash: false,
|
|
107
|
-
};
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
function evaluateAutomationToolUse(policy, toolName, input) {
|
|
111
|
-
if (!policy || policy.kind !== 'knowledge-staging') return { behavior: 'ask', reason: 'no staging policy' };
|
|
112
|
-
if (!policy.allowedTools.includes(toolName)) return { behavior: 'deny', reason: `tool is not allowed: ${toolName}` };
|
|
113
|
-
const paths = extractToolPaths(toolName, input);
|
|
114
|
-
if (!paths.length) return { behavior: 'deny', reason: `${toolName} has no explicit file path` };
|
|
115
|
-
for (const filePath of paths) {
|
|
116
|
-
if (toolName === 'Read') {
|
|
117
|
-
if (!(policy.readRoots || []).some(root => isInsidePath(root, filePath))) {
|
|
118
|
-
return { behavior: 'deny', reason: `path outside read-only evidence/output roots: ${filePath}` };
|
|
119
|
-
}
|
|
120
|
-
} else if (!isInsidePath(policy.writeRoot || policy.stagingPath, filePath)) {
|
|
121
|
-
return { behavior: 'deny', reason: `path outside writable run output: ${filePath}` };
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
return { behavior: 'allow', reason: toolName === 'Read' ? 'path is inside an isolated read root' : 'path is inside the isolated writable output root' };
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
module.exports = {
|
|
128
|
-
PERMISSION_MODES,
|
|
129
|
-
PROMPT_TEMPLATE_VERSION,
|
|
130
|
-
DEFAULT_COMMIT_PROMPT_TEMPLATE,
|
|
131
|
-
normalizePermissionMode,
|
|
132
|
-
normalizeAutomationConfig,
|
|
133
|
-
normalizeClaudeWorkbenchConfig,
|
|
134
|
-
renderTemplate,
|
|
135
|
-
normalizePathForCompare,
|
|
136
|
-
pathsReferToSameLocation,
|
|
137
|
-
isInsidePath,
|
|
138
|
-
buildAutomationToolPolicy,
|
|
139
|
-
evaluateAutomationToolUse,
|
|
140
|
-
};
|
|
1
|
+
const path = require('path');
|
|
2
|
+
|
|
3
|
+
const PERMISSION_MODES = new Set(['plan', 'default', 'acceptEdits', 'auto', 'bypassPermissions']);
|
|
4
|
+
const PROMPT_TEMPLATE_VERSION = 2;
|
|
5
|
+
|
|
6
|
+
const DEFAULT_COMMIT_PROMPT_TEMPLATE = `你正在根据一个 Git Commit 的冻结证据维护项目知识库。
|
|
7
|
+
|
|
8
|
+
用户需求:
|
|
9
|
+
{{userRequirement}}
|
|
10
|
+
|
|
11
|
+
Commit 信息:
|
|
12
|
+
{{commitMetadata}}
|
|
13
|
+
|
|
14
|
+
Commit 实际变更文件:
|
|
15
|
+
{{actualChanges}}
|
|
16
|
+
|
|
17
|
+
Commit 实际 Patch:
|
|
18
|
+
{{actualPatch}}
|
|
19
|
+
|
|
20
|
+
现有相关知识:
|
|
21
|
+
{{existingKnowledge}}
|
|
22
|
+
|
|
23
|
+
请完成以下判断,并只输出符合 staging manifest 合同的知识变更:
|
|
24
|
+
1. 比较用户需求与实际实现是否一致;没有可靠需求时不得猜测业务目的。
|
|
25
|
+
2. 只记录 Commit、Patch 和现有知识能够证明的事实。
|
|
26
|
+
3. 明确需要新增、更新或删除哪些知识;删除必须有实际变更证据。
|
|
27
|
+
4. 不得修改源码、最终知识目录、其他项目或派生索引。
|
|
28
|
+
5. Patch 使用 chunk evidence 时,必须从只读 manifest 按序读取所需 chunk;不得从源码工作树补读或猜测。`;
|
|
29
|
+
|
|
30
|
+
const READ_TOOLS = ['Read'];
|
|
31
|
+
const WRITE_TOOLS = ['Edit', 'Write', 'MultiEdit'];
|
|
32
|
+
|
|
33
|
+
function normalizePermissionMode(value) {
|
|
34
|
+
return PERMISSION_MODES.has(value) ? value : 'default';
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function normalizeAutomationConfig(input) {
|
|
38
|
+
const source = input && typeof input === 'object' ? input : {};
|
|
39
|
+
const explicit = typeof source.commitPromptTemplate === 'string' && source.commitPromptTemplate.trim();
|
|
40
|
+
const legacy = typeof source.hookPromptTemplate === 'string' && source.hookPromptTemplate.trim();
|
|
41
|
+
return {
|
|
42
|
+
enabled: source.enabled !== false,
|
|
43
|
+
commitPromptTemplate: explicit || legacy || DEFAULT_COMMIT_PROMPT_TEMPLATE,
|
|
44
|
+
promptTemplateVersion: PROMPT_TEMPLATE_VERSION,
|
|
45
|
+
legacyPromptOverride: !explicit && Boolean(legacy),
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function normalizeClaudeWorkbenchConfig(input) {
|
|
50
|
+
const source = input && typeof input === 'object' ? input : {};
|
|
51
|
+
return { permissionMode: normalizePermissionMode(source.permissionMode) };
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function renderTemplate(template, vars) {
|
|
55
|
+
const source = typeof template === 'string' && template.trim() ? template : DEFAULT_COMMIT_PROMPT_TEMPLATE;
|
|
56
|
+
const safeVars = vars && typeof vars === 'object' ? vars : {};
|
|
57
|
+
return source.replace(/\{\{\s*([A-Za-z][A-Za-z0-9_]*)\s*\}\}/g, (match, name) => {
|
|
58
|
+
if (!Object.prototype.hasOwnProperty.call(safeVars, name)) return match;
|
|
59
|
+
const value = safeVars[name];
|
|
60
|
+
return value == null ? '' : String(value);
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function normalizePathForCompare(value) {
|
|
65
|
+
if (!value || typeof value !== 'string') return '';
|
|
66
|
+
const normalized = path.resolve(value).replace(/[\\/]+$/, '');
|
|
67
|
+
return process.platform === 'win32' ? normalized.toLowerCase() : normalized;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function pathsReferToSameLocation(leftValue, rightValue) {
|
|
71
|
+
const left = normalizePathForCompare(leftValue);
|
|
72
|
+
const right = normalizePathForCompare(rightValue);
|
|
73
|
+
return Boolean(left && right && left === right);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function isInsidePath(root, target) {
|
|
77
|
+
if (!root || !target) return false;
|
|
78
|
+
const rootAbs = path.resolve(root);
|
|
79
|
+
const targetAbs = path.resolve(rootAbs, target);
|
|
80
|
+
const relative = path.relative(rootAbs, targetAbs);
|
|
81
|
+
return relative === '' || Boolean(relative && !relative.startsWith('..') && !path.isAbsolute(relative));
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function extractToolPaths(toolName, input) {
|
|
85
|
+
if (!input || typeof input !== 'object') return [];
|
|
86
|
+
const candidates = [];
|
|
87
|
+
for (const key of ['file_path', 'path', 'notebook_path']) {
|
|
88
|
+
if (typeof input[key] === 'string') candidates.push(input[key]);
|
|
89
|
+
}
|
|
90
|
+
if (toolName === 'MultiEdit' && typeof input.file_path === 'string') candidates.push(input.file_path);
|
|
91
|
+
return [...new Set(candidates)];
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
function buildAutomationToolPolicy(options = {}) {
|
|
95
|
+
const stagingPath = options.stagingPath || options.kbPath || '';
|
|
96
|
+
const evidenceRoot = options.evidenceRoot || '';
|
|
97
|
+
return {
|
|
98
|
+
kind: 'knowledge-staging',
|
|
99
|
+
stagingPath,
|
|
100
|
+
evidenceRoot,
|
|
101
|
+
readRoots: [evidenceRoot, stagingPath].filter(Boolean),
|
|
102
|
+
writeRoot: stagingPath,
|
|
103
|
+
allowedTools: [...READ_TOOLS, ...WRITE_TOOLS],
|
|
104
|
+
canWriteKb: false,
|
|
105
|
+
canWriteStaging: true,
|
|
106
|
+
allowReadOnlyBash: false,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
function evaluateAutomationToolUse(policy, toolName, input) {
|
|
111
|
+
if (!policy || policy.kind !== 'knowledge-staging') return { behavior: 'ask', reason: 'no staging policy' };
|
|
112
|
+
if (!policy.allowedTools.includes(toolName)) return { behavior: 'deny', reason: `tool is not allowed: ${toolName}` };
|
|
113
|
+
const paths = extractToolPaths(toolName, input);
|
|
114
|
+
if (!paths.length) return { behavior: 'deny', reason: `${toolName} has no explicit file path` };
|
|
115
|
+
for (const filePath of paths) {
|
|
116
|
+
if (toolName === 'Read') {
|
|
117
|
+
if (!(policy.readRoots || []).some(root => isInsidePath(root, filePath))) {
|
|
118
|
+
return { behavior: 'deny', reason: `path outside read-only evidence/output roots: ${filePath}` };
|
|
119
|
+
}
|
|
120
|
+
} else if (!isInsidePath(policy.writeRoot || policy.stagingPath, filePath)) {
|
|
121
|
+
return { behavior: 'deny', reason: `path outside writable run output: ${filePath}` };
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return { behavior: 'allow', reason: toolName === 'Read' ? 'path is inside an isolated read root' : 'path is inside the isolated writable output root' };
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
module.exports = {
|
|
128
|
+
PERMISSION_MODES,
|
|
129
|
+
PROMPT_TEMPLATE_VERSION,
|
|
130
|
+
DEFAULT_COMMIT_PROMPT_TEMPLATE,
|
|
131
|
+
normalizePermissionMode,
|
|
132
|
+
normalizeAutomationConfig,
|
|
133
|
+
normalizeClaudeWorkbenchConfig,
|
|
134
|
+
renderTemplate,
|
|
135
|
+
normalizePathForCompare,
|
|
136
|
+
pathsReferToSameLocation,
|
|
137
|
+
isInsidePath,
|
|
138
|
+
buildAutomationToolPolicy,
|
|
139
|
+
evaluateAutomationToolUse,
|
|
140
|
+
};
|