Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -314,6 +314,8 @@ Because a `marketplace.json` can only reference plugins inside its own repo (see
└── rules/<bundle>/ # optional rule bundle(s)
```

**Naming** — new extension repos follow `infinum/ai-{type}-{name}[-private]`: `{type}` is `team` or `project`, `{name}` is the kebab-case team or client name, and `-private` is appended exactly when the repo is private, so visibility is readable from the name (`infinum/ai-team-javascript`, `infinum/ai-team-javascript-private`, `infinum/ai-team-bizdev-private`, `infinum/ai-project-<client>-private`). The marketplace name mirrors it: `infinum-ai-team-javascript`. A team can have a public repo and a `-private` companion, the same split as the two core repos, `infinum/ai` and `infinum/ai-private` (which sit outside the template; `ai-private` is layered on with the same `--extend` mechanism but is a core repo, not a team or project one). The `stack-essentials` plugin ships a skill that proposes the names and generates the skeleton: `/stack-essentials:scaffold-extension-repo`.

**Install** — pass `--extend` to the public installer (repeatable; value is a GitHub `owner/repo` or a local checkout path):

```bash
Expand Down
4 changes: 2 additions & 2 deletions MARKETPLACE.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,11 @@ Skills are slash commands you invoke directly in your AI tool — they carry str

## Essentials (auto-installed)

The setup script enables these baseline plugins for everyone — they ship cross-cutting plumbing rather than user-invocable skills.
The setup script enables these baseline plugins for everyone — they ship cross-cutting plumbing, plus the one skill everyone should have at hand: scaffolding a new extension repo.

| Plugin | What it does | Cowork |
| ------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------- |
| [`stack-essentials`](plugins/stack-essentials/) | SessionStart hook that prints a one-line banner when `infinum/ai` has new commits on `main` since your last installer run. One `git ls-remote` per machine per 24h (uses your existing git credentials), silent on failure. Disable with `INFINUM_STACK_SKIP_UPDATE_CHECK=1` or `/plugin disable stack-essentials`. | Untested — the `SessionStart` hook fires in Cowork, but its update check (`git ls-remote` to GitHub) is egress-blocked there, so the banner is a silent no-op regardless. Pending live verification. |
| [`stack-essentials`](plugins/stack-essentials/) | Baseline plumbing for the Infinum AI Stack — flags stale local rules at session start so you know when to re-run the installer, and scaffolds new extension-marketplace repositories (infinum/ai-{type}-{name}[-private]) for team- or project-specific tooling. The `scaffold-extension-repo` skill is invoked as `/stack-essentials:scaffold-extension-repo`. | Untested — the `SessionStart` hook fires in Cowork, but its update check (`git ls-remote` to GitHub) is egress-blocked there, so the banner is a silent no-op regardless. Pending live verification. The `scaffold-extension-repo` skill is Not ready — shells out to local `git`, the `gh` CLI, and `pnpm` to initialise, create, and verify the repository. |

---

Expand Down
9 changes: 6 additions & 3 deletions plugins/stack-essentials/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
{
"name": "stack-essentials",
"version": "1.0.0",
"description": "Baseline notifications for the Infinum AI Stack — flags stale local rules at session start so you know when to re-run the installer.",
"version": "1.1.0",
"description": "Baseline plumbing for the Infinum AI Stack — flags stale local rules at session start so you know when to re-run the installer, and scaffolds new extension-marketplace repositories (infinum/ai-{type}-{name}[-private]) for team- or project-specific tooling.",
"keywords": [
"infinum",
"essentials",
"notifications",
"updates"
"updates",
"extension",
"marketplace",
"scaffold"
]
}
2 changes: 2 additions & 0 deletions plugins/stack-essentials/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

Baseline plumbing for the Infinum AI Stack. Installed automatically by `bin/install.js` (you don't need to opt in via the `/plugin` UI).

It ships two things: a `SessionStart` update-notification hook (below) and one skill, [`scaffold-extension-repo`](skills/scaffold-extension-repo/), which walks you through creating a new extension-marketplace repository (`infinum/ai-{type}-{name}[-private]`) for team- or project-specific plugins and rules. Invoke it with `/stack-essentials:scaffold-extension-repo`; see its README for the naming convention and flow.

## What it does

Adds a `SessionStart` hook that compares the HEAD commit SHA of `main` on `github.com/infinum/ai` against the SHA recorded in `~/.claude/infinum/.manifest.json` at your last installer run. When they differ, a newer version of the workspace installer is available, so the hook prints a banner on stderr at session start:
Expand Down
60 changes: 60 additions & 0 deletions plugins/stack-essentials/skills/scaffold-extension-repo/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
# scaffold-extension-repo

Scaffold a new **extension marketplace** — a repository holding team- or project-specific plugins and rule bundles that is layered on top of the public `infinum/ai` base with the installer's `--extend` flag.

## Usage

```
/stack-essentials:scaffold-extension-repo
```

(Plugin-installed skills are namespaced as `/<plugin>:<skill>`. `stack-essentials` is installed for everyone by the installer, so the skill is available without opting in.)

The skill walks you through a guided flow:

1. **Say what you are creating** — a team repo or a project repo, its name, and whether it should be public, private, or both.
2. **Confirm the proposed names** — repository and marketplace names following `infinum/ai-{type}-{name}[-private]`.
3. **Get the skeleton** — a copy of the bundled [`template/`](template/) with the names filled in: `marketplace.json`, a README with the exact install command, agent instructions, and optionally a first plugin and a rule bundle. Everything the owning team must write is marked `TODO`.
4. **Optionally create the GitHub repo** — the skill asks before running `gh repo create`.
5. **Verify** — a local-path install against the real installer, then clean-up.

## The template

[`template/`](template/) is a complete extension repository with `__PLACEHOLDER__` names. You can also use it by hand: copy the directory, rename the placeholder folders, search-and-replace the placeholders, delete the optional parts you do not need (`plugins/`, `rules/`, the `<!-- private-only -->` block in the README), and fill in the `TODO`s.

| Placeholder | Meaning |
|---|---|
| `__REPO_NAME__` | repository name without `infinum/`, e.g. `ai-team-javascript-private` |
| `__MARKETPLACE_NAME__` | `infinum-` + repo name, e.g. `infinum-ai-team-javascript-private` |
| `__NAME_PREFIX__` | the `{name}` part; prefix for plugin, bundle and rule names |
| `__OWNER_LABEL__` / `__OWNER__` | human label (`JavaScript team`) / maintainer |
| `__VISIBILITY__` | `public` or `private` |
| `__PLUGIN_NAME__` / `__SKILL_NAME__` | first plugin and its first skill |
| `__BUNDLE_NAME__` / `__RULE_NAME__` | first rule bundle and its first rule file |

## Naming convention

```
infinum/ai-{type}-{name}[-private]
```

| Situation | Repository |
|---|---|
| JavaScript team, shareable conventions | `infinum/ai-team-javascript` |
| JavaScript team, internal companion | `infinum/ai-team-javascript-private` |
| Bizdev team — sensitive, no public half | `infinum/ai-team-bizdev-private` |
| .NET team | `infinum/ai-team-dotnet` |
| Client project | `infinum/ai-project-<client>-private` |

`-private` is present exactly when the repository is private, so the name alone tells you what to expect. The marketplace name mirrors the repo: `infinum-ai-team-javascript`. The two core repos, `infinum/ai` and `infinum/ai-private`, sit outside the template (`ai-private` is installed with the same `--extend` mechanism, but it is a core repo, not a team or project one).

## When to use

| Situation | Use this skill? |
|---|---|
| A team wants to collect its rules and skills in one shared place | Yes — a team repo |
| A project spans several code repositories and shares tooling between them | Yes — a project repo |
| A skill or rule is useful to every Infinum engineer | No — open a PR against `infinum/ai` |
| A rule is only relevant to one code repository | No — commit it to that repo's `.claude/` folder |

Background: [CONTRIBUTING.md — Extending with additional marketplaces](https://github.com/infinum/ai/blob/main/CONTRIBUTING.md#extending-with-additional-marketplaces).
Loading