@sanqianx/project-knowledge 4.6.1 → 4.7.0
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/.claude-plugin/marketplace.json +1 -1
- package/CHANGELOG.md +19 -0
- package/_site/_test/bridge-adapter-test.js +1 -1
- package/_site/_test/bridge-consumer-service-test.js +1 -1
- package/_site/_test/client-capture-restart-e2e-test.js +4 -4
- package/_site/_test/commit-boundary-freeze-test.js +1 -1
- package/_site/_test/cross-repo-isolation-e2e-test.js +2 -2
- package/_site/_test/integration-capture-setup-test.js +1 -1
- package/_site/_test/packaged-ui-smoke-test.js +8 -1
- package/_site/lib/bridge-adapter.js +4 -1
- package/_site/lib/integration-installer.js +1 -1
- package/_site/lib/requirement-recorder.js +1 -1
- package/_site/scripts/hook-trigger.js +1 -1
- package/package.json +4 -5
- 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/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,24 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [4.7.0] - 2026-09-21
|
|
4
|
+
|
|
5
|
+
- All four embedded module dependencies (`claude-ai-workbench`,
|
|
6
|
+
`@sanqianx/vector-hub`, `@sanqianx/ai-coding-event-bridge-console`, plus the
|
|
7
|
+
`@sanqianx/ai-coding-event-bridge` consumer inside the shell) are now pinned
|
|
8
|
+
to `latest`, so a fresh `npm install` pulls whatever the upstream modules
|
|
9
|
+
ship instead of lagging behind the project's npm releases. The legacy
|
|
10
|
+
`@sanqianx/ai-coding-event-bridge` package — which used to be the engine
|
|
11
|
+
library — is deprecated on npm and removed from this project's dependencies;
|
|
12
|
+
its capture engine now ships inside `@sanqianx/ai-coding-event-bridge-console`
|
|
13
|
+
at `src/bridge`, and the four production call sites (hook capture, requirement
|
|
14
|
+
recorder, integration installer, bridge adapter) plus six tests were rewritten
|
|
15
|
+
to import from there. The legacy package's every version carries a deprecation
|
|
16
|
+
message pointing to the new entry.
|
|
17
|
+
- The package is published as `@sanqianx/project-knowledge` (moved from the
|
|
18
|
+
unscoped `project-knowledge`); the unscoped name still resolves to the old
|
|
19
|
+
versions for users who haven't migrated, but new installs land on the
|
|
20
|
+
scoped package.
|
|
21
|
+
|
|
3
22
|
## [4.6.0] - 2026-09-21
|
|
4
23
|
|
|
5
24
|
- The three embedded module runtimes now ship as real npm dependencies instead
|
|
@@ -3,7 +3,7 @@ const fs = require('fs');
|
|
|
3
3
|
const os = require('os');
|
|
4
4
|
const path = require('path');
|
|
5
5
|
const { BridgeAdapter } = require('../lib/bridge-adapter');
|
|
6
|
-
const bridgeModule = require('@sanqianx/ai-coding-event-bridge');
|
|
6
|
+
const bridgeModule = require('@sanqianx/ai-coding-event-bridge-console/src/bridge');
|
|
7
7
|
|
|
8
8
|
(async () => {
|
|
9
9
|
const dataDir = fs.mkdtempSync(path.join(os.tmpdir(), 'pk-bridge-adapter-'));
|
|
@@ -15,7 +15,7 @@ const { ProjectStore } = require('../lib/project-store');
|
|
|
15
15
|
const { ConversationStore } = require('../lib/conversation-store');
|
|
16
16
|
const { BridgeAdapter } = require('../lib/bridge-adapter');
|
|
17
17
|
const { BridgeConsumerService } = require('../lib/bridge-consumer-service');
|
|
18
|
-
const bridgeModule = require('@sanqianx/ai-coding-event-bridge');
|
|
18
|
+
const bridgeModule = require('@sanqianx/ai-coding-event-bridge-console/src/bridge');
|
|
19
19
|
|
|
20
20
|
const temp = fs.mkdtempSync(path.join(os.tmpdir(), `kb-bridge-consumer-${process.pid}-`));
|
|
21
21
|
const layout = new StorageLayout({ dataDir: path.join(temp, 'data') });
|
|
@@ -17,10 +17,10 @@ const { ConversationStore } = require('../lib/conversation-store');
|
|
|
17
17
|
const { BridgeAdapter } = require('../lib/bridge-adapter');
|
|
18
18
|
const { BridgeConsumerService } = require('../lib/bridge-consumer-service');
|
|
19
19
|
const { readDevelopmentEvents } = require('../lib/conversation-exclusions');
|
|
20
|
-
const bridgePackage = require('@sanqianx/ai-coding-event-bridge');
|
|
21
|
-
const opencodeEntry = require('@sanqianx/ai-coding-event-bridge/src/connectors/opencode/hook-entry');
|
|
22
|
-
const claudeEntry = require('@sanqianx/ai-coding-event-bridge/src/connectors/claude-code/hook-entry');
|
|
23
|
-
const codexEntry = require('@sanqianx/ai-coding-event-bridge/src/connectors/codex/hook-entry');
|
|
20
|
+
const bridgePackage = require('@sanqianx/ai-coding-event-bridge-console/src/bridge');
|
|
21
|
+
const opencodeEntry = require('@sanqianx/ai-coding-event-bridge-console/src/bridge/connectors/opencode/hook-entry');
|
|
22
|
+
const claudeEntry = require('@sanqianx/ai-coding-event-bridge-console/src/bridge/connectors/claude-code/hook-entry');
|
|
23
|
+
const codexEntry = require('@sanqianx/ai-coding-event-bridge-console/src/bridge/connectors/codex/hook-entry');
|
|
24
24
|
|
|
25
25
|
const temp = fs.mkdtempSync(path.join(os.tmpdir(), `kb-client-e2e-${process.pid}-`));
|
|
26
26
|
const layout = new StorageLayout({ dataDir: path.join(temp, 'data') });
|
|
@@ -14,7 +14,7 @@ const { ProjectRegistryStore } = require('../lib/project-registry-store');
|
|
|
14
14
|
const { ProjectStore } = require('../lib/project-store');
|
|
15
15
|
const { ConversationStore } = require('../lib/conversation-store');
|
|
16
16
|
const { CommitConversationBinder } = require('../lib/commit-conversation-binder');
|
|
17
|
-
const bridgeModule = require('@sanqianx/ai-coding-event-bridge');
|
|
17
|
+
const bridgeModule = require('@sanqianx/ai-coding-event-bridge-console/src/bridge');
|
|
18
18
|
|
|
19
19
|
const temp = fs.mkdtempSync(path.join(os.tmpdir(), `kb-boundary-freeze-${process.pid}-`));
|
|
20
20
|
const layout = new StorageLayout({ dataDir: path.join(temp, 'data') });
|
|
@@ -18,8 +18,8 @@ const { ConversationStore } = require('../lib/conversation-store');
|
|
|
18
18
|
const { BridgeAdapter } = require('../lib/bridge-adapter');
|
|
19
19
|
const { BridgeConsumerService } = require('../lib/bridge-consumer-service');
|
|
20
20
|
const { CommitConversationBinder } = require('../lib/commit-conversation-binder');
|
|
21
|
-
const claudeConnector = require('@sanqianx/ai-coding-event-bridge').claudeHookEntry;
|
|
22
|
-
const bridgeModule = require('@sanqianx/ai-coding-event-bridge');
|
|
21
|
+
const claudeConnector = require('@sanqianx/ai-coding-event-bridge-console/src/bridge').claudeHookEntry;
|
|
22
|
+
const bridgeModule = require('@sanqianx/ai-coding-event-bridge-console/src/bridge');
|
|
23
23
|
|
|
24
24
|
const temp = fs.mkdtempSync(path.join(os.tmpdir(), `kb-cross-repo-e2e-${process.pid}-`));
|
|
25
25
|
const layout = new StorageLayout({ dataDir: path.join(temp, 'data') });
|
|
@@ -11,7 +11,7 @@ const fs = require('fs');
|
|
|
11
11
|
const os = require('os');
|
|
12
12
|
const path = require('path');
|
|
13
13
|
const { IntegrationManager } = require('../lib/integration-installer');
|
|
14
|
-
const { createBridge } = require('@sanqianx/ai-coding-event-bridge');
|
|
14
|
+
const { createBridge } = require('@sanqianx/ai-coding-event-bridge-console/src/bridge');
|
|
15
15
|
|
|
16
16
|
const ROOT = path.resolve(__dirname, '..', '..');
|
|
17
17
|
const TEMP = fs.mkdtempSync(path.join(os.tmpdir(), `pk-integration-capture-${process.pid}-`));
|
|
@@ -38,7 +38,14 @@ function buildAndInstallPackage() {
|
|
|
38
38
|
windowsHide: true,
|
|
39
39
|
});
|
|
40
40
|
assert.strictEqual(installed.status, 0, installed.stderr || installed.stdout);
|
|
41
|
-
|
|
41
|
+
// Resolve the install path from the package's actual name (moved to
|
|
42
|
+
// @sanqianx/project-knowledge in 4.7.0; prior releases used the unscoped
|
|
43
|
+
// 'project-knowledge' which would live at node_modules/project-knowledge).
|
|
44
|
+
const pkg = require(path.join(ROOT, 'package.json'));
|
|
45
|
+
const installPath = pkg.name.startsWith('@')
|
|
46
|
+
? path.join(installDir, 'node_modules', pkg.name.split('/')[0], pkg.name.split('/')[1])
|
|
47
|
+
: path.join(installDir, 'node_modules', pkg.name);
|
|
48
|
+
return installPath;
|
|
42
49
|
}
|
|
43
50
|
|
|
44
51
|
(async () => {
|
|
@@ -3,7 +3,10 @@ const { SCHEMAS, createId } = require('./contracts');
|
|
|
3
3
|
const AtomicFile = require('./atomic-file');
|
|
4
4
|
|
|
5
5
|
function loadBridgeModule(explicitPath = '') {
|
|
6
|
-
|
|
6
|
+
// The bridge engine lives inside the consolidated console package
|
|
7
|
+
// (@sanqianx/ai-coding-event-bridge-console/src/bridge) — one package for
|
|
8
|
+
// both the capture library and the 会话浏览 service.
|
|
9
|
+
const candidates = [explicitPath, process.env.AI_CODING_EVENT_BRIDGE_MODULE, '@sanqianx/ai-coding-event-bridge-console/src/bridge'].filter(Boolean);
|
|
7
10
|
for (const candidate of candidates) {
|
|
8
11
|
try {
|
|
9
12
|
const target = candidate.startsWith('.') || path.isAbsolute(candidate) ? path.resolve(candidate) : candidate;
|
|
@@ -11,7 +11,7 @@ const packageInfo = require('../../package.json');
|
|
|
11
11
|
// degrade Development Capture status, never crash server startup.
|
|
12
12
|
let bridgeModule = null;
|
|
13
13
|
try {
|
|
14
|
-
bridgeModule = require('@sanqianx/ai-coding-event-bridge');
|
|
14
|
+
bridgeModule = require('@sanqianx/ai-coding-event-bridge-console/src/bridge');
|
|
15
15
|
} catch (_) {
|
|
16
16
|
bridgeModule = null;
|
|
17
17
|
}
|
|
@@ -60,7 +60,7 @@ function requirementHash(text) {
|
|
|
60
60
|
// helpers only). Missing module degrades to null identity, never a guess.
|
|
61
61
|
let bridgeIdentityModule = null;
|
|
62
62
|
try {
|
|
63
|
-
const bridgeModule = require('@sanqianx/ai-coding-event-bridge');
|
|
63
|
+
const bridgeModule = require('@sanqianx/ai-coding-event-bridge-console/src/bridge');
|
|
64
64
|
if (bridgeModule && typeof bridgeModule.buildRepoIdentityV1 === 'function') bridgeIdentityModule = bridgeModule;
|
|
65
65
|
} catch (_) {
|
|
66
66
|
bridgeIdentityModule = null;
|
|
@@ -11,7 +11,7 @@ const { BridgeAdapter } = require('../lib/bridge-adapter');
|
|
|
11
11
|
|
|
12
12
|
let bridgeIdentityModule = null;
|
|
13
13
|
try {
|
|
14
|
-
const bridgePackage = require('@sanqianx/ai-coding-event-bridge');
|
|
14
|
+
const bridgePackage = require('@sanqianx/ai-coding-event-bridge-console/src/bridge');
|
|
15
15
|
if (bridgePackage && typeof bridgePackage.buildRepoIdentityV1 === 'function') bridgeIdentityModule = bridgePackage;
|
|
16
16
|
} catch (_) {
|
|
17
17
|
bridgeIdentityModule = null;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sanqianx/project-knowledge",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.7.0",
|
|
4
4
|
"description": "Knowledge base manager with Git integration, AI-driven analysis, and bilingual (zh-CN/en-US) knowledge output",
|
|
5
5
|
"main": "_site/server.js",
|
|
6
6
|
"scripts": {
|
|
@@ -75,12 +75,11 @@
|
|
|
75
75
|
"@huggingface/transformers": "3.8.1",
|
|
76
76
|
"@lancedb/lancedb": "0.31.0",
|
|
77
77
|
"@modelcontextprotocol/sdk": "1.29.0",
|
|
78
|
-
"@sanqianx/ai-coding-event-bridge": "
|
|
79
|
-
"@sanqianx/
|
|
80
|
-
"@sanqianx/vector-hub": "^1.0.2",
|
|
78
|
+
"@sanqianx/ai-coding-event-bridge-console": "latest",
|
|
79
|
+
"@sanqianx/vector-hub": "latest",
|
|
81
80
|
"buffer": "^6.0.3",
|
|
82
81
|
"cheerio": "^1.2.0",
|
|
83
|
-
"claude-ai-workbench": "
|
|
82
|
+
"claude-ai-workbench": "latest",
|
|
84
83
|
"cross-spawn": "7.0.6",
|
|
85
84
|
"dotenv": "^17.4.2",
|
|
86
85
|
"gpt-tokenizer": "^3.4.0",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json",
|
|
3
3
|
"name": "project-knowledge",
|
|
4
|
-
"version": "4.
|
|
4
|
+
"version": "4.7.0",
|
|
5
5
|
"description": "Read durable project decisions and implementation history from Project Knowledge.",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "SanQianX",
|