@zenalexa/unicli 0.220.0 → 0.220.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.
Files changed (182) hide show
  1. package/AGENTS.md +10 -19
  2. package/README.md +17 -11
  3. package/README.zh-CN.md +17 -11
  4. package/dist/adapters/anilist/web.d.ts +11 -0
  5. package/dist/adapters/anilist/web.d.ts.map +1 -0
  6. package/dist/adapters/anilist/web.js +284 -0
  7. package/dist/adapters/anilist/web.js.map +1 -0
  8. package/dist/adapters/bangumi/web.d.ts +14 -0
  9. package/dist/adapters/bangumi/web.d.ts.map +1 -0
  10. package/dist/adapters/bangumi/web.js +257 -0
  11. package/dist/adapters/bangumi/web.js.map +1 -0
  12. package/dist/adapters/dlsite/web.d.ts +31 -0
  13. package/dist/adapters/dlsite/web.d.ts.map +1 -0
  14. package/dist/adapters/dlsite/web.js +455 -0
  15. package/dist/adapters/dlsite/web.js.map +1 -0
  16. package/dist/adapters/ehentai/web.d.ts +66 -0
  17. package/dist/adapters/ehentai/web.d.ts.map +1 -0
  18. package/dist/adapters/ehentai/web.js +608 -0
  19. package/dist/adapters/ehentai/web.js.map +1 -0
  20. package/dist/adapters/jikan/web.d.ts +9 -0
  21. package/dist/adapters/jikan/web.d.ts.map +1 -0
  22. package/dist/adapters/jikan/web.js +154 -0
  23. package/dist/adapters/jikan/web.js.map +1 -0
  24. package/dist/adapters/kitsu/web.d.ts +9 -0
  25. package/dist/adapters/kitsu/web.d.ts.map +1 -0
  26. package/dist/adapters/kitsu/web.js +97 -0
  27. package/dist/adapters/kitsu/web.js.map +1 -0
  28. package/dist/adapters/mangadex/web.d.ts +10 -0
  29. package/dist/adapters/mangadex/web.d.ts.map +1 -0
  30. package/dist/adapters/mangadex/web.js +188 -0
  31. package/dist/adapters/mangadex/web.js.map +1 -0
  32. package/dist/adapters/moegirl/web.d.ts +23 -0
  33. package/dist/adapters/moegirl/web.d.ts.map +1 -0
  34. package/dist/adapters/moegirl/web.js +269 -0
  35. package/dist/adapters/moegirl/web.js.map +1 -0
  36. package/dist/adapters/safebooru/web.d.ts +10 -0
  37. package/dist/adapters/safebooru/web.d.ts.map +1 -0
  38. package/dist/adapters/safebooru/web.js +120 -0
  39. package/dist/adapters/safebooru/web.js.map +1 -0
  40. package/dist/adapters/vndb/web.d.ts +10 -0
  41. package/dist/adapters/vndb/web.d.ts.map +1 -0
  42. package/dist/adapters/vndb/web.js +321 -0
  43. package/dist/adapters/vndb/web.js.map +1 -0
  44. package/dist/agents/codex-pack.d.ts +62 -0
  45. package/dist/agents/codex-pack.d.ts.map +1 -0
  46. package/dist/agents/codex-pack.js +163 -0
  47. package/dist/agents/codex-pack.js.map +1 -0
  48. package/dist/commands/agents.d.ts.map +1 -1
  49. package/dist/commands/agents.js +6 -43
  50. package/dist/commands/agents.js.map +1 -1
  51. package/dist/commands/browser/adapter.d.ts.map +1 -1
  52. package/dist/commands/browser/adapter.js +17 -3
  53. package/dist/commands/browser/adapter.js.map +1 -1
  54. package/dist/commands/describe.d.ts.map +1 -1
  55. package/dist/commands/describe.js +6 -7
  56. package/dist/commands/describe.js.map +1 -1
  57. package/dist/commands/dispatch.d.ts +1 -1
  58. package/dist/commands/dispatch.d.ts.map +1 -1
  59. package/dist/commands/dispatch.js +4 -2
  60. package/dist/commands/dispatch.js.map +1 -1
  61. package/dist/commands/mcp.d.ts +1 -1
  62. package/dist/commands/mcp.d.ts.map +1 -1
  63. package/dist/commands/mcp.js +10 -5
  64. package/dist/commands/mcp.js.map +1 -1
  65. package/dist/core/command-contract-lint.d.ts +10 -0
  66. package/dist/core/command-contract-lint.d.ts.map +1 -0
  67. package/dist/core/command-contract-lint.js +41 -0
  68. package/dist/core/command-contract-lint.js.map +1 -0
  69. package/dist/core/command-contract.d.ts +100 -0
  70. package/dist/core/command-contract.d.ts.map +1 -0
  71. package/dist/core/command-contract.js +174 -0
  72. package/dist/core/command-contract.js.map +1 -0
  73. package/dist/core/index.d.ts +2 -0
  74. package/dist/core/index.d.ts.map +1 -1
  75. package/dist/core/index.js +2 -0
  76. package/dist/core/index.js.map +1 -1
  77. package/dist/discovery/aliases.d.ts +2 -2
  78. package/dist/discovery/aliases.d.ts.map +1 -1
  79. package/dist/discovery/aliases.js +464 -6
  80. package/dist/discovery/aliases.js.map +1 -1
  81. package/dist/discovery/search.d.ts.map +1 -1
  82. package/dist/discovery/search.js +147 -2
  83. package/dist/discovery/search.js.map +1 -1
  84. package/dist/engine/args.d.ts.map +1 -1
  85. package/dist/engine/args.js +18 -1
  86. package/dist/engine/args.js.map +1 -1
  87. package/dist/engine/artifact-validation.d.ts +29 -0
  88. package/dist/engine/artifact-validation.d.ts.map +1 -0
  89. package/dist/engine/artifact-validation.js +211 -0
  90. package/dist/engine/artifact-validation.js.map +1 -0
  91. package/dist/engine/browser/diagnostics.d.ts +38 -0
  92. package/dist/engine/browser/diagnostics.d.ts.map +1 -0
  93. package/dist/engine/browser/diagnostics.js +40 -0
  94. package/dist/engine/browser/diagnostics.js.map +1 -0
  95. package/dist/engine/invoke.d.ts +1 -0
  96. package/dist/engine/invoke.d.ts.map +1 -1
  97. package/dist/engine/invoke.js +1 -0
  98. package/dist/engine/invoke.js.map +1 -1
  99. package/dist/engine/kernel/errors.d.ts +11 -0
  100. package/dist/engine/kernel/errors.d.ts.map +1 -0
  101. package/dist/engine/kernel/errors.js +15 -0
  102. package/dist/engine/kernel/errors.js.map +1 -0
  103. package/dist/engine/kernel/execute.d.ts +7 -18
  104. package/dist/engine/kernel/execute.d.ts.map +1 -1
  105. package/dist/engine/kernel/execute.js +25 -410
  106. package/dist/engine/kernel/execute.js.map +1 -1
  107. package/dist/engine/kernel/stages.d.ts +44 -0
  108. package/dist/engine/kernel/stages.d.ts.map +1 -0
  109. package/dist/engine/kernel/stages.js +428 -0
  110. package/dist/engine/kernel/stages.js.map +1 -0
  111. package/dist/engine/kernel/types.d.ts +21 -1
  112. package/dist/engine/kernel/types.d.ts.map +1 -1
  113. package/dist/engine/steps/download.d.ts +1 -0
  114. package/dist/engine/steps/download.d.ts.map +1 -1
  115. package/dist/engine/steps/download.js +10 -6
  116. package/dist/engine/steps/download.js.map +1 -1
  117. package/dist/fast-path/render.js +1 -1
  118. package/dist/fast-path/render.js.map +1 -1
  119. package/dist/manifest-compact.txt +3 -3
  120. package/dist/manifest-search.json +1 -1
  121. package/dist/manifest.json +3074 -3
  122. package/dist/mcp/handler.d.ts.map +1 -1
  123. package/dist/mcp/handler.js +11 -1
  124. package/dist/mcp/handler.js.map +1 -1
  125. package/dist/mcp/server.d.ts +1 -1
  126. package/dist/mcp/server.js +1 -1
  127. package/dist/mcp/tools.d.ts.map +1 -1
  128. package/dist/mcp/tools.js +18 -10
  129. package/dist/mcp/tools.js.map +1 -1
  130. package/dist/output/error-map.d.ts.map +1 -1
  131. package/dist/output/error-map.js +1 -1
  132. package/dist/output/error-map.js.map +1 -1
  133. package/dist/registry.d.ts.map +1 -1
  134. package/dist/registry.js +2 -1
  135. package/dist/registry.js.map +1 -1
  136. package/package.json +2 -2
  137. package/server.json +3 -3
  138. package/skills/unicli/SKILL.md +1 -1
  139. package/skills/unicli-claude-code/SKILL.md +1 -1
  140. package/skills/unicli-hermes/SKILL.md +1 -1
  141. package/src/adapters/anilist/web.test.ts +93 -0
  142. package/src/adapters/anilist/web.ts +341 -0
  143. package/src/adapters/arxiv/download.yaml +53 -0
  144. package/src/adapters/bangumi/web.test.ts +109 -0
  145. package/src/adapters/bangumi/web.ts +295 -0
  146. package/src/adapters/danbooru/artists.yaml +44 -0
  147. package/src/adapters/danbooru/comments.yaml +45 -0
  148. package/src/adapters/danbooru/detail.yaml +78 -0
  149. package/src/adapters/danbooru/download.yaml +51 -0
  150. package/src/adapters/danbooru/pools.yaml +56 -0
  151. package/src/adapters/danbooru/search.yaml +69 -0
  152. package/src/adapters/danbooru/tags.yaml +42 -0
  153. package/src/adapters/danbooru/wiki.yaml +44 -0
  154. package/src/adapters/dlsite/web.test.ts +132 -0
  155. package/src/adapters/dlsite/web.ts +557 -0
  156. package/src/adapters/ehentai/web.test.ts +157 -0
  157. package/src/adapters/ehentai/web.ts +750 -0
  158. package/src/adapters/jikan/web.test.ts +50 -0
  159. package/src/adapters/jikan/web.ts +177 -0
  160. package/src/adapters/kitsu/web.test.ts +29 -0
  161. package/src/adapters/kitsu/web.ts +109 -0
  162. package/src/adapters/konachan/detail.yaml +62 -0
  163. package/src/adapters/konachan/download.yaml +55 -0
  164. package/src/adapters/konachan/search.yaml +65 -0
  165. package/src/adapters/konachan/tags.yaml +40 -0
  166. package/src/adapters/mangadex/web.test.ts +46 -0
  167. package/src/adapters/mangadex/web.ts +210 -0
  168. package/src/adapters/moegirl/web.test.ts +87 -0
  169. package/src/adapters/moegirl/web.ts +343 -0
  170. package/src/adapters/pdf/read.yaml +49 -0
  171. package/src/adapters/pixiv/download.yaml +15 -2
  172. package/src/adapters/safebooru/detail.yaml +63 -0
  173. package/src/adapters/safebooru/download.yaml +58 -0
  174. package/src/adapters/safebooru/search.yaml +69 -0
  175. package/src/adapters/safebooru/web.test.ts +60 -0
  176. package/src/adapters/safebooru/web.ts +130 -0
  177. package/src/adapters/vndb/web.test.ts +86 -0
  178. package/src/adapters/vndb/web.ts +393 -0
  179. package/src/adapters/yandere/detail.yaml +61 -0
  180. package/src/adapters/yandere/download.yaml +56 -0
  181. package/src/adapters/yandere/search.yaml +67 -0
  182. package/src/adapters/yandere/tags.yaml +41 -0
@@ -0,0 +1,321 @@
1
+ /**
2
+ * @owner src/adapters/vndb/web.ts
3
+ * @does Register VNDB public visual novel, release, tag, staff, producer, and character lookup commands.
4
+ * @needs VNDB Kana API JSON contract and public unauthenticated read endpoints.
5
+ * @feeds ACG research workflows, visual novel discovery, game tag/type search.
6
+ * @breaks VNDB field names or filter semantics drifting will hide games or metadata.
7
+ */
8
+ import { USER_AGENT } from "../../constants.js";
9
+ import { cli, Strategy } from "../../registry.js";
10
+ const VNDB_API = "https://api.vndb.org/kana";
11
+ function str(value) {
12
+ return value === undefined || value === null ? "" : String(value);
13
+ }
14
+ function requireQuery(value) {
15
+ const query = str(value).trim();
16
+ if (!query)
17
+ throw new Error("VNDB query cannot be empty.");
18
+ return query;
19
+ }
20
+ function requireLimit(value, fallback = 20) {
21
+ if (value === undefined || value === null || value === "")
22
+ return fallback;
23
+ const n = Number(value);
24
+ if (!Number.isInteger(n) || n < 1 || n > 100) {
25
+ throw new Error("VNDB limit must be an integer in [1, 100].");
26
+ }
27
+ return n;
28
+ }
29
+ function normalizeId(value, prefix) {
30
+ const raw = str(value).trim().toLowerCase();
31
+ if (!raw)
32
+ throw new Error("VNDB id cannot be empty.");
33
+ return raw.startsWith(prefix) ? raw : `${prefix}${raw}`;
34
+ }
35
+ function joinNames(value, key = "name") {
36
+ return Array.isArray(value)
37
+ ? value
38
+ .map((item) => str(item[key]))
39
+ .join(", ")
40
+ : "";
41
+ }
42
+ function joinStrings(value) {
43
+ return Array.isArray(value) ? value.map(String).join(", ") : str(value);
44
+ }
45
+ function firstUrl(value) {
46
+ if (!value || typeof value !== "object")
47
+ return "";
48
+ return str(value.url);
49
+ }
50
+ function tagSummary(value) {
51
+ if (!Array.isArray(value))
52
+ return "";
53
+ return value
54
+ .slice()
55
+ .sort((a, b) => Number(b.rating ?? 0) -
56
+ Number(a.rating ?? 0))
57
+ .slice(0, 12)
58
+ .map((item) => str(item.name))
59
+ .filter(Boolean)
60
+ .join(", ");
61
+ }
62
+ function sortValue(value, allowed) {
63
+ const key = str(value || "relevance")
64
+ .toLowerCase()
65
+ .replace(/[\s_-]+/g, "");
66
+ const mapped = allowed[key];
67
+ if (!mapped) {
68
+ throw new Error(`Unsupported VNDB sort: ${value}. Supported: ${Object.keys(allowed).join(", ")}.`);
69
+ }
70
+ return mapped;
71
+ }
72
+ async function vndbPost(endpoint, body) {
73
+ const response = await fetch(`${VNDB_API}/${endpoint}`, {
74
+ method: "POST",
75
+ headers: {
76
+ Accept: "application/json",
77
+ "Content-Type": "application/json",
78
+ "User-Agent": USER_AGENT,
79
+ },
80
+ body: JSON.stringify(body),
81
+ });
82
+ if (!response.ok) {
83
+ throw new Error(`VNDB ${endpoint} request failed with HTTP ${response.status}.`);
84
+ }
85
+ const json = (await response.json());
86
+ return json.results ?? [];
87
+ }
88
+ function rankRows(rows) {
89
+ return rows.map((row, index) => ({ rank: index + 1, ...row }));
90
+ }
91
+ export function mapVndbVisualNovels(rows) {
92
+ return rankRows(rows.map((item) => ({
93
+ id: str(item.id),
94
+ title: str(item.title),
95
+ alttitle: str(item.alttitle),
96
+ released: str(item.released),
97
+ languages: joinStrings(item.languages),
98
+ platforms: joinStrings(item.platforms),
99
+ rating: item.rating ?? "",
100
+ votecount: item.votecount ?? "",
101
+ developers: joinNames(item.developers),
102
+ tags: tagSummary(item.tags),
103
+ image: firstUrl(item.image),
104
+ url: `https://vndb.org/${str(item.id)}`,
105
+ })));
106
+ }
107
+ export function mapVndbReleases(rows) {
108
+ return rankRows(rows.map((item) => ({
109
+ id: str(item.id),
110
+ title: str(item.title),
111
+ released: str(item.released),
112
+ platforms: joinStrings(item.platforms),
113
+ producers: joinNames(item.producers),
114
+ vns: joinNames(item.vns, "title"),
115
+ url: `https://vndb.org/${str(item.id)}`,
116
+ })));
117
+ }
118
+ function mapSimple(rows, urlPrefix) {
119
+ return rankRows(rows.map((item) => ({
120
+ id: str(item.id),
121
+ name: str(item.name),
122
+ original: str(item.original),
123
+ category: str(item.category),
124
+ type: str(item.type),
125
+ lang: str(item.lang),
126
+ aliases: joinStrings(item.aliases),
127
+ description: str(item.description).replace(/\s+/g, " ").slice(0, 500),
128
+ url: `https://vndb.org/${urlPrefix}${str(item.id).replace(/^[a-z]+/, "")}`,
129
+ })));
130
+ }
131
+ async function searchVn(kwargs) {
132
+ const sort = sortValue(kwargs.sort, {
133
+ relevance: "searchrank",
134
+ rating: "rating",
135
+ votes: "votecount",
136
+ votecount: "votecount",
137
+ released: "released",
138
+ time: "released",
139
+ title: "title",
140
+ });
141
+ const rows = await vndbPost("vn", {
142
+ filters: ["search", "=", requireQuery(kwargs.query)],
143
+ fields: "id,title,alttitle,released,languages,platforms,rating,votecount,image.url,tags.rating,tags.name,tags.category,developers.name",
144
+ sort,
145
+ reverse: kwargs.reverse === true,
146
+ results: requireLimit(kwargs.limit),
147
+ });
148
+ return mapVndbVisualNovels(rows);
149
+ }
150
+ const VN_COLUMNS = [
151
+ "rank",
152
+ "id",
153
+ "title",
154
+ "alttitle",
155
+ "released",
156
+ "languages",
157
+ "platforms",
158
+ "rating",
159
+ "votecount",
160
+ "developers",
161
+ "tags",
162
+ "url",
163
+ ];
164
+ cli({
165
+ site: "vndb",
166
+ name: "search",
167
+ description: "Search VNDB visual novels by title, alias, tag, or keyword",
168
+ domain: "api.vndb.org",
169
+ strategy: Strategy.PUBLIC,
170
+ browser: false,
171
+ args: [
172
+ { name: "query", type: "str", required: true, positional: true },
173
+ { name: "limit", type: "int", default: 20 },
174
+ {
175
+ name: "sort",
176
+ type: "str",
177
+ default: "relevance",
178
+ description: "relevance, rating, votes, released, time, title",
179
+ },
180
+ { name: "reverse", type: "bool", default: false },
181
+ ],
182
+ columns: VN_COLUMNS,
183
+ func: async (_page, kwargs) => searchVn(kwargs),
184
+ });
185
+ cli({
186
+ site: "vndb",
187
+ name: "vn",
188
+ description: "Get VNDB visual novel details by v-id",
189
+ domain: "api.vndb.org",
190
+ strategy: Strategy.PUBLIC,
191
+ browser: false,
192
+ args: [{ name: "id", type: "str", required: true, positional: true }],
193
+ columns: VN_COLUMNS,
194
+ func: async (_page, kwargs) => mapVndbVisualNovels(await vndbPost("vn", {
195
+ filters: ["id", "=", normalizeId(kwargs.id, "v")],
196
+ fields: "id,title,alttitle,released,languages,platforms,rating,votecount,image.url,tags.rating,tags.name,tags.category,developers.name",
197
+ results: 1,
198
+ })),
199
+ });
200
+ cli({
201
+ site: "vndb",
202
+ name: "releases",
203
+ description: "Search VNDB releases by title or visual novel keyword",
204
+ domain: "api.vndb.org",
205
+ strategy: Strategy.PUBLIC,
206
+ browser: false,
207
+ args: [
208
+ { name: "query", type: "str", required: true, positional: true },
209
+ { name: "limit", type: "int", default: 20 },
210
+ {
211
+ name: "sort",
212
+ type: "str",
213
+ default: "released",
214
+ description: "released, time, title",
215
+ },
216
+ { name: "reverse", type: "bool", default: true },
217
+ ],
218
+ columns: [
219
+ "rank",
220
+ "id",
221
+ "title",
222
+ "released",
223
+ "platforms",
224
+ "producers",
225
+ "vns",
226
+ "url",
227
+ ],
228
+ func: async (_page, kwargs) => mapVndbReleases(await vndbPost("release", {
229
+ filters: ["search", "=", requireQuery(kwargs.query)],
230
+ fields: "id,title,released,platforms,producers.name,vns.title",
231
+ sort: sortValue(kwargs.sort, {
232
+ released: "released",
233
+ time: "released",
234
+ title: "title",
235
+ }),
236
+ reverse: kwargs.reverse !== false,
237
+ results: requireLimit(kwargs.limit),
238
+ })),
239
+ });
240
+ cli({
241
+ site: "vndb",
242
+ name: "tags",
243
+ description: "Search VNDB game tags and genres",
244
+ domain: "api.vndb.org",
245
+ strategy: Strategy.PUBLIC,
246
+ browser: false,
247
+ args: [
248
+ { name: "query", type: "str", required: true, positional: true },
249
+ { name: "limit", type: "int", default: 20 },
250
+ ],
251
+ columns: ["rank", "id", "name", "category", "description", "url"],
252
+ func: async (_page, kwargs) => mapSimple(await vndbPost("tag", {
253
+ filters: ["search", "=", requireQuery(kwargs.query)],
254
+ fields: "id,name,category,description",
255
+ results: requireLimit(kwargs.limit),
256
+ }), "g"),
257
+ });
258
+ cli({
259
+ site: "vndb",
260
+ name: "staff",
261
+ description: "Search VNDB creators and staff",
262
+ domain: "api.vndb.org",
263
+ strategy: Strategy.PUBLIC,
264
+ browser: false,
265
+ args: [
266
+ { name: "query", type: "str", required: true, positional: true },
267
+ { name: "limit", type: "int", default: 20 },
268
+ ],
269
+ columns: ["rank", "id", "name", "original", "lang", "description", "url"],
270
+ func: async (_page, kwargs) => mapSimple(await vndbPost("staff", {
271
+ filters: ["search", "=", requireQuery(kwargs.query)],
272
+ fields: "id,name,original,lang,gender,description",
273
+ results: requireLimit(kwargs.limit),
274
+ }), "s"),
275
+ });
276
+ cli({
277
+ site: "vndb",
278
+ name: "producers",
279
+ description: "Search VNDB producers, studios, brands, makers, circles, companies, and visual novel publishers such as Yuzusoft",
280
+ domain: "api.vndb.org",
281
+ strategy: Strategy.PUBLIC,
282
+ browser: false,
283
+ args: [
284
+ { name: "query", type: "str", required: true, positional: true },
285
+ { name: "limit", type: "int", default: 20 },
286
+ ],
287
+ columns: [
288
+ "rank",
289
+ "id",
290
+ "name",
291
+ "aliases",
292
+ "lang",
293
+ "type",
294
+ "description",
295
+ "url",
296
+ ],
297
+ func: async (_page, kwargs) => mapSimple(await vndbPost("producer", {
298
+ filters: ["search", "=", requireQuery(kwargs.query)],
299
+ fields: "id,name,aliases,lang,type,description",
300
+ results: requireLimit(kwargs.limit),
301
+ }), "p"),
302
+ });
303
+ cli({
304
+ site: "vndb",
305
+ name: "characters",
306
+ description: "Search VNDB characters and traits",
307
+ domain: "api.vndb.org",
308
+ strategy: Strategy.PUBLIC,
309
+ browser: false,
310
+ args: [
311
+ { name: "query", type: "str", required: true, positional: true },
312
+ { name: "limit", type: "int", default: 20 },
313
+ ],
314
+ columns: ["rank", "id", "name", "original", "description", "url"],
315
+ func: async (_page, kwargs) => mapSimple(await vndbPost("character", {
316
+ filters: ["search", "=", requireQuery(kwargs.query)],
317
+ fields: "id,name,original,sex,description,vns.title,traits.name",
318
+ results: requireLimit(kwargs.limit),
319
+ }), "c"),
320
+ });
321
+ //# sourceMappingURL=web.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web.js","sourceRoot":"","sources":["../../../src/adapters/vndb/web.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * @owner Uni-CLI Agents
3
+ * @does Builds the compact Codex install pack from CommandContract metadata.
4
+ * @needs Adapter registry snapshots and command-contract projection.
5
+ * @feeds `unicli agents generate --for codex`, docs, and F4 release gates.
6
+ * @breaks Codex onboarding when it enumerates the catalog or exposes expanded MCP by default.
7
+ */
8
+ import type { AdapterManifest } from "../types.js";
9
+ export interface CodexPackInput {
10
+ version: string;
11
+ date: string;
12
+ adapters: AdapterManifest[];
13
+ }
14
+ export interface CodexSmokeTask {
15
+ name: string;
16
+ command: string;
17
+ proves: string;
18
+ }
19
+ export interface CodexPack {
20
+ schema_version: "codex-pack.v1";
21
+ package: string;
22
+ version: string;
23
+ date: string;
24
+ default_surface: "native_cli_plus_deferred_mcp";
25
+ counts: {
26
+ sites: number;
27
+ commands: number;
28
+ };
29
+ mcp_config: {
30
+ command: "npx";
31
+ args: string[];
32
+ };
33
+ tool_exposure: {
34
+ default_tools: number;
35
+ deferred_stubs: number;
36
+ expanded_tools: number;
37
+ expanded_opt_in: true;
38
+ };
39
+ contract_summary: {
40
+ schema_version: "command-contract.v1";
41
+ read_only: number;
42
+ write_or_destructive: number;
43
+ auth_required: number;
44
+ browser_backed: number;
45
+ artifact_producers: number;
46
+ };
47
+ deferred_toolsearch: {
48
+ source: "CommandContract";
49
+ tool_name_pattern: "unicli_<site>_<command>";
50
+ loaded_fields: string[];
51
+ full_schema_resolution: "tools/call via expandedRegistry";
52
+ };
53
+ smoke_tasks: CodexSmokeTask[];
54
+ token_budget: {
55
+ method: "heuristic-o200k";
56
+ estimated_tokens: number;
57
+ chars: number;
58
+ };
59
+ }
60
+ export declare function formatCodexPack(pack: CodexPack): string;
61
+ export declare function buildCodexPack(input: CodexPackInput): CodexPack;
62
+ //# sourceMappingURL=codex-pack.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-pack.d.ts","sourceRoot":"","sources":["../../src/agents/codex-pack.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,eAAe,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,SAAS;IACxB,cAAc,EAAE,eAAe,CAAC;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,8BAA8B,CAAC;IAChD,MAAM,EAAE;QACN,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,UAAU,EAAE;QACV,OAAO,EAAE,KAAK,CAAC;QACf,IAAI,EAAE,MAAM,EAAE,CAAC;KAChB,CAAC;IACF,aAAa,EAAE;QACb,aAAa,EAAE,MAAM,CAAC;QACtB,cAAc,EAAE,MAAM,CAAC;QACvB,cAAc,EAAE,MAAM,CAAC;QACvB,eAAe,EAAE,IAAI,CAAC;KACvB,CAAC;IACF,gBAAgB,EAAE;QAChB,cAAc,EAAE,qBAAqB,CAAC;QACtC,SAAS,EAAE,MAAM,CAAC;QAClB,oBAAoB,EAAE,MAAM,CAAC;QAC7B,aAAa,EAAE,MAAM,CAAC;QACtB,cAAc,EAAE,MAAM,CAAC;QACvB,kBAAkB,EAAE,MAAM,CAAC;KAC5B,CAAC;IACF,mBAAmB,EAAE;QACnB,MAAM,EAAE,iBAAiB,CAAC;QAC1B,iBAAiB,EAAE,yBAAyB,CAAC;QAC7C,aAAa,EAAE,MAAM,EAAE,CAAC;QACxB,sBAAsB,EAAE,iCAAiC,CAAC;KAC3D,CAAC;IACF,WAAW,EAAE,cAAc,EAAE,CAAC;IAC9B,YAAY,EAAE;QACZ,MAAM,EAAE,iBAAiB,CAAC;QAC1B,gBAAgB,EAAE,MAAM,CAAC;QACzB,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;CACH;AA8GD,wBAAgB,eAAe,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CA6CvD;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,cAAc,GAAG,SAAS,CAO/D"}
@@ -0,0 +1,163 @@
1
+ /**
2
+ * @owner Uni-CLI Agents
3
+ * @does Builds the compact Codex install pack from CommandContract metadata.
4
+ * @needs Adapter registry snapshots and command-contract projection.
5
+ * @feeds `unicli agents generate --for codex`, docs, and F4 release gates.
6
+ * @breaks Codex onboarding when it enumerates the catalog or exposes expanded MCP by default.
7
+ */
8
+ import { buildCommandContract } from "../core/command-contract.js";
9
+ function estimateTokens(input) {
10
+ const chars = input.length;
11
+ const words = input.trim().length === 0 ? 0 : input.trim().split(/\s+/).length;
12
+ return {
13
+ method: "heuristic-o200k",
14
+ estimated_tokens: Math.max(Math.ceil(chars / 3.6), Math.ceil(words / 0.75)),
15
+ chars,
16
+ };
17
+ }
18
+ function commandEntries(adapters) {
19
+ return adapters.flatMap((adapter) => {
20
+ return Object.keys(adapter.commands).map((commandName) => ({
21
+ adapter,
22
+ commandName,
23
+ }));
24
+ });
25
+ }
26
+ function buildContractSummary(adapters) {
27
+ const summary = {
28
+ schema_version: "command-contract.v1",
29
+ read_only: 0,
30
+ write_or_destructive: 0,
31
+ auth_required: 0,
32
+ browser_backed: 0,
33
+ artifact_producers: 0,
34
+ };
35
+ for (const { adapter, commandName } of commandEntries(adapters)) {
36
+ const command = adapter.commands[commandName];
37
+ if (!command)
38
+ continue;
39
+ const contract = buildCommandContract({ adapter, commandName, command });
40
+ if (contract.effect.read_only)
41
+ summary.read_only++;
42
+ else
43
+ summary.write_or_destructive++;
44
+ if (contract.auth.required)
45
+ summary.auth_required++;
46
+ if (contract.effect.browser)
47
+ summary.browser_backed++;
48
+ if (contract.artifacts.produces_files)
49
+ summary.artifact_producers++;
50
+ }
51
+ return summary;
52
+ }
53
+ function codexPackWithoutBudget(input) {
54
+ const commands = commandEntries(input.adapters).length;
55
+ return {
56
+ schema_version: "codex-pack.v1",
57
+ package: "@zenalexa/unicli",
58
+ version: input.version,
59
+ date: input.date,
60
+ default_surface: "native_cli_plus_deferred_mcp",
61
+ counts: {
62
+ sites: input.adapters.length,
63
+ commands,
64
+ },
65
+ mcp_config: {
66
+ command: "npx",
67
+ args: ["-y", "@zenalexa/unicli", "mcp", "serve", "--profile", "deferred"],
68
+ },
69
+ tool_exposure: {
70
+ default_tools: 4,
71
+ deferred_stubs: commands,
72
+ expanded_tools: commands + 4,
73
+ expanded_opt_in: true,
74
+ },
75
+ contract_summary: buildContractSummary(input.adapters),
76
+ deferred_toolsearch: {
77
+ source: "CommandContract",
78
+ tool_name_pattern: "unicli_<site>_<command>",
79
+ loaded_fields: [
80
+ "identity.site",
81
+ "identity.command",
82
+ "description",
83
+ "schemas.input",
84
+ "effect",
85
+ "auth",
86
+ "repair",
87
+ ],
88
+ full_schema_resolution: "tools/call via expandedRegistry",
89
+ },
90
+ smoke_tasks: [
91
+ {
92
+ name: "catalog discovery",
93
+ command: 'unicli search "hackernews top stories"',
94
+ proves: "native CLI remains the primary low-context entry point",
95
+ },
96
+ {
97
+ name: "mcp health",
98
+ command: "unicli mcp health --json",
99
+ proves: "local registry loads before Codex attaches MCP",
100
+ },
101
+ {
102
+ name: "deferred MCP",
103
+ command: "npx -y @zenalexa/unicli mcp serve --profile deferred",
104
+ proves: "Codex sees ToolSearch-ready stubs instead of expanded schemas",
105
+ },
106
+ ],
107
+ };
108
+ }
109
+ export function formatCodexPack(pack) {
110
+ const tomlArgs = `[${pack.mcp_config.args
111
+ .map((arg) => JSON.stringify(arg))
112
+ .join(", ")}]`;
113
+ const lines = [
114
+ "# Codex Uni-CLI Pack",
115
+ "",
116
+ "Use native CLI first for command execution; attach deferred MCP for ToolSearch discovery.",
117
+ "",
118
+ "```toml",
119
+ "[mcp_servers.unicli]",
120
+ `command = ${JSON.stringify(pack.mcp_config.command)}`,
121
+ `args = ${tomlArgs}`,
122
+ "```",
123
+ "",
124
+ "## Contract",
125
+ "",
126
+ `- Source: CommandContract (${pack.contract_summary.schema_version})`,
127
+ `- Sites: ${pack.counts.sites}`,
128
+ `- Commands: ${pack.counts.commands}`,
129
+ `- Read-only: ${pack.contract_summary.read_only}`,
130
+ `- Write/destructive: ${pack.contract_summary.write_or_destructive}`,
131
+ `- Auth required: ${pack.contract_summary.auth_required}`,
132
+ `- Browser-backed: ${pack.contract_summary.browser_backed}`,
133
+ "",
134
+ "## Tool Exposure",
135
+ "",
136
+ `- Default tools: ${pack.tool_exposure.default_tools}`,
137
+ `- Deferred stubs: ${pack.tool_exposure.deferred_stubs}`,
138
+ `- Expanded tools: ${pack.tool_exposure.expanded_tools} (explicit opt-in only)`,
139
+ `- Tool pattern: ${pack.deferred_toolsearch.tool_name_pattern}`,
140
+ "",
141
+ "## Smoke",
142
+ "",
143
+ ...pack.smoke_tasks.map((task) => {
144
+ return `- ${task.command} — ${task.proves}`;
145
+ }),
146
+ "",
147
+ "## Budget",
148
+ "",
149
+ `- Estimated pack tokens: ${pack.token_budget.estimated_tokens}`,
150
+ `- Method: ${pack.token_budget.method}`,
151
+ "",
152
+ ];
153
+ return lines.join("\n");
154
+ }
155
+ export function buildCodexPack(input) {
156
+ const base = codexPackWithoutBudget(input);
157
+ const content = formatCodexPack({
158
+ ...base,
159
+ token_budget: { method: "heuristic-o200k", estimated_tokens: 0, chars: 0 },
160
+ });
161
+ return { ...base, token_budget: estimateTokens(content) };
162
+ }
163
+ //# sourceMappingURL=codex-pack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-pack.js","sourceRoot":"","sources":["../../src/agents/codex-pack.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../src/commands/agents.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAwcpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAyF5D"}
1
+ {"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../src/commands/agents.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA0ZpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAyF5D"}
@@ -22,6 +22,7 @@ import chalk from "chalk";
22
22
  import { writeFileSync } from "node:fs";
23
23
  import { resolve } from "node:path";
24
24
  import { registerAgentBackendCommands } from "./agents-backends.js";
25
+ import { buildCodexPack, formatCodexPack } from "../agents/codex-pack.js";
25
26
  import { commandRequiresAuth, commandStrategy, getAllAdapters, listCommands, } from "../registry.js";
26
27
  import { VERSION } from "../constants.js";
27
28
  import { format, detectFormat } from "../output/formatter.js";
@@ -158,49 +159,11 @@ function formatClaude(ctx) {
158
159
  return lines.join("\n");
159
160
  }
160
161
  function formatCodex(ctx) {
161
- const lines = [];
162
- // TOML MCP config snippet
163
- lines.push("# .codex/config.toml — MCP server configuration");
164
- lines.push("");
165
- lines.push("[mcp_servers.unicli]");
166
- lines.push('command = "npx"');
167
- lines.push('args = ["-y", "@zenalexa/unicli", "mcp", "serve"]');
168
- lines.push("");
169
- lines.push("# ---");
170
- lines.push("");
171
- // AGENTS.md portion
172
- lines.push(`# unicli — ${ctx.sites} sites, ${ctx.commands} commands`);
173
- lines.push("");
174
- lines.push("## Installation");
175
- lines.push("");
176
- lines.push("```bash");
177
- lines.push("npm i -g @zenalexa/unicli");
178
- lines.push("```");
179
- lines.push("");
180
- lines.push("## Usage");
181
- lines.push("");
182
- lines.push("```");
183
- lines.push("unicli <site> <command> [args] [--json]");
184
- lines.push("```");
185
- lines.push("");
186
- lines.push("Piped output auto-switches to JSON. Exit codes follow sysexits.h.");
187
- lines.push("");
188
- lines.push("## Sites");
189
- lines.push("");
190
- for (const adapter of ctx.adapters) {
191
- lines.push(`### ${adapter.name}`);
192
- for (const [cmd, info] of Object.entries(adapter.commands)) {
193
- const desc = info.description ?? "";
194
- lines.push(`- \`unicli ${adapter.name} ${cmd}\` — ${desc}`);
195
- }
196
- }
197
- lines.push("");
198
- lines.push("## Self-Repair");
199
- lines.push("");
200
- lines.push("On failure, structured JSON errors include `adapter_path` and `suggestion`.");
201
- lines.push("Read the adapter file, fix, and retry. Automated: `unicli repair <site> <command>`.");
202
- lines.push("");
203
- return lines.join("\n");
162
+ return formatCodexPack(buildCodexPack({
163
+ version: ctx.version,
164
+ date: ctx.date,
165
+ adapters: ctx.adapters,
166
+ }));
204
167
  }
205
168
  function formatOpenclaw(ctx) {
206
169
  const skills = ctx.commandList.map((cmd) => ({