Compare commits

..
7 Commits
Author SHA1 Message Date
gitea-actions 59c4633723 chore(plugins): regenerate plugin manifests 2026-09-03 00:33:58 +00:00
rootiest 2ff7f3c1e8 Merge pull request 'fix(mirror-it): create GitHub target repo before registering push mirror' (#9) from feat-mirror-it-github-repo-check into main
Generate plugin manifests / validate (push) Skipped
Generate plugin manifests / generate (push) Successful in 23s
Reviewed-on: #9
2026-09-03 00:33:23 +00:00
rootiest 8467e584dd Merge branch 'main' into feat-mirror-it-github-repo-check
Generate plugin manifests / validate (pull_request) Successful in 26s
Generate plugin manifests / generate (pull_request) Skipped
2026-09-03 00:33:08 +00:00
rootiest ebda8c7a05 docs: enforce line length in readme 2026-09-03 00:32:39 +00:00
rootiest eeff00b5e7 fix(mirror-it): create GitHub target repo before registering push mirror
Generate plugin manifests / validate (pull_request) Successful in 17s
Generate plugin manifests / generate (pull_request) Skipped
GitHub, unlike Gitea, doesn't create a repo on first push, so a mirror
pointed at a nonexistent GitHub repo would register successfully but
fail every sync. Check for the target repo via gh/MCP/REST API and
create it if missing, falling back to a clear manual-creation warning
when no capability is available. Bumps plugin version to 1.1.0.
2026-08-25 00:32:40 -04:00
rootiest a5f907e9cf Merge pull request 'fix: use object-shaped author field and surface descriptions in marketplace.json' (#8) from fix-plugin-author-schema-and-marketplace-descriptions into main
Generate plugin manifests / validate (push) Skipped
Generate plugin manifests / generate (push) Successful in 18s
Reviewed-on: #8
2026-08-25 04:21:04 +00:00
rootiest 8400f41419 fix: use object-shaped author field and surface descriptions in marketplace.json
Generate plugin manifests / validate (pull_request) Successful in 16s
Generate plugin manifests / generate (pull_request) Skipped
Claude Code's plugin/marketplace schemas require author to be an object
({"name": ...}), not a bare string — installing any plugin from this
marketplace failed validation ("author: Invalid input: expected object,
received string"). Convert every plugins/*/plugin.json author field
accordingly, and add a build-time check so this can't regress.

Also propagate each plugin's description/author into the generated
marketplace.json entries (not just its own nested plugin.json), matching
Anthropic's official marketplace shape, so the Discover UI shows a
description before install instead of a blank "Plugin details" pane.
2026-08-25 00:15:31 -04:00
33 changed files with 479 additions and 88 deletions
+57
View File
@@ -8,6 +8,10 @@
"plugins": [
{
"name": "caveman",
"description": "Ultra-compressed communication mode from JuliusBrussee/caveman \u2014 cuts output tokens while keeping full technical accuracy. Installed straight from the upstream repo, not vendored here.",
"author": {
"name": "Rootiest"
},
"source": {
"source": "github",
"repo": "JuliusBrussee/caveman"
@@ -15,30 +19,58 @@
},
{
"name": "core-essentials",
"description": "Core cross-tool utilities, including delegation to the Antigravity CLI (agy) for grounded research and large multi-file audits.",
"author": {
"name": "Rootiest"
},
"source": "./dist/claude-code/core-essentials"
},
{
"name": "date-time",
"description": "Retrieves the exact current date and time for time-sensitive queries, scheduling, duration calculations, and validating chronological context.",
"author": {
"name": "Rootiest"
},
"source": "./dist/claude-code/date-time"
},
{
"name": "docs-sync-audit",
"description": "Analyzes repository delta since the last documentation update and synchronizes the Single Source of Truth (docs/, wiki, or README) with the current codebase state.",
"author": {
"name": "Rootiest"
},
"source": "./dist/claude-code/docs-sync-audit"
},
{
"name": "git-publish-workflow",
"description": "Automates branching, conventional commits, testing, and PR creation for uncommitted or staged work. Handles both independent and stacked PRs.",
"author": {
"name": "Rootiest"
},
"source": "./dist/claude-code/git-publish-workflow"
},
{
"name": "gitea-mcp",
"description": "Connects Claude Code/agy to a Gitea instance via the official gitea-mcp server, authenticated with GITEA_HOST/GITEA_ACCESS_TOKEN you set locally.",
"author": {
"name": "Rootiest"
},
"source": "./dist/claude-code/gitea-mcp"
},
{
"name": "github-mcp",
"description": "Connects Claude Code/agy to GitHub via the official MCP server, authenticated with a GITHUB_PERSONAL_ACCESS_TOKEN you set locally.",
"author": {
"name": "Rootiest"
},
"source": "./dist/claude-code/github-mcp"
},
{
"name": "mattpocock-skills",
"description": "Matt Pocock's agent skills for real engineering from mattpocock/skills \u2014 grilling, spec/ticket flows, TDD, code review, domain modelling and more. Installed straight from the upstream repo, not vendored here.",
"author": {
"name": "Rootiest"
},
"source": {
"source": "github",
"repo": "mattpocock/skills"
@@ -46,10 +78,18 @@
},
{
"name": "mirror-it",
"description": "Configures a Gitea repository to automatically push-mirror its contents to GitHub using the tea CLI and jq.",
"author": {
"name": "Rootiest"
},
"source": "./dist/claude-code/mirror-it"
},
{
"name": "ponytail",
"description": "Lazy senior dev mode from DietrichGebert/ponytail \u2014 forces the simplest, shortest solution that actually works (YAGNI, stdlib first, no unrequested abstractions). Installed straight from the upstream repo, not vendored here.",
"author": {
"name": "Rootiest"
},
"source": {
"source": "github",
"repo": "DietrichGebert/ponytail"
@@ -57,22 +97,39 @@
},
{
"name": "readme-sync-audit",
"description": "Analyzes repository delta since the last documentation update and synchronizes the README.md with the current codebase state.",
"author": {
"name": "Rootiest"
},
"source": "./dist/claude-code/readme-sync-audit"
},
{
"name": "ship-it",
"description": "Runs a comprehensive pre-flight audit, syncs the README, and publishes the changes to a new PR.",
"author": {
"name": "Rootiest"
},
"source": "./dist/claude-code/ship-it"
},
{
"name": "systematic-enumeration",
"description": "Forces element-by-element verification for finite sets to prevent counting errors.",
"author": {
"name": "Rootiest"
},
"source": "./dist/claude-code/systematic-enumeration"
},
{
"name": "technical-devlog-scribe",
"description": "Generates a highly structured, objective technical summary of a development session.",
"author": {
"name": "Rootiest"
},
"source": "./dist/claude-code/technical-devlog-scribe"
},
{
"name": "rootiest-ai-all",
"description": "Reusable AI skills for Claude Code and Antigravity CLI (all skills)",
"source": "./dist/claude-code/rootiest-ai-all"
}
]
+93 -33
View File
@@ -41,90 +41,142 @@ from one source tree and published as a native marketplace for both tools.
### `systematic-enumeration`
**Purpose:** Eliminate counting and membership errors caused by the model's tendency toward holistic pattern recognition.
**Purpose:** Eliminate counting and membership errors caused by the model's
tendency toward holistic pattern recognition.
When invoked, the AI is required to work through three explicit phases:
1. **Set Definition** — enumerate every member of the finite set before any analysis begins.
2. **Atomic Element Testing** — test each item individually, producing a `[Item] → [Logic] → [Boolean]` record for every element. For character-level checks, the string is split into individual characters to bypass tokenization bias.
3. **Reduction & Summation** — aggregate results and self-verify that the number of items tested exactly matches the set size; if there is a mismatch, Phase 2 restarts.
1. **Set Definition** — enumerate every member of the finite set before any
analysis begins.
2. **Atomic Element Testing** — test each item individually, producing a
`[Item] → [Logic] → [Boolean]` record for every element. For
character-level checks, the string is split into individual characters to
bypass tokenization bias.
3. **Reduction & Summation** — aggregate results and self-verify that the number
of items tested exactly matches the set size; if there is a mismatch, Phase 2
restarts.
**Use when:** counting characters in a string, verifying a property across a list of files or variables, or any membership test where a false negative carries real cost.
**Use when:** counting characters in a string, verifying a property across a
list of files or variables, or any membership test where a false negative
carries real cost.
---
### `git-publish-workflow`
**Purpose:** Automate the full lifecycle from uncommitted local work to an open Pull Request, with built-in quality gates.
**Purpose:** Automate the full lifecycle from uncommitted local work to an open
Pull Request, with built-in quality gates.
The workflow runs three phases:
1. **Scope Determination** — if staged changes exist, operate only on those; otherwise operate on all modified/untracked files.
2. **Safe-Commit Sequence** — generate a `kebab-case` branch name, compose a [Conventional Commits](https://www.conventionalcommits.org/) message, then run the project's primary test/lint/build command. If verification fails, the sequence stops — nothing is pushed.
3. **Remote Integration** — push the branch, open a PR against the default branch, and populate the description with a "Why/What" summary and a manual verification checklist (`- [ ]` items).
1. **Scope Determination** — if staged changes exist, operate only on those;
otherwise operate on all modified/untracked files.
2. **Safe-Commit Sequence** — generate a `kebab-case` branch name, compose a
[Conventional Commits](https://www.conventionalcommits.org/) message, then
run the project's primary test/lint/build command. If verification fails, the
sequence stops — nothing is pushed.
3. **Remote Integration** — push the branch, open a PR against the default
branch, and populate the description with a "Why/What" summary and a manual
verification checklist (`- [ ]` items).
**Use when:** you say "Ship this," "Make a PR," or invoke `/git-publish-workflow`.
**Use when:** you say "Ship this," "Make a PR," or invoke
`/git-publish-workflow`.
---
### `readme-sync-audit`
**Purpose:** Keep `README.md` accurate by programmatically aligning it with the current state of the codebase.
**Purpose:** Keep `README.md` accurate by programmatically aligning it with the
current state of the codebase.
Three-phase execution:
1. **Delta Analysis** — locate the last commit that touched `README.md`, diff all code changes from that point to `HEAD`, and extract undocumented environment variables, CLI flags, or API changes.
2. **Pruning & Update Audit** — remove stale setup steps or "Coming Soon" notes, correct version numbers and file paths, and synthesize documentation for newly discovered features.
3. **Structural Integrity Check** — verify that Quick Start commands still work, all config keys are listed, and code snippets match the current API.
1. **Delta Analysis** — locate the last commit that touched `README.md`, diff
all code changes from that point to `HEAD`, and extract undocumented
environment variables, CLI flags, or API changes.
2. **Pruning & Update Audit** — remove stale setup steps or "Coming Soon" notes,
correct version numbers and file paths, and synthesize documentation for
newly discovered features.
3. **Structural Integrity Check** — verify that Quick Start commands still work,
all config keys are listed, and code snippets match the current API.
**Use when:** you say "Update the docs," "Sync the README," or invoke `/readme-sync-audit`.
**Use when:** you say "Update the docs," "Sync the README," or invoke
`/readme-sync-audit`.
---
### `docs-sync-audit`
**Purpose:** Keep documentation accurate by aligning the project's Single Source of Truth (SSoT) with the current state of the codebase.
**Purpose:** Keep documentation accurate by aligning the project's Single
Source of Truth (SSoT) with the current state of the codebase.
Unlike `readme-sync-audit`, this skill first discovers the documentation root. If a dedicated `docs/`, `wiki/`, or site config (e.g. `mkdocs.yml`) exists, it is treated as the SSoT and receives the detailed updates; the `README.md` is then kept as a high-level landing page that links into it. If no docs directory exists, it falls back to `README.md` as the SSoT.
Unlike `readme-sync-audit`, this skill first discovers the documentation root.
If a dedicated `docs/`, `wiki/`, or site config (e.g. `mkdocs.yml`) exists, it is
treated as the SSoT and receives the detailed updates; the `README.md` is then
kept as a high-level landing page that links into it. If no docs directory
exists, it falls back to `README.md` as the SSoT.
Three-phase execution:
1. **Delta Analysis** — locate the last commit that touched the SSoT, diff all code changes to `HEAD`, and extract undocumented environment variables, CLI flags, or API changes.
2. **Pruning & Update Audit** — route detailed changes to the correct files, remove stale steps, correct versions and paths, and synthesize docs for new features.
3. **Structural Integrity Check** — verify Quick Start commands, configuration keys, and usage examples still match the implementation.
1. **Delta Analysis** — locate the last commit that touched the SSoT, diff all
code changes to `HEAD`, and extract undocumented environment variables, CLI
flags, or API changes.
2. **Pruning & Update Audit** — route detailed changes to the correct files,
remove stale steps, correct versions and paths, and synthesize docs for new
features.
3. **Structural Integrity Check** — verify Quick Start commands, configuration
keys, and usage examples still match the implementation.
**Use when:** you say "Update the docs," "Sync the wiki," or invoke `/docs-sync-audit`.
**Use when:** you say "Update the docs," "Sync the wiki," or invoke
`/docs-sync-audit`.
---
### `date-time`
**Purpose:** Retrieve the exact, real-time current date and time when a task depends on the present moment.
**Purpose:** Retrieve the exact, real-time current date and time when a task
depends on the present moment.
The skill runs the system `date` command rather than guessing, then uses the result for time-sensitive reasoning.
The skill runs the system `date` command rather than guessing, then uses the
result for time-sensitive reasoning.
**Use when:** the request asks for the current date/time, uses relative expressions ("today", "next week", "recently"), or needs an age, duration, countdown, or check of whether an event has already occurred.
**Use when:** the request asks for the current date/time, uses relative
expressions ("today", "next week", "recently"), or needs an age, duration,
countdown, or check of whether an event has already occurred.
---
### `technical-devlog-scribe`
**Purpose:** Produce a dense, objective technical summary of a development session as a durable historical record optimized for future context loading.
**Purpose:** Produce a dense, objective technical summary of a development
session as a durable historical record optimized for future context loading.
The skill writes a structured Markdown file to `AGENTS/devlogs/<kebab-case-short-description>.md`, with YAML frontmatter (date, title, tags, status) followed by the session summary. It relies strictly on what happened in the session — no hallucinated external constraints — and avoids conversational filler.
The skill writes a structured Markdown file to
`AGENTS/devlogs/<kebab-case-short-description>.md`, with YAML frontmatter (date,
title, tags, status) followed by the session summary. It relies strictly on
what happened in the session — no hallucinated external constraints — and
avoids conversational filler.
**Use when:** you say "session wrap-up," "write a devlog," "done for the day," or want an auditable record of what changed and why.
**Use when:** you say "session wrap-up," "write a devlog," "done for the day,"
or want an auditable record of what changed and why.
---
### `ship-it`
**Purpose:** Run a comprehensive pre-flight audit and publish changes to a new PR in a single command.
**Purpose:** Run a comprehensive pre-flight audit and publish changes to a new
PR in a single command.
Two sequential phases — Phase 2 is blocked until Phase 1 succeeds:
1. **Documentation Sync & Code Audit** — acts as `/docs-sync-audit`: scans all file changes since the last documentation edit, updates the docs/README to match the current codebase, and audits code files for syntax errors or regressions. **Halts the entire workflow** if any breaking issue is found.
2. **Git Publish Workflow** — acts as `/git-publish-workflow`: creates a descriptively named branch, commits all pending changes (including the README updates from Phase 1), pushes to the remote, and opens a Pull Request against `main`.
1. **Documentation Sync & Code Audit** — acts as `/docs-sync-audit`: scans all
file changes since the last documentation edit, updates the docs/README to
match the current codebase, and audits code files for syntax errors or
regressions. **Halts the entire workflow** if any breaking issue is found.
2. **Git Publish Workflow** — acts as `/git-publish-workflow`: creates a
descriptively named branch, commits all pending changes (including the
README updates from Phase 1), pushes to the remote, and opens a Pull Request
against `main`.
**Use when:** you say "Ship this," "Publish my changes," or invoke `/ship-it`.
@@ -132,11 +184,19 @@ Two sequential phases — Phase 2 is blocked until Phase 1 succeeds:
### `mirror-it`
**Purpose:** Register a Gitea push mirror so a repository's commits are automatically forwarded to a corresponding GitHub repository.
**Purpose:** Register a Gitea push mirror so a repository's commits are
automatically forwarded to a corresponding GitHub repository.
Uses `tea api` against Gitea's `push_mirrors` endpoint, with credentials passed as `remote_username`/`remote_password` fields — never embedded in the mirror URL. Defaults to an `8h` sync interval with sync-on-commit enabled; both are overridable per request, as is the destination repository name. `GITHUB_USER`/`GITHUB_TOKEN` can come from the environment or, as a fallback, a repo-root `.env` file. All shell snippets are POSIX-compatible so the skill works under bash, zsh, or any shell the agent's tool happens to invoke — not just Fish.
Uses `tea api` against Gitea's `push_mirrors` endpoint, with credentials passed
as `remote_username`/`remote_password` fields — never embedded in the mirror
URL. Defaults to an `8h` sync interval with sync-on-commit enabled; both are
overridable per request, as is the destination repository name.
`GITHUB_USER`/`GITHUB_TOKEN` can come from the environment or, as a fallback, a
repo-root `.env` file.
**Use when:** you say "Mirror this repository to GitHub," or invoke `/mirror-it`. Only relevant for repositories hosted on Gitea — GitHub can't push-mirror to itself.
**Use when:** you say "Mirror this repository to GitHub," or invoke
`/mirror-it`. Only relevant for repositories hosted on Gitea — GitHub can't
push-mirror to itself.
---
+50 -5
View File
@@ -1,7 +1,7 @@
---
name: mirror-it
description: Configures a Gitea repository to automatically push-mirror its contents to GitHub using the `tea` CLI and `jq`.
version: 1.0.0
version: 1.1.0
user-invocable: true
author: Rootiest
---
@@ -40,6 +40,10 @@ Activate this skill ONLY when one of the following is met:
- `$GITHUB_USER` and `$GITHUB_TOKEN` (a GitHub PAT with `repo` scope) are available before step 3
below — either already exported in the environment, or defined in a `.env` file at the
repository root (see step 1).
- Optionally, one of the following for the target-repo check/creation in step 4: the `gh` CLI
(authenticated — `gh auth status`), a GitHub MCP server, or plain `$GITHUB_TOKEN` used directly
against the GitHub REST API via `curl`. The first of these that's available is used; if none
are, step 4 degrades to a warning instead of blocking the skill.
## Defaults & Overrides
Unless the user says otherwise, assume:
@@ -64,9 +68,48 @@ name 'exmpl_cfg'" → `$TARGET_REPO` becomes `exmpl_cfg`, `$SYNC_ON_COMMIT` beco
2. Identify the current Gitea repository's owner (`$OWNER`) and name (`$SOURCE_REPO`).
3. Determine `$TARGET_REPO`, `$INTERVAL`, and `$SYNC_ON_COMMIT` from the defaults above,
applying any user overrides.
4. Run the following snippet, substituting those values. Credentials are passed as separate
`remote_username`/`remote_password` fields — never embedded in the mirror URL — per Gitea's
`CreatePushMirrorOption` schema.
4. **Ensure the GitHub target repository exists.** GitHub, unlike Gitea, does not create a
repository on first push — if `$GITHUB_USER/$TARGET_REPO` doesn't exist yet, the mirror will
register successfully but every sync attempt will fail. Check for the repo and create it if
missing, using whichever of these is available (in order of preference):
- **`gh` CLI** (preferred if authenticated — `gh auth status`):
```sh
if ! gh repo view "$GITHUB_USER/$TARGET_REPO" >/dev/null 2>&1; then
gh repo create "$GITHUB_USER/$TARGET_REPO" --private --description "Push mirror of $OWNER/$SOURCE_REPO"
fi
```
Match visibility to the source repo where you can determine it (e.g. via `tea api
"repos/$OWNER/$SOURCE_REPO"` → `.private`); otherwise default to `--private` and mention the
choice when reporting the outcome.
- **GitHub MCP server**, if one is connected: use its repo-lookup tool to check for
`$GITHUB_USER/$TARGET_REPO`, and its repo-creation tool to create it (private by default) if
absent.
- **Plain REST API via `curl`**, using `$GITHUB_TOKEN` directly, if neither of the above is
available:
```sh
status=$(curl -s -o /dev/null -w '%{http_code}' \
-H "Authorization: Bearer $GITHUB_TOKEN" \
"https://api.github.com/repos/$GITHUB_USER/$TARGET_REPO")
if [ "$status" = "404" ]; then
curl -s -X POST \
-H "Authorization: Bearer $GITHUB_TOKEN" \
-H "Accept: application/vnd.github+json" \
https://api.github.com/user/repos \
-d "$(jq -n --arg name "$TARGET_REPO" '{name: $name, private: true}')" \
>/dev/null
fi
```
- **If none of these are available**, don't block on it — proceed to step 5, but warn the user
clearly that they must create `$GITHUB_USER/$TARGET_REPO` on GitHub themselves before the
mirror's first sync will succeed.
If a repo already exists at the target address, leave it as-is and continue — do not treat this
as an error.
5. Run the following snippet, substituting the values from steps 23. Credentials are passed as
separate `remote_username`/`remote_password` fields — never embedded in the mirror URL — per
Gitea's `CreatePushMirrorOption` schema.
```sh
# $OWNER / $SOURCE_REPO identify the local Gitea API endpoint.
@@ -85,4 +128,6 @@ payload=$(jq -n \
tea api --method POST --data "$payload" "repos/$OWNER/$SOURCE_REPO/push_mirrors"
```
5. Report the outcome to the user, without echoing the request body, `.env` contents, or token.
6. Report the outcome to the user, without echoing the request body, `.env` contents, or token
including whether the GitHub repo already existed or was just created, and, if step 4 had no
capability to check/create it, a reminder that they need to create it manually.
+50 -5
View File
@@ -1,7 +1,7 @@
---
name: mirror-it
description: Configures a Gitea repository to automatically push-mirror its contents to GitHub using the `tea` CLI and `jq`.
version: 1.0.0
version: 1.1.0
user-invocable: true
author: Rootiest
---
@@ -40,6 +40,10 @@ Activate this skill ONLY when one of the following is met:
- `$GITHUB_USER` and `$GITHUB_TOKEN` (a GitHub PAT with `repo` scope) are available before step 3
below — either already exported in the environment, or defined in a `.env` file at the
repository root (see step 1).
- Optionally, one of the following for the target-repo check/creation in step 4: the `gh` CLI
(authenticated — `gh auth status`), a GitHub MCP server, or plain `$GITHUB_TOKEN` used directly
against the GitHub REST API via `curl`. The first of these that's available is used; if none
are, step 4 degrades to a warning instead of blocking the skill.
## Defaults & Overrides
Unless the user says otherwise, assume:
@@ -64,9 +68,48 @@ name 'exmpl_cfg'" → `$TARGET_REPO` becomes `exmpl_cfg`, `$SYNC_ON_COMMIT` beco
2. Identify the current Gitea repository's owner (`$OWNER`) and name (`$SOURCE_REPO`).
3. Determine `$TARGET_REPO`, `$INTERVAL`, and `$SYNC_ON_COMMIT` from the defaults above,
applying any user overrides.
4. Run the following snippet, substituting those values. Credentials are passed as separate
`remote_username`/`remote_password` fields — never embedded in the mirror URL — per Gitea's
`CreatePushMirrorOption` schema.
4. **Ensure the GitHub target repository exists.** GitHub, unlike Gitea, does not create a
repository on first push — if `$GITHUB_USER/$TARGET_REPO` doesn't exist yet, the mirror will
register successfully but every sync attempt will fail. Check for the repo and create it if
missing, using whichever of these is available (in order of preference):
- **`gh` CLI** (preferred if authenticated — `gh auth status`):
```sh
if ! gh repo view "$GITHUB_USER/$TARGET_REPO" >/dev/null 2>&1; then
gh repo create "$GITHUB_USER/$TARGET_REPO" --private --description "Push mirror of $OWNER/$SOURCE_REPO"
fi
```
Match visibility to the source repo where you can determine it (e.g. via `tea api
"repos/$OWNER/$SOURCE_REPO"` → `.private`); otherwise default to `--private` and mention the
choice when reporting the outcome.
- **GitHub MCP server**, if one is connected: use its repo-lookup tool to check for
`$GITHUB_USER/$TARGET_REPO`, and its repo-creation tool to create it (private by default) if
absent.
- **Plain REST API via `curl`**, using `$GITHUB_TOKEN` directly, if neither of the above is
available:
```sh
status=$(curl -s -o /dev/null -w '%{http_code}' \
-H "Authorization: Bearer $GITHUB_TOKEN" \
"https://api.github.com/repos/$GITHUB_USER/$TARGET_REPO")
if [ "$status" = "404" ]; then
curl -s -X POST \
-H "Authorization: Bearer $GITHUB_TOKEN" \
-H "Accept: application/vnd.github+json" \
https://api.github.com/user/repos \
-d "$(jq -n --arg name "$TARGET_REPO" '{name: $name, private: true}')" \
>/dev/null
fi
```
- **If none of these are available**, don't block on it — proceed to step 5, but warn the user
clearly that they must create `$GITHUB_USER/$TARGET_REPO` on GitHub themselves before the
mirror's first sync will succeed.
If a repo already exists at the target address, leave it as-is and continue — do not treat this
as an error.
5. Run the following snippet, substituting the values from steps 23. Credentials are passed as
separate `remote_username`/`remote_password` fields — never embedded in the mirror URL — per
Gitea's `CreatePushMirrorOption` schema.
```sh
# $OWNER / $SOURCE_REPO identify the local Gitea API endpoint.
@@ -85,4 +128,6 @@ payload=$(jq -n \
tea api --method POST --data "$payload" "repos/$OWNER/$SOURCE_REPO/push_mirrors"
```
5. Report the outcome to the user, without echoing the request body, `.env` contents, or token.
6. Report the outcome to the user, without echoing the request body, `.env` contents, or token
including whether the GitHub repo already existed or was just created, and, if step 4 had no
capability to check/create it, a reminder that they need to create it manually.
@@ -2,5 +2,7 @@
"name": "core-essentials",
"description": "Core cross-tool utilities, including delegation to the Antigravity CLI (agy) for grounded research and large multi-file audits.",
"version": "1.0.0",
"author": "Rootiest"
"author": {
"name": "Rootiest"
}
}
+3 -1
View File
@@ -2,5 +2,7 @@
"name": "date-time",
"description": "Retrieves the exact current date and time for time-sensitive queries, scheduling, duration calculations, and validating chronological context.",
"version": "1.0.0",
"author": "Rootiest"
"author": {
"name": "Rootiest"
}
}
@@ -2,5 +2,7 @@
"name": "docs-sync-audit",
"description": "Analyzes repository delta since the last documentation update and synchronizes the Single Source of Truth (docs/, wiki, or README) with the current codebase state.",
"version": "1.3.0",
"author": "Rootiest"
"author": {
"name": "Rootiest"
}
}
@@ -2,5 +2,7 @@
"name": "git-publish-workflow",
"description": "Automates branching, conventional commits, testing, and PR creation for uncommitted or staged work. Handles both independent and stacked PRs.",
"version": "1.2.0",
"author": "Rootiest"
"author": {
"name": "Rootiest"
}
}
+3 -1
View File
@@ -2,5 +2,7 @@
"name": "gitea-mcp",
"description": "Connects Claude Code/agy to a Gitea instance via the official gitea-mcp server, authenticated with GITEA_HOST/GITEA_ACCESS_TOKEN you set locally.",
"version": "1.0.0",
"author": "Rootiest"
"author": {
"name": "Rootiest"
}
}
+3 -1
View File
@@ -2,5 +2,7 @@
"name": "github-mcp",
"description": "Connects Claude Code/agy to GitHub via the official MCP server, authenticated with a GITHUB_PERSONAL_ACCESS_TOKEN you set locally.",
"version": "1.0.0",
"author": "Rootiest"
"author": {
"name": "Rootiest"
}
}
+4 -2
View File
@@ -1,6 +1,8 @@
{
"name": "mirror-it",
"description": "Configures a Gitea repository to automatically push-mirror its contents to GitHub using the tea CLI and jq.",
"version": "1.0.0",
"author": "Rootiest"
"version": "1.1.0",
"author": {
"name": "Rootiest"
}
}
+50 -5
View File
@@ -1,7 +1,7 @@
---
name: mirror-it
description: Configures a Gitea repository to automatically push-mirror its contents to GitHub using the `tea` CLI and `jq`.
version: 1.0.0
version: 1.1.0
user-invocable: true
author: Rootiest
---
@@ -40,6 +40,10 @@ Activate this skill ONLY when one of the following is met:
- `$GITHUB_USER` and `$GITHUB_TOKEN` (a GitHub PAT with `repo` scope) are available before step 3
below — either already exported in the environment, or defined in a `.env` file at the
repository root (see step 1).
- Optionally, one of the following for the target-repo check/creation in step 4: the `gh` CLI
(authenticated — `gh auth status`), a GitHub MCP server, or plain `$GITHUB_TOKEN` used directly
against the GitHub REST API via `curl`. The first of these that's available is used; if none
are, step 4 degrades to a warning instead of blocking the skill.
## Defaults & Overrides
Unless the user says otherwise, assume:
@@ -64,9 +68,48 @@ name 'exmpl_cfg'" → `$TARGET_REPO` becomes `exmpl_cfg`, `$SYNC_ON_COMMIT` beco
2. Identify the current Gitea repository's owner (`$OWNER`) and name (`$SOURCE_REPO`).
3. Determine `$TARGET_REPO`, `$INTERVAL`, and `$SYNC_ON_COMMIT` from the defaults above,
applying any user overrides.
4. Run the following snippet, substituting those values. Credentials are passed as separate
`remote_username`/`remote_password` fields — never embedded in the mirror URL — per Gitea's
`CreatePushMirrorOption` schema.
4. **Ensure the GitHub target repository exists.** GitHub, unlike Gitea, does not create a
repository on first push — if `$GITHUB_USER/$TARGET_REPO` doesn't exist yet, the mirror will
register successfully but every sync attempt will fail. Check for the repo and create it if
missing, using whichever of these is available (in order of preference):
- **`gh` CLI** (preferred if authenticated — `gh auth status`):
```sh
if ! gh repo view "$GITHUB_USER/$TARGET_REPO" >/dev/null 2>&1; then
gh repo create "$GITHUB_USER/$TARGET_REPO" --private --description "Push mirror of $OWNER/$SOURCE_REPO"
fi
```
Match visibility to the source repo where you can determine it (e.g. via `tea api
"repos/$OWNER/$SOURCE_REPO"` → `.private`); otherwise default to `--private` and mention the
choice when reporting the outcome.
- **GitHub MCP server**, if one is connected: use its repo-lookup tool to check for
`$GITHUB_USER/$TARGET_REPO`, and its repo-creation tool to create it (private by default) if
absent.
- **Plain REST API via `curl`**, using `$GITHUB_TOKEN` directly, if neither of the above is
available:
```sh
status=$(curl -s -o /dev/null -w '%{http_code}' \
-H "Authorization: Bearer $GITHUB_TOKEN" \
"https://api.github.com/repos/$GITHUB_USER/$TARGET_REPO")
if [ "$status" = "404" ]; then
curl -s -X POST \
-H "Authorization: Bearer $GITHUB_TOKEN" \
-H "Accept: application/vnd.github+json" \
https://api.github.com/user/repos \
-d "$(jq -n --arg name "$TARGET_REPO" '{name: $name, private: true}')" \
>/dev/null
fi
```
- **If none of these are available**, don't block on it — proceed to step 5, but warn the user
clearly that they must create `$GITHUB_USER/$TARGET_REPO` on GitHub themselves before the
mirror's first sync will succeed.
If a repo already exists at the target address, leave it as-is and continue — do not treat this
as an error.
5. Run the following snippet, substituting the values from steps 23. Credentials are passed as
separate `remote_username`/`remote_password` fields — never embedded in the mirror URL — per
Gitea's `CreatePushMirrorOption` schema.
```sh
# $OWNER / $SOURCE_REPO identify the local Gitea API endpoint.
@@ -85,4 +128,6 @@ payload=$(jq -n \
tea api --method POST --data "$payload" "repos/$OWNER/$SOURCE_REPO/push_mirrors"
```
5. Report the outcome to the user, without echoing the request body, `.env` contents, or token.
6. Report the outcome to the user, without echoing the request body, `.env` contents, or token
including whether the GitHub repo already existed or was just created, and, if step 4 had no
capability to check/create it, a reminder that they need to create it manually.
@@ -2,5 +2,7 @@
"name": "readme-sync-audit",
"description": "Analyzes repository delta since the last documentation update and synchronizes the README.md with the current codebase state.",
"version": "1.2.0",
"author": "Rootiest"
"author": {
"name": "Rootiest"
}
}
+50 -5
View File
@@ -1,7 +1,7 @@
---
name: mirror-it
description: Configures a Gitea repository to automatically push-mirror its contents to GitHub using the `tea` CLI and `jq`.
version: 1.0.0
version: 1.1.0
user-invocable: true
author: Rootiest
---
@@ -40,6 +40,10 @@ Activate this skill ONLY when one of the following is met:
- `$GITHUB_USER` and `$GITHUB_TOKEN` (a GitHub PAT with `repo` scope) are available before step 3
below — either already exported in the environment, or defined in a `.env` file at the
repository root (see step 1).
- Optionally, one of the following for the target-repo check/creation in step 4: the `gh` CLI
(authenticated — `gh auth status`), a GitHub MCP server, or plain `$GITHUB_TOKEN` used directly
against the GitHub REST API via `curl`. The first of these that's available is used; if none
are, step 4 degrades to a warning instead of blocking the skill.
## Defaults & Overrides
Unless the user says otherwise, assume:
@@ -64,9 +68,48 @@ name 'exmpl_cfg'" → `$TARGET_REPO` becomes `exmpl_cfg`, `$SYNC_ON_COMMIT` beco
2. Identify the current Gitea repository's owner (`$OWNER`) and name (`$SOURCE_REPO`).
3. Determine `$TARGET_REPO`, `$INTERVAL`, and `$SYNC_ON_COMMIT` from the defaults above,
applying any user overrides.
4. Run the following snippet, substituting those values. Credentials are passed as separate
`remote_username`/`remote_password` fields — never embedded in the mirror URL — per Gitea's
`CreatePushMirrorOption` schema.
4. **Ensure the GitHub target repository exists.** GitHub, unlike Gitea, does not create a
repository on first push — if `$GITHUB_USER/$TARGET_REPO` doesn't exist yet, the mirror will
register successfully but every sync attempt will fail. Check for the repo and create it if
missing, using whichever of these is available (in order of preference):
- **`gh` CLI** (preferred if authenticated — `gh auth status`):
```sh
if ! gh repo view "$GITHUB_USER/$TARGET_REPO" >/dev/null 2>&1; then
gh repo create "$GITHUB_USER/$TARGET_REPO" --private --description "Push mirror of $OWNER/$SOURCE_REPO"
fi
```
Match visibility to the source repo where you can determine it (e.g. via `tea api
"repos/$OWNER/$SOURCE_REPO"` → `.private`); otherwise default to `--private` and mention the
choice when reporting the outcome.
- **GitHub MCP server**, if one is connected: use its repo-lookup tool to check for
`$GITHUB_USER/$TARGET_REPO`, and its repo-creation tool to create it (private by default) if
absent.
- **Plain REST API via `curl`**, using `$GITHUB_TOKEN` directly, if neither of the above is
available:
```sh
status=$(curl -s -o /dev/null -w '%{http_code}' \
-H "Authorization: Bearer $GITHUB_TOKEN" \
"https://api.github.com/repos/$GITHUB_USER/$TARGET_REPO")
if [ "$status" = "404" ]; then
curl -s -X POST \
-H "Authorization: Bearer $GITHUB_TOKEN" \
-H "Accept: application/vnd.github+json" \
https://api.github.com/user/repos \
-d "$(jq -n --arg name "$TARGET_REPO" '{name: $name, private: true}')" \
>/dev/null
fi
```
- **If none of these are available**, don't block on it — proceed to step 5, but warn the user
clearly that they must create `$GITHUB_USER/$TARGET_REPO` on GitHub themselves before the
mirror's first sync will succeed.
If a repo already exists at the target address, leave it as-is and continue — do not treat this
as an error.
5. Run the following snippet, substituting the values from steps 23. Credentials are passed as
separate `remote_username`/`remote_password` fields — never embedded in the mirror URL — per
Gitea's `CreatePushMirrorOption` schema.
```sh
# $OWNER / $SOURCE_REPO identify the local Gitea API endpoint.
@@ -85,4 +128,6 @@ payload=$(jq -n \
tea api --method POST --data "$payload" "repos/$OWNER/$SOURCE_REPO/push_mirrors"
```
5. Report the outcome to the user, without echoing the request body, `.env` contents, or token.
6. Report the outcome to the user, without echoing the request body, `.env` contents, or token
including whether the GitHub repo already existed or was just created, and, if step 4 had no
capability to check/create it, a reminder that they need to create it manually.
+3 -1
View File
@@ -2,5 +2,7 @@
"name": "ship-it",
"description": "Runs a comprehensive pre-flight audit, syncs the README, and publishes the changes to a new PR.",
"version": "1.0.0",
"author": "Rootiest"
"author": {
"name": "Rootiest"
}
}
@@ -2,5 +2,7 @@
"name": "systematic-enumeration",
"description": "Forces element-by-element verification for finite sets to prevent counting errors.",
"version": "1.0.0",
"author": "Rootiest"
"author": {
"name": "Rootiest"
}
}
@@ -2,5 +2,7 @@
"name": "technical-devlog-scribe",
"description": "Generates a highly structured, objective technical summary of a development session.",
"version": "1.0.0",
"author": "Rootiest"
"author": {
"name": "Rootiest"
}
}
+1 -1
View File
@@ -2,7 +2,7 @@
"name": "caveman",
"description": "Ultra-compressed communication mode from JuliusBrussee/caveman — cuts output tokens while keeping full technical accuracy. Installed straight from the upstream repo, not vendored here.",
"version": "1.0.0",
"author": "Rootiest",
"author": { "name": "Rootiest" },
"targets": ["claude-code"],
"external": {
"claude-code": {
+1 -1
View File
@@ -2,5 +2,5 @@
"name": "core-essentials",
"description": "Core cross-tool utilities, including delegation to the Antigravity CLI (agy) for grounded research and large multi-file audits.",
"version": "1.0.0",
"author": "Rootiest"
"author": { "name": "Rootiest" }
}
+1 -1
View File
@@ -2,5 +2,5 @@
"name": "date-time",
"description": "Retrieves the exact current date and time for time-sensitive queries, scheduling, duration calculations, and validating chronological context.",
"version": "1.0.0",
"author": "Rootiest"
"author": { "name": "Rootiest" }
}
+1 -1
View File
@@ -2,5 +2,5 @@
"name": "docs-sync-audit",
"description": "Analyzes repository delta since the last documentation update and synchronizes the Single Source of Truth (docs/, wiki, or README) with the current codebase state.",
"version": "1.3.0",
"author": "Rootiest"
"author": { "name": "Rootiest" }
}
+1 -1
View File
@@ -2,5 +2,5 @@
"name": "git-publish-workflow",
"description": "Automates branching, conventional commits, testing, and PR creation for uncommitted or staged work. Handles both independent and stacked PRs.",
"version": "1.2.0",
"author": "Rootiest"
"author": { "name": "Rootiest" }
}
+1 -1
View File
@@ -2,5 +2,5 @@
"name": "gitea-mcp",
"description": "Connects Claude Code/agy to a Gitea instance via the official gitea-mcp server, authenticated with GITEA_HOST/GITEA_ACCESS_TOKEN you set locally.",
"version": "1.0.0",
"author": "Rootiest"
"author": { "name": "Rootiest" }
}
+1 -1
View File
@@ -2,5 +2,5 @@
"name": "github-mcp",
"description": "Connects Claude Code/agy to GitHub via the official MCP server, authenticated with a GITHUB_PERSONAL_ACCESS_TOKEN you set locally.",
"version": "1.0.0",
"author": "Rootiest"
"author": { "name": "Rootiest" }
}
+1 -1
View File
@@ -2,7 +2,7 @@
"name": "mattpocock-skills",
"description": "Matt Pocock's agent skills for real engineering from mattpocock/skills — grilling, spec/ticket flows, TDD, code review, domain modelling and more. Installed straight from the upstream repo, not vendored here.",
"version": "1.0.0",
"author": "Rootiest",
"author": { "name": "Rootiest" },
"targets": ["claude-code"],
"external": {
"claude-code": {
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "mirror-it",
"description": "Configures a Gitea repository to automatically push-mirror its contents to GitHub using the tea CLI and jq.",
"version": "1.0.0",
"author": "Rootiest"
"version": "1.1.0",
"author": { "name": "Rootiest" }
}
+50 -5
View File
@@ -1,7 +1,7 @@
---
name: mirror-it
description: Configures a Gitea repository to automatically push-mirror its contents to GitHub using the `tea` CLI and `jq`.
version: 1.0.0
version: 1.1.0
user-invocable: true
author: Rootiest
---
@@ -40,6 +40,10 @@ Activate this skill ONLY when one of the following is met:
- `$GITHUB_USER` and `$GITHUB_TOKEN` (a GitHub PAT with `repo` scope) are available before step 3
below — either already exported in the environment, or defined in a `.env` file at the
repository root (see step 1).
- Optionally, one of the following for the target-repo check/creation in step 4: the `gh` CLI
(authenticated — `gh auth status`), a GitHub MCP server, or plain `$GITHUB_TOKEN` used directly
against the GitHub REST API via `curl`. The first of these that's available is used; if none
are, step 4 degrades to a warning instead of blocking the skill.
## Defaults & Overrides
Unless the user says otherwise, assume:
@@ -64,9 +68,48 @@ name 'exmpl_cfg'" → `$TARGET_REPO` becomes `exmpl_cfg`, `$SYNC_ON_COMMIT` beco
2. Identify the current Gitea repository's owner (`$OWNER`) and name (`$SOURCE_REPO`).
3. Determine `$TARGET_REPO`, `$INTERVAL`, and `$SYNC_ON_COMMIT` from the defaults above,
applying any user overrides.
4. Run the following snippet, substituting those values. Credentials are passed as separate
`remote_username`/`remote_password` fields — never embedded in the mirror URL — per Gitea's
`CreatePushMirrorOption` schema.
4. **Ensure the GitHub target repository exists.** GitHub, unlike Gitea, does not create a
repository on first push — if `$GITHUB_USER/$TARGET_REPO` doesn't exist yet, the mirror will
register successfully but every sync attempt will fail. Check for the repo and create it if
missing, using whichever of these is available (in order of preference):
- **`gh` CLI** (preferred if authenticated — `gh auth status`):
```sh
if ! gh repo view "$GITHUB_USER/$TARGET_REPO" >/dev/null 2>&1; then
gh repo create "$GITHUB_USER/$TARGET_REPO" --private --description "Push mirror of $OWNER/$SOURCE_REPO"
fi
```
Match visibility to the source repo where you can determine it (e.g. via `tea api
"repos/$OWNER/$SOURCE_REPO"` → `.private`); otherwise default to `--private` and mention the
choice when reporting the outcome.
- **GitHub MCP server**, if one is connected: use its repo-lookup tool to check for
`$GITHUB_USER/$TARGET_REPO`, and its repo-creation tool to create it (private by default) if
absent.
- **Plain REST API via `curl`**, using `$GITHUB_TOKEN` directly, if neither of the above is
available:
```sh
status=$(curl -s -o /dev/null -w '%{http_code}' \
-H "Authorization: Bearer $GITHUB_TOKEN" \
"https://api.github.com/repos/$GITHUB_USER/$TARGET_REPO")
if [ "$status" = "404" ]; then
curl -s -X POST \
-H "Authorization: Bearer $GITHUB_TOKEN" \
-H "Accept: application/vnd.github+json" \
https://api.github.com/user/repos \
-d "$(jq -n --arg name "$TARGET_REPO" '{name: $name, private: true}')" \
>/dev/null
fi
```
- **If none of these are available**, don't block on it — proceed to step 5, but warn the user
clearly that they must create `$GITHUB_USER/$TARGET_REPO` on GitHub themselves before the
mirror's first sync will succeed.
If a repo already exists at the target address, leave it as-is and continue — do not treat this
as an error.
5. Run the following snippet, substituting the values from steps 23. Credentials are passed as
separate `remote_username`/`remote_password` fields — never embedded in the mirror URL — per
Gitea's `CreatePushMirrorOption` schema.
```sh
# $OWNER / $SOURCE_REPO identify the local Gitea API endpoint.
@@ -85,4 +128,6 @@ payload=$(jq -n \
tea api --method POST --data "$payload" "repos/$OWNER/$SOURCE_REPO/push_mirrors"
```
5. Report the outcome to the user, without echoing the request body, `.env` contents, or token.
6. Report the outcome to the user, without echoing the request body, `.env` contents, or token
including whether the GitHub repo already existed or was just created, and, if step 4 had no
capability to check/create it, a reminder that they need to create it manually.
+1 -1
View File
@@ -2,7 +2,7 @@
"name": "ponytail",
"description": "Lazy senior dev mode from DietrichGebert/ponytail — forces the simplest, shortest solution that actually works (YAGNI, stdlib first, no unrequested abstractions). Installed straight from the upstream repo, not vendored here.",
"version": "1.0.0",
"author": "Rootiest",
"author": { "name": "Rootiest" },
"targets": ["claude-code"],
"external": {
"claude-code": {
+1 -1
View File
@@ -2,5 +2,5 @@
"name": "readme-sync-audit",
"description": "Analyzes repository delta since the last documentation update and synchronizes the README.md with the current codebase state.",
"version": "1.2.0",
"author": "Rootiest"
"author": { "name": "Rootiest" }
}
+1 -1
View File
@@ -2,5 +2,5 @@
"name": "ship-it",
"description": "Runs a comprehensive pre-flight audit, syncs the README, and publishes the changes to a new PR.",
"version": "1.0.0",
"author": "Rootiest"
"author": { "name": "Rootiest" }
}
+1 -1
View File
@@ -2,5 +2,5 @@
"name": "systematic-enumeration",
"description": "Forces element-by-element verification for finite sets to prevent counting errors.",
"version": "1.0.0",
"author": "Rootiest"
"author": { "name": "Rootiest" }
}
+1 -1
View File
@@ -2,5 +2,5 @@
"name": "technical-devlog-scribe",
"description": "Generates a highly structured, objective technical summary of a development session.",
"version": "1.0.0",
"author": "Rootiest"
"author": { "name": "Rootiest" }
}
+30 -3
View File
@@ -159,6 +159,17 @@ def validate_targets(value: "list | None", valid_targets: list[str], context: st
return value
def validate_author(value: "dict | str | None", context: str) -> None:
"""Validate an optional 'author' field. The Claude Code marketplace/plugin
schemas both require an object ({"name": ...}), not a bare string."""
if value is None:
return
if not isinstance(value, dict) or not value.get("name"):
raise ValidationError(
f'{context}: \'author\' must be an object with a \'name\' field, e.g. {{"name": "..."}}'
)
def validate_external(value: "dict | None", valid_targets: list[str], context: str) -> "dict | None":
"""Validate an optional 'external' map of target -> marketplace source object."""
if value is None:
@@ -189,6 +200,7 @@ def discover_plugins(merged_root: Path, valid_targets: list[str]) -> list[dict]:
for field in REQUIRED_PLUGIN_FIELDS:
if not meta.get(field):
raise ValidationError(f"{manifest_path}: missing required field '{field}'")
validate_author(meta.get("author"), str(manifest_path))
plugin_targets = validate_targets(meta.get("targets"), valid_targets, str(manifest_path))
plugin_external = validate_external(meta.get("external"), valid_targets, str(manifest_path))
if plugin_external is not None:
@@ -399,16 +411,25 @@ def gen_claude_code(manifest: dict, plugins: list[dict], out_dir: Path) -> None:
shutil.rmtree(plugins_out)
plugins_out.mkdir(parents=True)
def marketplace_entry(name: str, meta: dict, source) -> dict:
entry: dict = {"name": name}
if meta.get("description"):
entry["description"] = meta["description"]
if meta.get("author"):
entry["author"] = meta["author"]
entry["source"] = source
return entry
marketplace_entries = []
for p in plugins:
name = p["meta"]["name"]
external_source = (p["external"] or {}).get("claude-code") if p["external"] else None
if external_source is not None:
if plugin_supports(p, "claude-code"):
marketplace_entries.append({"name": name, "source": external_source})
marketplace_entries.append(marketplace_entry(name, p["meta"], external_source))
continue
if write_claude_plugin(p, plugins_out / name):
marketplace_entries.append({"name": name, "source": f"./dist/claude-code/{name}"})
marketplace_entries.append(marketplace_entry(name, p["meta"], f"./dist/claude-code/{name}"))
bundle_id = manifest["bundle"]["id"]
bundle_skills = [(p, s) for p in plugins for s in active_skills(p, "claude-code")]
@@ -426,7 +447,13 @@ def gen_claude_code(manifest: dict, plugins: list[dict], out_dir: Path) -> None:
bundle_skills_dir = bundle_dest / "skills"
for _, s in bundle_skills:
shutil.copytree(s["dir"], bundle_skills_dir / s["frontmatter"]["name"])
marketplace_entries.append({"name": bundle_id, "source": f"./dist/claude-code/{bundle_id}"})
marketplace_entries.append(
marketplace_entry(
bundle_id,
{"description": f"{manifest['marketplace']['description']} (all skills)"},
f"./dist/claude-code/{bundle_id}",
)
)
marketplace = {
"name": manifest["marketplace"]["name"],