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.
- package/bundled-skills/cpp-pro/references/build-tooling.md +440 -0
- package/bundled-skills/cpp-pro/references/concurrency.md +437 -0
- package/bundled-skills/cpp-pro/references/memory-performance.md +397 -0
- package/bundled-skills/cpp-pro/references/modern-cpp.md +304 -0
- package/bundled-skills/cpp-pro/references/templates.md +357 -0
- package/bundled-skills/cpp-pro/resources/implementation-playbook.md +43 -0
- package/bundled-skills/docs/integrations/jetski-cortex.md +3 -3
- package/bundled-skills/docs/integrations/jetski-gemini-loader/README.md +4 -4
- package/bundled-skills/docs/integrations/jetski-gemini-loader/{loader.ts → loader.mjs} +38 -50
- package/bundled-skills/docs/maintainers/repo-growth-seo.md +3 -3
- package/bundled-skills/docs/maintainers/security-findings-triage-2026-03-15.csv +1 -1
- package/bundled-skills/docs/maintainers/security-findings-triage-2026-03-15.md +1 -1
- package/bundled-skills/docs/maintainers/security-findings-triage-2026-03-18-addendum.md +1 -1
- package/bundled-skills/docs/maintainers/skills-update-guide.md +1 -1
- package/bundled-skills/docs/users/agent-overload-recovery.md +54 -0
- package/bundled-skills/docs/users/bundles.md +1 -1
- package/bundled-skills/docs/users/claude-code-skills.md +1 -1
- package/bundled-skills/docs/users/faq.md +8 -0
- package/bundled-skills/docs/users/gemini-cli-skills.md +1 -1
- package/bundled-skills/docs/users/getting-started.md +4 -1
- package/bundled-skills/docs/users/kiro-integration.md +1 -1
- package/bundled-skills/docs/users/usage.md +5 -5
- package/bundled-skills/docs/users/visual-guide.md +4 -4
- package/bundled-skills/gdb-cli/SKILL.md +239 -0
- package/bundled-skills/jobgpt/SKILL.md +100 -0
- package/bundled-skills/moyu/SKILL.md +267 -0
- package/bundled-skills/windows-shell-reliability/SKILL.md +107 -0
- package/package.json +1 -1
- 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.
|
|
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.
|
|
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.
|
|
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,
|
|
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.
|
|
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
|
|
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
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
47
|
+
export function loadSkillIndex(indexPath) {
|
|
47
48
|
const raw = fs.readFileSync(indexPath, "utf8");
|
|
48
|
-
const arr = JSON.parse(raw)
|
|
49
|
-
const map = new Map
|
|
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
|
|
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
|
-
|
|
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(
|
|
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(
|
|
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
|
|
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,
|
|
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,
|
|
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,
|
|
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.
|
|
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
|