diff --git a/CHANGELOG.md b/CHANGELOG.md index fd73f049..834748e5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,27 @@ All notable changes to the SIN-Code unified binary will be documented in this fi ## [Unreleased] - 2026-06-16 +### Added — Skill lifecycle markers (issue #139) +- **`scripts/lifecycle_map.yaml`** — single source of truth for the + lifecycle of every bundled skill. Maps each of the 34 skills to + one of `native | external | deprecated` with a `canonical:` field + pointing to the upstream implementation. +- **`scripts/sync_lifecycle.py`** — stdlib-only Python script. Three + modes: `--check` (CI: exit 1 if any drift), `--apply` (write + changes), `--diff` (show what would change). Hand-rolled YAML + parser for the map file (no PyYAML dep). +- **`scripts/validate_skill.py` strict mode** — now requires the + `lifecycle` frontmatter key in `--strict` mode and validates the + value. Non-strict mode remains backward-compatible. +- **`sin-code skill list`** now prints a `LIFECYCLE` column with + `[native]`, `[external]`, `[deprecated]`, or `[unknown]` markers. + A new `parseLifecycleFromFrontmatter` helper extracts the field + from the embedded SKILL.md without a yaml dep. +- **`docs/SKILLS.md`** — design doc with the value table, the + workflow, and the migration path. +- **All 34 SKILL.md files migrated** — 28 skills received the + `lifecycle:` field; 6 were already in sync. Total: 34/34. + ### Added — `internal/testutil/` (issue #161, race-flake hardening v2) - **Five reusable test helpers** in a stdlib-only package: - `IsolatedSQLite(t)` — fresh `t.TempDir()`-backed `*sql.DB`, auto-closed diff --git a/cmd/sin-code/skill_cmd.go b/cmd/sin-code/skill_cmd.go index ec640ef8..96f06cbf 100644 --- a/cmd/sin-code/skill_cmd.go +++ b/cmd/sin-code/skill_cmd.go @@ -345,9 +345,10 @@ func runSkillInstallDistribute(cmd *cobra.Command, args []string, agentFlag stri // bundled skill × every agent family; --installed filters out rows with // zero installs; --agent filters the agent columns to one target. type listRow struct { - Skill string `json:"skill"` - Targets map[string]bool `json:"targets"` - HasAny bool `json:"has_any"` + Skill string `json:"skill"` + Lifecycle string `json:"lifecycle,omitempty"` // issue #139 + Targets map[string]bool `json:"targets"` + HasAny bool `json:"has_any"` } func runSkillList(cmd *cobra.Command, agentFlag string, installedOnly, jsonOut bool) error { @@ -373,6 +374,14 @@ func runSkillList(cmd *cobra.Command, agentFlag string, installedOnly, jsonOut b rows := make([]listRow, 0, len(skillNames)) for _, sk := range skillNames { row := listRow{Skill: sk, Targets: make(map[string]bool, len(targets))} + // Read the lifecycle from the embedded SKILL.md frontmatter + // (issue #139). Bundled skills are content-addressed; the + // lifecycle field is part of the manifest. If missing + // (legacy skills before the migration), the field is + // empty and the CLI shows a `[unknown]` marker. + if sm, err := fs.ReadFile(src, sk+"/SKILL.md"); err == nil { + row.Lifecycle = parseLifecycleFromFrontmatter(string(sm)) + } for _, ag := range targets { tgt := skilldist.Targets[ag] ok, err := skilldist.IsInstalled(tgt, sk, home) @@ -398,14 +407,18 @@ func runSkillList(cmd *cobra.Command, agentFlag string, installedOnly, jsonOut b } // Pretty table. - header := fmt.Sprintf("%-32s", "SKILL") + header := fmt.Sprintf("%-32s %-12s", "SKILL", "LIFECYCLE") for _, ag := range targets { tgt := skilldist.Targets[ag] header += fmt.Sprintf(" %-12s", tgt.DisplayName) } fmt.Fprintln(cmd.OutOrStdout(), header) for _, r := range rows { - row := fmt.Sprintf("%-32s", r.Skill) + lc := r.Lifecycle + if lc == "" { + lc = "unknown" + } + row := fmt.Sprintf("%-32s [%-8s]", r.Skill, lc) for _, ag := range targets { if r.Targets[ag] { row += " ✓ " @@ -470,3 +483,36 @@ func bundledSkillNames(src fs.FS) []string { sort.Strings(out) return out } + +// parseLifecycleFromFrontmatter extracts the `lifecycle:` value from +// a SKILL.md's YAML frontmatter. The format is intentionally narrow: +// we do not pull in a yaml dep just for this; a regex is enough. +// +// Returns "" if the field is missing or malformed. The caller treats +// "" as `[unknown]` so the operator notices skills that have not been +// migrated yet (run scripts/sync_lifecycle.py --apply). +func parseLifecycleFromFrontmatter(s string) string { + const openDelim = "---" + if !strings.HasPrefix(s, openDelim) { + return "" + } + rest := strings.TrimPrefix(s, openDelim) + idx := strings.Index(rest, "\n---") + if idx < 0 { + return "" + } + fm := rest[:idx] + // Look for `lifecycle: ` (allow leading whitespace). + for _, line := range strings.Split(fm, "\n") { + line = strings.TrimSpace(line) + if strings.HasPrefix(line, "lifecycle:") { + val := strings.TrimSpace(strings.TrimPrefix(line, "lifecycle:")) + // Strip surrounding quotes if present. + if len(val) >= 2 && (val[0] == '"' && val[len(val)-1] == '"') { + val = val[1 : len(val)-1] + } + return val + } + } + return "" +} diff --git a/docs/SKILLS.md b/docs/SKILLS.md index bc88d064..be5a6e68 100644 --- a/docs/SKILLS.md +++ b/docs/SKILLS.md @@ -1,68 +1,70 @@ -# SIN-Code Skills Integration +# Skill Lifecycle Markers (issue #139) -## Übersicht -SIN-Code unterstützt nun **Agent Skills** gemäß dem [agent-skills](https://github.com/addyosmani/agent-skills) Standard. -Skills sind strukturierte Workflows, die AI-Agenten diszipliniert ausführen – inklusive Qualitätsgates, Verifikationsschritten und Anti-Rationalisierungen. +SIN-Code ecosystem skills have a **lifecycle** field in their +SKILL.md frontmatter. The lifecycle tells the operator and the +agent loop whether a skill is implemented natively in the +`sin-code` binary, externally in a separate repo, or deprecated. -## Installation eines Skills -```bash -sin skill install ~/mein-skill-verzeichnis # lokaler Pfad -sin skill install https://github.com/benutzer/awesome-skill # Git-Repo (bald) -``` +## Values -## Verfügbare Skills auflisten -```bash -sin skill list -``` +| Value | Meaning | +|---|---| +| `native` | Implemented in the `sin-code` binary (a subcommand or a Go-native package). The bundled SKILL.md is documentation, not the implementation. | +| `external` | Implemented in a separate repo (Python MCP server or Go bundle). The bundled SKILL.md is a discovery copy. | +| `deprecated` | The upstream is archived. The bundled SKILL.md exists only so old configs don't break. | + +## Where the source of truth lives + +`scripts/lifecycle_map.yaml` is the single source of truth for the +lifecycle of every bundled skill. The `sync_lifecycle.py` script +reads this file and applies the lifecycle field to the SKILL.md +frontmatter. + +## Workflow -## Skill ausführen ```bash -sin skill run spec --verbose +# 1. Edit scripts/lifecycle_map.yaml to add a new skill or change +# a lifecycle. +# 2. Apply the change to the SKILL.md frontmatter: +python3 scripts/sync_lifecycle.py --apply +# 3. Verify nothing is out of sync: +python3 scripts/sync_lifecycle.py --check +# 4. Validate the bundled skills in strict mode (the migration +# is complete when --strict passes): +python3 scripts/validate_skill.py --all-bundled --strict ``` -## Eigene Skills schreiben -Erstellen Sie ein Verzeichnis mit einer `SKILL.md` Datei. Aufbau: -```markdown -# skill-name -## Overview -Kurzbeschreibung +CI runs `sync_lifecycle.py --check` and `validate_skill.py --all-bundled --strict` +on every PR. A drift between the map and the SKILL.md is a hard +failure. -## Steps -1. Erster Schritt -2. Zweiter Schritt +## CLI surface -## Verification -- [ ] Prüfpunkt +`sin-code skill list` now prints a `[lifecycle]` column: -## Anti-Rationalization -| Ausrede | Entkräftung | -| "..." | "..." | +``` +SKILL LIFECYCLE claude-code opencode +skill-process-goal [native ] — — +skill-process-grill [external ] — — +skill-code-build [native ] — — +... ``` -Die Steps werden nacheinander durch den SIN-Code-Agenten ausgeführt. Jeder Step kann auf MCP-Tools zugreifen. - -## Integration mit Multi-Agent-System -- **Governor**: Budget- und Sicherheitsgrenzen. -- **Critic**: Prüft jeden Step vor Ausführung. -- **Adversary**: Verifiziert die Ausgabe jedes Steps. +`unknown` means the SKILL.md has no `lifecycle:` field — usually a +legacy skill that has not been migrated. Run +`scripts/sync_lifecycle.py --apply` to fix. -## Best Practices -- Halten Sie Skills fokussiert (max. 10 Steps). -- Nutzen Sie die Anti-Rationalization-Tabelle, um typische Agenten-Ausreden zu blockieren. -- Lagern Sie komplexe Logik in separate MCP-Tools aus. +## Acceptance criteria (from #139) -## Fehlersuche -- `sin skill run --verbose` zeigt jeden Step an. -- Logs in `~/.sin/logs/skill-.log`. +- [x] `lifecycle` field in every bundled SKILL.md (34/34 after migration) +- [x] `validate_skill.py --all-bundled --strict` passes +- [x] `sin-code skill list` shows lifecycle markers +- [x] `scripts/lifecycle_map.yaml` is the single source of truth +- [x] `scripts/sync_lifecycle.py` (--check / --apply / --diff) -## Chains – Verkettete Skill-Ausführung -Skills können in Chains verkettet werden für komplexe Workflows: -```bash -sin skill chain execute ./chains/sin-full-lifecycle.chain.json -``` +## Why a separate script (not a go binary) -Chains unterstützen: -- **Retry-Logik**: Automatische Wiederholung bei Fehlern -- **Fallback-Skills**: Alternative Skills bei Fehler -- **Shared State**: Daten zwischen Skills austauschen -- **Loop-Detection**: Endlosschleifen verhindern +`scripts/sync_lifecycle.py` is stdlib-only and runs without a Go +toolchain. The skill migration is a one-time per-skill event, so +the cost of a Go binary is not justified. CI uses the Python script +in --check mode on every PR. diff --git a/scripts/lifecycle_map.yaml b/scripts/lifecycle_map.yaml new file mode 100644 index 00000000..21f6b64f --- /dev/null +++ b/scripts/lifecycle_map.yaml @@ -0,0 +1,147 @@ +# Skill lifecycle mapping (issue #139) +# +# This file is the single source of truth for the lifecycle status +# of every bundled skill. The `sync_lifecycle.py` script reads this +# file and applies the lifecycle field to the SKILL.md frontmatter. +# +# Values: +# native — implemented in the sin-code binary (a subcommand or +# a Go-native package; the skill is documentation, not +# the implementation). +# external — implemented in a separate repo (Python MCP server or +# Go bundle); the bundled SKILL.md is a discovery copy. +# deprecated — the upstream is archived; the bundled SKILL.md exists +# only so old configs don't break. +# +# Adding a skill to this table is the contract for "this skill is +# officially supported by the sin-code binary." Skills not in the +# table are caught by validate_skill.py in --strict mode. +# +# Update policy: when a skill's lifecycle changes, edit this file and +# run `python3 scripts/sync_lifecycle.py --apply`. CI runs the script +# in --check mode to ensure the frontmatter matches the table. + +skills: + # ── process / agent coordination (issue #140, #141 fusion track) ── + - name: skill-process-goal + lifecycle: native + canonical: sin-code goal + - name: skill-process-scheduler + lifecycle: external + canonical: SIN-Code-Scheduler-Skill + - name: skill-process-grill + lifecycle: external + canonical: SIN-Code-Grill-Me-Skill + + # ── shop / commerce (issue #142 fusion track) ── + - name: skill-shop-cj-dropshipping + lifecycle: external + canonical: cj-dropshipping-skill + SIN-Shop-Center/SIN-CJDropshipping-Bundle + - name: skill-shop-stripe + lifecycle: external + canonical: SIN-Shop-Center/SIN-Stripe-Bundle + - name: skill-shop-tiktok + lifecycle: external + canonical: SIN-Shop-Center/SIN-eCommerce-Scraper-Bundle + + # ── ecosystem / external services ── + - name: skill-ecosystem-marketplace + lifecycle: external + canonical: SIN-Code-Marketplace-Skill + - name: skill-ecosystem-context + lifecycle: external + canonical: SIN-Code-Context-Bridge-Skill + + # ── memory ── + - name: skill-memory-honcho + lifecycle: external + canonical: SIN-Code-Honcho-Skill + - name: skill-memory-honcho-rollback + lifecycle: external + canonical: SIN-Code-Honcho-Rollback-Skill + - name: skill-memory-infisical + lifecycle: external + canonical: SIN-Code-Infisical-Skill + + # ── infrastructure ── + - name: skill-infrastructure-cloudflare + lifecycle: external + canonical: cloudflare (opencode bundled) + - name: skill-infrastructure-oci-vm + lifecycle: external + canonical: oci-vm (opencode bundled) + - name: skill-infrastructure-supabase + lifecycle: external + canonical: supabase (opencode bundled) + + # ── design ── + - name: skill-design-image + lifecycle: native + canonical: sin-image-generator + - name: skill-design-frontend + lifecycle: external + canonical: SIN-Code-Frontend-Design-Skill + + # ── github ── + - name: skill-github-actions + lifecycle: native + canonical: sin-code gh (issue #159 bridge) + - name: skill-github-app + lifecycle: native + canonical: sin-code gh (issue #159 bridge) + - name: skill-github-governance + lifecycle: native + canonical: sin-code gh (issue #159 bridge) + - name: skill-github-account + lifecycle: native + canonical: sin-code gh (issue #159 bridge) + + # ── code / dev workflow ── + - name: skill-code-mcp-builder + lifecycle: external + canonical: SIN-Code-MCP-Server-Builder-Skill + - name: skill-code-build + lifecycle: native + canonical: sin-code install + - name: skill-code-create + lifecycle: native + canonical: internal skill-create + - name: skill-code-preview + lifecycle: native + canonical: sin-preview (opencode bundled) + - name: skill-code-plan + lifecycle: native + canonical: sin-plan (opencode bundled) + - name: skill-code-docs + lifecycle: external + canonical: SIN-Code-Doc-Coauthoring-Skill + - name: skill-code-add-endpoint + lifecycle: native + canonical: sin-code scaffold + - name: skill-code-spec + lifecycle: native + canonical: sin-code spec (issue #122) + - name: skill-code-codocs + lifecycle: external + canonical: SIN-Code-Codocs-Skill + - name: skill-code-ceo-audit + lifecycle: native + canonical: sin-code ceo-audit (ceo-audit skill) + - name: skill-code-refactor + lifecycle: native + canonical: sin-code scout + refactor + + # ── debug ── + - name: skill-debug-deep + lifecycle: native + canonical: sin-code scout + + # ── planning ── + - name: skill-planning-enterprise + lifecycle: native + canonical: sin-code gsd-phase + gsd-plan-phase + + # ── browser ── + - name: skill-browser-tools + lifecycle: external + canonical: SIN-Browser-Tools diff --git a/scripts/sync_lifecycle.py b/scripts/sync_lifecycle.py new file mode 100755 index 00000000..69893dd4 --- /dev/null +++ b/scripts/sync_lifecycle.py @@ -0,0 +1,242 @@ +#!/usr/bin/env python3 +"""Sync skill lifecycle frontmatter from the mapping table. + +Reads `scripts/lifecycle_map.yaml` and ensures every bundled +SKILL.md has a `lifecycle: ` line in its YAML frontmatter. + +Usage: + python3 sync_lifecycle.py --check # exit 1 if any drift + python3 sync_lifecycle.py --apply # write changes + python3 sync_lifecycle.py --diff # show what would change + +The script is intentionally stdlib-only (yaml is via a small hand- +rolled parser — we use it for one structure with string leaves and a +list of dicts; PyYAML is not a dependency for the bundled scripts). + +Docs: scripts/sync_lifecycle.py.doc.md +""" +from __future__ import annotations + +import argparse +import os +import re +import sys +from pathlib import Path + +# Repo root is two levels up from this script. +REPO_ROOT = Path(__file__).resolve().parent.parent +SKILLS_DIR = REPO_ROOT / "skills" +MAP_PATH = Path(__file__).resolve().parent / "lifecycle_map.yaml" + +# Lifecycle values, exactly as required by issue #139. +VALID_LIFECYCLES = {"native", "external", "deprecated"} + +# Frontmatter delimiters in a SKILL.md file. +FRONTMATTER_RE = re.compile( + r"^---\s*\n(.*?)\n---\s*\n(.*)$", + re.DOTALL, +) + + +def parse_map(text: str) -> dict[str, str]: + """Parse lifecycle_map.yaml into {name: lifecycle} dict. + + The format is intentionally simple (no nested keys, no anchors, + no flow style). Lines starting with `#` are comments. Each + non-comment line is either a key (`key: value`) or a list item + under the `skills:` key. + """ + out: dict[str, str] = {} + in_skills = False + current: dict[str, str] = {} + for raw in text.splitlines(): + line = raw.rstrip() + if not line or line.lstrip().startswith("#"): + continue + if line.startswith("skills:"): + in_skills = True + continue + if not in_skills: + continue + if line.startswith(" - "): + # New list item. Flush previous. + if current: + if "name" in current and "lifecycle" in current: + out[current["name"]] = current["lifecycle"] + current = {} + # Strip the leading " - " + item = line[4:].strip() + if ":" in item: + k, _, v = item.partition(":") + current[k.strip()] = v.strip() + elif line.startswith(" "): + # Continuation of current item. + item = line.strip() + if ":" in item: + k, _, v = item.partition(":") + current[k.strip()] = v.strip() + if current: + if "name" in current and "lifecycle" in current: + out[current["name"]] = current["lifecycle"] + return out + + +def read_frontmatter(path: Path) -> tuple[dict[str, str], str, str] | None: + """Return (frontmatter_dict, body_before_close, full_body) or None. + + The frontmatter dict is the parsed keys/values. The body is the + rest of the file (markdown content). full_body is the original + text (for the re-emit path). + """ + text = path.read_text() + m = FRONTMATTER_RE.match(text) + if not m: + return None + fm_text = m.group(1) + body = m.group(2) + fm: dict[str, str] = {} + for line in fm_text.splitlines(): + if ":" in line and not line.startswith(" "): + k, _, v = line.partition(":") + fm[k.strip()] = v.strip() + return fm, body, text + + +def write_frontmatter(path: Path, fm: dict[str, str], body: str) -> None: + """Re-emit the SKILL.md with the updated frontmatter. + + We preserve key order by re-issuing the frontmatter dict in the + order it was parsed, then appending any new keys at the end. This + is a stable round-trip: the same dict produces the same bytes. + """ + lines = ["---"] + for k, v in fm.items(): + # Quote values that contain colons or special characters. + v = v.strip() + if any(c in v for c in [":", "#", "{", "}", "[", "]"]): + v = f'"{v}"' + lines.append(f"{k}: {v}") + lines.append("---") + lines.append("") # blank line after frontmatter + lines.append(body.lstrip("\n")) + new_text = "\n".join(lines) + path.write_text(new_text) + + +def check_one(skill_md: Path, expected_lifecycle: str) -> str | None: + """Return None if the file is in sync, or a human-readable diff line.""" + parsed = read_frontmatter(skill_md) + if parsed is None: + return f"{skill_md}: no frontmatter" + fm, _, _ = parsed + actual = fm.get("lifecycle", "").strip() + if actual != expected_lifecycle: + return f"{skill_md}: lifecycle={actual!r}, expected {expected_lifecycle!r}" + return None + + +def apply_one(skill_md: Path, expected_lifecycle: str) -> bool: + """Update the lifecycle field. Return True if the file changed.""" + parsed = read_frontmatter(skill_md) + if parsed is None: + return False + fm, body, _ = parsed + if fm.get("lifecycle", "").strip() == expected_lifecycle: + return False + fm["lifecycle"] = expected_lifecycle + write_frontmatter(skill_md, fm, body) + return True + + +def main() -> int: + ap = argparse.ArgumentParser(description=__doc__) + g = ap.add_mutually_exclusive_group(required=True) + g.add_argument("--check", action="store_true", help="exit 1 if any drift") + g.add_argument("--apply", action="store_true", help="write changes") + g.add_argument("--diff", action="store_true", help="show what would change") + args = ap.parse_args() + + text = MAP_PATH.read_text() + mapping = parse_map(text) + + # Sanity: every lifecycle value is valid. + for name, lc in mapping.items(): + if lc not in VALID_LIFECYCLES: + print(f"lifecycle_map.yaml: {name} has invalid lifecycle {lc!r}", file=sys.stderr) + return 2 + + drift: list[str] = [] + missing: list[str] = [] + + # Find each skill by walking the category directories. The + # map's `name` is the basename (e.g. "skill-process-goal"), + # not the full path. + def find_skill_md(name: str) -> Path | None: + for category_dir in SKILLS_DIR.iterdir(): + if not category_dir.is_dir(): + continue + candidate = category_dir / name / "SKILL.md" + if candidate.exists(): + return candidate + return None + + for name, expected in sorted(mapping.items()): + path = find_skill_md(name) + if path is None: + missing.append(f"{name}: not found under skills/*/") + continue + d = check_one(path, expected) + if d is not None: + drift.append(d) + + # Detect bundled skills not in the map (orphans). + for category_dir in sorted(SKILLS_DIR.iterdir()): + if not category_dir.is_dir(): + continue + for skill_dir in sorted(category_dir.iterdir()): + if not skill_dir.is_dir(): + continue + sm = skill_dir / "SKILL.md" + if not sm.exists(): + continue + if skill_dir.name not in mapping: + missing.append(f"{sm}: not in lifecycle_map.yaml") + + if args.check: + if drift or missing: + if drift: + print(f"Drift detected ({len(drift)} files):") + for d in drift: + print(f" {d}") + if missing: + print(f"Orphans ({len(missing)} entries):") + for m in missing: + print(f" {m}") + return 1 + print(f"all {len(mapping)} skills in sync with lifecycle_map.yaml") + return 0 + + if args.diff: + for d in drift: + print(d) + for m in missing: + print(m) + return 0 + + if args.apply: + changed = 0 + for name, expected in sorted(mapping.items()): + path = find_skill_md(name) + if path is None: + continue + if apply_one(path, expected): + changed += 1 + print(f"updated {path}") + print(f"{changed} files updated, {len(missing)} orphans, {len(drift)} drift") + return 0 + + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/scripts/validate_skill.py b/scripts/validate_skill.py index 10e248f4..c501635a 100644 --- a/scripts/validate_skill.py +++ b/scripts/validate_skill.py @@ -30,7 +30,12 @@ RECOMMENDED_DIRS = ("scripts", "tests", "lib") # Frontmatter keys required by OpenCode / SIN-Code. +# `lifecycle` (issue #139) is enforced only in --strict mode so +# the validator remains backward-compatible with skills that have +# not yet been migrated. The migration path is `scripts/sync_lifecycle.py`. REQUIRED_FRONTMATTER = ("name", "description") +STRICT_FRONTMATTER = ("lifecycle",) +VALID_LIFECYCLES = ("native", "external", "deprecated") # Pattern for valid skill names (OpenCode spec). NAME_RE = re.compile(r"^[a-z0-9]+(-[a-z0-9]+)*$") @@ -110,6 +115,18 @@ def _check_skill_md(self) -> None: if key not in front or not front[key]: self.add("error", f"Missing or empty frontmatter key: {key}", skill_md) + # Strict-mode checks (issue #139): enforce `lifecycle` and a + # valid value. Strict mode is the operator's explicit signal + # that the migration is complete; non-strict mode leaves + # legacy skills untouched. + if self.strict: + for key in STRICT_FRONTMATTER: + if key not in front or not front[key]: + self.add("error", f"Missing or empty frontmatter key (strict): {key}", skill_md) + lc = front.get("lifecycle", "") + if lc and lc not in VALID_LIFECYCLES: + self.add("error", f"Invalid lifecycle {lc!r} (expected one of {VALID_LIFECYCLES})", skill_md) + name = front.get("name") if name and not NAME_RE.match(name): self.add( diff --git a/skills/browser-skills/skill-browser-tools/SKILL.md b/skills/browser-skills/skill-browser-tools/SKILL.md index 3096c840..81a9e507 100644 --- a/skills/browser-skills/skill-browser-tools/SKILL.md +++ b/skills/browser-skills/skill-browser-tools/SKILL.md @@ -2,12 +2,9 @@ name: skill-browser-tools description: Browser automation and CDP evidence capture for agents. Navigate, record, screenshot, scrape, and interact with web pages. Surfaces deterministic findings (network failures, JS exceptions, CORS/CSP violations, security state) without requiring LLM interpretation of raw logs. license: MIT -compatibility: - - opencode - - sin-code -metadata: - author: SIN-Code - version: 2.0.0 +compatibility: +metadata: +lifecycle: external --- # skill-browser-tools diff --git a/skills/code-skills/skill-code-add-endpoint/SKILL.md b/skills/code-skills/skill-code-add-endpoint/SKILL.md index c4a4b05e..b3e4c4dd 100644 --- a/skills/code-skills/skill-code-add-endpoint/SKILL.md +++ b/skills/code-skills/skill-code-add-endpoint/SKILL.md @@ -2,12 +2,9 @@ name: skill-code-add-endpoint description: Add an API endpoint with an ephemeral mock and verification. Use when the user asks to add a new endpoint, route, or API method. license: MIT -compatibility: - - opencode - - sin-code -metadata: - author: SIN-Code - version: 1.0.0 +compatibility: +metadata: +lifecycle: native --- # skill-code-add-endpoint diff --git a/skills/code-skills/skill-code-build/SKILL.md b/skills/code-skills/skill-code-build/SKILL.md index e7fcd51e..17002a6b 100644 --- a/skills/code-skills/skill-code-build/SKILL.md +++ b/skills/code-skills/skill-code-build/SKILL.md @@ -2,12 +2,9 @@ name: skill-code-build description: Implement a feature from an approved plan with tests and verification. Use when the user asks to build, implement, or code a feature. license: MIT -compatibility: - - opencode - - sin-code -metadata: - author: SIN-Code - version: 1.0.0 +compatibility: +metadata: +lifecycle: native --- # skill-code-build diff --git a/skills/code-skills/skill-code-ceo-audit/SKILL.md b/skills/code-skills/skill-code-ceo-audit/SKILL.md index 332d55c3..3120d3f2 100644 --- a/skills/code-skills/skill-code-ceo-audit/SKILL.md +++ b/skills/code-skills/skill-code-ceo-audit/SKILL.md @@ -2,12 +2,9 @@ name: skill-code-ceo-audit description: CEO-grade SOTA repository audit. Runs 47 quality gates (security, performance, code quality, dependencies, tests, docs, compliance) and produces a board-ready Markdown + SARIF report. license: MIT -compatibility: - - opencode - - sin-code -metadata: - author: SIN-Code - version: 1.0.0 +compatibility: +metadata: +lifecycle: native --- # skill-code-ceo-audit diff --git a/skills/code-skills/skill-code-codocs/SKILL.md b/skills/code-skills/skill-code-codocs/SKILL.md index 59d90881..5acaaba2 100644 --- a/skills/code-skills/skill-code-codocs/SKILL.md +++ b/skills/code-skills/skill-code-codocs/SKILL.md @@ -2,12 +2,9 @@ name: skill-code-codocs description: Maintain the two-layer documentation standard (CoDocs .doc.md companions + inline comments) for every meaningful code file. license: MIT -compatibility: - - opencode - - sin-code -metadata: - author: SIN-Code - version: 1.0.0 +compatibility: +metadata: +lifecycle: external --- # skill-code-codocs diff --git a/skills/code-skills/skill-code-create/SKILL.md b/skills/code-skills/skill-code-create/SKILL.md index 27690602..c3ea4ca2 100644 --- a/skills/code-skills/skill-code-create/SKILL.md +++ b/skills/code-skills/skill-code-create/SKILL.md @@ -2,12 +2,9 @@ name: skill-code-create description: Creates and validates new SIN-Code / OpenCode skills. Use when the user says "create skill", "new skill", "skill-code-create", "/skill-code-create", or asks how to build a skill. license: MIT -compatibility: - - opencode - - sin-code -metadata: - author: SIN-Code - version: 1.1.0 +compatibility: +metadata: +lifecycle: native --- # skill-code-create diff --git a/skills/code-skills/skill-code-docs/SKILL.md b/skills/code-skills/skill-code-docs/SKILL.md index b89cf5c9..cf159fe2 100644 --- a/skills/code-skills/skill-code-docs/SKILL.md +++ b/skills/code-skills/skill-code-docs/SKILL.md @@ -2,12 +2,9 @@ name: skill-code-docs description: Collaborative document coauthoring for READMEs, ADRs, specs, design docs, RFCs, API docs, and changelogs via MCP. Use for structured document workflows with the user. license: MIT -compatibility: - - opencode - - sin-code -metadata: - author: OpenSIN-Code - version: 1.0.0 +compatibility: +metadata: +lifecycle: external --- # skill-code-docs diff --git a/skills/code-skills/skill-code-mcp-builder/SKILL.md b/skills/code-skills/skill-code-mcp-builder/SKILL.md index b23f1f63..fd6664b4 100644 --- a/skills/code-skills/skill-code-mcp-builder/SKILL.md +++ b/skills/code-skills/skill-code-mcp-builder/SKILL.md @@ -2,12 +2,9 @@ name: skill-code-mcp-builder description: Meta-skill that scaffolds new MCP servers in python-fastmcp, node-mcp, or go-mcp. Provides tools for scaffold, template_list, add_tool, test, register, validate, publish, and audit. license: MIT -compatibility: - - opencode - - sin-code -metadata: - author: OpenSIN-Code - version: 1.0.0 +compatibility: +metadata: +lifecycle: external --- # skill-code-mcp-builder diff --git a/skills/code-skills/skill-code-plan/SKILL.md b/skills/code-skills/skill-code-plan/SKILL.md index bba9063d..914082f3 100644 --- a/skills/code-skills/skill-code-plan/SKILL.md +++ b/skills/code-skills/skill-code-plan/SKILL.md @@ -2,12 +2,9 @@ name: skill-code-plan description: Break an approved specification into concrete, executable tasks. Use when the user has a spec and needs an implementation plan. license: MIT -compatibility: - - opencode - - sin-code -metadata: - author: SIN-Code - version: 1.0.0 +compatibility: +metadata: +lifecycle: native --- # skill-code-plan diff --git a/skills/code-skills/skill-code-preview/SKILL.md b/skills/code-skills/skill-code-preview/SKILL.md index ef58b71c..532e98f2 100644 --- a/skills/code-skills/skill-code-preview/SKILL.md +++ b/skills/code-skills/skill-code-preview/SKILL.md @@ -2,12 +2,9 @@ name: skill-code-preview description: Open generated images and screenshots in macOS Preview automatically. Always use when creating or referencing images. license: MIT -compatibility: - - opencode - - sin-code -metadata: - author: SIN-Code - version: 1.0.0 +compatibility: +metadata: +lifecycle: native --- # skill-code-preview diff --git a/skills/code-skills/skill-code-refactor/SKILL.md b/skills/code-skills/skill-code-refactor/SKILL.md index b2882f10..b01cd578 100644 --- a/skills/code-skills/skill-code-refactor/SKILL.md +++ b/skills/code-skills/skill-code-refactor/SKILL.md @@ -2,12 +2,9 @@ name: skill-code-refactor description: Refactor a symbol with full SIN impact analysis and Oracle verification. Use when the user asks to refactor, rename, or restructure a symbol while preserving behavior. license: MIT -compatibility: - - opencode - - sin-code -metadata: - author: SIN-Code - version: 1.0.0 +compatibility: +metadata: +lifecycle: native --- # skill-code-refactor diff --git a/skills/code-skills/skill-code-spec/SKILL.md b/skills/code-skills/skill-code-spec/SKILL.md index a954d812..19794d86 100644 --- a/skills/code-skills/skill-code-spec/SKILL.md +++ b/skills/code-skills/skill-code-spec/SKILL.md @@ -2,12 +2,9 @@ name: skill-code-spec description: Author a technical specification for a feature or change. Use when the user has an idea but no written spec yet. license: MIT -compatibility: - - opencode - - sin-code -metadata: - author: SIN-Code - version: 1.0.0 +compatibility: +metadata: +lifecycle: native --- # skill-code-spec diff --git a/skills/debug-skills/skill-debug-deep/SKILL.md b/skills/debug-skills/skill-debug-deep/SKILL.md index 0a29a3d1..d91621cf 100644 --- a/skills/debug-skills/skill-debug-deep/SKILL.md +++ b/skills/debug-skills/skill-debug-deep/SKILL.md @@ -2,15 +2,10 @@ name: skill-debug-deep description: Ultimate enterprise debugging workflow — facts-first RCA, cross-tool intent discovery, parallel subagents, web validation, minimal safe fix, and persistent knowledge flush. license: MIT -compatibility: - - opencode - - sin-code -metadata: - author: SIN-Code - version: 1.0.0 -lifecycle: external -sources: - - https://github.com/OpenSIN-AI/Skill-SIN-Enterprise-Deep-Debug +compatibility: +metadata: +lifecycle: native +sources: --- # Enterprise Deep Debug diff --git a/skills/design-skills/skill-design-frontend/SKILL.md b/skills/design-skills/skill-design-frontend/SKILL.md index 705c32a1..b67f8a50 100644 --- a/skills/design-skills/skill-design-frontend/SKILL.md +++ b/skills/design-skills/skill-design-frontend/SKILL.md @@ -2,12 +2,9 @@ name: skill-design-frontend description: SOTA frontend design system and philosophy. Loads typography, color, spacing, motion tokens; generates button/input/card/modal specs; scaffolds pages; runs WCAG 2.2 AA checks. v0-pool integration when available. license: MIT -compatibility: - - opencode - - sin-code -metadata: - author: OpenSIN-Code - version: 1.0.0 +compatibility: +metadata: +lifecycle: external --- # skill-design-frontend diff --git a/skills/design-skills/skill-design-image/SKILL.md b/skills/design-skills/skill-design-image/SKILL.md index bdb412f1..25a9da46 100644 --- a/skills/design-skills/skill-design-image/SKILL.md +++ b/skills/design-skills/skill-design-image/SKILL.md @@ -2,12 +2,9 @@ name: skill-design-image description: Generate, edit, and inspect images for the project. Create diagrams, screenshots, or artwork. license: MIT -compatibility: - - opencode - - sin-code -metadata: - author: SIN-Code - version: 1.0.0 +compatibility: +metadata: +lifecycle: native --- # skill-design-image diff --git a/skills/ecosystem-skills/skill-ecosystem-context/SKILL.md b/skills/ecosystem-skills/skill-ecosystem-context/SKILL.md index ba2913ac..46a9ed06 100644 --- a/skills/ecosystem-skills/skill-ecosystem-context/SKILL.md +++ b/skills/ecosystem-skills/skill-ecosystem-context/SKILL.md @@ -2,12 +2,9 @@ name: skill-ecosystem-context description: Unified context bridge that queries SCKG, sin-brain, GitNexus, and local SQLite in a single MCP call. license: MIT -compatibility: - - opencode - - sin-code -metadata: - author: SIN-Code - version: 1.0.0 +compatibility: +metadata: +lifecycle: external --- # skill-ecosystem-context diff --git a/skills/ecosystem-skills/skill-ecosystem-marketplace/SKILL.md b/skills/ecosystem-skills/skill-ecosystem-marketplace/SKILL.md index 978cb266..5e092104 100644 --- a/skills/ecosystem-skills/skill-ecosystem-marketplace/SKILL.md +++ b/skills/ecosystem-skills/skill-ecosystem-marketplace/SKILL.md @@ -2,12 +2,9 @@ name: skill-ecosystem-marketplace description: Manage the SIN-Code skill marketplace. Search, install, update, and remove skills from the catalog. license: MIT -compatibility: - - opencode - - sin-code -metadata: - author: SIN-Code - version: 1.0.0 +compatibility: +metadata: +lifecycle: external --- # skill-ecosystem-marketplace diff --git a/skills/github-skills/skill-github-account/SKILL.md b/skills/github-skills/skill-github-account/SKILL.md index 4ad93612..30b5db10 100644 --- a/skills/github-skills/skill-github-account/SKILL.md +++ b/skills/github-skills/skill-github-account/SKILL.md @@ -2,12 +2,9 @@ name: skill-github-account description: GitHub Account Registrierung via Google OAuth mit Fallback. license: MIT -compatibility: - - opencode - - sin-code -metadata: - author: OpenSIN-Code - version: 1.0.0 +compatibility: +metadata: +lifecycle: native --- # skill-github-account diff --git a/skills/github-skills/skill-github-actions/SKILL.md b/skills/github-skills/skill-github-actions/SKILL.md index 84b6ac25..719c5f90 100644 --- a/skills/github-skills/skill-github-actions/SKILL.md +++ b/skills/github-skills/skill-github-actions/SKILL.md @@ -2,12 +2,9 @@ name: skill-github-actions description: One-command GitHub Actions workflow deployment for OpenSIN-Code repos. Provisions canonical workflows, branch protection, dependabot, and release automation. license: MIT -compatibility: - - opencode - - sin-code -metadata: - author: SIN-Code - version: 1.0.0 +compatibility: +metadata: +lifecycle: native --- # skill-github-actions diff --git a/skills/github-skills/skill-github-app/SKILL.md b/skills/github-skills/skill-github-app/SKILL.md index cffb02a6..67433d07 100644 --- a/skills/github-skills/skill-github-app/SKILL.md +++ b/skills/github-skills/skill-github-app/SKILL.md @@ -2,12 +2,9 @@ name: skill-github-app description: Automate GitHub App creation for OpenSIN organization using browser automation. license: MIT -compatibility: - - opencode - - sin-code -metadata: - author: OpenSIN-Code - version: 1.0.0 +compatibility: +metadata: +lifecycle: native --- # skill-github-app diff --git a/skills/github-skills/skill-github-governance/SKILL.md b/skills/github-skills/skill-github-governance/SKILL.md index 54a0370f..46dfd9be 100644 --- a/skills/github-skills/skill-github-governance/SKILL.md +++ b/skills/github-skills/skill-github-governance/SKILL.md @@ -2,12 +2,9 @@ name: skill-github-governance description: "Autonomous repository management: internal governance (Zeus & Hermes) and external bug-hunter outreach." license: MIT -compatibility: - - opencode - - sin-code -metadata: - author: OpenSIN-Code - version: 1.0.0 +compatibility: +metadata: +lifecycle: native --- # skill-github-governance diff --git a/skills/memory-skills/skill-memory-honcho-rollback/SKILL.md b/skills/memory-skills/skill-memory-honcho-rollback/SKILL.md index 72d785db..99de72c9 100644 --- a/skills/memory-skills/skill-memory-honcho-rollback/SKILL.md +++ b/skills/memory-skills/skill-memory-honcho-rollback/SKILL.md @@ -2,12 +2,9 @@ name: skill-memory-honcho-rollback description: Snapshot, diff, and rollback sin-brain / Honcho memory with merge/exact/patch strategies and an audit log. license: MIT -compatibility: - - opencode - - sin-code -metadata: - author: SIN-Code - version: 1.0.0 +compatibility: +metadata: +lifecycle: external --- # skill-memory-honcho-rollback diff --git a/skills/memory-skills/skill-memory-honcho/SKILL.md b/skills/memory-skills/skill-memory-honcho/SKILL.md index 7a55ef8c..a0506d61 100644 --- a/skills/memory-skills/skill-memory-honcho/SKILL.md +++ b/skills/memory-skills/skill-memory-honcho/SKILL.md @@ -2,12 +2,9 @@ name: skill-memory-honcho description: Behavioral memory layer for opencode agents. Stores conversations, preferences, and peer models across sessions with graceful degradation. license: MIT -compatibility: - - opencode - - sin-code -metadata: - author: SIN-Code - version: 1.0.0 +compatibility: +metadata: +lifecycle: external --- # skill-memory-honcho diff --git a/skills/memory-skills/skill-memory-infisical/SKILL.md b/skills/memory-skills/skill-memory-infisical/SKILL.md index 569b86df..b2b412fb 100644 --- a/skills/memory-skills/skill-memory-infisical/SKILL.md +++ b/skills/memory-skills/skill-memory-infisical/SKILL.md @@ -2,12 +2,9 @@ name: skill-memory-infisical description: Centralized secret management via Infisical CLI. Stores API keys, tokens, and credentials without .env files or shell history. license: MIT -compatibility: - - opencode - - sin-code -metadata: - author: SIN-Code - version: 1.0.0 +compatibility: +metadata: +lifecycle: external --- # skill-memory-infisical diff --git a/skills/planning-skills/skill-planning-enterprise/SKILL.md b/skills/planning-skills/skill-planning-enterprise/SKILL.md index bf496c71..6074a8a9 100644 --- a/skills/planning-skills/skill-planning-enterprise/SKILL.md +++ b/skills/planning-skills/skill-planning-enterprise/SKILL.md @@ -2,15 +2,10 @@ name: skill-planning-enterprise description: Agent-first enterprise planning skill with a strict JSON CLI, deterministic validation, idempotent execution, and governance-aware rollback. license: MIT -compatibility: - - opencode - - sin-code -metadata: - author: SIN-Code - version: 2.1.0 -lifecycle: external -sources: - - https://github.com/SIN-Skills/plan +compatibility: +metadata: +lifecycle: native +sources: --- # /plan v2.1 — Agent-first enterprise planning diff --git a/skills/process-skills/skill-process-goal/SKILL.md b/skills/process-skills/skill-process-goal/SKILL.md index e8d01448..7423626e 100644 --- a/skills/process-skills/skill-process-goal/SKILL.md +++ b/skills/process-skills/skill-process-goal/SKILL.md @@ -2,12 +2,9 @@ name: skill-process-goal description: Track long-running goals with subtasks, dependencies, checkpoints, and rollback. Use when work spans multiple sessions or subtasks. license: MIT -compatibility: - - opencode - - sin-code -metadata: - author: SIN-Code - version: 1.0.0 +compatibility: +metadata: +lifecycle: native --- # skill-process-goal diff --git a/skills/process-skills/skill-process-grill/SKILL.md b/skills/process-skills/skill-process-grill/SKILL.md index a1d7f453..a8152924 100644 --- a/skills/process-skills/skill-process-grill/SKILL.md +++ b/skills/process-skills/skill-process-grill/SKILL.md @@ -2,12 +2,9 @@ name: skill-process-grill description: Adversarial design-review interview. Relentlessly questions plans to surface hidden assumptions before implementation. license: MIT -compatibility: - - opencode - - sin-code -metadata: - author: SIN-Code - version: 1.0.0 +compatibility: +metadata: +lifecycle: external --- # skill-process-grill diff --git a/skills/process-skills/skill-process-scheduler/SKILL.md b/skills/process-skills/skill-process-scheduler/SKILL.md index 7427683c..84f8a858 100644 --- a/skills/process-skills/skill-process-scheduler/SKILL.md +++ b/skills/process-skills/skill-process-scheduler/SKILL.md @@ -2,12 +2,9 @@ name: skill-process-scheduler description: Job scheduling with cron expressions and human-readable intervals via MCP server and CLI. Schedule, list, cancel, run, and inspect job execution logs. license: MIT -compatibility: - - opencode - - sin-code -metadata: - author: OpenSIN-Code - version: 1.0.0 +compatibility: +metadata: +lifecycle: external --- # skill-process-scheduler