@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.
@@ -9,7 +9,7 @@
9
9
  "plugins": [
10
10
  {
11
11
  "name": "project-knowledge",
12
- "version": "4.6.1",
12
+ "version": "4.7.0",
13
13
  "source": "./plugins/project-knowledge",
14
14
  "description": "Search durable project decisions and implementation history through MCP."
15
15
  }
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
- return path.join(installDir, 'node_modules', 'project-knowledge');
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
- const candidates = [explicitPath, process.env.AI_CODING_EVENT_BRIDGE_MODULE, '@sanqianx/ai-coding-event-bridge'].filter(Boolean);
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.6.1",
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": "^0.1.2",
79
- "@sanqianx/ai-coding-event-bridge-console": "0.4.0",
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": "0.4.1",
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.6.1",
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",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "project-knowledge",
3
- "version": "4.6.1",
3
+ "version": "4.7.0",
4
4
  "description": "Read durable project decisions and implementation history from Project Knowledge.",
5
5
  "author": {
6
6
  "name": "SanQianX",
@@ -6,7 +6,7 @@
6
6
  "args": [
7
7
  "-y",
8
8
  "--package",
9
- "project-knowledge@4.6.1",
9
+ "project-knowledge@4.7.0",
10
10
  "project-knowledge-mcp"
11
11
  ]
12
12
  }