@pulsemcp/air-core 0.0.1
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/README.md +60 -0
- package/dist/config.d.ts +27 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +112 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/schemas.d.ts +12 -0
- package/dist/schemas.d.ts.map +1 -0
- package/dist/schemas.js +84 -0
- package/dist/schemas.js.map +1 -0
- package/dist/types.d.ts +175 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/validator.d.ts +11 -0
- package/dist/validator.d.ts.map +1 -0
- package/dist/validator.js +19 -0
- package/dist/validator.js.map +1 -0
- package/package.json +46 -0
- package/schemas/air.schema.json +57 -0
- package/schemas/hooks.schema.json +88 -0
- package/schemas/mcp.schema.json +135 -0
- package/schemas/plugins.schema.json +76 -0
- package/schemas/references.schema.json +52 -0
- package/schemas/roots.schema.json +97 -0
- package/schemas/schemas/air.schema.json +57 -0
- package/schemas/schemas/hooks.schema.json +88 -0
- package/schemas/schemas/mcp.schema.json +135 -0
- package/schemas/schemas/plugins.schema.json +76 -0
- package/schemas/schemas/references.schema.json +52 -0
- package/schemas/schemas/roots.schema.json +97 -0
- package/schemas/schemas/skills.schema.json +59 -0
- package/schemas/skills.schema.json +59 -0
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"$id": "https://raw.githubusercontent.com/pulsemcp/air/main/schemas/air.schema.json",
|
|
4
|
+
"title": "AIR Configuration",
|
|
5
|
+
"description": "Root configuration file for the AIR framework. Points to artifact index files that define skills, MCP servers, plugins, roots, hooks, and references. Each artifact property is an array of paths — files are loaded and merged in order, with later entries overriding earlier ones by ID.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"properties": {
|
|
8
|
+
"$schema": {
|
|
9
|
+
"type": "string",
|
|
10
|
+
"description": "JSON Schema reference for validation."
|
|
11
|
+
},
|
|
12
|
+
"name": {
|
|
13
|
+
"type": "string",
|
|
14
|
+
"minLength": 1,
|
|
15
|
+
"maxLength": 100,
|
|
16
|
+
"pattern": "^[a-zA-Z0-9_-]+$",
|
|
17
|
+
"description": "Unique identifier for this AIR configuration."
|
|
18
|
+
},
|
|
19
|
+
"description": {
|
|
20
|
+
"type": "string",
|
|
21
|
+
"maxLength": 500,
|
|
22
|
+
"description": "Human-readable description of this AIR configuration scope (e.g., 'Acme Corp engineering team agent configs')."
|
|
23
|
+
},
|
|
24
|
+
"skills": {
|
|
25
|
+
"type": "array",
|
|
26
|
+
"items": { "type": "string" },
|
|
27
|
+
"description": "Paths to skills index files. Merged in order — later entries override earlier ones by ID."
|
|
28
|
+
},
|
|
29
|
+
"references": {
|
|
30
|
+
"type": "array",
|
|
31
|
+
"items": { "type": "string" },
|
|
32
|
+
"description": "Paths to references index files. Merged in order — later entries override earlier ones by ID."
|
|
33
|
+
},
|
|
34
|
+
"mcp": {
|
|
35
|
+
"type": "array",
|
|
36
|
+
"items": { "type": "string" },
|
|
37
|
+
"description": "Paths to MCP server configuration files. Merged in order — later entries override earlier ones by ID."
|
|
38
|
+
},
|
|
39
|
+
"plugins": {
|
|
40
|
+
"type": "array",
|
|
41
|
+
"items": { "type": "string" },
|
|
42
|
+
"description": "Paths to plugins index files. Merged in order — later entries override earlier ones by ID."
|
|
43
|
+
},
|
|
44
|
+
"roots": {
|
|
45
|
+
"type": "array",
|
|
46
|
+
"items": { "type": "string" },
|
|
47
|
+
"description": "Paths to roots index files. Merged in order — later entries override earlier ones by ID."
|
|
48
|
+
},
|
|
49
|
+
"hooks": {
|
|
50
|
+
"type": "array",
|
|
51
|
+
"items": { "type": "string" },
|
|
52
|
+
"description": "Paths to hooks index files. Merged in order — later entries override earlier ones by ID."
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
"required": ["name"],
|
|
56
|
+
"additionalProperties": false
|
|
57
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"$id": "https://raw.githubusercontent.com/pulsemcp/air/main/schemas/hooks.schema.json",
|
|
4
|
+
"title": "AIR Hooks Index",
|
|
5
|
+
"description": "Index of hooks that run in response to agent lifecycle events. Hooks are shell commands triggered at specific points during an agent session.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"properties": {
|
|
8
|
+
"$schema": {
|
|
9
|
+
"type": "string",
|
|
10
|
+
"description": "JSON Schema reference for validation."
|
|
11
|
+
}
|
|
12
|
+
},
|
|
13
|
+
"additionalProperties": {
|
|
14
|
+
"$ref": "#/$defs/Hook"
|
|
15
|
+
},
|
|
16
|
+
"propertyNames": {
|
|
17
|
+
"pattern": "^[$a-zA-Z0-9_-]+$",
|
|
18
|
+
"description": "Hook identifier key. Must be alphanumeric with hyphens or underscores."
|
|
19
|
+
},
|
|
20
|
+
"$defs": {
|
|
21
|
+
"Hook": {
|
|
22
|
+
"type": "object",
|
|
23
|
+
"description": "A hook that runs a command in response to an agent lifecycle event.",
|
|
24
|
+
"properties": {
|
|
25
|
+
"id": {
|
|
26
|
+
"type": "string",
|
|
27
|
+
"minLength": 1,
|
|
28
|
+
"pattern": "^[a-zA-Z0-9_-]+$",
|
|
29
|
+
"description": "Unique identifier for this hook. Must match the key in the parent object."
|
|
30
|
+
},
|
|
31
|
+
"title": {
|
|
32
|
+
"type": "string",
|
|
33
|
+
"minLength": 1,
|
|
34
|
+
"maxLength": 100,
|
|
35
|
+
"description": "Human-readable display name for the hook."
|
|
36
|
+
},
|
|
37
|
+
"description": {
|
|
38
|
+
"type": "string",
|
|
39
|
+
"minLength": 1,
|
|
40
|
+
"maxLength": 500,
|
|
41
|
+
"description": "Concise description of what this hook does."
|
|
42
|
+
},
|
|
43
|
+
"event": {
|
|
44
|
+
"type": "string",
|
|
45
|
+
"enum": [
|
|
46
|
+
"session_start",
|
|
47
|
+
"session_end",
|
|
48
|
+
"pre_tool_call",
|
|
49
|
+
"post_tool_call",
|
|
50
|
+
"pre_commit",
|
|
51
|
+
"post_commit",
|
|
52
|
+
"notification"
|
|
53
|
+
],
|
|
54
|
+
"description": "Lifecycle event that triggers this hook."
|
|
55
|
+
},
|
|
56
|
+
"command": {
|
|
57
|
+
"type": "string",
|
|
58
|
+
"description": "Shell command to execute when the event fires."
|
|
59
|
+
},
|
|
60
|
+
"args": {
|
|
61
|
+
"type": "array",
|
|
62
|
+
"items": {
|
|
63
|
+
"type": "string"
|
|
64
|
+
},
|
|
65
|
+
"description": "Arguments to pass to the command."
|
|
66
|
+
},
|
|
67
|
+
"env": {
|
|
68
|
+
"type": "object",
|
|
69
|
+
"additionalProperties": {
|
|
70
|
+
"type": "string"
|
|
71
|
+
},
|
|
72
|
+
"description": "Environment variables for the hook process."
|
|
73
|
+
},
|
|
74
|
+
"timeout_seconds": {
|
|
75
|
+
"type": "number",
|
|
76
|
+
"minimum": 1,
|
|
77
|
+
"description": "Maximum execution time in seconds before the hook is killed."
|
|
78
|
+
},
|
|
79
|
+
"matcher": {
|
|
80
|
+
"type": "string",
|
|
81
|
+
"description": "Regex pattern to match against event data. Hook only fires when matched."
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
"required": ["id", "description", "event", "command"],
|
|
85
|
+
"additionalProperties": false
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"$id": "https://raw.githubusercontent.com/pulsemcp/air/main/schemas/mcp.schema.json",
|
|
4
|
+
"title": "AIR MCP Servers Configuration",
|
|
5
|
+
"description": "Configuration file defining MCP (Model Context Protocol) servers. Follows the mcp.json open standard — a flat map of server names to fully-resolved connection configurations.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"properties": {
|
|
8
|
+
"$schema": {
|
|
9
|
+
"type": "string",
|
|
10
|
+
"description": "JSON Schema reference for validation."
|
|
11
|
+
}
|
|
12
|
+
},
|
|
13
|
+
"additionalProperties": {
|
|
14
|
+
"$ref": "#/$defs/ServerConfiguration"
|
|
15
|
+
},
|
|
16
|
+
"propertyNames": {
|
|
17
|
+
"pattern": "^[$a-zA-Z0-9_\\[\\]-]+$",
|
|
18
|
+
"description": "Server name (identifier key). Must be alphanumeric with hyphens, underscores, or brackets allowed."
|
|
19
|
+
},
|
|
20
|
+
"$defs": {
|
|
21
|
+
"OAuthConfiguration": {
|
|
22
|
+
"type": "object",
|
|
23
|
+
"description": "OAuth configuration for remote servers using OAuth authorization.",
|
|
24
|
+
"properties": {
|
|
25
|
+
"clientId": {
|
|
26
|
+
"type": "string",
|
|
27
|
+
"description": "OAuth client ID. If omitted, the client uses Dynamic Client Registration (DCR) or discovery."
|
|
28
|
+
},
|
|
29
|
+
"scopes": {
|
|
30
|
+
"type": "array",
|
|
31
|
+
"items": {
|
|
32
|
+
"type": "string",
|
|
33
|
+
"minLength": 1
|
|
34
|
+
},
|
|
35
|
+
"description": "OAuth scopes to request in the authorization request. Passed as the scope parameter (RFC 6749 §3.3)."
|
|
36
|
+
},
|
|
37
|
+
"redirectUri": {
|
|
38
|
+
"type": "string",
|
|
39
|
+
"format": "uri",
|
|
40
|
+
"description": "Redirect URI for the OAuth callback. For CLI/desktop clients this is typically http://localhost:{port}/callback (RFC 8252)."
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
"additionalProperties": false
|
|
44
|
+
},
|
|
45
|
+
"ServerConfiguration": {
|
|
46
|
+
"type": "object",
|
|
47
|
+
"description": "Configuration for a single MCP server.",
|
|
48
|
+
"properties": {
|
|
49
|
+
"title": {
|
|
50
|
+
"type": "string",
|
|
51
|
+
"minLength": 1,
|
|
52
|
+
"maxLength": 100,
|
|
53
|
+
"description": "Human-readable display name for the server."
|
|
54
|
+
},
|
|
55
|
+
"description": {
|
|
56
|
+
"type": "string",
|
|
57
|
+
"maxLength": 500,
|
|
58
|
+
"description": "Human-readable description of what the server provides."
|
|
59
|
+
},
|
|
60
|
+
"type": {
|
|
61
|
+
"type": "string",
|
|
62
|
+
"enum": ["stdio", "sse", "streamable-http"],
|
|
63
|
+
"description": "Transport type. 'stdio' for local process servers, 'sse' for Server-Sent Events, 'streamable-http' for HTTP streaming."
|
|
64
|
+
},
|
|
65
|
+
"command": {
|
|
66
|
+
"type": "string",
|
|
67
|
+
"description": "Executable command to run for stdio servers. Supports ${ENV_VAR} interpolation."
|
|
68
|
+
},
|
|
69
|
+
"args": {
|
|
70
|
+
"type": "array",
|
|
71
|
+
"items": {
|
|
72
|
+
"type": "string"
|
|
73
|
+
},
|
|
74
|
+
"description": "Command-line arguments for stdio servers. Supports ${ENV_VAR} interpolation."
|
|
75
|
+
},
|
|
76
|
+
"env": {
|
|
77
|
+
"type": "object",
|
|
78
|
+
"additionalProperties": {
|
|
79
|
+
"type": "string"
|
|
80
|
+
},
|
|
81
|
+
"description": "Environment variables for the server process. Values support ${ENV_VAR} interpolation."
|
|
82
|
+
},
|
|
83
|
+
"url": {
|
|
84
|
+
"type": "string",
|
|
85
|
+
"format": "uri",
|
|
86
|
+
"description": "Endpoint URL for sse or streamable-http servers. Supports ${ENV_VAR} interpolation."
|
|
87
|
+
},
|
|
88
|
+
"headers": {
|
|
89
|
+
"type": "object",
|
|
90
|
+
"additionalProperties": {
|
|
91
|
+
"type": "string"
|
|
92
|
+
},
|
|
93
|
+
"description": "HTTP headers for remote servers. Values support ${ENV_VAR} interpolation."
|
|
94
|
+
},
|
|
95
|
+
"oauth": {
|
|
96
|
+
"$ref": "#/$defs/OAuthConfiguration"
|
|
97
|
+
}
|
|
98
|
+
},
|
|
99
|
+
"required": ["type"],
|
|
100
|
+
"allOf": [
|
|
101
|
+
{
|
|
102
|
+
"if": {
|
|
103
|
+
"properties": {
|
|
104
|
+
"type": { "const": "stdio" }
|
|
105
|
+
},
|
|
106
|
+
"required": ["type"]
|
|
107
|
+
},
|
|
108
|
+
"then": {
|
|
109
|
+
"required": ["command"],
|
|
110
|
+
"properties": {
|
|
111
|
+
"url": false,
|
|
112
|
+
"headers": false,
|
|
113
|
+
"oauth": false
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
"if": {
|
|
119
|
+
"properties": {
|
|
120
|
+
"type": { "enum": ["sse", "streamable-http"] }
|
|
121
|
+
},
|
|
122
|
+
"required": ["type"]
|
|
123
|
+
},
|
|
124
|
+
"then": {
|
|
125
|
+
"required": ["url"],
|
|
126
|
+
"properties": {
|
|
127
|
+
"command": false,
|
|
128
|
+
"args": false
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
]
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"$id": "https://raw.githubusercontent.com/pulsemcp/air/main/schemas/plugins.schema.json",
|
|
4
|
+
"title": "AIR Plugins Index",
|
|
5
|
+
"description": "Index of agent plugins available in this AIR configuration. Plugins extend agent capabilities beyond what MCP servers and skills provide. AIR plugins are agent-agnostic and translated to agent-specific formats at session start time.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"properties": {
|
|
8
|
+
"$schema": {
|
|
9
|
+
"type": "string",
|
|
10
|
+
"description": "JSON Schema reference for validation."
|
|
11
|
+
}
|
|
12
|
+
},
|
|
13
|
+
"additionalProperties": {
|
|
14
|
+
"$ref": "#/$defs/Plugin"
|
|
15
|
+
},
|
|
16
|
+
"propertyNames": {
|
|
17
|
+
"pattern": "^[$a-zA-Z0-9_-]+$",
|
|
18
|
+
"description": "Plugin identifier key. Must be alphanumeric with hyphens or underscores."
|
|
19
|
+
},
|
|
20
|
+
"$defs": {
|
|
21
|
+
"Plugin": {
|
|
22
|
+
"type": "object",
|
|
23
|
+
"description": "An agent plugin that extends capabilities via external commands.",
|
|
24
|
+
"properties": {
|
|
25
|
+
"id": {
|
|
26
|
+
"type": "string",
|
|
27
|
+
"minLength": 1,
|
|
28
|
+
"pattern": "^[a-zA-Z0-9_-]+$",
|
|
29
|
+
"description": "Unique identifier for this plugin. Must match the key in the parent object."
|
|
30
|
+
},
|
|
31
|
+
"title": {
|
|
32
|
+
"type": "string",
|
|
33
|
+
"minLength": 1,
|
|
34
|
+
"maxLength": 100,
|
|
35
|
+
"description": "Human-readable display name for the plugin."
|
|
36
|
+
},
|
|
37
|
+
"description": {
|
|
38
|
+
"type": "string",
|
|
39
|
+
"minLength": 1,
|
|
40
|
+
"maxLength": 500,
|
|
41
|
+
"description": "Concise description of what this plugin does."
|
|
42
|
+
},
|
|
43
|
+
"type": {
|
|
44
|
+
"type": "string",
|
|
45
|
+
"enum": ["command"],
|
|
46
|
+
"description": "Plugin type. Currently only 'command' is supported."
|
|
47
|
+
},
|
|
48
|
+
"command": {
|
|
49
|
+
"type": "string",
|
|
50
|
+
"description": "Executable command to run for this plugin."
|
|
51
|
+
},
|
|
52
|
+
"args": {
|
|
53
|
+
"type": "array",
|
|
54
|
+
"items": {
|
|
55
|
+
"type": "string"
|
|
56
|
+
},
|
|
57
|
+
"description": "Command-line arguments for the plugin command."
|
|
58
|
+
},
|
|
59
|
+
"env": {
|
|
60
|
+
"type": "object",
|
|
61
|
+
"additionalProperties": {
|
|
62
|
+
"type": "string"
|
|
63
|
+
},
|
|
64
|
+
"description": "Environment variables for the plugin process. Values support ${ENV_VAR} interpolation."
|
|
65
|
+
},
|
|
66
|
+
"timeout_seconds": {
|
|
67
|
+
"type": "number",
|
|
68
|
+
"minimum": 1,
|
|
69
|
+
"description": "Maximum execution time in seconds before the plugin is killed."
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
"required": ["id", "description", "type", "command"],
|
|
73
|
+
"additionalProperties": false
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"$id": "https://raw.githubusercontent.com/pulsemcp/air/main/schemas/references.schema.json",
|
|
4
|
+
"title": "AIR References Index",
|
|
5
|
+
"description": "Index of reference documents shared across skills and agents. References are broken out from skills to keep documentation DRY — a single reference can be used by multiple skills.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"properties": {
|
|
8
|
+
"$schema": {
|
|
9
|
+
"type": "string",
|
|
10
|
+
"description": "JSON Schema reference for validation."
|
|
11
|
+
}
|
|
12
|
+
},
|
|
13
|
+
"additionalProperties": {
|
|
14
|
+
"$ref": "#/$defs/Reference"
|
|
15
|
+
},
|
|
16
|
+
"propertyNames": {
|
|
17
|
+
"pattern": "^[$a-zA-Z0-9_-]+$",
|
|
18
|
+
"description": "Reference identifier key. Must be alphanumeric with hyphens or underscores."
|
|
19
|
+
},
|
|
20
|
+
"$defs": {
|
|
21
|
+
"Reference": {
|
|
22
|
+
"type": "object",
|
|
23
|
+
"description": "A shared reference document that can be attached to multiple skills.",
|
|
24
|
+
"properties": {
|
|
25
|
+
"id": {
|
|
26
|
+
"type": "string",
|
|
27
|
+
"minLength": 1,
|
|
28
|
+
"pattern": "^[a-zA-Z0-9_-]+$",
|
|
29
|
+
"description": "Unique identifier for this reference. Must match the key in the parent object."
|
|
30
|
+
},
|
|
31
|
+
"title": {
|
|
32
|
+
"type": "string",
|
|
33
|
+
"minLength": 1,
|
|
34
|
+
"maxLength": 100,
|
|
35
|
+
"description": "Human-readable display name for the reference."
|
|
36
|
+
},
|
|
37
|
+
"description": {
|
|
38
|
+
"type": "string",
|
|
39
|
+
"minLength": 1,
|
|
40
|
+
"maxLength": 500,
|
|
41
|
+
"description": "Concise description of what knowledge this reference contains."
|
|
42
|
+
},
|
|
43
|
+
"file": {
|
|
44
|
+
"type": "string",
|
|
45
|
+
"description": "Relative path to the reference document file (typically Markdown)."
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
"required": ["id", "description", "file"],
|
|
49
|
+
"additionalProperties": false
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"$id": "https://raw.githubusercontent.com/pulsemcp/air/main/schemas/roots.schema.json",
|
|
4
|
+
"title": "AIR Roots Index",
|
|
5
|
+
"description": "Index of agent root configurations. A root is a self-contained agent workspace — a git repository (or subdirectory within one) that contains everything an agent needs to operate in a specific domain.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"properties": {
|
|
8
|
+
"$schema": {
|
|
9
|
+
"type": "string",
|
|
10
|
+
"description": "JSON Schema reference for validation."
|
|
11
|
+
}
|
|
12
|
+
},
|
|
13
|
+
"additionalProperties": {
|
|
14
|
+
"$ref": "#/$defs/Root"
|
|
15
|
+
},
|
|
16
|
+
"propertyNames": {
|
|
17
|
+
"pattern": "^[$a-zA-Z0-9_-]+$",
|
|
18
|
+
"description": "Root identifier key. Must be alphanumeric with hyphens or underscores."
|
|
19
|
+
},
|
|
20
|
+
"$defs": {
|
|
21
|
+
"Root": {
|
|
22
|
+
"type": "object",
|
|
23
|
+
"description": "An agent root — a self-contained workspace for a specific domain.",
|
|
24
|
+
"properties": {
|
|
25
|
+
"name": {
|
|
26
|
+
"type": "string",
|
|
27
|
+
"minLength": 1,
|
|
28
|
+
"pattern": "^[a-zA-Z0-9_-]+$",
|
|
29
|
+
"description": "Unique identifier for this root. Must match the key in the parent object."
|
|
30
|
+
},
|
|
31
|
+
"display_name": {
|
|
32
|
+
"type": "string",
|
|
33
|
+
"minLength": 1,
|
|
34
|
+
"maxLength": 100,
|
|
35
|
+
"description": "Human-readable display name."
|
|
36
|
+
},
|
|
37
|
+
"description": {
|
|
38
|
+
"type": "string",
|
|
39
|
+
"minLength": 1,
|
|
40
|
+
"maxLength": 500,
|
|
41
|
+
"description": "What this agent root is for. Should be clear to anyone in the organization."
|
|
42
|
+
},
|
|
43
|
+
"url": {
|
|
44
|
+
"type": "string",
|
|
45
|
+
"description": "Git repository URL for this root."
|
|
46
|
+
},
|
|
47
|
+
"default_branch": {
|
|
48
|
+
"type": "string",
|
|
49
|
+
"description": "Default branch to use when cloning (defaults to 'main')."
|
|
50
|
+
},
|
|
51
|
+
"subdirectory": {
|
|
52
|
+
"type": "string",
|
|
53
|
+
"description": "Path within the repository to the root directory (for monorepo setups)."
|
|
54
|
+
},
|
|
55
|
+
"default_mcp_servers": {
|
|
56
|
+
"type": "array",
|
|
57
|
+
"items": {
|
|
58
|
+
"type": "string"
|
|
59
|
+
},
|
|
60
|
+
"description": "IDs of MCP servers to activate by default for sessions using this root."
|
|
61
|
+
},
|
|
62
|
+
"default_skills": {
|
|
63
|
+
"type": "array",
|
|
64
|
+
"items": {
|
|
65
|
+
"type": "string"
|
|
66
|
+
},
|
|
67
|
+
"description": "IDs of skills to make available by default for sessions using this root."
|
|
68
|
+
},
|
|
69
|
+
"default_plugins": {
|
|
70
|
+
"type": "array",
|
|
71
|
+
"items": {
|
|
72
|
+
"type": "string"
|
|
73
|
+
},
|
|
74
|
+
"description": "IDs of plugins to activate by default for sessions using this root."
|
|
75
|
+
},
|
|
76
|
+
"default_hooks": {
|
|
77
|
+
"type": "array",
|
|
78
|
+
"items": {
|
|
79
|
+
"type": "string"
|
|
80
|
+
},
|
|
81
|
+
"description": "IDs of hooks to activate by default for sessions using this root."
|
|
82
|
+
},
|
|
83
|
+
"user_invocable": {
|
|
84
|
+
"type": "boolean",
|
|
85
|
+
"description": "Whether this root can be directly invoked by users to start a session.",
|
|
86
|
+
"default": true
|
|
87
|
+
},
|
|
88
|
+
"default_stop_condition": {
|
|
89
|
+
"type": "string",
|
|
90
|
+
"description": "Default condition that signals the agent should hand back control (e.g., 'open-reviewed-green-pr')."
|
|
91
|
+
}
|
|
92
|
+
},
|
|
93
|
+
"required": ["name", "description"],
|
|
94
|
+
"additionalProperties": false
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"$id": "https://raw.githubusercontent.com/pulsemcp/air/main/schemas/air.schema.json",
|
|
4
|
+
"title": "AIR Configuration",
|
|
5
|
+
"description": "Root configuration file for the AIR framework. Points to artifact index files that define skills, MCP servers, plugins, roots, hooks, and references. Each artifact property is an array of paths — files are loaded and merged in order, with later entries overriding earlier ones by ID.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"properties": {
|
|
8
|
+
"$schema": {
|
|
9
|
+
"type": "string",
|
|
10
|
+
"description": "JSON Schema reference for validation."
|
|
11
|
+
},
|
|
12
|
+
"name": {
|
|
13
|
+
"type": "string",
|
|
14
|
+
"minLength": 1,
|
|
15
|
+
"maxLength": 100,
|
|
16
|
+
"pattern": "^[a-zA-Z0-9_-]+$",
|
|
17
|
+
"description": "Unique identifier for this AIR configuration."
|
|
18
|
+
},
|
|
19
|
+
"description": {
|
|
20
|
+
"type": "string",
|
|
21
|
+
"maxLength": 500,
|
|
22
|
+
"description": "Human-readable description of this AIR configuration scope (e.g., 'Acme Corp engineering team agent configs')."
|
|
23
|
+
},
|
|
24
|
+
"skills": {
|
|
25
|
+
"type": "array",
|
|
26
|
+
"items": { "type": "string" },
|
|
27
|
+
"description": "Paths to skills index files. Merged in order — later entries override earlier ones by ID."
|
|
28
|
+
},
|
|
29
|
+
"references": {
|
|
30
|
+
"type": "array",
|
|
31
|
+
"items": { "type": "string" },
|
|
32
|
+
"description": "Paths to references index files. Merged in order — later entries override earlier ones by ID."
|
|
33
|
+
},
|
|
34
|
+
"mcp": {
|
|
35
|
+
"type": "array",
|
|
36
|
+
"items": { "type": "string" },
|
|
37
|
+
"description": "Paths to MCP server configuration files. Merged in order — later entries override earlier ones by ID."
|
|
38
|
+
},
|
|
39
|
+
"plugins": {
|
|
40
|
+
"type": "array",
|
|
41
|
+
"items": { "type": "string" },
|
|
42
|
+
"description": "Paths to plugins index files. Merged in order — later entries override earlier ones by ID."
|
|
43
|
+
},
|
|
44
|
+
"roots": {
|
|
45
|
+
"type": "array",
|
|
46
|
+
"items": { "type": "string" },
|
|
47
|
+
"description": "Paths to roots index files. Merged in order — later entries override earlier ones by ID."
|
|
48
|
+
},
|
|
49
|
+
"hooks": {
|
|
50
|
+
"type": "array",
|
|
51
|
+
"items": { "type": "string" },
|
|
52
|
+
"description": "Paths to hooks index files. Merged in order — later entries override earlier ones by ID."
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
"required": ["name"],
|
|
56
|
+
"additionalProperties": false
|
|
57
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"$id": "https://raw.githubusercontent.com/pulsemcp/air/main/schemas/hooks.schema.json",
|
|
4
|
+
"title": "AIR Hooks Index",
|
|
5
|
+
"description": "Index of hooks that run in response to agent lifecycle events. Hooks are shell commands triggered at specific points during an agent session.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"properties": {
|
|
8
|
+
"$schema": {
|
|
9
|
+
"type": "string",
|
|
10
|
+
"description": "JSON Schema reference for validation."
|
|
11
|
+
}
|
|
12
|
+
},
|
|
13
|
+
"additionalProperties": {
|
|
14
|
+
"$ref": "#/$defs/Hook"
|
|
15
|
+
},
|
|
16
|
+
"propertyNames": {
|
|
17
|
+
"pattern": "^[$a-zA-Z0-9_-]+$",
|
|
18
|
+
"description": "Hook identifier key. Must be alphanumeric with hyphens or underscores."
|
|
19
|
+
},
|
|
20
|
+
"$defs": {
|
|
21
|
+
"Hook": {
|
|
22
|
+
"type": "object",
|
|
23
|
+
"description": "A hook that runs a command in response to an agent lifecycle event.",
|
|
24
|
+
"properties": {
|
|
25
|
+
"id": {
|
|
26
|
+
"type": "string",
|
|
27
|
+
"minLength": 1,
|
|
28
|
+
"pattern": "^[a-zA-Z0-9_-]+$",
|
|
29
|
+
"description": "Unique identifier for this hook. Must match the key in the parent object."
|
|
30
|
+
},
|
|
31
|
+
"title": {
|
|
32
|
+
"type": "string",
|
|
33
|
+
"minLength": 1,
|
|
34
|
+
"maxLength": 100,
|
|
35
|
+
"description": "Human-readable display name for the hook."
|
|
36
|
+
},
|
|
37
|
+
"description": {
|
|
38
|
+
"type": "string",
|
|
39
|
+
"minLength": 1,
|
|
40
|
+
"maxLength": 500,
|
|
41
|
+
"description": "Concise description of what this hook does."
|
|
42
|
+
},
|
|
43
|
+
"event": {
|
|
44
|
+
"type": "string",
|
|
45
|
+
"enum": [
|
|
46
|
+
"session_start",
|
|
47
|
+
"session_end",
|
|
48
|
+
"pre_tool_call",
|
|
49
|
+
"post_tool_call",
|
|
50
|
+
"pre_commit",
|
|
51
|
+
"post_commit",
|
|
52
|
+
"notification"
|
|
53
|
+
],
|
|
54
|
+
"description": "Lifecycle event that triggers this hook."
|
|
55
|
+
},
|
|
56
|
+
"command": {
|
|
57
|
+
"type": "string",
|
|
58
|
+
"description": "Shell command to execute when the event fires."
|
|
59
|
+
},
|
|
60
|
+
"args": {
|
|
61
|
+
"type": "array",
|
|
62
|
+
"items": {
|
|
63
|
+
"type": "string"
|
|
64
|
+
},
|
|
65
|
+
"description": "Arguments to pass to the command."
|
|
66
|
+
},
|
|
67
|
+
"env": {
|
|
68
|
+
"type": "object",
|
|
69
|
+
"additionalProperties": {
|
|
70
|
+
"type": "string"
|
|
71
|
+
},
|
|
72
|
+
"description": "Environment variables for the hook process."
|
|
73
|
+
},
|
|
74
|
+
"timeout_seconds": {
|
|
75
|
+
"type": "number",
|
|
76
|
+
"minimum": 1,
|
|
77
|
+
"description": "Maximum execution time in seconds before the hook is killed."
|
|
78
|
+
},
|
|
79
|
+
"matcher": {
|
|
80
|
+
"type": "string",
|
|
81
|
+
"description": "Regex pattern to match against event data. Hook only fires when matched."
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
"required": ["id", "description", "event", "command"],
|
|
85
|
+
"additionalProperties": false
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|