@absolutejs/manifest
Advanced tools
+22
-1
@@ -193,2 +193,10 @@ #!/usr/bin/env bun | ||
| implements: Type.Optional(Type.Array(adapterImplementation)), | ||
| integration: Type.Optional(Type.Object({ | ||
| description: Type.Optional(Type.String({ minLength: 1 })), | ||
| mode: Type.Union([ | ||
| Type.Literal("adapter"), | ||
| Type.Literal("code-first"), | ||
| Type.Literal("recipe") | ||
| ]) | ||
| })), | ||
| lifecycle: Type.Optional(Type.Array(lifecycleStep)), | ||
@@ -373,2 +381,12 @@ presets: Type.Optional(Type.Array(Type.Object({ | ||
| }; | ||
| var integrationFailure = (manifest) => { | ||
| const mode = manifest.integration?.mode; | ||
| if (mode === "recipe" && manifest.wiring.length === 0) | ||
| return 'integration mode "recipe" requires at least one wiring recipe'; | ||
| if (mode === "adapter" && (manifest.implements?.length ?? 0) === 0) | ||
| return 'integration mode "adapter" requires at least one implementation'; | ||
| if (mode === "code-first" && manifest.wiring.length > 0) | ||
| return 'integration mode "code-first" cannot declare automatic wiring recipes'; | ||
| return; | ||
| }; | ||
| var validate = (candidate, source) => { | ||
@@ -379,2 +397,5 @@ if (!isManifestShaped(candidate)) | ||
| if (Value.Check(manifestSchema, projected)) { | ||
| const invalidIntegration = integrationFailure(candidate); | ||
| if (invalidIntegration) | ||
| return invalid(invalidIntegration); | ||
| if (candidate.contract === 1 && Object.values(candidate.tools ?? {}).some((tool) => tool.authorization !== undefined)) | ||
@@ -762,3 +783,3 @@ return invalid("tool authorization metadata requires manifest contract 2"); | ||
| //# debugId=158590DDEB43CAE864756E2164756E21 | ||
| //# debugId=6F9C6BAFFBC1EA6864756E2164756E21 | ||
| //# sourceMappingURL=cli.js.map |
+1
-1
@@ -16,2 +16,2 @@ export { defineImplementation, defineManifest } from "./defineManifest"; | ||
| export type { ManifestSecurityPosture, ManifestToolSecurityCode, ManifestToolSecurityIssue, ManifestToolSecurityPosture, } from "./security"; | ||
| export type { AdapterImplementation, AdapterSlot, AnyPackageManifest, AuthorizedManifestTool, AuthorizedRuntimeTool, AuthorizedWorkspaceTool, BridgedAITool, BridgedMcpTool, ClientFramework, EnvRequirement, LifecycleStep, ManifestCategory, ManifestIdentity, ManifestDiscovery, ManifestRequirements, ManifestTool, LegacyManifestTool, LegacyRuntimeTool, LegacyWorkspaceTool, PackageManifest, PeerRequirement, RuntimeTool, ServiceRequirement, SettingsOf, SettingsPreset, ToolAnnotations, ToolAuthorization, ToolAuthorizationRequest, ToolAudience, ToolBindings, ToolEffect, ToolEnforcement, ToolExecution, ToolIdempotencyBinding, ToolResourceBinding, ToolSpendBinding, WiringImport, WiringPlacement, WiringRecipe, WiringSnippet, Workspace, WorkspaceCapability, WorkspaceTool, } from "./types"; | ||
| export type { AdapterImplementation, AdapterSlot, AnyPackageManifest, AuthorizedManifestTool, AuthorizedRuntimeTool, AuthorizedWorkspaceTool, BridgedAITool, BridgedMcpTool, ClientFramework, EnvRequirement, LifecycleStep, ManifestCategory, ManifestIdentity, ManifestIntegration, ManifestDiscovery, ManifestRequirements, ManifestTool, LegacyManifestTool, LegacyRuntimeTool, LegacyWorkspaceTool, PackageManifest, PeerRequirement, RuntimeTool, ServiceRequirement, SettingsOf, SettingsPreset, ToolAnnotations, ToolAuthorization, ToolAuthorizationRequest, ToolAudience, ToolBindings, ToolEffect, ToolEnforcement, ToolExecution, ToolIdempotencyBinding, ToolResourceBinding, ToolSpendBinding, WiringImport, WiringPlacement, WiringRecipe, WiringSnippet, Workspace, WorkspaceCapability, WorkspaceTool, } from "./types"; |
+22
-1
@@ -531,2 +531,10 @@ // @bun | ||
| implements: Type.Optional(Type.Array(adapterImplementation)), | ||
| integration: Type.Optional(Type.Object({ | ||
| description: Type.Optional(Type.String({ minLength: 1 })), | ||
| mode: Type.Union([ | ||
| Type.Literal("adapter"), | ||
| Type.Literal("code-first"), | ||
| Type.Literal("recipe") | ||
| ]) | ||
| })), | ||
| lifecycle: Type.Optional(Type.Array(lifecycleStep)), | ||
@@ -584,2 +592,12 @@ presets: Type.Optional(Type.Array(Type.Object({ | ||
| }; | ||
| var integrationFailure = (manifest) => { | ||
| const mode = manifest.integration?.mode; | ||
| if (mode === "recipe" && manifest.wiring.length === 0) | ||
| return 'integration mode "recipe" requires at least one wiring recipe'; | ||
| if (mode === "adapter" && (manifest.implements?.length ?? 0) === 0) | ||
| return 'integration mode "adapter" requires at least one implementation'; | ||
| if (mode === "code-first" && manifest.wiring.length > 0) | ||
| return 'integration mode "code-first" cannot declare automatic wiring recipes'; | ||
| return; | ||
| }; | ||
| var validate = (candidate, source) => { | ||
@@ -590,2 +608,5 @@ if (!isManifestShaped(candidate)) | ||
| if (Value2.Check(manifestSchema, projected)) { | ||
| const invalidIntegration = integrationFailure(candidate); | ||
| if (invalidIntegration) | ||
| return invalid(invalidIntegration); | ||
| if (candidate.contract === 1 && Object.values(candidate.tools ?? {}).some((tool) => tool.authorization !== undefined)) | ||
@@ -792,3 +813,3 @@ return invalid("tool authorization metadata requires manifest contract 2"); | ||
| //# debugId=D1FD94F105058A1964756E2164756E21 | ||
| //# debugId=39F6B9A4611BBF5A64756E2164756E21 | ||
| //# sourceMappingURL=index.js.map |
+4
-0
@@ -61,2 +61,6 @@ import { type AnyPackageManifest } from "./types"; | ||
| }>>>; | ||
| integration: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{ | ||
| description: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>; | ||
| mode: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"adapter">, import("@sinclair/typebox").TLiteral<"code-first">, import("@sinclair/typebox").TLiteral<"recipe">]>; | ||
| }>>; | ||
| lifecycle: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{ | ||
@@ -63,0 +67,0 @@ command: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>; |
+15
-0
@@ -33,2 +33,16 @@ import type { Static, TSchema } from "@sinclair/typebox"; | ||
| }; | ||
| /** | ||
| * How a no-code host may integrate this package. | ||
| * | ||
| * `recipe` packages own at least one executable wiring recipe. `adapter` | ||
| * packages implement a named slot contract. `code-first` packages are | ||
| * discoverable ecosystem building blocks whose production integration needs | ||
| * host-owned instances, policies, stores, signers, or callbacks and must not | ||
| * be represented as one-click wiring. | ||
| */ | ||
| export type ManifestIntegration = { | ||
| mode: "adapter" | "code-first" | "recipe"; | ||
| /** Plain-language explanation shown when automatic wiring is unavailable. */ | ||
| description?: string; | ||
| }; | ||
| export type EnvRequirement = { | ||
@@ -276,2 +290,3 @@ /** 'GOOGLE_CLIENT_SECRET' */ | ||
| identity: ManifestIdentity; | ||
| integration?: ManifestIntegration; | ||
| discovery?: ManifestDiscovery; | ||
@@ -278,0 +293,0 @@ requires?: ManifestRequirements; |
+1
-1
| { | ||
| "name": "@absolutejs/manifest", | ||
| "version": "0.7.2", | ||
| "version": "0.7.3", | ||
| "description": "The AbsoluteJS package manifest contract. Every @absolutejs/* package exports a typed manifest (settings schema, env requirements, adapter slots, wiring recipes, AI tools) from its ./manifest subpath; this package is the contract those manifests are written against, plus bridges that turn any manifest into an AI tool map or a remote MCP tool registry.", | ||
@@ -5,0 +5,0 @@ "repository": { |
+16
-0
@@ -54,2 +54,18 @@ # @absolutejs/manifest | ||
| ## No-code integration role | ||
| Packages explicitly describe how a no-code host may integrate them: | ||
| - `integration: { mode: "recipe" }` owns executable wiring and must publish at | ||
| least one wiring recipe. | ||
| - `integration: { mode: "adapter" }` fills a named ecosystem slot and must | ||
| publish at least one `implements` entry. | ||
| - `integration: { mode: "code-first", description: "…" }` remains searchable | ||
| and explainable, but the host must not pretend it can automatically assemble | ||
| production-specific stores, policies, signers, callbacks, or identities. | ||
| Older manifests without this field remain valid for compatibility. Consumers | ||
| may retain their historical inference for those packages, but current | ||
| manifests should declare the role explicitly. | ||
| ## Why TypeBox | ||
@@ -56,0 +72,0 @@ |
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
314351
2.61%2436
2.57%263
6.48%