opencode-skills-antigravity 1.0.38 → 1.0.40

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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "updatedAt": "2026-03-29T14:39:37.453Z",
3
+ "updatedAt": "2026-03-29T16:37:41.285Z",
4
4
  "entries": [
5
5
  ".gitignore",
6
6
  "00-andruia-consultant",
@@ -701,6 +701,7 @@
701
701
  "javascript-typescript-typescript-scaffold",
702
702
  "jira-automation",
703
703
  "jobgpt",
704
+ "jq",
704
705
  "json-canvas",
705
706
  "julia-pro",
706
707
  "junta-leiloeiros",
@@ -1215,6 +1216,7 @@
1215
1216
  "threejs-skills",
1216
1217
  "threejs-textures",
1217
1218
  "tiktok-automation",
1219
+ "tmux",
1218
1220
  "todoist-automation",
1219
1221
  "tool-design",
1220
1222
  "tool-use-guardian",
@@ -1261,6 +1263,7 @@
1261
1263
  "vexor-cli",
1262
1264
  "vibe-code-auditor",
1263
1265
  "vibers-code-review",
1266
+ "viboscope",
1264
1267
  "videodb",
1265
1268
  "videodb-skills",
1266
1269
  "viral-generator-builder",
@@ -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.331+ skill."
3
+ description: "Come usare antigravity-awesome-skills con Jetski/Cortex evitando l’overflow di contesto con 1.332+ skill."
4
4
  ---
5
5
 
6
- # Jetski/Cortex + Gemini: integrazione sicura con 1.331+ skill
6
+ # Jetski/Cortex + Gemini: integrazione sicura con 1.332+ 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.331 skill, questo approccio riempie il context window prima ancora di aggiungere i messaggi dell’utente, causando l’errore di truncation.
26
+ Con oltre 1.332 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,7 +20,7 @@ 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,331+ skills installed.
23
+ This pattern avoids context overflow when you have 1,332+ skills installed.
24
24
 
25
25
  ---
26
26
 
@@ -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,331+ agentic skills for Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and other AI coding assistants.
9
+ > Installable GitHub library of 1,332+ 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,331+ 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,332+ 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,331+ Agentic Skills`;
31
+ - use a clean preview image that says `1,332+ 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
 
@@ -0,0 +1,34 @@
1
+ finding_id,title,current_status,current_paths,validation_reason,evidence
2
+ 1,Unsanitized frontmatter name enables path traversal in sync script,obsolete/not reproducible on current HEAD,tools/scripts/sync_microsoft_skills.py,sync_microsoft_skills.py now sanitizes flat names and constrains delete/copy targets to safe in-repo paths.,tools/scripts/tests/test_sync_microsoft_skills_security.py
3
+ 2,Stored XSS via rehype-raw rendering of skill markdown,obsolete/not reproducible on current HEAD,apps/web-app/src/pages/SkillDetail.tsx,SkillDetail still renders markdown without rehype-raw; the reported stored-XSS path does not reproduce.,apps/web-app/src/pages/SkillDetail.tsx
4
+ 3,Symlink-following copy leaks host files in setup_web,obsolete/not reproducible on current HEAD,tools/scripts/setup_web.js,setup_web.js now uses lstatSync plus resolveSafeRealPath() and skips out-of-root symlinks.,tools/scripts/tests/copy_security.test.js
5
+ 4,Insecure install guidance allows remote script execution,obsolete/not reproducible on current HEAD,skills/apify-actorization/SKILL.md,The Apify skill no longer recommends pipe-to-shell installs or token-on-command-line login.,skills/apify-actorization/SKILL.md
6
+ 5,"setup_web.js now follows symlinks, enabling file exfiltration",duplicate of another finding,tools/scripts/setup_web.js,Same root cause/fix area as finding 3.,tools/scripts/setup_web.js
7
+ 6,Symlink traversal in web asset setup copies arbitrary files,duplicate of another finding,tools/scripts/setup_web.js,Same root cause/fix area as finding 3.,tools/scripts/setup_web.js
8
+ 7,Symlink file copying in .github/skills sync leaks host files,obsolete/not reproducible on current HEAD,tools/scripts/sync_microsoft_skills.py,Microsoft sync now rejects unsafe symlink targets and only accepts safe regular files that stay within the cloned source root.,tools/scripts/tests/test_sync_microsoft_skills_security.py
9
+ 8,Symlinked file copy in Microsoft skill sync can leak host data,duplicate of another finding,tools/scripts/sync_microsoft_skills.py,Same root cause/fix area as finding 7.,tools/scripts/sync_microsoft_skills.py
10
+ 9,Committed Python bytecode can hide malicious logic,obsolete/not reproducible on current HEAD,skills/ui-ux-pro-max/scripts/__pycache__,Tracked __pycache__ artifacts are absent on current main and repo hygiene tests fail if they reappear.,tools/scripts/tests/repo_hygiene_security.test.js
11
+ 10,Symlinked SKILL.md can leak host files via index script,obsolete/not reproducible on current HEAD,tools/scripts/generate_index.py,generate_index.py now ignores symlinked SKILL.md files during index generation.,tools/scripts/tests/test_frontmatter_parsing_security.py
12
+ 11,"Example loader trusts manifest paths, enabling file read",obsolete/not reproducible on current HEAD,docs/integrations/jetski-gemini-loader/loader.mjs,The Jetski loader rejects symlinked skill directories/files and any resolved SKILL.md outside the configured skills root.,tools/scripts/tests/jetski_gemini_loader.test.cjs
13
+ 12,TLS certificate verification disabled in new scrapers,obsolete/not reproducible on current HEAD,skills/junta-leiloeiros/scripts/scraper/base_scraper.py | skills/junta-leiloeiros/scripts/web_scraper_fallback.py,TLS verification is enabled by default again; insecure behavior requires an explicit opt-out environment flag.,skills/junta-leiloeiros/scripts/scraper/base_scraper.py
14
+ 13,Complete bundle omits valid skill categories,obsolete/not reproducible on current HEAD,tools/lib/skill-filter.js | tools/scripts/build-catalog.js | data/bundles.json,The old helper-path omission still does not drive shipped bundle output; current bundles come from build-catalog.js.,tools/scripts/build-catalog.js
15
+ 14,Malformed frontmatter delimiter breaks YAML parsing for skills,obsolete/not reproducible on current HEAD,skills/alpha-vantage/SKILL.md,The malformed --- Unknown frontmatter regression is no longer present in alpha-vantage.,tools/scripts/tests/repo_hygiene_security.test.js
16
+ 15,ws_listener writes sensitive events to predictable /tmp files,obsolete/not reproducible on current HEAD,skills/videodb/scripts/ws_listener.py,ws_listener.py now defaults to a user-owned state directory and uses secure file creation.,tools/scripts/tests/local_temp_safety.test.js
17
+ 16,Symlink traversal lets /skills/ serve arbitrary local files,obsolete/not reproducible on current HEAD,apps/web-app/refresh-skills-plugin.js,refresh-skills-plugin.js resolves real paths under the skills root before serving /skills/*; the public Pages app no longer exposes the maintainer sync surface.,apps/web-app/refresh-skills-plugin.js
18
+ 17,Sync Skills endpoint follows symlinks from downloaded archive,duplicate of another finding,apps/web-app/refresh-skills-plugin.js,Same root cause/fix area as finding 16.,apps/web-app/refresh-skills-plugin.js
19
+ 18,Validation crash if YAML frontmatter is not a mapping,obsolete/not reproducible on current HEAD,tools/scripts/validate_skills.py,validate_skills.py now rejects non-mapping YAML frontmatter cleanly instead of crashing downstream validation.,tools/scripts/tests/test_frontmatter_parsing_security.py
20
+ 19,Anonymous Supabase writes allow skill star tampering,obsolete/not reproducible on current HEAD,apps/web-app/src/hooks/useSkillStars.ts | apps/web-app/src/lib/supabase.ts,useSkillStars now stores saves locally in the browser and no longer performs shared frontend writes through the public Supabase client.,apps/web-app/src/hooks/useSkillStars.ts
21
+ 20,Metadata fixer overwrites symlinked SKILL.md targets,obsolete/not reproducible on current HEAD,tools/scripts/fix_skills_metadata.py,fix_skills_metadata.py now skips symlinked SKILL.md files and non-mapping frontmatter.,tools/scripts/fix_skills_metadata.py
22
+ 21,Installer now dereferences symlinks during copy,obsolete/not reproducible on current HEAD,tools/bin/install.js,install.js now uses lstatSync plus resolveSafeRealPath() and skips symlinks that resolve outside the cloned repo root.,tools/scripts/tests/copy_security.test.js
23
+ 22,Installer merge path dereferences symlinks when copying,duplicate of another finding,tools/bin/install.js,Same root cause/fix area as finding 21.,tools/bin/install.js
24
+ 23,Cleanup sync deletes arbitrary paths via flat_name,duplicate of another finding,tools/scripts/sync_microsoft_skills.py,Same root cause/fix area as finding 1.,tools/scripts/sync_microsoft_skills.py
25
+ 24,Audio transcription example allows Python code injection,obsolete/not reproducible on current HEAD,skills/audio-transcriber/examples/basic-transcription.sh,The audio transcription example now uses a quoted heredoc and passes values via environment variables.,skills/audio-transcriber/examples/basic-transcription.sh
26
+ 25,Unbounded recursive skill traversal can crash catalog build,obsolete/not reproducible on current HEAD,tools/lib/skill-utils.js | tools/scripts/build-catalog.js,The claimed recursive symlink traversal in catalog discovery still does not reproduce on current code paths.,tools/lib/skill-utils.js
27
+ 26,Release scripts still use root skills_index.json path,obsolete/not reproducible on current HEAD,tools/scripts/update_readme.py | tools/scripts/generate_index.py | tools/scripts/release_workflow.js,"Root skills_index.json remains the canonical generated index, so the reported release-script path mismatch does not reproduce.",tools/scripts/release_workflow.js
28
+ 27,Symlink traversal in skill normalization allows file overwrite,obsolete/not reproducible on current HEAD,tools/lib/skill-utils.js | tools/scripts/normalize-frontmatter.js,"skill-utils.js now relies on lstatSync-based safe directory/file discovery, so normalization does not treat symlinked skill folders as writable local skills.",tools/lib/skill-utils.js
29
+ 28,last30days skill passes user input directly to Bash command,obsolete/not reproducible on current HEAD,skills/last30days/SKILL.md,"The last30days skill still passes user input as a quoted value through a temp file, so the reported direct shell-injection sink does not reproduce.",skills/last30days/SKILL.md
30
+ 29,Unvalidated YAML frontmatter can crash index generation,duplicate of another finding,tools/scripts/generate_index.py,Same root cause/fix area as finding 18.,tools/scripts/generate_index.py
31
+ 30,Predictable /tmp counter file enables local file clobbering,obsolete/not reproducible on current HEAD,skills/cc-skill-strategic-compact/suggest-compact.sh,The strategic compact hook now stores state under XDG_STATE_HOME instead of predictable shared /tmp paths.,tools/scripts/tests/local_temp_safety.test.js
32
+ 31,Symlink traversal risk in new sync script,obsolete/not reproducible on current HEAD,tools/scripts/sync_recommended_skills.sh,sync_recommended_skills.sh now preserves symlinks with cp -RP and avoids the destructive glob-delete pattern from the original report.,tools/scripts/tests/repo_hygiene_security.test.js
33
+ 32,skills_manager allows path traversal in enable/disable operations,obsolete/not reproducible on current HEAD,tools/scripts/skills_manager.py,skills_manager.py now resolves candidate paths relative to the intended base directory and rejects traversal attempts.,tools/scripts/tests/test_skills_manager_security.py
34
+ 33,Zip Slip risk in Office unpack scripts,obsolete/not reproducible on current HEAD,skills/docx-official/ooxml/scripts/unpack.py | skills/pptx-official/ooxml/scripts/unpack.py,The Office unpack helpers now validate archive members and reject traversal/symlink-style entries before extraction.,tools/scripts/tests/test_office_unpack_security.py
@@ -8,6 +8,8 @@ baseline.
8
8
  - Current verification target: `main@d63d99381b8f613f99c8cb7b758e7879b401f8a0`
9
9
  - The 2026-03-15 markdown file and CSV remain useful as historical input, not
10
10
  as the current source of truth.
11
+ - A machine-readable companion export for this refresh lives at
12
+ [`security-findings-triage-2026-03-29-refresh.csv`](security-findings-triage-2026-03-29-refresh.csv).
11
13
  - Status meanings are unchanged:
12
14
  `still present and exploitable`, `still present but low practical risk`,
13
15
  `obsolete/not reproducible on current HEAD`, `duplicate of another finding`.
@@ -69,7 +69,7 @@ For manual updates, you need:
69
69
  The update process refreshes:
70
70
  - Skills index (`skills_index.json`)
71
71
  - Web app skills data (`apps\web-app\public\skills.json`)
72
- - All 1,331+ skills from the skills directory
72
+ - All 1,332+ skills from the skills directory
73
73
 
74
74
  ## When to Update
75
75
 
@@ -673,4 +673,4 @@ Found a skill that should be in a bundle? Or want to create a new bundle? [Open
673
673
 
674
674
  ---
675
675
 
676
- _Last updated: March 2026 | Total Skills: 1,331+ | Total Bundles: 37_
676
+ _Last updated: March 2026 | Total Skills: 1,332+ | Total Bundles: 37_
@@ -12,7 +12,7 @@ Install the library into Claude Code, then invoke focused skills directly in the
12
12
 
13
13
  ## Why use this repo for Claude Code
14
14
 
15
- - It includes 1,331+ skills instead of a narrow single-domain starter pack.
15
+ - It includes 1,332+ skills instead of a narrow single-domain starter pack.
16
16
  - It supports the standard `.claude/skills/` path and the Claude Code plugin marketplace flow.
17
17
  - It also ships generated bundle plugins so teams can install focused packs like `Essentials` or `Security Developer` from the marketplace metadata.
18
18
  - It includes onboarding docs, bundles, and workflows so new users do not need to guess where to begin.
@@ -12,7 +12,7 @@ Install into the Gemini skills path, then ask Gemini to apply one skill at a tim
12
12
 
13
13
  - It installs directly into the expected Gemini skills path.
14
14
  - It includes both core software engineering skills and deeper agent/LLM-oriented skills.
15
- - It helps new users get started with bundles and workflows rather than forcing a cold start from 1,331+ files.
15
+ - It helps new users get started with bundles and workflows rather than forcing a cold start from 1,332+ files.
16
16
  - It is useful whether you want a broad internal skill library or a single repo to test many workflows quickly.
17
17
 
18
18
  ## Install Gemini CLI Skills
@@ -18,7 +18,7 @@ Kiro is AWS's agentic AI IDE that combines:
18
18
 
19
19
  Kiro's agentic capabilities are enhanced by skills that provide:
20
20
 
21
- - **Domain expertise** across 1,331+ specialized areas
21
+ - **Domain expertise** across 1,332+ specialized areas
22
22
  - **Best practices** from Anthropic, OpenAI, Google, Microsoft, and AWS
23
23
  - **Workflow automation** for common development tasks
24
24
  - **AWS-specific patterns** for serverless, infrastructure, and cloud architecture
@@ -14,7 +14,7 @@ If you came in through a **Claude Code** or **Codex** plugin instead of a full l
14
14
 
15
15
  When you ran `npx antigravity-awesome-skills` or cloned the repository, you:
16
16
 
17
- ✅ **Downloaded 1,331+ skill files** to your computer (default: `~/.gemini/antigravity/skills/`; or a custom path like `~/.agent/skills/` if you used `--path`)
17
+ ✅ **Downloaded 1,332+ skill files** to your computer (default: `~/.gemini/antigravity/skills/`; or a custom path like `~/.agent/skills/` if you used `--path`)
18
18
  ✅ **Made them available** to your AI assistant
19
19
  ❌ **Did NOT enable them all automatically** (they're just sitting there, waiting)
20
20
 
@@ -34,7 +34,7 @@ Bundles are **curated groups** of skills organized by role. They help you decide
34
34
 
35
35
  **Analogy:**
36
36
 
37
- - You installed a toolbox with 1,331+ tools (✅ done)
37
+ - You installed a toolbox with 1,332+ tools (✅ done)
38
38
  - Bundles are like **labeled organizer trays** saying: "If you're a carpenter, start with these 10 tools"
39
39
  - You can either **pick skills from the tray** or install that tray as a focused marketplace bundle plugin
40
40
 
@@ -212,7 +212,7 @@ Let's actually use a skill right now. Follow these steps:
212
212
 
213
213
  ## Step 5: Picking Your First Skills (Practical Advice)
214
214
 
215
- Don't try to use all 1,331+ skills at once. Here's a sensible approach:
215
+ Don't try to use all 1,332+ skills at once. Here's a sensible approach:
216
216
 
217
217
  If you want a tool-specific starting point before choosing skills, use:
218
218
 
@@ -343,7 +343,7 @@ Usually no, but if your AI doesn't recognize a skill:
343
343
 
344
344
  ### "Can I load all skills into the model at once?"
345
345
 
346
- No. Even though you have 1,331+ skills installed locally, you should **not** concatenate every `SKILL.md` into a single system prompt or context block.
346
+ No. Even though you have 1,332+ skills installed locally, you should **not** concatenate every `SKILL.md` into a single system prompt or context block.
347
347
 
348
348
  The intended pattern is:
349
349
 
@@ -34,7 +34,7 @@ antigravity-awesome-skills/
34
34
  ├── 📄 CONTRIBUTING.md ← Contributor workflow
35
35
  ├── 📄 CATALOG.md ← Full generated catalog
36
36
 
37
- ├── 📁 skills/ ← 1,331+ skills live here
37
+ ├── 📁 skills/ ← 1,332+ skills live here
38
38
  │ │
39
39
  │ ├── 📁 brainstorming/
40
40
  │ │ └── 📄 SKILL.md ← Skill definition
@@ -47,7 +47,7 @@ antigravity-awesome-skills/
47
47
  │ │ └── 📁 2d-games/
48
48
  │ │ └── 📄 SKILL.md ← Nested skills also supported
49
49
  │ │
50
- │ └── ... (1,331+ total)
50
+ │ └── ... (1,332+ total)
51
51
 
52
52
  ├── 📁 apps/
53
53
  │ └── 📁 web-app/ ← Interactive browser
@@ -100,7 +100,7 @@ antigravity-awesome-skills/
100
100
 
101
101
  ```
102
102
  ┌─────────────────────────┐
103
- │ 1,331+ SKILLS │
103
+ │ 1,332+ SKILLS │
104
104
  └────────────┬────────────┘
105
105
 
106
106
  ┌────────────────────────┼────────────────────────┐
@@ -201,7 +201,7 @@ If you want a workspace-style manual install instead, cloning into `.agent/skill
201
201
  │ ├── 📁 brainstorming/ │
202
202
  │ ├── 📁 stripe-integration/ │
203
203
  │ ├── 📁 react-best-practices/ │
204
- │ └── ... (1,331+ total) │
204
+ │ └── ... (1,332+ total) │
205
205
  └─────────────────────────────────────────┘
206
206
  ```
207
207
 
@@ -0,0 +1,273 @@
1
+ ---
2
+ name: jq
3
+ description: "Expert jq usage for JSON querying, filtering, transformation, and pipeline integration. Practical patterns for real shell workflows."
4
+ category: development
5
+ risk: safe
6
+ source: community
7
+ date_added: "2026-03-28"
8
+ author: kostakost2
9
+ tags: [jq, json, shell, cli, data-transformation, bash]
10
+ tools: [claude, cursor, gemini]
11
+ ---
12
+
13
+ # jq — JSON Querying and Transformation
14
+
15
+ ## Overview
16
+
17
+ `jq` is the standard CLI tool for querying and reshaping JSON. This skill covers practical, expert-level usage: filtering deeply nested data, transforming structures, aggregating values, and composing `jq` into shell pipelines. Every example is copy-paste ready for real workflows.
18
+
19
+ ## When to Use This Skill
20
+
21
+ - Use when parsing JSON output from APIs, CLI tools (AWS, GitHub, kubectl, docker), or log files
22
+ - Use when transforming JSON structure (rename keys, flatten arrays, group records)
23
+ - Use when the user needs `jq` inside a bash script or one-liner
24
+ - Use when explaining what a complex `jq` expression does
25
+
26
+ ## How It Works
27
+
28
+ `jq` takes a filter expression and applies it to JSON input. Filters compose with pipes (`|`), and `jq` handles arrays, objects, strings, numbers, booleans, and `null` natively.
29
+
30
+ ### Basic Selection
31
+
32
+ ```bash
33
+ # Extract a field
34
+ echo '{"name":"alice","age":30}' | jq '.name'
35
+ # "alice"
36
+
37
+ # Nested access
38
+ echo '{"user":{"email":"a@b.com"}}' | jq '.user.email'
39
+
40
+ # Array index
41
+ echo '[10, 20, 30]' | jq '.[1]'
42
+ # 20
43
+
44
+ # Array slice
45
+ echo '[1,2,3,4,5]' | jq '.[2:4]'
46
+ # [3, 4]
47
+
48
+ # All array elements
49
+ echo '[{"id":1},{"id":2}]' | jq '.[]'
50
+ ```
51
+
52
+ ### Filtering with `select`
53
+
54
+ ```bash
55
+ # Keep only matching elements
56
+ echo '[{"role":"admin"},{"role":"user"},{"role":"admin"}]' \
57
+ | jq '[.[] | select(.role == "admin")]'
58
+
59
+ # Numeric comparison
60
+ curl -s https://api.github.com/repos/owner/repo/issues \
61
+ | jq '[.[] | select(.comments > 5)]'
62
+
63
+ # Test a field exists and is non-null
64
+ jq '[.[] | select(.email != null)]'
65
+
66
+ # Combine conditions
67
+ jq '[.[] | select(.active == true and .score >= 80)]'
68
+ ```
69
+
70
+ ### Mapping and Transformation
71
+
72
+ ```bash
73
+ # Extract a field from every array element
74
+ echo '[{"name":"alice","age":30},{"name":"bob","age":25}]' \
75
+ | jq '[.[] | .name]'
76
+ # ["alice", "bob"]
77
+
78
+ # Shorthand: map()
79
+ jq 'map(.name)'
80
+
81
+ # Build a new object per element
82
+ jq '[.[] | {user: .name, years: .age}]'
83
+
84
+ # Add a computed field
85
+ jq '[.[] | . + {senior: (.age > 28)}]'
86
+
87
+ # Rename keys
88
+ jq '[.[] | {username: .name, email_address: .email}]'
89
+ ```
90
+
91
+ ### Aggregation and Reduce
92
+
93
+ ```bash
94
+ # Sum all values
95
+ echo '[1, 2, 3, 4, 5]' | jq 'add'
96
+ # 15
97
+
98
+ # Sum a field across objects
99
+ jq '[.[].price] | add'
100
+
101
+ # Count elements
102
+ jq 'length'
103
+
104
+ # Max / min
105
+ jq 'max_by(.score)'
106
+ jq 'min_by(.created_at)'
107
+
108
+ # reduce: custom accumulator
109
+ echo '[1,2,3,4,5]' | jq 'reduce .[] as $x (0; . + $x)'
110
+ # 15
111
+
112
+ # Group by field
113
+ jq 'group_by(.department)'
114
+
115
+ # Count per group
116
+ jq 'group_by(.status) | map({status: .[0].status, count: length})'
117
+ ```
118
+
119
+ ### String Interpolation and Formatting
120
+
121
+ ```bash
122
+ # String interpolation
123
+ jq -r '.[] | "\(.name) is \(.age) years old"'
124
+
125
+ # Format as CSV (no header)
126
+ jq -r '.[] | [.name, .age, .email] | @csv'
127
+
128
+ # Format as TSV
129
+ jq -r '.[] | [.name, .score] | @tsv'
130
+
131
+ # URL-encode a value
132
+ jq -r '.query | @uri'
133
+
134
+ # Base64 encode
135
+ jq -r '.data | @base64'
136
+ ```
137
+
138
+ ### Working with Keys and Paths
139
+
140
+ ```bash
141
+ # List all top-level keys
142
+ jq 'keys'
143
+
144
+ # Check if key exists
145
+ jq 'has("email")'
146
+
147
+ # Delete a key
148
+ jq 'del(.password)'
149
+
150
+ # Delete nested keys from every element
151
+ jq '[.[] | del(.internal_id, .raw_payload)]'
152
+
153
+ # Recursive descent: find all values for a key anywhere in tree
154
+ jq '.. | .id? // empty'
155
+
156
+ # Get all leaf paths
157
+ jq '[paths(scalars)]'
158
+ ```
159
+
160
+ ### Conditionals and Error Handling
161
+
162
+ ```bash
163
+ # if-then-else
164
+ jq 'if .score >= 90 then "A" elif .score >= 80 then "B" else "C" end'
165
+
166
+ # Alternative operator: use fallback if null or false
167
+ jq '.nickname // .name'
168
+
169
+ # try-catch: skip errors instead of halting
170
+ jq '[.[] | try .nested.value catch null]'
171
+
172
+ # Suppress null output with // empty
173
+ jq '.[] | .optional_field // empty'
174
+ ```
175
+
176
+ ### Practical Shell Integration
177
+
178
+ ```bash
179
+ # Read from file
180
+ jq '.users' data.json
181
+
182
+ # Compact output (no whitespace) for further piping
183
+ jq -c '.[]' records.json | while IFS= read -r record; do
184
+ echo "Processing: $record"
185
+ done
186
+
187
+ # Pass a shell variable into jq
188
+ STATUS="active"
189
+ jq --arg s "$STATUS" '[.[] | select(.status == $s)]'
190
+
191
+ # Pass a number
192
+ jq --argjson threshold 42 '[.[] | select(.value > $threshold)]'
193
+
194
+ # Slurp multiple JSON lines into an array
195
+ jq -s '.' records.ndjson
196
+
197
+ # Multiple files: slurp all into one array
198
+ jq -s 'add' file1.json file2.json
199
+
200
+ # Null-safe pipeline from a command
201
+ kubectl get pods -o json | jq '.items[] | {name: .metadata.name, status: .status.phase}'
202
+
203
+ # GitHub CLI: extract PR numbers
204
+ gh pr list --json number,title | jq -r '.[] | "\(.number)\t\(.title)"'
205
+
206
+ # AWS CLI: list running instance IDs
207
+ aws ec2 describe-instances \
208
+ | jq -r '.Reservations[].Instances[] | select(.State.Name=="running") | .InstanceId'
209
+
210
+ # Docker: show container names and images
211
+ docker inspect $(docker ps -q) | jq -r '.[] | "\(.Name)\t\(.Config.Image)"'
212
+ ```
213
+
214
+ ### Advanced Patterns
215
+
216
+ ```bash
217
+ # Transpose an object of arrays to an array of objects
218
+ # Input: {"names":["a","b"],"scores":[10,20]}
219
+ jq '[.names, .scores] | transpose | map({name: .[0], score: .[1]})'
220
+
221
+ # Flatten one level
222
+ jq 'flatten(1)'
223
+
224
+ # Unique by field
225
+ jq 'unique_by(.email)'
226
+
227
+ # Sort, deduplicate and re-index
228
+ jq '[.[] | .name] | unique | sort'
229
+
230
+ # Walk: apply transformation to every node recursively
231
+ jq 'walk(if type == "string" then ascii_downcase else . end)'
232
+
233
+ # env: read environment variables inside jq
234
+ export API_KEY=secret
235
+ jq -n 'env.API_KEY'
236
+ ```
237
+
238
+ ## Best Practices
239
+
240
+ - Always use `-r` (raw output) when passing `jq` results to shell variables or other commands to strip JSON string quotes
241
+ - Use `--arg` / `--argjson` to inject shell variables safely — never interpolate shell variables directly into filter strings
242
+ - Prefer `map(f)` over `[.[] | f]` for readability
243
+ - Use `-c` (compact) for newline-delimited JSON pipelines; omit it for human-readable debugging
244
+ - Test filters interactively with `jq -n` and literal input before embedding in scripts
245
+ - Use `empty` to drop unwanted elements rather than filtering to `null`
246
+
247
+ ## Security & Safety Notes
248
+
249
+ - `jq` is read-only by design — it cannot write files or execute commands
250
+ - Avoid embedding untrusted JSON field values directly into shell commands; always quote or use `--arg`
251
+
252
+ ## Common Pitfalls
253
+
254
+ - **Problem:** `jq` outputs `null` instead of the expected value
255
+ **Solution:** Check for typos in key names; use `keys` to inspect actual field names. Remember JSON is case-sensitive.
256
+
257
+ - **Problem:** Numbers are quoted as strings in the output
258
+ **Solution:** Use `--argjson` instead of `--arg` when injecting numeric values.
259
+
260
+ - **Problem:** Filter works in the terminal but fails in a script
261
+ **Solution:** Ensure the filter string uses single quotes in the shell to prevent variable expansion. Example: `jq '.field'` not `jq ".field"`.
262
+
263
+ - **Problem:** `add` returns `null` on an empty array
264
+ **Solution:** Use `add // 0` or `add // ""` to provide a fallback default.
265
+
266
+ - **Problem:** Streaming large files is slow
267
+ **Solution:** Use `jq --stream` or switch to `jstream`/`gron` for very large files.
268
+
269
+ ## Related Skills
270
+
271
+ - `@bash-pro` — Wrapping jq calls in robust shell scripts
272
+ - `@bash-linux` — General shell pipeline patterns
273
+ - `@github-automation` — Using jq with GitHub CLI JSON output
@@ -41,28 +41,49 @@ Electronic Data Interchange (EDI) is the standard for automated B2B document exc
41
41
 
42
42
  ```python
43
43
  from pyx12 import x12file # pip install pyx12
44
+ from datetime import datetime
44
45
 
45
46
  import xmlrpc.client
47
+ import os
48
+
49
+ odoo_url = os.getenv("ODOO_URL")
50
+ db = os.getenv("ODOO_DB")
51
+ pwd = os.getenv("ODOO_API_KEY")
52
+ uid = int(os.getenv("ODOO_UID", "2"))
46
53
 
47
- odoo_url = "https://myodoo.example.com"
48
- db, uid, pwd = "my_db", 2, "api_key"
49
54
  models = xmlrpc.client.ServerProxy(f"{odoo_url}/xmlrpc/2/object")
50
55
 
51
56
  def process_850(edi_file_path):
52
57
  """Parse X12 850 Purchase Order and create Odoo Sale Order"""
53
58
  with x12file.X12File(edi_file_path) as f:
54
59
  for transaction in f.get_transaction_sets():
55
- # Extract header info (BEG segment)
56
- po_number = transaction['BEG'][3] # Purchase Order Number
57
- po_date = transaction['BEG'][5] # Purchase Order Date
60
+ # Extract header info (BEG segment)
61
+ po_number = transaction['BEG'][3] # Purchase Order Number
62
+ po_date = transaction['BEG'][5] # Purchase Order Date
63
+
64
+ # IDEMPOTENCY CHECK: Verify PO doesn't already exist in Odoo
65
+ existing = models.execute_kw(db, uid, pwd, 'sale.order', 'search', [
66
+ [['client_order_ref', '=', po_number]]
67
+ ])
68
+ if existing:
69
+ print(f"Skipping: PO {po_number} already exists.")
70
+ continue
58
71
 
59
72
  # Extract partner (N1 segment — Buyer)
60
- partner_name = transaction['N1'][2]
61
73
 
62
- # Find partner in Odoo
63
- partner = models.execute_kw(db, uid, pwd, 'res.partner', 'search',
64
- [[['name', 'ilike', partner_name]]])
65
- partner_id = partner[0] if partner else False
74
+
75
+ # Extract partner (N1 segment Buyer)
76
+ partner_name = transaction.get_segment('N1')[2] if transaction.get_segment('N1') else "Unknown"
77
+
78
+ # Find partner in Odoo
79
+ partner = models.execute_kw(db, uid, pwd, 'res.partner', 'search',
80
+ [[['name', 'ilike', partner_name]]])
81
+
82
+ if not partner:
83
+ print(f"Error: Partner '{partner_name}' not found. Skipping transaction.")
84
+ continue
85
+
86
+ partner_id = partner[0]
66
87
 
67
88
  # Extract line items (PO1 segments)
68
89
  order_lines = []
@@ -94,6 +115,7 @@ def process_850(edi_file_path):
94
115
  ```python
95
116
  def generate_997(isa_control, gs_control, transaction_control):
96
117
  """Generate a functional acknowledgment for received EDI"""
118
+ today = datetime.now().strftime('%y%m%d')
97
119
  return f"""ISA*00* *00* *ZZ*YOURISAID *ZZ*PARTNERISAID *{today}*1200*^*00501*{isa_control}*0*P*>~
98
120
  GS*FA*YOURGID*PARTNERGID*{today}*1200*{gs_control}*X*005010X231A1~
99
121
  ST*997*0001~
@@ -43,20 +43,24 @@ This skill guides you through building a reliable sync bridge between Odoo (the
43
43
  ```python
44
44
  from woocommerce import API
45
45
  import xmlrpc.client
46
+ import os
46
47
 
47
48
  # WooCommerce client
48
49
  wcapi = API(
49
- url="https://mystore.com",
50
- consumer_key="ck_xxxxxxxxxxxxx",
51
- consumer_secret="cs_xxxxxxxxxxxxx",
50
+ url=os.getenv("WC_URL", "https://mystore.com"),
51
+ consumer_key=os.getenv("WC_KEY"),
52
+ consumer_secret=os.getenv("WC_SECRET"),
52
53
  version="wc/v3"
53
54
  )
54
55
 
55
56
  # Odoo client
56
- odoo_url = "https://myodoo.example.com"
57
- db, uid, pwd = "my_db", 2, "api_key"
57
+ odoo_url = os.getenv("ODOO_URL", "https://myodoo.example.com")
58
+ db = os.getenv("ODOO_DB", "my_db")
59
+ uid = int(os.getenv("ODOO_UID", "2"))
60
+ pwd = os.getenv("ODOO_PASSWORD")
58
61
  models = xmlrpc.client.ServerProxy(f"{odoo_url}/xmlrpc/2/object")
59
62
 
63
+
60
64
  def sync_orders():
61
65
  # Get unprocessed WooCommerce orders
62
66
  orders = wcapi.get("orders", params={"status": "processing", "per_page": 50}).json()
@@ -0,0 +1,370 @@
1
+ ---
2
+ name: tmux
3
+ description: "Expert tmux session, window, and pane management for terminal multiplexing, persistent remote workflows, and shell scripting automation."
4
+ category: development
5
+ risk: safe
6
+ source: community
7
+ date_added: "2026-03-28"
8
+ author: kostakost2
9
+ tags: [tmux, terminal, multiplexer, sessions, shell, remote, automation]
10
+ tools: [claude, cursor, gemini]
11
+ ---
12
+
13
+ # tmux — Terminal Multiplexer
14
+
15
+ ## Overview
16
+
17
+ `tmux` keeps terminal sessions alive across SSH disconnects, splits work across multiple panes, and enables fully scriptable terminal automation. This skill covers session management, window/pane layout, keybinding patterns, and using `tmux` non-interactively from shell scripts — essential for remote servers, long-running jobs, and automated workflows.
18
+
19
+ ## When to Use This Skill
20
+
21
+ - Use when setting up or managing persistent terminal sessions on remote servers
22
+ - Use when the user needs to run long-running processes that survive SSH disconnects
23
+ - Use when scripting multi-pane terminal layouts (e.g., logs + shell + editor)
24
+ - Use when automating `tmux` commands from bash scripts without user interaction
25
+
26
+ ## How It Works
27
+
28
+ `tmux` has three hierarchy levels: **sessions** (top level, survives disconnects), **windows** (tabs within a session), and **panes** (splits within a window). Everything is controllable from outside via `tmux <command>` or from inside via the prefix key (`Ctrl-b` by default).
29
+
30
+ ### Session Management
31
+
32
+ ```bash
33
+ # Create a new named session
34
+ tmux new-session -s work
35
+
36
+ # Create detached (background) session
37
+ tmux new-session -d -s work
38
+
39
+ # Create detached session and start a command
40
+ tmux new-session -d -s build -x 220 -y 50 "make all"
41
+
42
+ # Attach to a session
43
+ tmux attach -t work
44
+ tmux attach # attaches to most recent session
45
+
46
+ # List all sessions
47
+ tmux list-sessions
48
+ tmux ls
49
+
50
+ # Detach from inside tmux
51
+ # Prefix + d (Ctrl-b d)
52
+
53
+ # Kill a session
54
+ tmux kill-session -t work
55
+
56
+ # Kill all sessions except the current one
57
+ tmux kill-session -a
58
+
59
+ # Rename a session from outside
60
+ tmux rename-session -t old-name new-name
61
+
62
+ # Switch to another session from outside
63
+ tmux switch-client -t other-session
64
+
65
+ # Check if a session exists (useful in scripts)
66
+ tmux has-session -t work 2>/dev/null && echo "exists"
67
+ ```
68
+
69
+ ### Window Management
70
+
71
+ ```bash
72
+ # Create a new window in the current session
73
+ tmux new-window -t work -n "logs"
74
+
75
+ # Create a window running a specific command
76
+ tmux new-window -t work:3 -n "server" "python -m http.server 8080"
77
+
78
+ # List windows
79
+ tmux list-windows -t work
80
+
81
+ # Select (switch to) a window
82
+ tmux select-window -t work:logs
83
+ tmux select-window -t work:2 # by index
84
+
85
+ # Rename a window
86
+ tmux rename-window -t work:2 "editor"
87
+
88
+ # Kill a window
89
+ tmux kill-window -t work:logs
90
+
91
+ # Move window to a new index
92
+ tmux move-window -s work:3 -t work:1
93
+
94
+ # From inside tmux:
95
+ # Prefix + c — new window
96
+ # Prefix + , — rename window
97
+ # Prefix + & — kill window
98
+ # Prefix + n/p — next/previous window
99
+ # Prefix + 0-9 — switch to window by number
100
+ ```
101
+
102
+ ### Pane Management
103
+
104
+ ```bash
105
+ # Split pane vertically (left/right)
106
+ tmux split-window -h -t work:1
107
+
108
+ # Split pane horizontally (top/bottom)
109
+ tmux split-window -v -t work:1
110
+
111
+ # Split and run a command
112
+ tmux split-window -h -t work:1 "tail -f /var/log/syslog"
113
+
114
+ # Select a pane by index
115
+ tmux select-pane -t work:1.0
116
+
117
+ # Resize panes
118
+ tmux resize-pane -t work:1.0 -R 20 # expand right by 20 cols
119
+ tmux resize-pane -t work:1.0 -D 10 # shrink down by 10 rows
120
+ tmux resize-pane -Z # toggle zoom (fullscreen)
121
+
122
+ # Swap panes
123
+ tmux swap-pane -s work:1.0 -t work:1.1
124
+
125
+ # Kill a pane
126
+ tmux kill-pane -t work:1.1
127
+
128
+ # From inside tmux:
129
+ # Prefix + % — split vertical
130
+ # Prefix + " — split horizontal
131
+ # Prefix + arrow — navigate panes
132
+ # Prefix + z — zoom/unzoom current pane
133
+ # Prefix + x — kill pane
134
+ # Prefix + {/} — swap pane with previous/next
135
+ ```
136
+
137
+ ### Sending Commands to Panes Without Being Attached
138
+
139
+ ```bash
140
+ # Send a command to a specific pane and press Enter
141
+ tmux send-keys -t work:1.0 "ls -la" Enter
142
+
143
+ # Run a command in a background pane without attaching
144
+ tmux send-keys -t work:editor "vim src/main.py" Enter
145
+
146
+ # Send Ctrl+C to stop a running process
147
+ tmux send-keys -t work:1.0 C-c
148
+
149
+ # Send text without pressing Enter (useful for pre-filling prompts)
150
+ tmux send-keys -t work:1.0 "git commit -m '"
151
+
152
+ # Clear a pane
153
+ tmux send-keys -t work:1.0 "clear" Enter
154
+
155
+ # Check what's in a pane (capture its output)
156
+ tmux capture-pane -t work:1.0 -p
157
+ tmux capture-pane -t work:1.0 -p | grep "ERROR"
158
+ ```
159
+
160
+ ### Scripting a Full Workspace Layout
161
+
162
+ This is the most powerful pattern: create a fully configured multi-pane workspace from a single script.
163
+
164
+ ```bash
165
+ #!/usr/bin/env bash
166
+ set -euo pipefail
167
+
168
+ SESSION="dev"
169
+
170
+ # Bail if session already exists
171
+ tmux has-session -t "$SESSION" 2>/dev/null && {
172
+ echo "Session $SESSION already exists. Attaching..."
173
+ tmux attach -t "$SESSION"
174
+ exit 0
175
+ }
176
+
177
+ # Create session with first window
178
+ tmux new-session -d -s "$SESSION" -n "editor" -x 220 -y 50
179
+
180
+ # Window 1: editor + test runner side by side
181
+ tmux send-keys -t "$SESSION:editor" "vim ." Enter
182
+ tmux split-window -h -t "$SESSION:editor"
183
+ tmux send-keys -t "$SESSION:editor.1" "npm test -- --watch" Enter
184
+ tmux select-pane -t "$SESSION:editor.0"
185
+
186
+ # Window 2: server logs
187
+ tmux new-window -t "$SESSION" -n "server"
188
+ tmux send-keys -t "$SESSION:server" "docker compose up" Enter
189
+ tmux split-window -v -t "$SESSION:server"
190
+ tmux send-keys -t "$SESSION:server.1" "tail -f logs/app.log" Enter
191
+
192
+ # Window 3: general shell
193
+ tmux new-window -t "$SESSION" -n "shell"
194
+
195
+ # Focus first window
196
+ tmux select-window -t "$SESSION:editor"
197
+
198
+ # Attach
199
+ tmux attach -t "$SESSION"
200
+ ```
201
+
202
+ ### Configuration (`~/.tmux.conf`)
203
+
204
+ ```bash
205
+ # Change prefix to Ctrl-a (screen-style)
206
+ unbind C-b
207
+ set -g prefix C-a
208
+ bind C-a send-prefix
209
+
210
+ # Enable mouse support
211
+ set -g mouse on
212
+
213
+ # Start window/pane numbering at 1
214
+ set -g base-index 1
215
+ setw -g pane-base-index 1
216
+
217
+ # Renumber windows when one is closed
218
+ set -g renumber-windows on
219
+
220
+ # Increase scrollback buffer
221
+ set -g history-limit 50000
222
+
223
+ # Use vi keys in copy mode
224
+ setw -g mode-keys vi
225
+
226
+ # Faster key repetition
227
+ set -s escape-time 0
228
+
229
+ # Reload config without restarting
230
+ bind r source-file ~/.tmux.conf \; display "Config reloaded"
231
+
232
+ # Intuitive splits: | and -
233
+ bind | split-window -h -c "#{pane_current_path}"
234
+ bind - split-window -v -c "#{pane_current_path}"
235
+
236
+ # New windows open in current directory
237
+ bind c new-window -c "#{pane_current_path}"
238
+
239
+ # Status bar
240
+ set -g status-right "#{session_name} | %H:%M %d-%b"
241
+ set -g status-interval 5
242
+ ```
243
+
244
+ ### Copy Mode and Scrollback
245
+
246
+ ```bash
247
+ # Enter copy mode (scroll up through output)
248
+ # Prefix + [
249
+
250
+ # In vi mode:
251
+ # / to search forward, ? to search backward
252
+ # Space to start selection, Enter to copy
253
+ # q to exit copy mode
254
+
255
+ # Paste the most recent buffer
256
+ # Prefix + ]
257
+
258
+ # List paste buffers
259
+ tmux list-buffers
260
+
261
+ # Show the most recent buffer
262
+ tmux show-buffer
263
+
264
+ # Save buffer to a file
265
+ tmux save-buffer /tmp/tmux-output.txt
266
+
267
+ # Load a file into a buffer
268
+ tmux load-buffer /tmp/data.txt
269
+
270
+ # Pipe pane output to a command
271
+ tmux pipe-pane -t work:1.0 "cat >> ~/session.log"
272
+ ```
273
+
274
+ ### Practical Automation Patterns
275
+
276
+ ```bash
277
+ # Idempotent session: create or attach
278
+ ensure_session() {
279
+ local name="$1"
280
+ tmux has-session -t "$name" 2>/dev/null \
281
+ || tmux new-session -d -s "$name"
282
+ tmux attach -t "$name"
283
+ }
284
+
285
+ # Run a command in a new background window and tail its output
286
+ run_bg() {
287
+ local session="${1:-main}" cmd="${*:2}"
288
+ tmux new-window -t "$session" -n "bg-$$"
289
+ tmux send-keys -t "$session:bg-$$" "$cmd" Enter
290
+ }
291
+
292
+ # Wait for a pane to produce specific output (polling)
293
+ wait_for_output() {
294
+ local target="$1" pattern="$2" timeout="${3:-30}"
295
+ local elapsed=0
296
+ while (( elapsed < timeout )); do
297
+ tmux capture-pane -t "$target" -p | grep -q "$pattern" && return 0
298
+ sleep 1
299
+ (( elapsed++ ))
300
+ done
301
+ return 1
302
+ }
303
+
304
+ # Kill all background windows matching a name prefix
305
+ kill_bg_windows() {
306
+ local session="$1" prefix="${2:-bg-}"
307
+ tmux list-windows -t "$session" -F "#W" \
308
+ | grep "^${prefix}" \
309
+ | while read -r win; do
310
+ tmux kill-window -t "${session}:${win}"
311
+ done
312
+ }
313
+ ```
314
+
315
+ ### Remote and SSH Workflows
316
+
317
+ ```bash
318
+ # SSH and immediately attach to an existing session
319
+ ssh user@host -t "tmux attach -t work || tmux new-session -s work"
320
+
321
+ # Run a command on remote host inside a tmux session (fire and forget)
322
+ ssh user@host "tmux new-session -d -s deploy 'bash /opt/deploy.sh'"
323
+
324
+ # Watch the remote session output from another terminal
325
+ ssh user@host -t "tmux attach -t deploy -r" # read-only attach
326
+
327
+ # Pair programming: share a session (both users attach to the same session)
328
+ # User 1:
329
+ tmux new-session -s shared
330
+ # User 2 (same server):
331
+ tmux attach -t shared
332
+ ```
333
+
334
+ ## Best Practices
335
+
336
+ - Always name sessions (`-s name`) in scripts — unnamed sessions are hard to target reliably
337
+ - Use `tmux has-session -t name 2>/dev/null` before creating to make scripts idempotent
338
+ - Set `-x` and `-y` when creating detached sessions to give panes a proper size for commands that check terminal dimensions
339
+ - Use `send-keys ... Enter` for automation rather than piping stdin — it works even when the target pane is running an interactive program
340
+ - Keep `~/.tmux.conf` in version control for reproducibility across machines
341
+ - Prefer `bind -n` for bindings that don't need the prefix, but only for keys that don't conflict with application shortcuts
342
+
343
+ ## Security & Safety Notes
344
+
345
+ - `send-keys` executes commands in a pane without confirmation — verify the target (`-t session:window.pane`) before use in scripts to avoid sending keystrokes to the wrong pane
346
+ - Read-only attach (`-r`) is appropriate when sharing sessions with others to prevent accidental input
347
+ - Avoid storing secrets in tmux window/pane titles or environment variables exported into sessions on shared machines
348
+
349
+ ## Common Pitfalls
350
+
351
+ - **Problem:** `tmux` commands from a script fail with "no server running"
352
+ **Solution:** Start the server first with `tmux start-server`, or create a detached session before running other commands.
353
+
354
+ - **Problem:** Pane size is 0x0 when creating a detached session
355
+ **Solution:** Pass explicit dimensions: `tmux new-session -d -s name -x 200 -y 50`.
356
+
357
+ - **Problem:** `send-keys` types the text but doesn't run the command
358
+ **Solution:** Ensure you pass `Enter` (capital E) as a second argument: `tmux send-keys -t target "cmd" Enter`.
359
+
360
+ - **Problem:** Script creates a duplicate session each run
361
+ **Solution:** Guard with `tmux has-session -t name 2>/dev/null || tmux new-session -d -s name`.
362
+
363
+ - **Problem:** Copy-mode selection doesn't work as expected
364
+ **Solution:** Confirm `mode-keys vi` or `mode-keys emacs` is set to match your preference in `~/.tmux.conf`.
365
+
366
+ ## Related Skills
367
+
368
+ - `@bash-pro` — Writing the shell scripts that orchestrate tmux sessions
369
+ - `@bash-linux` — General Linux terminal patterns used inside tmux panes
370
+ - `@ssh` — Combining tmux with SSH for persistent remote workflows
@@ -0,0 +1,64 @@
1
+ ---
2
+ name: viboscope
3
+ description: "Psychological compatibility matching — find cofounders, collaborators, and friends through validated psychometrics"
4
+ category: collaboration
5
+ risk: safe
6
+ source: community
7
+ date_added: "2026-03-29"
8
+ author: ivanschmidt
9
+ tags: [matching, psychology, compatibility, networking, collaboration]
10
+ tools: [claude, cursor, codex, gemini, windsurf]
11
+ ---
12
+
13
+ # Viboscope
14
+
15
+ ## Overview
16
+
17
+ Viboscope helps find compatible people — cofounders, project partners, friends, romantic partners — through deep psychological compatibility matching. It builds a profile across 10 validated dimensions and calculates mathematical compatibility with other users.
18
+
19
+ ## When to Use This Skill
20
+
21
+ - Use when looking for a cofounder or project collaborator
22
+ - Use when wanting to find people with compatible work style and values
23
+ - Use when checking compatibility with a specific person via invite link
24
+
25
+ ## How It Works
26
+
27
+ ### Step 1: Install
28
+
29
+ ```bash
30
+ curl -fsS https://viboscope.com/api/v1/skill -o viboscope.md
31
+ ```
32
+
33
+ Save to your platform's skills directory.
34
+
35
+ ### Step 2: Build Profile
36
+
37
+ The skill guides a 5-minute onboarding that builds a psychological profile using:
38
+ - AI assistant portrait (fastest — 2 min for 90%+ profile)
39
+ - 5 validated questionnaires (Big Five, Values, Attachment, Conflict, Work Style)
40
+ - Context scan from workspace files
41
+
42
+ ### Step 3: Search
43
+
44
+ Search across 7 contexts: business, romantic, friendship, professional, intellectual, hobby, general. Results include percentage scores and human-readable explanations of why you match.
45
+
46
+ ## Examples
47
+
48
+ ### Example 1: Find a Cofounder
49
+
50
+ Tell your AI agent: "Install Viboscope and find me a cofounder"
51
+
52
+ The agent will guide you through profiling, then search for business-compatible matches with aligned values and complementary work styles.
53
+
54
+ ### Example 2: Check Compatibility
55
+
56
+ Share your invite link: `viboscope.com/match/@your_nick`
57
+
58
+ When someone opens it with their AI agent, both see a compatibility breakdown.
59
+
60
+ ## Links
61
+
62
+ - Website: https://viboscope.com
63
+ - GitHub: https://github.com/ivankoriako/viboscope
64
+ - API: https://viboscope.com/api/v1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "opencode-skills-antigravity",
3
- "version": "1.0.38",
3
+ "version": "1.0.40",
4
4
  "description": "OpenCode CLI plugin that automatically downloads and keeps Antigravity Awesome Skills up to date.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",