-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathplugin.schema.json
More file actions
168 lines (168 loc) · 5.07 KB
/
Copy pathplugin.schema.json
File metadata and controls
168 lines (168 loc) · 5.07 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
{
"$schema": "http://json-schema.org/draft-07/schema#",
"$id": "https://github.com/skalesapp/plugins/schema/plugin.schema.json",
"title": "Skales plugin manifest",
"description": "The shape of a plugin.json in a plugin repository, and of one entry in the registry's plugins.json.",
"type": "object",
"additionalProperties": false,
"required": [
"id",
"name",
"version",
"minAppVersion",
"description",
"author",
"class",
"platforms",
"permissions",
"repo"
],
"properties": {
"id": {
"type": "string",
"description": "Reverse-DNS identity derived from the source host: com.github.<owner>/<slug>. The owner segment must match the owner of the repository the plugin is served from.",
"pattern": "^com\\.github\\.[A-Za-z0-9](?:[A-Za-z0-9-]{0,38})/[a-z0-9](?:[a-z0-9-]{0,62})$"
},
"name": {
"type": "string",
"minLength": 2,
"maxLength": 60
},
"publicKey": {
"type": "string",
"description": "Optional. The author's ed25519 public key (base64 SPKI DER). If your releases ship a SIGNATURE file, this key is what turns 'not modified since signing' into 'published by you' - Skales shows your name on the green line.",
"pattern": "^[A-Za-z0-9+/=]{40,200}$"
},
"version": {
"type": "string",
"description": "Semantic version, no leading v.",
"pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-[0-9A-Za-z-.]+)?(?:\\+[0-9A-Za-z-.]+)?$"
},
"minAppVersion": {
"type": "string",
"description": "Lowest Skales app version the plugin runs on.",
"pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)$"
},
"description": {
"type": "string",
"minLength": 10,
"maxLength": 200,
"description": "One sentence. What it does, not what it promises."
},
"author": {
"type": "string",
"minLength": 2,
"maxLength": 80
},
"class": {
"type": "string",
"description": "page renders a surface, agent answers with a model, automation runs on a schedule or a trigger.",
"enum": [
"page",
"agent",
"automation"
]
},
"platforms": {
"type": "array",
"minItems": 1,
"uniqueItems": true,
"items": {
"type": "string",
"enum": [
"desktop",
"mobile"
]
}
},
"permissions": {
"type": "object",
"additionalProperties": false,
"required": [
"network",
"filesystem",
"tools"
],
"properties": {
"network": {
"type": "boolean",
"description": "true means the plugin may reach hosts outside the app."
},
"filesystem": {
"type": "string",
"description": "none is no disk access at all; pluginRoot is the plugin's own directory and nothing above it.",
"enum": [
"none",
"pluginRoot"
]
},
"tools": {
"type": "array",
"uniqueItems": true,
"items": {
"type": "string",
"minLength": 1
},
"description": "App tool names the plugin may call. Empty array means none."
},
"memory": {
"type": "string",
"description": "own is a memory store of the plugin's own that nothing else reads; shared is the memory the user shares with the chat, meaning everything they have asked Skales to remember. Omit it and the plugin gets its own. Ask for shared only if the plugin genuinely works on what the user has already told Skales, and say so in your README.",
"enum": [
"own",
"shared"
]
}
}
},
"business": {
"type": "object",
"description": "Optional. Present only if the plugin is paid or has a paid tier.",
"additionalProperties": false,
"properties": {
"model": {
"type": "string",
"enum": [
"free",
"paid",
"freemium"
]
},
"priceUrl": {
"type": "string",
"pattern": "^https://"
},
"vendor": {
"type": "string",
"minLength": 2
}
},
"required": [
"model"
]
},
"repo": {
"type": "string",
"description": "GitHub repository the plugin is served from, as owner/name.",
"pattern": "^[A-Za-z0-9](?:[A-Za-z0-9-]{0,38})/[A-Za-z0-9._-]{1,100}$"
},
"path": {
"type": "string",
"description": "Optional subdirectory inside repo that holds the plugin. Omit if the plugin is at the repository root.",
"pattern": "^[A-Za-z0-9._-]+(?:/[A-Za-z0-9._-]+)*$"
},
"homepage": {
"type": "string",
"pattern": "^https://"
},
"firstParty": {
"type": "boolean",
"description": "Maintained by Skales. Only entries owned by skalesapp may set this."
},
"addedAt": {
"type": "string",
"description": "Date the entry was merged into the registry, ISO 8601 date.",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
}
}
}