agent-loadout 0.1.0 → 1.0.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.
@@ -0,0 +1,723 @@
1
+ #!/usr/bin/env node
2
+
3
+ // src/catalog.ts
4
+ var PRESETS = [
5
+ {
6
+ id: "core",
7
+ name: "Core",
8
+ description: "Fundamentals every terminal should have",
9
+ defaultOn: true
10
+ },
11
+ {
12
+ id: "agent",
13
+ name: "Agent",
14
+ description: "Tools that specifically improve LLM workflows",
15
+ defaultOn: true
16
+ },
17
+ {
18
+ id: "media",
19
+ name: "Media",
20
+ description: "Image, audio, and video pipeline tools",
21
+ defaultOn: false
22
+ },
23
+ {
24
+ id: "dx",
25
+ name: "DX",
26
+ description: "Developer experience and quality of life",
27
+ defaultOn: false
28
+ },
29
+ {
30
+ id: "security",
31
+ name: "Security",
32
+ description: "Scanning and CI hygiene",
33
+ defaultOn: false
34
+ }
35
+ ];
36
+ function universal(pkg) {
37
+ return {
38
+ darwin: [{ method: "brew", package: pkg }],
39
+ linux: [{ method: "apt", package: pkg }],
40
+ win32: [{ method: "scoop", package: pkg }]
41
+ };
42
+ }
43
+ function brewScoopAptCargo(pkg, aptPkg, cargoPkg) {
44
+ return {
45
+ darwin: [{ method: "brew", package: pkg }],
46
+ linux: [
47
+ { method: "apt", package: aptPkg },
48
+ { method: "cargo", package: cargoPkg }
49
+ ],
50
+ win32: [{ method: "scoop", package: pkg }]
51
+ };
52
+ }
53
+ function brewScoopCargo(pkg, cargoPkg) {
54
+ return {
55
+ darwin: [{ method: "brew", package: pkg }],
56
+ linux: [{ method: "cargo", package: cargoPkg }],
57
+ win32: [{ method: "scoop", package: pkg }]
58
+ };
59
+ }
60
+ function npmAll(pkg) {
61
+ return {
62
+ darwin: [{ method: "npm", package: pkg }],
63
+ linux: [{ method: "npm", package: pkg }],
64
+ win32: [{ method: "npm", package: pkg }]
65
+ };
66
+ }
67
+ var TOOLS = [
68
+ // ── Core ──────────────────────────────────────────────
69
+ {
70
+ id: "rg",
71
+ name: "ripgrep",
72
+ description: "Fast code search",
73
+ preset: "core",
74
+ verify: "rg --version",
75
+ install: brewScoopAptCargo("ripgrep", "ripgrep", "ripgrep"),
76
+ tags: ["search", "grep", "find text", "code search", "pattern match", "codebase search"],
77
+ seeAlso: ["fd", "bat", "ast-grep"]
78
+ },
79
+ {
80
+ id: "fd",
81
+ name: "fd",
82
+ description: "Fast file finder",
83
+ preset: "core",
84
+ verify: { darwin: "fd --version", linux: "fdfind --version", win32: "fd --version" },
85
+ install: {
86
+ darwin: [{ method: "brew", package: "fd" }],
87
+ linux: [{ method: "apt", package: "fd-find" }, { method: "cargo", package: "fd-find" }],
88
+ win32: [{ method: "scoop", package: "fd" }]
89
+ },
90
+ tags: ["find files", "file search", "locate files", "glob", "directory search"],
91
+ seeAlso: ["rg", "fzf", "eza"]
92
+ },
93
+ {
94
+ id: "jq",
95
+ name: "jq",
96
+ description: "JSON processor",
97
+ preset: "core",
98
+ verify: "jq --version",
99
+ install: universal("jq"),
100
+ tags: ["json", "parse json", "filter json", "api response", "json transform"],
101
+ seeAlso: ["yq", "duckdb", "xh"]
102
+ },
103
+ {
104
+ id: "yq",
105
+ name: "yq",
106
+ description: "YAML processor",
107
+ preset: "core",
108
+ verify: "yq --version",
109
+ install: {
110
+ darwin: [{ method: "brew", package: "yq" }],
111
+ // TODO: gh-release installer — no apt/cargo package; scoop has it
112
+ linux: null,
113
+ win32: [{ method: "scoop", package: "yq" }]
114
+ },
115
+ tags: ["yaml", "parse yaml", "yaml transform", "config files", "toml"],
116
+ seeAlso: ["jq", "taplo"]
117
+ },
118
+ {
119
+ id: "bat",
120
+ name: "bat",
121
+ description: "Cat with syntax highlighting",
122
+ preset: "core",
123
+ verify: "bat --version",
124
+ install: {
125
+ darwin: [{ method: "brew", package: "bat" }],
126
+ linux: [
127
+ { method: "apt", package: "bat" },
128
+ { method: "cargo", package: "bat" }
129
+ ],
130
+ win32: [{ method: "scoop", package: "bat" }]
131
+ },
132
+ tags: ["view file", "syntax highlighting", "cat", "preview code", "pager"],
133
+ seeAlso: ["rg", "delta", "glow"]
134
+ },
135
+ {
136
+ id: "tree",
137
+ name: "tree",
138
+ description: "Directory structure viewer",
139
+ preset: "core",
140
+ verify: "tree --version",
141
+ install: universal("tree"),
142
+ tags: ["directory tree", "folder structure", "list files", "project layout"],
143
+ seeAlso: ["eza", "fd", "dust"]
144
+ },
145
+ {
146
+ id: "gh",
147
+ name: "GitHub CLI",
148
+ description: "GitHub CLI for PRs, issues, releases",
149
+ preset: "core",
150
+ verify: "gh --version",
151
+ install: {
152
+ darwin: [{ method: "brew", package: "gh" }],
153
+ linux: [{ method: "apt", package: "gh" }],
154
+ win32: [{ method: "scoop", package: "gh" }]
155
+ },
156
+ tags: ["github", "pull request", "pr", "issues", "ci status", "releases", "repo management"],
157
+ seeAlso: ["lazygit", "act", "gitleaks"]
158
+ },
159
+ {
160
+ id: "fzf",
161
+ name: "fzf",
162
+ description: "Fuzzy finder",
163
+ preset: "core",
164
+ verify: "fzf --version",
165
+ install: universal("fzf"),
166
+ tags: ["fuzzy find", "interactive search", "pick file", "filter list", "autocomplete"],
167
+ seeAlso: ["fd", "rg", "zoxide"]
168
+ },
169
+ {
170
+ id: "xh",
171
+ name: "xh",
172
+ description: "Friendly HTTP client",
173
+ preset: "core",
174
+ verify: "xh --version",
175
+ install: brewScoopCargo("xh", "xh"),
176
+ tags: ["http request", "api call", "curl", "rest", "post request", "http testing"],
177
+ seeAlso: ["jq", "htmlq"]
178
+ },
179
+ // ── Agent ─────────────────────────────────────────────
180
+ {
181
+ id: "shellcheck",
182
+ name: "shellcheck",
183
+ description: "Static analysis for shell scripts",
184
+ preset: "agent",
185
+ verify: "shellcheck --version",
186
+ install: universal("shellcheck"),
187
+ tags: ["shell script", "bash lint", "script error", "sh validation", "bash debug"],
188
+ seeAlso: ["sd", "just"]
189
+ },
190
+ {
191
+ id: "ast-grep",
192
+ name: "ast-grep",
193
+ description: "Structural code search/replace",
194
+ preset: "agent",
195
+ verify: "sg --version",
196
+ install: {
197
+ darwin: [{ method: "brew", package: "ast-grep" }],
198
+ linux: [{ method: "cargo", package: "ast-grep" }],
199
+ win32: [{ method: "scoop", package: "ast-grep" }]
200
+ },
201
+ tags: ["structural search", "code pattern", "ast", "refactor", "codemod", "syntax-aware"],
202
+ seeAlso: ["rg", "sd", "biome"]
203
+ },
204
+ {
205
+ id: "just",
206
+ name: "just",
207
+ description: "Command runner (agent-readable task menu)",
208
+ preset: "agent",
209
+ verify: "just --version",
210
+ install: brewScoopCargo("just", "just"),
211
+ tags: ["task runner", "commands menu", "build tasks", "makefile", "recipe", "run scripts"],
212
+ seeAlso: ["watchexec", "shellcheck"]
213
+ },
214
+ {
215
+ id: "grex",
216
+ name: "grex",
217
+ description: "Generate regex from examples",
218
+ preset: "agent",
219
+ verify: "grex --version",
220
+ install: brewScoopCargo("grex", "grex"),
221
+ tags: ["regex", "generate regex", "pattern from examples", "regular expression", "infer pattern"],
222
+ seeAlso: ["sd", "rg"]
223
+ },
224
+ {
225
+ id: "knip",
226
+ name: "knip",
227
+ description: "Find unused code/deps in TS/JS",
228
+ preset: "agent",
229
+ verify: "knip --version",
230
+ install: npmAll("knip"),
231
+ tags: ["unused code", "dead code", "unused imports", "ts cleanup", "dependency audit"],
232
+ seeAlso: ["biome", "tokei"]
233
+ },
234
+ {
235
+ id: "sd",
236
+ name: "sd",
237
+ description: "Simpler sed replacement",
238
+ preset: "agent",
239
+ verify: "sd --version",
240
+ install: brewScoopCargo("sd", "sd"),
241
+ tags: ["find replace", "text substitution", "sed", "regex replace", "bulk edit"],
242
+ seeAlso: ["rg", "ast-grep", "grex"]
243
+ },
244
+ {
245
+ id: "hyperfine",
246
+ name: "hyperfine",
247
+ description: "CLI benchmarking",
248
+ preset: "agent",
249
+ verify: "hyperfine --version",
250
+ install: brewScoopAptCargo("hyperfine", "hyperfine", "hyperfine"),
251
+ tags: ["benchmark", "performance test", "timing", "compare commands", "profiling"],
252
+ seeAlso: ["tokei", "btm"]
253
+ },
254
+ {
255
+ id: "tokei",
256
+ name: "tokei",
257
+ description: "Code statistics",
258
+ preset: "agent",
259
+ verify: "tokei --version",
260
+ install: brewScoopCargo("tokei", "tokei"),
261
+ tags: ["code stats", "line count", "language breakdown", "codebase size", "loc"],
262
+ seeAlso: ["hyperfine", "knip", "dust"]
263
+ },
264
+ {
265
+ id: "tldr",
266
+ name: "tldr",
267
+ description: "Quick man page summaries",
268
+ preset: "agent",
269
+ verify: "tldr --version",
270
+ install: universal("tldr"),
271
+ tags: ["man page", "command help", "usage examples", "quick reference", "cheatsheet"],
272
+ seeAlso: ["bat", "glow"]
273
+ },
274
+ {
275
+ id: "biome",
276
+ name: "biome",
277
+ description: "Lint + format JS/TS",
278
+ preset: "agent",
279
+ verify: "biome --version",
280
+ install: {
281
+ darwin: [{ method: "brew", package: "biome" }],
282
+ linux: [{ method: "npm", package: "@biomejs/biome" }],
283
+ win32: [{ method: "npm", package: "@biomejs/biome" }]
284
+ },
285
+ tags: ["lint", "format", "typescript", "javascript", "code style", "prettier alternative"],
286
+ seeAlso: ["knip", "ast-grep", "typos"]
287
+ },
288
+ {
289
+ id: "difftastic",
290
+ name: "difftastic",
291
+ description: "Structural/AST diff",
292
+ preset: "agent",
293
+ verify: "difft --version",
294
+ install: brewScoopCargo("difftastic", "difftastic"),
295
+ tags: ["diff", "compare files", "git diff", "structural diff", "ast diff"],
296
+ seeAlso: ["delta", "ast-grep"]
297
+ },
298
+ {
299
+ id: "pandoc",
300
+ name: "pandoc",
301
+ description: "Universal document converter",
302
+ preset: "agent",
303
+ verify: "pandoc --version",
304
+ install: universal("pandoc"),
305
+ tags: ["convert document", "markdown to pdf", "docx", "format conversion", "export"],
306
+ seeAlso: ["glow", "bat"]
307
+ },
308
+ {
309
+ id: "duckdb",
310
+ name: "duckdb",
311
+ description: "SQL analytics on CSV/JSON/Parquet files",
312
+ preset: "agent",
313
+ verify: "duckdb --version",
314
+ install: {
315
+ darwin: [{ method: "brew", package: "duckdb" }],
316
+ // TODO: gh-release installer — no reliable apt/cargo package
317
+ linux: null,
318
+ win32: [{ method: "scoop", package: "duckdb" }]
319
+ },
320
+ tags: ["sql", "csv", "parquet", "analytics", "query data", "data analysis"],
321
+ seeAlso: ["jq", "yq", "htmlq"]
322
+ },
323
+ {
324
+ id: "htmlq",
325
+ name: "htmlq",
326
+ description: "Extract content from HTML using CSS selectors",
327
+ preset: "agent",
328
+ verify: "htmlq --version",
329
+ install: brewScoopCargo("htmlq", "htmlq"),
330
+ tags: ["html", "css selector", "scrape", "extract html", "parse html", "web"],
331
+ seeAlso: ["xh", "jq", "duckdb"]
332
+ },
333
+ {
334
+ id: "typos",
335
+ name: "typos",
336
+ description: "Source code spell checker",
337
+ preset: "agent",
338
+ verify: "typos --version",
339
+ install: {
340
+ darwin: [{ method: "brew", package: "typos-cli" }],
341
+ linux: [{ method: "cargo", package: "typos-cli" }],
342
+ win32: [{ method: "scoop", package: "typos" }]
343
+ },
344
+ tags: ["spell check", "typo", "source code spelling", "writing quality", "documentation"],
345
+ seeAlso: ["biome", "shellcheck"]
346
+ },
347
+ {
348
+ id: "gum",
349
+ name: "gum",
350
+ description: "Interactive UI components for shell scripts",
351
+ preset: "agent",
352
+ verify: "gum --version",
353
+ install: {
354
+ darwin: [{ method: "brew", package: "gum" }],
355
+ // TODO: gh-release installer — no apt/cargo package
356
+ linux: null,
357
+ win32: [{ method: "scoop", package: "gum" }]
358
+ },
359
+ tags: ["interactive shell", "tui prompt", "user input", "shell script ui", "confirm dialog"],
360
+ seeAlso: ["fzf", "just"]
361
+ },
362
+ // ── Media ─────────────────────────────────────────────
363
+ {
364
+ id: "ffmpeg",
365
+ name: "ffmpeg",
366
+ description: "Audio/video Swiss army knife",
367
+ preset: "media",
368
+ verify: "ffmpeg -version",
369
+ install: universal("ffmpeg"),
370
+ tags: ["video convert", "audio convert", "transcode", "encode", "media processing", "extract audio"],
371
+ seeAlso: ["imagemagick", "exiftool"]
372
+ },
373
+ {
374
+ id: "exiftool",
375
+ name: "exiftool",
376
+ description: "Image/media metadata",
377
+ preset: "media",
378
+ verify: "exiftool -ver",
379
+ install: {
380
+ darwin: [{ method: "brew", package: "exiftool" }],
381
+ linux: [{ method: "apt", package: "libimage-exiftool-perl" }],
382
+ win32: [{ method: "scoop", package: "exiftool" }]
383
+ },
384
+ tags: ["image metadata", "exif", "photo info", "media tags", "strip metadata"],
385
+ seeAlso: ["imagemagick", "ffmpeg"]
386
+ },
387
+ {
388
+ id: "imagemagick",
389
+ name: "ImageMagick",
390
+ description: "Image transforms",
391
+ preset: "media",
392
+ verify: "magick -version",
393
+ install: universal("imagemagick"),
394
+ tags: ["image resize", "image convert", "image transform", "thumbnail", "crop image"],
395
+ seeAlso: ["exiftool", "svgo", "ffmpeg"]
396
+ },
397
+ {
398
+ id: "svgo",
399
+ name: "svgo",
400
+ description: "SVG optimiser",
401
+ preset: "media",
402
+ verify: "svgo --version",
403
+ install: npmAll("svgo"),
404
+ tags: ["svg optimize", "svg compress", "vector graphics", "svg minify", "icon optimize"],
405
+ seeAlso: ["imagemagick"]
406
+ },
407
+ // ── DX ────────────────────────────────────────────────
408
+ {
409
+ id: "eza",
410
+ name: "eza",
411
+ description: "Modern ls replacement",
412
+ preset: "dx",
413
+ verify: "eza --version",
414
+ install: brewScoopCargo("eza", "eza"),
415
+ tags: ["list files", "ls", "directory listing", "file icons", "tree view"],
416
+ seeAlso: ["tree", "fd", "dust"]
417
+ },
418
+ {
419
+ id: "zoxide",
420
+ name: "zoxide",
421
+ description: "Smarter cd",
422
+ preset: "dx",
423
+ verify: "zoxide --version",
424
+ install: brewScoopCargo("zoxide", "zoxide"),
425
+ tags: ["cd", "directory jump", "smart navigation", "recent dirs", "z command"],
426
+ seeAlso: ["fzf", "eza"]
427
+ },
428
+ {
429
+ id: "delta",
430
+ name: "delta",
431
+ description: "Better git diffs",
432
+ preset: "dx",
433
+ verify: "delta --version",
434
+ install: {
435
+ darwin: [{ method: "brew", package: "git-delta" }],
436
+ linux: [{ method: "cargo", package: "git-delta" }],
437
+ win32: [{ method: "scoop", package: "delta" }]
438
+ },
439
+ tags: ["git diff", "diff viewer", "side by side diff", "code review", "syntax diff"],
440
+ seeAlso: ["difftastic", "lazygit", "bat"]
441
+ },
442
+ {
443
+ id: "glow",
444
+ name: "glow",
445
+ description: "Terminal markdown renderer",
446
+ preset: "dx",
447
+ verify: "glow --version",
448
+ install: {
449
+ darwin: [{ method: "brew", package: "glow" }],
450
+ // TODO: gh-release installer — no apt/cargo package
451
+ linux: null,
452
+ win32: [{ method: "scoop", package: "glow" }]
453
+ },
454
+ tags: ["render markdown", "markdown preview", "terminal markdown", "readme viewer"],
455
+ seeAlso: ["bat", "pandoc", "tldr"]
456
+ },
457
+ {
458
+ id: "mise",
459
+ name: "mise",
460
+ description: "Runtime version manager",
461
+ preset: "dx",
462
+ verify: "mise --version",
463
+ install: {
464
+ darwin: [{ method: "brew", package: "mise" }],
465
+ // TODO: gh-release installer — curl script install preferred on Linux
466
+ linux: null,
467
+ win32: [{ method: "scoop", package: "mise" }]
468
+ },
469
+ tags: ["runtime version", "node version", "python version", "version manager", "toolchain"],
470
+ seeAlso: ["uv", "direnv"]
471
+ },
472
+ {
473
+ id: "watchexec",
474
+ name: "watchexec",
475
+ description: "Run commands on file change",
476
+ preset: "dx",
477
+ verify: "watchexec --version",
478
+ install: brewScoopCargo("watchexec", "watchexec"),
479
+ tags: ["watch files", "run on change", "live reload", "file watcher", "auto restart"],
480
+ seeAlso: ["just", "mise"]
481
+ },
482
+ {
483
+ id: "mkcert",
484
+ name: "mkcert",
485
+ description: "Local HTTPS certs",
486
+ preset: "dx",
487
+ verify: "mkcert --version",
488
+ install: {
489
+ darwin: [{ method: "brew", package: "mkcert" }],
490
+ // TODO: gh-release installer — no apt/cargo package
491
+ linux: null,
492
+ win32: [{ method: "scoop", package: "mkcert" }]
493
+ },
494
+ tags: ["https", "local ssl", "dev certificate", "tls", "self signed"],
495
+ seeAlso: ["age", "trivy"]
496
+ },
497
+ {
498
+ id: "lazygit",
499
+ name: "lazygit",
500
+ description: "TUI git client",
501
+ preset: "dx",
502
+ verify: "lazygit --version",
503
+ install: {
504
+ darwin: [{ method: "brew", package: "lazygit" }],
505
+ // TODO: gh-release installer — no apt/cargo package
506
+ linux: null,
507
+ win32: [{ method: "scoop", package: "lazygit" }]
508
+ },
509
+ tags: ["git tui", "git interface", "stage commits", "git visual", "interactive git"],
510
+ seeAlso: ["gh", "delta", "difftastic"]
511
+ },
512
+ {
513
+ id: "dust",
514
+ name: "dust",
515
+ description: "Disk usage tree",
516
+ preset: "dx",
517
+ verify: "dust --version",
518
+ install: brewScoopCargo("dust", "du-dust"),
519
+ tags: ["disk usage", "disk space", "folder size", "storage", "du"],
520
+ seeAlso: ["eza", "tree", "btm"]
521
+ },
522
+ {
523
+ id: "btm",
524
+ name: "bottom",
525
+ description: "System monitor TUI",
526
+ preset: "dx",
527
+ verify: "btm --version",
528
+ install: {
529
+ darwin: [{ method: "brew", package: "bottom" }],
530
+ linux: [{ method: "cargo", package: "bottom" }],
531
+ win32: [{ method: "scoop", package: "bottom" }]
532
+ },
533
+ tags: ["system monitor", "cpu usage", "memory", "processes", "resource monitor"],
534
+ seeAlso: ["procs", "dust", "hyperfine"]
535
+ },
536
+ {
537
+ id: "direnv",
538
+ name: "direnv",
539
+ description: "Auto-load env vars per directory",
540
+ preset: "dx",
541
+ verify: "direnv version",
542
+ install: universal("direnv"),
543
+ tags: ["environment variables", "env vars", ".env", "per-project env", "dotenv"],
544
+ seeAlso: ["mise", "uv"]
545
+ },
546
+ {
547
+ id: "procs",
548
+ name: "procs",
549
+ description: "Modern ps replacement with search",
550
+ preset: "dx",
551
+ verify: "procs --version",
552
+ install: brewScoopCargo("procs", "procs"),
553
+ tags: ["process list", "ps", "running processes", "process search", "pid"],
554
+ seeAlso: ["btm", "dust"]
555
+ },
556
+ {
557
+ id: "uv",
558
+ name: "uv",
559
+ description: "Fast Python package and env manager",
560
+ preset: "dx",
561
+ verify: "uv --version",
562
+ install: {
563
+ darwin: [{ method: "brew", package: "uv" }],
564
+ linux: [{ method: "cargo", package: "uv" }],
565
+ win32: [{ method: "scoop", package: "uv" }]
566
+ },
567
+ tags: ["python", "pip", "python package", "virtualenv", "python environment"],
568
+ seeAlso: ["mise", "direnv"]
569
+ },
570
+ {
571
+ id: "hexyl",
572
+ name: "hexyl",
573
+ description: "Hex viewer with colour coding",
574
+ preset: "dx",
575
+ verify: "hexyl --version",
576
+ install: brewScoopCargo("hexyl", "hexyl"),
577
+ tags: ["hex dump", "binary file", "byte inspection", "hex view", "binary analysis"],
578
+ seeAlso: ["bat", "exiftool"]
579
+ },
580
+ {
581
+ id: "taplo",
582
+ name: "taplo",
583
+ description: "TOML toolkit (lint, format, query)",
584
+ preset: "dx",
585
+ verify: "taplo --version",
586
+ install: brewScoopCargo("taplo", "taplo-cli"),
587
+ tags: ["toml", "toml lint", "toml format", "config validation", "cargo toml"],
588
+ seeAlso: ["yq", "biome"]
589
+ },
590
+ // ── Security ──────────────────────────────────────────
591
+ {
592
+ id: "trivy",
593
+ name: "trivy",
594
+ description: "Vulnerability scanner",
595
+ preset: "security",
596
+ verify: "trivy --version",
597
+ install: {
598
+ darwin: [{ method: "brew", package: "trivy" }],
599
+ linux: [{ method: "apt", package: "trivy" }],
600
+ win32: [{ method: "scoop", package: "trivy" }]
601
+ },
602
+ tags: ["vulnerability scan", "cve", "docker scan", "dependency scan", "security audit"],
603
+ seeAlso: ["semgrep", "gitleaks", "act"]
604
+ },
605
+ {
606
+ id: "act",
607
+ name: "act",
608
+ description: "Run GitHub Actions locally",
609
+ preset: "security",
610
+ verify: "act --version",
611
+ install: {
612
+ darwin: [{ method: "brew", package: "act" }],
613
+ // TODO: gh-release installer — no apt/cargo package
614
+ linux: null,
615
+ win32: [{ method: "scoop", package: "act" }]
616
+ },
617
+ tags: ["github actions", "local ci", "workflow test", "ci debug", "actions runner"],
618
+ seeAlso: ["gh", "trivy"]
619
+ },
620
+ {
621
+ id: "gitleaks",
622
+ name: "gitleaks",
623
+ description: "Secrets scanner",
624
+ preset: "security",
625
+ verify: "gitleaks version",
626
+ install: {
627
+ darwin: [{ method: "brew", package: "gitleaks" }],
628
+ // TODO: gh-release installer — no apt/cargo package
629
+ linux: null,
630
+ win32: [{ method: "scoop", package: "gitleaks" }]
631
+ },
632
+ tags: ["secret scan", "api key leak", "credentials", "git history scan", "sensitive data"],
633
+ seeAlso: ["trivy", "semgrep", "gh"]
634
+ },
635
+ {
636
+ id: "semgrep",
637
+ name: "semgrep",
638
+ description: "Multi-language static analysis",
639
+ preset: "security",
640
+ verify: "semgrep --version",
641
+ install: {
642
+ darwin: [{ method: "brew", package: "semgrep" }],
643
+ linux: [{ method: "apt", package: "semgrep" }],
644
+ win32: null
645
+ // not available on Windows
646
+ },
647
+ tags: ["static analysis", "security scan", "code pattern", "sast", "vulnerability detection"],
648
+ seeAlso: ["trivy", "gitleaks", "shellcheck"]
649
+ },
650
+ {
651
+ id: "age",
652
+ name: "age",
653
+ description: "Simple file encryption",
654
+ preset: "security",
655
+ verify: "age --version",
656
+ install: {
657
+ darwin: [{ method: "brew", package: "age" }],
658
+ linux: [{ method: "apt", package: "age" }, { method: "cargo", package: "rage" }],
659
+ win32: [{ method: "scoop", package: "age" }]
660
+ },
661
+ tags: ["encrypt", "decrypt", "file encryption", "secrets", "pgp alternative"],
662
+ seeAlso: ["gitleaks", "mkcert"]
663
+ },
664
+ {
665
+ id: "doggo",
666
+ name: "doggo",
667
+ description: "Modern DNS client with JSON output",
668
+ preset: "security",
669
+ verify: "doggo --version",
670
+ install: {
671
+ darwin: [{ method: "brew", package: "doggo" }],
672
+ // TODO: gh-release installer — no apt package; cargo crate not maintained
673
+ linux: null,
674
+ win32: [{ method: "scoop", package: "doggo" }]
675
+ },
676
+ tags: ["dns", "dns lookup", "dns query", "nameserver", "network debug"],
677
+ seeAlso: ["xh", "trivy"]
678
+ }
679
+ ];
680
+ function getToolsByPreset(presetId) {
681
+ return TOOLS.filter((t) => t.preset === presetId);
682
+ }
683
+ function getToolsByIds(ids) {
684
+ return TOOLS.filter((t) => ids.includes(t.id));
685
+ }
686
+ function validateToolIds(ids) {
687
+ const knownIds = new Set(TOOLS.map((t) => t.id));
688
+ const valid = [];
689
+ const invalid = [];
690
+ for (const id of ids) {
691
+ (knownIds.has(id) ? valid : invalid).push(id);
692
+ }
693
+ return { valid, invalid };
694
+ }
695
+ function generateBrewfileFromCatalog() {
696
+ const lines = [
697
+ "# Auto-generated from catalog.ts \u2014 macOS only. Run: pnpm brewfile",
698
+ "# Do not edit manually.",
699
+ ""
700
+ ];
701
+ for (const preset of PRESETS) {
702
+ const tools = getToolsByPreset(preset.id);
703
+ const brewTools = tools.flatMap((t) => t.install.darwin ?? []).filter(
704
+ (pi) => pi.method === "brew"
705
+ );
706
+ if (brewTools.length === 0) continue;
707
+ lines.push(`# ${preset.name}`);
708
+ for (const pi of brewTools) {
709
+ lines.push(`brew "${pi.package}"`);
710
+ }
711
+ lines.push("");
712
+ }
713
+ return lines.join("\n");
714
+ }
715
+
716
+ export {
717
+ PRESETS,
718
+ TOOLS,
719
+ getToolsByPreset,
720
+ getToolsByIds,
721
+ validateToolIds,
722
+ generateBrewfileFromCatalog
723
+ };