opencode-skills-antigravity 1.0.9 → 1.0.11

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 (29) hide show
  1. package/bundled-skills/cpp-pro/references/build-tooling.md +440 -0
  2. package/bundled-skills/cpp-pro/references/concurrency.md +437 -0
  3. package/bundled-skills/cpp-pro/references/memory-performance.md +397 -0
  4. package/bundled-skills/cpp-pro/references/modern-cpp.md +304 -0
  5. package/bundled-skills/cpp-pro/references/templates.md +357 -0
  6. package/bundled-skills/cpp-pro/resources/implementation-playbook.md +43 -0
  7. package/bundled-skills/docs/integrations/jetski-cortex.md +3 -3
  8. package/bundled-skills/docs/integrations/jetski-gemini-loader/README.md +4 -4
  9. package/bundled-skills/docs/integrations/jetski-gemini-loader/{loader.ts → loader.mjs} +38 -50
  10. package/bundled-skills/docs/maintainers/repo-growth-seo.md +3 -3
  11. package/bundled-skills/docs/maintainers/security-findings-triage-2026-03-15.csv +1 -1
  12. package/bundled-skills/docs/maintainers/security-findings-triage-2026-03-15.md +1 -1
  13. package/bundled-skills/docs/maintainers/security-findings-triage-2026-03-18-addendum.md +1 -1
  14. package/bundled-skills/docs/maintainers/skills-update-guide.md +1 -1
  15. package/bundled-skills/docs/users/agent-overload-recovery.md +54 -0
  16. package/bundled-skills/docs/users/bundles.md +1 -1
  17. package/bundled-skills/docs/users/claude-code-skills.md +1 -1
  18. package/bundled-skills/docs/users/faq.md +8 -0
  19. package/bundled-skills/docs/users/gemini-cli-skills.md +1 -1
  20. package/bundled-skills/docs/users/getting-started.md +4 -1
  21. package/bundled-skills/docs/users/kiro-integration.md +1 -1
  22. package/bundled-skills/docs/users/usage.md +5 -5
  23. package/bundled-skills/docs/users/visual-guide.md +4 -4
  24. package/bundled-skills/gdb-cli/SKILL.md +239 -0
  25. package/bundled-skills/jobgpt/SKILL.md +100 -0
  26. package/bundled-skills/moyu/SKILL.md +267 -0
  27. package/bundled-skills/windows-shell-reliability/SKILL.md +107 -0
  28. package/package.json +1 -1
  29. package/bundled-skills/goldrush-api/SKILL.md +0 -109
@@ -0,0 +1,357 @@
1
+ # Template Metaprogramming
2
+
3
+ ## Variadic Templates
4
+
5
+ ```cpp
6
+ #include <iostream>
7
+ #include <utility>
8
+
9
+ // Fold expressions (C++17)
10
+ template<typename... Args>
11
+ auto sum(Args... args) {
12
+ return (args + ...); // Unary right fold
13
+ }
14
+
15
+ template<typename... Args>
16
+ void print(Args&&... args) {
17
+ ((std::cout << args << ' '), ...); // Binary left fold
18
+ std::cout << '\n';
19
+ }
20
+
21
+ // Recursive variadic template
22
+ template<typename T>
23
+ void log(T&& value) {
24
+ std::cout << value << '\n';
25
+ }
26
+
27
+ template<typename T, typename... Args>
28
+ void log(T&& first, Args&&... rest) {
29
+ std::cout << first << ", ";
30
+ log(std::forward<Args>(rest)...);
31
+ }
32
+
33
+ // Parameter pack expansion
34
+ template<typename... Types>
35
+ struct TypeList {
36
+ static constexpr size_t size = sizeof...(Types);
37
+ };
38
+
39
+ template<typename... Args>
40
+ auto make_tuple_advanced(Args&&... args) {
41
+ return std::tuple<std::decay_t<Args>...>(std::forward<Args>(args)...);
42
+ }
43
+ ```
44
+
45
+ ## SFINAE and if constexpr
46
+
47
+ ```cpp
48
+ #include <type_traits>
49
+
50
+ // SFINAE with std::enable_if (older style)
51
+ template<typename T>
52
+ std::enable_if_t<std::is_integral_v<T>, T>
53
+ double_value(T value) {
54
+ return value * 2;
55
+ }
56
+
57
+ template<typename T>
58
+ std::enable_if_t<std::is_floating_point_v<T>, T>
59
+ double_value(T value) {
60
+ return value * 2.0;
61
+ }
62
+
63
+ // Modern: if constexpr (C++17)
64
+ template<typename T>
65
+ auto process(T value) {
66
+ if constexpr (std::is_integral_v<T>) {
67
+ return value * 2;
68
+ } else if constexpr (std::is_floating_point_v<T>) {
69
+ return value * 2.0;
70
+ } else {
71
+ return value;
72
+ }
73
+ }
74
+
75
+ // Detection idiom
76
+ template<typename T, typename = void>
77
+ struct has_serialize : std::false_type {};
78
+
79
+ template<typename T>
80
+ struct has_serialize<T, std::void_t<decltype(std::declval<T>().serialize())>>
81
+ : std::true_type {};
82
+
83
+ template<typename T>
84
+ constexpr bool has_serialize_v = has_serialize<T>::value;
85
+
86
+ // Use with if constexpr
87
+ template<typename T>
88
+ void save(const T& obj) {
89
+ if constexpr (has_serialize_v<T>) {
90
+ obj.serialize();
91
+ } else {
92
+ // Default serialization
93
+ }
94
+ }
95
+ ```
96
+
97
+ ## Type Traits
98
+
99
+ ```cpp
100
+ #include <type_traits>
101
+
102
+ // Custom type traits
103
+ template<typename T>
104
+ struct remove_all_pointers {
105
+ using type = T;
106
+ };
107
+
108
+ template<typename T>
109
+ struct remove_all_pointers<T*> {
110
+ using type = typename remove_all_pointers<T>::type;
111
+ };
112
+
113
+ template<typename T>
114
+ using remove_all_pointers_t = typename remove_all_pointers<T>::type;
115
+
116
+ // Conditional types
117
+ template<bool Condition, typename T, typename F>
118
+ struct conditional_type {
119
+ using type = T;
120
+ };
121
+
122
+ template<typename T, typename F>
123
+ struct conditional_type<false, T, F> {
124
+ using type = F;
125
+ };
126
+
127
+ // Compile-time type selection
128
+ template<size_t N>
129
+ struct best_integral_type {
130
+ using type = std::conditional_t<N <= 8, uint8_t,
131
+ std::conditional_t<N <= 16, uint16_t,
132
+ std::conditional_t<N <= 32, uint32_t, uint64_t>>>;
133
+ };
134
+
135
+ // Check for member functions
136
+ template<typename T, typename = void>
137
+ struct has_reserve : std::false_type {};
138
+
139
+ template<typename T>
140
+ struct has_reserve<T, std::void_t<decltype(std::declval<T>().reserve(size_t{}))>>
141
+ : std::true_type {};
142
+ ```
143
+
144
+ ## CRTP (Curiously Recurring Template Pattern)
145
+
146
+ ```cpp
147
+ // Static polymorphism with CRTP
148
+ template<typename Derived>
149
+ class Shape {
150
+ public:
151
+ double area() const {
152
+ return static_cast<const Derived*>(this)->area_impl();
153
+ }
154
+
155
+ void draw() const {
156
+ static_cast<const Derived*>(this)->draw_impl();
157
+ }
158
+ };
159
+
160
+ class Circle : public Shape<Circle> {
161
+ double radius_;
162
+ public:
163
+ Circle(double r) : radius_(r) {}
164
+
165
+ double area_impl() const {
166
+ return 3.14159 * radius_ * radius_;
167
+ }
168
+
169
+ void draw_impl() const {
170
+ std::cout << "Drawing circle\n";
171
+ }
172
+ };
173
+
174
+ class Rectangle : public Shape<Rectangle> {
175
+ double width_, height_;
176
+ public:
177
+ Rectangle(double w, double h) : width_(w), height_(h) {}
178
+
179
+ double area_impl() const {
180
+ return width_ * height_;
181
+ }
182
+
183
+ void draw_impl() const {
184
+ std::cout << "Drawing rectangle\n";
185
+ }
186
+ };
187
+
188
+ // CRTP for mixin capabilities
189
+ template<typename Derived>
190
+ class Printable {
191
+ public:
192
+ void print() const {
193
+ std::cout << static_cast<const Derived*>(this)->to_string() << '\n';
194
+ }
195
+ };
196
+
197
+ class User : public Printable<User> {
198
+ std::string name_;
199
+ public:
200
+ User(std::string name) : name_(std::move(name)) {}
201
+
202
+ std::string to_string() const {
203
+ return "User: " + name_;
204
+ }
205
+ };
206
+ ```
207
+
208
+ ## Template Template Parameters
209
+
210
+ ```cpp
211
+ #include <vector>
212
+ #include <list>
213
+ #include <deque>
214
+
215
+ // Template template parameter
216
+ template<typename T, template<typename, typename> class Container>
217
+ class Stack {
218
+ Container<T, std::allocator<T>> data_;
219
+
220
+ public:
221
+ void push(const T& value) {
222
+ data_.push_back(value);
223
+ }
224
+
225
+ T pop() {
226
+ T value = data_.back();
227
+ data_.pop_back();
228
+ return value;
229
+ }
230
+
231
+ size_t size() const {
232
+ return data_.size();
233
+ }
234
+ };
235
+
236
+ // Usage with different containers
237
+ Stack<int, std::vector> vector_stack;
238
+ Stack<int, std::deque> deque_stack;
239
+ Stack<int, std::list> list_stack;
240
+ ```
241
+
242
+ ## Compile-Time Computation
243
+
244
+ ```cpp
245
+ #include <array>
246
+
247
+ // Compile-time factorial
248
+ constexpr int factorial(int n) {
249
+ return n <= 1 ? 1 : n * factorial(n - 1);
250
+ }
251
+
252
+ constexpr int fact_5 = factorial(5); // Computed at compile time
253
+
254
+ // Compile-time prime checking
255
+ constexpr bool is_prime(int n) {
256
+ if (n < 2) return false;
257
+ for (int i = 2; i * i <= n; ++i) {
258
+ if (n % i == 0) return false;
259
+ }
260
+ return true;
261
+ }
262
+
263
+ // Generate compile-time array of primes
264
+ template<size_t N>
265
+ constexpr auto generate_primes() {
266
+ std::array<int, N> primes{};
267
+ int count = 0;
268
+ int candidate = 2;
269
+
270
+ while (count < N) {
271
+ if (is_prime(candidate)) {
272
+ primes[count++] = candidate;
273
+ }
274
+ ++candidate;
275
+ }
276
+
277
+ return primes;
278
+ }
279
+
280
+ constexpr auto first_10_primes = generate_primes<10>();
281
+ ```
282
+
283
+ ## Expression Templates
284
+
285
+ ```cpp
286
+ // Lazy evaluation with expression templates
287
+ template<typename E>
288
+ class VecExpression {
289
+ public:
290
+ double operator[](size_t i) const {
291
+ return static_cast<const E&>(*this)[i];
292
+ }
293
+
294
+ size_t size() const {
295
+ return static_cast<const E&>(*this).size();
296
+ }
297
+ };
298
+
299
+ class Vec : public VecExpression<Vec> {
300
+ std::vector<double> data_;
301
+
302
+ public:
303
+ Vec(size_t n) : data_(n) {}
304
+
305
+ double operator[](size_t i) const { return data_[i]; }
306
+ double& operator[](size_t i) { return data_[i]; }
307
+ size_t size() const { return data_.size(); }
308
+
309
+ // Evaluate expression template
310
+ template<typename E>
311
+ Vec& operator=(const VecExpression<E>& expr) {
312
+ for (size_t i = 0; i < size(); ++i) {
313
+ data_[i] = expr[i];
314
+ }
315
+ return *this;
316
+ }
317
+ };
318
+
319
+ // Binary operation expression
320
+ template<typename E1, typename E2>
321
+ class VecSum : public VecExpression<VecSum<E1, E2>> {
322
+ const E1& lhs_;
323
+ const E2& rhs_;
324
+
325
+ public:
326
+ VecSum(const E1& lhs, const E2& rhs) : lhs_(lhs), rhs_(rhs) {}
327
+
328
+ double operator[](size_t i) const {
329
+ return lhs_[i] + rhs_[i];
330
+ }
331
+
332
+ size_t size() const { return lhs_.size(); }
333
+ };
334
+
335
+ // Operator overload
336
+ template<typename E1, typename E2>
337
+ VecSum<E1, E2> operator+(const VecExpression<E1>& lhs,
338
+ const VecExpression<E2>& rhs) {
339
+ return VecSum<E1, E2>(static_cast<const E1&>(lhs),
340
+ static_cast<const E2&>(rhs));
341
+ }
342
+
343
+ // Usage: a = b + c + d (no temporaries created!)
344
+ ```
345
+
346
+ ## Quick Reference
347
+
348
+ | Technique | Use Case | Performance |
349
+ |-----------|----------|-------------|
350
+ | Variadic Templates | Variable arguments | Zero overhead |
351
+ | SFINAE | Conditional compilation | Compile-time |
352
+ | if constexpr | Type-based branching | Zero overhead |
353
+ | CRTP | Static polymorphism | No vtable cost |
354
+ | Expression Templates | Lazy evaluation | Eliminates temps |
355
+ | Type Traits | Type introspection | Compile-time |
356
+ | Fold Expressions | Parameter pack ops | Optimal |
357
+ | Template Specialization | Type-specific impl | Zero overhead |
@@ -0,0 +1,43 @@
1
+ # C++ Implementation Playbook
2
+
3
+ **Date:** March 23, 2026
4
+ **Author:** champbreed
5
+ ---
6
+
7
+ ## 1. RAII & Resource Management
8
+ Always wrap raw resources in manager objects to ensure cleanup on scope exit.
9
+ ```cpp
10
+ // Good: Scope-bound cleanup
11
+ void process() {
12
+ auto data = std::make_unique<uint8_t[]>(1024);
13
+ // memory is freed automatically
14
+ }
15
+ ```
16
+ ## 2. Smart Pointer Ownership
17
+ - **unique_ptr**: Use for exclusive ownership.
18
+ - **shared_ptr**: Use for shared ownership across components.
19
+ - **weak_ptr**: Use to break circular reference cycles.
20
+
21
+ ## 3. Concurrency Safety
22
+ Always use RAII-style locks like `std::lock_guard` or `std::unique_lock`.
23
+ ```cpp
24
+ void update() {
25
+ std::lock_guard<std::mutex> lock(mutex_); // Released automatically
26
+ // thread-safe logic
27
+ }
28
+ ```
29
+ ## 4. Move Semantics & Efficiency
30
+ Avoid expensive copies by utilizing move constructors and `std::move`.
31
+ ```cpp
32
+ void processData(std::vector<std::string>&& data) {
33
+ auto internalData = std::move(data); // Transfers ownership, no copy
34
+ }
35
+ ```
36
+ ## 5. Modern STL Algorithms
37
+ Prefer algorithms over manual loops for readability and optimization.
38
+
39
+ ```cpp
40
+ void sortData(std::vector<int>& myVector) {
41
+ // Use std::ranges (C++20) for cleaner, safer iteration
42
+ std::ranges::sort(myVector);
43
+ }
@@ -1,9 +1,9 @@
1
1
  ---
2
2
  title: Jetski/Cortex + Gemini Integration Guide
3
- description: "Come usare antigravity-awesome-skills con Jetski/Cortex evitando l’overflow di contesto con 1.306+ skill."
3
+ description: "Come usare antigravity-awesome-skills con Jetski/Cortex evitando l’overflow di contesto con 1.309+ skill."
4
4
  ---
5
5
 
6
- # Jetski/Cortex + Gemini: integrazione sicura con 1.306+ skill
6
+ # Jetski/Cortex + Gemini: integrazione sicura con 1.309+ skill
7
7
 
8
8
  Questa guida mostra come integrare il repository `antigravity-awesome-skills` con un agente basato su **Jetski/Cortex + Gemini** (o framework simili) **senza superare il context window** del modello.
9
9
 
@@ -23,7 +23,7 @@ Non bisogna mai:
23
23
  - concatenare il contenuto di tutte le `SKILL.md` in un singolo system prompt;
24
24
  - reiniettare l’intera libreria per **ogni** richiesta.
25
25
 
26
- Con oltre 1.306 skill, questo approccio riempie il context window prima ancora di aggiungere i messaggi dell’utente, causando l’errore di truncation.
26
+ Con oltre 1.309 skill, questo approccio riempie il context window prima ancora di aggiungere i messaggi dell’utente, causando l’errore di truncation.
27
27
 
28
28
  ---
29
29
 
@@ -20,13 +20,13 @@ This example shows one way to integrate **antigravity-awesome-skills** with a Je
20
20
  - How to enforce a **maximum number of skills per turn** via `maxSkillsPerTurn`.
21
21
  - How to choose whether to **truncate or error** when too many skills are requested via `overflowBehavior`.
22
22
 
23
- This pattern avoids context overflow when you have 1,306+ skills installed.
23
+ This pattern avoids context overflow when you have 1,309+ skills installed.
24
24
 
25
25
  ---
26
26
 
27
27
  ## Files
28
28
 
29
- - `loader.ts`
29
+ - `loader.mjs`
30
30
  - Implements:
31
31
  - `loadSkillIndex(indexPath)`;
32
32
  - `resolveSkillsFromMessages(messages, index, maxSkills)`;
@@ -45,7 +45,7 @@ import {
45
45
  loadSkillIndex,
46
46
  buildModelMessages,
47
47
  Message,
48
- } from "./loader";
48
+ } from "./loader.mjs";
49
49
 
50
50
  const REPO_ROOT = "/path/to/antigravity-awesome-skills";
51
51
  const SKILLS_ROOT = REPO_ROOT;
@@ -86,7 +86,7 @@ Adapt the paths and model call to your environment.
86
86
  - **Do not** iterate through `skills/*/SKILL.md` and load everything at once.
87
87
  - This example:
88
88
  - assumes skills live under the same repo root as `data/skills_index.json`;
89
- - uses Node.js `fs`/`path` APIs and TypeScript types for clarity.
89
+ - uses a plain Node.js ESM module so it can be imported directly without a TypeScript runtime.
90
90
  - In a real host:
91
91
  - wire `buildModelMessages` into the point where you currently assemble the prompt before `TrajectoryChatConverter`;
92
92
  - consider `overflowBehavior: "error"` if you want a clear user-facing failure instead of silently dropping extra skills;
@@ -1,27 +1,28 @@
1
1
  import fs from "fs";
2
2
  import path from "path";
3
3
 
4
- export type SkillMeta = {
5
- id: string;
6
- path: string;
7
- name: string;
8
- description?: string;
9
- category?: string;
10
- risk?: string;
11
- };
12
-
13
- export type Message = {
14
- role: "system" | "user" | "assistant";
15
- content: string;
16
- };
4
+ /**
5
+ * @typedef {{
6
+ * id: string,
7
+ * path: string,
8
+ * name: string,
9
+ * description?: string,
10
+ * category?: string,
11
+ * risk?: string,
12
+ * }} SkillMeta
13
+ */
14
+
15
+ /**
16
+ * @typedef {{
17
+ * role: "system" | "user" | "assistant",
18
+ * content: string,
19
+ * }} Message
20
+ */
17
21
 
18
22
  const SKILL_ID_REGEX = /@([a-zA-Z0-9-_./]+)/g;
19
23
 
20
- function collectReferencedSkillIds(
21
- messages: Message[],
22
- index: Map<string, SkillMeta>
23
- ): string[] {
24
- const referencedSkillIds = new Set<string>();
24
+ function collectReferencedSkillIds(messages, index) {
25
+ const referencedSkillIds = new Set();
25
26
 
26
27
  for (const msg of messages) {
27
28
  for (const match of msg.content.matchAll(SKILL_ID_REGEX)) {
@@ -35,7 +36,7 @@ function collectReferencedSkillIds(
35
36
  return [...referencedSkillIds];
36
37
  }
37
38
 
38
- function assertValidMaxSkills(maxSkills: number): number {
39
+ function assertValidMaxSkills(maxSkills) {
39
40
  if (!Number.isInteger(maxSkills) || maxSkills < 1) {
40
41
  throw new Error("maxSkills must be a positive integer.");
41
42
  }
@@ -43,10 +44,10 @@ function assertValidMaxSkills(maxSkills: number): number {
43
44
  return maxSkills;
44
45
  }
45
46
 
46
- export function loadSkillIndex(indexPath: string): Map<string, SkillMeta> {
47
+ export function loadSkillIndex(indexPath) {
47
48
  const raw = fs.readFileSync(indexPath, "utf8");
48
- const arr = JSON.parse(raw) as SkillMeta[];
49
- const map = new Map<string, SkillMeta>();
49
+ const arr = JSON.parse(raw);
50
+ const map = new Map();
50
51
 
51
52
  for (const meta of arr) {
52
53
  map.set(meta.id, meta);
@@ -55,15 +56,11 @@ export function loadSkillIndex(indexPath: string): Map<string, SkillMeta> {
55
56
  return map;
56
57
  }
57
58
 
58
- export function resolveSkillsFromMessages(
59
- messages: Message[],
60
- index: Map<string, SkillMeta>,
61
- maxSkills: number
62
- ): SkillMeta[] {
59
+ export function resolveSkillsFromMessages(messages, index, maxSkills) {
63
60
  const skillLimit = assertValidMaxSkills(maxSkills);
64
61
  const referencedSkillIds = collectReferencedSkillIds(messages, index);
65
62
 
66
- const metas: SkillMeta[] = [];
63
+ const metas = [];
67
64
  for (const id of referencedSkillIds) {
68
65
  const meta = index.get(id);
69
66
  if (meta) {
@@ -77,11 +74,8 @@ export function resolveSkillsFromMessages(
77
74
  return metas;
78
75
  }
79
76
 
80
- export async function loadSkillBodies(
81
- skillsRoot: string,
82
- metas: SkillMeta[]
83
- ): Promise<string[]> {
84
- const bodies: string[] = [];
77
+ export async function loadSkillBodies(skillsRoot, metas) {
78
+ const bodies = [];
85
79
  const rootPath = path.resolve(skillsRoot);
86
80
  const rootRealPath = await fs.promises.realpath(rootPath);
87
81
 
@@ -95,13 +89,17 @@ export async function loadSkillBodies(
95
89
 
96
90
  const skillDirStat = await fs.promises.lstat(skillDirPath);
97
91
  if (!skillDirStat.isDirectory() || skillDirStat.isSymbolicLink()) {
98
- throw new Error(`Skill directory must be a regular directory inside the skills root: ${meta.id}`);
92
+ throw new Error(
93
+ `Skill directory must be a regular directory inside the skills root: ${meta.id}`,
94
+ );
99
95
  }
100
96
 
101
97
  const fullPath = path.join(skillDirPath, "SKILL.md");
102
98
  const skillFileStat = await fs.promises.lstat(fullPath);
103
99
  if (!skillFileStat.isFile() || skillFileStat.isSymbolicLink()) {
104
- throw new Error(`SKILL.md must be a regular file inside the skills root: ${meta.id}`);
100
+ throw new Error(
101
+ `SKILL.md must be a regular file inside the skills root: ${meta.id}`,
102
+ );
105
103
  }
106
104
 
107
105
  const realPath = await fs.promises.realpath(fullPath);
@@ -117,14 +115,7 @@ export async function loadSkillBodies(
117
115
  return bodies;
118
116
  }
119
117
 
120
- export async function buildModelMessages(options: {
121
- baseSystemMessages: Message[];
122
- trajectory: Message[];
123
- skillIndex: Map<string, SkillMeta>;
124
- skillsRoot: string;
125
- maxSkillsPerTurn?: number;
126
- overflowBehavior?: "truncate" | "error";
127
- }): Promise<Message[]> {
118
+ export async function buildModelMessages(options) {
128
119
  const {
129
120
  baseSystemMessages,
130
121
  trajectory,
@@ -136,19 +127,16 @@ export async function buildModelMessages(options: {
136
127
  const skillLimit = assertValidMaxSkills(maxSkillsPerTurn);
137
128
  const referencedSkillIds = collectReferencedSkillIds(trajectory, skillIndex);
138
129
 
139
- if (
140
- overflowBehavior === "error" &&
141
- referencedSkillIds.length > skillLimit
142
- ) {
130
+ if (overflowBehavior === "error" && referencedSkillIds.length > skillLimit) {
143
131
  throw new Error(
144
- `Too many skills requested in a single turn. Reduce @skill-id usage to ${skillLimit} or fewer.`
132
+ `Too many skills requested in a single turn. Reduce @skill-id usage to ${skillLimit} or fewer.`,
145
133
  );
146
134
  }
147
135
 
148
136
  const selectedMetas = resolveSkillsFromMessages(
149
137
  trajectory,
150
138
  skillIndex,
151
- skillLimit
139
+ skillLimit,
152
140
  );
153
141
 
154
142
  if (selectedMetas.length === 0) {
@@ -157,7 +145,7 @@ export async function buildModelMessages(options: {
157
145
 
158
146
  const skillBodies = await loadSkillBodies(skillsRoot, selectedMetas);
159
147
 
160
- const skillMessages: Message[] = skillBodies.map((body) => ({
148
+ const skillMessages = skillBodies.map((body) => ({
161
149
  role: "system",
162
150
  content: body,
163
151
  }));
@@ -6,7 +6,7 @@ This document keeps the repository's GitHub-facing discovery copy aligned with t
6
6
 
7
7
  Preferred positioning:
8
8
 
9
- > Installable GitHub library of 1,306+ agentic skills for Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and other AI coding assistants.
9
+ > Installable GitHub library of 1,309+ agentic skills for Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and other AI coding assistants.
10
10
 
11
11
  Key framing:
12
12
 
@@ -20,7 +20,7 @@ Key framing:
20
20
 
21
21
  Preferred description:
22
22
 
23
- > Installable GitHub library of 1,306+ agentic skills for Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and more. Includes installer CLI, bundles, workflows, and official/community skill collections.
23
+ > Installable GitHub library of 1,309+ agentic skills for Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and more. Includes installer CLI, bundles, workflows, and official/community skill collections.
24
24
 
25
25
  Preferred homepage:
26
26
 
@@ -28,7 +28,7 @@ Preferred homepage:
28
28
 
29
29
  Preferred social preview:
30
30
 
31
- - use a clean preview image that says `1,306+ Agentic Skills`;
31
+ - use a clean preview image that says `1,309+ Agentic Skills`;
32
32
  - mention Claude Code, Cursor, Codex CLI, and Gemini CLI;
33
33
  - avoid dense text and tiny logos that disappear in social cards.
34
34
 
@@ -9,7 +9,7 @@ https://chatgpt.com/codex/security/findings/24940dbf717081919c799c7f3e1481e6,sic
9
9
  https://chatgpt.com/codex/security/findings/ad700289b03c8191a2b256e0b9a72e24,sickn33/antigravity-awesome-skills,https://github.com/sickn33/antigravity-awesome-skills,Symlinked file copy in Microsoft skill sync can leak host data,"The newly added `scripts/sync_microsoft_skills.py` copies all non-SKILL files from the cloned Microsoft repository into `skills/official/microsoft`. It uses `Path.is_file()` and `shutil.copy2()` without disabling symlink following. If an attacker can introduce a symlinked file in the upstream repo (or a compromised mirror), the script will dereference it and copy the target file contents (e.g., `/proc/self/environ`, `~/.ssh/*`) into the skills directory. When run in CI or a maintainer environment, this enables unintended disclosure of host files and secrets through the generated artifacts.",medium,new,2026-03-13T21:49:30.432277Z,2026-02-11 20:36:09 +0500,ar27111994@gmail.com,,,false,user-fuMnwbfSqxaibK03vsOVrTVI:github-1134426800,17bce709dedfbbdbcc836c0ca24eaa85713fca66,scripts/sync_microsoft_skills.py,,226f10c2a62fc182b4e93458bddea2e60f9b0cb9,tools/scripts/sync_microsoft_skills.py,duplicate of another finding,Microsoft sync resolved symlinked skill directories and copied files without proving the resolved source stayed inside the cloned repo.,filesystem-trust-boundary,Symlink file copying in .github/skills sync leaks host files,Same origin/main behavior as finding 7: the Microsoft sync path trusted resolved symlink targets and copied files from them.,Fix once in sync_microsoft_skills.py by constraining resolved paths to the clone root.,python3 tools/scripts/tests/test_sync_microsoft_skills_security.py,codex/security-filesystem-trust-boundary
10
10
  https://chatgpt.com/codex/security/findings/7dd6119817408191b7e18678576a958a,sickn33/antigravity-awesome-skills,https://github.com/sickn33/antigravity-awesome-skills,Committed Python bytecode can hide malicious logic,"This update introduces compiled Python bytecode files (core.cpython-314.pyc and design_system.cpython-314.pyc) into the repository. When search.py imports core or design_system, Python will prefer a valid __pycache__ bytecode file over the source module if the timestamp/hash matches the runtime interpreter. This enables a supply‑chain backdoor: malicious code could be embedded in the .pyc while the .py source remains benign, leading to arbitrary code execution when users run the skill scripts.",medium,new,2026-03-13T22:32:57.904438Z,2026-01-16 17:34:54 +0100,samujackson1337@gmail.com,,,false,user-fuMnwbfSqxaibK03vsOVrTVI:github-1134426800,faf478f38907e0929f921bcff73557d57ea97247,skills/ui-ux-pro-max/scripts/search.py | skills/ui-ux-pro-max/scripts/__pycache__/core.cpython-314.pyc | skills/ui-ux-pro-max/scripts/__pycache__/design_system.cpython-314.pyc,,226f10c2a62fc182b4e93458bddea2e60f9b0cb9,skills/ui-ux-pro-max/scripts/__pycache__/core.cpython-314.pyc | skills/ui-ux-pro-max/scripts/__pycache__/design_system.cpython-314.pyc,still present but low practical risk,Compiled Python bytecode was committed alongside source.,robustness,Committed Python bytecode can hide malicious logic,"On origin/main, tracked __pycache__ artifacts were still present under skills/ui-ux-pro-max/scripts, which is review-hostile but not independently exploitable.",Remove tracked bytecode artifacts and rely on source-only review plus .gitignore.,node tools/scripts/tests/repo_hygiene_security.test.js,codex/security-robustness
11
11
  https://chatgpt.com/codex/security/findings/eee41bc6b7bc819186c798ae59fa94a2,sickn33/antigravity-awesome-skills,https://github.com/sickn33/antigravity-awesome-skills,Symlinked SKILL.md can leak host files via index script,"scripts/generate_index.py walks the skills tree and opens any SKILL.md it finds. Because it does not verify that SKILL.md is a regular file within the skills directory, a contributor can add a SKILL.md symlink pointing to a sensitive file on the build host (e.g., ~/.ssh/id_rsa or /proc/self/environ). When maintainers run the script, it will read that file and embed the extracted content into skills_index.json, which may later be committed or published as an artifact. This is a supply-chain info disclosure risk introduced by the new script.",medium,new,2026-03-13T22:33:24.826296Z,2026-01-14 20:49:05 +0100,samujackson1337@gmail.com,,,false,user-fuMnwbfSqxaibK03vsOVrTVI:github-1134426800,d32f89a21169fbc77bed59b325e3df17f85d2fad,scripts/generate_index.py,,226f10c2a62fc182b4e93458bddea2e60f9b0cb9,tools/scripts/generate_index.py,still present but low practical risk,Index generation read symlinked SKILL.md files without checking that the target stayed inside the repo.,filesystem-trust-boundary,Symlinked SKILL.md can leak host files via index script,"On origin/main, generate_index.py opened every SKILL.md it found via os.walk and did not skip symlinked SKILL.md files, so a malicious local symlink could exfiltrate another file into index metadata generation.",Skip symlinked SKILL.md files during indexing.,python3 tools/scripts/tests/test_frontmatter_parsing_security.py,codex/security-filesystem-trust-boundary
12
- https://chatgpt.com/codex/security/findings/c0c1181e19dc81919d5b20f2288dc348,sickn33/antigravity-awesome-skills,https://github.com/sickn33/antigravity-awesome-skills,"Example loader trusts manifest paths, enabling file read","The added example loader builds file paths from skills_index.json metadata and reads SKILL.md without validating that the resolved path stays within the skills root or that it is not a symlink. If a malicious contributor supplies a crafted skills_index.json entry or a symlinked SKILL.md in the skills tree, a user who runs this loader and references that skill can end up reading and sending local file contents to the model. This is an information disclosure risk in supply-chain scenarios and should be mitigated by normalizing paths, enforcing a skillsRoot prefix check, and rejecting symlinks via lstat/realpath.",low,new,2026-03-13T20:55:25.060750Z,2026-03-11 15:42:35 +0100,samujackson1337@gmail.com,,,false,user-fuMnwbfSqxaibK03vsOVrTVI:github-1134426800,a41f1a4d613c8c0acb424abaa11b6a6f84f3f0ba,examples/jetski-gemini-loader/loader.ts,,226f10c2a62fc182b4e93458bddea2e60f9b0cb9,docs/integrations/jetski-gemini-loader/loader.ts,obsolete/not reproducible on current HEAD,Historical manifest-path trust in the Jetski loader example.,,,"On origin/main, the loader example resolves the requested file and rejects any path whose path.relative escapes the configured skills root, so the reported direct file read no longer reproduces.",n/a,n/a,
12
+ https://chatgpt.com/codex/security/findings/c0c1181e19dc81919d5b20f2288dc348,sickn33/antigravity-awesome-skills,https://github.com/sickn33/antigravity-awesome-skills,"Example loader trusts manifest paths, enabling file read","The added example loader builds file paths from skills_index.json metadata and reads SKILL.md without validating that the resolved path stays within the skills root or that it is not a symlink. If a malicious contributor supplies a crafted skills_index.json entry or a symlinked SKILL.md in the skills tree, a user who runs this loader and references that skill can end up reading and sending local file contents to the model. This is an information disclosure risk in supply-chain scenarios and should be mitigated by normalizing paths, enforcing a skillsRoot prefix check, and rejecting symlinks via lstat/realpath.",low,new,2026-03-13T20:55:25.060750Z,2026-03-11 15:42:35 +0100,samujackson1337@gmail.com,,,false,user-fuMnwbfSqxaibK03vsOVrTVI:github-1134426800,a41f1a4d613c8c0acb424abaa11b6a6f84f3f0ba,examples/jetski-gemini-loader/loader.mjs,,226f10c2a62fc182b4e93458bddea2e60f9b0cb9,docs/integrations/jetski-gemini-loader/loader.mjs,obsolete/not reproducible on current HEAD,Historical manifest-path trust in the Jetski loader example.,,,"On origin/main, the loader example resolves the requested file and rejects any path whose path.relative escapes the configured skills root, so the reported direct file read no longer reproduces.",n/a,n/a,
13
13
  https://chatgpt.com/codex/security/findings/bafe0096db1081919bad2ba2ec243f5e,sickn33/antigravity-awesome-skills,https://github.com/sickn33/antigravity-awesome-skills,TLS certificate verification disabled in new scrapers,"The newly added leiloeiros scraping utilities disable TLS certificate verification for all HTTP requests and Playwright page loads. The base scraper uses httpx.AsyncClient with verify=False and Playwright contexts with ignore_https_errors=True, and the fallback scraper repeats verify=False. This allows active network attackers to intercept or tamper with scraped content, potentially poisoning downstream data or leaking any credentials used by the scraper.",low,new,2026-03-13T21:25:34.569244Z,2026-03-07 10:04:07 +0100,renatogracie@gmail.com,,,false,user-fuMnwbfSqxaibK03vsOVrTVI:github-1134426800,61ec71c5c7b9b9eaa12504452deda8da8677ba48,skills/junta-leiloeiros/scripts/scraper/base_scraper.py | skills/junta-leiloeiros/scripts/web_scraper_fallback.py,,226f10c2a62fc182b4e93458bddea2e60f9b0cb9,skills/junta-leiloeiros/scripts/scraper/base_scraper.py | skills/junta-leiloeiros/scripts/web_scraper_fallback.py,still present but low practical risk,HTTP scrapers disabled TLS verification by default.,auth-integrity,TLS certificate verification disabled in new scrapers,"On origin/main, both the base scraper and the direct fallback client instantiated HTTP clients with verify=False / ignore_https_errors=True, which weakens transport integrity but is a local-run scraper risk rather than an application RCE.",Enable TLS verification by default and require an explicit environment opt-out for insecure targets.,python3 tools/scripts/tests/test_junta_tls_security.py,codex/security-auth-integrity
14
14
  https://chatgpt.com/codex/security/findings/e9dcff2b3f0481918fc76060bd837fb8,sickn33/antigravity-awesome-skills,https://github.com/sickn33/antigravity-awesome-skills,Complete bundle omits valid skill categories,"The new tools/lib/skill-filter.js defines SKILL_CATEGORIES with hardcoded values (core, architecture, etc.) that are not aligned with the real categories stored in skills_index.json (e.g., ""development""). The ""complete"" bundle derives its category list from Object.keys(SKILL_CATEGORIES), so any real category not present in the hardcoded list is silently excluded. This means getSkillsByBundle('complete') will omit many skills, defeating the intent of a complete bundle and potentially confusing consumers who expect full coverage.",low,new,2026-03-13T21:04:11.988883Z,2026-03-07 10:02:18 +0100,169171880+Sayeem3051@users.noreply.github.com,,,false,user-fuMnwbfSqxaibK03vsOVrTVI:github-1134426800,5f6f94b53f9b8afa02d020775a0a172af009baaa,tools/lib/skill-filter.js | skills_index.json,,226f10c2a62fc182b4e93458bddea2e60f9b0cb9,tools/lib/skill-filter.js | tools/scripts/build-catalog.js | data/bundles.json,obsolete/not reproducible on current HEAD,Historical bundle-category omission in a helper path no longer driving shipped bundle data.,,,"On origin/main, shipped bundle data is generated by tools/scripts/build-catalog.js into data/bundles.json; the reported omission in tools/lib/skill-filter.js does not drive current shipped catalog data.",n/a,n/a,
15
15
  https://chatgpt.com/codex/security/findings/279041383cc08191abdb9dfa99a03f7c,sickn33/antigravity-awesome-skills,https://github.com/sickn33/antigravity-awesome-skills,Malformed frontmatter delimiter breaks YAML parsing for skills,"The commit replaces valid `license:` fields with lines that start with `---`, e.g. `--- Unknown` in `skills/alpha-vantage/SKILL.md`. The frontmatter parser in `lib/skill-utils.js` reads the block between the first and next `---` line and then parses it as YAML. A `---` marker inside the block is treated as a YAML document delimiter, which makes the frontmatter invalid or splits it into multiple documents. As a result, validators and index generation will report frontmatter parse errors and drop metadata for these skills. This is a regression introduced by the automated fixes.",low,new,2026-03-13T21:09:11.726502Z,2026-03-06 09:18:57 +0100,samujackson1337@gmail.com,,,false,user-fuMnwbfSqxaibK03vsOVrTVI:github-1134426800,93d6badcee41fbacc26b427d3f8d5665ea25b7e6,skills/alpha-vantage/SKILL.md | lib/skill-utils.js,,226f10c2a62fc182b4e93458bddea2e60f9b0cb9,skills/alpha-vantage/SKILL.md | tools/lib/skill-utils.js,still present but low practical risk,Malformed local SKILL.md frontmatter caused parser drift and validation noise.,robustness,Malformed frontmatter delimiter breaks YAML parsing for skills,"On origin/main, skills/alpha-vantage/SKILL.md still contained an extra delimiter token (--- Unknown), which caused parser warnings and broken metadata interpretation.",Repair the malformed frontmatter so the file is a valid YAML frontmatter document.,node tools/scripts/tests/repo_hygiene_security.test.js,codex/security-robustness