Skip to content
Back to skills

Sync Team Profiles

ASecurity

Fetch (or refresh) registered team-profile sources — git clone on first run, shallow git fetch + reset on subsequent runs — and register discovered profiles under a namespace. TRIGGER when the user says "sync team profiles", "pull the latest team profiles", "refresh team profiles", "update team profiles", "sync from <team-name> profile source", "fetch profiles from the team repo", "/nyann:sync-team-profiles". Do NOT trigger on "add a new team profile source" (that's `add-team-source` — regist...

  • 6 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added May 26, 2026
developmentgitbackend

Security analysis

A100/100

Scanned May 27, 2026

npx -y skills add thettwe/nyann --skill sync-team-profiles --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Sync Team Profiles?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Sync Team Profiles
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/thettwe-sync-team-profiles/badge)](https://www.skillsdirectory.com/skills/thettwe-sync-team-profiles)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: sync-team-profiles
description: >
  Fetch (or refresh) registered team-profile sources — git clone on
  first run, shallow git fetch + reset on subsequent runs — and
  register discovered profiles under a namespace.
  TRIGGER when the user says "sync team profiles", "pull the latest
  team profiles", "refresh team profiles", "update team profiles",
  "sync from <team-name> profile source", "fetch profiles from the
  team repo", "/nyann:sync-team-profiles".
  Do NOT trigger on "add a new team profile source" (that's
  `add-team-source` — registers without pulling). Do NOT trigger on
  "sync my branch" (that's the `sync` skill — feature-branch
  rebase/merge). Do NOT trigger on "install a profile" from a URL
  when no source is registered yet — walk the user through
  `add-team-source` first.
---

# sync-team-profiles

Wraps `bin/sync-team-profiles.sh`.
On first run it shallow-clones each registered team-profile source
(`git clone --depth=1`); on subsequent runs it does a shallow fetch
(`git fetch --depth=1`) and `git reset --hard FETCH_HEAD` to advance
to the latest commit. Every profile under the cache is then validated
against `profiles/_schema.json`, and valid profiles are registered
under `<source-name>/<profile-name>`.

## 1. Pre-flight

- Config at `~/.claude/nyann/config.json` must have at least one
  entry in `team_profile_sources[]`. If empty, route to
  `add-team-source` first.
- Uses the sync interval from each source. When the user says
  "force refresh" / "ignore the interval" / "pull now", pass
  `--force`.
- When the user names a specific source ("sync just the platform-
  team profiles"), pass `--name <source>` so unrelated sources
  don't get pulled.

## 2. Invoke

```
bin/sync-team-profiles.sh \
  [--user-root <dir>] \
  [--force] \
  [--name <source>]
```

Network operation. Expect up to a few seconds per source. The
backend is resilient — a failing source logs the error and moves
on to the next.

## 3. Interpret the JSON summary

Top-level shape is four arrays (see `schemas/team-sync-result.schema.json`):

- `synced[]` — sources that pulled this run. Each entry: `{name, synced_at}`.
- `skipped[]` — sources within their interval window. Each entry:
  `{name, reason: "within-interval", next_due}`. Tell the user the
  next-due timestamp; they can re-run with `--force` if they need
  to pull immediately.
- `registered[]` — every profile that passed schema validation.
  Each entry: `{source, name, namespaced, path}`. The `namespaced`
  field is what to use with `bootstrap-project --profile <namespaced>`.
- `invalid[]` — anything that didn't make it through (fetch
  failure, clone failure, hand-edited config with a bad ref/url,
  TOCTOU on the cache dir, profile that fails schema validation).
  Each entry: `{name|source, kind, error}` where `kind` is one of
  `invalid-name`, `invalid-ref`, `invalid-url`, `fetch-failed`,
  `clone-failed`, `toctou`, `invalid-schema`. Show these but don't
  treat any single one as fatal — the script logs and moves on to
  the next source.

## 4. After sync

- Tell the user how many profiles are newly available.
- Suggest `inspect-profile <source>/<name>` to see what a specific
  team profile does.
- Suggest `bootstrap-project --profile <source>/<name>` to apply
  one to a repo.

## 5. When a source errors

- `git clone` / `git fetch` failures are usually auth or network
  issues and surface in `invalid[]` with `kind: clone-failed` or
  `fetch-failed`. The error string passes through `nyann::redact_url`
  before reaching the JSON, so any embedded `https://<token>@host`
  credentials are scrubbed — safe to relay verbatim. Don't try to
  auth-fix on the user's behalf.
- Corrupted cache (`<user-root>/cache/<source>/` contains partial
  data) — safe to delete the cache dir and re-run. Confirm before
  deleting; it's a file-system mutation.

## When to hand off

- "Add a new source" → `add-team-source`.
- "My team profile collides with a starter profile" — by design,
  user + team profiles can shadow starters. Clarify which version
  will win (user > team > starter) and let the user decide if the
  shadow is intentional.
- "Drift detection: is my cached team profile out of sync with the
  remote?" → that's `check-team-drift` (separate backend; not in
  this skill's scope).

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.