aiwg 2026.8.2 → 2026.8.3

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.
@@ -2,7 +2,7 @@
2
2
  namespace: aiwg
3
3
  name: install-plugin
4
4
  platforms: [all]
5
- description: Install Claude Code marketplace plugins with registry lookup, download, and local deployment
5
+ description: Install Claude Code marketplace plugins or route local/Git wrappers through the supported package workflow
6
6
  ---
7
7
 
8
8
  # Install Plugin
@@ -28,6 +28,8 @@ Alternate expressions and non-obvious activations (primary phrases are matched a
28
28
  | Claude Code plugin | "install claude code plugin utils" | Run `aiwg install-plugin utils@aiwg` |
29
29
  | Dry run | "show me what installing sdlc would do" | Run `aiwg install-plugin sdlc@aiwg --dry-run` |
30
30
  | Specific version | "install sdlc version 2026.3.0" | Run `aiwg install-plugin sdlc@aiwg@2026.3.0` |
31
+ | Local wrapper | "install this local plugin wrapper" | Run `aiwg install <path> --dry-run`, then `aiwg use <plugin-id>` |
32
+ | Git wrapper | "install this plugin Git URL" | Run `aiwg install <git-url> --dry-run`, then `aiwg use <plugin-id>` |
31
33
 
32
34
  ## Behavior
33
35
 
@@ -55,6 +57,12 @@ When triggered:
55
57
 
56
58
  # Force reinstall even if already installed
57
59
  aiwg install-plugin sdlc@aiwg --force
60
+
61
+ # Standalone local/Git wrappers use the package installer, not the legacy
62
+ # manifest-only install-plugin backend.
63
+ aiwg install ./path/to/wrapper --dry-run
64
+ aiwg install https://example.invalid/owner/wrapper.git --dry-run
65
+ aiwg use <plugin-id>
58
66
  ```
59
67
 
60
68
  3. **Report the result** — name the installed marketplace wrapper and confirm which agents, skills, commands, and rules were deployed and where.
@@ -2,7 +2,7 @@
2
2
  namespace: aiwg
3
3
  name: install-plugin
4
4
  platforms: [all]
5
- description: Install Claude Code marketplace plugins with registry lookup, download, and local deployment
5
+ description: Install Claude Code marketplace plugins or route local/Git wrappers through the supported package workflow
6
6
  ---
7
7
 
8
8
  # Install Plugin
@@ -28,6 +28,8 @@ Alternate expressions and non-obvious activations (primary phrases are matched a
28
28
  | Claude Code plugin | "install claude code plugin utils" | Run `aiwg install-plugin utils@aiwg` |
29
29
  | Dry run | "show me what installing sdlc would do" | Run `aiwg install-plugin sdlc@aiwg --dry-run` |
30
30
  | Specific version | "install sdlc version 2026.3.0" | Run `aiwg install-plugin sdlc@aiwg@2026.3.0` |
31
+ | Local wrapper | "install this local plugin wrapper" | Run `aiwg install <path> --dry-run`, then `aiwg use <plugin-id>` |
32
+ | Git wrapper | "install this plugin Git URL" | Run `aiwg install <git-url> --dry-run`, then `aiwg use <plugin-id>` |
31
33
 
32
34
  ## Behavior
33
35
 
@@ -55,6 +57,12 @@ When triggered:
55
57
 
56
58
  # Force reinstall even if already installed
57
59
  aiwg install-plugin sdlc@aiwg --force
60
+
61
+ # Standalone local/Git wrappers use the package installer, not the legacy
62
+ # manifest-only install-plugin backend.
63
+ aiwg install ./path/to/wrapper --dry-run
64
+ aiwg install https://example.invalid/owner/wrapper.git --dry-run
65
+ aiwg use <plugin-id>
58
66
  ```
59
67
 
60
68
  3. **Report the result** — name the installed marketplace wrapper and confirm which agents, skills, commands, and rules were deployed and where.
@@ -1062,6 +1062,7 @@ export const installPluginHandler = {
1062
1062
  const runner = createScriptRunner(frameworkRoot);
1063
1063
  return runner.run("tools/plugin/plugin-installer-cli.mjs", ctx.args, {
1064
1064
  cwd: ctx.cwd,
1065
+ env: { AIWG_ROOT: frameworkRoot },
1065
1066
  });
1066
1067
  },
1067
1068
  };
@@ -31,7 +31,7 @@ import { PROJECT_LOCAL_TYPE_TO_DIR } from '../../extensions/project-local-paths.
31
31
  import { buildUpstreamRegistry } from '../../extensions/upstream-registry.js';
32
32
  import { resolveShadows, formatShadowReport, } from '../../extensions/shadow-resolver.js';
33
33
  import { appendProjectLocalActivity, emitDiscoverEventsDeduped, } from '../../extensions/project-local-activity.js';
34
- import { hashBundleArtifacts } from '../../extensions/project-local-remove.js';
34
+ import { hashBundleArtifacts, hashDeployedBundleArtifacts, } from '../../extensions/project-local-remove.js';
35
35
  import { installAiwgHooks } from '../../extensions/claude-hooks-installer.js';
36
36
  import { detectScope, mirrorToUserScope, rejectOpenClawProjectScope, USER_SCOPE_PATHS, } from '../scope-resolver.js';
37
37
  import { maybeWarnProjectIsolation } from '../project-isolation/index.js';
@@ -1185,6 +1185,7 @@ async function deployProjectLocalBundles(opts) {
1185
1185
  // #1037 — record per-artifact source hashes so `aiwg remove` can
1186
1186
  // detect pristine vs mutated vs replaced deployed files.
1187
1187
  const artifactHashes = await hashBundleArtifacts(bundle.artifactPath);
1188
+ const deployedArtifactHashes = await hashDeployedBundleArtifacts(projectDir, provider, artifactHashes);
1188
1189
  const updated = updateInstalled(config, bundle.id, provider, result.counts, {
1189
1190
  version: bundle.manifest.version,
1190
1191
  source: 'project-local',
@@ -1193,6 +1194,7 @@ async function deployProjectLocalBundles(opts) {
1193
1194
  localType: bundle.type,
1194
1195
  manifestVersion: bundle.manifest.manifestVersion,
1195
1196
  artifactHashes,
1197
+ deployedArtifactHashes,
1196
1198
  });
1197
1199
  await writeAiwgConfig(projectDir, updated);
1198
1200
  }
@@ -784,6 +784,10 @@ export function updateInstalled(config, name, provider, counts, opts) {
784
784
  existing.manifestVersion = opts.manifestVersion;
785
785
  if (opts.artifactHashes)
786
786
  existing.artifactHashes = opts.artifactHashes;
787
+ if (opts.deployedArtifactHashes) {
788
+ existing.deployedArtifactHashes ??= {};
789
+ existing.deployedArtifactHashes[provider] = opts.deployedArtifactHashes;
790
+ }
787
791
  }
788
792
  else {
789
793
  // Clear stale project-local fields if a previously project-local entry is
@@ -792,6 +796,7 @@ export function updateInstalled(config, name, provider, counts, opts) {
792
796
  delete existing.localType;
793
797
  delete existing.manifestVersion;
794
798
  delete existing.artifactHashes;
799
+ delete existing.deployedArtifactHashes;
795
800
  }
796
801
  config.installed[name] = existing;
797
802
  return config;
@@ -12,8 +12,7 @@
12
12
  * @design @.aiwg/architecture/design-doctor-log-promote.md
13
13
  * @implements #1037
14
14
  */
15
- import { join, resolve } from 'path';
16
- import { homedir } from 'os';
15
+ import { join } from 'path';
17
16
  import { discoverProjectLocalBundles } from './project-local-discovery.js';
18
17
  import { buildUpstreamRegistry } from './upstream-registry.js';
19
18
  import { resolveShadows } from './shadow-resolver.js';
@@ -22,6 +21,7 @@ import { sha256OfFileRawAndNormalized } from './managed-marker.js';
22
21
  import { projectAiwgPath } from '../config/project-artifacts.js';
23
22
  import { projectRelativePathIfInside } from './project-local-paths.js';
24
23
  import { auditProjectQuickref } from './project-quickref.js';
24
+ import { artifactHashesForProvider, candidateDeployedPaths } from './project-local-remove.js';
25
25
  /**
26
26
  * Hash a deployed file in raw and managed-marker-normalized forms. Returns
27
27
  * null on read errors (e.g., file missing — caller treats as
@@ -48,23 +48,6 @@ const TYPE_DIR = {
48
48
  plugin: 'plugins',
49
49
  provider: 'providers',
50
50
  };
51
- // Per PUW-026 (#1127): home-deploying providers get absolute prefixes so
52
- // `resolve(projectDir, prefix)` correctly produces the home-rooted path
53
- // (resolve treats absolute paths as authoritative). Previously these were
54
- // `null`, which silently skipped lifecycle operations against home-deployed
55
- // project-local bundles.
56
- const PROVIDER_PREFIX = {
57
- claude: '.claude',
58
- cursor: '.cursor',
59
- factory: '.factory',
60
- opencode: '.opencode',
61
- windsurf: '.windsurf',
62
- warp: '.warp',
63
- codex: '.codex',
64
- copilot: '.github',
65
- openclaw: resolve(homedir(), '.openclaw'),
66
- hermes: resolve(homedir(), '.hermes'),
67
- };
68
51
  export async function buildProjectLocalDoctorSection(opts) {
69
52
  const { projectDir, frameworkRoot, config, quiet = false } = opts;
70
53
  const discovery = await discoverProjectLocalBundles(projectDir);
@@ -165,18 +148,19 @@ export async function buildProjectLocalDoctorSection(opts) {
165
148
  const entry = config.installed[bundle.id];
166
149
  if (!entry || entry.source !== 'project-local')
167
150
  continue;
168
- const hashes = entry.artifactHashes;
169
- if (!hashes) {
151
+ if (!entry.artifactHashes && !entry.deployedArtifactHashes) {
170
152
  unhashedSeen = true;
171
153
  continue;
172
154
  }
173
155
  for (const provider of Object.keys(entry.deployedTo)) {
174
- const prefix = PROVIDER_PREFIX[provider];
175
- if (!prefix)
176
- continue;
156
+ const hashes = artifactHashesForProvider(entry, provider);
177
157
  for (const [sourceRel, expectedHash] of Object.entries(hashes)) {
178
- const deployedAbs = resolve(projectDir, `${prefix}/${sourceRel}`);
179
- const actualHash = await hashDeployed(deployedAbs);
158
+ let actualHash = null;
159
+ for (const deployedAbs of candidateDeployedPaths(projectDir, provider, sourceRel)) {
160
+ actualHash = await hashDeployed(deployedAbs);
161
+ if (actualHash)
162
+ break;
163
+ }
180
164
  if (actualHash === null) {
181
165
  // Missing — not drift, deploy is just absent
182
166
  continue;
@@ -93,6 +93,34 @@ export async function hashBundleArtifacts(bundleAbsPath) {
93
93
  }
94
94
  return out;
95
95
  }
96
+ /**
97
+ * Hash the provider-transformed files produced by a successful deployment.
98
+ * The source hash map supplies the canonical inventory/key shape; values are
99
+ * read from the first canonical provider path that exists.
100
+ */
101
+ export async function hashDeployedBundleArtifacts(projectDir, provider, sourceHashes) {
102
+ const deployed = {};
103
+ for (const [sourceRel, sourceHash] of Object.entries(sourceHashes)) {
104
+ // Keep the complete inventory if a provider path unexpectedly cannot be
105
+ // resolved. Removal then fails safely instead of clearing the registry
106
+ // while leaving an untracked provider artifact behind.
107
+ deployed[sourceRel] = sourceHash;
108
+ for (const candidate of candidateDeployedPaths(projectDir, provider, sourceRel)) {
109
+ try {
110
+ deployed[sourceRel] = await sha256Hex(candidate);
111
+ break;
112
+ }
113
+ catch {
114
+ // Try translated/provider-alternate paths before leaving it absent.
115
+ }
116
+ }
117
+ }
118
+ return deployed;
119
+ }
120
+ /** Resolve current provider hashes while preserving old registry entries. */
121
+ export function artifactHashesForProvider(entry, provider) {
122
+ return entry.deployedArtifactHashes?.[provider] ?? entry.artifactHashes ?? {};
123
+ }
96
124
  /** Resolve a recorded source-relative artifact through the canonical provider
97
125
  * definition rather than assuming every artifact lives directly under the
98
126
  * provider prefix (#1869). Returned paths are absolute for both project- and
@@ -111,6 +139,11 @@ export function candidateDeployedPaths(projectDir, provider, sourceRel) {
111
139
  const tail = sourceRel.slice(separator + 1);
112
140
  const absoluteRoot = isAbsolute(root) ? root : resolve(projectDir, root);
113
141
  const candidates = [join(absoluteRoot, tail)];
142
+ // Codex discovers project skills from the shared native `.agents/skills`
143
+ // root while retaining `.codex` as its compatibility deployment surface.
144
+ if (provider === 'codex' && artifactType === 'skills') {
145
+ candidates.unshift(join(resolve(projectDir, '.agents', 'skills'), tail));
146
+ }
114
147
  // Provider adapters may translate source extensions.
115
148
  if (provider === 'cursor' && artifactType === 'rules' && tail.endsWith('.md')) {
116
149
  candidates.push(join(absoluteRoot, `${tail.slice(0, -3)}.mdc`));
@@ -186,12 +219,10 @@ function resolveOwnership(config, selfBundleId, provider, sourceRel) {
186
219
  continue;
187
220
  if (entry.source !== 'project-local')
188
221
  continue;
189
- if (!entry.artifactHashes)
190
- continue;
191
- if (sourceRel in entry.artifactHashes) {
222
+ const hashes = artifactHashesForProvider(entry, provider);
223
+ if (sourceRel in hashes) {
192
224
  // Same source-rel path claimed by another project-local bundle —
193
225
  // the deployed file (if present) is theirs, not ours.
194
- void provider;
195
226
  return name;
196
227
  }
197
228
  }
@@ -219,12 +250,12 @@ export async function removeProjectLocalBundle(config, projectDir, bundleId, opt
219
250
  const { force = false, provider: onlyProvider, dryRun = false, keepRegistry = false } = opts;
220
251
  const confirmMutation = opts.confirmMutation ?? (async () => false);
221
252
  const installedEntry = entry;
222
- const artifactHashes = installedEntry.artifactHashes ?? {};
223
253
  const providers = Object.keys(installedEntry.deployedTo).filter(p => !onlyProvider || p === onlyProvider);
224
254
  const outcomes = [];
225
255
  const revertedProviders = [];
226
256
  const partialProviders = [];
227
257
  for (const provider of providers) {
258
+ const artifactHashes = artifactHashesForProvider(installedEntry, provider);
228
259
  let providerHadSkip = false;
229
260
  for (const sourceRel of Object.keys(artifactHashes)) {
230
261
  const owner = resolveOwnership(config, bundleId, provider, sourceRel);
@@ -334,6 +365,12 @@ export async function removeProjectLocalBundle(config, projectDir, bundleId, opt
334
365
  // Mutate registry for fully-reverted providers
335
366
  if (!dryRun && !keepRegistry && !providerHadSkip) {
336
367
  delete installedEntry.deployedTo[provider];
368
+ if (installedEntry.deployedArtifactHashes) {
369
+ delete installedEntry.deployedArtifactHashes[provider];
370
+ if (Object.keys(installedEntry.deployedArtifactHashes).length === 0) {
371
+ delete installedEntry.deployedArtifactHashes;
372
+ }
373
+ }
337
374
  }
338
375
  }
339
376
  // Top-level remove activity entry
@@ -19,7 +19,7 @@ This directory tracks external npm package audit evidence for the current depend
19
19
 
20
20
  | Package | Version | Tracking | Native/Binary/Lifecycle Surface | Status | Report |
21
21
  |---|---:|---|---|---|---|
22
- | `@modelcontextprotocol/sdk` | `1.29.0` | #1444, #1447 | no | complete | [report](modelcontextprotocol__sdk.md) |
22
+ | `@modelcontextprotocol/sdk` | `1.30.0` | #1444, #1447, #1973 | no | complete | [report](modelcontextprotocol__sdk.md) |
23
23
  | `chalk` | `4.1.2` | #1444 | no | complete | [report](chalk.md) |
24
24
  | `chokidar` | `4.0.3` | #1444 | no | complete | [report](chokidar.md) |
25
25
  | `commander` | `12.1.0` | #1444, #1447 | no | complete | [report](commander.md) |
@@ -1,6 +1,6 @@
1
1
  # @modelcontextprotocol/sdk External NPM Supply-Chain Audit
2
2
 
3
- Generated: 2026-05-23
3
+ Updated: 2026-08-03
4
4
 
5
5
  ## Scope
6
6
 
@@ -8,7 +8,7 @@ Generated: 2026-05-23
8
8
  |---|---|
9
9
  | Package | `@modelcontextprotocol/sdk` |
10
10
  | Canonical upstream repository | https://github.com/modelcontextprotocol/typescript-sdk.git |
11
- | Audited version/ref | `1.24.3` / `724fe6eefeeb7f71328bc43c223fc9abd3df491e` |
11
+ | Audited version/ref | `1.30.0` / npm registry release |
12
12
  | npm registry signatures | 1 |
13
13
  | Dependency source summary | `ajv`, `cors`, `cross-spawn`, `express`, `jose`, `raw-body`, `zod`, `@hono/node-server` |
14
14
  | Optional dependency summary | (none) |
@@ -19,12 +19,13 @@ Generated: 2026-05-23
19
19
 
20
20
  | Manifest | Field | Spec | Lockfile Version | Integrity | Install Script | Optional Lock Entry | Tracking |
21
21
  |---|---|---:|---:|---|---|---|---|
22
- | `package.json` | `dependencies` | `^1.24.0` | `1.24.3` | yes | no | no | #1444 |
22
+ | `package.json` | `dependencies` | `^1.30.0` | `1.30.0` | yes | no | no | #1444, #1973 |
23
+ | `packages/cli/package.json` | `dependencies` | `^1.30.0` | `1.30.0` | yes | no | no | #1973 |
23
24
  | `agentic/code/addons/droid-bridge/package.json` | `dependencies` | `^1.0.0` | `1.25.2` | yes | no | no | #1447 |
24
25
 
25
26
  ## Lockfile Tarballs
26
27
 
27
- - package.json: https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.24.3.tgz
28
+ - package.json and packages/cli/package.json: https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.30.0.tgz
28
29
  - agentic/code/addons/droid-bridge/package.json: https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.25.2.tgz
29
30
 
30
31
  ## Lifecycle And Native/Binary Review
@@ -58,7 +59,8 @@ Consumer install-time lifecycle scripts are `preinstall`, `install`, and `postin
58
59
  - AIWG usage context is documented with manifest path, dependency field, requested spec, and lockfile version where present.
59
60
  - Lockfile integrity is present for locked AIWG package entries.
60
61
  - Native, binary, optional, and lifecycle behavior is explicitly recorded for applicable package classes.
61
- - No immediate AIWG dependency change is required from this package alone.
62
+ - Version 1.30.0 permits `@hono/node-server` v2, removing the Windows
63
+ serve-static advisory route retained by the 1.29.0 dependency range.
62
64
 
63
65
  ## Follow-Up
64
66
 
@@ -2163,12 +2163,20 @@ Install any of them with `/plugin install <name>@aiwg` after running `/plugin ma
2163
2163
  Install Claude Code plugin.
2164
2164
 
2165
2165
  ```bash
2166
- aiwg install-plugin <name>
2166
+ aiwg install-plugin <name> [--source <local-path>] [--dry-run]
2167
2167
  ```
2168
2168
 
2169
2169
  **Arguments:**
2170
2170
 
2171
2171
  - `<name>` - Plugin name from marketplace
2172
+ - `--source <local-path>` - Compatibility input for legacy framework/add-on/extension manifests. Standalone plugin wrappers return an actionable migration to `aiwg install <path>` followed by `aiwg use <plugin-id>`.
2173
+
2174
+ Git URLs and standalone local wrappers use the package workflow directly:
2175
+
2176
+ ```bash
2177
+ aiwg install <path-or-git-url> --dry-run
2178
+ aiwg use <plugin-id>
2179
+ ```
2172
2180
 
2173
2181
  **Capabilities:** cli, plugin, install
2174
2182
  **Platform:** Claude Code only
@@ -113,8 +113,10 @@ tools/release/cut-tag.sh 2026.X.Y
113
113
  # gate validates the signature against .gitea/keys/maintainers.asc)
114
114
  git push origin main --tags
115
115
 
116
- # Mirror the signed tag to GitHub (push it yourself the mirror workflow
117
- # peels annotated tags; github-mirror.yml then creates the GitHub release)
116
+ # Mirror the signed tag to GitHub. Push it yourself so GitHub receives the
117
+ # original signed annotated tag object; the workflow never synthesizes or
118
+ # peels a tag. github-mirror.yml waits up to five minutes for this push before
119
+ # creating the verified GitHub release.
118
120
  git push github main --tags
119
121
 
120
122
  unset VAULT_CI_ROLE_ID VAULT_CI_SECRET_ID
@@ -3,6 +3,7 @@
3
3
  "summary": "Release notes",
4
4
  "collapsed": true,
5
5
  "order": [
6
+ "v2026.8.3-announcement",
6
7
  "v2026.8.2-announcement",
7
8
  "v2026.8.1-announcement",
8
9
  "v2026.8.0-announcement",
@@ -0,0 +1,66 @@
1
+ # AIWG 2026.8.3 - Plugin lifecycle and release reliability
2
+
3
+ **Release date:** 2026-08-03
4
+ **Channel:** stable
5
+
6
+ AIWG 2026.8.3 fixes three lifecycle and publication regressions and moves the
7
+ MCP server dependency graph onto the advisory-free Hono v2 line.
8
+
9
+ ## What changed
10
+
11
+ - Project-local removal records the provider-transformed bytes that were
12
+ actually deployed. Freshly deployed skills are therefore removable as
13
+ pristine, while later user edits remain protected.
14
+ - `aiwg install-plugin --source` handles local legacy manifests through the
15
+ correct framework root and gives project-local wrappers actionable guidance
16
+ to use `.aiwg/plugins/` plus `aiwg use`.
17
+ - GitHub release creation waits for the operator-pushed signed annotated tag
18
+ and verifies its expected commit before publishing a stable release.
19
+ - `@modelcontextprotocol/sdk` 1.30.0 allows the package graph to use
20
+ `@hono/node-server` 2.0.11, removing the affected Windows static-serving
21
+ dependency route.
22
+
23
+ ## Verification
24
+
25
+ The release candidate passed the main test/build workflow, documentation
26
+ build and deployment workflows, and Fortemi shard conformance on the delivered
27
+ dependency commit. The production dependency audit reports no MCP SDK or Hono
28
+ finding and no moderate-severity findings.
29
+
30
+ ## Package matrix
31
+
32
+ All three packages publish in CalVer lockstep:
33
+
34
+ ```text
35
+ aiwg@2026.8.3
36
+ @aiwg/cli@2026.8.3
37
+ @aiwg/cockpit@2026.8.3
38
+ ```
39
+
40
+ ## Upgrade
41
+
42
+ Full local-corpus distribution:
43
+
44
+ ```bash
45
+ npm install --global aiwg@2026.8.3
46
+ ```
47
+
48
+ Lightweight signed-web distribution:
49
+
50
+ ```bash
51
+ npm install --global @aiwg/cli@2026.8.3
52
+ ```
53
+
54
+ Install or refresh Cockpit through the base CLI to keep its version in
55
+ lockstep:
56
+
57
+ ```bash
58
+ aiwg use cockpit
59
+ aiwg cockpit
60
+ ```
61
+
62
+ ## Rollback
63
+
64
+ Roll back all three packages together to `2026.8.2`. That version does not
65
+ contain the plugin lifecycle fixes or the MCP SDK dependency update described
66
+ above.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aiwg",
3
- "version": "2026.8.2",
3
+ "version": "2026.8.3",
4
4
  "description": "Deployment tool and support utility for AI context. Copies agents, skills, commands, rules, and behaviors into the paths each AI platform reads (Claude Code, Codex, Copilot, Cursor, Warp, OpenClaw, and 6 more) so one source of truth works across 10 platforms. Optional utilities for persistent artifact memory, background orchestration, autonomous loops, and artifact indexing.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -311,7 +311,7 @@
311
311
  },
312
312
  "dependencies": {
313
313
  "@fortemi/core": "2026.7.15",
314
- "@modelcontextprotocol/sdk": "^1.29.0",
314
+ "@modelcontextprotocol/sdk": "^1.30.0",
315
315
  "chalk": "^4.1.2",
316
316
  "chokidar": "^4.0.3",
317
317
  "commander": "^12.1.0",