@lesliechan721/aw-plugin-core 0.1.0-beta.6 → 0.1.0-beta.60

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 (58) hide show
  1. package/dist/aw-capabilities.d.ts +27 -0
  2. package/dist/aw-capabilities.js +117 -0
  3. package/dist/aw-capabilities.js.map +1 -0
  4. package/dist/catalog-file-modes.d.ts +5 -0
  5. package/dist/catalog-file-modes.js +67 -0
  6. package/dist/catalog-file-modes.js.map +1 -0
  7. package/dist/catalog-workspace-resolution.d.ts +3 -0
  8. package/dist/catalog-workspace-resolution.js +34 -0
  9. package/dist/catalog-workspace-resolution.js.map +1 -0
  10. package/dist/generated/plugin-manifest-v3.d.ts +1532 -0
  11. package/dist/generated/{plugin-manifest-v1.js → plugin-manifest-v3.js} +1 -1
  12. package/dist/generated/plugin-manifest-v3.js.map +1 -0
  13. package/dist/index.d.ts +3 -2
  14. package/dist/index.js +2 -1
  15. package/dist/index.js.map +1 -1
  16. package/dist/managed-commands.d.ts +167 -0
  17. package/dist/managed-commands.js +463 -0
  18. package/dist/managed-commands.js.map +1 -0
  19. package/dist/manifest-contract.d.ts +3 -6
  20. package/dist/manifest-contract.js +271 -407
  21. package/dist/manifest-contract.js.map +1 -1
  22. package/dist/manifest-type-contract.d.ts +2 -2
  23. package/dist/manifest.d.ts +12 -8
  24. package/dist/manifest.js +18 -7
  25. package/dist/manifest.js.map +1 -1
  26. package/dist/native-runtime/reader-runtime.mjs +34 -0
  27. package/dist/native-runtime/reader.d.mts +6 -0
  28. package/dist/native-runtime/reader.mjs +11 -0
  29. package/dist/native-tools.d.ts +48 -0
  30. package/dist/native-tools.js +192 -0
  31. package/dist/native-tools.js.map +1 -0
  32. package/dist/plugin-authoring-capabilities.d.ts +1 -1
  33. package/dist/plugin-authoring-capabilities.js +133 -26
  34. package/dist/plugin-authoring-capabilities.js.map +1 -1
  35. package/dist/plugin-config.d.ts +47 -0
  36. package/dist/plugin-config.js +1355 -0
  37. package/dist/plugin-config.js.map +1 -0
  38. package/dist/plugin-requirements.d.ts +34 -0
  39. package/dist/plugin-requirements.js +300 -0
  40. package/dist/plugin-requirements.js.map +1 -0
  41. package/dist/plugin-script-contract.d.ts +11 -12
  42. package/dist/plugin-script-contract.js +44 -71
  43. package/dist/plugin-script-contract.js.map +1 -1
  44. package/dist/runtime-config.d.ts +38 -0
  45. package/dist/runtime-config.js +31 -0
  46. package/dist/runtime-config.js.map +1 -0
  47. package/dist/types.d.ts +266 -73
  48. package/dist/workspace.d.ts +37 -9
  49. package/dist/workspace.js +419 -191
  50. package/dist/workspace.js.map +1 -1
  51. package/package.json +16 -6
  52. package/schemas/plugin-manifest-v3.json +2655 -0
  53. package/dist/generated/plugin-manifest-v1.d.ts +0 -368
  54. package/dist/generated/plugin-manifest-v1.js.map +0 -1
  55. package/dist/plugin-release.d.ts +0 -30
  56. package/dist/plugin-release.js +0 -187
  57. package/dist/plugin-release.js.map +0 -1
  58. package/schemas/plugin-manifest-v1.json +0 -329
@@ -0,0 +1,27 @@
1
+ export declare const AW_CAPABILITY_IDS: readonly ["aw.plugin-manifest.v3", "aw.plugin-skills.v1", "aw.plugin-build-config.v1", "aw.plugin-config.v2", "aw.plugin-config.v3", "aw.plugin-config.v4", "aw.plugin-config-array.v1", "aw.plugin-config-unique-by.v1", "aw.plugin-config-value-ref.v1", "aw.plugin-config-summary.v1", "aw.plugin-pre-apply.v1", "aw.dynamic-artifacts.v2", "aw.managed-commands.v1", "aw.native-tools.v2", "aw.claude.sandbox-exclusions.v1", "aw.portable-skills.v1", "aw.runtime-imports.v1", "aw.installed-runtime-config.v2", "aw.skill-validation.v1", "aw.skill-eval.v2", "aw.plugin-authoring.v1", "aw.catalog-authoring.v1", "aw.catalog-source.v2", "aw.catalog-dev-source.v1", "aw.catalog-publication.v1", "aw.review-preparation.v1", "aw.review-inspection.v2", "aw.catalog-snapshot.v7", "aw.self-check.v1"];
2
+ export type RegisteredAwCapabilityId = typeof AW_CAPABILITY_IDS[number];
3
+ export type AwCapabilityId = string;
4
+ export interface AwCapabilitySupport {
5
+ supported: boolean;
6
+ missing: AwCapabilityId[];
7
+ }
8
+ export declare function assertAwCapabilityId(value: unknown, fieldName?: string): asserts value is AwCapabilityId;
9
+ export declare function normalizeAwCapabilities(values: readonly unknown[], fieldName?: string): AwCapabilityId[];
10
+ export declare function getAwCapabilityRegistry(): readonly RegisteredAwCapabilityId[];
11
+ export declare function computeAwCapabilitySetDigest(values: readonly unknown[]): string;
12
+ export declare function checkAwCapabilitySupport(required: readonly unknown[], implemented: readonly unknown[]): AwCapabilitySupport;
13
+ export interface AwPluginRequirementsReceiptV1 {
14
+ schemaVersion: 1;
15
+ kind: 'aw-plugin-requirements';
16
+ plugin: {
17
+ name: string;
18
+ version: string;
19
+ };
20
+ requiredCapabilities: AwCapabilityId[];
21
+ digest: string;
22
+ }
23
+ export declare function createAwPluginRequirementsReceipt(plugin: {
24
+ name: string;
25
+ version: string;
26
+ }, requiredCapabilities: readonly unknown[]): AwPluginRequirementsReceiptV1;
27
+ export declare function parseAwPluginRequirementsReceipt(value: unknown): AwPluginRequirementsReceiptV1;
@@ -0,0 +1,117 @@
1
+ import { createHash } from 'node:crypto';
2
+ export const AW_CAPABILITY_IDS = [
3
+ 'aw.plugin-manifest.v3',
4
+ 'aw.plugin-skills.v1',
5
+ 'aw.plugin-build-config.v1',
6
+ 'aw.plugin-config.v2',
7
+ 'aw.plugin-config.v3',
8
+ 'aw.plugin-config.v4',
9
+ 'aw.plugin-config-array.v1',
10
+ 'aw.plugin-config-unique-by.v1',
11
+ 'aw.plugin-config-value-ref.v1',
12
+ 'aw.plugin-config-summary.v1',
13
+ 'aw.plugin-pre-apply.v1',
14
+ 'aw.dynamic-artifacts.v2',
15
+ 'aw.managed-commands.v1',
16
+ 'aw.native-tools.v2',
17
+ 'aw.claude.sandbox-exclusions.v1',
18
+ 'aw.portable-skills.v1',
19
+ 'aw.runtime-imports.v1',
20
+ 'aw.installed-runtime-config.v2',
21
+ 'aw.skill-validation.v1',
22
+ 'aw.skill-eval.v2',
23
+ 'aw.plugin-authoring.v1',
24
+ 'aw.catalog-authoring.v1',
25
+ 'aw.catalog-source.v2',
26
+ 'aw.catalog-dev-source.v1',
27
+ 'aw.catalog-publication.v1',
28
+ 'aw.review-preparation.v1',
29
+ 'aw.review-inspection.v2',
30
+ 'aw.catalog-snapshot.v7',
31
+ 'aw.self-check.v1',
32
+ ];
33
+ const CAPABILITY_ID_PATTERN = /^aw\.[a-z0-9]+(?:-[a-z0-9]+)*(?:\.[a-z0-9]+(?:-[a-z0-9]+)*)*\.v[1-9][0-9]*$/u;
34
+ const CAPABILITY_SET_DIGEST_DOMAIN = 'aw-capability-set-v1\0';
35
+ const PLUGIN_NAME_PATTERN = /^[a-z0-9]+(?:-[a-z0-9]+)*$/u;
36
+ const STRICT_SEMVER_PATTERN = /^(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)(?:-((?:0|[1-9][0-9]*|(?:[0-9A-Za-z-]*[A-Za-z-][0-9A-Za-z-]*))(?:\.(?:0|[1-9][0-9]*|(?:[0-9A-Za-z-]*[A-Za-z-][0-9A-Za-z-]*)))*))?(?:\+([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?$/u;
37
+ export function assertAwCapabilityId(value, fieldName = 'capability') {
38
+ if (typeof value !== 'string' || !CAPABILITY_ID_PATTERN.test(value)) {
39
+ throw new Error(`Invalid ${fieldName}: expected an AW capability ID.`);
40
+ }
41
+ }
42
+ export function normalizeAwCapabilities(values, fieldName = 'capabilities') {
43
+ const normalized = new Set();
44
+ values.forEach((value, index) => {
45
+ assertAwCapabilityId(value, `${fieldName}[${index}]`);
46
+ normalized.add(value);
47
+ });
48
+ return [...normalized].sort((left, right) => left < right ? -1 : left > right ? 1 : 0);
49
+ }
50
+ export function getAwCapabilityRegistry() {
51
+ const normalized = normalizeAwCapabilities(AW_CAPABILITY_IDS);
52
+ if (normalized.length !== AW_CAPABILITY_IDS.length) {
53
+ throw new Error('Invalid AW capability registry: capability IDs must be unique.');
54
+ }
55
+ return AW_CAPABILITY_IDS;
56
+ }
57
+ export function computeAwCapabilitySetDigest(values) {
58
+ const canonical = JSON.stringify(normalizeAwCapabilities(values));
59
+ return `sha256:${createHash('sha256').update(CAPABILITY_SET_DIGEST_DOMAIN).update(canonical).digest('hex')}`;
60
+ }
61
+ export function checkAwCapabilitySupport(required, implemented) {
62
+ const supported = new Set(normalizeAwCapabilities(implemented, 'implementedCapabilities'));
63
+ const missing = normalizeAwCapabilities(required, 'requiredCapabilities')
64
+ .filter((capability) => !supported.has(capability));
65
+ return { supported: missing.length === 0, missing };
66
+ }
67
+ export function createAwPluginRequirementsReceipt(plugin, requiredCapabilities) {
68
+ const normalized = normalizeAwCapabilities(requiredCapabilities);
69
+ return {
70
+ schemaVersion: 1,
71
+ kind: 'aw-plugin-requirements',
72
+ plugin,
73
+ requiredCapabilities: normalized,
74
+ digest: computeAwCapabilitySetDigest(normalized),
75
+ };
76
+ }
77
+ function assertRecord(value, fieldName) {
78
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
79
+ throw new Error(`Invalid ${fieldName}: expected an object.`);
80
+ }
81
+ }
82
+ function assertExactKeys(value, keys, fieldName) {
83
+ const extras = Object.keys(value).filter((key) => !keys.includes(key));
84
+ if (extras.length > 0)
85
+ throw new Error(`Invalid ${fieldName}: unknown field ${JSON.stringify(extras[0])}.`);
86
+ }
87
+ export function parseAwPluginRequirementsReceipt(value) {
88
+ assertRecord(value, 'AW plugin requirements receipt');
89
+ assertExactKeys(value, ['schemaVersion', 'kind', 'plugin', 'requiredCapabilities', 'digest'], 'AW plugin requirements receipt');
90
+ if (value.schemaVersion !== 1)
91
+ throw new Error('Invalid AW plugin requirements receipt.schemaVersion: expected 1.');
92
+ if (value.kind !== 'aw-plugin-requirements')
93
+ throw new Error('Invalid AW plugin requirements receipt.kind.');
94
+ assertRecord(value.plugin, 'AW plugin requirements receipt.plugin');
95
+ assertExactKeys(value.plugin, ['name', 'version'], 'AW plugin requirements receipt.plugin');
96
+ if (typeof value.plugin.name !== 'string' || !PLUGIN_NAME_PATTERN.test(value.plugin.name)) {
97
+ throw new Error('Invalid AW plugin requirements receipt.plugin.name.');
98
+ }
99
+ if (typeof value.plugin.version !== 'string' || !STRICT_SEMVER_PATTERN.test(value.plugin.version)) {
100
+ throw new Error('Invalid AW plugin requirements receipt.plugin.version.');
101
+ }
102
+ if (!Array.isArray(value.requiredCapabilities)) {
103
+ throw new Error('Invalid AW plugin requirements receipt.requiredCapabilities: expected an array.');
104
+ }
105
+ const requiredCapabilities = normalizeAwCapabilities(value.requiredCapabilities, 'AW plugin requirements receipt.requiredCapabilities');
106
+ if (typeof value.digest !== 'string' || value.digest !== computeAwCapabilitySetDigest(requiredCapabilities)) {
107
+ throw new Error('Invalid AW plugin requirements receipt.digest.');
108
+ }
109
+ return {
110
+ schemaVersion: 1,
111
+ kind: 'aw-plugin-requirements',
112
+ plugin: { name: value.plugin.name, version: value.plugin.version },
113
+ requiredCapabilities,
114
+ digest: value.digest,
115
+ };
116
+ }
117
+ //# sourceMappingURL=aw-capabilities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aw-capabilities.js","sourceRoot":"","sources":["../src/aw-capabilities.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare const CATALOG_EXECUTABLE_FILES_PATH = ".agents-plugin/aw-executable-files.json";
2
+ export declare function listCatalogBundleFiles(root: string, relative?: string): Promise<string[]>;
3
+ export declare function writeCatalogExecutableFiles(pluginRoot: string): Promise<void>;
4
+ export declare function readCatalogExecutableFiles(pluginRoot: string, files: readonly string[]): Promise<ReadonlySet<string> | undefined>;
5
+ export declare function catalogFileMode(relativePath: string, mode: number, executableFiles?: ReadonlySet<string>): '100644' | '100755';
@@ -0,0 +1,67 @@
1
+ import path from 'node:path';
2
+ import fs from 'fs-extra';
3
+ export const CATALOG_EXECUTABLE_FILES_PATH = '.agents-plugin/aw-executable-files.json';
4
+ export async function listCatalogBundleFiles(root, relative = '') {
5
+ const result = [];
6
+ for (const entry of await fs.readdir(path.join(root, relative), { withFileTypes: true })) {
7
+ const child = relative ? path.posix.join(relative, entry.name) : entry.name;
8
+ if (entry.isDirectory())
9
+ result.push(...await listCatalogBundleFiles(root, child));
10
+ else
11
+ result.push(child);
12
+ }
13
+ return result.sort();
14
+ }
15
+ export async function writeCatalogExecutableFiles(pluginRoot) {
16
+ const metadataPath = path.join(pluginRoot, CATALOG_EXECUTABLE_FILES_PATH);
17
+ const existing = await fs.lstat(metadataPath).catch((error) => {
18
+ if (error.code === 'ENOENT')
19
+ return null;
20
+ throw error;
21
+ });
22
+ if (existing && !existing.isFile()) {
23
+ throw new Error('Catalog executable file metadata must be a regular file.');
24
+ }
25
+ const executableFiles = [];
26
+ for (const relative of await listCatalogBundleFiles(pluginRoot)) {
27
+ if (relative === CATALOG_EXECUTABLE_FILES_PATH)
28
+ continue;
29
+ const stat = await fs.lstat(path.join(pluginRoot, relative));
30
+ if (stat.isFile() && (stat.mode & 0o100) !== 0)
31
+ executableFiles.push(relative);
32
+ }
33
+ if (executableFiles.length === 0) {
34
+ if (existing)
35
+ await fs.unlink(metadataPath);
36
+ return;
37
+ }
38
+ await fs.outputFile(metadataPath, `${JSON.stringify(executableFiles, null, 2)}\n`);
39
+ await fs.chmod(metadataPath, 0o644);
40
+ }
41
+ export async function readCatalogExecutableFiles(pluginRoot, files) {
42
+ if (!files.includes(CATALOG_EXECUTABLE_FILES_PATH))
43
+ return undefined;
44
+ const metadataPath = path.join(pluginRoot, CATALOG_EXECUTABLE_FILES_PATH);
45
+ if (!(await fs.lstat(metadataPath)).isFile()) {
46
+ throw new Error('Catalog executable file metadata must be a regular file.');
47
+ }
48
+ const input = await fs.readJson(metadataPath);
49
+ const inventory = new Set(files);
50
+ if (!Array.isArray(input) || input.some((relative, index) => typeof relative !== 'string'
51
+ || /[\\:\u0000-\u001f]/u.test(relative)
52
+ || relative === CATALOG_EXECUTABLE_FILES_PATH
53
+ || !inventory.has(relative)
54
+ || (index > 0 && input[index - 1] >= relative))) {
55
+ throw new Error('Invalid Catalog executable file metadata.');
56
+ }
57
+ return new Set(input);
58
+ }
59
+ export function catalogFileMode(relativePath, mode, executableFiles) {
60
+ // Windows does not retain Unix execute bits. The inventory is itself bound
61
+ // by the Catalog digests; Unix still verifies the actual file permissions.
62
+ const executable = process.platform === 'win32' && executableFiles !== undefined
63
+ ? executableFiles.has(relativePath)
64
+ : (mode & 0o100) !== 0;
65
+ return executable ? '100755' : '100644';
66
+ }
67
+ //# sourceMappingURL=catalog-file-modes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog-file-modes.js","sourceRoot":"","sources":["../src/catalog-file-modes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function findNearestCatalogWorkspaceRoot(options: {
2
+ from: string;
3
+ }): Promise<string | null>;
@@ -0,0 +1,34 @@
1
+ import path from 'node:path';
2
+ import fs from 'fs-extra';
3
+ import { CATALOG_WORKSPACE_MARKER_FILENAME, readCatalogWorkspaceMarker, } from './workspace.js';
4
+ async function startDirectory(value) {
5
+ const resolved = path.resolve(value);
6
+ const stat = await fs.lstat(resolved).catch((error) => {
7
+ if (error.code === 'ENOENT')
8
+ return null;
9
+ throw error;
10
+ });
11
+ if (stat?.isSymbolicLink())
12
+ throw new Error(`Catalog Workspace discovery path must not be a symbolic link: ${resolved}`);
13
+ return stat?.isFile() ? path.dirname(resolved) : resolved;
14
+ }
15
+ export async function findNearestCatalogWorkspaceRoot(options) {
16
+ let current = await startDirectory(options.from);
17
+ for (;;) {
18
+ const markerPath = path.join(current, CATALOG_WORKSPACE_MARKER_FILENAME);
19
+ const markerStat = await fs.lstat(markerPath).catch((error) => {
20
+ if (error.code === 'ENOENT')
21
+ return null;
22
+ throw error;
23
+ });
24
+ if (markerStat) {
25
+ await readCatalogWorkspaceMarker(current);
26
+ return fs.realpath(current);
27
+ }
28
+ const parent = path.dirname(current);
29
+ if (parent === current)
30
+ return null;
31
+ current = parent;
32
+ }
33
+ }
34
+ //# sourceMappingURL=catalog-workspace-resolution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog-workspace-resolution.js","sourceRoot":"","sources":["../src/catalog-workspace-resolution.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,OAAO,EAAE,MAAM,UAAU,CAAA;AAEzB,OAAO,EACL,iCAAiC,EACjC,0BAA0B,GAC3B,MAAM,gBAAgB,CAAA;AAEvB,KAAK,UAAU,cAAc,CAAC,KAAa;IACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;IACpC,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,KAA4B,EAAE,EAAE;QAC3E,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAA;QACxC,MAAM,KAAK,CAAA;IACb,CAAC,CAAC,CAAA;IACF,IAAI,IAAI,EAAE,cAAc,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,iEAAiE,QAAQ,EAAE,CAAC,CAAA;IACxH,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAA;AAC3D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,+BAA+B,CAAC,OAErD;IACC,IAAI,OAAO,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IAChD,SAAS,CAAC;QACR,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,iCAAiC,CAAC,CAAA;QACxE,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,CAAC,KAA4B,EAAE,EAAE;YACnF,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;gBAAE,OAAO,IAAI,CAAA;YACxC,MAAM,KAAK,CAAA;QACb,CAAC,CAAC,CAAA;QACF,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,0BAA0B,CAAC,OAAO,CAAC,CAAA;YACzC,OAAO,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;QAC7B,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;QACpC,IAAI,MAAM,KAAK,OAAO;YAAE,OAAO,IAAI,CAAA;QACnC,OAAO,GAAG,MAAM,CAAA;IAClB,CAAC;AACH,CAAC"}