opencode-skills-collection 4.0.11 → 4.0.13

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 (55) hide show
  1. package/bundled-skills/.antigravity-install-manifest.json +4 -1
  2. package/bundled-skills/docs/integrations/jetski-cortex.md +3 -3
  3. package/bundled-skills/docs/integrations/jetski-gemini-loader/README.md +1 -1
  4. package/bundled-skills/docs/maintainers/repo-growth-seo.md +1 -1
  5. package/bundled-skills/docs/maintainers/skills-update-guide.md +1 -1
  6. package/bundled-skills/docs/users/aas-core.md +1 -1
  7. package/bundled-skills/docs/users/bundles.md +1 -1
  8. package/bundled-skills/docs/users/claude-code-skills.md +1 -1
  9. package/bundled-skills/docs/users/gemini-cli-skills.md +1 -1
  10. package/bundled-skills/docs/users/kiro-integration.md +1 -1
  11. package/bundled-skills/docs/users/usage.md +3 -3
  12. package/bundled-skills/docs/users/visual-guide.md +4 -4
  13. package/bundled-skills/fedora-hyprland-installer/LICENSE +21 -0
  14. package/bundled-skills/fedora-hyprland-installer/README.md +125 -0
  15. package/bundled-skills/fedora-hyprland-installer/SKILL.md +112 -0
  16. package/bundled-skills/fedora-hyprland-installer/references/amd.md +10 -0
  17. package/bundled-skills/fedora-hyprland-installer/references/fedora.md +24 -0
  18. package/bundled-skills/fedora-hyprland-installer/references/hyprland.md +22 -0
  19. package/bundled-skills/fedora-hyprland-installer/references/intel.md +8 -0
  20. package/bundled-skills/fedora-hyprland-installer/references/nvidia.md +29 -0
  21. package/bundled-skills/fedora-hyprland-installer/references/portals.md +18 -0
  22. package/bundled-skills/fedora-hyprland-installer/references/troubleshooting.md +53 -0
  23. package/bundled-skills/fedora-hyprland-installer/references/wayland.md +9 -0
  24. package/bundled-skills/fedora-hyprland-installer/scripts/backup.sh +65 -0
  25. package/bundled-skills/fedora-hyprland-installer/scripts/configure.sh +158 -0
  26. package/bundled-skills/fedora-hyprland-installer/scripts/detect-gpu.sh +71 -0
  27. package/bundled-skills/fedora-hyprland-installer/scripts/detect-system.sh +95 -0
  28. package/bundled-skills/fedora-hyprland-installer/scripts/install.sh +62 -0
  29. package/bundled-skills/fedora-hyprland-installer/scripts/preflight.sh +94 -0
  30. package/bundled-skills/fedora-hyprland-installer/scripts/repair.sh +92 -0
  31. package/bundled-skills/fedora-hyprland-installer/scripts/uninstall.sh +57 -0
  32. package/bundled-skills/fedora-hyprland-installer/scripts/verify.sh +92 -0
  33. package/bundled-skills/fedora-hyprland-installer/tests/test-detection.sh +22 -0
  34. package/bundled-skills/fedora-hyprland-installer/tests/test-scripts.sh +47 -0
  35. package/bundled-skills/find-complementary-founders/LICENSE.txt +21 -0
  36. package/bundled-skills/find-complementary-founders/SKILL.md +386 -0
  37. package/bundled-skills/find-complementary-founders/agents/openai.yaml +4 -0
  38. package/bundled-skills/find-complementary-founders/references/community-growth.md +140 -0
  39. package/bundled-skills/find-complementary-founders/references/evidence-model.md +94 -0
  40. package/bundled-skills/find-complementary-founders/references/moltbook.md +125 -0
  41. package/bundled-skills/find-complementary-founders/references/owner-onboarding.ru.md +105 -0
  42. package/bundled-skills/find-complementary-founders/references/privacy-safety.md +63 -0
  43. package/bundled-skills/find-complementary-founders/references/profile-schema.md +117 -0
  44. package/bundled-skills/find-complementary-founders/scripts/assess_profile.py +532 -0
  45. package/bundled-skills/find-complementary-founders/scripts/github_thread.py +466 -0
  46. package/bundled-skills/find-complementary-founders/scripts/match_profiles.py +251 -0
  47. package/bundled-skills/find-complementary-founders/scripts/moltbook_publish.py +672 -0
  48. package/bundled-skills/find-complementary-founders/scripts/profile_card.py +307 -0
  49. package/bundled-skills/find-complementary-founders/scripts/validate_profile.py +473 -0
  50. package/bundled-skills/find-complementary-founders/scripts/verify_github_submission.py +296 -0
  51. package/bundled-skills/orchestrate/SKILL.md +61 -0
  52. package/bundled-skills/orchestrate/agents/openai.yaml +4 -0
  53. package/bundled-skills/uizze-ui-research/SKILL.md +47 -12
  54. package/package.json +1 -1
  55. package/skills_index.json +101 -1
@@ -0,0 +1,307 @@
1
+ #!/usr/bin/env python3
2
+ """Render a deterministic, privacy-minimized Markdown profile-card draft."""
3
+
4
+ from __future__ import annotations
5
+
6
+ import argparse
7
+ import hashlib
8
+ import json
9
+ import os
10
+ import re
11
+ import sys
12
+ from datetime import date, datetime, timezone
13
+ from pathlib import Path
14
+
15
+ PROTOCOL_URL = "https://github.com/merc1305/findMate"
16
+ CARD_MARKER = "FINDMATE_OWNER_PROFILE_CARD_V1"
17
+
18
+ STAGE_LABELS = {
19
+ "zero_to_one": "0→1",
20
+ "one_to_ten": "1→10",
21
+ "ten_to_hundred": "10→100",
22
+ }
23
+
24
+ FUNCTION_LABELS = {
25
+ "problem_discovery": "problem discovery",
26
+ "product": "product",
27
+ "engineering": "engineering",
28
+ "design": "design",
29
+ "go_to_market": "go-to-market",
30
+ "operations": "operations",
31
+ "people_leadership": "people leadership",
32
+ "capital_partnerships": "capital & partnerships",
33
+ }
34
+
35
+ LEVELS = {"unknown", "observed", "practiced", "strong", "standout"}
36
+ CONFIDENCES = {"none", "low", "medium", "high"}
37
+
38
+ SENSITIVE_PATTERNS = {
39
+ "email address": re.compile(
40
+ r"\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}\b", re.IGNORECASE
41
+ ),
42
+ "phone-like number": re.compile(r"(?<!\w)(?:\+?\d[\s().-]*){9,}(?!\w)"),
43
+ "secret-like text": re.compile(
44
+ r"(?:api[_ -]?key|password|passwd|private[_ -]?key|"
45
+ r"authorization:\s*bearer|moltbook_[A-Za-z0-9_-]{8,}|"
46
+ r"gh[opusr]_[A-Za-z0-9_]{12,})",
47
+ re.IGNORECASE,
48
+ ),
49
+ "local filesystem path": re.compile(r"(?:/Users/|/home/|[A-Z]:\\Users\\)"),
50
+ }
51
+
52
+
53
+ class CardError(ValueError):
54
+ """Raised when a public profile is invalid or unsafe to render."""
55
+
56
+
57
+ def load_profile(path: Path) -> dict:
58
+ try:
59
+ value = json.loads(path.read_text(encoding="utf-8"))
60
+ except (OSError, json.JSONDecodeError) as exc:
61
+ raise CardError(f"Cannot load {path}: {exc}") from exc
62
+ if not isinstance(value, dict):
63
+ raise CardError(f"{path} must contain a JSON object")
64
+ return value
65
+
66
+
67
+ def safe_text(value: object, field: str, *, maximum: int = 100) -> str:
68
+ if not isinstance(value, str) or not value.strip():
69
+ raise CardError(f"{field} must be a non-empty string")
70
+ clean = " ".join(value.split())
71
+ if len(clean) > maximum:
72
+ raise CardError(f"{field} exceeds {maximum} characters")
73
+ for label, pattern in SENSITIVE_PATTERNS.items():
74
+ if pattern.search(clean):
75
+ raise CardError(f"{field} appears to contain a {label}")
76
+ return clean
77
+
78
+
79
+ def markdown_text(value: str) -> str:
80
+ escaped = value.replace("\\", "\\\\")
81
+ for character in ("`", "*", "_", "[", "]", "<", ">", "|"):
82
+ escaped = escaped.replace(character, f"\\{character}")
83
+ return escaped
84
+
85
+
86
+ def canonical_profile_bytes(profile: dict) -> bytes:
87
+ return json.dumps(
88
+ profile,
89
+ sort_keys=True,
90
+ separators=(",", ":"),
91
+ ensure_ascii=False,
92
+ ).encode("utf-8")
93
+
94
+
95
+ def validate_profile(profile: dict) -> None:
96
+ if profile.get("schema_version") != "1.0":
97
+ raise CardError("Profile schema_version must be 1.0")
98
+ if profile.get("profile_type") != "founder-collaboration":
99
+ raise CardError("Profile is not a founder-collaboration profile")
100
+
101
+ alias = safe_text(profile.get("alias"), "profile.alias", maximum=50)
102
+ if not re.fullmatch(r"[a-zA-Z0-9][a-zA-Z0-9_-]{1,49}", alias):
103
+ raise CardError("profile.alias is not a valid pseudonym")
104
+
105
+ consent = profile.get("consent")
106
+ if not isinstance(consent, dict):
107
+ raise CardError("Profile lacks consent metadata")
108
+ if consent.get("state") != "public_profile_approved":
109
+ raise CardError("Profile lacks public-profile approval")
110
+
111
+ expires = profile.get("expires_on")
112
+ try:
113
+ expires_on = date.fromisoformat(expires)
114
+ except (TypeError, ValueError) as exc:
115
+ raise CardError("Profile has invalid expires_on") from exc
116
+ if expires_on < datetime.now(timezone.utc).date():
117
+ raise CardError(f"Profile expired on {expires_on.isoformat()}")
118
+
119
+ validate_vectors(
120
+ profile.get("stage_contributions"),
121
+ "stage_contributions",
122
+ STAGE_LABELS,
123
+ )
124
+ validate_vectors(
125
+ profile.get("functional_contributions"),
126
+ "functional_contributions",
127
+ FUNCTION_LABELS,
128
+ )
129
+
130
+ seeking = profile.get("seeking")
131
+ if not isinstance(seeking, dict):
132
+ raise CardError("Profile seeking section is invalid")
133
+ sought_stages = validate_dimension_list(
134
+ seeking.get("stages"),
135
+ "seeking.stages",
136
+ STAGE_LABELS,
137
+ maximum=3,
138
+ )
139
+ sought_functions = validate_dimension_list(
140
+ seeking.get("functions"),
141
+ "seeking.functions",
142
+ FUNCTION_LABELS,
143
+ maximum=8,
144
+ )
145
+ if not sought_stages and not sought_functions:
146
+ raise CardError(
147
+ "seeking must name at least one stage or functional capability"
148
+ )
149
+
150
+
151
+ def validate_vectors(
152
+ values: object,
153
+ field: str,
154
+ labels: dict[str, str],
155
+ ) -> None:
156
+ if not isinstance(values, dict):
157
+ raise CardError(f"{field} must be an object")
158
+ for name, entry in values.items():
159
+ if name not in labels or not isinstance(entry, dict):
160
+ raise CardError(f"{field} contains an unsupported vector")
161
+ score = entry.get("score")
162
+ if (
163
+ isinstance(score, bool)
164
+ or not isinstance(score, (int, float))
165
+ or not 0 <= score <= 100
166
+ ):
167
+ raise CardError(f"{field}.{name}.score must be between 0 and 100")
168
+ if entry.get("level") not in LEVELS:
169
+ raise CardError(f"{field}.{name}.level is invalid")
170
+ if entry.get("confidence") not in CONFIDENCES:
171
+ raise CardError(f"{field}.{name}.confidence is invalid")
172
+
173
+
174
+ def validate_dimension_list(
175
+ values: object,
176
+ field: str,
177
+ labels: dict[str, str],
178
+ *,
179
+ maximum: int,
180
+ ) -> list[str]:
181
+ if not isinstance(values, list) or len(values) > maximum:
182
+ raise CardError(f"{field} must contain at most {maximum} values")
183
+ output: list[str] = []
184
+ for value in values:
185
+ if value not in labels:
186
+ raise CardError(f"{field} contains an unsupported value")
187
+ safe_text(labels[value], field)
188
+ if value not in output:
189
+ output.append(value)
190
+ return output
191
+
192
+
193
+ def strongest_vectors(profile: dict, *, limit: int = 4) -> list[str]:
194
+ ranked: list[tuple[float, str, str]] = []
195
+ for section, labels in (
196
+ ("stage_contributions", STAGE_LABELS),
197
+ ("functional_contributions", FUNCTION_LABELS),
198
+ ):
199
+ for name, entry in profile[section].items():
200
+ if entry["level"] == "unknown":
201
+ continue
202
+ label = labels[name]
203
+ rendered = (
204
+ f"{label} — {entry['level']} "
205
+ f"({entry['confidence']} confidence)"
206
+ )
207
+ ranked.append((float(entry["score"]), label, rendered))
208
+ ranked.sort(key=lambda item: (-item[0], item[1]))
209
+ return [item[2] for item in ranked[:limit]]
210
+
211
+
212
+ def render_card(profile: dict) -> str:
213
+ validate_profile(profile)
214
+ alias = markdown_text(safe_text(profile["alias"], "profile.alias", maximum=50))
215
+ strengths = strongest_vectors(profile)
216
+ if not strengths:
217
+ strengths = ["evidence still limited"]
218
+
219
+ seeking = profile["seeking"]
220
+ sought = [
221
+ STAGE_LABELS[name]
222
+ for name in validate_dimension_list(
223
+ seeking["stages"],
224
+ "seeking.stages",
225
+ STAGE_LABELS,
226
+ maximum=3,
227
+ )
228
+ ]
229
+ sought.extend(
230
+ FUNCTION_LABELS[name]
231
+ for name in validate_dimension_list(
232
+ seeking["functions"],
233
+ "seeking.functions",
234
+ FUNCTION_LABELS,
235
+ maximum=8,
236
+ )
237
+ )
238
+ digest = hashlib.sha256(canonical_profile_bytes(profile)).hexdigest()
239
+
240
+ return "\n".join(
241
+ [
242
+ f"<!-- {CARD_MARKER} -->",
243
+ "> [!NOTE]",
244
+ f"> ### FindMate owner profile · `{alias}`",
245
+ ">",
246
+ "> **Demonstrated:** "
247
+ + " · ".join(markdown_text(value) for value in strengths),
248
+ ">",
249
+ "> **Seeking:** " + " · ".join(markdown_text(value) for value in sought),
250
+ ">",
251
+ f"> **Expires:** {profile['expires_on']}",
252
+ f"> **Canonical profile SHA-256:** `{digest}`",
253
+ ">",
254
+ "> Owner-approved collaboration hypothesis. No identity, contact "
255
+ "details, or raw evidence are included.",
256
+ ">",
257
+ f"> [Open FindMate protocol]({PROTOCOL_URL})",
258
+ "",
259
+ "_Local draft: share only after the owner approves this exact card._",
260
+ "",
261
+ ]
262
+ )
263
+
264
+
265
+ def write_card(path: Path, content: str) -> None:
266
+ path.parent.mkdir(parents=True, exist_ok=True)
267
+ if path.is_symlink():
268
+ raise CardError(f"Refusing to write through symlink: {path}")
269
+ flags = os.O_WRONLY | os.O_CREAT | os.O_TRUNC | getattr(os, "O_NOFOLLOW", 0)
270
+ fd = os.open(path, flags, 0o644)
271
+ with os.fdopen(fd, "w", encoding="utf-8") as handle:
272
+ os.fchmod(handle.fileno(), 0o644)
273
+ handle.write(content)
274
+
275
+
276
+ def parse_args() -> argparse.Namespace:
277
+ parser = argparse.ArgumentParser(
278
+ description=(
279
+ "Render a deterministic Markdown card draft from an already "
280
+ "owner-approved public FindMate profile."
281
+ )
282
+ )
283
+ parser.add_argument("profile", type=Path)
284
+ parser.add_argument(
285
+ "--output",
286
+ type=Path,
287
+ help="Write the local Markdown draft here; otherwise print to stdout.",
288
+ )
289
+ return parser.parse_args()
290
+
291
+
292
+ def main() -> int:
293
+ args = parse_args()
294
+ try:
295
+ content = render_card(load_profile(args.profile))
296
+ if args.output:
297
+ write_card(args.output, content)
298
+ else:
299
+ sys.stdout.write(content)
300
+ except CardError as exc:
301
+ print(f"error: {exc}", file=sys.stderr)
302
+ return 2
303
+ return 0
304
+
305
+
306
+ if __name__ == "__main__":
307
+ raise SystemExit(main())