feat(vendor): add forge charm skills

Amolith created

Vendor alxxpersonal/forge as a git subtree under vendor/forge/, symlink
the 14 charm-* skills into skills/, and add:

- vendor/sources: tab-separated manifest of vendored repos
- scripts/vendor-update.fish: pulls updates for all or named vendors

Change summary

scripts/vendor-update.fish | 82 ++++++++++++++++++++++++++++++++++++++++
skills/charm-bubbles       |  1 
skills/charm-bubbletea     |  1 
skills/charm-ecosystem     |  1 
skills/charm-fang          |  1 
skills/charm-freeze        |  1 
skills/charm-glamour       |  1 
skills/charm-glow          |  1 
skills/charm-gum           |  1 
skills/charm-harmonica     |  1 
skills/charm-huh           |  1 
skills/charm-lipgloss      |  1 
skills/charm-pop           |  1 
skills/charm-ultraviolet   |  1 
skills/charm-vhs           |  1 
vendor/sources             |  4 +
16 files changed, 100 insertions(+)

Detailed changes

scripts/vendor-update.fish 🔗

@@ -0,0 +1,82 @@
+#!/usr/bin/env fish
+#
+# Update git-subtree-vendored repositories listed in vendor/sources.
+#
+# vendor/sources format (tab-separated):
+#   name	url	branch
+#
+# Lines starting with # are ignored.
+#
+# Usage:
+#   scripts/vendor-update.fish           # update all vendored repos
+#   scripts/vendor-update.fish forge     # update only vendor/forge
+
+set repo_root (git -C (status dirname) rev-parse --show-toplevel)
+
+if test $status -ne 0
+    echo "error: not inside a git repository" >&2
+    exit 1
+end
+
+cd $repo_root
+
+set sources_file vendor/sources
+
+if not test -f $sources_file
+    echo "error: $sources_file not found" >&2
+    exit 1
+end
+
+set filter $argv
+set failed 0
+set found 0
+
+while read -l line
+    # Skip comments and blank lines
+    string match -qr '^\s*#' -- $line; and continue
+    string match -qr '^\s*$' -- $line; and continue
+
+    set parts (string split \t -- $line)
+    if test (count $parts) -ne 3
+        echo "skip: malformed line: $line" >&2
+        set failed (math $failed + 1)
+        continue
+    end
+
+    set name $parts[1]
+    set url $parts[2]
+    set branch $parts[3]
+
+    # If specific targets were given, skip non-matching entries
+    if test (count $filter) -gt 0
+        contains $name $filter; or continue
+    end
+
+    set found (math $found + 1)
+
+    if not test -d vendor/$name
+        echo "skip: vendor/$name does not exist (run 'git subtree add' first)" >&2
+        set failed (math $failed + 1)
+        continue
+    end
+
+    echo ":: updating vendor/$name from $url ($branch)"
+    git subtree pull --prefix=vendor/$name $url $branch --squash
+    if test $status -ne 0
+        echo "error: failed to update vendor/$name" >&2
+        set failed (math $failed + 1)
+    else
+        echo ":: vendor/$name updated"
+    end
+    echo
+end <$sources_file
+
+if test $found -eq 0
+    echo "No matching vendored repos found." >&2
+    exit 1
+end
+
+if test $failed -gt 0
+    echo "$failed vendor update(s) failed" >&2
+    exit 1
+end

vendor/sources 🔗

@@ -0,0 +1,4 @@
+# Vendored git subtree sources
+# Format: name<TAB>url<TAB>branch
+# One entry per line. Lines starting with # are ignored.
+forge	https://github.com/alxxpersonal/forge.git	main