aiwg 2026.8.1 → 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.
Files changed (37) hide show
  1. package/agentic/code/addons/aiwg-utils/skills/install-plugin/SKILL.md +9 -1
  2. package/agentic/code/plugins/utils/skills/install-plugin/SKILL.md +9 -1
  3. package/dist/src/cli/handlers/install.js +42 -4
  4. package/dist/src/cli/handlers/marketplace.js +375 -122
  5. package/dist/src/cli/handlers/subcommands.js +1 -0
  6. package/dist/src/cli/handlers/use.js +3 -1
  7. package/dist/src/config/aiwg-config.js +5 -0
  8. package/dist/src/extensions/project-local-doctor.js +10 -26
  9. package/dist/src/extensions/project-local-remove.js +42 -5
  10. package/dist/src/marketplace/exchange.js +602 -0
  11. package/dist/src/marketplace/provenance-types.js +19 -0
  12. package/dist/src/marketplace/provenance.js +834 -0
  13. package/dist/src/packages/adapters/git.js +79 -29
  14. package/dist/src/packages/package-discovery.js +81 -0
  15. package/dist/src/packages/package-registry.js +2 -0
  16. package/dist/src/packages/registry.js +119 -20
  17. package/docs/addons/aiwg-utils/security/supply-chain/external-npm/README.md +1 -1
  18. package/docs/addons/aiwg-utils/security/supply-chain/external-npm/modelcontextprotocol__sdk.md +7 -5
  19. package/docs/agents/cli-reference.md +57 -8
  20. package/docs/contributing/versioning.md +4 -2
  21. package/docs/customization/standalone-plugin-repository.md +21 -0
  22. package/docs/providers/git-native-marketplace.md +199 -0
  23. package/docs/providers/marketplace-consumer.md +5 -2
  24. package/docs/providers/marketplace.md +2 -0
  25. package/docs/releases/_manifest.json +2 -0
  26. package/docs/releases/v2026.8.2-announcement.md +83 -0
  27. package/docs/releases/v2026.8.3-announcement.md +66 -0
  28. package/package.json +3 -2
  29. package/prebuilt/fortemi-core/framework/aiwg-fortemi-index-v2.json +1 -1
  30. package/prebuilt/fortemi-core/framework/manifest.json +2 -2
  31. package/schemas/marketplace/aiwg-marketplace-catalog.v1.schema.json +40 -0
  32. package/schemas/marketplace/aiwg-marketplace-envelope.v1.schema.json +158 -0
  33. package/schemas/marketplace/aiwg-marketplace-lock.v1.schema.json +45 -0
  34. package/schemas/marketplace/aiwg-marketplace-portable-bundle.v1.schema.json +31 -0
  35. package/schemas/marketplace/aiwg-marketplace-receipt.v1.schema.json +32 -0
  36. package/schemas/marketplace/aiwg-marketplace-trust.v1.schema.json +32 -0
  37. 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 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.
@@ -20,6 +20,7 @@
20
20
  import path from 'path';
21
21
  import { installPackage } from '../../packages/registry.js';
22
22
  import { recordDeployment } from '../../packages/package-registry.js';
23
+ import { marketplaceConfigDir, resolveVerificationPolicy } from '../../marketplace/exchange.js';
23
24
  import { createScriptRunner } from './script-runner.js';
24
25
  import { handlerResultFromError } from '../errors.js';
25
26
  import * as ui from '../ui.js';
@@ -59,6 +60,12 @@ export const installHandler = {
59
60
  ' --provider <name> Target provider (claude, copilot, cursor...)',
60
61
  ' --target <dir> Project directory to deploy into',
61
62
  ' --refresh Force re-pull even if cached',
63
+ ' --ref <tag-or-sha> Resolve this ref and lock its immutable commit',
64
+ ' --package <id> Select one wrapper when a repository contains several',
65
+ ' --verify Require a publisher signature trusted by local policy',
66
+ ' --policy <name|path> Named trust policy or JSON policy file',
67
+ ' --project-local Store registry, lock, receipts, and index under <target>/.aiwg',
68
+ ' --global Store package state in the user AIWG directory (default)',
62
69
  ].join('\n'),
63
70
  };
64
71
  }
@@ -66,6 +73,15 @@ export const installHandler = {
66
73
  const refresh = hasFlag(ctx.args, '--refresh');
67
74
  const provider = parseFlag(ctx.args, '--provider') ?? 'claude';
68
75
  const target = parseFlag(ctx.args, '--target') ?? ctx.cwd;
76
+ const projectLocal = hasFlag(ctx.args, '--project-local');
77
+ const global = hasFlag(ctx.args, '--global');
78
+ if (projectLocal && global) {
79
+ return { exitCode: 1, message: 'Error: Choose either --project-local or --global, not both' };
80
+ }
81
+ const verify = hasFlag(ctx.args, '--verify');
82
+ const policyName = parseFlag(ctx.args, '--policy');
83
+ const scope = { projectLocal, projectDir: target };
84
+ const configDir = marketplaceConfigDir(scope);
69
85
  ui.blank();
70
86
  console.log(` ${ui.brandMark()} ${ui.bold('aiwg install')} ${ui.dimText(rawRef)}`);
71
87
  ui.rule();
@@ -75,8 +91,23 @@ export const installHandler = {
75
91
  let key;
76
92
  let type;
77
93
  let namespace;
94
+ let lockId;
95
+ let verificationStatus;
78
96
  try {
79
- ({ cachePath, key, type, namespace } = await installPackage(rawRef, { refresh }));
97
+ const resolvedPolicy = await resolveVerificationPolicy(policyName, scope);
98
+ const installed = await installPackage(rawRef, {
99
+ refresh,
100
+ ref: parseFlag(ctx.args, '--ref'),
101
+ packageSelector: parseFlag(ctx.args, '--package'),
102
+ verify,
103
+ verificationPolicy: resolvedPolicy.policy,
104
+ trustStore: resolvedPolicy.trustStore,
105
+ configDir,
106
+ actor: 'local-user',
107
+ });
108
+ ({ cachePath, key, type, namespace } = installed);
109
+ lockId = installed.lock.lockId;
110
+ verificationStatus = installed.verification.status;
80
111
  }
81
112
  catch (error) {
82
113
  // Preserve AiwgError.exitCode while keeping the "Error: " prefix users
@@ -85,9 +116,12 @@ export const installHandler = {
85
116
  return { ...result, message: `Error: ${result.message}` };
86
117
  }
87
118
  ui.success(`Installed: ${key} (${type})`);
88
- ui.dimText(` Cache: ${cachePath}`);
119
+ ui.dim(` Cache: ${cachePath}`);
120
+ ui.dim(` Lock: ${lockId}`);
121
+ ui.dim(` Verification: ${verificationStatus}`);
122
+ ui.dim(` Scope: ${projectLocal ? 'project-local' : 'global'}`);
89
123
  if (namespace !== 'aiwg') {
90
- ui.dimText(` Namespace: ${namespace}`);
124
+ ui.dim(` Namespace: ${namespace}`);
91
125
  }
92
126
  // Optionally deploy
93
127
  if (deploy) {
@@ -98,6 +132,10 @@ export const installHandler = {
98
132
  '--deploy-commands',
99
133
  '--deploy-skills',
100
134
  '--deploy-rules',
135
+ // External packages do not participate in AIWG's global artifact
136
+ // index. Copy their complete skill payload into the target so a
137
+ // successful install cannot silently deploy agents/rules only.
138
+ '--copy-all',
101
139
  '--provider', provider,
102
140
  '--target', target,
103
141
  '--namespace', namespace,
@@ -116,7 +154,7 @@ export const installHandler = {
116
154
  projectPath: target,
117
155
  provider,
118
156
  deployedAt: new Date().toISOString(),
119
- });
157
+ }, configDir);
120
158
  }
121
159
  }
122
160
  ui.blank();