opencode-skills-collection 4.0.35 → 4.0.37

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 (74) hide show
  1. package/bundled-skills/.antigravity-install-manifest.json +13 -1
  2. package/bundled-skills/agent-evaluation-reporting/SKILL.md +136 -0
  3. package/bundled-skills/agent-harness-fault-injection/SKILL.md +250 -0
  4. package/bundled-skills/anti-ui-slop/SKILL.md +115 -0
  5. package/bundled-skills/audit-agent-run-evidence/SKILL.md +165 -0
  6. package/bundled-skills/boost-asio-pro/SKILL.md +172 -0
  7. package/bundled-skills/boost-asio-pro/references/build.md +88 -0
  8. package/bundled-skills/boost-asio-pro/references/classic-boost.md +33 -0
  9. package/bundled-skills/boost-asio-pro/references/coroutines.md +415 -0
  10. package/bundled-skills/boost-asio-pro/references/pre-cpp20.md +164 -0
  11. package/bundled-skills/boost-asio-pro/references/ssl.md +38 -0
  12. package/bundled-skills/cross-platform-contract-propagation-audit/SKILL.md +159 -0
  13. package/bundled-skills/docs/integrations/jetski-cortex.md +3 -3
  14. package/bundled-skills/docs/integrations/jetski-gemini-loader/README.md +1 -1
  15. package/bundled-skills/docs/maintainers/repo-growth-seo.md +1 -1
  16. package/bundled-skills/docs/maintainers/skills-update-guide.md +1 -1
  17. package/bundled-skills/docs/users/aas-core.md +9 -1
  18. package/bundled-skills/docs/users/bundles.md +1 -1
  19. package/bundled-skills/docs/users/claude-code-skills.md +1 -1
  20. package/bundled-skills/docs/users/gemini-cli-skills.md +1 -1
  21. package/bundled-skills/docs/users/kiro-integration.md +1 -1
  22. package/bundled-skills/docs/users/usage.md +3 -3
  23. package/bundled-skills/docs/users/visual-guide.md +4 -4
  24. package/bundled-skills/dsh-deepread/SKILL.md +200 -0
  25. package/bundled-skills/liuguang-banlan-ui/SKILL.md +135 -0
  26. package/bundled-skills/liuguang-banlan-ui/assets/starter/favicon.svg +4 -0
  27. package/bundled-skills/liuguang-banlan-ui/assets/starter/index.html +32 -0
  28. package/bundled-skills/liuguang-banlan-ui/assets/starter/launcher.css +25 -0
  29. package/bundled-skills/liuguang-banlan-ui/assets/starter/obsidian/index.html +179 -0
  30. package/bundled-skills/liuguang-banlan-ui/assets/starter/obsidian/theme-config.js +105 -0
  31. package/bundled-skills/liuguang-banlan-ui/assets/starter/obsidian/theme.css +107 -0
  32. package/bundled-skills/liuguang-banlan-ui/assets/starter/opal/index.html +179 -0
  33. package/bundled-skills/liuguang-banlan-ui/assets/starter/opal/theme-config.js +105 -0
  34. package/bundled-skills/liuguang-banlan-ui/assets/starter/opal/theme.css +107 -0
  35. package/bundled-skills/liuguang-banlan-ui/assets/starter/shared/base.css +423 -0
  36. package/bundled-skills/liuguang-banlan-ui/assets/starter/shared/spectral-field.js +450 -0
  37. package/bundled-skills/liuguang-banlan-ui/assets/starter/shared/workbench.js +255 -0
  38. package/bundled-skills/liuguang-banlan-ui/references/style-contract.md +53 -0
  39. package/bundled-skills/liuguang-banlan-ui/references/verification.md +70 -0
  40. package/bundled-skills/liuguang-banlan-ui/scripts/measure_preview.py +144 -0
  41. package/bundled-skills/liuguang-banlan-ui/scripts/requirements.txt +2 -0
  42. package/bundled-skills/liuguang-banlan-ui/scripts/scaffold_template.py +43 -0
  43. package/bundled-skills/liuguang-banlan-ui/scripts/validate_manifest.py +173 -0
  44. package/bundled-skills/multi-source-search/SKILL.md +139 -0
  45. package/bundled-skills/multi-source-search/references/report-schema.md +47 -0
  46. package/bundled-skills/multi-source-search/scripts/validate_report.py +221 -0
  47. package/bundled-skills/review-multi-agent-orchestration/SKILL.md +201 -0
  48. package/bundled-skills/ui-slop-score/SKILL.md +80 -0
  49. package/bundled-skills/using-lwc/LICENSE +201 -0
  50. package/bundled-skills/using-lwc/README.md +926 -0
  51. package/bundled-skills/using-lwc/README.zh-CN.md +836 -0
  52. package/bundled-skills/using-lwc/SKILL.md +156 -0
  53. package/bundled-skills/using-lwc/agents/openai.yaml +4 -0
  54. package/bundled-skills/using-lwc/assets/global-purpose.md +17 -0
  55. package/bundled-skills/using-lwc/assets/global-schema.md +28 -0
  56. package/bundled-skills/using-lwc/references/active-memory.md +81 -0
  57. package/bundled-skills/using-lwc/references/agent-onboarding.md +84 -0
  58. package/bundled-skills/using-lwc/references/code-graph.md +60 -0
  59. package/bundled-skills/using-lwc/references/core-memory.md +51 -0
  60. package/bundled-skills/using-lwc/references/document-conversion.md +53 -0
  61. package/bundled-skills/using-lwc/references/document-graph.md +58 -0
  62. package/bundled-skills/using-lwc/references/llm-wiki.md +75 -0
  63. package/bundled-skills/using-lwc/references/memory-policy.md +551 -0
  64. package/bundled-skills/using-lwc/references/operations-manual.md +503 -0
  65. package/bundled-skills/using-lwc/references/recovery-maintenance.md +53 -0
  66. package/bundled-skills/using-lwc/references/strong-context.md +54 -0
  67. package/bundled-skills/using-lwc/references/trigger-playbook.md +53 -0
  68. package/bundled-skills/using-lwc/references/word-graph.md +45 -0
  69. package/bundled-skills/using-lwc/scripts/bootstrap.sh +359 -0
  70. package/bundled-skills/using-lwc/scripts/install-lwc.sh +172 -0
  71. package/bundled-skills/youtube-summarizer/SKILL.md +21 -7
  72. package/bundled-skills/youtube-summarizer/scripts/extract-transcript.py +45 -12
  73. package/package.json +3 -2
  74. package/skills_index.json +268 -0
@@ -0,0 +1,45 @@
1
+ # LWC Word Graph
2
+
3
+ ## Use when
4
+
5
+ Use the Word Graph in `lwc view` to discover shared terms that connect a bounded
6
+ sample of Wiki pages and sources. It is useful when a query finds several
7
+ documents and you need to see the vocabulary that links them before choosing
8
+ which documents to open.
9
+
10
+ ## Skip when
11
+
12
+ Skip it for a known page or source, an exhaustive corpus-wide term analysis, or
13
+ code structure. A displayed edge proves sampled term occurrence, not semantic
14
+ equivalence or causality.
15
+
16
+ ## Minimum workflow
17
+
18
+ 1. Run `lwc --scope project view` and open the Word Graph tab.
19
+ 2. Search with a focused query of at most eight searchable terms. The graph does
20
+ not load until a query is submitted.
21
+ 3. Inspect one result page at a time. The backend selects matching documents
22
+ through FTS first, then samples at most 25 documents, 30 terms, four passages
23
+ per document, 4 MiB of text, 200 nodes, and 500 edges. Larger requested limits
24
+ are clamped.
25
+ 4. Use Previous/Next for another bounded 25-document sample. Open the relevant
26
+ pages or sources to verify meaning before drawing conclusions.
27
+
28
+ Never request or render the entire vocabulary. Treat `has_more`, `truncated`,
29
+ `truncation_reasons`, `limits`, and `diagnostics` as part of the result rather
30
+ than as errors to bypass.
31
+
32
+ ## Consent boundaries
33
+
34
+ `lwc view` starts a local read-only HTTP server and normally opens a browser; use
35
+ `--no-open` when browser launch is unwanted. Word Graph queries do not enable a
36
+ graph engine, create a CodeGraph index, or mutate Wiki content.
37
+
38
+ ## Completion evidence
39
+
40
+ - The response records the query, enforced limits, sample diagnostics, and any
41
+ truncation reason.
42
+ - The visible documents and terms remain within the fixed bounds and pagination
43
+ is used instead of an all-corpus load.
44
+ - Important relationships are verified against the full page or source; shared
45
+ sampled words alone are not promoted to durable facts.
@@ -0,0 +1,359 @@
1
+ #!/bin/sh
2
+ set -eu
3
+
4
+ die() {
5
+ printf 'using-lwc bootstrap: %s\n' "$*" >&2
6
+ exit 1
7
+ }
8
+
9
+ need() {
10
+ command -v "$1" >/dev/null 2>&1 ||
11
+ die "required command not found: $1"
12
+ }
13
+
14
+ json_escape() {
15
+ printf '%s' "$1" |
16
+ awk 'BEGIN { first = 1 }
17
+ {
18
+ if (!first) printf "\\n"
19
+ first = 0
20
+ gsub(/\\/, "\\\\")
21
+ gsub(/"/, "\\\"")
22
+ gsub(/\t/, "\\t")
23
+ gsub(/\r/, "\\r")
24
+ gsub(/\f/, "\\f")
25
+ gsub(/\b/, "\\b")
26
+ printf "%s", $0
27
+ }'
28
+ }
29
+
30
+ supported_lwc_version() {
31
+ version_core="${1#lwc }"
32
+ version_core="${version_core%%[-+]*}"
33
+ old_ifs="$IFS"
34
+ IFS=.
35
+ set -- $version_core
36
+ IFS="$old_ifs"
37
+ [ "$#" -eq 3 ] || return 1
38
+ case "$1$2$3" in *[!0-9]*|'') return 1 ;; esac
39
+
40
+ [ "$1" -gt 0 ] || [ "$2" -ge 6 ]
41
+ }
42
+
43
+ # Version and capability probes prevent this Skill from driving an older CLI.
44
+ usable_lwc() {
45
+ candidate="$1"
46
+ candidate_version="$("$candidate" --version 2>/dev/null || true)"
47
+ printf '%s\n' "$candidate_version" |
48
+ grep -Eq '^lwc [0-9]+\.[0-9]+\.[0-9]+' || return 1
49
+ supported_lwc_version "$candidate_version" || return 1
50
+ "$candidate" init --help 2>&1 | grep -q -- '--scope' || return 1
51
+ "$candidate" --help 2>&1 | grep -q -- 'LWC_PROJECT_ROOT' || return 1
52
+ "$candidate" --help 2>&1 | grep -q -- '--changeset' || return 1
53
+ "$candidate" checkpoint --help >/dev/null 2>&1 || return 1
54
+ "$candidate" source add-manifest --help >/dev/null 2>&1 || return 1
55
+ "$candidate" source status --help >/dev/null 2>&1 || return 1
56
+ "$candidate" source diff --help >/dev/null 2>&1 || return 1
57
+ "$candidate" changeset --help >/dev/null 2>&1 || return 1
58
+ "$candidate" page put --help 2>&1 | grep -q -- '--provenance' || return 1
59
+ }
60
+
61
+ managed_lwc_path() {
62
+ for candidate in \
63
+ "$home_dir/.local/bin/lwc" \
64
+ "$home_dir/.local/bin/lwc.exe"; do
65
+ if [ -x "$candidate" ] && usable_lwc "$candidate"; then
66
+ printf '%s\n' "$candidate"
67
+ return 0
68
+ fi
69
+ done
70
+ return 1
71
+ }
72
+
73
+ add_evidence() {
74
+ if [ -n "$project_evidence" ]; then
75
+ project_evidence="${project_evidence},$1"
76
+ else
77
+ project_evidence="$1"
78
+ fi
79
+ }
80
+
81
+ is_excluded_root() {
82
+ if [ -n "${tmp_dir:-}" ]; then
83
+ case "$1" in
84
+ "$tmp_dir"|"$tmp_dir/"*) return 0 ;;
85
+ esac
86
+ fi
87
+
88
+ case "$1" in
89
+ /|/tmp|/tmp/*|/private/tmp|/private/tmp/*|\
90
+ /var/tmp|/var/tmp/*|/private/var/tmp|/private/var/tmp/*|\
91
+ "$home_dir"|\
92
+ "$home_dir/Downloads"|"$home_dir/Downloads/"*|\
93
+ "$home_dir/Desktop"|"$home_dir/Desktop/"*|\
94
+ "$home_dir/.cache"|"$home_dir/.cache/"*|\
95
+ "$home_dir/Library/Caches"|"$home_dir/Library/Caches/"*)
96
+ return 0
97
+ ;;
98
+ *)
99
+ return 1
100
+ ;;
101
+ esac
102
+ }
103
+
104
+ : "${HOME:?using-lwc bootstrap: HOME is not set}"
105
+ need dirname
106
+ need awk
107
+ need grep
108
+
109
+ skill_dir="$(
110
+ CDPATH= cd "$(dirname "$0")/.." >/dev/null 2>&1
111
+ pwd -P
112
+ )"
113
+ purpose_file="$skill_dir/assets/global-purpose.md"
114
+ schema_file="$skill_dir/assets/global-schema.md"
115
+ installer="$skill_dir/scripts/install-lwc.sh"
116
+ [ -f "$purpose_file" ] || die "missing $purpose_file"
117
+ [ -f "$schema_file" ] || die "missing $schema_file"
118
+ [ -f "$installer" ] || die "missing $installer"
119
+
120
+ home_dir="$(
121
+ CDPATH= cd "$HOME" >/dev/null 2>&1
122
+ pwd -P
123
+ )" || die "cannot resolve HOME"
124
+ cwd="$(pwd -P)"
125
+ project_boundary=""
126
+ if [ -n "${LWC_PROJECT_ROOT:-}" ]; then
127
+ [ -d "$LWC_PROJECT_ROOT" ] ||
128
+ die "LWC_PROJECT_ROOT is not a directory: $LWC_PROJECT_ROOT"
129
+ project_boundary="$(
130
+ CDPATH= cd "$LWC_PROJECT_ROOT" >/dev/null 2>&1
131
+ pwd -P
132
+ )" || die "cannot resolve LWC_PROJECT_ROOT"
133
+ case "$cwd" in
134
+ "$project_boundary"|"$project_boundary/"*) ;;
135
+ *) die "current directory is outside LWC_PROJECT_ROOT: $project_boundary" ;;
136
+ esac
137
+ fi
138
+ tmp_dir=""
139
+ if [ -d "${TMPDIR:-/tmp}" ]; then
140
+ tmp_dir="$(
141
+ CDPATH= cd "${TMPDIR:-/tmp}" >/dev/null 2>&1
142
+ pwd -P
143
+ )"
144
+ fi
145
+ if [ -n "$project_boundary" ] && is_excluded_root "$project_boundary"; then
146
+ die "LWC_PROJECT_ROOT is not a safe project root: $project_boundary"
147
+ fi
148
+
149
+ installed=false
150
+ global_initialized_now=false
151
+ suggest_global_init=false
152
+
153
+ case "${LWC_AUTO_INSTALL:-0}" in
154
+ 0|1) ;;
155
+ *) die "LWC_AUTO_INSTALL must be 0 or 1" ;;
156
+ esac
157
+ case "${LWC_GLOBAL_INIT:-0}" in
158
+ 0|1) ;;
159
+ *) die "LWC_GLOBAL_INIT must be 0 or 1" ;;
160
+ esac
161
+
162
+ lwc_path="$(command -v lwc 2>/dev/null || true)"
163
+ if [ -z "$lwc_path" ] || ! usable_lwc "$lwc_path"; then
164
+ managed_path="$(managed_lwc_path || true)"
165
+ if [ -n "$managed_path" ]; then
166
+ die "lwc is not on PATH; add $(dirname "$managed_path") to PATH and start a new Agent session"
167
+ fi
168
+ lwc_path=""
169
+ fi
170
+ if [ -z "$lwc_path" ]; then
171
+ [ "${LWC_AUTO_INSTALL:-0}" = 1 ] ||
172
+ die "compatible lwc not found; obtain explicit approval, then retry once with LWC_AUTO_INSTALL=1"
173
+ LWC_INSTALL_DIR="$home_dir/.local/bin" sh "$installer" >&2 ||
174
+ die "lwc installation failed"
175
+ lwc_path="$(command -v lwc 2>/dev/null || true)"
176
+ if [ -z "$lwc_path" ] || ! usable_lwc "$lwc_path"; then
177
+ managed_path="$(managed_lwc_path || true)"
178
+ [ -z "$managed_path" ] ||
179
+ die "lwc is not on PATH; add $(dirname "$managed_path") to PATH and start a new Agent session"
180
+ die "installed lwc failed its compatibility check"
181
+ fi
182
+ installed=true
183
+ fi
184
+
185
+ lwc_version="$("$lwc_path" --version)"
186
+ global_wiki="$home_dir/.lwc/wiki.db"
187
+ global_policy_state="$home_dir/.lwc/.using-lwc-bootstrap-v1"
188
+ apply_global_policy=false
189
+ if [ ! -f "$global_wiki" ]; then
190
+ if [ "${LWC_GLOBAL_INIT:-0}" = 1 ]; then
191
+ mkdir -p "$(dirname "$global_wiki")" ||
192
+ die "cannot create global memory directory"
193
+ printf 'pending\n' > "$global_policy_state" ||
194
+ die "cannot record global initialization state"
195
+ "$lwc_path" --scope global init >/dev/null ||
196
+ die "failed to initialize global memory"
197
+ [ -f "$global_wiki" ] || die "global initialization did not create $global_wiki"
198
+ apply_global_policy=true
199
+ else
200
+ suggest_global_init=true
201
+ fi
202
+ elif [ -f "$global_policy_state" ] &&
203
+ grep -qx 'pending' "$global_policy_state"; then
204
+ if [ "${LWC_GLOBAL_INIT:-0}" = 1 ]; then
205
+ apply_global_policy=true
206
+ else
207
+ suggest_global_init=true
208
+ fi
209
+ fi
210
+
211
+ if [ "$apply_global_policy" = true ]; then
212
+ "$lwc_path" --scope global purpose set "$purpose_file" >/dev/null ||
213
+ die "failed to set global memory purpose"
214
+ "$lwc_path" --scope global schema set "$schema_file" >/dev/null ||
215
+ die "failed to set global memory schema"
216
+ printf 'complete\n' > "$global_policy_state" ||
217
+ die "cannot complete global initialization state"
218
+ global_initialized_now=true
219
+ fi
220
+ global_initialized=false
221
+ [ -f "$global_wiki" ] && global_initialized=true
222
+
223
+ project_wiki=""
224
+ project_root=""
225
+ project_confidence="none"
226
+ project_evidence=""
227
+ suggest_project_init=false
228
+ scope_conflict=false
229
+ project_wiki_count=0
230
+
231
+ cursor="$cwd"
232
+ while :; do
233
+ if [ "$cursor" = "$home_dir" ]; then
234
+ break
235
+ fi
236
+ if [ -f "$cursor/.lwc/wiki.db" ]; then
237
+ project_wiki_count=$((project_wiki_count + 1))
238
+ if [ "$project_wiki_count" -eq 1 ]; then
239
+ project_wiki="$cursor/.lwc/wiki.db"
240
+ project_root="$cursor"
241
+ fi
242
+ if [ -z "$project_boundary" ]; then
243
+ break
244
+ fi
245
+ fi
246
+ if [ -n "$project_boundary" ] && [ "$cursor" = "$project_boundary" ]; then
247
+ break
248
+ fi
249
+ parent="$(dirname "$cursor")"
250
+ [ "$parent" != "$cursor" ] || break
251
+ cursor="$parent"
252
+ done
253
+
254
+ if [ "$project_wiki_count" -gt 1 ]; then
255
+ project_wiki=""
256
+ project_root="$project_boundary"
257
+ project_confidence="conflict"
258
+ project_evidence="multiple .lwc/wiki.db ancestors"
259
+ scope_conflict=true
260
+ elif [ "$project_wiki_count" -eq 1 ]; then
261
+ project_confidence="existing"
262
+ project_evidence=".lwc/wiki.db"
263
+ elif [ -z "$project_wiki" ]; then
264
+ weak_root=""
265
+ weak_evidence=""
266
+ cursor="$cwd"
267
+ while :; do
268
+ if [ "$cursor" = "$home_dir" ]; then
269
+ break
270
+ fi
271
+
272
+ if ! is_excluded_root "$cursor"; then
273
+ project_evidence=""
274
+ strong=false
275
+
276
+ if [ -e "$cursor/.git" ]; then
277
+ add_evidence ".git"
278
+ strong=true
279
+ fi
280
+
281
+ for marker in \
282
+ Cargo.toml package.json pyproject.toml go.mod pom.xml \
283
+ build.gradle build.gradle.kts Gemfile composer.json; do
284
+ if [ -f "$cursor/$marker" ]; then
285
+ add_evidence "$marker"
286
+ strong=true
287
+ fi
288
+ done
289
+
290
+ for marker_path in "$cursor"/*.sln "$cursor"/*.xcodeproj; do
291
+ if [ -e "$marker_path" ]; then
292
+ add_evidence "$(basename "$marker_path")"
293
+ strong=true
294
+ fi
295
+ done
296
+
297
+ if [ "$strong" = true ]; then
298
+ project_root="$cursor"
299
+ project_confidence="strong"
300
+ suggest_project_init=true
301
+ break
302
+ fi
303
+
304
+ readme=""
305
+ for readme_name in README.md README README.txt README.rst; do
306
+ if [ -f "$cursor/$readme_name" ]; then
307
+ readme="$readme_name"
308
+ break
309
+ fi
310
+ done
311
+ if [ -n "$readme" ]; then
312
+ for content_dir in src docs tests; do
313
+ if [ -d "$cursor/$content_dir" ]; then
314
+ if [ -z "$weak_root" ]; then
315
+ weak_root="$cursor"
316
+ weak_evidence="${readme},${content_dir}/"
317
+ fi
318
+ break
319
+ fi
320
+ done
321
+ fi
322
+ fi
323
+
324
+ if [ -n "$project_boundary" ] && [ "$cursor" = "$project_boundary" ]; then
325
+ break
326
+ fi
327
+ parent="$(dirname "$cursor")"
328
+ [ "$parent" != "$cursor" ] || break
329
+ cursor="$parent"
330
+ done
331
+
332
+ if [ -z "$project_root" ] && [ -n "$project_boundary" ]; then
333
+ project_root="$project_boundary"
334
+ project_confidence="authorized"
335
+ project_evidence="LWC_PROJECT_ROOT"
336
+ suggest_project_init=true
337
+ elif [ -z "$project_root" ] && [ -n "$weak_root" ]; then
338
+ project_root="$weak_root"
339
+ project_confidence="weak"
340
+ project_evidence="$weak_evidence"
341
+ fi
342
+ fi
343
+
344
+ printf '{'
345
+ printf '"lwc_path":"%s",' "$(json_escape "$lwc_path")"
346
+ printf '"lwc_version":"%s",' "$(json_escape "$lwc_version")"
347
+ printf '"installed":%s,' "$installed"
348
+ printf '"global_wiki":"%s",' "$(json_escape "$global_wiki")"
349
+ printf '"global_initialized":%s,' "$global_initialized"
350
+ printf '"global_initialized_now":%s,' "$global_initialized_now"
351
+ printf '"suggest_global_init":%s,' "$suggest_global_init"
352
+ printf '"project_boundary":"%s",' "$(json_escape "$project_boundary")"
353
+ printf '"project_wiki":"%s",' "$(json_escape "$project_wiki")"
354
+ printf '"project_root":"%s",' "$(json_escape "$project_root")"
355
+ printf '"project_confidence":"%s",' "$(json_escape "$project_confidence")"
356
+ printf '"project_evidence":"%s",' "$(json_escape "$project_evidence")"
357
+ printf '"suggest_project_init":%s,' "$suggest_project_init"
358
+ printf '"scope_conflict":%s' "$scope_conflict"
359
+ printf '}\n'
@@ -0,0 +1,172 @@
1
+ #!/bin/sh
2
+ set -eu
3
+
4
+ repository="JanYork/llm-wiki-cli"
5
+ version="0.14.7"
6
+ tag="v${version}"
7
+
8
+ die() {
9
+ printf 'lwc installer: %s\n' "$*" >&2
10
+ exit 1
11
+ }
12
+
13
+ need() {
14
+ command -v "$1" >/dev/null 2>&1 || die "Required command not found: $1"
15
+ }
16
+
17
+ need curl
18
+ need uname
19
+ need awk
20
+ need grep
21
+ need mktemp
22
+
23
+ case "$(uname -s)" in
24
+ Darwin)
25
+ platform="apple-darwin"
26
+ archive_extension="tar.gz"
27
+ binary_name="lwc"
28
+ ;;
29
+ Linux)
30
+ platform="unknown-linux-gnu"
31
+ archive_extension="tar.gz"
32
+ binary_name="lwc"
33
+ ;;
34
+ MINGW*|MSYS*|CYGWIN*)
35
+ platform="pc-windows-msvc"
36
+ archive_extension="zip"
37
+ binary_name="lwc.exe"
38
+ ;;
39
+ *)
40
+ die "Unsupported operating system: $(uname -s)"
41
+ ;;
42
+ esac
43
+
44
+ case "$(uname -m)" in
45
+ x86_64|amd64|AMD64)
46
+ architecture="x86_64"
47
+ ;;
48
+ arm64|aarch64|ARM64)
49
+ architecture="aarch64"
50
+ ;;
51
+ *)
52
+ die "Unsupported architecture: $(uname -m)"
53
+ ;;
54
+ esac
55
+
56
+ target="${architecture}-${platform}"
57
+ archive="lwc-${version}-${target}.${archive_extension}"
58
+ release_url="https://github.com/${repository}/releases/download/${tag}"
59
+
60
+ case "$archive" in
61
+ lwc-0.14.7-aarch64-apple-darwin.tar.gz)
62
+ expected_checksum="2bd22aed6246bfc7f25e73532928b0da40c08b827ba975afe05bd767053ad6fa"
63
+ ;;
64
+ lwc-0.14.7-x86_64-apple-darwin.tar.gz)
65
+ expected_checksum="50d9ebf3c4f4d895043b0db4fbcee6d8d62f40d67a00e288515d5b42044df21b"
66
+ ;;
67
+ lwc-0.14.7-aarch64-unknown-linux-gnu.tar.gz)
68
+ expected_checksum="6bed79a54293c8aa33006cfb2cc3ac233b82522c082d72d504a4daf37eeac18f"
69
+ ;;
70
+ lwc-0.14.7-x86_64-unknown-linux-gnu.tar.gz)
71
+ expected_checksum="ef66a515fa62958e53fb87b8a79bea59912c987fbadb732d028be29252822568"
72
+ ;;
73
+ lwc-0.14.7-aarch64-pc-windows-msvc.zip)
74
+ expected_checksum="cb69ca0752daeacaef52ae544f2b11425392b00002d6975db7f6804b1915707c"
75
+ ;;
76
+ lwc-0.14.7-x86_64-pc-windows-msvc.zip)
77
+ expected_checksum="d973eeb84e018b19e0d41379f3afb60132b39a36fb29f0691ed99d9fd737fdfb"
78
+ ;;
79
+ *)
80
+ die "No reviewed checksum is pinned for $archive"
81
+ ;;
82
+ esac
83
+
84
+ if [ -n "${LWC_INSTALL_DIR:-}" ]; then
85
+ install_dir="$LWC_INSTALL_DIR"
86
+ else
87
+ existing="$(command -v lwc 2>/dev/null || true)"
88
+ case "$existing" in
89
+ "$HOME/.local/bin/lwc"|"$HOME/.local/bin/lwc.exe"|\
90
+ "$HOME/.cargo/bin/lwc"|"$HOME/.cargo/bin/lwc.exe")
91
+ install_dir="$(dirname "$existing")"
92
+ ;;
93
+ *)
94
+ install_dir="$HOME/.local/bin"
95
+ ;;
96
+ esac
97
+ fi
98
+
99
+ destination="${install_dir}/${binary_name}"
100
+ if [ -x "$destination" ]; then
101
+ current_version="$("$destination" --version 2>/dev/null || true)"
102
+ if [ "$current_version" = "lwc ${version}" ]; then
103
+ printf 'lwc %s is already installed at %s\n' "$version" "$destination"
104
+ exit 0
105
+ fi
106
+ action="Updated"
107
+ else
108
+ action="Installed"
109
+ fi
110
+
111
+ case "$archive_extension" in
112
+ tar.gz) need tar ;;
113
+ zip) need unzip ;;
114
+ esac
115
+
116
+ work_dir="$(mktemp -d "${TMPDIR:-/tmp}/lwc-install.XXXXXX")" ||
117
+ die "Could not create a temporary directory"
118
+ staged_binary=""
119
+ cleanup() {
120
+ [ -z "$staged_binary" ] || rm -f "$staged_binary"
121
+ rm -rf "$work_dir"
122
+ }
123
+ trap cleanup 0
124
+ trap 'exit 1' HUP INT TERM
125
+
126
+ curl -fsSL "$release_url/$archive" -o "$work_dir/$archive" ||
127
+ die "Could not download $archive"
128
+
129
+ if command -v sha256sum >/dev/null 2>&1; then
130
+ actual_checksum="$(sha256sum "$work_dir/$archive" | awk '{ print $1 }')"
131
+ elif command -v shasum >/dev/null 2>&1; then
132
+ actual_checksum="$(shasum -a 256 "$work_dir/$archive" | awk '{ print $1 }')"
133
+ elif command -v openssl >/dev/null 2>&1; then
134
+ actual_checksum="$(openssl dgst -sha256 "$work_dir/$archive" | awk '{ print $NF }')"
135
+ else
136
+ die "No SHA-256 tool found (sha256sum, shasum, or openssl)"
137
+ fi
138
+
139
+ expected_checksum="$(printf '%s' "$expected_checksum" | tr '[:upper:]' '[:lower:]')"
140
+ actual_checksum="$(printf '%s' "$actual_checksum" | tr '[:upper:]' '[:lower:]')"
141
+ [ "$actual_checksum" = "$expected_checksum" ] ||
142
+ die "Checksum verification failed for $archive"
143
+
144
+ case "$archive_extension" in
145
+ tar.gz)
146
+ tar -xzf "$work_dir/$archive" -C "$work_dir"
147
+ ;;
148
+ zip)
149
+ unzip -q "$work_dir/$archive" -d "$work_dir"
150
+ ;;
151
+ esac
152
+
153
+ downloaded_binary="$work_dir/lwc-${version}-${target}/${binary_name}"
154
+ [ -f "$downloaded_binary" ] || die "Release archive does not contain $binary_name"
155
+ chmod +x "$downloaded_binary"
156
+ [ "$("$downloaded_binary" --version 2>/dev/null || true)" = "lwc ${version}" ] ||
157
+ die "Downloaded binary failed its version check"
158
+
159
+ mkdir -p "$install_dir"
160
+ [ -w "$install_dir" ] || die "Install directory is not writable: $install_dir"
161
+
162
+ staged_binary="$install_dir/.lwc.install.$$"
163
+ cp "$downloaded_binary" "$staged_binary"
164
+ chmod +x "$staged_binary"
165
+ mv -f "$staged_binary" "$destination"
166
+ staged_binary=""
167
+
168
+ printf '%s lwc %s at %s\n' "$action" "$version" "$destination"
169
+ case ":${PATH}:" in
170
+ *":${install_dir}:"*) ;;
171
+ *) printf 'Add %s to PATH to run lwc directly.\n' "$install_dir" ;;
172
+ esac
@@ -157,11 +157,18 @@ echo "[████████░░░░░░░░░░░░] 40% - Step
157
157
  from youtube_transcript_api import YouTubeTranscriptApi, TranscriptsDisabled, NoTranscriptFound
158
158
  import sys
159
159
 
160
+ # youtube-transcript-api 1.0 replaced the get_transcript/list_transcripts class
161
+ # methods with an instance API. Support both versions.
162
+ _legacy = hasattr(YouTubeTranscriptApi, 'get_transcript')
163
+
160
164
  video_id = sys.argv[1]
161
165
 
162
166
  try:
163
167
  # Get list of available transcripts
164
- transcript_list = YouTubeTranscriptApi.list_transcripts(video_id)
168
+ if _legacy:
169
+ transcript_list = YouTubeTranscriptApi.list_transcripts(video_id)
170
+ else:
171
+ transcript_list = YouTubeTranscriptApi().list(video_id)
165
172
 
166
173
  print(f"✅ Video accessible: {video_id}")
167
174
  print("📝 Available transcripts:")
@@ -207,22 +214,29 @@ echo "[████████████░░░░░░░░] 60% - Step
207
214
  ```python
208
215
  from youtube_transcript_api import YouTubeTranscriptApi
209
216
 
217
+ # youtube-transcript-api 1.0 replaced the get_transcript/list_transcripts class
218
+ # methods with an instance API. Support both versions.
219
+ _legacy = hasattr(YouTubeTranscriptApi, 'get_transcript')
220
+
210
221
  video_id = "VIDEO_ID"
211
222
 
212
223
  try:
213
224
  # Try to get transcript in user's preferred language first
214
225
  # Fall back to English if not available
215
- transcript = YouTubeTranscriptApi.get_transcript(
216
- video_id,
217
- languages=['pt', 'en'] # Prefer Portuguese, fallback to English
218
- )
226
+ languages = ['pt', 'en'] # Prefer Portuguese, fallback to English
227
+ if _legacy:
228
+ transcript = YouTubeTranscriptApi.get_transcript(video_id, languages=languages)
229
+ else:
230
+ transcript = YouTubeTranscriptApi().fetch(video_id, languages=languages).to_raw_data()
219
231
 
220
232
  # Combine transcript segments into full text
221
233
  full_text = " ".join([entry['text'] for entry in transcript])
222
234
 
223
235
  # Get video metadata
224
- from youtube_transcript_api import YouTubeTranscriptApi
225
- transcript_list = YouTubeTranscriptApi.list_transcripts(video_id)
236
+ if _legacy:
237
+ transcript_list = YouTubeTranscriptApi.list_transcripts(video_id)
238
+ else:
239
+ transcript_list = YouTubeTranscriptApi().list(video_id)
226
240
 
227
241
  print("✅ Transcript extracted successfully")
228
242
  print(f"📊 Transcript length: {len(full_text)} characters")