@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,154 @@
1
+ /**
2
+ * @owner src/adapters/jikan/web.ts
3
+ * @does Register Jikan public MyAnimeList search commands for anime, manga, characters, and people.
4
+ * @needs Jikan v4 public REST API and MAL entity URL formats.
5
+ * @feeds ACG title, character, and creator discovery.
6
+ * @breaks Jikan throttling or response field changes can block MyAnimeList-backed lookup.
7
+ */
8
+ import { USER_AGENT } from "../../constants.js";
9
+ import { cli, Strategy } from "../../registry.js";
10
+ const API = "https://api.jikan.moe/v4";
11
+ function str(value) {
12
+ return value === undefined || value === null ? "" : String(value);
13
+ }
14
+ function required(value, label) {
15
+ const text = str(value).trim();
16
+ if (!text)
17
+ throw new Error(`jikan ${label} cannot be empty.`);
18
+ return text;
19
+ }
20
+ function requireLimit(value) {
21
+ if (value === undefined || value === null || value === "")
22
+ return 10;
23
+ const n = Number(value);
24
+ if (!Number.isInteger(n) || n < 1 || n > 25) {
25
+ throw new Error("jikan limit must be an integer in [1, 25].");
26
+ }
27
+ return n;
28
+ }
29
+ function optionalYear(value) {
30
+ if (value === undefined || value === null || value === "")
31
+ return undefined;
32
+ const n = Number(value);
33
+ if (!Number.isInteger(n) || n < 1900 || n > 2100) {
34
+ throw new Error("jikan year must be an integer in [1900, 2100].");
35
+ }
36
+ return n;
37
+ }
38
+ const SORTS = {
39
+ score: { orderBy: "score", direction: "desc" },
40
+ popularity: { orderBy: "popularity", direction: "asc" },
41
+ recent: { orderBy: "start_date", direction: "desc" },
42
+ relevance: { orderBy: "", direction: "" },
43
+ };
44
+ function sortSpec(value) {
45
+ const key = String(value ?? "relevance").trim();
46
+ const spec = SORTS[key];
47
+ if (!spec) {
48
+ throw new Error(`jikan sort must be one of: ${Object.keys(SORTS).join(", ")}.`);
49
+ }
50
+ return spec;
51
+ }
52
+ async function fetchJikan(path, query, limit, kwargs) {
53
+ const url = new URL(`${API}/${path}`);
54
+ url.searchParams.set("q", query);
55
+ url.searchParams.set("limit", String(limit));
56
+ if (path === "anime" || path === "manga") {
57
+ const year = optionalYear(kwargs.year);
58
+ if (year) {
59
+ url.searchParams.set("start_date", `${year}-01-01`);
60
+ url.searchParams.set("end_date", `${year}-12-31`);
61
+ }
62
+ const sort = sortSpec(kwargs.sort);
63
+ if (sort.orderBy) {
64
+ url.searchParams.set("order_by", sort.orderBy);
65
+ url.searchParams.set("sort", sort.direction);
66
+ }
67
+ }
68
+ const response = await fetch(url, {
69
+ headers: { Accept: "application/json", "User-Agent": USER_AGENT },
70
+ });
71
+ if (!response.ok)
72
+ throw new Error(`jikan request failed with HTTP ${response.status}.`);
73
+ const data = (await response.json());
74
+ return data.data ?? [];
75
+ }
76
+ export function mapJikanRows(rows, kind) {
77
+ return rows.map((row, index) => {
78
+ const item = row;
79
+ const images = item.images;
80
+ return {
81
+ rank: index + 1,
82
+ id: item.mal_id ?? null,
83
+ kind,
84
+ title: str(item.title ?? item.name),
85
+ title_japanese: str(item.title_japanese ?? item.name_kanji),
86
+ type: str(item.type),
87
+ score: item.score ?? null,
88
+ members: item.members ?? item.favorites ?? null,
89
+ url: str(item.url),
90
+ image: str(images?.jpg?.image_url),
91
+ };
92
+ });
93
+ }
94
+ async function search(kind, kwargs) {
95
+ const query = required(kwargs.query, "query");
96
+ const cap = requireLimit(kwargs.limit);
97
+ const rows = mapJikanRows(await fetchJikan(kind, query, cap, kwargs), kind);
98
+ if (rows.length === 0)
99
+ throw new Error(`No Jikan ${kind} found for "${query}".`);
100
+ return rows;
101
+ }
102
+ const ENTITY_ARGS = [
103
+ { name: "query", type: "str", required: true, positional: true },
104
+ { name: "limit", type: "int", default: 10 },
105
+ ];
106
+ const MEDIA_ARGS = [
107
+ { name: "query", type: "str", required: true, positional: true },
108
+ { name: "limit", type: "int", default: 10 },
109
+ { name: "year", type: "int" },
110
+ {
111
+ name: "sort",
112
+ type: "str",
113
+ default: "relevance",
114
+ choices: ["relevance", "score", "popularity", "recent"],
115
+ },
116
+ ];
117
+ const COLUMNS = [
118
+ "rank",
119
+ "id",
120
+ "kind",
121
+ "title",
122
+ "title_japanese",
123
+ "type",
124
+ "score",
125
+ "members",
126
+ "url",
127
+ ];
128
+ for (const name of ["anime", "manga"]) {
129
+ cli({
130
+ site: "jikan",
131
+ name,
132
+ description: `Search MyAnimeList ${name} through Jikan by Japanese name, romaji, or alias`,
133
+ domain: "api.jikan.moe",
134
+ strategy: Strategy.PUBLIC,
135
+ browser: false,
136
+ args: MEDIA_ARGS,
137
+ columns: COLUMNS,
138
+ func: async (_page, kwargs) => search(name, kwargs),
139
+ });
140
+ }
141
+ for (const name of ["characters", "people"]) {
142
+ cli({
143
+ site: "jikan",
144
+ name,
145
+ description: `Search MyAnimeList ${name} through Jikan by Japanese name, romaji, or alias`,
146
+ domain: "api.jikan.moe",
147
+ strategy: Strategy.PUBLIC,
148
+ browser: false,
149
+ args: ENTITY_ARGS,
150
+ columns: COLUMNS,
151
+ func: async (_page, kwargs) => search(name, kwargs),
152
+ });
153
+ }
154
+ //# sourceMappingURL=web.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web.js","sourceRoot":"","sources":["../../../src/adapters/jikan/web.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * @owner src/adapters/kitsu/web.ts
3
+ * @does Register Kitsu public anime and manga search commands.
4
+ * @needs Kitsu JSON:API text filters and public media pages.
5
+ * @feeds ACG title discovery with community rating and subtype metadata.
6
+ * @breaks Kitsu JSON:API field changes or service availability can block lookup.
7
+ */
8
+ export declare function mapKitsuMedia(rows: unknown[]): Record<string, unknown>[];
9
+ //# sourceMappingURL=web.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web.d.ts","sourceRoot":"","sources":["../../../src/adapters/kitsu/web.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA0BH,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAsBxE"}
@@ -0,0 +1,97 @@
1
+ /**
2
+ * @owner src/adapters/kitsu/web.ts
3
+ * @does Register Kitsu public anime and manga search commands.
4
+ * @needs Kitsu JSON:API text filters and public media pages.
5
+ * @feeds ACG title discovery with community rating and subtype metadata.
6
+ * @breaks Kitsu JSON:API field changes or service availability can block lookup.
7
+ */
8
+ import { USER_AGENT } from "../../constants.js";
9
+ import { cli, Strategy } from "../../registry.js";
10
+ const API = "https://kitsu.io/api/edge";
11
+ function str(value) {
12
+ return value === undefined || value === null ? "" : String(value);
13
+ }
14
+ function required(value) {
15
+ const text = str(value).trim();
16
+ if (!text)
17
+ throw new Error("kitsu query cannot be empty.");
18
+ return text;
19
+ }
20
+ function requireLimit(value) {
21
+ if (value === undefined || value === null || value === "")
22
+ return 10;
23
+ const n = Number(value);
24
+ if (!Number.isInteger(n) || n < 1 || n > 20) {
25
+ throw new Error("kitsu limit must be an integer in [1, 20].");
26
+ }
27
+ return n;
28
+ }
29
+ export function mapKitsuMedia(rows) {
30
+ return rows.map((row, index) => {
31
+ const item = row;
32
+ const attrs = item.attributes ?? {};
33
+ const titles = attrs.titles ?? {};
34
+ return {
35
+ rank: index + 1,
36
+ id: item.id,
37
+ type: item.type,
38
+ title: str(attrs.canonicalTitle || titles.en || titles.en_jp || titles.ja_jp),
39
+ subtype: str(attrs.subtype),
40
+ status: str(attrs.status),
41
+ start_date: str(attrs.startDate),
42
+ average_rating: str(attrs.averageRating),
43
+ popularity_rank: attrs.popularityRank ?? null,
44
+ synopsis: str(attrs.synopsis).slice(0, 500),
45
+ url: `https://kitsu.io/${item.type}/${attrs.slug || item.id}`,
46
+ };
47
+ });
48
+ }
49
+ async function search(kind, kwargs) {
50
+ const query = required(kwargs.query);
51
+ const cap = requireLimit(kwargs.limit);
52
+ const url = new URL(`${API}/${kind}`);
53
+ url.searchParams.set("filter[text]", query);
54
+ url.searchParams.set("page[limit]", String(cap));
55
+ const response = await fetch(url, {
56
+ headers: {
57
+ Accept: "application/vnd.api+json",
58
+ "User-Agent": USER_AGENT,
59
+ },
60
+ });
61
+ if (!response.ok)
62
+ throw new Error(`kitsu request failed with HTTP ${response.status}.`);
63
+ const data = (await response.json());
64
+ const rows = mapKitsuMedia(data.data ?? []);
65
+ if (rows.length === 0)
66
+ throw new Error(`No Kitsu ${kind} found for "${query}".`);
67
+ return rows;
68
+ }
69
+ const ARGS = [
70
+ { name: "query", type: "str", required: true, positional: true },
71
+ { name: "limit", type: "int", default: 10 },
72
+ ];
73
+ const COLUMNS = [
74
+ "rank",
75
+ "id",
76
+ "type",
77
+ "title",
78
+ "subtype",
79
+ "status",
80
+ "start_date",
81
+ "average_rating",
82
+ "url",
83
+ ];
84
+ for (const name of ["anime", "manga"]) {
85
+ cli({
86
+ site: "kitsu",
87
+ name,
88
+ description: `Search Kitsu ${name} by Japanese title, romaji, alias, or keyword`,
89
+ domain: "kitsu.io",
90
+ strategy: Strategy.PUBLIC,
91
+ browser: false,
92
+ args: ARGS,
93
+ columns: COLUMNS,
94
+ func: async (_page, kwargs) => search(name, kwargs),
95
+ });
96
+ }
97
+ //# sourceMappingURL=web.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web.js","sourceRoot":"","sources":["../../../src/adapters/kitsu/web.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * @owner src/adapters/mangadex/web.ts
3
+ * @does Register MangaDex public manga and author search commands.
4
+ * @needs MangaDex public API and relationship include semantics.
5
+ * @feeds Manga/doujin-adjacent title and creator discovery.
6
+ * @breaks MangaDex API schema or public rate limits can block lookup.
7
+ */
8
+ export declare function mapMangaDexManga(rows: unknown[]): Record<string, unknown>[];
9
+ export declare function mapMangaDexAuthors(rows: unknown[]): Record<string, unknown>[];
10
+ //# sourceMappingURL=web.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web.d.ts","sourceRoot":"","sources":["../../../src/adapters/mangadex/web.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA8FH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAiB3E;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAe7E"}
@@ -0,0 +1,188 @@
1
+ /**
2
+ * @owner src/adapters/mangadex/web.ts
3
+ * @does Register MangaDex public manga and author search commands.
4
+ * @needs MangaDex public API and relationship include semantics.
5
+ * @feeds Manga/doujin-adjacent title and creator discovery.
6
+ * @breaks MangaDex API schema or public rate limits can block lookup.
7
+ */
8
+ import { USER_AGENT } from "../../constants.js";
9
+ import { cli, Strategy } from "../../registry.js";
10
+ const API = "https://api.mangadex.org";
11
+ function str(value) {
12
+ return value === undefined || value === null ? "" : String(value);
13
+ }
14
+ function required(value, label) {
15
+ const text = str(value).trim();
16
+ if (!text)
17
+ throw new Error(`mangadex ${label} cannot be empty.`);
18
+ return text;
19
+ }
20
+ function requireLimit(value) {
21
+ if (value === undefined || value === null || value === "")
22
+ return 10;
23
+ const n = Number(value);
24
+ if (!Number.isInteger(n) || n < 1 || n > 50) {
25
+ throw new Error("mangadex limit must be an integer in [1, 50].");
26
+ }
27
+ return n;
28
+ }
29
+ function optionalYear(value) {
30
+ if (value === undefined || value === null || value === "")
31
+ return undefined;
32
+ const n = Number(value);
33
+ if (!Number.isInteger(n) || n < 1900 || n > 2100) {
34
+ throw new Error("mangadex year must be an integer in [1900, 2100].");
35
+ }
36
+ return n;
37
+ }
38
+ const SORT_PARAMS = {
39
+ relevance: undefined,
40
+ latest: ["order[latestUploadedChapter]", "desc"],
41
+ followed: ["order[followedCount]", "desc"],
42
+ year: ["order[year]", "desc"],
43
+ };
44
+ function applySort(url, value) {
45
+ const key = String(value ?? "relevance").trim();
46
+ const spec = SORT_PARAMS[key];
47
+ if (!(key in SORT_PARAMS)) {
48
+ throw new Error(`mangadex sort must be one of: ${Object.keys(SORT_PARAMS).join(", ")}.`);
49
+ }
50
+ if (spec)
51
+ url.searchParams.set(spec[0], spec[1]);
52
+ }
53
+ const CONTENT_RATINGS = new Set([
54
+ "safe",
55
+ "suggestive",
56
+ "erotica",
57
+ "pornographic",
58
+ "all",
59
+ ]);
60
+ function applyContentRating(url, value) {
61
+ if (value === undefined || value === null || value === "")
62
+ return;
63
+ const rating = String(value).trim();
64
+ if (!CONTENT_RATINGS.has(rating)) {
65
+ throw new Error(`mangadex content_rating must be one of: ${Array.from(CONTENT_RATINGS).join(", ")}.`);
66
+ }
67
+ if (rating !== "all")
68
+ url.searchParams.append("contentRating[]", rating);
69
+ }
70
+ async function getJson(url) {
71
+ const response = await fetch(url, {
72
+ headers: { Accept: "application/json", "User-Agent": USER_AGENT },
73
+ });
74
+ if (!response.ok)
75
+ throw new Error(`mangadex request failed with HTTP ${response.status}.`);
76
+ const data = (await response.json());
77
+ if (data.result && data.result !== "ok")
78
+ throw new Error(`mangadex API returned ${data.result}.`);
79
+ return data.data ?? [];
80
+ }
81
+ function localized(values) {
82
+ const obj = values && typeof values === "object"
83
+ ? values
84
+ : {};
85
+ return str(obj.en || obj.ja || obj["ja-ro"] || obj.zh || Object.values(obj)[0]);
86
+ }
87
+ export function mapMangaDexManga(rows) {
88
+ return rows.map((row, index) => {
89
+ const item = row;
90
+ const attrs = item.attributes ?? {};
91
+ return {
92
+ rank: index + 1,
93
+ id: item.id,
94
+ title: localized(attrs.title),
95
+ status: str(attrs.status),
96
+ year: attrs.year ?? null,
97
+ content_rating: str(attrs.contentRating),
98
+ latest_uploaded_chapter: str(attrs.latestUploadedChapter),
99
+ description: localized(attrs.description).slice(0, 700),
100
+ url: `https://mangadex.org/title/${item.id}`,
101
+ };
102
+ });
103
+ }
104
+ export function mapMangaDexAuthors(rows) {
105
+ return rows.map((row, index) => {
106
+ const item = row;
107
+ const attrs = item.attributes ?? {};
108
+ return {
109
+ rank: index + 1,
110
+ id: item.id,
111
+ name: str(attrs.name),
112
+ twitter: str(attrs.twitter),
113
+ pixiv: str(attrs.pixiv),
114
+ website: str(attrs.website),
115
+ url: `https://mangadex.org/author/${item.id}`,
116
+ };
117
+ });
118
+ }
119
+ async function searchManga(kwargs) {
120
+ const query = required(kwargs.query, "query");
121
+ const url = new URL(`${API}/manga`);
122
+ url.searchParams.set("title", query);
123
+ url.searchParams.set("limit", String(requireLimit(kwargs.limit)));
124
+ const year = optionalYear(kwargs.year);
125
+ if (year)
126
+ url.searchParams.set("year", String(year));
127
+ applySort(url, kwargs.sort);
128
+ applyContentRating(url, kwargs["content-rating"]);
129
+ url.searchParams.append("includes[]", "author");
130
+ url.searchParams.append("includes[]", "artist");
131
+ const rows = mapMangaDexManga(await getJson(url));
132
+ if (rows.length === 0)
133
+ throw new Error(`No MangaDex manga found for "${query}".`);
134
+ return rows;
135
+ }
136
+ async function searchAuthors(kwargs) {
137
+ const query = required(kwargs.query, "query");
138
+ const url = new URL(`${API}/author`);
139
+ url.searchParams.set("name", query);
140
+ url.searchParams.set("limit", String(requireLimit(kwargs.limit)));
141
+ const rows = mapMangaDexAuthors(await getJson(url));
142
+ if (rows.length === 0)
143
+ throw new Error(`No MangaDex authors found for "${query}".`);
144
+ return rows;
145
+ }
146
+ const SEARCH_ARGS = [
147
+ { name: "query", type: "str", required: true, positional: true },
148
+ { name: "limit", type: "int", default: 10 },
149
+ ];
150
+ const MANGA_ARGS = [
151
+ { name: "query", type: "str", required: true, positional: true },
152
+ { name: "limit", type: "int", default: 10 },
153
+ { name: "year", type: "int" },
154
+ {
155
+ name: "sort",
156
+ type: "str",
157
+ default: "relevance",
158
+ choices: ["relevance", "latest", "followed", "year"],
159
+ },
160
+ {
161
+ name: "content-rating",
162
+ type: "str",
163
+ choices: ["safe", "suggestive", "erotica", "pornographic", "all"],
164
+ },
165
+ ];
166
+ cli({
167
+ site: "mangadex",
168
+ name: "manga",
169
+ description: "Search MangaDex manga by Japanese title, romaji, alias, or keyword",
170
+ domain: "mangadex.org",
171
+ strategy: Strategy.PUBLIC,
172
+ browser: false,
173
+ args: MANGA_ARGS,
174
+ columns: ["rank", "id", "title", "status", "year", "content_rating", "url"],
175
+ func: async (_page, kwargs) => searchManga(kwargs),
176
+ });
177
+ cli({
178
+ site: "mangadex",
179
+ name: "authors",
180
+ description: "Search MangaDex authors and artists by public name or romaji",
181
+ domain: "mangadex.org",
182
+ strategy: Strategy.PUBLIC,
183
+ browser: false,
184
+ args: SEARCH_ARGS,
185
+ columns: ["rank", "id", "name", "twitter", "pixiv", "website", "url"],
186
+ func: async (_page, kwargs) => searchAuthors(kwargs),
187
+ });
188
+ //# sourceMappingURL=web.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web.js","sourceRoot":"","sources":["../../../src/adapters/mangadex/web.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * @owner src/adapters/moegirl/web.ts
3
+ * @does Register Moegirl public search, page reading, and article link extraction commands.
4
+ * @needs Moegirl public OpenSearch endpoint and rendered MediaWiki HTML.
5
+ * @feeds ACG entity discovery, character disambiguation, and wiki-backed content research.
6
+ * @breaks Moegirl skin/template markup drift can reduce page and link extraction quality.
7
+ */
8
+ interface SearchRow {
9
+ rank: number;
10
+ title: string;
11
+ description: string;
12
+ url: string;
13
+ }
14
+ interface LinkRow {
15
+ rank: number;
16
+ title: string;
17
+ url: string;
18
+ }
19
+ export declare function mapMoegirlOpenSearch(data: unknown, limit: number): SearchRow[];
20
+ export declare function parseMoegirlPageHtml(html: string, requestedTitle: string, paragraphCap: number): Record<string, unknown>;
21
+ export declare function parseMoegirlLinksHtml(html: string, limit: number, contains: string): LinkRow[];
22
+ export {};
23
+ //# sourceMappingURL=web.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web.d.ts","sourceRoot":"","sources":["../../../src/adapters/moegirl/web.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH,UAAU,SAAS;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,UAAU,OAAO;IACf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAyFD,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,OAAO,EACb,KAAK,EAAE,MAAM,GACZ,SAAS,EAAE,CAiBb;AAwCD,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EACZ,cAAc,EAAE,MAAM,EACtB,YAAY,EAAE,MAAM,GACnB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAuCzB;AAED,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,GACf,OAAO,EAAE,CAuBX"}