Skip to content

Commit e16a5b9

Browse files
skills: install grill-me for both CLIs, pinned to a reviewed ref (#30)
Install the third-party grill-me skill (mattpocock/skills) for both Claude and Codex everywhere the kit installs skills. The step lives in install.sh.tpl, so it is baked into the runtime-home render for runners and runs on workstation installs (install-agents.sh delegates to install.sh). The skill executes inside agent context, so it is pinned to a reviewed upstream ref (mattpocock/skills#v1.1.0, commit d574778f) and the skills CLI is version-pinned (skills@1.5.16); bumping either is a renovate/review event. The install is idempotent (the skills CLI converges on re-run) and loud-skips with a doctor warning when npx or the network is unavailable rather than failing the whole install, matching the MCP fleet fallback posture. The skills CLI's Claude agent name is claude-code (not claude); the Claude branch passes claude-code while the installer keeps its own INSTALL_CLAUDE gating and CLAUDE_HOME/SKILLS_DIR variable names. Registers grill-me in manifest.yaml (skill entry + provenance pin) and adds a render-agent-kit.py --doctor check so --check/--doctor cover it. Records the pin in skills-source.lock, THIRD_PARTY_NOTICES.md, and renovate.json. Co-authored-by: JorisJonkers Agent <agents@jorisjonkers.dev>
1 parent 8fade6a commit e16a5b9

7 files changed

Lines changed: 221 additions & 4 deletions

File tree

THIRD_PARTY_NOTICES.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,9 @@ sources:
2828

2929
- Project: Skills
3030
- Repository: https://github.com/mattpocock/skills
31-
- Source ref: main
31+
- Pinned tag: v1.1.0
32+
- Resolved source commit: d574778f94cf620fcc8ce741584093bc650a61d3
33+
- Installed skills: grill-me (via `skills` CLI, pinned; installed by install.sh)
3234
- License: MIT
3335
- Copyright notice: Copyright (c) 2026 Matt Pocock
3436

installer/install.sh

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,7 @@ claude_managed_paths=(
174174
"${SKILLS_DIR}/kb-first/SKILL.md"
175175
"${SKILLS_DIR}/token-economy/SKILL.md"
176176
"${SKILLS_DIR}/agent-session-bootstrap/SKILL.md"
177+
"${SKILLS_DIR}/grill-me/SKILL.md"
177178
"${SKILLS_DIR}/council/SKILL.md"
178179
"${SKILLS_DIR}/council/council.mjs"
179180
"${SKILLS_DIR}/council/council.toml"
@@ -237,6 +238,7 @@ codex_managed_paths=(
237238
"${CODEX_SKILLS_DIR}/kb-first/SKILL.md"
238239
"${CODEX_SKILLS_DIR}/token-economy/SKILL.md"
239240
"${CODEX_SKILLS_DIR}/agent-session-bootstrap/SKILL.md"
241+
"${CODEX_SKILLS_DIR}/grill-me/SKILL.md"
240242
"${CODEX_SKILLS_DIR}/council/SKILL.md"
241243
"${CODEX_SKILLS_DIR}/council/council.mjs"
242244
"${CODEX_SKILLS_DIR}/council/council.toml"
@@ -4041,6 +4043,55 @@ install_council() {
40414043
if [ "${INSTALL_CLAUDE}" = 1 ]; then install_council "${SKILLS_DIR}" "${COUNCIL_SKILL_claude}"; fi
40424044
if [ "${INSTALL_CODEX}" = 1 ]; then install_council "${CODEX_SKILLS_DIR}" "${COUNCIL_SKILL_codex}"; fi
40434045

4046+
# -----------------------------------------------------------------
4047+
# Third-party skill: grill-me (mattpocock/skills). Installed for both
4048+
# CLIs via the `skills` CLI, pinned to a reviewed ref so bumping the
4049+
# pin is a normal renovate/review event (org supply-chain posture).
4050+
# The skill content executes inside agent context, so the ref is never
4051+
# floating. Loud-skip philosophy: if npx or the network is unavailable
4052+
# the step logs a warning and continues rather than failing the whole
4053+
# install (same fallback posture as the MCP fleet registration). The
4054+
# `skills` CLI is itself idempotent, so re-runs and upgrades converge
4055+
# without duplicating the skill.
4056+
# -----------------------------------------------------------------
4057+
# Pin — reviewed 2026-07-13; see skills-source.lock and manifest.yaml
4058+
# provenance.skills. mattpocock/skills v1.1.0 = commit
4059+
# d574778f94cf620fcc8ce741584093bc650a61d3. Bump via renovate/review.
4060+
readonly GRILL_ME_SOURCE='mattpocock/skills#v1.1.0'
4061+
readonly GRILL_ME_SKILL='grill-me'
4062+
readonly SKILLS_CLI='skills@1.5.16'
4063+
4064+
install_grill_me() {
4065+
# ${agent} is the `skills` CLI agent name (its registry keys are
4066+
# "claude-code" and "codex", not "claude"); ${home} is the installer's
4067+
# resolved client home for that agent.
4068+
local agent="$1" home="$2"
4069+
if [ "${DRY_RUN}" = 1 ]; then
4070+
log "would install ${GRILL_ME_SKILL} for ${agent} from ${GRILL_ME_SOURCE} via npx ${SKILLS_CLI}"
4071+
return 0
4072+
fi
4073+
if ! command -v npx >/dev/null 2>&1; then
4074+
log "WARNING: npx is not on PATH; skipping ${GRILL_ME_SKILL} for ${agent} (install Node >=22 and re-run)"
4075+
return 0
4076+
fi
4077+
# The `skills` CLI resolves its home from CLAUDE_CONFIG_DIR / CODEX_HOME,
4078+
# so exporting the installer-resolved home lands grill-me next to the
4079+
# kit's own skills for both user and project scope.
4080+
if CLAUDE_CONFIG_DIR="${home}" CODEX_HOME="${home}" \
4081+
npx --yes "${SKILLS_CLI}" add "${GRILL_ME_SOURCE}" \
4082+
--skill="${GRILL_ME_SKILL}" --agent "${agent}" --yes --global; then
4083+
log "installed ${GRILL_ME_SKILL} for ${agent} from ${GRILL_ME_SOURCE}"
4084+
else
4085+
log "WARNING: ${GRILL_ME_SKILL} install for ${agent} failed (npx/network unavailable?); continuing"
4086+
fi
4087+
}
4088+
4089+
# The `skills` CLI expects "claude-code" (not "claude") as the Claude agent
4090+
# name; the installer's own INSTALL_CLAUDE gating and ${CLAUDE_HOME}/${SKILLS_DIR}
4091+
# variable names are unchanged.
4092+
if [ "${INSTALL_CLAUDE}" = 1 ]; then install_grill_me claude-code "${CLAUDE_HOME}"; fi
4093+
if [ "${INSTALL_CODEX}" = 1 ]; then install_grill_me codex "${CODEX_HOME}"; fi
4094+
40444095
# -----------------------------------------------------------------
40454096
# Path allowlist (gitignore-style). Hooks below skip any tool input
40464097
# whose target matches a pattern here. Defaults exclude paths that

manifest.yaml

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,18 @@ provenance:
1919
upstream_commit: "9313aaeb6573333c636c7ac55439dddc256c29e1"
2020
source_lock: spec-kit-source.lock
2121
third_party_notices: THIRD_PARTY_NOTICES.md
22+
skills:
23+
# grill-me is installed for both CLIs by the served install.sh via the
24+
# `skills` CLI (`npx skills add mattpocock/skills#<ref> --skill=grill-me`),
25+
# pinned to a reviewed ref. The upstream_commit is the immutable pin;
26+
# bumping it is a renovate/review event.
27+
upstream_repository: https://github.com/mattpocock/skills
28+
upstream_tag: v1.1.0
29+
upstream_commit: "d574778f94cf620fcc8ce741584093bc650a61d3"
30+
skills_cli_version: 1.5.16
31+
installed_skills: [grill-me]
32+
source_lock: skills-source.lock
33+
third_party_notices: THIRD_PARTY_NOTICES.md
2234

2335
renderer:
2436
script_path: render-agent-kit.py
@@ -403,6 +415,25 @@ skills:
403415
- agent: claude
404416
path: .claude/skills/fleet-change/SKILL.md
405417
sha256: da427baa764c7d17667f9faa0b2bdbb467c9a34acaeb1a4df2523d16bdb4e0c5
418+
- name: grill-me
419+
# Third-party skill from mattpocock/skills, installed for both CLIs by the
420+
# served install.sh via `npx skills add`. It has no repo file target, so it
421+
# is pinned by upstream ref+commit (its immutable sha) under provenance
422+
# rather than a repo-file sha256. Bumping the pin is a renovate/review event.
423+
supported_agents: [codex, claude]
424+
provenance:
425+
source: skills-cli:mattpocock/skills
426+
upstream_repository: https://github.com/mattpocock/skills
427+
upstream_tag: v1.1.0
428+
upstream_commit: "d574778f94cf620fcc8ce741584093bc650a61d3"
429+
skill_path: skills/productivity/grill-me/SKILL.md
430+
skills_cli_version: 1.5.16
431+
source_lock: skills-source.lock
432+
third_party_notices: THIRD_PARTY_NOTICES.md
433+
installer:
434+
source_path: installer/install.sh
435+
target_path: "${CLAUDE_HOME}/skills/grill-me/SKILL.md"
436+
codex_target_path: "${CODEX_HOME}/skills/grill-me/SKILL.md"
406437
- name: kb-first
407438
supported_agents: [codex, claude]
408439
targets:
@@ -878,11 +909,11 @@ agent_runner_runtime:
878909

879910
installer:
880911
path: installer/install.sh
881-
sha256: 89f2d200077f0f44b386d4fa93f9a46a183a1fe605663f52034e9bc55f2ff395
912+
sha256: 01265e25aee91eed3bf78560b7e23871d84e7f44954538fbdf38bb273c5ee4e0
882913
supported_agents: [codex, claude]
883914
served_artifacts:
884915
- path: installer/install.sh
885-
sha256: 89f2d200077f0f44b386d4fa93f9a46a183a1fe605663f52034e9bc55f2ff395
916+
sha256: 01265e25aee91eed3bf78560b7e23871d84e7f44954538fbdf38bb273c5ee4e0
886917
mode: "0644"
887918
- path: installer/install-agents.sh
888919
sha256: c2b20ca13df242056eb4b6591abdc830d5685a17ec7a7cde23c2886189fd14f4

render-agent-kit.py

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -496,6 +496,58 @@ def installer_artifact_check() -> DoctorCheck:
496496
)
497497

498498

499+
THIRD_PARTY_SKILLS_SOURCE = "mattpocock/skills"
500+
THIRD_PARTY_SKILLS_PIN = "v1.1.0"
501+
502+
503+
def grill_me_check() -> DoctorCheck:
504+
"""Confirm the grill-me third-party skill is wired into both served
505+
installers with a pinned (non-floating) ref, and report whether npx is
506+
available. A missing npx is a warn, not a fail: the installer loud-skips
507+
grill-me and continues rather than hard-failing (same fallback posture as
508+
the MCP fleet)."""
509+
marker = "install_grill_me"
510+
pinned_source = f"{THIRD_PARTY_SKILLS_SOURCE}#{THIRD_PARTY_SKILLS_PIN}"
511+
for relative in SERVED_INSTALLERS:
512+
installer = REPOSITORY_ROOT / relative
513+
if not installer.is_file():
514+
return DoctorCheck(name="grill-me", status="fail", detail=f"missing {relative}")
515+
body = installer.read_text(errors="replace")
516+
# install-agents.sh delegates the base install (which carries grill-me);
517+
# only install.sh must embed the pinned invocation directly.
518+
if relative.name == "install.sh":
519+
if marker not in body:
520+
return DoctorCheck(
521+
name="grill-me",
522+
status="fail",
523+
detail=f"{relative} does not install grill-me",
524+
)
525+
if pinned_source not in body:
526+
return DoctorCheck(
527+
name="grill-me",
528+
status="fail",
529+
detail=f"{relative} does not pin {THIRD_PARTY_SKILLS_SOURCE} to a reviewed ref",
530+
)
531+
if f"{THIRD_PARTY_SKILLS_SOURCE}#'" in body or f"{THIRD_PARTY_SKILLS_SOURCE}'" in body:
532+
return DoctorCheck(
533+
name="grill-me",
534+
status="fail",
535+
detail=f"{relative} uses a floating {THIRD_PARTY_SKILLS_SOURCE} ref",
536+
)
537+
538+
if shutil.which("npx") is None:
539+
return DoctorCheck(
540+
name="grill-me",
541+
status="warn",
542+
detail=f"wired + pinned to {pinned_source}; npx not on PATH so the installer will loud-skip grill-me",
543+
)
544+
return DoctorCheck(
545+
name="grill-me",
546+
status="ok",
547+
detail=f"wired into both installers, pinned to {pinned_source}; npx available",
548+
)
549+
550+
499551
def kb_reachability_check(require_live_kb: bool, timeout_seconds: float) -> DoctorCheck:
500552
kb_url = os.environ.get("KB_URL", "").rstrip("/")
501553
token = os.environ.get("KB_BEARER_TOKEN", "")
@@ -610,6 +662,7 @@ def doctor(args: argparse.Namespace) -> int:
610662
checks.append(manifest_check())
611663
checks.append(parity_check())
612664
checks.append(installer_artifact_check())
665+
checks.append(grill_me_check())
613666
checks.append(kb_reachability_check(require_live_kb=args.require_live_kb, timeout_seconds=args.kb_timeout_seconds))
614667

615668
print("agent kit doctor")

renovate.json

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,28 @@
3232
],
3333
"datasourceTemplate": "git-refs"
3434
},
35+
{
36+
"customType": "regex",
37+
"description": "Update the pinned grill-me skill ref (mattpocock/skills) in the skills source lock.",
38+
"managerFilePatterns": ["/^skills-source\\.lock$/"],
39+
"matchStrings": [
40+
"pinned_tag: (?<currentValue>\\S+)\\s+pinned_commit: (?<currentDigest>[a-f0-9]{7,40})"
41+
],
42+
"depNameTemplate": "mattpocock/skills",
43+
"datasourceTemplate": "github-releases",
44+
"versioningTemplate": "semver"
45+
},
46+
{
47+
"customType": "regex",
48+
"description": "Update the pinned `skills` CLI version used to install grill-me.",
49+
"managerFilePatterns": ["/^skills-source\\.lock$/"],
50+
"matchStrings": [
51+
"skills_cli_version: (?<currentValue>\\S+)"
52+
],
53+
"depNameTemplate": "skills",
54+
"datasourceTemplate": "npm",
55+
"versioningTemplate": "npm"
56+
},
3557
{
3658
"customType": "regex",
3759
"description": "Update Spec Kit source lock release pins.",

skills-source.lock

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,20 @@
11
# Skills Source Lock
22

3-
verified_at: 2026-07-03
3+
verified_at: 2026-07-13
44

55
## Sources
66

77
- upstream_repository: https://github.com/mattpocock/skills
88
status: included
99
license: MIT
1010
license_notice: Copyright (c) 2026 Matt Pocock
11+
# Installed for both CLIs by the served install.sh via the `skills` CLI,
12+
# pinned to a reviewed ref (never floating). The commit is the immutable pin.
13+
installed_via: "npx skills@1.5.16 add mattpocock/skills#v1.1.0 --skill=grill-me"
14+
pinned_tag: v1.1.0
15+
pinned_commit: d574778f94cf620fcc8ce741584093bc650a61d3
16+
skills_cli_version: 1.5.16
17+
installed_skills: [grill-me]
1118
- upstream_repository: https://github.com/obra/superpowers
1219
status: included
1320
license: MIT

templates/installer/install.sh.tpl

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,7 @@ claude_managed_paths=(
166166
"${SKILLS_DIR}/kb-first/SKILL.md"
167167
"${SKILLS_DIR}/token-economy/SKILL.md"
168168
"${SKILLS_DIR}/agent-session-bootstrap/SKILL.md"
169+
"${SKILLS_DIR}/grill-me/SKILL.md"
169170
# @agent-kit-council-managed claude
170171
"${ALLOWLIST}"
171172
)
@@ -180,6 +181,7 @@ codex_managed_paths=(
180181
"${CODEX_SKILLS_DIR}/kb-first/SKILL.md"
181182
"${CODEX_SKILLS_DIR}/token-economy/SKILL.md"
182183
"${CODEX_SKILLS_DIR}/agent-session-bootstrap/SKILL.md"
184+
"${CODEX_SKILLS_DIR}/grill-me/SKILL.md"
183185
# @agent-kit-council-managed codex
184186
"${CODEX_ALLOWLIST}"
185187
"${CODEX_HOOKS_CONFIG}"
@@ -280,6 +282,55 @@ fi
280282
# -----------------------------------------------------------------
281283
# @agent-kit-council-bundle
282284

285+
# -----------------------------------------------------------------
286+
# Third-party skill: grill-me (mattpocock/skills). Installed for both
287+
# CLIs via the `skills` CLI, pinned to a reviewed ref so bumping the
288+
# pin is a normal renovate/review event (org supply-chain posture).
289+
# The skill content executes inside agent context, so the ref is never
290+
# floating. Loud-skip philosophy: if npx or the network is unavailable
291+
# the step logs a warning and continues rather than failing the whole
292+
# install (same fallback posture as the MCP fleet registration). The
293+
# `skills` CLI is itself idempotent, so re-runs and upgrades converge
294+
# without duplicating the skill.
295+
# -----------------------------------------------------------------
296+
# Pin — reviewed 2026-07-13; see skills-source.lock and manifest.yaml
297+
# provenance.skills. mattpocock/skills v1.1.0 = commit
298+
# d574778f94cf620fcc8ce741584093bc650a61d3. Bump via renovate/review.
299+
readonly GRILL_ME_SOURCE='mattpocock/skills#v1.1.0'
300+
readonly GRILL_ME_SKILL='grill-me'
301+
readonly SKILLS_CLI='skills@1.5.16'
302+
303+
install_grill_me() {
304+
# ${agent} is the `skills` CLI agent name (its registry keys are
305+
# "claude-code" and "codex", not "claude"); ${home} is the installer's
306+
# resolved client home for that agent.
307+
local agent="$1" home="$2"
308+
if [ "${DRY_RUN}" = 1 ]; then
309+
log "would install ${GRILL_ME_SKILL} for ${agent} from ${GRILL_ME_SOURCE} via npx ${SKILLS_CLI}"
310+
return 0
311+
fi
312+
if ! command -v npx >/dev/null 2>&1; then
313+
log "WARNING: npx is not on PATH; skipping ${GRILL_ME_SKILL} for ${agent} (install Node >=22 and re-run)"
314+
return 0
315+
fi
316+
# The `skills` CLI resolves its home from CLAUDE_CONFIG_DIR / CODEX_HOME,
317+
# so exporting the installer-resolved home lands grill-me next to the
318+
# kit's own skills for both user and project scope.
319+
if CLAUDE_CONFIG_DIR="${home}" CODEX_HOME="${home}" \
320+
npx --yes "${SKILLS_CLI}" add "${GRILL_ME_SOURCE}" \
321+
--skill="${GRILL_ME_SKILL}" --agent "${agent}" --yes --global; then
322+
log "installed ${GRILL_ME_SKILL} for ${agent} from ${GRILL_ME_SOURCE}"
323+
else
324+
log "WARNING: ${GRILL_ME_SKILL} install for ${agent} failed (npx/network unavailable?); continuing"
325+
fi
326+
}
327+
328+
# The `skills` CLI expects "claude-code" (not "claude") as the Claude agent
329+
# name; the installer's own INSTALL_CLAUDE gating and ${CLAUDE_HOME}/${SKILLS_DIR}
330+
# variable names are unchanged.
331+
if [ "${INSTALL_CLAUDE}" = 1 ]; then install_grill_me claude-code "${CLAUDE_HOME}"; fi
332+
if [ "${INSTALL_CODEX}" = 1 ]; then install_grill_me codex "${CODEX_HOME}"; fi
333+
283334
# -----------------------------------------------------------------
284335
# Path allowlist (gitignore-style). Hooks below skip any tool input
285336
# whose target matches a pattern here. Defaults exclude paths that

0 commit comments

Comments
 (0)