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.
- package/agentic/code/addons/aiwg-utils/skills/install-plugin/SKILL.md +9 -1
- package/agentic/code/plugins/utils/skills/install-plugin/SKILL.md +9 -1
- package/dist/src/cli/handlers/subcommands.js +1 -0
- package/dist/src/cli/handlers/use.js +3 -1
- package/dist/src/config/aiwg-config.js +5 -0
- package/dist/src/extensions/project-local-doctor.js +10 -26
- package/dist/src/extensions/project-local-remove.js +42 -5
- package/docs/addons/aiwg-utils/security/supply-chain/external-npm/README.md +1 -1
- package/docs/addons/aiwg-utils/security/supply-chain/external-npm/modelcontextprotocol__sdk.md +7 -5
- package/docs/agents/cli-reference.md +9 -1
- package/docs/contributing/versioning.md +4 -2
- package/docs/releases/_manifest.json +1 -0
- package/docs/releases/v2026.8.3-announcement.md +66 -0
- package/package.json +2 -2
- package/prebuilt/fortemi-core/framework/aiwg-fortemi-index-v2.json +1 -1
- package/prebuilt/fortemi-core/framework/manifest.json +2 -2
- package/tools/plugin/plugin-installer-cli.mjs +81 -17
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
namespace: aiwg
|
|
3
3
|
name: install-plugin
|
|
4
4
|
platforms: [all]
|
|
5
|
-
description: Install Claude Code marketplace plugins
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
175
|
-
if (!prefix)
|
|
176
|
-
continue;
|
|
156
|
+
const hashes = artifactHashesForProvider(entry, provider);
|
|
177
157
|
for (const [sourceRel, expectedHash] of Object.entries(hashes)) {
|
|
178
|
-
|
|
179
|
-
const
|
|
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
|
-
|
|
190
|
-
|
|
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.
|
|
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) |
|
package/docs/addons/aiwg-utils/security/supply-chain/external-npm/modelcontextprotocol__sdk.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @modelcontextprotocol/sdk External NPM Supply-Chain Audit
|
|
2
2
|
|
|
3
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
-
|
|
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
|
|
117
|
-
#
|
|
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
|
|
@@ -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.
|
|
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.
|
|
314
|
+
"@modelcontextprotocol/sdk": "^1.30.0",
|
|
315
315
|
"chalk": "^4.1.2",
|
|
316
316
|
"chokidar": "^4.0.3",
|
|
317
317
|
"commander": "^12.1.0",
|