@olegkoval/agent-skills 1.16.0 → 1.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +5 -3
- package/.cursor-plugin/index.json +5 -0
- package/.grok-plugin/index.json +120 -0
- package/.kiro/steering/crash-course.md +259 -0
- package/.windsurf/rules/crash-course.md +258 -0
- package/README.md +27 -3
- package/catalog/skills.json +83 -21
- package/package.json +3 -2
- package/packages/marketing/search-console-indexing-audit/adapters/grok/plugin.json +6 -0
- package/packages/marketing/search-console-indexing-audit/adapters/grok/skills/search-console-indexing-audit/SKILL.md +69 -0
- package/packages/marketing/search-console-indexing-audit/adapters/grok/skills/search-console-indexing-audit/scripts/summarize_gsc_coverage.py +151 -0
- package/packages/marketing/viral-launch/adapters/grok/plugin.json +6 -0
- package/packages/marketing/viral-launch/adapters/grok/skills/viral-launch/SKILL.md +105 -0
- package/packages/music/fill-music-player/adapters/grok/plugin.json +6 -0
- package/packages/music/fill-music-player/adapters/grok/skills/fill-music-player/SKILL.md +111 -0
- package/packages/photography/gallery/adapters/grok/plugin.json +6 -0
- package/packages/photography/gallery/adapters/grok/skills/gallery/SKILL.md +237 -0
- package/packages/software-development/apple-store-submit/adapters/grok/plugin.json +6 -0
- package/packages/software-development/apple-store-submit/adapters/grok/skills/apple-store-submit/SKILL.md +158 -0
- package/packages/software-development/cloudflare-block-countries/adapters/grok/plugin.json +6 -0
- package/packages/software-development/cloudflare-block-countries/adapters/grok/skills/cloudflare-block-countries/SKILL.md +177 -0
- package/packages/software-development/crash-course/SKILL.md +270 -0
- package/packages/software-development/crash-course/adapters/claude/plugin.json +5 -0
- package/packages/software-development/crash-course/adapters/claude/skills/crash-course/SKILL.md +271 -0
- package/packages/software-development/crash-course/adapters/codex/README.md +3 -0
- package/packages/software-development/crash-course/adapters/cursor/plugin.json +6 -0
- package/packages/software-development/crash-course/adapters/cursor/skills/crash-course/SKILL.md +271 -0
- package/packages/software-development/crash-course/adapters/grok/plugin.json +6 -0
- package/packages/software-development/crash-course/adapters/grok/skills/crash-course/SKILL.md +271 -0
- package/packages/software-development/crash-course/adapters/kiro/steering/crash-course.md +259 -0
- package/packages/software-development/crash-course/adapters/windsurf/rules/crash-course.md +258 -0
- package/packages/software-development/docs-index-keeper/adapters/grok/plugin.json +6 -0
- package/packages/software-development/docs-index-keeper/adapters/grok/skills/docs-index-keeper/SKILL.md +65 -0
- package/packages/software-development/gh-cli/adapters/grok/plugin.json +6 -0
- package/packages/software-development/gh-cli/adapters/grok/skills/gh-cli/SKILL.md +2200 -0
- package/packages/software-development/git-commit/adapters/grok/plugin.json +6 -0
- package/packages/software-development/git-commit/adapters/grok/skills/git-commit/SKILL.md +133 -0
- package/packages/software-development/macos-menubar-app/adapters/grok/plugin.json +6 -0
- package/packages/software-development/macos-menubar-app/adapters/grok/skills/macos-menubar-app/SKILL.md +238 -0
- package/packages/software-development/mvp-oneshot/adapters/grok/plugin.json +6 -0
- package/packages/software-development/mvp-oneshot/adapters/grok/skills/mvp-oneshot/SKILL.md +176 -0
- package/packages/software-development/obsidian-pr-sync/adapters/grok/plugin.json +6 -0
- package/packages/software-development/obsidian-pr-sync/adapters/grok/skills/obsidian-pr-sync/SKILL.md +154 -0
- package/packages/software-development/obsidian-task-rollover/adapters/grok/plugin.json +6 -0
- package/packages/software-development/obsidian-task-rollover/adapters/grok/skills/obsidian-task-rollover/SKILL.md +198 -0
- package/packages/software-development/open-source-publisher/adapters/grok/plugin.json +6 -0
- package/packages/software-development/open-source-publisher/adapters/grok/skills/open-source-publisher/SKILL.md +471 -0
- package/packages/software-development/product-builder/adapters/grok/plugin.json +6 -0
- package/packages/software-development/product-builder/adapters/grok/skills/product-builder/SKILL.md +224 -0
- package/packages/software-development/promptctl/adapters/grok/plugin.json +6 -0
- package/packages/software-development/promptctl/adapters/grok/skills/promptctl/SKILL.md +90 -0
- package/packages/software-development/relay/adapters/claude/plugin.json +5 -0
- package/packages/software-development/relay/adapters/claude/skills/relay/SKILL.md +117 -0
- package/packages/software-development/relay/adapters/grok/plugin.json +6 -0
- package/packages/software-development/relay/adapters/grok/skills/relay/SKILL.md +117 -0
- package/packages/software-development/review-past-performance/adapters/grok/plugin.json +6 -0
- package/packages/software-development/review-past-performance/adapters/grok/skills/review-past-performance/SKILL.md +212 -0
- package/packages/software-development/self-critique/adapters/grok/plugin.json +6 -0
- package/packages/software-development/self-critique/adapters/grok/skills/self-critique/SKILL.md +149 -0
- package/packages/software-development/self-critique/adapters/grok/skills/self-critique/scripts/critique-nudge.mjs +57 -0
- package/packages/software-development/semantic-release-beta/adapters/grok/plugin.json +6 -0
- package/packages/software-development/semantic-release-beta/adapters/grok/skills/semantic-release-beta/SKILL.md +59 -0
- package/packages/software-development/skill-budget-audit/adapters/grok/plugin.json +6 -0
- package/packages/software-development/skill-budget-audit/adapters/grok/skills/skill-budget-audit/SKILL.md +146 -0
- package/packages/software-development/starter-rules/adapters/grok/plugin.json +6 -0
- package/packages/software-development/starter-rules/adapters/grok/skills/starter-rules/SKILL.md +73 -0
- package/scripts/build-adapters.sh +47 -4
- package/scripts/validate-catalog.sh +10 -0
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: apple-store-submit
|
|
3
|
+
description: Handle Apple App Store rejection emails end-to-end — parse rejection reasons, create a fix plan, implement code changes (privacy strings, entitlements, sandbox), navigate App Store Connect to update metadata, and resubmit. Use when an app receives a rejection or when preparing a first-time submission.
|
|
4
|
+
license: MIT
|
|
5
|
+
allowed-tools: Bash, Read, Write, Edit
|
|
6
|
+
compatibility: Codex, Claude Code, Cursor, GitHub Copilot, Windsurf, Kiro, and other Agent Skills compatible tools. Requires Xcode, an Apple Developer account, and App Store Connect access.
|
|
7
|
+
metadata:
|
|
8
|
+
targets: [_source-only]
|
|
9
|
+
author: Oleg Koval
|
|
10
|
+
tags:
|
|
11
|
+
- apple
|
|
12
|
+
- app-store
|
|
13
|
+
- ios
|
|
14
|
+
- macos
|
|
15
|
+
- xcode
|
|
16
|
+
- submission
|
|
17
|
+
- rejection
|
|
18
|
+
---
|
|
19
|
+
<!-- Generated by scripts/build-adapters.sh. Do not edit directly. -->
|
|
20
|
+
|
|
21
|
+
> 🤖 *Auto-generated by **weekly-pattern-learner** · App Store rejection handling workflow observed in FocusNotch App Store session, Jun 2026 (92 user turns covering rejection → plan → code fixes → metadata → resubmit)*
|
|
22
|
+
|
|
23
|
+
# Apple App Store Submission & Rejection Handling
|
|
24
|
+
|
|
25
|
+
## Overview
|
|
26
|
+
|
|
27
|
+
Parse Apple rejection feedback, implement targeted fixes, update App Store Connect metadata, and resubmit — covering the complete cycle from rejection email to approved build.
|
|
28
|
+
|
|
29
|
+
## When to Use
|
|
30
|
+
|
|
31
|
+
- Apple review team sends a rejection email
|
|
32
|
+
- App fails automated pre-review checks (binary rejected at upload)
|
|
33
|
+
- Preparing metadata for first-time submission (screenshots, keywords, privacy labels)
|
|
34
|
+
- Resolving App Store Connect errors before submitting for review
|
|
35
|
+
|
|
36
|
+
## Workflow
|
|
37
|
+
|
|
38
|
+
### 1. Parse the Rejection
|
|
39
|
+
|
|
40
|
+
Read the full rejection email. Extract and list:
|
|
41
|
+
|
|
42
|
+
- **Guideline numbers** violated (e.g., 2.1, 4.2.0, 5.1.1)
|
|
43
|
+
- **Code-level issues** — missing entitlements, incorrect privacy strings, sandbox violations
|
|
44
|
+
- **Metadata issues** — wrong screenshot sizes, subtitle policy, keyword stuffing
|
|
45
|
+
- **UX issues** — crashes described by reviewer, broken flows, missing functionality
|
|
46
|
+
|
|
47
|
+
Create a numbered fix plan: one item per rejection point, with the type of fix needed.
|
|
48
|
+
|
|
49
|
+
### 2. Classify Fixes by Type
|
|
50
|
+
|
|
51
|
+
| Type | Location |
|
|
52
|
+
|------|----------|
|
|
53
|
+
| Privacy usage strings missing | `Info.plist` |
|
|
54
|
+
| Entitlement missing/wrong | `<AppName>.entitlements` |
|
|
55
|
+
| Crash or broken feature | Source code |
|
|
56
|
+
| Screenshots wrong size/content | App Store Connect |
|
|
57
|
+
| Keywords/subtitle/description | App Store Connect |
|
|
58
|
+
| Build number conflict | Xcode + App Store Connect |
|
|
59
|
+
|
|
60
|
+
### 3. Implement Code Fixes
|
|
61
|
+
|
|
62
|
+
**Privacy permission strings** (`Info.plist`):
|
|
63
|
+
|
|
64
|
+
```xml
|
|
65
|
+
<key>NSMicrophoneUsageDescription</key>
|
|
66
|
+
<string>Used for voice input during focus sessions.</string>
|
|
67
|
+
|
|
68
|
+
<key>NSCalendarsUsageDescription</key>
|
|
69
|
+
<string>Used to sync tasks with your calendar.</string>
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
**Entitlements** (`<AppName>.entitlements`):
|
|
73
|
+
|
|
74
|
+
```xml
|
|
75
|
+
<key>com.apple.security.app-sandbox</key>
|
|
76
|
+
<true/>
|
|
77
|
+
<key>com.apple.security.network.client</key>
|
|
78
|
+
<true/>
|
|
79
|
+
<key>com.apple.security.files.user-selected.read-write</key>
|
|
80
|
+
<true/>
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
**Sandbox violations** — remove `NoEscapeBlock` patterns, replace deprecated APIs, use only sandboxed file access via Security-Scoped Bookmarks when needed.
|
|
84
|
+
|
|
85
|
+
### 4. Build and Archive
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
# Clean build
|
|
89
|
+
xcodebuild clean \
|
|
90
|
+
-scheme <AppName> \
|
|
91
|
+
-destination 'generic/platform=macOS'
|
|
92
|
+
|
|
93
|
+
# Archive
|
|
94
|
+
xcodebuild archive \
|
|
95
|
+
-scheme <AppName> \
|
|
96
|
+
-archivePath build/<AppName>.xcarchive \
|
|
97
|
+
-destination 'generic/platform=macOS'
|
|
98
|
+
|
|
99
|
+
# Export for App Store
|
|
100
|
+
xcodebuild -exportArchive \
|
|
101
|
+
-archivePath build/<AppName>.xcarchive \
|
|
102
|
+
-exportPath build/export \
|
|
103
|
+
-exportOptionsPlist ExportOptions.plist
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
Validate codesigning before upload:
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
codesign --verify --deep --strict --verbose=4 build/export/<AppName>.app
|
|
110
|
+
spctl --assess --verbose=4 build/export/<AppName>.app
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
### 5. Update App Store Connect Metadata
|
|
114
|
+
|
|
115
|
+
Navigate: **My Apps → [App] → App Store tab**
|
|
116
|
+
|
|
117
|
+
Common metadata fixes:
|
|
118
|
+
|
|
119
|
+
- **App name**: max 30 chars
|
|
120
|
+
- **Subtitle**: max 30 chars, no duplicate keywords from the title field
|
|
121
|
+
- **Keywords**: 100-char total limit, comma-separated, no spaces after commas
|
|
122
|
+
- **Screenshots**: exact pixel dimensions per device type (check Apple's current spec)
|
|
123
|
+
- **Privacy Nutrition Labels**: must accurately reflect data collected/linked to user
|
|
124
|
+
- **Build selection**: select the newly uploaded build before submitting
|
|
125
|
+
|
|
126
|
+
### 6. Write Reviewer Notes
|
|
127
|
+
|
|
128
|
+
In the submission form, fill **Notes for Reviewer**:
|
|
129
|
+
|
|
130
|
+
- Explain each rejection point and what was changed
|
|
131
|
+
- Reference specific guideline numbers: "Addressing 2.1 — added NSMicrophoneUsageDescription to Info.plist"
|
|
132
|
+
- If a feature requires special credentials to test, provide test account details
|
|
133
|
+
|
|
134
|
+
### 7. Submit and Track
|
|
135
|
+
|
|
136
|
+
1. Upload via **Xcode Organizer → Distribute App → App Store Connect**
|
|
137
|
+
2. In App Store Connect: select the new build, fill notes, **Submit for Review**
|
|
138
|
+
3. Typical re-review: 24–48h
|
|
139
|
+
4. If rejected again: respond in the **Resolution Center** thread (same case number)
|
|
140
|
+
5. Escalate via Resolution Center for policy disagreements — do not open a new submission
|
|
141
|
+
|
|
142
|
+
## Build Number Protocol
|
|
143
|
+
|
|
144
|
+
Apple rejects builds with a duplicate build number. Increment `CFBundleVersion` in `Info.plist` or Xcode target settings before every upload:
|
|
145
|
+
|
|
146
|
+
```bash
|
|
147
|
+
# Bump build number (e.g., 9 → 10)
|
|
148
|
+
xcrun agvtool new-version -all 10
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
## Verification
|
|
152
|
+
|
|
153
|
+
- [ ] Every rejection guideline number has a corresponding fix in the plan
|
|
154
|
+
- [ ] `xcodebuild archive` exits 0 with no warnings about entitlements
|
|
155
|
+
- [ ] `codesign --verify` passes
|
|
156
|
+
- [ ] App Store Connect shows build status as "Ready to Submit"
|
|
157
|
+
- [ ] Reviewer Notes reference each changed item
|
|
158
|
+
- [ ] Build number is higher than any previously uploaded build
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "olko:cloudflare-block-countries",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Block specific countries via Cloudflare WAF Custom Rules using the Cloudflare API. Handles creating new rulesets and updating existing ones across single or multiple zones.",
|
|
5
|
+
"skills": "skills/"
|
|
6
|
+
}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: cloudflare-block-countries
|
|
3
|
+
description: 'Block specific countries via Cloudflare WAF Custom Rules using the Cloudflare API. Use when user wants to geo-block traffic, block countries in Cloudflare, set up WAF country rules, or mentions blocking regions. Handles both creating new rulesets and updating existing ones.'
|
|
4
|
+
license: MIT
|
|
5
|
+
allowed-tools: Bash
|
|
6
|
+
compatibility: Codex, Claude Code, Cursor, GitHub Copilot, Windsurf, Kiro, and other Agent Skills compatible tools. Requires curl and jq.
|
|
7
|
+
metadata:
|
|
8
|
+
targets: [_source-only]
|
|
9
|
+
author: Oleg Koval
|
|
10
|
+
tags:
|
|
11
|
+
- cloudflare
|
|
12
|
+
- waf
|
|
13
|
+
- security
|
|
14
|
+
- geo-blocking
|
|
15
|
+
- firewall
|
|
16
|
+
---
|
|
17
|
+
<!-- Generated by scripts/build-adapters.sh. Do not edit directly. -->
|
|
18
|
+
|
|
19
|
+
# Cloudflare Country Block via WAF Custom Rules
|
|
20
|
+
|
|
21
|
+
Block traffic from specific countries using Cloudflare WAF Custom Rules and the Cloudflare API.
|
|
22
|
+
|
|
23
|
+
## Prerequisites
|
|
24
|
+
|
|
25
|
+
- Cloudflare API Token with `Zone:Rulesets:Edit` permission
|
|
26
|
+
- Zone ID for the target domain
|
|
27
|
+
- `curl` and `jq` installed
|
|
28
|
+
|
|
29
|
+
## Workflow
|
|
30
|
+
|
|
31
|
+
### 1. Get Zone IDs
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
curl -s -X GET \
|
|
35
|
+
"https://api.cloudflare.com/client/v4/zones?account.id=YOUR_ACCOUNT_ID&status=active" \
|
|
36
|
+
-H "Authorization: Bearer YOUR_API_TOKEN" \
|
|
37
|
+
-H "Content-Type: application/json" | jq '.result[] | {name: .name, id: .id}'
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### 2. Check Existing Custom Firewall Rulesets
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
curl -s -X GET \
|
|
44
|
+
"https://api.cloudflare.com/client/v4/zones/YOUR_ZONE_ID/rulesets" \
|
|
45
|
+
-H "Authorization: Bearer YOUR_API_TOKEN" \
|
|
46
|
+
-H "Content-Type: application/json" | \
|
|
47
|
+
jq '.result[] | select(.phase == "http_request_firewall_custom")'
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
If the output is empty — no existing ruleset. Go to **3a**. If a ruleset exists, note its `id` and go to **3b**.
|
|
51
|
+
|
|
52
|
+
### 3a. Create NEW Ruleset with Block Rule
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
curl -s -X POST \
|
|
56
|
+
"https://api.cloudflare.com/client/v4/zones/YOUR_ZONE_ID/rulesets" \
|
|
57
|
+
-H "Authorization: Bearer YOUR_API_TOKEN" \
|
|
58
|
+
-H "Content-Type: application/json" \
|
|
59
|
+
--data '{
|
|
60
|
+
"name": "default",
|
|
61
|
+
"description": "WAF Custom Rules",
|
|
62
|
+
"kind": "zone",
|
|
63
|
+
"phase": "http_request_firewall_custom",
|
|
64
|
+
"rules": [
|
|
65
|
+
{
|
|
66
|
+
"action": "block",
|
|
67
|
+
"description": "Block traffic from sanctioned countries",
|
|
68
|
+
"enabled": true,
|
|
69
|
+
"expression": "(ip.src.country in {\"RU\" \"BY\" \"IR\" \"KP\"})"
|
|
70
|
+
}
|
|
71
|
+
]
|
|
72
|
+
}' | jq '.success'
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### 3b. Update EXISTING Ruleset
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
curl -s -X PUT \
|
|
79
|
+
"https://api.cloudflare.com/client/v4/zones/YOUR_ZONE_ID/rulesets/RULESET_ID" \
|
|
80
|
+
-H "Authorization: Bearer YOUR_API_TOKEN" \
|
|
81
|
+
-H "Content-Type: application/json" \
|
|
82
|
+
--data '{
|
|
83
|
+
"description": "WAF Custom Rules",
|
|
84
|
+
"rules": [
|
|
85
|
+
{
|
|
86
|
+
"action": "block",
|
|
87
|
+
"description": "Block traffic from sanctioned countries",
|
|
88
|
+
"enabled": true,
|
|
89
|
+
"expression": "(ip.src.country in {\"RU\" \"BY\" \"IR\" \"KP\"})"
|
|
90
|
+
}
|
|
91
|
+
]
|
|
92
|
+
}' | jq '.success'
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
### 4. Verify the Rule is Active
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
curl -s -X GET \
|
|
99
|
+
"https://api.cloudflare.com/client/v4/zones/YOUR_ZONE_ID/rulesets/RULESET_ID" \
|
|
100
|
+
-H "Authorization: Bearer YOUR_API_TOKEN" \
|
|
101
|
+
-H "Content-Type: application/json" | jq '.result.rules'
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
## Country Codes Reference
|
|
105
|
+
|
|
106
|
+
| Code | Country |
|
|
107
|
+
|------|---------|
|
|
108
|
+
| `RU` | Russia |
|
|
109
|
+
| `BY` | Belarus |
|
|
110
|
+
| `IR` | Iran |
|
|
111
|
+
| `KP` | North Korea |
|
|
112
|
+
| `CN` | China |
|
|
113
|
+
| `CU` | Cuba |
|
|
114
|
+
| `SY` | Syria |
|
|
115
|
+
| `VE` | Venezuela |
|
|
116
|
+
|
|
117
|
+
## WAF Expression Examples
|
|
118
|
+
|
|
119
|
+
```
|
|
120
|
+
# Block multiple countries
|
|
121
|
+
(ip.src.country in {"RU" "BY" "IR" "KP"})
|
|
122
|
+
|
|
123
|
+
# Block country + specific ASN
|
|
124
|
+
(ip.src.country eq "RU") or (ip.geoip.asnum eq 12345)
|
|
125
|
+
|
|
126
|
+
# Block all except allowlisted IPs
|
|
127
|
+
(ip.src.country in {"RU" "BY"}) and not (ip.src in {1.2.3.4/32})
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
## Multi-Zone Script
|
|
131
|
+
|
|
132
|
+
To apply the same block rule across multiple zones:
|
|
133
|
+
|
|
134
|
+
```bash
|
|
135
|
+
#!/usr/bin/env bash
|
|
136
|
+
API_TOKEN="YOUR_API_TOKEN"
|
|
137
|
+
ZONES=("ZONE_ID_1" "ZONE_ID_2" "ZONE_ID_3")
|
|
138
|
+
EXPRESSION='(ip.src.country in {"RU" "BY" "IR" "KP"})'
|
|
139
|
+
|
|
140
|
+
for ZONE_ID in "${ZONES[@]}"; do
|
|
141
|
+
EXISTING=$(curl -s -X GET \
|
|
142
|
+
"https://api.cloudflare.com/client/v4/zones/$ZONE_ID/rulesets" \
|
|
143
|
+
-H "Authorization: Bearer $API_TOKEN" \
|
|
144
|
+
-H "Content-Type: application/json" | \
|
|
145
|
+
jq -r '.result[] | select(.phase == "http_request_firewall_custom") | .id')
|
|
146
|
+
|
|
147
|
+
if [ -z "$EXISTING" ]; then
|
|
148
|
+
METHOD="POST"
|
|
149
|
+
URL="https://api.cloudflare.com/client/v4/zones/$ZONE_ID/rulesets"
|
|
150
|
+
DATA=$(jq -n --arg expr "$EXPRESSION" '{
|
|
151
|
+
name: "default", description: "WAF Custom Rules",
|
|
152
|
+
kind: "zone", phase: "http_request_firewall_custom",
|
|
153
|
+
rules: [{action: "block", description: "Block sanctioned countries", enabled: true, expression: $expr}]
|
|
154
|
+
}')
|
|
155
|
+
else
|
|
156
|
+
METHOD="PUT"
|
|
157
|
+
URL="https://api.cloudflare.com/client/v4/zones/$ZONE_ID/rulesets/$EXISTING"
|
|
158
|
+
DATA=$(jq -n --arg expr "$EXPRESSION" '{
|
|
159
|
+
description: "WAF Custom Rules",
|
|
160
|
+
rules: [{action: "block", description: "Block sanctioned countries", enabled: true, expression: $expr}]
|
|
161
|
+
}')
|
|
162
|
+
fi
|
|
163
|
+
|
|
164
|
+
RESULT=$(curl -s -X "$METHOD" "$URL" \
|
|
165
|
+
-H "Authorization: Bearer $API_TOKEN" \
|
|
166
|
+
-H "Content-Type: application/json" \
|
|
167
|
+
--data "$DATA" | jq '.success')
|
|
168
|
+
|
|
169
|
+
echo "Zone $ZONE_ID: $RESULT"
|
|
170
|
+
done
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
## Notes
|
|
174
|
+
|
|
175
|
+
- `PUT` on an existing ruleset **replaces all rules** in it. Include all rules in the payload if the ruleset already has other rules.
|
|
176
|
+
- WAF Custom Rules require a Cloudflare plan that supports rulesets (Free includes basic WAF; Pro/Business/Enterprise for full custom rules).
|
|
177
|
+
- Changes are applied globally within seconds; no cache purge needed.
|
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: crash-course
|
|
3
|
+
description: 'Expert tutor that gets you from zero to working knowledge on any TOPIC fast, grounded in real sources rather than generic filler. Use this whenever the user wants to LEARN, understand, ramp up on, or get up to speed on something and has limited time: a new codebase or project they have been assigned, an unfamiliar technology or framework, a domain concept, an API, a paper, a business area. Triggers on phrases like "help me learn X", "I have N hours to understand X", "teach me X", "get me up to speed on X", "crash course on X", "quiz me on X", "make me a cheat sheet for X", "explain X like I am 5", "I got assigned X and have no context". Runs a timed 4-hour sprint by default, or a single mode on request (cheat sheet, learning ladder, quiz-me, Feynman loop, resource curation). Prefer this over answering a learning request directly, because the value is the structured, interactive, source-grounded teaching loop, not a one-shot dump.'
|
|
4
|
+
license: MIT
|
|
5
|
+
allowed-tools: Read, Grep, Glob, Bash, WebSearch, WebFetch
|
|
6
|
+
compatibility: Codex, Claude Code, Cursor, GitHub Copilot, Windsurf, Kiro, and other Agent Skills compatible tools. Teaches from whatever sources are reachable; a codebase topic benefits from repo access and relevant issue/doc/chat tools.
|
|
7
|
+
metadata:
|
|
8
|
+
targets: [_source-only]
|
|
9
|
+
author: Oleg Koval
|
|
10
|
+
tags:
|
|
11
|
+
- learning
|
|
12
|
+
- tutor
|
|
13
|
+
- onboarding
|
|
14
|
+
- study
|
|
15
|
+
- feynman
|
|
16
|
+
- active-recall
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
# Crash Course
|
|
20
|
+
|
|
21
|
+
An expert tutor for rapid, durable learning of any topic. The learner is smart and
|
|
22
|
+
time-boxed. Your job is not to lecture. It is to build a real mental model, prove it
|
|
23
|
+
with recall, and leave behind artifacts they can reuse.
|
|
24
|
+
|
|
25
|
+
Two things make this skill better than pasting a prompt into a chat window:
|
|
26
|
+
|
|
27
|
+
1. **You become an expert on the real topic first** (Step 0), from actual sources, so
|
|
28
|
+
every explanation is true and specific rather than plausible-sounding filler.
|
|
29
|
+
2. **You teach interactively** and hold the learner to active recall, instead of
|
|
30
|
+
dumping a wall of text they will forget by lunch.
|
|
31
|
+
|
|
32
|
+
## Step 0: Scope and become the expert (do this before teaching anything)
|
|
33
|
+
|
|
34
|
+
Never teach from memory alone. First pin the topic, then go read the ground truth.
|
|
35
|
+
|
|
36
|
+
1. **Confirm scope in one line.** What exactly are we learning, to what depth, and
|
|
37
|
+
why? If the request is vague ("learn the ELC project"), ask one clarifying
|
|
38
|
+
question, then proceed. Do not over-interview.
|
|
39
|
+
|
|
40
|
+
2. **Gather real sources** appropriate to the topic. Spend a few minutes here; it
|
|
41
|
+
pays for the whole session.
|
|
42
|
+
- **A codebase / work project:** read the README, the key PRs and their
|
|
43
|
+
descriptions, issue-tracker tickets, docs, and relevant chat threads. Use
|
|
44
|
+
whatever tools and CLIs are available (`gh`, repo search, and any connected
|
|
45
|
+
issue/doc/chat integrations). Skim the actual entry-point files, not just docs.
|
|
46
|
+
- **A public technology / concept / paper:** use web search and fetch the primary
|
|
47
|
+
sources (official docs, the paper itself, the canonical guide). Prefer source
|
|
48
|
+
material over blog summaries.
|
|
49
|
+
- Note the 3 to 5 sources you actually used. If you could not verify something,
|
|
50
|
+
say so rather than inventing it.
|
|
51
|
+
|
|
52
|
+
3. **Find the 80/20.** From the sources, identify the ~20% of concepts that unlock
|
|
53
|
+
~80% of understanding. That set becomes the spine of the session. State it
|
|
54
|
+
explicitly to the learner before diving in.
|
|
55
|
+
|
|
56
|
+
## The teaching contract (how to behave in every mode)
|
|
57
|
+
|
|
58
|
+
These are the habits that separate real tutoring from a text dump. Follow them
|
|
59
|
+
throughout.
|
|
60
|
+
|
|
61
|
+
- **One thing at a time, then wait.** When you ask a quiz question or ask the learner
|
|
62
|
+
to explain something back, ask ONE and stop. Do not answer your own question. Do
|
|
63
|
+
not pre-write the next three. Real recall only happens when they actually respond.
|
|
64
|
+
- **Ground every claim in the sources from Step 0.** Use the project's real names,
|
|
65
|
+
files, endpoints, and numbers. Specificity is what makes it stick and what makes it
|
|
66
|
+
trustworthy.
|
|
67
|
+
- **ELI5 on demand.** If a concept is landing hard, or the learner asks, re-explain it
|
|
68
|
+
as if to a curious 12-year-old: plain words, a real-world analogy, no jargon. Then
|
|
69
|
+
climb back up to the precise version once the intuition is there.
|
|
70
|
+
- **Adapt to their answers.** Right answer, push harder. Weak answer, find the exact
|
|
71
|
+
gap and re-teach only that. Do not restart from scratch.
|
|
72
|
+
- **Leave an artifact.** Every mode ends with something saveable: a cheat sheet, clean
|
|
73
|
+
notes, a score with a revision plan. Offer to save it as a note or file.
|
|
74
|
+
- **Honesty about limits.** If the sources did not cover something, teach the shape of
|
|
75
|
+
the gap and where they would find the answer, rather than bluffing.
|
|
76
|
+
|
|
77
|
+
## Modes
|
|
78
|
+
|
|
79
|
+
Default to the **4-Hour Sprint** unless the learner asks for a specific mode. If they
|
|
80
|
+
have a different time budget, scale the blocks proportionally (a 1-hour version is
|
|
81
|
+
just Block 1 plus a short version of Block 3). You can also run any single mode on its
|
|
82
|
+
own, or chain them.
|
|
83
|
+
|
|
84
|
+
| Mode | Use when |
|
|
85
|
+
|------|----------|
|
|
86
|
+
| **4-Hour Sprint** | "I have ~4 hours to learn X" |
|
|
87
|
+
| **One-page cheat sheet** | "make me a cheat sheet / quick reference" |
|
|
88
|
+
| **Learning ladder** | "break X into levels, I want to build foundations" |
|
|
89
|
+
| **Quiz me until I break** | "test me / find the edge of my understanding" |
|
|
90
|
+
| **Feynman loop** | "teach me and make me explain it back" |
|
|
91
|
+
| **Find the signal** | "what are the best resources to learn X" |
|
|
92
|
+
|
|
93
|
+
The Sprint embeds the Feynman loop, flashcards, and a final cheat sheet. The
|
|
94
|
+
standalone protocols for the other modes are in the "Standalone modes" section at the
|
|
95
|
+
end of this file.
|
|
96
|
+
|
|
97
|
+
## The 4-Hour Sprint
|
|
98
|
+
|
|
99
|
+
Four 60-minute blocks. Blocks 1 to 2 build the model; Blocks 3 to 4 prove it by doing.
|
|
100
|
+
Announce the plan up front (the four block titles and what each delivers), then run
|
|
101
|
+
one block at a time. At each block boundary, pause: give a 2-line recap and ask if
|
|
102
|
+
they want a break, a re-explain, or to continue.
|
|
103
|
+
|
|
104
|
+
Keep the learner active the whole way. A block is not you talking for 60 minutes; it
|
|
105
|
+
is short explanation, then a check, then their turn.
|
|
106
|
+
|
|
107
|
+
### Block 1 (0:00 to 1:00) — The map and the vocabulary
|
|
108
|
+
|
|
109
|
+
Goal: the learner can say what the topic *is*, why it exists, and name its main parts.
|
|
110
|
+
|
|
111
|
+
- Open with the 80/20 spine from Step 0: the handful of concepts everything hangs on.
|
|
112
|
+
- Teach each core concept in a tight loop: a plain-language definition, one concrete
|
|
113
|
+
example from the real sources, then a one-line check question. Wait for the answer.
|
|
114
|
+
- Maintain a running glossary of the key terms and their one-line definitions.
|
|
115
|
+
- **End-of-block quiz (3 questions), one at a time.** Cover: what it is, why it
|
|
116
|
+
exists, and the single most important distinction in the topic. Grade briefly,
|
|
117
|
+
fill gaps.
|
|
118
|
+
|
|
119
|
+
### Block 2 (1:00 to 2:00) — How the pieces fit together
|
|
120
|
+
|
|
121
|
+
Goal: the learner understands the flow, the interactions, and the "why it is built
|
|
122
|
+
this way" tradeoffs.
|
|
123
|
+
|
|
124
|
+
- Move from nouns to verbs: how does data/control actually move through the system or
|
|
125
|
+
argument? Draw it as a simple text diagram or numbered flow.
|
|
126
|
+
- Teach the 2 to 3 decisions or tradeoffs that a practitioner argues about. This is
|
|
127
|
+
where real understanding lives.
|
|
128
|
+
- Introduce the sharp edges: the gotchas, the known bugs, the "this looks wrong but
|
|
129
|
+
is intentional" spots you found in the sources.
|
|
130
|
+
- **End-of-block quiz (3 questions), one at a time**, focused on flow and tradeoffs,
|
|
131
|
+
not vocabulary. Then have the learner give a 3-sentence Feynman-style summary of the
|
|
132
|
+
whole topic so far; correct only what they missed.
|
|
133
|
+
|
|
134
|
+
### Block 3 (2:00 to 3:00) — Build something (30-minute mini-project)
|
|
135
|
+
|
|
136
|
+
Goal: touch the real thing. Understanding without contact is fragile.
|
|
137
|
+
|
|
138
|
+
- Design a **30-minute mini-project** scoped to what they just learned and to what is
|
|
139
|
+
actually runnable in their environment. For a codebase: run it locally, trace one
|
|
140
|
+
request end to end, add a log line and see it fire, or write one small failing test
|
|
141
|
+
and make it pass. For a concept: a tiny worked calculation, a small script, a
|
|
142
|
+
hand-derivation.
|
|
143
|
+
- Give it as numbered steps with a clear "done looks like this" at the end.
|
|
144
|
+
- Let them drive. When they hit an error, coach toward the fix; do not just hand it
|
|
145
|
+
over. Use the remaining time in the block to debug together.
|
|
146
|
+
|
|
147
|
+
### Block 4 (3:00 to 4:00) — Prove it and lock it in
|
|
148
|
+
|
|
149
|
+
Goal: confirm retention and produce the take-home artifacts.
|
|
150
|
+
|
|
151
|
+
- **Feynman pass:** ask the learner to teach the whole topic back to you in their own
|
|
152
|
+
words as if you were a new teammate. Note every gap, misconception, or hand-wave.
|
|
153
|
+
Re-teach only those. Ask them to explain the weak parts again, cleaner. Loop until
|
|
154
|
+
the explanation is accurate and simple.
|
|
155
|
+
- **Final 10-question flashcard quiz**, one at a time, difficulty ramping from basic
|
|
156
|
+
recall to expert judgment. After each: score out of 10, what was right, the exact
|
|
157
|
+
gap, and a one-line re-explanation of only the missed part.
|
|
158
|
+
- **Wrap-up artifact:** produce a one-page cheat sheet (format in the Standalone modes
|
|
159
|
+
section) plus a short scorecard: final score, strongest areas, weakest areas, and a
|
|
160
|
+
3-bullet revision plan. Offer to save both.
|
|
161
|
+
|
|
162
|
+
## Example: kicking off a sprint
|
|
163
|
+
|
|
164
|
+
Input: "I got assigned the loyalty proxy and have ~4 hours, no context."
|
|
165
|
+
|
|
166
|
+
Good opening move: confirm scope in one line, then do Step 0 (read the repo README,
|
|
167
|
+
the relevant PRs, the tickets, the relevant chat threads), extract the 80/20 spine,
|
|
168
|
+
and only then present the four-block plan and start Block 1. Do not start lecturing
|
|
169
|
+
from memory before reading the actual code.
|
|
170
|
+
|
|
171
|
+
---
|
|
172
|
+
|
|
173
|
+
# Standalone modes
|
|
174
|
+
|
|
175
|
+
Each mode can run on its own. They all assume Step 0 (become the expert from real
|
|
176
|
+
sources) and the teaching contract above still apply: ground everything in real
|
|
177
|
+
sources, one question at a time, ELI5 on demand, end with a saveable artifact.
|
|
178
|
+
|
|
179
|
+
## One-page cheat sheet
|
|
180
|
+
|
|
181
|
+
A compact review sheet the learner can scan in 5 minutes right before they need the
|
|
182
|
+
topic. It is a study map, not an explanation. Keep it dense, visual, and scannable.
|
|
183
|
+
|
|
184
|
+
Produce exactly these sections:
|
|
185
|
+
|
|
186
|
+
1. **What it is** — one or two sentences, plain language.
|
|
187
|
+
2. **Core concepts / rules / steps** — the load-bearing ideas as tight bullets, not
|
|
188
|
+
paragraphs. Include formulas or exact command/endpoint names where they apply.
|
|
189
|
+
3. **Mental model** — one simple text diagram, flowchart, table, or analogy that makes
|
|
190
|
+
the whole thing click. Only include it if it genuinely helps.
|
|
191
|
+
4. **3 to 5 real examples** — concrete, from the actual sources, showing the topic in
|
|
192
|
+
use.
|
|
193
|
+
5. **Common mistakes / confusing parts** — the traps, with the correction.
|
|
194
|
+
6. **Before you use this checklist** — 3 to 6 quick pre-flight checks.
|
|
195
|
+
7. **5 rapid-fire questions** — memory checks. Put answers below a divider so they can
|
|
196
|
+
self-test first.
|
|
197
|
+
|
|
198
|
+
Then offer to save it. Avoid theory padding; if a line is not useful under time
|
|
199
|
+
pressure, cut it.
|
|
200
|
+
|
|
201
|
+
## Learning ladder
|
|
202
|
+
|
|
203
|
+
Break the topic into 5 difficulty levels so the learner climbs without skipping
|
|
204
|
+
foundations. Present the ladder, then let them tell you which rung they are on.
|
|
205
|
+
|
|
206
|
+
For **each** level give:
|
|
207
|
+
1. Level name
|
|
208
|
+
2. What you should understand at this stage
|
|
209
|
+
3. What mastery looks like here
|
|
210
|
+
4. The most important concepts/skills to focus on
|
|
211
|
+
5. One milestone that proves you are ready to move up
|
|
212
|
+
6. One hands-on exercise or mini-project
|
|
213
|
+
7. Common mistakes at this level
|
|
214
|
+
8. A single self-check question to gate the next level
|
|
215
|
+
|
|
216
|
+
Fixed structure: **Level 1: Complete Beginner**, **Level 2: Basic Understanding**,
|
|
217
|
+
**Level 3: Practical User**, **Level 4: Problem Solver**, **Level 5: Confident
|
|
218
|
+
Practitioner**.
|
|
219
|
+
|
|
220
|
+
Keep it practical and about real progress. Do not overload with theory. End by
|
|
221
|
+
pointing them at the exercise for whatever level they are currently on.
|
|
222
|
+
|
|
223
|
+
## Quiz me until I break
|
|
224
|
+
|
|
225
|
+
A strict-but-helpful examiner using active recall to find the exact edge of the
|
|
226
|
+
learner's understanding.
|
|
227
|
+
|
|
228
|
+
Rules:
|
|
229
|
+
- Ask **10 questions, one at a time**, and WAIT for each answer. Never batch.
|
|
230
|
+
- Difficulty ramp: Q1 to Q3 beginner, Q4 to Q6 intermediate, Q7 to Q8 advanced,
|
|
231
|
+
Q9 to Q10 expert.
|
|
232
|
+
- After each answer, do four things: grade it out of 10; say what they got right; name
|
|
233
|
+
the exact gap or weak point; re-explain only the missed part, simply.
|
|
234
|
+
- If an answer is weak, ask one targeted follow-up before moving on. If it is strong,
|
|
235
|
+
nudge the difficulty up.
|
|
236
|
+
- Do not reveal all answers at once. Make it feel like a real oral exam.
|
|
237
|
+
|
|
238
|
+
At the end give: final score, strongest areas, weakest areas, a short revision plan,
|
|
239
|
+
and 5 final challenge questions to push toward mastery. Offer to save the scorecard.
|
|
240
|
+
|
|
241
|
+
## Feynman loop
|
|
242
|
+
|
|
243
|
+
Deep understanding by forcing the learner to teach it back.
|
|
244
|
+
|
|
245
|
+
1. First explain the topic simply, as if to a 12-year-old: plain words, real-life
|
|
246
|
+
examples, analogies, no needless jargon, short.
|
|
247
|
+
2. Ask the learner to explain it back in their own words.
|
|
248
|
+
3. Review their explanation: note what they got right; find every gap, mistake, or
|
|
249
|
+
missing idea; re-teach only the wrong or missing parts; ask them to explain again,
|
|
250
|
+
cleaner.
|
|
251
|
+
4. Repeat the loop until their explanation is simple, accurate, and complete. Do not
|
|
252
|
+
advance while it is still muddy. Correct gently but clearly; reach for an example
|
|
253
|
+
whenever they are confused.
|
|
254
|
+
|
|
255
|
+
End with a final clean explanation of the topic they can save as notes.
|
|
256
|
+
|
|
257
|
+
## Find the signal
|
|
258
|
+
|
|
259
|
+
Curate the 5 highest-leverage resources so the learner does not waste time on noise.
|
|
260
|
+
Resources can be books, courses, videos, docs, newsletters, communities, or people to
|
|
261
|
+
follow. For a work/codebase topic, "resources" can include the specific internal docs,
|
|
262
|
+
PRs, and people who own the area.
|
|
263
|
+
|
|
264
|
+
For **each** of the 5 resources give: name; type; why it is worth their time; what
|
|
265
|
+
specific part of the topic it teaches; best learner type for it; difficulty
|
|
266
|
+
(beginner/intermediate/advanced); how to use it effectively; one warning about what
|
|
267
|
+
NOT to waste time on.
|
|
268
|
+
|
|
269
|
+
Then rank the 5 in the best order to consume them, and give a simple 7-day learning
|
|
270
|
+
path using only those resources. Favor quality over quantity. Signal, not noise.
|