Skip to content
Merged
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: 1 addition & 1 deletion .agents/plugins/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"interface": {
"displayName": "Vstack"
},
"name": "vllnt-stack",
"name": "vllnt",
"plugins": [
{
"category": "Productivity",
Expand Down
2 changes: 1 addition & 1 deletion .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"description": "Evidence-led engineering workflows to plan, build, review, and ship software with AI agents. Part of the vllnt universe: open, sovereign tools for freedom by design (vllnt.com).",
"name": "vllnt-stack",
"name": "vllnt",
"owner": {
"name": "vllnt"
},
Expand Down
2 changes: 1 addition & 1 deletion .cursor-plugin/marketplace.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"name": "vllnt-stack",
"name": "vllnt",
"owner": {
"name": "vllnt"
},
Expand Down
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@

## Unreleased

## 0.1.0-canary.5

- Rename the marketplace from `vllnt-stack` to `vllnt` for all hosts, so installs read `vstack@vllnt`. Existing installs must remove the `vllnt-stack` marketplace and add `vllnt/stack` again.

## 0.1.0-canary.4

- Use the vllnt logo as the Claude plugin icon: `assets/vllnt-logo.png` is wrapped by the generator into `.claude-plugin/icon.svg`.
Expand Down
10 changes: 5 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,10 @@ The Claude Code plugin is in canary (prerelease versions): installation from Git

```text
/plugin marketplace add vllnt/stack
/plugin install vstack@vllnt-stack
/plugin install vstack@vllnt
```

Then start a new chat and invoke a namespaced skill such as `/vstack:plan-work`. Third-party marketplaces may not auto-update by default; enable auto-update for `vllnt-stack` in `/plugin`, or run `/plugin marketplace update vllnt-stack` to receive new versions.
Then start a new chat and invoke a namespaced skill such as `/vstack:plan-work`. Third-party marketplaces may not auto-update by default; enable auto-update for `vllnt` in `/plugin`, or run `/plugin marketplace update vllnt` to receive new versions.

[`vllnt/skills`](https://github.com/vllnt/skills) owns the portable workflows and principles. This repository pins an upstream commit and builds complete, committed host packages. Installed users need no Python, Git submodule, build step, or runtime source download.

Expand All @@ -30,7 +30,7 @@ Then start a new chat and invoke a namespaced skill such as `/vstack:plan-work`.
| `.agents/plugins/marketplace.json` | Codex catalog; selects only its host package |
| `.cursor-plugin/marketplace.json` | Cursor catalog; selects only its host package |

Each catalog exposes a plugin named **`vstack`**, under the marketplace identity **`vllnt-stack`**. Separate package roots avoid relying on precedence between multiple host manifests. Generated copies are distribution artifacts, not additional skill authorship locations.
Each catalog exposes a plugin named **`vstack`**, under the marketplace identity **`vllnt`**, so installs read `vstack@vllnt`. Separate package roots avoid relying on precedence between multiple host manifests. Generated copies are distribution artifacts, not additional skill authorship locations.

Each package includes all public `workflows/*/SKILL.md` and `mandatory/*/SKILL.md` folders, their existing reference bundles, the upstream MIT license, and `SOURCE.json`. Repository-local maintenance skills and unrelated installed third-party skills are excluded. The initial pin contains 19 workflows and three principle skills. Workflows are discovered dynamically; changes to the three named mandatory principles intentionally require generator/adapter review before packaging.

Expand All @@ -50,7 +50,7 @@ From Claude Code, add this checkout as a local marketplace, then install its plu

```text
/plugin marketplace add /path/to/stack
/plugin install vstack@vllnt-stack
/plugin install vstack@vllnt
```

Choose the desired installation scope and reload plugins if prompted. Verify a namespaced invocation such as `/vstack:plan-work` in a new chat.
Expand Down Expand Up @@ -149,7 +149,7 @@ Automatic repository synchronization was independently verified on 2026-09-21. A

Live testing caught a generated-help false hold and post-push PR-head propagation timing; fixes were reviewed and merged through PRs #5 and #6, with 37 regression tests passing. The fresh PR #7 case required neither manual metadata repair nor manual merge. Daily fallback is configured; its timer was not waited for. Push delivery, manual resends, automatic merging, and manual no-op execution were observed.

Claude Code 2.1.283 (2026-09-27): `claude plugin validate` passes for the catalog and plugin; a local-directory marketplace install into an isolated configuration installed `vstack@vllnt-stack` with all 22 skills, and a maintainer session with the local install listed every `vstack:*` skill. After `vllnt/stack` became public (merge `c3ad08c08fe460ed4f2e1a40630afe4001ddd23c`), an anonymous clone succeeded, and the CLI equivalents `claude plugin marketplace add vllnt/stack` plus `claude plugin install vstack@vllnt-stack` in a clean, credential-free configuration installed the plugin from the GitHub source; a headless session there listed exactly the 22 `vstack:*` skills. The same commands after merge `915a4d0d519d726f84185ec698b3ed3f4c925cb8` installed it again with its icon, updated description, and 22 skills. The in-chat `/plugin` forms were not run separately. Skill invocation behavior (including `plan-work` staying read-only), automatic skill selection, and the rest of the acceptance checklist remain unverified.
Claude Code 2.1.283 (2026-09-27): `claude plugin validate` passes for the catalog and plugin; a local-directory marketplace install into an isolated configuration installed `vstack@vllnt-stack` with all 22 skills, and a maintainer session with the local install listed every `vstack:*` skill. After `vllnt/stack` became public (merge `c3ad08c08fe460ed4f2e1a40630afe4001ddd23c`), an anonymous clone succeeded, and the CLI equivalents `claude plugin marketplace add vllnt/stack` plus `claude plugin install vstack@vllnt-stack` in a clean, credential-free configuration installed the plugin from the GitHub source; a headless session there listed exactly the 22 `vstack:*` skills. The same commands after merge `915a4d0d519d726f84185ec698b3ed3f4c925cb8` installed it again with its icon, updated description, and 22 skills. The in-chat `/plugin` forms were not run separately. The marketplace was later renamed from `vllnt-stack` to `vllnt`; earlier installs must remove the old marketplace and add it again. Skill invocation behavior (including `plan-work` staying read-only), automatic skill selection, and the rest of the acceptance checklist remain unverified.

**Codex and Cursor installation, and startup/context-loss behavior in every host, remain unverified.** The repository is public and installable as a GitHub marketplace. A Claude plugin directory submission is in validation and is not listed yet. Canary builds are published as [GitHub prereleases](https://github.com/vllnt/stack/releases); releases are created manually. No automatic Claude/Codex principle loading exists.

Expand Down
2 changes: 1 addition & 1 deletion VERSION
Original file line number Diff line number Diff line change
@@ -1 +1 @@
0.1.0-canary.4
0.1.0-canary.5
2 changes: 1 addition & 1 deletion plugins/claude/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,5 +13,5 @@
"license": "MIT",
"name": "vstack",
"repository": "https://github.com/vllnt/stack",
"version": "0.1.0-canary.4"
"version": "0.1.0-canary.5"
}
2 changes: 1 addition & 1 deletion plugins/claude/SOURCE.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"files": {
".claude-plugin/icon.svg": "0b4b639f6df841b4904ec0cd9f6d38131c6373ce4a52a1e7fe6452a37598d7f1",
".claude-plugin/plugin.json": "4808262e4a7a3e327124bfd2b6e23590f33502b981cfcc4e893be02674ab4a53",
".claude-plugin/plugin.json": "075f3e05fe3733d2930d0aaaf378d02758436dfa4f4006c34eda3c505b48e1ef",
"LICENSE": "24ba061a4603738ddd5105ef4abc198eeded5ac7efce23b360561816f4dd6559",
"skills/build-landing-page/README.md": "46a280eadac8962180cf3f0c42eb0e845a3b0156a644569182d932881e1d51f8",
"skills/build-landing-page/SKILL.md": "b08e4963d6149f3647b28a0d9dccdc8793812abab95a1d081d93699e142de0f0",
Expand Down
2 changes: 1 addition & 1 deletion plugins/codex/SOURCE.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"files": {
"LICENSE": "24ba061a4603738ddd5105ef4abc198eeded5ac7efce23b360561816f4dd6559",
"plugin.json": "789b793f660535ffddadde5268e5d776ea9a76db6b4809014eb71537d877f235",
"plugin.json": "c78e76ede21d79745dc7572f7ba3f563d9296d9d1c3404cedc217f96597f320b",
"skills/build-landing-page/README.md": "46a280eadac8962180cf3f0c42eb0e845a3b0156a644569182d932881e1d51f8",
"skills/build-landing-page/SKILL.md": "b08e4963d6149f3647b28a0d9dccdc8793812abab95a1d081d93699e142de0f0",
"skills/build-landing-page/references/copywriting-formulas.md": "6d19f6166e1badcfdda0af4f8b303160e94ee6e6149321157e12849654cc013e",
Expand Down
2 changes: 1 addition & 1 deletion plugins/codex/plugin.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,5 @@
"description": "Evidence-led engineering workflows to plan, build, review, and ship software with AI agents. Part of the vllnt universe: open, sovereign tools for freedom by design (vllnt.com).",
"license": "MIT",
"name": "vstack",
"version": "0.1.0-canary.4"
"version": "0.1.0-canary.5"
}
2 changes: 1 addition & 1 deletion plugins/cursor/.cursor-plugin/plugin.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,5 @@
"description": "Evidence-led engineering workflows to plan, build, review, and ship software with AI agents. Part of the vllnt universe: open, sovereign tools for freedom by design (vllnt.com).",
"license": "MIT",
"name": "vstack",
"version": "0.1.0-canary.4"
"version": "0.1.0-canary.5"
}
2 changes: 1 addition & 1 deletion plugins/cursor/SOURCE.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"files": {
".cursor-plugin/plugin.json": "b4325fd2a33221ef271b6b92d621c9c62052b6bd6f468b567d47401fe35ee2ea",
".cursor-plugin/plugin.json": "63c0531e7ec6ff67f7fecd54ee886f3d10706dbab51820807b373378ce7ee4b3",
"LICENSE": "24ba061a4603738ddd5105ef4abc198eeded5ac7efce23b360561816f4dd6559",
"rules/vstack-principles.mdc": "5234bc0506e0a328d6163cd83785d2f37dd1fc23ef84287d71e03b92459e064a",
"skills/build-landing-page/README.md": "46a280eadac8962180cf3f0c42eb0e845a3b0156a644569182d932881e1d51f8",
Expand Down
5 changes: 3 additions & 2 deletions scripts/sync.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
UPSTREAM = "https://github.com/vllnt/skills.git"
REPOSITORY = "https://github.com/vllnt/stack"
HOMEPAGE = "https://vllnt.com"
MARKETPLACE = "vllnt"
DESCRIPTION = ("Evidence-led engineering workflows to plan, build, review, and ship software with AI agents. "
"Part of the vllnt universe: open, sovereign tools for freedom by design (vllnt.com).")
CLAUDE_ICON = ROOT / "assets" / "vllnt-logo.png"
Expand Down Expand Up @@ -257,13 +258,13 @@ def build(files: dict[str, bytes], lock: dict, version: str) -> dict[str, bytes]
path: hashlib.sha256(content).hexdigest() for path, content in sorted(package.items())}})
output.update({f"plugins/{host}/{path}": content for path, content in package.items()})
for host in ("claude", "cursor"):
catalog = {"name": "vllnt-stack", "owner": {"name": "vllnt"},
catalog = {"name": MARKETPLACE, "owner": {"name": "vllnt"},
"plugins": [{"name": "vstack", "source": f"./plugins/{host}"}]}
if host == "claude":
catalog["description"] = DESCRIPTION
output[f".{host}-plugin/marketplace.json"] = encoded(catalog)
output[".agents/plugins/marketplace.json"] = encoded({
"name": "vllnt-stack", "interface": {"displayName": "Vstack"},
"name": MARKETPLACE, "interface": {"displayName": "Vstack"},
"plugins": [{"name": "vstack", "source": {"source": "local", "path": "./plugins/codex"},
"policy": {"installation": "AVAILABLE", "authentication": "ON_INSTALL"},
"category": "Productivity"}]})
Expand Down
1 change: 1 addition & 0 deletions tests/test_sync.py
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ def test_deterministic_standalone_packages_and_provenance(self):
claude = json.loads(first[".claude-plugin/marketplace.json"])
codex = json.loads(first[".agents/plugins/marketplace.json"])
cursor = json.loads(first[".cursor-plugin/marketplace.json"])
self.assertEqual({claude["name"], codex["name"], cursor["name"]}, {"vllnt"})
self.assertEqual(claude["plugins"][0]["source"], "./plugins/claude")
self.assertEqual(codex["plugins"][0]["source"]["path"], "./plugins/codex")
self.assertEqual(cursor["plugins"][0]["source"], "./plugins/cursor")
Expand Down
Loading