mindforge-cc 11.5.1 → 11.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (214) hide show
  1. package/.agent/mindforge/skill-tdd.md +53 -0
  2. package/.agent/mindforge/skills-index.md +118 -0
  3. package/.agent/mindforge/systematic-debug.md +60 -0
  4. package/.agent/mindforge/wf-catalog.md +37 -0
  5. package/.agent/mindforge/wf-code-audit.md +31 -0
  6. package/.agent/mindforge/wf-competitive-analysis.md +31 -0
  7. package/.agent/mindforge/wf-deep-research.md +32 -0
  8. package/.agent/mindforge/wf-feature-planner.md +31 -0
  9. package/.agent/mindforge/wf-incident-response.md +31 -0
  10. package/.agent/mindforge/wf-onboard-codebase.md +31 -0
  11. package/.agent/mindforge/wf-perf-optimize.md +31 -0
  12. package/.agent/mindforge/wf-pr-review.md +31 -0
  13. package/.agent/mindforge/wf-refactor-plan.md +31 -0
  14. package/.agent/mindforge/wf-release-prep.md +31 -0
  15. package/.agent/mindforge/wf-tdd-sprint.md +31 -0
  16. package/.agent/mindforge/wf-tech-evaluation.md +31 -0
  17. package/.agent/skills/1password-skill/SKILL.md +156 -0
  18. package/.agent/skills/1password-skill/references/cli-examples.md +31 -0
  19. package/.agent/skills/1password-skill/references/get-started.md +21 -0
  20. package/.agent/skills/article-illustrator/SKILL.md +199 -0
  21. package/.agent/skills/article-illustrator/references/prompt-construction.md +426 -0
  22. package/.agent/skills/article-illustrator/references/style-presets.md +80 -0
  23. package/.agent/skills/article-illustrator/references/styles.md +224 -0
  24. package/.agent/skills/article-illustrator/references/usage.md +50 -0
  25. package/.agent/skills/article-illustrator/references/workflow.md +332 -0
  26. package/.agent/skills/arxiv/SKILL.md +275 -0
  27. package/.agent/skills/blogwatcher/SKILL.md +130 -0
  28. package/.agent/skills/code-wiki/SKILL.md +438 -0
  29. package/.agent/skills/code-wiki/templates/README.md +31 -0
  30. package/.agent/skills/code-wiki/templates/architecture.md +30 -0
  31. package/.agent/skills/code-wiki/templates/getting-started.md +47 -0
  32. package/.agent/skills/code-wiki/templates/module.md +38 -0
  33. package/.agent/skills/codebase-inspection/SKILL.md +109 -0
  34. package/.agent/skills/comic-creator/SKILL.md +240 -0
  35. package/.agent/skills/comic-creator/references/analysis-framework.md +176 -0
  36. package/.agent/skills/comic-creator/references/auto-selection.md +71 -0
  37. package/.agent/skills/comic-creator/references/base-prompt.md +98 -0
  38. package/.agent/skills/comic-creator/references/character-template.md +180 -0
  39. package/.agent/skills/comic-creator/references/ohmsha-guide.md +85 -0
  40. package/.agent/skills/comic-creator/references/partial-workflows.md +106 -0
  41. package/.agent/skills/comic-creator/references/storyboard-template.md +143 -0
  42. package/.agent/skills/comic-creator/references/workflow.md +401 -0
  43. package/.agent/skills/concept-diagrams/SKILL.md +355 -0
  44. package/.agent/skills/concept-diagrams/references/dashboard-patterns.md +43 -0
  45. package/.agent/skills/concept-diagrams/references/infrastructure-patterns.md +144 -0
  46. package/.agent/skills/concept-diagrams/references/physical-shape-cookbook.md +42 -0
  47. package/.agent/skills/creative-ideation/SKILL.md +144 -0
  48. package/.agent/skills/creative-ideation/references/full-prompt-library.md +110 -0
  49. package/.agent/skills/devops-cli/SKILL.md +149 -0
  50. package/.agent/skills/devops-cli/references/app-discovery.md +112 -0
  51. package/.agent/skills/devops-cli/references/authentication.md +59 -0
  52. package/.agent/skills/devops-cli/references/cli-reference.md +104 -0
  53. package/.agent/skills/devops-cli/references/running-apps.md +171 -0
  54. package/.agent/skills/devops-watchers/SKILL.md +103 -0
  55. package/.agent/skills/docker-management/SKILL.md +273 -0
  56. package/.agent/skills/domain-intel/SKILL.md +96 -0
  57. package/.agent/skills/duckduckgo-search/SKILL.md +230 -0
  58. package/.agent/skills/github-auth/SKILL.md +240 -0
  59. package/.agent/skills/github-code-review/SKILL.md +474 -0
  60. package/.agent/skills/github-code-review/references/review-output-template.md +74 -0
  61. package/.agent/skills/github-issues/SKILL.md +363 -0
  62. package/.agent/skills/github-issues/templates/bug-report.md +35 -0
  63. package/.agent/skills/github-issues/templates/feature-request.md +31 -0
  64. package/.agent/skills/github-pr-workflow/SKILL.md +360 -0
  65. package/.agent/skills/github-pr-workflow/references/ci-troubleshooting.md +183 -0
  66. package/.agent/skills/github-pr-workflow/references/conventional-commits.md +71 -0
  67. package/.agent/skills/github-pr-workflow/templates/pr-body-bugfix.md +35 -0
  68. package/.agent/skills/github-pr-workflow/templates/pr-body-feature.md +33 -0
  69. package/.agent/skills/github-repo-management/SKILL.md +509 -0
  70. package/.agent/skills/github-repo-management/references/github-api-cheatsheet.md +161 -0
  71. package/.agent/skills/godmode/SKILL.md +396 -0
  72. package/.agent/skills/godmode/references/jailbreak-templates.md +128 -0
  73. package/.agent/skills/godmode/references/refusal-detection.md +142 -0
  74. package/.agent/skills/hyperframes/SKILL.md +182 -0
  75. package/.agent/skills/hyperframes/references/cli.md +185 -0
  76. package/.agent/skills/hyperframes/references/composition.md +129 -0
  77. package/.agent/skills/hyperframes/references/features.md +289 -0
  78. package/.agent/skills/hyperframes/references/gsap.md +136 -0
  79. package/.agent/skills/hyperframes/references/troubleshooting.md +137 -0
  80. package/.agent/skills/hyperframes/references/website-to-video.md +145 -0
  81. package/.agent/skills/jupyter-live-kernel/SKILL.md +160 -0
  82. package/.agent/skills/kanban-orchestrator/SKILL.md +209 -0
  83. package/.agent/skills/kanban-worker/SKILL.md +188 -0
  84. package/.agent/skills/llm-wiki/SKILL.md +499 -0
  85. package/.agent/skills/meme-generation/SKILL.md +122 -0
  86. package/.agent/skills/node-inspect-debugger/SKILL.md +312 -0
  87. package/.agent/skills/obsidian/SKILL.md +60 -0
  88. package/.agent/skills/osint-investigation/SKILL.md +269 -0
  89. package/.agent/skills/osint-investigation/templates/source-template.md +59 -0
  90. package/.agent/skills/oss-forensics/SKILL.md +422 -0
  91. package/.agent/skills/oss-forensics/references/evidence-types.md +89 -0
  92. package/.agent/skills/oss-forensics/references/github-archive-guide.md +184 -0
  93. package/.agent/skills/oss-forensics/references/investigation-templates.md +131 -0
  94. package/.agent/skills/oss-forensics/references/recovery-techniques.md +164 -0
  95. package/.agent/skills/oss-forensics/templates/forensic-report.md +151 -0
  96. package/.agent/skills/oss-forensics/templates/malicious-package-report.md +43 -0
  97. package/.agent/skills/parallel-cli/SKILL.md +384 -0
  98. package/.agent/skills/pinggy-tunnel/SKILL.md +302 -0
  99. package/.agent/skills/pixel-art/SKILL.md +209 -0
  100. package/.agent/skills/pixel-art/references/palettes.md +49 -0
  101. package/.agent/skills/plan/SKILL.md +331 -0
  102. package/.agent/skills/polymarket/SKILL.md +75 -0
  103. package/.agent/skills/polymarket/references/api-endpoints.md +220 -0
  104. package/.agent/skills/python-debugpy/SKILL.md +368 -0
  105. package/.agent/skills/requesting-code-review/SKILL.md +273 -0
  106. package/.agent/skills/research-paper-writing/SKILL.md +2367 -0
  107. package/.agent/skills/research-paper-writing/references/autoreason-methodology.md +394 -0
  108. package/.agent/skills/research-paper-writing/references/checklists.md +434 -0
  109. package/.agent/skills/research-paper-writing/references/citation-workflow.md +563 -0
  110. package/.agent/skills/research-paper-writing/references/experiment-patterns.md +728 -0
  111. package/.agent/skills/research-paper-writing/references/human-evaluation.md +476 -0
  112. package/.agent/skills/research-paper-writing/references/paper-types.md +481 -0
  113. package/.agent/skills/research-paper-writing/references/reviewer-guidelines.md +433 -0
  114. package/.agent/skills/research-paper-writing/references/sources.md +191 -0
  115. package/.agent/skills/research-paper-writing/references/writing-guide.md +474 -0
  116. package/.agent/skills/research-paper-writing/templates/README.md +251 -0
  117. package/.agent/skills/rest-graphql-debug/SKILL.md +507 -0
  118. package/.agent/skills/s6-container-supervision/SKILL.md +171 -0
  119. package/.agent/skills/scrapling/SKILL.md +328 -0
  120. package/.agent/skills/sherlock/SKILL.md +186 -0
  121. package/.agent/skills/simplify-code/SKILL.md +168 -0
  122. package/.agent/skills/skill-authoring/SKILL.md +158 -0
  123. package/.agent/skills/spike/SKILL.md +190 -0
  124. package/.agent/skills/subagent-driven-development/SKILL.md +345 -0
  125. package/.agent/skills/subagent-driven-development/references/context-budget-discipline.md +53 -0
  126. package/.agent/skills/subagent-driven-development/references/gates-taxonomy.md +93 -0
  127. package/.agent/skills/systematic-debugging/SKILL.md +360 -0
  128. package/.agent/skills/test-driven-development/SKILL.md +336 -0
  129. package/.agent/skills/video-orchestrator/SKILL.md +194 -0
  130. package/.agent/skills/video-orchestrator/references/examples.md +227 -0
  131. package/.agent/skills/video-orchestrator/references/intake.md +166 -0
  132. package/.agent/skills/video-orchestrator/references/kanban-setup.md +278 -0
  133. package/.agent/skills/video-orchestrator/references/monitoring.md +180 -0
  134. package/.agent/skills/video-orchestrator/references/role-archetypes.md +298 -0
  135. package/.agent/skills/video-orchestrator/references/tool-matrix.md +317 -0
  136. package/.agent/skills/web-pentest/SKILL.md +332 -0
  137. package/.agent/skills/web-pentest/references/bypass-techniques.md +133 -0
  138. package/.agent/skills/web-pentest/references/exploitation-techniques.md +204 -0
  139. package/.agent/skills/web-pentest/references/scope-enforcement.md +110 -0
  140. package/.agent/skills/web-pentest/references/vuln-taxonomy.md +81 -0
  141. package/.agent/skills/web-pentest/templates/authorization.md +69 -0
  142. package/.agent/skills/web-pentest/templates/pentest-report.md +178 -0
  143. package/.claude/commands/mindforge/skill-tdd.md +53 -0
  144. package/.claude/commands/mindforge/skills-index.md +118 -0
  145. package/.claude/commands/mindforge/systematic-debug.md +60 -0
  146. package/.claude/commands/mindforge/wf-catalog.md +37 -0
  147. package/.claude/commands/mindforge/wf-code-audit.md +31 -0
  148. package/.claude/commands/mindforge/wf-competitive-analysis.md +31 -0
  149. package/.claude/commands/mindforge/wf-deep-research.md +32 -0
  150. package/.claude/commands/mindforge/wf-feature-planner.md +31 -0
  151. package/.claude/commands/mindforge/wf-incident-response.md +31 -0
  152. package/.claude/commands/mindforge/wf-onboard-codebase.md +31 -0
  153. package/.claude/commands/mindforge/wf-perf-optimize.md +31 -0
  154. package/.claude/commands/mindforge/wf-pr-review.md +31 -0
  155. package/.claude/commands/mindforge/wf-refactor-plan.md +31 -0
  156. package/.claude/commands/mindforge/wf-release-prep.md +31 -0
  157. package/.claude/commands/mindforge/wf-tdd-sprint.md +31 -0
  158. package/.claude/commands/mindforge/wf-tech-evaluation.md +31 -0
  159. package/.mindforge/config.json +2 -2
  160. package/.mindforge/dynamic-workflows/REGISTRY.md +65 -0
  161. package/.mindforge/dynamic-workflows/index.json +171 -0
  162. package/.mindforge/dynamic-workflows/scripts/code-audit.js +103 -0
  163. package/.mindforge/dynamic-workflows/scripts/competitive-analysis.js +85 -0
  164. package/.mindforge/dynamic-workflows/scripts/deep-research.js +151 -0
  165. package/.mindforge/dynamic-workflows/scripts/feature-planner.js +104 -0
  166. package/.mindforge/dynamic-workflows/scripts/incident-response.js +106 -0
  167. package/.mindforge/dynamic-workflows/scripts/onboard-codebase.js +102 -0
  168. package/.mindforge/dynamic-workflows/scripts/perf-optimize.js +128 -0
  169. package/.mindforge/dynamic-workflows/scripts/pr-review.js +87 -0
  170. package/.mindforge/dynamic-workflows/scripts/refactor-plan.js +121 -0
  171. package/.mindforge/dynamic-workflows/scripts/release-prep.js +102 -0
  172. package/.mindforge/dynamic-workflows/scripts/tdd-sprint.js +103 -0
  173. package/.mindforge/dynamic-workflows/scripts/tech-evaluation.js +72 -0
  174. package/.mindforge/memory/sync-manifest.json +1 -1
  175. package/.mindforge/skills/arxiv/SKILL.md +294 -0
  176. package/.mindforge/skills/blogwatcher/SKILL.md +147 -0
  177. package/.mindforge/skills/code-wiki/SKILL.md +457 -0
  178. package/.mindforge/skills/codebase-inspection/SKILL.md +126 -0
  179. package/.mindforge/skills/concept-diagrams/SKILL.md +373 -0
  180. package/.mindforge/skills/creative-ideation/SKILL.md +162 -0
  181. package/.mindforge/skills/domain-intel/SKILL.md +116 -0
  182. package/.mindforge/skills/duckduckgo-search/SKILL.md +249 -0
  183. package/.mindforge/skills/github-code-review/SKILL.md +493 -0
  184. package/.mindforge/skills/github-issues/SKILL.md +382 -0
  185. package/.mindforge/skills/github-pr-workflow/SKILL.md +379 -0
  186. package/.mindforge/skills/jupyter-live-kernel/SKILL.md +179 -0
  187. package/.mindforge/skills/kanban-orchestrator/SKILL.md +227 -0
  188. package/.mindforge/skills/kanban-worker/SKILL.md +206 -0
  189. package/.mindforge/skills/meme-generation/SKILL.md +141 -0
  190. package/.mindforge/skills/obsidian/SKILL.md +80 -0
  191. package/.mindforge/skills/osint-investigation/SKILL.md +288 -0
  192. package/.mindforge/skills/oss-forensics/SKILL.md +421 -0
  193. package/.mindforge/skills/pixel-art/SKILL.md +228 -0
  194. package/.mindforge/skills/plan/SKILL.md +350 -0
  195. package/.mindforge/skills/requesting-code-review/SKILL.md +292 -0
  196. package/.mindforge/skills/research-paper-writing/SKILL.md +2384 -0
  197. package/.mindforge/skills/scrapling/SKILL.md +345 -0
  198. package/.mindforge/skills/sherlock/SKILL.md +203 -0
  199. package/.mindforge/skills/simplify-code/SKILL.md +187 -0
  200. package/.mindforge/skills/spike/SKILL.md +209 -0
  201. package/.mindforge/skills/subagent-driven-development/SKILL.md +364 -0
  202. package/.mindforge/skills/systematic-debugging/SKILL.md +379 -0
  203. package/.mindforge/skills/test-driven-development/SKILL.md +355 -0
  204. package/.mindforge/skills/web-pentest/SKILL.md +327 -0
  205. package/CHANGELOG.md +71 -0
  206. package/MINDFORGE.md +2 -2
  207. package/README.md +72 -3
  208. package/RELEASENOTES.md +109 -0
  209. package/bin/installer-core.js +6 -2
  210. package/bin/mindforge-cli.js +7 -0
  211. package/bin/workflows/workflow-runner.js +110 -0
  212. package/docs/commands-reference.md +25 -0
  213. package/docs/getting-started.md +42 -5
  214. package/package.json +2 -1
@@ -0,0 +1,384 @@
1
+ ---
2
+ name: parallel-cli
3
+ description: Optional vendor skill for Parallel CLI — agent-native web search, extraction, deep research, enrichment, FindAll, and monitoring. Prefer JSON output and non-interactive flows.
4
+ version: 1.1.0
5
+ ---
6
+
7
+ # Parallel CLI
8
+
9
+ Use `parallel-cli` when the user explicitly wants Parallel, or when a terminal-native workflow would benefit from Parallel's vendor-specific stack for web search, extraction, deep research, enrichment, entity discovery, or monitoring.
10
+
11
+ This is an optional third-party workflow, not a a core capability.
12
+
13
+ Important expectations:
14
+ - Parallel is a paid service with a free tier, not a fully free local tool.
15
+ - It overlaps with native `web_search` / `web_extract`, so do not prefer it by default for ordinary lookups.
16
+ - Prefer this skill when the user mentions Parallel specifically or needs capabilities like Parallel's enrichment, FindAll, or monitor workflows.
17
+
18
+ `parallel-cli` is designed for agents:
19
+ - JSON output via `--json`
20
+ - Non-interactive command execution
21
+ - Async long-running jobs with `--no-wait`, `status`, and `poll`
22
+ - Context chaining with `--previous-interaction-id`
23
+ - Search, extract, research, enrichment, entity discovery, and monitoring in one CLI
24
+
25
+ ## When to use it
26
+
27
+ Prefer this skill when:
28
+ - The user explicitly mentions Parallel or `parallel-cli`
29
+ - The task needs richer workflows than a simple one-shot search/extract pass
30
+ - You need async deep research jobs that can be launched and polled later
31
+ - You need structured enrichment, FindAll entity discovery, or monitoring
32
+
33
+ Prefer native `web_search` / `web_extract` for quick one-off lookups when Parallel is not specifically requested.
34
+
35
+ ## Installation
36
+
37
+ Try the least invasive install path available for the environment.
38
+
39
+ ### Homebrew
40
+
41
+ ```bash
42
+ brew install parallel-web/tap/parallel-cli
43
+ ```
44
+
45
+ ### npm
46
+
47
+ ```bash
48
+ npm install -g parallel-web-cli
49
+ ```
50
+
51
+ ### Python package
52
+
53
+ ```bash
54
+ pip install "parallel-web-tools[cli]"
55
+ ```
56
+
57
+ ### Standalone installer
58
+
59
+ ```bash
60
+ curl -fsSL https://parallel.ai/install.sh | bash
61
+ ```
62
+
63
+ If you want an isolated Python install, `pipx` can also work:
64
+
65
+ ```bash
66
+ pipx install "parallel-web-tools[cli]"
67
+ pipx ensurepath
68
+ ```
69
+
70
+ ## Authentication
71
+
72
+ Interactive login:
73
+
74
+ ```bash
75
+ parallel-cli login
76
+ ```
77
+
78
+ Headless / SSH / CI:
79
+
80
+ ```bash
81
+ parallel-cli login --device
82
+ ```
83
+
84
+ API key environment variable:
85
+
86
+ ```bash
87
+ export PARALLEL_API_KEY="***"
88
+ ```
89
+
90
+ Verify current auth status:
91
+
92
+ ```bash
93
+ parallel-cli auth
94
+ ```
95
+
96
+ If auth requires browser interaction, run with `pty=true`.
97
+
98
+ ## Core rule set
99
+
100
+ 1. Always prefer `--json` when you need machine-readable output.
101
+ 2. Prefer explicit arguments and non-interactive flows.
102
+ 3. For long-running jobs, use `--no-wait` and then `status` / `poll`.
103
+ 4. Cite only URLs returned by the CLI output.
104
+ 5. Save large JSON outputs to a temp file when follow-up questions are likely.
105
+ 6. Use background processes only for genuinely long-running workflows; otherwise run in foreground.
106
+ 7. Prefer native tools unless the user wants Parallel specifically or needs Parallel-only workflows.
107
+
108
+ ## Quick reference
109
+
110
+ ```text
111
+ parallel-cli
112
+ ├── auth
113
+ ├── login
114
+ ├── logout
115
+ ├── search
116
+ ├── extract / fetch
117
+ ├── research run|status|poll|processors
118
+ ├── enrich run|status|poll|plan|suggest|deploy
119
+ ├── findall run|ingest|status|poll|result|enrich|extend|schema|cancel
120
+ └── monitor create|list|get|update|delete|events|event-group|simulate
121
+ ```
122
+
123
+ ## Common flags and patterns
124
+
125
+ Commonly useful flags:
126
+ - `--json` for structured output
127
+ - `--no-wait` for async jobs
128
+ - `--previous-interaction-id <id>` for follow-up tasks that reuse earlier context
129
+ - `--max-results <n>` for search result count
130
+ - `--mode one-shot|agentic` for search behavior
131
+ - `--include-domains domain1.com,domain2.com`
132
+ - `--exclude-domains domain1.com,domain2.com`
133
+ - `--after-date YYYY-MM-DD`
134
+
135
+ Read from stdin when convenient:
136
+
137
+ ```bash
138
+ echo "What is the latest funding for Anthropic?" | parallel-cli search - --json
139
+ echo "Research question" | parallel-cli research run - --json
140
+ ```
141
+
142
+ ## Search
143
+
144
+ Use for current web lookups with structured results.
145
+
146
+ ```bash
147
+ parallel-cli search "What is Anthropic's latest AI model?" --json
148
+ parallel-cli search "SEC filings for Apple" --include-domains sec.gov --json
149
+ parallel-cli search "bitcoin price" --after-date 2026-01-01 --max-results 10 --json
150
+ parallel-cli search "latest browser benchmarks" --mode one-shot --json
151
+ parallel-cli search "AI coding agent enterprise reviews" --mode agentic --json
152
+ ```
153
+
154
+ Useful constraints:
155
+ - `--include-domains` to narrow trusted sources
156
+ - `--exclude-domains` to strip noisy domains
157
+ - `--after-date` for recency filtering
158
+ - `--max-results` when you need broader coverage
159
+
160
+ If you expect follow-up questions, save output:
161
+
162
+ ```bash
163
+ parallel-cli search "latest React 19 changes" --json -o /tmp/react-19-search.json
164
+ ```
165
+
166
+ When summarizing results:
167
+ - lead with the answer
168
+ - include dates, names, and concrete facts
169
+ - cite only returned sources
170
+ - avoid inventing URLs or source titles
171
+
172
+ ## Extraction
173
+
174
+ Use to pull clean content or markdown from a URL.
175
+
176
+ ```bash
177
+ parallel-cli extract https://example.com --json
178
+ parallel-cli extract https://company.com --objective "Find pricing info" --json
179
+ parallel-cli extract https://example.com --full-content --json
180
+ parallel-cli fetch https://example.com --json
181
+ ```
182
+
183
+ Use `--objective` when the page is broad and you only need one slice of information.
184
+
185
+ ## Deep research
186
+
187
+ Use for deeper multi-step research tasks that may take time.
188
+
189
+ Common processor tiers:
190
+ - `lite` / `base` for faster, cheaper passes
191
+ - `core` / `pro` for more thorough synthesis
192
+ - `ultra` for the heaviest research jobs
193
+
194
+ ### Synchronous
195
+
196
+ ```bash
197
+ parallel-cli research run \
198
+ "Compare the leading AI coding agents by pricing, model support, and enterprise controls" \
199
+ --processor core \
200
+ --json
201
+ ```
202
+
203
+ ### Async launch + poll
204
+
205
+ ```bash
206
+ parallel-cli research run \
207
+ "Compare the leading AI coding agents by pricing, model support, and enterprise controls" \
208
+ --processor ultra \
209
+ --no-wait \
210
+ --json
211
+
212
+ parallel-cli research status trun_xxx --json
213
+ parallel-cli research poll trun_xxx --json
214
+ parallel-cli research processors --json
215
+ ```
216
+
217
+ ### Context chaining / follow-up
218
+
219
+ ```bash
220
+ parallel-cli research run "What are the top AI coding agents?" --json
221
+ parallel-cli research run \
222
+ "What enterprise controls does the top-ranked one offer?" \
223
+ --previous-interaction-id trun_xxx \
224
+ --json
225
+ ```
226
+
227
+ Recommended workflow:
228
+ 1. launch with `--no-wait --json`
229
+ 2. capture the returned run/task ID
230
+ 3. if the user wants to continue other work, keep moving
231
+ 4. later call `status` or `poll`
232
+ 5. summarize the final report with citations from the returned sources
233
+
234
+ ## Enrichment
235
+
236
+ Use when the user has CSV/JSON/tabular inputs and wants additional columns inferred from web research.
237
+
238
+ ### Suggest columns
239
+
240
+ ```bash
241
+ parallel-cli enrich suggest "Find the CEO and annual revenue" --json
242
+ ```
243
+
244
+ ### Plan a config
245
+
246
+ ```bash
247
+ parallel-cli enrich plan -o config.yaml
248
+ ```
249
+
250
+ ### Inline data
251
+
252
+ ```bash
253
+ parallel-cli enrich run \
254
+ --data '[{"company": "Anthropic"}, {"company": "Mistral"}]' \
255
+ --intent "Find headquarters and employee count" \
256
+ --json
257
+ ```
258
+
259
+ ### Non-interactive file run
260
+
261
+ ```bash
262
+ parallel-cli enrich run \
263
+ --source-type csv \
264
+ --source companies.csv \
265
+ --target enriched.csv \
266
+ --source-columns '[{"name": "company", "description": "Company name"}]' \
267
+ --intent "Find the CEO and annual revenue"
268
+ ```
269
+
270
+ ### YAML config run
271
+
272
+ ```bash
273
+ parallel-cli enrich run config.yaml
274
+ ```
275
+
276
+ ### Status / polling
277
+
278
+ ```bash
279
+ parallel-cli enrich status <task_group_id> --json
280
+ parallel-cli enrich poll <task_group_id> --json
281
+ ```
282
+
283
+ Use explicit JSON arrays for column definitions when operating non-interactively.
284
+ Validate the output file before reporting success.
285
+
286
+ ## FindAll
287
+
288
+ Use for web-scale entity discovery when the user wants a discovered dataset rather than a short answer.
289
+
290
+ ```bash
291
+ parallel-cli findall run "Find AI coding agent startups with enterprise offerings" --json
292
+ parallel-cli findall run "AI startups in healthcare" -n 25 --json
293
+ parallel-cli findall status <run_id> --json
294
+ parallel-cli findall poll <run_id> --json
295
+ parallel-cli findall result <run_id> --json
296
+ parallel-cli findall schema <run_id> --json
297
+ ```
298
+
299
+ This is a better fit than ordinary search when the user wants a discovered set of entities that can be reviewed, filtered, or enriched later.
300
+
301
+ ## Monitor
302
+
303
+ Use for ongoing change detection over time.
304
+
305
+ ```bash
306
+ parallel-cli monitor list --json
307
+ parallel-cli monitor get <monitor_id> --json
308
+ parallel-cli monitor events <monitor_id> --json
309
+ parallel-cli monitor delete <monitor_id> --json
310
+ ```
311
+
312
+ Creation is usually the sensitive part because cadence and delivery matter:
313
+
314
+ ```bash
315
+ parallel-cli monitor create --help
316
+ ```
317
+
318
+ Use this when the user wants recurring tracking of a page or source rather than a one-time fetch.
319
+
320
+ ## Recommended usage patterns
321
+
322
+ ### Fast answer with citations
323
+ 1. Run `parallel-cli search ... --json`
324
+ 2. Parse titles, URLs, dates, excerpts
325
+ 3. Summarize with inline citations from the returned URLs only
326
+
327
+ ### URL investigation
328
+ 1. Run `parallel-cli extract URL --json`
329
+ 2. If needed, rerun with `--objective` or `--full-content`
330
+ 3. Quote or summarize the extracted markdown
331
+
332
+ ### Long research workflow
333
+ 1. Run `parallel-cli research run ... --no-wait --json`
334
+ 2. Store the returned ID
335
+ 3. Continue other work or periodically poll
336
+ 4. Summarize the final report with citations
337
+
338
+ ### Structured enrichment workflow
339
+ 1. Inspect the input file and columns
340
+ 2. Use `enrich suggest` or provide explicit enriched columns
341
+ 3. Run `enrich run`
342
+ 4. Poll for completion if needed
343
+ 5. Validate the output file before reporting success
344
+
345
+ ## Error handling and exit codes
346
+
347
+ The CLI documents these exit codes:
348
+ - `0` success
349
+ - `2` bad input
350
+ - `3` auth error
351
+ - `4` API error
352
+ - `5` timeout
353
+
354
+ If you hit auth errors:
355
+ 1. check `parallel-cli auth`
356
+ 2. confirm `PARALLEL_API_KEY` or run `parallel-cli login` / `parallel-cli login --device`
357
+ 3. verify `parallel-cli` is on `PATH`
358
+
359
+ ## Maintenance
360
+
361
+ Check current auth / install state:
362
+
363
+ ```bash
364
+ parallel-cli auth
365
+ parallel-cli --help
366
+ ```
367
+
368
+ Update commands:
369
+
370
+ ```bash
371
+ parallel-cli update
372
+ pip install --upgrade parallel-web-tools
373
+ parallel-cli config auto-update-check off
374
+ ```
375
+
376
+ ## Pitfalls
377
+
378
+ - Do not omit `--json` unless the user explicitly wants human-formatted output.
379
+ - Do not cite sources not present in the CLI output.
380
+ - `login` may require PTY/browser interaction.
381
+ - Prefer foreground execution for short tasks; do not overuse background processes.
382
+ - For large result sets, save JSON to `/tmp/*.json` instead of stuffing everything into context.
383
+ - Do not silently choose Parallel when native tools are already sufficient.
384
+ - Remember this is a vendor workflow that usually requires account auth and paid usage beyond the free tier.
@@ -0,0 +1,302 @@
1
+ ---
2
+ name: pinggy-tunnel
3
+ description: Zero-install localhost tunnels over SSH via Pinggy.
4
+ version: 0.1.0
5
+ ---
6
+
7
+ # Pinggy Tunnel Skill
8
+
9
+ Expose a local service (dev server, webhook receiver, MCP endpoint, demo) to the public internet using a Pinggy SSH reverse tunnel. No daemon to install — the user's stock SSH client connects to `a.pinggy.io:443` and Pinggy hands back a public HTTP/HTTPS URL.
10
+
11
+ Free tier: 60-minute tunnels, random subdomain, no signup. Pro tier ($3/mo) is an opt-in with a token.
12
+
13
+ ## When to Use
14
+
15
+ - User asks to "expose this locally", "share my dev server", "make this URL public", "tunnel port N", "get a public URL for a webhook"
16
+ - Need to receive a webhook callback during a local task (Stripe, GitHub, Discord, AgentMail)
17
+ - Sharing a one-off HTTP demo (MCP server, Ollama/vLLM endpoint, dashboard) with a remote party
18
+ - The host has SSH but no `cloudflared` / `ngrok` binary, and installing one would be overkill
19
+
20
+ If the host already has `cloudflared` configured, prefer the `cloudflared-quick-tunnel` skill — Cloudflare quick tunnels don't expire after 60 minutes.
21
+
22
+ ## Prerequisites
23
+
24
+ - `ssh` on PATH (`ssh -V`). Default on Linux, macOS, and Windows 10+. No other install.
25
+ - A local service listening on `127.0.0.1:<port>` before the tunnel starts. Pinggy will return URLs but they'll 502 until the local origin is up.
26
+
27
+ Optional:
28
+
29
+ - `PINGGY_TOKEN` env var for paid Pro features (persistent subdomain, custom domain, multiple tunnels, no 60-minute cap). Free tier needs no credentials.
30
+
31
+ ## Quick Reference
32
+
33
+ ```bash
34
+ # Plain HTTP/HTTPS tunnel for port 8000 (free tier)
35
+ ssh -p 443 -o StrictHostKeyChecking=no -o ServerAliveInterval=30 \
36
+ -R0:localhost:8000 free@a.pinggy.io
37
+
38
+ # TCP tunnel (databases, raw SSH, etc.)
39
+ ssh -p 443 -o StrictHostKeyChecking=no -R0:localhost:5432 tcp@a.pinggy.io
40
+
41
+ # TLS tunnel (Pinggy can't decrypt — bring your own certs at origin)
42
+ ssh -p 443 -o StrictHostKeyChecking=no -R0:localhost:443 tls@a.pinggy.io
43
+
44
+ # Basic auth gate (b:user:pass)
45
+ ssh -p 443 -o StrictHostKeyChecking=no -R0:localhost:8000 \
46
+ "b:admin:secret+free@a.pinggy.io"
47
+
48
+ # Bearer token gate (k:token)
49
+ ssh -p 443 -o StrictHostKeyChecking=no -R0:localhost:8000 \
50
+ "k:mysecrettoken+free@a.pinggy.io"
51
+
52
+ # IP whitelist (w:CIDR)
53
+ ssh -p 443 -o StrictHostKeyChecking=no -R0:localhost:8000 \
54
+ "w:203.0.113.0/24+free@a.pinggy.io"
55
+
56
+ # Enable CORS + force HTTPS redirect
57
+ ssh -p 443 -o StrictHostKeyChecking=no -R0:localhost:8000 \
58
+ "co+x:https+free@a.pinggy.io"
59
+
60
+ # Pro tier (persistent URL, no 60-min cap)
61
+ ssh -p 443 -o StrictHostKeyChecking=no -R0:localhost:8000 "$PINGGY_TOKEN+a.pinggy.io"
62
+ ```
63
+
64
+ ## Procedure — Start a Tunnel and Get the URL
65
+
66
+ The model SHOULD use the `terminal` tool. The tunnel must stay alive for the duration of the share, so run it as a background process and parse the public URL from stdout.
67
+
68
+ ### 1. Confirm a local origin is up
69
+
70
+ ```bash
71
+ curl -sI http://127.0.0.1:8000/ | head -1
72
+ # expect HTTP/1.x 200 (or any non-connection-refused response)
73
+ ```
74
+
75
+ If nothing is listening yet, start it first (e.g. `python3 -m http.server 8000 --bind 127.0.0.1`). Pinggy will happily return a URL pointed at nothing — the user will see 502 until the origin comes up.
76
+
77
+ ### 2. Launch the tunnel as a background process
78
+
79
+ Use `terminal(background=True)` and capture output to a logfile (Pinggy prints the URLs on stdout, then keeps the connection open):
80
+
81
+ ```bash
82
+ LOG=/tmp/pinggy-8000.log
83
+ nohup ssh -p 443 \
84
+ -o StrictHostKeyChecking=no \
85
+ -o UserKnownHostsFile=/dev/null \
86
+ -o ServerAliveInterval=30 \
87
+ -o ServerAliveCountMax=3 \
88
+ -R0:localhost:8000 free@a.pinggy.io \
89
+ > "$LOG" 2>&1 &
90
+ echo $! > /tmp/pinggy-8000.pid
91
+ ```
92
+
93
+ `StrictHostKeyChecking=no` + `UserKnownHostsFile=/dev/null` skips the first-run host-key prompt. `ServerAliveInterval=30` keeps the SSH session from getting torn down by an idle NAT.
94
+
95
+ ### 3. Parse the URL out of the log
96
+
97
+ ```bash
98
+ sleep 4
99
+ grep -oE 'https://[a-z0-9-]+\.[a-z]+\.pinggy\.link' /tmp/pinggy-8000.log | head -1
100
+ ```
101
+
102
+ Expected output looks like:
103
+
104
+ ```
105
+ You are not authenticated.
106
+ Your tunnel will expire in 60 minutes.
107
+ http://yqycl-98-162-69-48.a.free.pinggy.link
108
+ https://yqycl-98-162-69-48.a.free.pinggy.link
109
+ ```
110
+
111
+ Hand the `https://...pinggy.link` URL to the user.
112
+
113
+ ### 4. Verify
114
+
115
+ ```bash
116
+ curl -sI https://<the-url>/ | head -3
117
+ # expect 200/302/whatever the local origin actually returns
118
+ ```
119
+
120
+ If you get `502 Bad Gateway`, the SSH session is up but the local origin isn't listening — fix step 1 first.
121
+
122
+ ### 5. Teardown
123
+
124
+ ```bash
125
+ kill "$(cat /tmp/pinggy-8000.pid)"
126
+ # or, if the pid file got lost:
127
+ pkill -f 'ssh -p 443 .* free@a\.pinggy\.io'
128
+ ```
129
+
130
+ If you have a session_id from `terminal(background=True)`, prefer `process(action='kill', session_id=...)`.
131
+
132
+ ## Access Control via Username Keywords
133
+
134
+ Pinggy stacks control flags into the SSH username separated by `+`. Always quote the whole `user@host` argument when it contains a `+`:
135
+
136
+ | Keyword | Effect |
137
+ |---------|--------|
138
+ | `b:user:pass` | HTTP Basic auth gate |
139
+ | `k:token` | Bearer-token header gate (`Authorization: Bearer <token>`) |
140
+ | `w:CIDR` | IP whitelist (single IP or CIDR, repeatable) |
141
+ | `co` | Add `Access-Control-Allow-Origin: *` (CORS) |
142
+ | `x:https` | Force HTTPS — auto-redirect HTTP to HTTPS |
143
+ | `a:Name:Value` | Add request header |
144
+ | `u:Name:Value` | Update request header |
145
+ | `r:Name` | Remove request header |
146
+ | `qr` | Print a QR code of the URL to stdout (handy for mobile sharing) |
147
+
148
+ Combine freely: `"b:admin:secret+co+x:https+free@a.pinggy.io"`.
149
+
150
+ ## Web Debugger (optional)
151
+
152
+ Pinggy can mirror the inbound traffic to `localhost:4300` for inspection. Add a local forward to the SSH command:
153
+
154
+ ```bash
155
+ ssh -p 443 -L4300:localhost:4300 -R0:localhost:8000 free@a.pinggy.io
156
+ ```
157
+
158
+ Then open `http://localhost:4300` in a browser to see live request/response pairs.
159
+
160
+ ## Pitfalls
161
+
162
+ - **60-minute hard cap on the free tier.** The SSH session terminates at the 60-minute mark; the URL goes dead. For longer shares, either use `PINGGY_TOKEN` (Pro) or auto-restart with a shell loop (note that the URL changes on every restart for free-tier).
163
+ - **Free-tier URL is random and changes on restart.** Don't bookmark it, don't paste it into a config file. Re-parse from the log each time.
164
+ - **Concurrent free tunnels are limited to one per source IP.** Starting a second tunnel from the same machine usually kills the first. Pro tier lifts this.
165
+ - **`+` in usernames must be quoted.** Bare `ssh ... b:admin:secret+free@a.pinggy.io` works in bash but breaks under shells that treat `+` specially or when assembled programmatically. Always wrap in double quotes.
166
+ - **Don't tunnel anything sensitive without an access-control flag.** A bare HTTP tunnel is reachable by anyone with the URL. Use `b:`, `k:`, or `w:` for non-public services.
167
+ - **`process(action='log')` may miss SSH banner output.** Pinggy prints the URLs and then the SSH session goes interactive. Always redirect to a logfile and `grep` the file directly — same pattern as `cloudflared-quick-tunnel`.
168
+ - **Host-key prompt on first run.** Default OpenSSH config asks the user to accept Pinggy's host key. Always pass `-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null` for unattended runs.
169
+ - **TCP and TLS tunnels return a `<subdomain>.a.pinggy.online:<port>` pair, not an https URL.** Parse with a different regex (`tcp://` and a port). Don't assume every Pinggy tunnel is HTTP.
170
+ - **Pro mode requires the token as the username, not a flag.** Use `"$PINGGY_TOKEN+a.pinggy.io"` (no `free@`). With a token you can also add `:persistent` for a stable subdomain — see `pinggy.io/docs/`.
171
+
172
+ ## Recipes
173
+
174
+ Composite patterns combining a local origin with a Pinggy tunnel. Each recipe is self-contained — start the origin, start the tunnel, parse the URL, hand it back to the user.
175
+
176
+ ### Recipe 1 — Receive a webhook callback
177
+
178
+ Use this when an external service (Stripe, GitHub, Discord, AgentMail, etc.) needs to POST to a publicly reachable URL during a local task.
179
+
180
+ ```bash
181
+ # 1. Tiny capturing server: every request gets appended to /tmp/webhook-hits.log
182
+ cat >/tmp/webhook-server.py <<'PY'
183
+ import http.server, json, datetime, pathlib
184
+ LOG = pathlib.Path("/tmp/webhook-hits.log")
185
+ class H(http.server.BaseHTTPRequestHandler):
186
+ def _capture(self):
187
+ n = int(self.headers.get("content-length") or 0)
188
+ body = self.rfile.read(n).decode("utf-8", "replace") if n else ""
189
+ rec = {"t": datetime.datetime.utcnow().isoformat(), "path": self.path,
190
+ "method": self.command, "headers": dict(self.headers), "body": body}
191
+ with LOG.open("a") as f: f.write(json.dumps(rec) + "\n")
192
+ self.send_response(200); self.send_header("content-type","application/json")
193
+ self.end_headers(); self.wfile.write(b'{"ok":true}\n')
194
+ def do_GET(self): self._capture()
195
+ def do_POST(self): self._capture()
196
+ def log_message(self,*a,**k): pass
197
+ http.server.HTTPServer(("127.0.0.1", 18080), H).serve_forever()
198
+ PY
199
+ nohup python3 /tmp/webhook-server.py >/tmp/webhook-server.log 2>&1 &
200
+ echo $! >/tmp/webhook-server.pid
201
+
202
+ # 2. Tunnel — bearer-token-gate so randos can't pollute the capture log
203
+ nohup ssh -p 443 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \
204
+ -o ServerAliveInterval=30 \
205
+ -R0:localhost:18080 "k:$(openssl rand -hex 12)+free@a.pinggy.io" \
206
+ >/tmp/webhook-pinggy.log 2>&1 &
207
+ echo $! >/tmp/webhook-pinggy.pid
208
+ sleep 5
209
+ URL=$(grep -oE 'https://[a-z0-9-]+\.[a-z]+\.pinggy\.link' /tmp/webhook-pinggy.log | head -1)
210
+ echo "Webhook URL: $URL"
211
+
212
+ # 3. While the agent works, watch hits land
213
+ tail -f /tmp/webhook-hits.log
214
+ ```
215
+
216
+ Hand `$URL` to the service that needs to call you. Teardown: `kill $(cat /tmp/webhook-server.pid) $(cat /tmp/webhook-pinggy.pid)`.
217
+
218
+ ### Recipe 2 — Expose an MCP server over HTTP/SSE
219
+
220
+ Use when a remote MCP client (Claude Desktop on another machine, a teammate's editor, etc.) needs to reach an MCP server running on the local box. Only works for MCP servers that speak HTTP transport — stdio-mode servers can't be tunneled.
221
+
222
+ ```bash
223
+ # 1. Start the MCP server in HTTP mode (example: a FastMCP server on port 8765)
224
+ nohup python3 my_mcp_server.py --transport http --port 8765 \
225
+ >/tmp/mcp-server.log 2>&1 &
226
+ echo $! >/tmp/mcp-server.pid
227
+
228
+ # 2. Tunnel with a bearer token — MCP traffic should not be open to the internet
229
+ TOKEN=$(openssl rand -hex 16)
230
+ nohup ssh -p 443 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \
231
+ -o ServerAliveInterval=30 \
232
+ -R0:localhost:8765 "k:$TOKEN+free@a.pinggy.io" \
233
+ >/tmp/mcp-pinggy.log 2>&1 &
234
+ echo $! >/tmp/mcp-pinggy.pid
235
+ sleep 5
236
+ URL=$(grep -oE 'https://[a-z0-9-]+\.[a-z]+\.pinggy\.link' /tmp/mcp-pinggy.log | head -1)
237
+ echo "MCP URL: $URL"
238
+ echo "Bearer token: $TOKEN"
239
+ ```
240
+
241
+ The remote client connects to `$URL` with `Authorization: Bearer $TOKEN`. the agent' own native MCP client config: `{"transport": "http", "url": "<URL>", "headers": {"Authorization": "Bearer <TOKEN>"}}`.
242
+
243
+ ### Recipe 3 — Expose a local LLM endpoint (Ollama / vLLM / llama.cpp)
244
+
245
+ Share a local model with a remote caller (another agent, a phone, a teammate). Ollama listens on `:11434`, vLLM and llama.cpp typically on `:8000`.
246
+
247
+ ```bash
248
+ # Pre-req: the model server is already running on 127.0.0.1:11434 (Ollama default)
249
+ TOKEN=$(openssl rand -hex 16)
250
+ nohup ssh -p 443 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \
251
+ -o ServerAliveInterval=30 \
252
+ -R0:localhost:11434 "k:$TOKEN+co+free@a.pinggy.io" \
253
+ >/tmp/llm-pinggy.log 2>&1 &
254
+ echo $! >/tmp/llm-pinggy.pid
255
+ sleep 5
256
+ URL=$(grep -oE 'https://[a-z0-9-]+\.[a-z]+\.pinggy\.link' /tmp/llm-pinggy.log | head -1)
257
+ echo "Endpoint: $URL"
258
+ echo "Token: $TOKEN"
259
+
260
+ # Verify
261
+ curl -s "$URL/api/tags" -H "Authorization: Bearer $TOKEN" | head
262
+ ```
263
+
264
+ `co` enables CORS so a browser caller can hit the endpoint. Drop `co` for backend-only callers. For an OpenAI-compatible vLLM/llama.cpp endpoint, callers use base URL `$URL/v1` with `Authorization: Bearer $TOKEN` — but note Pinggy strips/replaces nothing in the body, so the model server itself sees Pinggy's token; the local server should be configured to ignore auth (it's already on `127.0.0.1`) and let Pinggy do the gating.
265
+
266
+ ### Recipe 4 — Share a dev server with a one-shot password
267
+
268
+ The fastest "let a teammate poke at my running app" pattern. Random password, prints once, dies when you Ctrl-C.
269
+
270
+ ```bash
271
+ PASS=$(openssl rand -base64 12 | tr -d '+/=' | head -c 12)
272
+ echo "Dev server password: $PASS"
273
+ ssh -p 443 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \
274
+ -o ServerAliveInterval=30 \
275
+ -R0:localhost:3000 "b:dev:$PASS+co+x:https+free@a.pinggy.io"
276
+ # URL prints to the terminal. Share URL + password. Ctrl-C to tear down.
277
+ ```
278
+
279
+ `b:dev:$PASS` gates the URL with HTTP Basic auth. `x:https` forces TLS. `co` adds CORS for SPA frontends.
280
+
281
+ ## Verification
282
+
283
+ ```bash
284
+ # End-to-end: spin up a trivial origin, tunnel it, hit it, tear down
285
+ python3 -m http.server 18000 --bind 127.0.0.1 >/tmp/origin.log 2>&1 &
286
+ ORIGIN_PID=$!
287
+
288
+ nohup ssh -p 443 \
289
+ -o StrictHostKeyChecking=no \
290
+ -o UserKnownHostsFile=/dev/null \
291
+ -R0:localhost:18000 free@a.pinggy.io >/tmp/pinggy-verify.log 2>&1 &
292
+ SSH_PID=$!
293
+
294
+ sleep 5
295
+ URL=$(grep -oE 'https://[a-z0-9-]+\.[a-z]+\.pinggy\.link' /tmp/pinggy-verify.log | head -1)
296
+ echo "URL: $URL"
297
+ curl -sI "$URL/" | head -1
298
+
299
+ kill "$SSH_PID" "$ORIGIN_PID"
300
+ ```
301
+
302
+ Expected: a `pinggy.link` URL and `HTTP/2 200` on the curl head.