@chainpatrol/cli 0.18.0 → 0.20.0

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 (40) hide show
  1. package/CHANGELOG.md +78 -0
  2. package/dist/{breakdown-ETSF2BZ3.js → breakdown-3LJBT3JQ.js} +1 -1
  3. package/dist/{check-EMGFDXUO.js → check-G64UQCEL.js} +1 -1
  4. package/dist/{chunk-HGAQBGGL.js → chunk-2JZAPTY6.js} +1 -1
  5. package/dist/{chunk-MDDC4F6Q.js → chunk-3LJTWYT6.js} +250 -2
  6. package/dist/{chunk-NQT77IB7.js → chunk-6VTWWGNV.js} +2 -1
  7. package/dist/{chunk-DPLUSURP.js → chunk-O7TMOF4W.js} +3 -0
  8. package/dist/cli.js +81 -40
  9. package/dist/{completions-6C6KG5DH.js → completions-ILC76OX5.js} +1 -1
  10. package/dist/{configs-update-EKNLIRA6.js → configs-update-MVX7Q5NW.js} +1 -1
  11. package/dist/{create-M4PV5VVU.js → create-ANCO4FXB.js} +1 -1
  12. package/dist/{drift-RQKTGJWB.js → drift-SHPMEJDU.js} +1 -1
  13. package/dist/{found-LVYBEOS6.js → found-OPL4HWOW.js} +1 -1
  14. package/dist/{get-YFYSJFBC.js → get-K7VHV5X2.js} +1 -1
  15. package/dist/{healthcheck-J6BIZEG7.js → healthcheck-QNLFKAXM.js} +1 -1
  16. package/dist/list-4VKMEKZS.js +64 -0
  17. package/dist/{list-CNF2FGLN.js → list-AQ7E23T3.js} +1 -1
  18. package/dist/{list-JCJHIJM4.js → list-FJBWSGTD.js} +2 -2
  19. package/dist/{list-O36VWTWR.js → list-FVFF4VW3.js} +1 -1
  20. package/dist/{list-S5Y6GW43.js → list-FWXQUOCP.js} +1 -1
  21. package/dist/{list-E2JVJNHV.js → list-Q5PRMAN5.js} +1 -1
  22. package/dist/{list-O62BZKQ5.js → list-QHEFB4KE.js} +1 -1
  23. package/dist/{list-XUYCZG7S.js → list-QXA6GLCV.js} +1 -1
  24. package/dist/{list-LKNCICLT.js → list-SWHKM5R6.js} +1 -1
  25. package/dist/{list-44BQZHJD.js → list-WPPNX7G3.js} +1 -1
  26. package/dist/{list-AEM2KSO4.js → list-X4Z3CPO7.js} +1 -1
  27. package/dist/{list-2ENAEZVP.js → list-XSIXAHOG.js} +1 -1
  28. package/dist/{list-json-ZTS5GXNA.js → list-json-B5L5PXKH.js} +1 -1
  29. package/dist/{organization-PFPBZXJZ.js → organization-SOMHMGTM.js} +1 -1
  30. package/dist/{run-R3RR6XQF.js → run-J5TQ2YC2.js} +1 -1
  31. package/dist/{run-HS2EEOM6.js → run-RV6P2OCD.js} +1 -1
  32. package/dist/{run-LKPKTH3W.js → run-YAAMSWKK.js} +2 -2
  33. package/dist/{search-EBXEP7XC.js → search-FQUR75WR.js} +1 -1
  34. package/dist/{setup-skill-Z6SBI6GC.js → setup-skill-A36WQLMU.js} +2 -2
  35. package/dist/{snapshot-GNZMYTXT.js → snapshot-2GDJMN3L.js} +1 -1
  36. package/dist/{summary-POVQC6B7.js → summary-LF53KXRR.js} +1 -1
  37. package/dist/types-PTMFLYUV.js +271 -0
  38. package/dist/{validate-QE2F4PYY.js → validate-UYKOMUEI.js} +1 -1
  39. package/dist/{whoami-24KUJUN4.js → whoami-OYOG63BX.js} +1 -1
  40. package/package.json +1 -1
@@ -8,7 +8,7 @@ import {
8
8
  } from "./chunk-VFT3TD3E.js";
9
9
  import {
10
10
  createApiClient
11
- } from "./chunk-DPLUSURP.js";
11
+ } from "./chunk-O7TMOF4W.js";
12
12
  import "./chunk-EGWK6SRQ.js";
13
13
  import "./chunk-TFCNKBRC.js";
14
14
  import "./chunk-U73SABXK.js";
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  getPresetDefinition,
3
3
  runPreset
4
- } from "./chunk-HGAQBGGL.js";
4
+ } from "./chunk-2JZAPTY6.js";
5
5
  import {
6
6
  CliExitError,
7
7
  ExitCode
8
8
  } from "./chunk-E2LAMILJ.js";
9
9
  import "./chunk-VFT3TD3E.js";
10
- import "./chunk-DPLUSURP.js";
10
+ import "./chunk-O7TMOF4W.js";
11
11
  import "./chunk-EGWK6SRQ.js";
12
12
  import "./chunk-TFCNKBRC.js";
13
13
  import "./chunk-U73SABXK.js";
@@ -8,7 +8,7 @@ import {
8
8
  } from "./chunk-VFT3TD3E.js";
9
9
  import {
10
10
  createApiClient
11
- } from "./chunk-DPLUSURP.js";
11
+ } from "./chunk-O7TMOF4W.js";
12
12
  import "./chunk-EGWK6SRQ.js";
13
13
  import "./chunk-TFCNKBRC.js";
14
14
  import "./chunk-U73SABXK.js";
@@ -6,8 +6,8 @@ import {
6
6
  readInstalledSkillVersion,
7
7
  setupSkill,
8
8
  uninstallSkill
9
- } from "./chunk-MDDC4F6Q.js";
10
- import "./chunk-NQT77IB7.js";
9
+ } from "./chunk-3LJTWYT6.js";
10
+ import "./chunk-6VTWWGNV.js";
11
11
  export {
12
12
  getBundledSkillContent,
13
13
  getBundledSkillVersion,
@@ -8,7 +8,7 @@ import {
8
8
  } from "./chunk-VFT3TD3E.js";
9
9
  import {
10
10
  createApiClient
11
- } from "./chunk-DPLUSURP.js";
11
+ } from "./chunk-O7TMOF4W.js";
12
12
  import "./chunk-EGWK6SRQ.js";
13
13
  import "./chunk-TFCNKBRC.js";
14
14
  import "./chunk-U73SABXK.js";
@@ -7,7 +7,7 @@ import {
7
7
  } from "./chunk-VFT3TD3E.js";
8
8
  import {
9
9
  createApiClient
10
- } from "./chunk-DPLUSURP.js";
10
+ } from "./chunk-O7TMOF4W.js";
11
11
  import "./chunk-EGWK6SRQ.js";
12
12
  import "./chunk-TFCNKBRC.js";
13
13
  import "./chunk-U73SABXK.js";
@@ -0,0 +1,271 @@
1
+ import {
2
+ printOutput,
3
+ toCsvRows
4
+ } from "./chunk-VFT3TD3E.js";
5
+
6
+ // src/lib/asset-types.ts
7
+ var ASSET_TYPES = [
8
+ {
9
+ type: "URL",
10
+ label: "URL",
11
+ description: "A full URL or domain (web page). The most common asset type for phishing sites."
12
+ },
13
+ {
14
+ type: "PAGE",
15
+ label: "Page",
16
+ description: "A standalone web page tracked independently of its parent URL (e.g. a hosted phishing kit deployed on a shared platform)."
17
+ },
18
+ {
19
+ type: "ADDRESS",
20
+ label: "Address",
21
+ description: "A blockchain address (EVM, Bitcoin, Solana, etc.) used by a threat."
22
+ },
23
+ {
24
+ type: "DISCORD",
25
+ label: "Discord",
26
+ description: "A Discord server invite or guild."
27
+ },
28
+ { type: "LINKEDIN", label: "LinkedIn", description: "A LinkedIn profile or page." },
29
+ { type: "TWITTER", label: "Twitter", description: "An X (formerly Twitter) account." },
30
+ { type: "FACEBOOK", label: "Facebook", description: "A Facebook page or profile." },
31
+ { type: "YOUTUBE", label: "YouTube", description: "A YouTube channel or video." },
32
+ { type: "REDDIT", label: "Reddit", description: "A Reddit user or subreddit." },
33
+ {
34
+ type: "TELEGRAM",
35
+ label: "Telegram",
36
+ description: "A Telegram channel, group, or user."
37
+ },
38
+ {
39
+ type: "GOOGLE_APP_STORE",
40
+ label: "Google Play Store",
41
+ description: "An Android app on Google Play."
42
+ },
43
+ {
44
+ type: "APPLE_APP_STORE",
45
+ label: "Apple App Store",
46
+ description: "An iOS app on the Apple App Store."
47
+ },
48
+ {
49
+ type: "AMAZON_APP_STORE",
50
+ label: "Amazon App Store",
51
+ description: "An Android app on the Amazon Appstore."
52
+ },
53
+ {
54
+ type: "MICROSOFT_APP_STORE",
55
+ label: "Microsoft App Store",
56
+ description: "An app in the Microsoft Store."
57
+ },
58
+ { type: "TIKTOK", label: "TikTok", description: "A TikTok account or video." },
59
+ { type: "INSTAGRAM", label: "Instagram", description: "An Instagram account." },
60
+ { type: "THREADS", label: "Threads", description: "A Threads (Meta) account." },
61
+ { type: "MEDIUM", label: "Medium", description: "A Medium blog or post." },
62
+ {
63
+ type: "CHROME_WEB_STORE",
64
+ label: "Chrome Web Store",
65
+ description: "A Chrome browser extension."
66
+ },
67
+ {
68
+ type: "MOZILLA_ADDONS",
69
+ label: "Mozilla Firefox Addons",
70
+ description: "A Firefox browser add-on."
71
+ },
72
+ {
73
+ type: "OPERA_ADDONS",
74
+ label: "Opera Addons",
75
+ description: "An Opera browser add-on."
76
+ },
77
+ { type: "EMAIL", label: "Email", description: "An email address." },
78
+ { type: "PATREON", label: "Patreon", description: "A Patreon page." },
79
+ { type: "OPENSEA", label: "OpenSea", description: "An OpenSea collection or account." },
80
+ { type: "FARCASTER", label: "Farcaster", description: "A Farcaster account." },
81
+ {
82
+ type: "IPFS",
83
+ label: "IPFS",
84
+ description: "An IPFS-hosted resource (CID or gateway URL)."
85
+ },
86
+ { type: "GOOGLE_FORM", label: "Google Form", description: "A Google Forms form." },
87
+ {
88
+ type: "WHATSAPP",
89
+ label: "WhatsApp",
90
+ description: "A WhatsApp number, group, or channel."
91
+ },
92
+ { type: "DISCORD_USER", label: "Discord User", description: "A Discord user account." },
93
+ { type: "QUORA", label: "Quora", description: "A Quora user or space." },
94
+ {
95
+ type: "GITHUB",
96
+ label: "GitHub",
97
+ description: "A GitHub account, repository, or page."
98
+ },
99
+ { type: "TEACHABLE", label: "Teachable", description: "A Teachable course or school." },
100
+ { type: "SUBSTACK", label: "Substack", description: "A Substack publication." },
101
+ { type: "DEBANK", label: "Debank", description: "A Debank profile." },
102
+ { type: "TAWK_TO", label: "Tawk.to Chat", description: "A Tawk.to live-chat widget." },
103
+ { type: "JOTFORM", label: "Jotform", description: "A Jotform form." },
104
+ { type: "PRIMAL", label: "Primal", description: "A Primal (Nostr) profile." },
105
+ { type: "BLUESKY", label: "Bluesky", description: "A Bluesky account." },
106
+ { type: "SNAPCHAT", label: "Snapchat", description: "A Snapchat account." },
107
+ { type: "DESO", label: "DeSo", description: "A DeSo profile." },
108
+ { type: "PINTEREST", label: "Pinterest", description: "A Pinterest account or board." },
109
+ { type: "FLICKR", label: "Flickr", description: "A Flickr account." },
110
+ { type: "GALXE", label: "Galxe", description: "A Galxe campaign or space." },
111
+ { type: "VELOG", label: "Velog", description: "A Velog blog or post." },
112
+ { type: "NPM", label: "npm", description: "An npm package." },
113
+ { type: "PYPI", label: "PyPI", description: "A PyPI Python package." },
114
+ { type: "HEX", label: "Hex", description: "A Hex Erlang/Elixir package." },
115
+ { type: "DOCKER_HUB", label: "Docker Hub", description: "A Docker Hub image." },
116
+ {
117
+ type: "VOCAL_MEDIA",
118
+ label: "Vocal Media",
119
+ description: "A Vocal Media profile or story."
120
+ },
121
+ { type: "TECKFINE", label: "Teckfine", description: "A Teckfine listing." },
122
+ {
123
+ type: "TENDERLY",
124
+ label: "Tenderly",
125
+ description: "A Tenderly dashboard or simulation."
126
+ },
127
+ { type: "HACKMD", label: "HackMD", description: "A HackMD note." },
128
+ { type: "ETSY", label: "Etsy", description: "An Etsy shop or listing." },
129
+ { type: "ZAZZLE", label: "Zazzle", description: "A Zazzle shop or product." },
130
+ { type: "BASENAME", label: "Basename", description: "A Base ENS (basename) record." },
131
+ {
132
+ type: "BILIBILI_TV",
133
+ label: "Bilibili TV",
134
+ description: "A Bilibili TV channel or video."
135
+ },
136
+ { type: "VIMEO", label: "Vimeo", description: "A Vimeo video or channel." },
137
+ {
138
+ type: "DAILYMOTION",
139
+ label: "Dailymotion",
140
+ description: "A Dailymotion video or channel."
141
+ },
142
+ { type: "PHONE_NUMBER", label: "Phone Number", description: "A phone number." },
143
+ { type: "SLACK", label: "Slack", description: "A Slack workspace invite." },
144
+ { type: "CALENDLY", label: "Calendly", description: "A Calendly scheduling page." },
145
+ {
146
+ type: "NGROK",
147
+ label: "Ngrok",
148
+ description: "An ngrok tunnel (often used to host short-lived phishing endpoints)."
149
+ },
150
+ { type: "RARIBLE", label: "Rarible", description: "A Rarible collection or profile." },
151
+ {
152
+ type: "RUST_PACKAGE",
153
+ label: "Rust Package",
154
+ description: "A crates.io Rust package."
155
+ },
156
+ { type: "FLATHUB", label: "Flathub", description: "A Flathub Linux app listing." },
157
+ { type: "VIDLII", label: "VidLii", description: "A VidLii video or channel." },
158
+ { type: "VEVIOZ", label: "Vevioz", description: "A Vevioz listing." },
159
+ { type: "ISSUU", label: "Issuu", description: "An Issuu publication." },
160
+ {
161
+ type: "SOUNDCLOUD",
162
+ label: "SoundCloud",
163
+ description: "A SoundCloud account or track."
164
+ },
165
+ { type: "ZAPPER", label: "Zapper", description: "A Zapper profile or bundle." },
166
+ { type: "REDNOTE", label: "RedNote", description: "A RedNote (Xiaohongshu) account." },
167
+ {
168
+ type: "SAMSUNG_APP_STORE",
169
+ label: "Samsung Galaxy Store",
170
+ description: "An app on Samsung Galaxy Store."
171
+ },
172
+ {
173
+ type: "HUAWEI_APP_STORE",
174
+ label: "Huawei AppGallery",
175
+ description: "An app on Huawei AppGallery."
176
+ },
177
+ {
178
+ type: "XIAOMI_APP_STORE",
179
+ label: "Xiaomi GetApps",
180
+ description: "An app on Xiaomi GetApps."
181
+ },
182
+ {
183
+ type: "TENCENT_APP_STORE",
184
+ label: "Tencent App Store",
185
+ description: "An app on the Tencent App Store."
186
+ },
187
+ {
188
+ type: "OPPO_APP_STORE",
189
+ label: "OPPO App Market",
190
+ description: "An app on OPPO App Market."
191
+ },
192
+ {
193
+ type: "VIVO_APP_STORE",
194
+ label: "Vivo App Store",
195
+ description: "An app on Vivo App Store."
196
+ },
197
+ { type: "F_DROID", label: "F-Droid", description: "An app on F-Droid." },
198
+ { type: "GOOGLE_AD", label: "Google Ad", description: "A Google Ads advertisement." },
199
+ { type: "BING_AD", label: "Bing Ad", description: "A Microsoft Bing advertisement." },
200
+ { type: "TWITCH", label: "Twitch", description: "A Twitch channel." },
201
+ { type: "BEHANCE", label: "Behance", description: "A Behance profile or project." },
202
+ { type: "ZORA", label: "Zora", description: "A Zora collection or profile." },
203
+ {
204
+ type: "META_AD",
205
+ label: "Meta Ad",
206
+ description: "A Facebook/Instagram (Meta) advertisement."
207
+ },
208
+ { type: "SIGNAL", label: "Signal", description: "A Signal group invite or contact." },
209
+ { type: "DEVIANTART", label: "DeviantArt", description: "A DeviantArt profile." },
210
+ { type: "BANDCAMP", label: "Bandcamp", description: "A Bandcamp page." },
211
+ {
212
+ type: "ARCHIVE_ORG",
213
+ label: "Archive.org",
214
+ description: "An Internet Archive (archive.org) snapshot \u2014 typically a Wayback Machine URL preserving a phishing page."
215
+ },
216
+ {
217
+ type: "FIVE_HUNDRED_PX",
218
+ label: "500px",
219
+ description: "A 500px photographer profile."
220
+ }
221
+ ];
222
+ var ASSET_TYPE_LABELS = Object.freeze(
223
+ Object.fromEntries(ASSET_TYPES.map((entry) => [entry.type, entry.label]))
224
+ );
225
+
226
+ // src/commands/asset/types.ts
227
+ function toRow(entry) {
228
+ return {
229
+ type: entry.type,
230
+ label: entry.label,
231
+ description: entry.description ?? ""
232
+ };
233
+ }
234
+ function runAssetTypes(options) {
235
+ const outputFormat = options.outputFormat ?? (options.json ? "json" : "human");
236
+ const rows = ASSET_TYPES.map(toRow);
237
+ const escapeMarkdownCell = (value) => value.replaceAll("|", "\\|");
238
+ printOutput({
239
+ outputFormat,
240
+ json: { assetTypes: ASSET_TYPES, count: ASSET_TYPES.length },
241
+ markdown: [
242
+ "# ChainPatrol asset types",
243
+ "",
244
+ `Total: ${ASSET_TYPES.length}`,
245
+ "",
246
+ "| Type | Label | Description |",
247
+ "| --- | --- | --- |",
248
+ ...rows.map(
249
+ (row) => `| \`${row.type}\` | ${escapeMarkdownCell(row.label)} | ${escapeMarkdownCell(row.description)} |`
250
+ )
251
+ ].join("\n"),
252
+ csv: toCsvRows(rows),
253
+ human: () => {
254
+ const typeColumnWidth = Math.max(...ASSET_TYPES.map((entry) => entry.type.length));
255
+ const labelColumnWidth = Math.max(
256
+ ...ASSET_TYPES.map((entry) => entry.label.length)
257
+ );
258
+ console.log(`ChainPatrol asset types (${ASSET_TYPES.length})`);
259
+ console.log("");
260
+ for (const entry of ASSET_TYPES) {
261
+ const type = entry.type.padEnd(typeColumnWidth);
262
+ const label = entry.label.padEnd(labelColumnWidth);
263
+ const description = entry.description ? ` ${entry.description}` : "";
264
+ console.log(`${type} ${label}${description}`);
265
+ }
266
+ }
267
+ });
268
+ }
269
+ export {
270
+ runAssetTypes
271
+ };
@@ -8,7 +8,7 @@ import {
8
8
  } from "./chunk-VFT3TD3E.js";
9
9
  import {
10
10
  createApiClient
11
- } from "./chunk-DPLUSURP.js";
11
+ } from "./chunk-O7TMOF4W.js";
12
12
  import "./chunk-EGWK6SRQ.js";
13
13
  import "./chunk-TFCNKBRC.js";
14
14
  import "./chunk-U73SABXK.js";
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-VFT3TD3E.js";
4
4
  import {
5
5
  createApiClient
6
- } from "./chunk-DPLUSURP.js";
6
+ } from "./chunk-O7TMOF4W.js";
7
7
  import "./chunk-EGWK6SRQ.js";
8
8
  import "./chunk-TFCNKBRC.js";
9
9
  import "./chunk-U73SABXK.js";
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@chainpatrol/cli",
3
3
  "description": "The official ChainPatrol CLI — terminal interface for threat detection",
4
4
  "author": "Umar Ahmed <umar@chainpatrol.io>",
5
- "version": "0.18.0",
5
+ "version": "0.20.0",
6
6
  "license": "UNLICENSED",
7
7
  "homepage": "https://chainpatrol.com/docs/cli",
8
8
  "keywords": [