@aegis-scan/skills 0.1.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 (69) hide show
  1. package/ATTRIBUTION.md +75 -0
  2. package/CHANGELOG.md +129 -0
  3. package/LICENSE +21 -0
  4. package/README.md +123 -0
  5. package/dist/bin.d.ts +3 -0
  6. package/dist/bin.d.ts.map +1 -0
  7. package/dist/bin.js +122 -0
  8. package/dist/bin.js.map +1 -0
  9. package/dist/commands/info.d.ts +5 -0
  10. package/dist/commands/info.d.ts.map +1 -0
  11. package/dist/commands/info.js +75 -0
  12. package/dist/commands/info.js.map +1 -0
  13. package/dist/commands/install.d.ts +7 -0
  14. package/dist/commands/install.d.ts.map +1 -0
  15. package/dist/commands/install.js +87 -0
  16. package/dist/commands/install.js.map +1 -0
  17. package/dist/commands/list.d.ts +7 -0
  18. package/dist/commands/list.d.ts.map +1 -0
  19. package/dist/commands/list.js +82 -0
  20. package/dist/commands/list.js.map +1 -0
  21. package/dist/index.d.ts +13 -0
  22. package/dist/index.d.ts.map +1 -0
  23. package/dist/index.js +13 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/skills-loader.d.ts +23 -0
  26. package/dist/skills-loader.d.ts.map +1 -0
  27. package/dist/skills-loader.js +213 -0
  28. package/dist/skills-loader.js.map +1 -0
  29. package/package.json +63 -0
  30. package/skills/defensive/README.md +9 -0
  31. package/skills/mitre-mapped/README.md +10 -0
  32. package/skills/offensive/snailsploit-fork/advanced-redteam/SKILL.md +148 -0
  33. package/skills/offensive/snailsploit-fork/ai-security/SKILL.md +592 -0
  34. package/skills/offensive/snailsploit-fork/basic-exploitation/SKILL.md +10783 -0
  35. package/skills/offensive/snailsploit-fork/bug-identification/SKILL.md +1256 -0
  36. package/skills/offensive/snailsploit-fork/crash-analysis/SKILL.md +12466 -0
  37. package/skills/offensive/snailsploit-fork/deserialization/SKILL.md +185 -0
  38. package/skills/offensive/snailsploit-fork/edr-evasion/SKILL.md +1806 -0
  39. package/skills/offensive/snailsploit-fork/exploit-dev-course/SKILL.md +428 -0
  40. package/skills/offensive/snailsploit-fork/exploit-development/SKILL.md +699 -0
  41. package/skills/offensive/snailsploit-fork/fast-checking/SKILL.md +487 -0
  42. package/skills/offensive/snailsploit-fork/file-upload/SKILL.md +822 -0
  43. package/skills/offensive/snailsploit-fork/fuzzing/SKILL.md +340 -0
  44. package/skills/offensive/snailsploit-fork/fuzzing-course/SKILL.md +2105 -0
  45. package/skills/offensive/snailsploit-fork/graphql/SKILL.md +209 -0
  46. package/skills/offensive/snailsploit-fork/idor/SKILL.md +608 -0
  47. package/skills/offensive/snailsploit-fork/initial-access/SKILL.md +1528 -0
  48. package/skills/offensive/snailsploit-fork/jwt/SKILL.md +276 -0
  49. package/skills/offensive/snailsploit-fork/keylogger-arch/SKILL.md +197 -0
  50. package/skills/offensive/snailsploit-fork/mitigations/SKILL.md +1351 -0
  51. package/skills/offensive/snailsploit-fork/oauth/SKILL.md +366 -0
  52. package/skills/offensive/snailsploit-fork/open-redirect/SKILL.md +487 -0
  53. package/skills/offensive/snailsploit-fork/osint/SKILL.md +399 -0
  54. package/skills/offensive/snailsploit-fork/osint-methodology/SKILL.md +434 -0
  55. package/skills/offensive/snailsploit-fork/parameter-pollution/SKILL.md +595 -0
  56. package/skills/offensive/snailsploit-fork/race-condition/SKILL.md +881 -0
  57. package/skills/offensive/snailsploit-fork/rce/SKILL.md +1069 -0
  58. package/skills/offensive/snailsploit-fork/request-smuggling/SKILL.md +773 -0
  59. package/skills/offensive/snailsploit-fork/shellcode/SKILL.md +477 -0
  60. package/skills/offensive/snailsploit-fork/sqli/SKILL.md +372 -0
  61. package/skills/offensive/snailsploit-fork/ssrf/SKILL.md +830 -0
  62. package/skills/offensive/snailsploit-fork/ssti/SKILL.md +349 -0
  63. package/skills/offensive/snailsploit-fork/vuln-classes/SKILL.md +1229 -0
  64. package/skills/offensive/snailsploit-fork/waf-bypass/SKILL.md +820 -0
  65. package/skills/offensive/snailsploit-fork/windows-boundaries/SKILL.md +15153 -0
  66. package/skills/offensive/snailsploit-fork/windows-mitigations/SKILL.md +14546 -0
  67. package/skills/offensive/snailsploit-fork/xss/SKILL.md +784 -0
  68. package/skills/offensive/snailsploit-fork/xxe/SKILL.md +996 -0
  69. package/skills/ops/README.md +6 -0
package/ATTRIBUTION.md ADDED
@@ -0,0 +1,75 @@
1
+ # Attribution
2
+
3
+ `@aegis-scan/skills` is a multi-source skill library. Each source is
4
+ credited individually below. Every fork preserves upstream provenance
5
+ via a per-file `<!-- aegis-local: forked … from <upstream>@<sha>; attribution preserved -->`
6
+ HTML comment at the top of each `SKILL.md`, independent of whichever
7
+ attribution convention the upstream author used inside the file body.
8
+
9
+ ## Offensive skills — SnailSploit/Claude-Red
10
+
11
+ All skills under `skills/offensive/snailsploit-fork/` are forked from
12
+ [SnailSploit/Claude-Red](https://github.com/SnailSploit/Claude-Red)
13
+ under MIT License.
14
+
15
+ - **Upstream author:** Kai Aizen (SnailSploit) — https://snailsploit.com
16
+ - **Upstream original source:** Sahar Shlichov — https://github.com/sahar042/offensive-checklist
17
+ - **SPDX:** MIT (README-declared by upstream; no standalone LICENSE file upstream at fork time)
18
+ - **Fork-SHA:** `c74d53e2938b59f111572e0819265a1e73029393`
19
+ - **Fork date:** 2026-04-23
20
+ - **Skill count at fork:** 37 (upstream README tabulates 38; the `patch-diffing` subdirectory listed in the README's "Infrastructure & Binary" table is absent on disk at the fork SHA, so we ship what exists rather than what is claimed)
21
+
22
+ ### Upstream-attribution format notes
23
+
24
+ Upstream uses two attribution conventions across its 37 files:
25
+
26
+ - Thirty-two files use an older `## Metadata > - Source: <url>` bullet format pointing at the upstream `sahar042/offensive-checklist` file that seeded the skill.
27
+ - Five files (`fuzzing`, `jwt`, `osint`, `shellcode`, `sqli`) use a newer YAML-frontmatter convention (`--- name: description: ---`) without a separate Metadata section.
28
+
29
+ Both conventions are semantically equivalent: they identify the skill
30
+ and, where present, link to the upstream checklist source. AEGIS
31
+ preserves whichever form the upstream file used. The reliable
32
+ per-file provenance anchor across all 37 files is the AEGIS-added
33
+ `<!-- aegis-local: forked … -->` HTML header.
34
+
35
+ ### Do-not-remove rule
36
+
37
+ Every forked `SKILL.md` retains both its original upstream content
38
+ byte-identically and the AEGIS-added header. When AEGIS runs a
39
+ quarterly upstream-sync (via `scripts/sync-upstream.sh`) the same
40
+ rule applies to any incoming updates — no stripping of upstream
41
+ attribution, no removal of AEGIS-added headers, no paper-over of
42
+ upstream format variance.
43
+
44
+ ## Defensive skills — AEGIS-native (skills-v0.2+)
45
+
46
+ Planned: AEGIS-authored defensive methodology skills mirrored from
47
+ the `@aegis-wizard/cli` pattern library under MIT License. Source is
48
+ AEGIS itself; this section will expand when the skills ship.
49
+
50
+ ## MITRE-mapped skills — upstream cybersecurity framework-mapped source (skills-v0.2+)
51
+
52
+ Planned: cherry-picked skills from
53
+ [mukul975/Anthropic-Cybersecurity-Skills](https://github.com/mukul975/Anthropic-Cybersecurity-Skills)
54
+ under Apache-2.0 with per-skill quality-audit plus MITRE ATT&CK /
55
+ D3FEND / NIST CSF framework-mappings applied. Section populates when
56
+ skills-v0.2 lands.
57
+
58
+ ## Operations skills — TBD (skills-v0.3+)
59
+
60
+ Planned: incident-response, post-build-audit, verify-install-integrity
61
+ modules. Source and attribution TBD.
62
+
63
+ ## License compatibility
64
+
65
+ AEGIS itself ships under MIT. Offensive skills ship under MIT (via
66
+ upstream). Future cybersecurity-framework-mapped cherry-picks ship
67
+ under Apache-2.0 (via upstream). Both licenses are permissive,
68
+ commercially-redistributable, and require attribution preservation —
69
+ which this file codifies. No license incompatibility.
70
+
71
+ ## Changes to upstream
72
+
73
+ See `CHANGELOG.md` for AEGIS-side version history. The only change
74
+ to any forked `SKILL.md` at v0.1.0 is the prepended AEGIS-local HTML
75
+ attribution header documented above.
package/CHANGELOG.md ADDED
@@ -0,0 +1,129 @@
1
+ # Changelog
2
+
3
+ All notable changes to `@aegis-scan/skills` are documented here. Format
4
+ follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). The
5
+ skills package uses SemVer; each minor-version may add new skill
6
+ sources and categories. Release cadence is driven by upstream-sync
7
+ and quality-audit completion, not by a fixed schedule.
8
+
9
+ ---
10
+
11
+ ## [0.1.1] — 2026-04-23 — "ship-gate-caught-recovery"
12
+
13
+ First published release. v0.1.0 was tagged but NEVER published to npm —
14
+ the publish-skills.yml tarball-scrub gate caught two internal planning-
15
+ path references in placeholder category READMEs at the `Verify no
16
+ internal-codename leaks in shipped tarball` step and refused to
17
+ publish. This v0.1.1 is the clean first-publish.
18
+
19
+ The fortress-discipline CI gate worked exactly as designed: the tag
20
+ landed, the workflow ran, the scrub-gate fired, and nothing reached
21
+ the npm registry. No force-push, no shortcut, no `--no-verify`. The
22
+ full incident post-mortem is retained in the repository's internal
23
+ planning tree; ask the maintainer for access if needed.
24
+
25
+ ### Fixed
26
+
27
+ - **`skills/defensive/README.md`** and **`skills/mitre-mapped/README.md`**
28
+ placeholder documents referenced a gitignored operator-local
29
+ planning document by its exact filename; both files are generalized
30
+ to point to "the repository's internal planning tree" instead.
31
+ - **`scripts/sync-upstream.sh`** reviewer-instruction paragraph
32
+ referenced the same operator-local planning document; generalized
33
+ to the same "internal planning tree" phrasing.
34
+
35
+ ### Added
36
+
37
+ - **`__tests__/scrub.test.ts`** gains a new describe-block
38
+ (`scrub-clean — future-category placeholder READMEs`) covering the
39
+ three placeholder READMEs under `skills/defensive/`,
40
+ `skills/mitre-mapped/`, and `skills/ops/`. Without this block, the
41
+ v0.1.0 leak passed source-side tests (which iterated only the 37
42
+ forked SKILL.md files plus 4 package-root documents) while failing
43
+ at the CI tarball-scrub gate. Institutional spec-gap closed.
44
+
45
+ ### Meta
46
+
47
+ - `v0.1.0` remains as a git-tag pointing at commit `8508aa6` for
48
+ audit-trail purposes but carries no corresponding npm release. If
49
+ you need to verify the v0.1.0 git state, check the tag; if you need
50
+ a running skills package, install `0.1.1` or later.
51
+
52
+ ---
53
+
54
+ ## [0.1.0] — 2026-04-23 — "initial — offensive-only" (WITHHELD — see 0.1.1 above)
55
+
56
+ Initial ship. Multi-source package structure, offensive-only content
57
+ at v0.1.0.
58
+
59
+ ### Added
60
+
61
+ - **Package scaffold** under `packages/skills/` with `@aegis-scan/skills`
62
+ as the npm name, MIT license, and `npm-provenance` publish-config.
63
+ No install-time lifecycle scripts (enforced by
64
+ `.github/workflows/publish-skills.yml` gate).
65
+ - **Multi-source directory layout** with four category-directories
66
+ under `skills/`:
67
+ - `offensive/` — populated at v0.1.0 with the 37-skill fork below.
68
+ - `defensive/` — placeholder README declaring skills-v0.2+ ambition
69
+ (AEGIS-native skills mirrored from the `@aegis-wizard/cli` pattern
70
+ library).
71
+ - `mitre-mapped/` — placeholder README declaring skills-v0.2+ ambition
72
+ (cherry-picks from an upstream framework-mapped source with MITRE
73
+ ATT&CK / D3FEND / NIST CSF mappings).
74
+ - `ops/` — placeholder README declaring skills-v0.3+ ambition
75
+ (incident-response, post-build-audit, verify-install-integrity).
76
+ - **37 offensive skills** forked from
77
+ [SnailSploit/Claude-Red](https://github.com/SnailSploit/Claude-Red)
78
+ at SHA `c74d53e2938b59f111572e0819265a1e73029393` under the upstream
79
+ MIT license. Upstream `Skills/offensive-<name>/SKILL.md` lands here
80
+ as `skills/offensive/snailsploit-fork/<name>/SKILL.md` (redundant
81
+ `offensive-` prefix stripped from directory names). Every file is
82
+ byte-identical to upstream after a prepended AEGIS-local HTML
83
+ attribution header.
84
+ - **`aegis-skills` CLI** with three subcommands: `list` (with
85
+ `--category` and `--source` filters), `info <skill-name>` (renders
86
+ frontmatter and upstream-source URL), and `install [--to <dir>]
87
+ [--force]` (defaults to `~/.claude/skills/user/aegis-skills/`).
88
+ - **ATTRIBUTION.md** with per-source attribution for the SnailSploit
89
+ fork plus forward-declared sections for defensive, MITRE-mapped,
90
+ and ops categories.
91
+ - **Test suite** — four vitest files covering manifest integrity,
92
+ frontmatter shape, attribution header preservation, and
93
+ internal-codename scrub-clean invariant across every shipped
94
+ skill. Total tests at v0.1.0 is 316 new cases; the full monorepo
95
+ test count rises from 2224 to 2540.
96
+
97
+ ### Known discrepancies tracked for upstream-courtesy-ping
98
+
99
+ - Upstream README tabulates 38 skill rows but the `Skills/` directory
100
+ contains 37 subdirectories — the `patch-diffing` skill is listed in
101
+ the README "Infrastructure & Binary" table but the directory is
102
+ absent on disk at the fork SHA. This package ships what exists on
103
+ disk (37) rather than what is claimed in the README (38). Tracked
104
+ for an optional outreach to the upstream maintainer.
105
+ - Upstream uses two attribution conventions across its files — some
106
+ use an older `## Metadata > Source:` bullet, others use a newer
107
+ YAML-only frontmatter. Both conventions are preserved byte-
108
+ identically. AEGIS's own per-file provenance anchor is the
109
+ uniform `<!-- aegis-local: -->` HTML header applied during fork.
110
+
111
+ ### Security posture
112
+
113
+ - Pre-fork security-pass (six protocol greps plus two supplementary
114
+ checks) run against upstream before commit. All checks returned
115
+ clean with three documented caveats (cloud-IMDS IPs in SSRF
116
+ content, canonical pedagogical shellcode, pedagogical AMSI/IAT-
117
+ hook code in the windows-boundaries skill). Log retained for
118
+ advisor audit.
119
+ - Markdown-only structural invariant enforced both locally and in
120
+ the `publish-skills.yml` CI gate: the `skills/` directory contains
121
+ only `.md` files.
122
+ - `SECURITY.md` at the repo root gains a "Responsible-use posture for
123
+ @aegis-scan/skills" section covering the authorized-use-only scope
124
+ of the offensive content.
125
+
126
+ ### License
127
+
128
+ MIT for AEGIS side. MIT for upstream SnailSploit fork. See
129
+ `LICENSE` and `ATTRIBUTION.md`.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 RideMatch1 (AEGIS) and upstream authors per ATTRIBUTION.md
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,123 @@
1
+ # @aegis-scan/skills
2
+
3
+ Opt-in skill library for Claude Code and compatible AI agents. Third
4
+ sibling in the AEGIS full-repertoire institutional-grade security
5
+ toolkit.
6
+
7
+ ## AEGIS is a three-layer toolkit
8
+
9
+ - **`@aegis-wizard/cli`** — scaffold + agent-brief generator. Builds
10
+ a secure Next.js + Supabase + shadcn SaaS from day one with an
11
+ agent-consumable Markdown brief.
12
+ - **`@aegis-scan/cli`** — defensive SAST scanner (five-package
13
+ family). Catches what the scanner knows to look for across your
14
+ built application.
15
+ - **`@aegis-scan/skills`** — this package. Red-team methodology
16
+ library (v0.1.0) with defensive, MITRE-mapped, and ops extensions
17
+ landing in later releases. Primes your AI coding-agent with
18
+ attack-class decision-trees so you can stress-test what you built
19
+ before shipping.
20
+
21
+ Build with the wizard. Scan what you built. Test it red-team-style.
22
+ Full lifecycle, one toolchain, one attribution-compliant open-source
23
+ license stack.
24
+
25
+ ## Quickstart
26
+
27
+ ```bash
28
+ npm install -g @aegis-scan/skills
29
+
30
+ # Install every skill into Claude Code's user-skill directory
31
+ aegis-skills install
32
+
33
+ # List what is available
34
+ aegis-skills list
35
+
36
+ # Inspect a specific skill
37
+ aegis-skills info sqli
38
+ ```
39
+
40
+ After `install` lands the skill files under `~/.claude/skills/user/aegis-skills/`,
41
+ Claude Code auto-loads each `SKILL.md` based on its trigger-phrases
42
+ whenever you invoke the agent with a relevant prompt.
43
+
44
+ ## What ships in v0.1.0
45
+
46
+ Thirty-seven offensive-security SKILL.md files under
47
+ `skills/offensive/snailsploit-fork/`, covering:
48
+
49
+ - **Web application:** sqli · xss · ssrf · ssti · xxe · idor · file-upload
50
+ · rce · deserialization · race-condition · request-smuggling ·
51
+ open-redirect · parameter-pollution · graphql · waf-bypass (15)
52
+ - **Auth and identity:** jwt · oauth (2)
53
+ - **Infrastructure and binary:** shellcode · edr-evasion ·
54
+ exploit-development · exploit-dev-course · basic-exploitation ·
55
+ crash-analysis · mitigations · windows-mitigations ·
56
+ windows-boundaries · keylogger-arch · initial-access ·
57
+ advanced-redteam (12)
58
+ - **Reconnaissance and OSINT:** osint · osint-methodology (2)
59
+ - **Fuzzing and vulnerability research:** fuzzing · fuzzing-course ·
60
+ bug-identification · vuln-classes (4)
61
+ - **AI security:** ai-security (1)
62
+ - **Utility:** fast-checking (1)
63
+
64
+ All forked from
65
+ [SnailSploit/Claude-Red](https://github.com/SnailSploit/Claude-Red)
66
+ under MIT License with attribution preserved per-file. See
67
+ [`ATTRIBUTION.md`](./ATTRIBUTION.md) for the full credit chain.
68
+
69
+ ## Multi-source architecture
70
+
71
+ `@aegis-scan/skills` is designed to grow across sources without
72
+ re-architecting the package. The `skills/` tree carries four
73
+ category-directories from day one, three of which are placeholders
74
+ for future content:
75
+
76
+ ```
77
+ skills/
78
+ ├── offensive/ — populated in v0.1.0
79
+ │ └── snailsploit-fork/
80
+ │ └── 37 SKILL.md files
81
+ ├── defensive/ — placeholder for skills-v0.2+
82
+ ├── mitre-mapped/ — placeholder for skills-v0.2+
83
+ └── ops/ — placeholder for skills-v0.3+
84
+ ```
85
+
86
+ `aegis-skills list --category defensive` today returns an informative
87
+ "coming in v0.2+" message rather than a missing-directory error. When
88
+ future sources land, they slot into the existing tree and the manifest
89
+ metadata expands without layout churn.
90
+
91
+ ## Structural invariant
92
+
93
+ The `skills/` directory is markdown-only by construction. No
94
+ executable content, no binaries, no install-time lifecycle scripts
95
+ anywhere in the package. The `publish-skills.yml` CI gate enforces
96
+ this structurally before every tag-push. A consumer running
97
+ `npm install @aegis-scan/skills` executes zero scripts from the
98
+ `@aegis-scan` namespace. See the top-level `SECURITY.md` for the
99
+ full supply-chain integrity posture.
100
+
101
+ ## Responsible use
102
+
103
+ This package ships offensive-security methodology for authorized use
104
+ only:
105
+
106
+ - Authorized security testing of systems you own or have explicit
107
+ written permission to test.
108
+ - Bug-bounty engagements strictly within the defined scope.
109
+ - CTF competitions and educational environments.
110
+ - Defensive security research — understanding attack classes to
111
+ defend against them.
112
+
113
+ Use against systems you do not own or have permission to test is
114
+ unauthorized and likely illegal. AEGIS provides methodology;
115
+ responsible use is the operator's obligation. See the top-level
116
+ `SECURITY.md` for the full responsible-use disclosure and the
117
+ `SECURITY-INCIDENT-RESPONSE.md` for the abuse-report channel.
118
+
119
+ ## License
120
+
121
+ MIT (see [`LICENSE`](./LICENSE)). Upstream skills ship under their
122
+ original licenses with attribution preserved per-file — see
123
+ [`ATTRIBUTION.md`](./ATTRIBUTION.md) for the full chain.
package/dist/bin.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=bin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin.d.ts","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":""}
package/dist/bin.js ADDED
@@ -0,0 +1,122 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * `aegis-skills` CLI entry point.
4
+ *
5
+ * Three subcommands: `list` (browse the catalog), `info <name>`
6
+ * (inspect a single skill), `install [--to <dir>] [--force]` (copy
7
+ * the catalog into a Claude-Code-compatible skill directory).
8
+ *
9
+ * No third-party CLI parser — the surface is small enough that a
10
+ * hand-rolled argv walk keeps the runtime dependency footprint at
11
+ * zero, which matches the markdown-only structural invariant of the
12
+ * whole package: consumers installing `@aegis-scan/skills` pull in
13
+ * zero runtime code that executes on their machine beyond this bin.
14
+ */
15
+ import { readFileSync } from 'node:fs';
16
+ import { dirname, join } from 'node:path';
17
+ import { fileURLToPath } from 'node:url';
18
+ import { runList } from './commands/list.js';
19
+ import { runInfo } from './commands/info.js';
20
+ import { runInstall } from './commands/install.js';
21
+ const HELP_TEXT = `aegis-skills — opt-in skill library for Claude Code and compatible AI agents
22
+
23
+ Usage:
24
+ aegis-skills list [--category <cat>] [--source <src>] [--json]
25
+ aegis-skills info <skill-name> [--json]
26
+ aegis-skills install [--to <dir>] [--force] [--dry-run]
27
+ aegis-skills --version
28
+ aegis-skills --help
29
+
30
+ Commands:
31
+ list Print the skill catalog grouped by category and source.
32
+ info Render one skill's metadata and upstream source URL.
33
+ install Copy every SKILL.md into a Claude-compatible skill directory.
34
+ Default target: ~/.claude/skills/user/aegis-skills/
35
+
36
+ List options:
37
+ --category <cat> Filter to offensive / defensive / mitre-mapped / ops / all
38
+ --source <src> Filter to one source-namespace (e.g. snailsploit-fork)
39
+ --json Machine-readable output
40
+
41
+ Info options:
42
+ --json Machine-readable output
43
+
44
+ Install options:
45
+ --to <dir> Target directory (overrides default)
46
+ --force Overwrite existing files at the target
47
+ --dry-run Print what would be copied without writing
48
+ `;
49
+ function readVersion() {
50
+ const here = dirname(fileURLToPath(import.meta.url));
51
+ const pkgPath = join(here, '..', 'package.json');
52
+ const parsed = JSON.parse(readFileSync(pkgPath, 'utf-8'));
53
+ return parsed.version;
54
+ }
55
+ function main(argv) {
56
+ if (argv.length === 0 || argv[0] === '--help' || argv[0] === '-h') {
57
+ console.log(HELP_TEXT);
58
+ return 0;
59
+ }
60
+ if (argv[0] === '--version' || argv[0] === '-v') {
61
+ console.log(readVersion());
62
+ return 0;
63
+ }
64
+ const [command, ...rest] = argv;
65
+ switch (command) {
66
+ case 'list':
67
+ return runList(parseListOptions(rest));
68
+ case 'info':
69
+ return runInfo(rest[0] ?? '', parseInfoOptions(rest.slice(1)));
70
+ case 'install':
71
+ return runInstall(parseInstallOptions(rest));
72
+ default:
73
+ console.error(`Error: unknown command "${command}"`);
74
+ console.error('Run `aegis-skills --help` for usage.');
75
+ return 1;
76
+ }
77
+ }
78
+ function parseListOptions(argv) {
79
+ const out = {};
80
+ for (let i = 0; i < argv.length; i += 1) {
81
+ const arg = argv[i];
82
+ if (arg === '--category' && i + 1 < argv.length) {
83
+ out.category = argv[i + 1];
84
+ i += 1;
85
+ }
86
+ else if (arg === '--source' && i + 1 < argv.length) {
87
+ out.source = argv[i + 1];
88
+ i += 1;
89
+ }
90
+ else if (arg === '--json') {
91
+ out.json = true;
92
+ }
93
+ }
94
+ return out;
95
+ }
96
+ function parseInfoOptions(argv) {
97
+ const out = {};
98
+ for (const arg of argv) {
99
+ if (arg === '--json')
100
+ out.json = true;
101
+ }
102
+ return out;
103
+ }
104
+ function parseInstallOptions(argv) {
105
+ const out = {};
106
+ for (let i = 0; i < argv.length; i += 1) {
107
+ const arg = argv[i];
108
+ if (arg === '--to' && i + 1 < argv.length) {
109
+ out.to = argv[i + 1];
110
+ i += 1;
111
+ }
112
+ else if (arg === '--force' || arg === '-f') {
113
+ out.force = true;
114
+ }
115
+ else if (arg === '--dry-run') {
116
+ out.dryRun = true;
117
+ }
118
+ }
119
+ return out;
120
+ }
121
+ process.exit(main(process.argv.slice(2)));
122
+ //# sourceMappingURL=bin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export interface InfoOptions {
2
+ json?: boolean;
3
+ }
4
+ export declare function runInfo(query: string, options?: InfoOptions): number;
5
+ //# sourceMappingURL=info.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"info.d.ts","sourceRoot":"","sources":["../../src/commands/info.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,MAAM,CAqDxE"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * `aegis-skills info <skill-name>` — render one skill's metadata.
3
+ *
4
+ * The argument matches by leaf `name` (e.g. `sqli`) or full `id` (e.g.
5
+ * `offensive-snailsploit-fork-sqli`). Returns exit 0 on found, exit 1
6
+ * on not-found, exit 2 on loader error.
7
+ */
8
+ import { loadAllSkills } from '../skills-loader.js';
9
+ export function runInfo(query, options = {}) {
10
+ if (!query || query.trim().length === 0) {
11
+ console.error('Error: aegis-skills info requires a skill-name argument');
12
+ return 1;
13
+ }
14
+ let skills;
15
+ try {
16
+ skills = loadAllSkills();
17
+ }
18
+ catch (err) {
19
+ console.error(`Error: ${err.message}`);
20
+ return 2;
21
+ }
22
+ const needle = query.trim().toLowerCase();
23
+ const matches = skills.filter((s) => s.name.toLowerCase() === needle || s.id.toLowerCase() === needle);
24
+ if (matches.length === 0) {
25
+ console.error(`Error: no skill found matching "${query}"`);
26
+ console.error('Run `aegis-skills list` to see the available catalog.');
27
+ return 1;
28
+ }
29
+ if (matches.length > 1) {
30
+ console.error(`Error: "${query}" is ambiguous — matches:`);
31
+ for (const m of matches)
32
+ console.error(` ${m.id}`);
33
+ console.error('Use the full id (e.g. offensive-snailsploit-fork-<name>) to disambiguate.');
34
+ return 1;
35
+ }
36
+ const skill = matches[0];
37
+ if (options.json) {
38
+ process.stdout.write(JSON.stringify(skill, null, 2) + '\n');
39
+ return 0;
40
+ }
41
+ console.log(`# ${skill.title}`);
42
+ console.log('');
43
+ console.log(`id: ${skill.id}`);
44
+ console.log(`category: ${skill.category}`);
45
+ console.log(`source: ${skill.source || '(none)'}`);
46
+ console.log(`name: ${skill.name}`);
47
+ console.log(`relativePath: ${skill.relativePath}`);
48
+ if (skill.upstreamSourceUrl) {
49
+ console.log(`upstream: ${skill.upstreamSourceUrl}`);
50
+ }
51
+ console.log('');
52
+ console.log('Description:');
53
+ console.log(wrap(skill.description || '(no description extracted)', 78, ' '));
54
+ console.log('');
55
+ console.log(`File on disk: ${skill.absolutePath}`);
56
+ return 0;
57
+ }
58
+ function wrap(text, width, indent) {
59
+ const words = text.split(/\s+/).filter(Boolean);
60
+ const lines = [];
61
+ let line = indent;
62
+ for (const word of words) {
63
+ if ((line.length + word.length + 1) > width && line.trim().length > 0) {
64
+ lines.push(line);
65
+ line = indent + word;
66
+ }
67
+ else {
68
+ line = line.trim().length === 0 ? `${indent}${word}` : `${line} ${word}`;
69
+ }
70
+ }
71
+ if (line.trim().length > 0)
72
+ lines.push(line);
73
+ return lines.join('\n');
74
+ }
75
+ //# sourceMappingURL=info.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"info.js","sourceRoot":"","sources":["../../src/commands/info.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export interface InstallOptions {
2
+ to?: string;
3
+ force?: boolean;
4
+ dryRun?: boolean;
5
+ }
6
+ export declare function runInstall(options?: InstallOptions): number;
7
+ //# sourceMappingURL=install.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AA0BA,MAAM,WAAW,cAAc;IAC7B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,wBAAgB,UAAU,CAAC,OAAO,GAAE,cAAmB,GAAG,MAAM,CA6D/D"}