@lesliechan721/aw-plugin-core 0.1.0-beta.53 → 0.1.0-beta.55

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.
@@ -0,0 +1,458 @@
1
+ import { createHash } from 'node:crypto';
2
+ import path from 'node:path';
3
+ import fs from 'fs-extra';
4
+ import { getPluginConfigDependencyKeys } from './plugin-config.js';
5
+ import { formatMarketplaceProductsForError, supportsPlatform } from './platform-support.js';
6
+ import { isSkillAuthorOnlyPath } from './skill-authoring.js';
7
+ export const COMMAND_PRODUCER_RECORD_FILE = '.aw-command-producer.json';
8
+ export const MANAGED_COMMAND_NAME_PATTERN = /^[A-Za-z][A-Za-z0-9_.-]{0,63}$/u;
9
+ const ENVIRONMENT_NAME = /^[A-Za-z_][A-Za-z0-9_]*$/u;
10
+ const SAFE_PERMISSION_TOKEN = /^[A-Za-z0-9_./:@%+=,-]+$/u;
11
+ const PLUGIN_COMMAND_ID = /^cmdp_[0-9a-f]{64}$/u;
12
+ const USER_COMMAND_ID = /^cmdu_[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/u;
13
+ const PACKAGE_ID = /^pkg_[0-9a-f]{64}$/u;
14
+ const PACKAGE_PROTECTED_NAMES = new Set(['.git', 'node_modules', '.agents-plugin', '.codex-plugin', '.claude-plugin', '.release', '.tmp', 'evals', 'reports', COMMAND_PRODUCER_RECORD_FILE, '.agent-workflows-owner.json', '.aw-runtime-config.json', 'aw-plugin-requirements.json']);
15
+ const PACKAGE_OUTPUT_ROOTS = new Set(['codex', 'claude', 'agent-skills']);
16
+ function object(value, field, allowed) {
17
+ if (!value || typeof value !== 'object' || Array.isArray(value))
18
+ throw new Error(`Invalid ${field}: expected an object.`);
19
+ for (const key of Object.keys(value)) {
20
+ if (!allowed.includes(key))
21
+ throw new Error(`Invalid ${field}: unknown field ${JSON.stringify(key)}.`);
22
+ }
23
+ return value;
24
+ }
25
+ function text(value, field, maxLength) {
26
+ if (typeof value !== 'string' || /[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?<![\uD800-\uDBFF])[\uDC00-\uDFFF]/u.test(value) || value.includes('\0')) {
27
+ throw new Error(`Invalid ${field}: expected a Unicode string without NUL.`);
28
+ }
29
+ if (maxLength !== undefined && [...value].length > maxLength)
30
+ throw new Error(`Invalid ${field}: string is too long.`);
31
+ return value;
32
+ }
33
+ function nonempty(value, field) {
34
+ const result = text(value, field);
35
+ if (result.length === 0)
36
+ throw new Error(`Invalid ${field}: expected a non-empty string.`);
37
+ return result;
38
+ }
39
+ function name(value, field) {
40
+ const result = text(value, field);
41
+ if (!MANAGED_COMMAND_NAME_PATTERN.test(result))
42
+ throw new Error(`Invalid ${field}: expected a managed command Name.`);
43
+ return result;
44
+ }
45
+ function enumeration(value, field, values) {
46
+ if (!values.includes(value))
47
+ throw new Error(`Invalid ${field}: expected ${values.join(' | ')}.`);
48
+ return value;
49
+ }
50
+ function strings(value, field, unique = false) {
51
+ if (!Array.isArray(value))
52
+ throw new Error(`Invalid ${field}: expected an array.`);
53
+ const result = value.map((entry, index) => text(entry, `${field}[${index}]`));
54
+ if (unique && new Set(result).size !== result.length)
55
+ throw new Error(`Invalid ${field}: duplicate value.`);
56
+ return result;
57
+ }
58
+ export function normalizeCommandRelativeFile(value, field = 'entry') {
59
+ const result = nonempty(value, field);
60
+ if (result.startsWith('/') || /^[A-Za-z]:/u.test(result) || /[\\\u0000-\u001f\u007f-\u009f]/u.test(result)
61
+ || result.split('/').some((segment) => segment === '' || segment === '.' || segment === '..')) {
62
+ throw new Error(`Invalid ${field}: expected a safe relative file path.`);
63
+ }
64
+ return result;
65
+ }
66
+ function environmentMap(value, field, source) {
67
+ const input = object(value, field, Object.keys((value && typeof value === 'object') ? value : {}));
68
+ const result = {};
69
+ for (const [key, entry] of Object.entries(input)) {
70
+ if (!ENVIRONMENT_NAME.test(key))
71
+ throw new Error(`Invalid ${field}: invalid environment name.`);
72
+ const normalized = text(entry, `${field}.${key}`, 4096);
73
+ if (source && !ENVIRONMENT_NAME.test(normalized))
74
+ throw new Error(`Invalid ${field}.${key}: expected an environment name.`);
75
+ Object.defineProperty(result, key, { value: normalized, enumerable: true, configurable: true, writable: true });
76
+ }
77
+ return result;
78
+ }
79
+ function protectedEnvironmentName(value) {
80
+ return /^(?:AW_PLUGIN_|AW_SUBAGENT_|AW_COMMAND_)/u.test(value.toUpperCase())
81
+ || ['AW_AGENT_SKILL_EVAL_PROCESS_MARKER', 'AW_HOME', 'AW_CODEX_HOME', 'AW_CLAUDE_HOME'].includes(value.toUpperCase());
82
+ }
83
+ export function validateCommandEnvironment(env, envFrom, platform = process.platform) {
84
+ const literal = environmentMap(env, 'env', false);
85
+ const inherited = environmentMap(envFrom, 'envFrom', true);
86
+ for (const key of [...Object.keys(literal), ...Object.keys(inherited), ...Object.values(inherited)]) {
87
+ if (protectedEnvironmentName(key))
88
+ throw new Error('Invalid command environment: protected environment name.');
89
+ }
90
+ const targetKeys = [...Object.keys(literal), ...Object.keys(inherited)].map((key) => platform === 'win32' ? key.toUpperCase() : key);
91
+ if (new Set(targetKeys).size !== targetKeys.length)
92
+ throw new Error('Invalid command environment: duplicate target name.');
93
+ }
94
+ export function normalizeCommandLaunch(value, field = 'command launch') {
95
+ const input = object(value, field, ['runner', 'entry', 'args', 'env', 'envFrom', 'cwd']);
96
+ const args = input.args === undefined ? [] : strings(input.args, `${field}.args`);
97
+ if (args.length > 128 || args.some((arg) => [...arg].length > 4096))
98
+ throw new Error(`Invalid ${field}.args: argument limit exceeded.`);
99
+ const env = input.env === undefined ? {} : environmentMap(input.env, `${field}.env`, false);
100
+ const envFrom = input.envFrom === undefined ? {} : environmentMap(input.envFrom, `${field}.envFrom`, true);
101
+ validateCommandEnvironment(env, envFrom);
102
+ return {
103
+ runner: enumeration(input.runner, `${field}.runner`, ['node', 'executable']),
104
+ entry: normalizeCommandRelativeFile(input.entry, `${field}.entry`), args, env, envFrom,
105
+ cwd: input.cwd === undefined ? 'caller' : enumeration(input.cwd, `${field}.cwd`, ['caller', 'resource']),
106
+ };
107
+ }
108
+ export function normalizeCommandDefinition(value, field = 'command') {
109
+ const input = object(value, field, ['key', 'variant', 'runner', 'entry', 'args', 'env', 'envFrom', 'cwd']);
110
+ const { key, variant, ...launch } = input;
111
+ return { key: name(key, `${field}.key`), variant: variant === undefined ? 'default' : name(variant, `${field}.variant`), ...normalizeCommandLaunch(launch, field) };
112
+ }
113
+ export function normalizeCommandDefinitions(value, field = 'entries') {
114
+ if (!Array.isArray(value))
115
+ throw new Error(`Invalid ${field}: expected an array.`);
116
+ const entries = value.map((entry, index) => normalizeCommandDefinition(entry, `${field}[${index}]`));
117
+ const keys = entries.map((entry) => `${entry.key}/${entry.variant}`);
118
+ if (new Set(keys).size !== keys.length)
119
+ throw new Error(`Invalid ${field}: duplicate command key/variant.`);
120
+ return entries;
121
+ }
122
+ export function normalizeManagedCommandReference(value, field = 'command reference') {
123
+ const input = object(value, field, ['set', 'key', 'variant']);
124
+ return { set: name(input.set, `${field}.set`), key: name(input.key, `${field}.key`), variant: input.variant === undefined ? 'default' : name(input.variant, `${field}.variant`) };
125
+ }
126
+ export function normalizeManagedCommandPermission(value, field = 'command permission') {
127
+ const input = object(value, field, ['command', 'argsPrefix']);
128
+ const argsPrefix = input.argsPrefix === undefined ? [] : strings(input.argsPrefix, `${field}.argsPrefix`);
129
+ if (argsPrefix.some((token) => !SAFE_PERMISSION_TOKEN.test(token)))
130
+ throw new Error(`Invalid ${field}.argsPrefix: expected safe non-empty tokens.`);
131
+ return { command: normalizeManagedCommandReference(input.command, `${field}.command`), argsPrefix };
132
+ }
133
+ function normalizeProducerRef(value, field) {
134
+ const input = object(value, field, ['kind', 'artifactId', 'platform', 'skillKey', 'packageKey']);
135
+ if (input.kind === 'artifact') {
136
+ object(value, field, ['kind', 'artifactId']);
137
+ return { kind: 'artifact', artifactId: nonempty(input.artifactId, `${field}.artifactId`) };
138
+ }
139
+ if (input.kind === 'static-skill') {
140
+ object(value, field, ['kind', 'platform', 'skillKey']);
141
+ const skillKey = normalizeCommandRelativeFile(input.skillKey, `${field}.skillKey`);
142
+ if (skillKey.includes('/'))
143
+ throw new Error(`Invalid ${field}.skillKey: expected a declared Skill key.`);
144
+ return { kind: 'static-skill', platform: enumeration(input.platform, `${field}.platform`, ['codex', 'claude']), skillKey };
145
+ }
146
+ object(value, field, ['kind', 'packageKey']);
147
+ if (input.kind !== 'package')
148
+ throw new Error(`Invalid ${field}.kind.`);
149
+ return { kind: 'package', packageKey: name(input.packageKey, `${field}.packageKey`) };
150
+ }
151
+ export function normalizeManagedCommands(value, field = 'managedCommands') {
152
+ const input = object(value, field, ['packages', 'sets']);
153
+ const packages = input.packages === undefined ? [] : (() => {
154
+ if (!Array.isArray(input.packages))
155
+ throw new Error(`Invalid ${field}.packages: expected an array.`);
156
+ return input.packages.map((entry, index) => {
157
+ const label = `${field}.packages[${index}]`;
158
+ const item = object(entry, label, ['key', 'scope', 'platforms', 'sourceDir', 'render', 'refreshKeys']);
159
+ const platforms = strings(item.platforms, `${label}.platforms`, true).map((platform) => enumeration(platform, `${label}.platforms`, ['codex', 'claude']));
160
+ if (platforms.length === 0)
161
+ throw new Error(`Invalid ${label}.platforms: expected a non-empty array.`);
162
+ if (item.render !== undefined && item.render !== true)
163
+ throw new Error(`Invalid ${label}.render: expected true.`);
164
+ const refreshKeys = item.refreshKeys === undefined ? [] : strings(item.refreshKeys, `${label}.refreshKeys`, true);
165
+ if (item.render !== true && refreshKeys.length > 0)
166
+ throw new Error(`Invalid ${label}.refreshKeys: requires render: true.`);
167
+ const sourceDir = nonempty(item.sourceDir, `${label}.sourceDir`);
168
+ if (!sourceDir.startsWith('./'))
169
+ throw new Error(`Invalid ${label}.sourceDir: expected ./ plugin-relative directory.`);
170
+ normalizeCommandRelativeFile(sourceDir.slice(2), `${label}.sourceDir`);
171
+ const parts = sourceDir.slice(2).split('/');
172
+ if (PACKAGE_OUTPUT_ROOTS.has(parts[0]) || parts.some((part) => PACKAGE_PROTECTED_NAMES.has(part)) || isSkillAuthorOnlyPath(sourceDir.slice(2))) {
173
+ throw new Error(`Invalid ${label}.sourceDir: protected or author-only directory.`);
174
+ }
175
+ return { key: name(item.key, `${label}.key`), scope: enumeration(item.scope, `${label}.scope`, ['user', 'project']), platforms: platforms, sourceDir, ...(item.render === true ? { render: true } : {}), refreshKeys };
176
+ });
177
+ })();
178
+ const sets = input.sets === undefined ? [] : (() => {
179
+ if (!Array.isArray(input.sets))
180
+ throw new Error(`Invalid ${field}.sets: expected an array.`);
181
+ return input.sets.map((entry, index) => {
182
+ const label = `${field}.sets[${index}]`;
183
+ const item = object(entry, label, ['set', 'producer', 'mode', 'entries', 'refreshKeys']);
184
+ const set = name(item.set, `${label}.set`);
185
+ const producer = normalizeProducerRef(item.producer, `${label}.producer`);
186
+ if (item.mode === 'static') {
187
+ object(entry, label, ['set', 'producer', 'mode', 'entries']);
188
+ return { set, producer, mode: 'static', entries: normalizeCommandDefinitions(item.entries, `${label}.entries`) };
189
+ }
190
+ object(entry, label, ['set', 'producer', 'mode', 'refreshKeys']);
191
+ if (item.mode !== 'dynamic')
192
+ throw new Error(`Invalid ${label}.mode.`);
193
+ return { set, producer, mode: 'dynamic', refreshKeys: strings(item.refreshKeys, `${label}.refreshKeys`, true) };
194
+ });
195
+ })();
196
+ if (new Set(packages.map((item) => item.key)).size !== packages.length)
197
+ throw new Error(`Invalid ${field}.packages: duplicate package key.`);
198
+ if (new Set(sets.map((item) => item.set)).size !== sets.length)
199
+ throw new Error(`Invalid ${field}.sets: duplicate set.`);
200
+ return { packages, sets };
201
+ }
202
+ export function normalizeProducerIdentity(value, field = 'producer identity') {
203
+ const input = object(value, field, ['sourceId', 'sourceIdentity', 'pluginName', 'kind', 'key', 'platform', 'scope', 'projectRoot']);
204
+ const sourceId = nonempty(input.sourceId, `${field}.sourceId`);
205
+ if (!/^[a-z][a-z0-9-]{0,31}$/u.test(sourceId))
206
+ throw new Error(`Invalid ${field}.sourceId.`);
207
+ const sourceIdentity = nonempty(input.sourceIdentity, `${field}.sourceIdentity`);
208
+ if (!/^sha256:[0-9a-f]{64}$/u.test(sourceIdentity))
209
+ throw new Error(`Invalid ${field}.sourceIdentity.`);
210
+ const pluginName = nonempty(input.pluginName, `${field}.pluginName`);
211
+ if (!/^[a-z0-9]+(?:-[a-z0-9]+)*$/u.test(pluginName))
212
+ throw new Error(`Invalid ${field}.pluginName.`);
213
+ const kind = enumeration(input.kind, `${field}.kind`, ['artifact', 'static-skill', 'package']);
214
+ const key = nonempty(input.key, `${field}.key`);
215
+ if (kind === 'package')
216
+ name(key, `${field}.key`);
217
+ const platform = kind === 'package'
218
+ ? (input.platform === null ? null : (() => { throw new Error(`Invalid ${field}.platform: package requires null.`); })())
219
+ : enumeration(input.platform, `${field}.platform`, ['codex', 'claude']);
220
+ const scope = enumeration(input.scope, `${field}.scope`, ['user', 'project']);
221
+ let projectRoot = null;
222
+ if (scope === 'user') {
223
+ if (input.projectRoot !== null)
224
+ throw new Error(`Invalid ${field}.projectRoot: user requires null.`);
225
+ }
226
+ else {
227
+ projectRoot = nonempty(input.projectRoot, `${field}.projectRoot`);
228
+ if (!path.isAbsolute(projectRoot))
229
+ throw new Error(`Invalid ${field}.projectRoot: expected a canonical absolute path.`);
230
+ const normalized = path.normalize(projectRoot);
231
+ const canonical = normalized === path.parse(normalized).root ? normalized : normalized.replace(/[\\/]+$/u, '');
232
+ const driveCanonical = process.platform === 'win32' ? canonical.replace(/^[a-z]:/u, (drive) => drive.toUpperCase()) : canonical;
233
+ if (driveCanonical !== projectRoot)
234
+ throw new Error(`Invalid ${field}.projectRoot: expected a canonical absolute path.`);
235
+ }
236
+ return { sourceId, sourceIdentity, pluginName, kind, key, platform, scope, projectRoot };
237
+ }
238
+ export function normalizeCommandIdentity(value, field = 'command identity') {
239
+ const input = object(value, field, ['schemaVersion', 'producer', 'set', 'key', 'variant']);
240
+ if (input.schemaVersion !== 1)
241
+ throw new Error(`Invalid ${field}.schemaVersion: expected 1.`);
242
+ // Identity records have no defaults: every identity field is part of the hash contract.
243
+ if (input.variant === undefined)
244
+ throw new Error(`Invalid ${field}.variant: required.`);
245
+ return { schemaVersion: 1, producer: normalizeProducerIdentity(input.producer, `${field}.producer`), set: name(input.set, `${field}.set`), key: name(input.key, `${field}.key`), variant: name(input.variant, `${field}.variant`) };
246
+ }
247
+ function canonical(value) {
248
+ if (Array.isArray(value))
249
+ return `[${value.map(canonical).join(',')}]`;
250
+ if (value !== null && typeof value === 'object') {
251
+ const input = value;
252
+ return `{${Object.keys(input).sort().map((key) => `${JSON.stringify(key)}:${canonical(input[key])}`).join(',')}}`;
253
+ }
254
+ return JSON.stringify(value);
255
+ }
256
+ export function canonicalizeCommandIdentity(value) { return canonical(normalizeCommandIdentity(value)); }
257
+ export function getPluginCommandId(identity) {
258
+ return `cmdp_${createHash('sha256').update(canonicalizeCommandIdentity(identity), 'utf8').digest('hex')}`;
259
+ }
260
+ export function getCommandPackageId(producer) {
261
+ return `pkg_${createHash('sha256').update(canonical(normalizeProducerIdentity(producer)), 'utf8').digest('hex')}`;
262
+ }
263
+ export function isManagedCommandId(value) { return typeof value === 'string' && (PLUGIN_COMMAND_ID.test(value) || USER_COMMAND_ID.test(value)); }
264
+ export function isUserCommandId(value) { return typeof value === 'string' && USER_COMMAND_ID.test(value); }
265
+ export function isCommandPackageId(value) { return typeof value === 'string' && PACKAGE_ID.test(value); }
266
+ export function normalizeInstalledCommandProducer(value) {
267
+ const input = object(value, 'command producer record', ['schemaVersion', 'producer', 'sets']);
268
+ if (input.schemaVersion !== 1 || !Array.isArray(input.sets))
269
+ throw new Error('Invalid command producer record.');
270
+ const sets = input.sets.map((value, index) => {
271
+ const field = `command producer record.sets[${index}]`;
272
+ const item = object(value, field, ['set', 'state', 'entries']);
273
+ if (Array.isArray(item.entries)) {
274
+ for (const entry of item.entries) {
275
+ const definition = object(entry, `${field}.entries`, ['key', 'variant', 'runner', 'entry', 'args', 'env', 'envFrom', 'cwd']);
276
+ if (['variant', 'args', 'env', 'envFrom', 'cwd'].some((key) => definition[key] === undefined))
277
+ throw new Error(`Invalid ${field}.entries: installed definitions must include defaults.`);
278
+ }
279
+ }
280
+ const entries = normalizeCommandDefinitions(item.entries, `${field}.entries`);
281
+ const state = enumeration(item.state, `${field}.state`, ['present', 'disabled']);
282
+ if (state === 'disabled' && entries.length !== 0)
283
+ throw new Error(`Invalid ${field}: disabled set must have no entries.`);
284
+ return { set: name(item.set, `${field}.set`), state, entries };
285
+ });
286
+ if (new Set(sets.map((item) => item.set)).size !== sets.length)
287
+ throw new Error('Invalid command producer record: duplicate set.');
288
+ return { schemaVersion: 1, producer: normalizeProducerIdentity(input.producer), sets };
289
+ }
290
+ export function normalizeUserCommandDefinition(value) {
291
+ const input = object(value, 'user command definition', ['schemaVersion', 'id', 'name', 'packageRevision', 'launch']);
292
+ if (input.schemaVersion !== 1 || !isUserCommandId(input.id))
293
+ throw new Error('Invalid user command definition identity.');
294
+ const displayName = text(input.name, 'user command definition.name', 128);
295
+ if (displayName.trim().length === 0 || /[\u0000-\u001f\u007f-\u009f]/u.test(displayName))
296
+ throw new Error('Invalid user command definition.name.');
297
+ const packageRevision = text(input.packageRevision, 'user command definition.packageRevision');
298
+ if (!USER_COMMAND_ID.test(`cmdu_${packageRevision}`))
299
+ throw new Error('Invalid user command definition.packageRevision.');
300
+ const launch = object(input.launch, 'user command definition.launch', ['runner', 'entry', 'args', 'env', 'envFrom', 'cwd']);
301
+ if (['args', 'env', 'envFrom', 'cwd'].some((key) => launch[key] === undefined))
302
+ throw new Error('Invalid user command definition.launch: installed launch must include defaults.');
303
+ return { schemaVersion: 1, id: input.id, name: displayName, packageRevision, launch: normalizeCommandLaunch(input.launch) };
304
+ }
305
+ export function parseManagedCommandPlaceholders(value) {
306
+ text(value, 'Skill Markdown');
307
+ const result = [];
308
+ const expression = /\{\{aw\.command:([^}]*)(\}\})?/gu;
309
+ for (const match of value.matchAll(expression)) {
310
+ const parts = match[1].split('/');
311
+ if (match[2] !== '}}' || (parts.length !== 2 && parts.length !== 3))
312
+ throw new Error('commandReferenceInvalid: malformed managed command placeholder.');
313
+ try {
314
+ result.push({ start: match.index, end: match.index + match[0].length, reference: normalizeManagedCommandReference({ set: parts[0], key: parts[1], ...(parts.length === 3 ? { variant: parts[2] } : {}) }) });
315
+ }
316
+ catch {
317
+ throw new Error('commandReferenceInvalid: malformed managed command placeholder.');
318
+ }
319
+ }
320
+ return result;
321
+ }
322
+ export function replaceManagedCommandPlaceholders(value, resolve) {
323
+ let cursor = 0;
324
+ let result = '';
325
+ for (const placeholder of parseManagedCommandPlaceholders(value)) {
326
+ const id = resolve(placeholder.reference);
327
+ if (!isManagedCommandId(id))
328
+ throw new Error('commandReferenceInvalid: resolver returned an invalid command ID.');
329
+ result += value.slice(cursor, placeholder.start) + `aw command run ${id} --`;
330
+ cursor = placeholder.end;
331
+ }
332
+ return result + value.slice(cursor);
333
+ }
334
+ export function validateManagedCommandManifest(manifest) {
335
+ const managed = manifest.managedCommands;
336
+ if (!managed)
337
+ return;
338
+ const validateKeys = (keys, field) => {
339
+ if (keys.length === 0)
340
+ return;
341
+ if (!manifest.config || manifest.config.schemaVersion !== 4)
342
+ throw new Error(`Invalid ${field}: requires Config v4.`);
343
+ for (const key of getPluginConfigDependencyKeys(manifest.config, keys)) {
344
+ if (manifest.config.fields[key]?.sensitive === true)
345
+ throw new Error(`Invalid ${field}: sensitive config dependency is not permitted.`);
346
+ }
347
+ };
348
+ for (const item of managed.packages)
349
+ validateKeys(item.refreshKeys, `managedCommands.packages.${item.key}.refreshKeys`);
350
+ for (const item of managed.sets) {
351
+ if (item.mode === 'dynamic')
352
+ validateKeys(item.refreshKeys, `managedCommands.sets.${item.set}.refreshKeys`);
353
+ const producer = item.producer;
354
+ if (producer.kind === 'package') {
355
+ if (!managed.packages.some((pkg) => pkg.key === producer.packageKey))
356
+ throw new Error(`Invalid managedCommands set ${item.set}: unknown package producer.`);
357
+ }
358
+ else if (producer.kind === 'artifact') {
359
+ const targets = (manifest.artifacts?.targets ?? []).filter((target) => target.id === producer.artifactId);
360
+ if (targets.length !== 1 || !['codex.skill', 'claude.skill'].includes(targets[0].target))
361
+ throw new Error(`Invalid managedCommands set ${item.set}: artifact producer must uniquely identify a platform Skill.`);
362
+ }
363
+ else {
364
+ if (!supportsPlatform(manifest, producer.platform))
365
+ throw new Error(`Invalid managedCommands set ${item.set}: static Skill producer requires ${producer.platform.toUpperCase()} support, but ${formatMarketplaceProductsForError(manifest)}.`);
366
+ if (!manifest.skills || (manifest.artifacts?.targets ?? []).some((target) => target.platform === producer.platform && target.skillKey === producer.skillKey))
367
+ throw new Error(`Invalid managedCommands set ${item.set}: expected a static Skill producer.`);
368
+ }
369
+ }
370
+ if ((managed.packages.some((item) => item.render) || managed.sets.some((item) => item.mode === 'dynamic')) && !manifest.scripts?.artifacts?.render) {
371
+ throw new Error('Invalid managedCommands: dynamic command targets require scripts.artifacts.render.');
372
+ }
373
+ }
374
+ export function getManagedCommandArtifactTargets(manifest) {
375
+ validateManagedCommandManifest(manifest);
376
+ const managed = manifest.managedCommands;
377
+ if (!managed)
378
+ return [];
379
+ const result = managed.packages.filter((pkg) => pkg.render).map((pkg) => ({
380
+ id: `command-package.${pkg.key}`, target: 'aw.command-package', kind: 'commandPackage',
381
+ surface: { kind: 'aw', name: 'managed-commands' }, scopes: [pkg.scope], states: ['present'],
382
+ refreshKeys: [...pkg.refreshKeys], producer: { kind: 'package', packageKey: pkg.key }, packageKey: pkg.key,
383
+ }));
384
+ for (const set of managed.sets) {
385
+ if (set.mode !== 'dynamic')
386
+ continue;
387
+ const base = { id: `command-set.${set.set}`, target: 'aw.command-set', kind: 'commandSet', states: ['present', 'disabled'], refreshKeys: [...set.refreshKeys], producer: set.producer, set: set.set };
388
+ const producer = set.producer;
389
+ if (producer.kind === 'package') {
390
+ const pkg = managed.packages.find((item) => item.key === producer.packageKey);
391
+ result.push({ ...base, surface: { kind: 'aw', name: 'managed-commands' }, scopes: [pkg.scope], packageKey: pkg.key });
392
+ }
393
+ else if (set.producer.kind === 'static-skill') {
394
+ result.push({ ...base, platform: set.producer.platform, surface: { kind: 'platform', platform: set.producer.platform }, scopes: ['user'] });
395
+ }
396
+ else {
397
+ const target = manifest.artifacts.targets.find((item) => item.id === producer.artifactId);
398
+ result.push({ ...base, platform: target.platform, surface: { kind: 'platform', platform: target.platform }, scopes: target.delivery?.mode === 'codex-native' ? ['user'] : [...target.scopes], ...(target.delivery ? { delivery: target.delivery } : {}) });
399
+ }
400
+ }
401
+ return result;
402
+ }
403
+ /** Checks entry path chains after a producer candidate is complete. */
404
+ export async function validateCommandEntryFiles(resourceRoot, entries) {
405
+ const root = await fs.lstat(resourceRoot);
406
+ if (root.isSymbolicLink() || !root.isDirectory())
407
+ throw new Error('Invalid command resource root: expected a regular directory.');
408
+ for (const entry of entries) {
409
+ normalizeCommandDefinition(entry);
410
+ let current = resourceRoot;
411
+ const segments = entry.entry.split('/');
412
+ for (const [index, segment] of segments.entries()) {
413
+ current = path.join(current, segment);
414
+ const stat = await fs.lstat(current).catch(() => undefined);
415
+ if (!stat || stat.isSymbolicLink() || (index === segments.length - 1 ? !stat.isFile() : !stat.isDirectory()))
416
+ throw new Error('Invalid command entry: expected a producer-owned regular file without links.');
417
+ }
418
+ }
419
+ }
420
+ /** Validates the package input closure without following dependency or author-only trees. */
421
+ export async function validateManagedCommandSources(pluginRoot, manifest) {
422
+ for (const set of manifest.managedCommands?.sets ?? []) {
423
+ if (set.producer.kind !== 'static-skill')
424
+ continue;
425
+ const producer = set.producer;
426
+ const sourceRoot = path.join(pluginRoot, manifest.skills.slice(2), producer.skillKey);
427
+ const bundleRoot = path.join(pluginRoot, producer.platform, manifest.skills.slice(2), producer.skillKey);
428
+ const root = await fs.pathExists(sourceRoot) ? sourceRoot : bundleRoot;
429
+ const stat = await fs.lstat(path.join(root, 'SKILL.md')).catch(() => undefined);
430
+ if (!stat || stat.isSymbolicLink() || !stat.isFile())
431
+ throw new Error(`Invalid managed command set ${set.set}: static Skill declaration key does not exist.`);
432
+ }
433
+ for (const pkg of manifest.managedCommands?.packages ?? []) {
434
+ let current = pluginRoot;
435
+ for (const segment of pkg.sourceDir.slice(2).split('/')) {
436
+ current = path.join(current, segment);
437
+ const stat = await fs.lstat(current).catch(() => undefined);
438
+ if (!stat || stat.isSymbolicLink() || !stat.isDirectory())
439
+ throw new Error(`Invalid managed command package ${pkg.key}: sourceDir must be an ordinary directory without links.`);
440
+ }
441
+ const walk = async (directory, relative = '') => {
442
+ for (const entry of await fs.readdir(directory, { withFileTypes: true })) {
443
+ const relativePath = relative ? `${relative}/${entry.name}` : entry.name;
444
+ if (PACKAGE_PROTECTED_NAMES.has(entry.name) || isSkillAuthorOnlyPath(relativePath)) {
445
+ throw new Error(`Invalid managed command package ${pkg.key}: protected or author-only content.`);
446
+ }
447
+ if (entry.isSymbolicLink() || (!entry.isDirectory() && !entry.isFile()))
448
+ throw new Error(`Invalid managed command package ${pkg.key}: only ordinary files and directories are supported.`);
449
+ if (entry.isDirectory())
450
+ await walk(path.join(directory, entry.name), relativePath);
451
+ }
452
+ };
453
+ await walk(current);
454
+ const entries = (manifest.managedCommands?.sets ?? []).flatMap((set) => set.producer.kind === 'package' && set.producer.packageKey === pkg.key && set.mode === 'static' ? set.entries : []);
455
+ await validateCommandEntryFiles(current, entries);
456
+ }
457
+ }
458
+ //# sourceMappingURL=managed-commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"managed-commands.js","sourceRoot":"","sources":["../src/managed-commands.ts"],"names":[],"mappings":"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"}
@@ -6,6 +6,7 @@ import { normalizePluginManifestSchemaVersion, PLUGIN_MANIFEST_SCHEMA_VERSION, S
6
6
  import { getPluginConfigDependencyKeys, normalizePluginConfigDefinition } from './plugin-config.js';
7
7
  import { readJsonFile } from './read-json.js';
8
8
  import { parsePermissionCommand } from './permission-command.js';
9
+ import { normalizeManagedCommands, normalizeManagedCommandPermission, validateManagedCommandManifest, validateManagedCommandSources } from './managed-commands.js';
9
10
  import { applyFileRules } from './file-rules.js';
10
11
  import { resolvePlatformEntries } from './platform-entries.js';
11
12
  import { validatePortableSkillDirectoriesRoot, validatePortableSkillName, } from './portable-skill-validation.js';
@@ -221,14 +222,18 @@ function ensureStringArray(value, fieldName) {
221
222
  return value.map((entry, index) => ensureString(entry, `${fieldName}[${index}]`));
222
223
  }
223
224
  function normalizePermissionCommandArray(value, fieldName) {
224
- if (value === undefined) {
225
+ if (value === undefined)
225
226
  return undefined;
226
- }
227
- const entries = ensureStringArray(value, fieldName);
228
- for (const [index, entry] of entries.entries()) {
229
- parsePermissionCommand(entry, `${fieldName}[${index}]`);
230
- }
231
- return entries;
227
+ if (!Array.isArray(value))
228
+ throw new Error(`Invalid ${fieldName}: expected an array.`);
229
+ return value.map((entry, index) => {
230
+ const label = `${fieldName}[${index}]`;
231
+ if (typeof entry === 'string') {
232
+ parsePermissionCommand(entry, label);
233
+ return entry;
234
+ }
235
+ return normalizeManagedCommandPermission(entry, label);
236
+ });
232
237
  }
233
238
  function normalizeComparableStringArray(value) {
234
239
  if (!value) {
@@ -1067,6 +1072,8 @@ const ARTIFACT_KIND_BY_TARGET = {
1067
1072
  'codex.skill': 'skill',
1068
1073
  'claude.skill': 'skill',
1069
1074
  'agent-skills.skill': 'skill',
1075
+ 'aw.command-set': 'commandSet',
1076
+ 'aw.command-package': 'commandPackage',
1070
1077
  };
1071
1078
  function normalizeArtifactRuntimeImports(value, fieldName, reservedImports) {
1072
1079
  if (value === undefined)
@@ -1272,6 +1279,9 @@ function normalizeArtifactTargetEntry(pluginRoot, entry, fieldName, schema, rese
1272
1279
  ]);
1273
1280
  const id = ensureString(input.id, `${fieldName}.id`);
1274
1281
  validateArtifactId(id, `${fieldName}.id`);
1282
+ if (/^command-(?:set|package)\./u.test(id)) {
1283
+ throw new Error(`Invalid ${fieldName}.id: reserved managed command target prefix.`);
1284
+ }
1275
1285
  const target = normalizeArtifactTarget(input.target, `${fieldName}.target`);
1276
1286
  const delivery = target === 'codex.skill'
1277
1287
  ? normalizeCodexSkillDelivery(input.delivery, `${fieldName}.delivery`)
@@ -1564,7 +1574,7 @@ function normalizePermissionEntry(entry, fieldName) {
1564
1574
  agentOverrides: input.agentOverrides === undefined
1565
1575
  ? undefined
1566
1576
  : normalizePlatformAgentOverrides(input.agentOverrides, `${fieldName}.agentOverrides`, (overrideInput, overrideFieldName) => {
1567
- assertAllowedKeys(overrideInput, overrideFieldName, ['name', 'allow', 'ask', 'deny']);
1577
+ assertAllowedKeys(overrideInput, overrideFieldName, overrideFieldName.endsWith('.claude') ? ['name', 'allow', 'ask', 'deny', 'sandbox'] : ['name', 'allow', 'ask', 'deny']);
1568
1578
  return {
1569
1579
  name: overrideInput.name === undefined
1570
1580
  ? undefined
@@ -1572,6 +1582,15 @@ function normalizePermissionEntry(entry, fieldName) {
1572
1582
  allow: normalizePermissionCommandArray(overrideInput.allow, `${overrideFieldName}.allow`),
1573
1583
  ask: normalizePermissionCommandArray(overrideInput.ask, `${overrideFieldName}.ask`),
1574
1584
  deny: normalizePermissionCommandArray(overrideInput.deny, `${overrideFieldName}.deny`),
1585
+ ...(overrideInput.sandbox === undefined ? {} : {
1586
+ sandbox: (() => {
1587
+ const sandbox = assertObject(overrideInput.sandbox, `${overrideFieldName}.sandbox`);
1588
+ assertAllowedKeys(sandbox, `${overrideFieldName}.sandbox`, ['excludedCommands']);
1589
+ if (!Array.isArray(sandbox.excludedCommands))
1590
+ throw new Error(`Invalid ${overrideFieldName}.sandbox.excludedCommands: expected an array.`);
1591
+ return { excludedCommands: sandbox.excludedCommands.map((value, index) => normalizeManagedCommandPermission(value, `${overrideFieldName}.sandbox.excludedCommands[${index}]`)) };
1592
+ })(),
1593
+ }),
1575
1594
  };
1576
1595
  }),
1577
1596
  };
@@ -1871,6 +1890,7 @@ export function validatePluginManifest(pluginRoot, rawManifest, options = {}) {
1871
1890
  'buildConfig',
1872
1891
  'scripts',
1873
1892
  'config',
1893
+ 'managedCommands',
1874
1894
  ]);
1875
1895
  const manifest = {
1876
1896
  schemaVersion: PLUGIN_MANIFEST_SCHEMA_VERSION,
@@ -1961,6 +1981,10 @@ export function validatePluginManifest(pluginRoot, rawManifest, options = {}) {
1961
1981
  && !manifest.distributions?.agentSkills) {
1962
1982
  throw new Error('Invalid artifacts.targets: agent-skills targets require distributions.agentSkills declaration.');
1963
1983
  }
1984
+ if (input.managedCommands !== undefined) {
1985
+ manifest.managedCommands = normalizeManagedCommands(input.managedCommands);
1986
+ validateManagedCommandManifest(manifest);
1987
+ }
1964
1988
  assertManifestPlatformSupport(manifest.name, manifest);
1965
1989
  assertCodexSharedNativeScopeConsistency(manifest);
1966
1990
  return manifest;
@@ -2147,6 +2171,7 @@ export async function validateSourcePluginManifest(pluginRoot, rawManifest, opti
2147
2171
  }
2148
2172
  await validateDeclaredNativeAssets(pluginRoot, manifest);
2149
2173
  await validateDeclaredAssetPathsExist(pluginRoot, manifest);
2174
+ await validateManagedCommandSources(pluginRoot, manifest);
2150
2175
  await Promise.all([
2151
2176
  validateSourceJsonNativeAsset(pluginRoot, manifest, 'mcpServers'),
2152
2177
  validateSourceJsonNativeAsset(pluginRoot, manifest, 'apps'),
@@ -2173,8 +2198,10 @@ export async function readPluginManifest(pluginRoot, options = {}) {
2173
2198
  reservedImports: options.reservedImports,
2174
2199
  })
2175
2200
  : validatePluginManifest(pluginRoot, rawManifest, { reservedImports: options.reservedImports });
2176
- if (mode === 'bundle')
2201
+ if (mode === 'bundle') {
2202
+ await validateManagedCommandSources(pluginRoot, manifest);
2177
2203
  await assertActualNativePluginCapability(pluginRoot, manifest, 'bundle');
2204
+ }
2178
2205
  return {
2179
2206
  rootDir: pluginRoot,
2180
2207
  manifestPath,