opencode-skills-antigravity 1.0.39 → 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.
- package/bundled-skills/.antigravity-install-manifest.json +4 -1
- package/bundled-skills/docs/integrations/jetski-cortex.md +3 -3
- package/bundled-skills/docs/integrations/jetski-gemini-loader/README.md +1 -1
- package/bundled-skills/docs/maintainers/repo-growth-seo.md +3 -3
- package/bundled-skills/docs/maintainers/security-findings-triage-2026-03-29-refresh.csv +34 -0
- package/bundled-skills/docs/maintainers/security-findings-triage-2026-03-29-refresh.md +2 -0
- package/bundled-skills/docs/maintainers/skills-update-guide.md +1 -1
- 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/gemini-cli-skills.md +1 -1
- package/bundled-skills/docs/users/kiro-integration.md +1 -1
- package/bundled-skills/docs/users/usage.md +4 -4
- package/bundled-skills/docs/users/visual-guide.md +4 -4
- package/bundled-skills/jq/SKILL.md +273 -0
- package/bundled-skills/odoo-edi-connector/SKILL.md +32 -10
- package/bundled-skills/odoo-woocommerce-bridge/SKILL.md +9 -5
- package/bundled-skills/tmux/SKILL.md +370 -0
- package/bundled-skills/viboscope/SKILL.md +64 -0
- package/package.json +1 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 1,
|
|
3
|
-
"updatedAt": "2026-03-
|
|
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.
|
|
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.
|
|
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.
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
72
|
+
- All 1,332+ skills from the skills directory
|
|
73
73
|
|
|
74
74
|
## When to Update
|
|
75
75
|
|
|
@@ -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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
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="
|
|
51
|
-
consumer_secret="
|
|
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
|
|
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