From 5fe6469d4a1d231c405daffde34c71eff20f7e8f Mon Sep 17 00:00:00 2001
From: Cursor Agent
Date: Sat, 27 Jun 2026 14:45:53 +0000
Subject: [PATCH 1/2] Separate Loop Library website code into loop-library/
Move the website (site shell, Worker, scripts, audits) under a dedicated
loop-library/ directory so it is clearly separated from the installable Loopy
skill, which stays in skills/loopy/. Update CI, .gitignore, the repository
check script, and maintainer docs to the new paths.
Co-authored-by: mberman84
---
.github/workflows/ci.yml | 16 +++---
.gitignore | 6 +-
AGENTS.md | 54 ++++++++++++------
README.md | 30 +++++-----
.../audits}/seo-geo-2026-06-19.md | 0
{scripts => loop-library/scripts}/check.mjs | 44 +++++++-------
.../scripts}/html-script-utils.mjs | 0
.../scripts}/seo-geo-query-benchmark.json | 0
.../site}/.herenow/data.json | 0
.../site}/.herenow/proxy.json | 0
{site => loop-library/site}/agents/index.html | 0
.../site}/assets/favicon.png | Bin
.../site}/assets/ff-mark.png | Bin
.../site}/assets/here-now-icon.svg | 0
.../assets/social/loop-library-20260621-2.png | Bin
{site => loop-library/site}/index.html | 0
{site => loop-library/site}/learn/index.html | 0
{site => loop-library/site}/script.js | 0
{site => loop-library/site}/styles.css | 0
.../worker}/.dev.vars.example | 0
.../worker}/bin/export-catalog.mjs | 0
.../worker}/bin/import-bootstrap.mjs | 0
.../worker}/bin/publish-loop.mjs | 0
.../worker}/bin/restore-catalog.mjs | 0
.../worker}/examples/loop.json | 0
.../worker}/package-lock.json | 0
{worker => loop-library/worker}/package.json | 0
.../worker}/src/auth-votes.js | 0
.../worker}/src/catalog-store.js | 0
{worker => loop-library/worker}/src/index.js | 0
.../worker}/src/loop-routes.js | 0
.../worker}/src/loop-schema.js | 0
.../worker}/src/render-loops.js | 0
.../worker}/src/vote-store.js | 0
.../worker}/test/auth-votes.test.js | 0
.../worker}/test/index.test.js | 0
.../worker}/test/loop-routes.test.js | 0
.../worker}/wrangler.jsonc | 0
38 files changed, 84 insertions(+), 66 deletions(-)
rename {audits => loop-library/audits}/seo-geo-2026-06-19.md (100%)
rename {scripts => loop-library/scripts}/check.mjs (93%)
rename {scripts => loop-library/scripts}/html-script-utils.mjs (100%)
rename {scripts => loop-library/scripts}/seo-geo-query-benchmark.json (100%)
rename {site => loop-library/site}/.herenow/data.json (100%)
rename {site => loop-library/site}/.herenow/proxy.json (100%)
rename {site => loop-library/site}/agents/index.html (100%)
rename {site => loop-library/site}/assets/favicon.png (100%)
rename {site => loop-library/site}/assets/ff-mark.png (100%)
rename {site => loop-library/site}/assets/here-now-icon.svg (100%)
rename {site => loop-library/site}/assets/social/loop-library-20260621-2.png (100%)
rename {site => loop-library/site}/index.html (100%)
rename {site => loop-library/site}/learn/index.html (100%)
rename {site => loop-library/site}/script.js (100%)
rename {site => loop-library/site}/styles.css (100%)
rename {worker => loop-library/worker}/.dev.vars.example (100%)
rename {worker => loop-library/worker}/bin/export-catalog.mjs (100%)
rename {worker => loop-library/worker}/bin/import-bootstrap.mjs (100%)
rename {worker => loop-library/worker}/bin/publish-loop.mjs (100%)
rename {worker => loop-library/worker}/bin/restore-catalog.mjs (100%)
rename {worker => loop-library/worker}/examples/loop.json (100%)
rename {worker => loop-library/worker}/package-lock.json (100%)
rename {worker => loop-library/worker}/package.json (100%)
rename {worker => loop-library/worker}/src/auth-votes.js (100%)
rename {worker => loop-library/worker}/src/catalog-store.js (100%)
rename {worker => loop-library/worker}/src/index.js (100%)
rename {worker => loop-library/worker}/src/loop-routes.js (100%)
rename {worker => loop-library/worker}/src/loop-schema.js (100%)
rename {worker => loop-library/worker}/src/render-loops.js (100%)
rename {worker => loop-library/worker}/src/vote-store.js (100%)
rename {worker => loop-library/worker}/test/auth-votes.test.js (100%)
rename {worker => loop-library/worker}/test/index.test.js (100%)
rename {worker => loop-library/worker}/test/loop-routes.test.js (100%)
rename {worker => loop-library/worker}/wrangler.jsonc (100%)
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 41d3636..b3bfcf4 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -28,19 +28,19 @@ jobs:
with:
node-version: 22
cache: npm
- cache-dependency-path: worker/package-lock.json
+ cache-dependency-path: loop-library/worker/package-lock.json
- name: Install Worker dependencies
- run: npm ci --prefix worker
+ run: npm ci --prefix loop-library/worker
- name: Validate site and skill sources
run: |
- node --check site/script.js
- node scripts/check.mjs
- python3 -m json.tool site/.herenow/data.json >/dev/null
- python3 -m json.tool site/.herenow/proxy.json >/dev/null
- python3 -m json.tool scripts/seo-geo-query-benchmark.json >/dev/null
+ node --check loop-library/site/script.js
+ node loop-library/scripts/check.mjs
+ python3 -m json.tool loop-library/site/.herenow/data.json >/dev/null
+ python3 -m json.tool loop-library/site/.herenow/proxy.json >/dev/null
+ python3 -m json.tool loop-library/scripts/seo-geo-query-benchmark.json >/dev/null
git diff --check
- name: Test form Worker
- run: npm --prefix worker run check
+ run: npm --prefix loop-library/worker run check
diff --git a/.gitignore b/.gitignore
index bf81ff6..c1968ec 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,10 +1,10 @@
.DS_Store
/.herenow/
-site/.herenow/state.json
+loop-library/site/.herenow/state.json
node_modules/
.wrangler/
__pycache__/
*.py[cod]
/.playwright-mcp/
-worker/.dev.vars
-worker/.wrangler/
+loop-library/worker/.dev.vars
+loop-library/worker/.wrangler/
diff --git a/AGENTS.md b/AGENTS.md
index 24b49d4..7de8574 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -1,4 +1,19 @@
-# Loop Library Operating Rules
+# Loopy Repository Operating Rules
+
+This repository holds two separate but related parts:
+
+- **Loop Library website** — the public catalog (site shell, database, and
+ rendering). All website code lives under [`loop-library/`](loop-library/)
+ (`loop-library/site/`, `loop-library/worker/`, `loop-library/scripts/`,
+ `loop-library/audits/`).
+- **Loopy skill** — the installable agent skill in
+ [`skills/loopy/`](skills/loopy/), with the compatibility alias in
+ [`skills/loop-library/`](skills/loop-library/).
+
+The operating rules below govern the Loop Library website unless they call out
+the skill explicitly. Live URLs that contain `/loop-library/` and the
+`loop-library-forms` Worker name are deployed identifiers and do not change with
+this repository layout.
## Adding or editing loops
@@ -12,10 +27,10 @@
```bash
LOOP_PUBLISH_TOKEN=... \
- npm --prefix worker run loop:publish -- /path/to/loop.json
+ npm --prefix loop-library/worker run loop:publish -- /path/to/loop.json
```
- Use `worker/examples/loop.json` as the record template. The command validates
+ Use `loop-library/worker/examples/loop.json` as the record template. The command validates
the complete record before writing it, and the Worker records every revision.
- Every loop must have a stable slug, unique number, search title and
description, contributor attribution, published and modified dates,
@@ -27,18 +42,18 @@
reviewed HTTPS `socialImageUrl` is supplied.
- Keep bootstrap and backup exports outside the repository with owner-only
permissions. The one-time bootstrap command requires an explicit private
- file path; routine recovery exports use `npm --prefix worker run loops:export`.
+ file path; routine recovery exports use `npm --prefix loop-library/worker run loops:export`.
Restore an export only into a fresh empty catalog with
- `npm --prefix worker run loops:restore`; never overwrite a live catalog.
+ `npm --prefix loop-library/worker run loops:restore`; never overwrite a live catalog.
- Changes to the site shell, Worker, schema, or renderers still go through
GitHub. Run the full repository checks before committing those code changes:
```bash
- node --check site/script.js
- node scripts/check.mjs
- npm --prefix worker run check
- python3 -m json.tool site/.herenow/data.json >/dev/null
- python3 -m json.tool scripts/seo-geo-query-benchmark.json >/dev/null
+ node --check loop-library/site/script.js
+ node loop-library/scripts/check.mjs
+ npm --prefix loop-library/worker run check
+ python3 -m json.tool loop-library/site/.herenow/data.json >/dev/null
+ python3 -m json.tool loop-library/scripts/seo-geo-query-benchmark.json >/dev/null
git diff --check
```
@@ -51,7 +66,7 @@
- The loop form writes to the here.now Site Data collection `suggestions`. The
weekly email form writes to `weekly_signups`.
- Keep both collections owner-write-only. Browser clients must send submissions
- through the Cloudflare Worker in `worker/`; never expose here.now owner
+ through the Cloudflare Worker in `loop-library/worker/`; never expose here.now owner
credentials or allow direct public inserts.
- Keep Turnstile validation for the expected action, hostname, and origin, plus
the existing schema checks, rate limits, duplicate suppression, honeypot,
@@ -77,7 +92,7 @@ The production Worker serves at
deployment checkout:
```bash
-cd worker
+cd loop-library/worker
npm ci
npm exec -- wrangler secret put TURNSTILE_SITE_KEY
npm exec -- wrangler secret put TURNSTILE_SECRET_KEY
@@ -112,7 +127,7 @@ npm run deploy
browser code, logs, or committed development files. Configure them with:
```bash
- cd worker
+ cd loop-library/worker
npm exec -- wrangler secret put SESSION_SECRET
npm exec -- wrangler secret put GITHUB_OAUTH_CLIENT_ID
npm exec -- wrangler secret put GITHUB_OAUTH_CLIENT_SECRET
@@ -132,12 +147,13 @@ npm run deploy
- Deploy and verify the Worker before publishing a shell or proxy manifest that
exposes voting or auth routes.
-For local development, copy `worker/.dev.vars.example` to `worker/.dev.vars`,
-replace the here.now development credentials, then run:
+For local development, copy `loop-library/worker/.dev.vars.example` to
+`loop-library/worker/.dev.vars`, replace the here.now development credentials,
+then run:
```bash
-npm --prefix worker run dev
-python3 -m http.server 4173 --directory site
+npm --prefix loop-library/worker run dev
+python3 -m http.server 4173 --directory loop-library/site
```
Review or delete private records from the here.now dashboard under
@@ -157,8 +173,8 @@ curl -sS "https://here.now/api/v1/publishes/{slug}/data/weekly_signups?limit=50"
changes, then deploy the affected site from the newest `origin/main` commit
that contains those changes.
- Never deploy from a task worktree, dirty checkout, feature branch, or partial
- file overlay. Publish the complete `site/` directory from a clean deployment
- checkout on latest integrated main.
+ file overlay. Publish the complete `loop-library/site/` directory from a clean
+ deployment checkout on latest integrated main.
- Serialize deployments with
`$HOME/.codex/deploy-locks/loop-library.lock`. Wait for an
active deployment, then fetch and fast-forward again before selecting the
diff --git a/README.md b/README.md
index d8659b2..75d89e8 100644
--- a/README.md
+++ b/README.md
@@ -4,7 +4,7 @@ Loop Library has two separate but related parts in this repository:
| Part | What it is | Where it lives |
| --- | --- | --- |
-| **Loop Library website** | The public catalog where people and agents can browse published loops, read them, and copy their prompts. No installation is required. | [Live website](https://signals.forwardfuture.com/loop-library/) · shell in [`site/`](site/), database and rendering in [`worker/`](worker/) |
+| **Loop Library website** | The public catalog where people and agents can browse published loops, read them, and copy their prompts. No installation is required. | [Live website](https://signals.forwardfuture.com/loop-library/) · all website code under [`loop-library/`](loop-library/) (shell in [`loop-library/site/`](loop-library/site/), database and rendering in [`loop-library/worker/`](loop-library/worker/)) |
| **Loopy skill** | An optional installable guide that helps an AI agent discover, find, audit, repair, craft, run, debrief, or prepare loops for publication. It uses the website's live catalog when recommending or publishing loops. | source in [`skills/loopy/`](skills/loopy/) |
The website is the library; Loopy is a companion way to work with it. You
@@ -264,12 +264,12 @@ Public loops are stored in the catalog database attached to the Cloudflare
Worker. Publishing a reviewed loop does not require a GitHub commit or a static
site deployment.
-Copy `worker/examples/loop.json` somewhere outside the repository, fill in the
-record, and run:
+Copy `loop-library/worker/examples/loop.json` somewhere outside the repository,
+fill in the record, and run:
```bash
LOOP_PUBLISH_TOKEN=... \
- npm --prefix worker run loop:publish -- /path/to/loop.json
+ npm --prefix loop-library/worker run loop:publish -- /path/to/loop.json
```
The command validates the record and publishes the homepage row, detail page,
@@ -283,7 +283,7 @@ GitHub:
```bash
LOOP_PUBLISH_TOKEN=... \
- npm --prefix worker run loops:import -- /private/path/bootstrap.json
+ npm --prefix loop-library/worker run loops:import -- /private/path/bootstrap.json
```
Set a long random `LOOP_PUBLISH_TOKEN` as a Worker secret. The catalog uses a
@@ -295,14 +295,14 @@ Create a private backup of the current database with:
```bash
LOOP_PUBLISH_TOKEN=... \
- npm --prefix worker run loops:export -- /private/path/catalog-backup.ndjson
+ npm --prefix loop-library/worker run loops:export -- /private/path/catalog-backup.ndjson
```
Restore that snapshot only into a fresh, empty catalog database:
```bash
LOOP_PUBLISH_TOKEN=... \
- npm --prefix worker run loops:restore -- /private/path/catalog-backup.ndjson
+ npm --prefix loop-library/worker run loops:restore -- /private/path/catalog-backup.ndjson
```
Bootstrap and backup files must be owner-only (`chmod 600`). Exports include
@@ -318,7 +318,7 @@ this migration does not rewrite repository history or disrupt existing clones.
### Preview locally
```bash
-python3 -m http.server 4173 --directory site
+python3 -m http.server 4173 --directory loop-library/site
```
Then open `http://localhost:4173`.
@@ -326,12 +326,12 @@ Then open `http://localhost:4173`.
### Validate a change
```bash
-npm ci --prefix worker
-node --check site/script.js
-node scripts/check.mjs
-npm --prefix worker run check
-python3 -m json.tool site/.herenow/data.json >/dev/null
-python3 -m json.tool scripts/seo-geo-query-benchmark.json >/dev/null
+npm ci --prefix loop-library/worker
+node --check loop-library/site/script.js
+node loop-library/scripts/check.mjs
+npm --prefix loop-library/worker run check
+python3 -m json.tool loop-library/site/.herenow/data.json >/dev/null
+python3 -m json.tool loop-library/scripts/seo-geo-query-benchmark.json >/dev/null
git diff --check
```
@@ -340,7 +340,7 @@ git diff --check
Voting is stored in a dedicated SQLite Durable Object. Reading totals is
public, but casting, changing, or removing a vote requires a GitHub login.
Set `SESSION_SECRET` and the GitHub OAuth client credentials as Worker
-secrets; use `worker/.dev.vars.example` for local variable names only. Register
+secrets; use `loop-library/worker/.dev.vars.example` for local variable names only. Register
the canonical callbacks shown in `AGENTS.md`, then deploy the Worker before the
site shell because the shell calls the new auth and vote routes.
diff --git a/audits/seo-geo-2026-06-19.md b/loop-library/audits/seo-geo-2026-06-19.md
similarity index 100%
rename from audits/seo-geo-2026-06-19.md
rename to loop-library/audits/seo-geo-2026-06-19.md
diff --git a/scripts/check.mjs b/loop-library/scripts/check.mjs
similarity index 93%
rename from scripts/check.mjs
rename to loop-library/scripts/check.mjs
index cecadb1..e35f621 100644
--- a/scripts/check.mjs
+++ b/loop-library/scripts/check.mjs
@@ -3,11 +3,13 @@ import { access, readFile, readdir } from "node:fs/promises";
import { fileURLToPath } from "node:url";
import path from "node:path";
-const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
-const siteRoot = path.join(root, "site");
-const workerRoot = path.join(root, "worker");
-const skillRoot = path.join(root, "skills", "loopy");
-const legacySkillRoot = path.join(root, "skills", "loop-library");
+const here = path.dirname(fileURLToPath(import.meta.url));
+const websiteRoot = path.resolve(here, "..");
+const repoRoot = path.resolve(here, "..", "..");
+const siteRoot = path.join(websiteRoot, "site");
+const workerRoot = path.join(websiteRoot, "worker");
+const skillRoot = path.join(repoRoot, "skills", "loopy");
+const legacySkillRoot = path.join(repoRoot, "skills", "loop-library");
const [
html,
@@ -65,8 +67,8 @@ const [
readFile(path.join(legacySkillRoot, "references", "run.md"), "utf8"),
readFile(path.join(legacySkillRoot, "references", "debrief.md"), "utf8"),
readFile(path.join(legacySkillRoot, "references", "publish.md"), "utf8"),
- readFile(path.join(root, "README.md"), "utf8"),
- readFile(path.join(root, "AGENTS.md"), "utf8"),
+ readFile(path.join(repoRoot, "README.md"), "utf8"),
+ readFile(path.join(repoRoot, "AGENTS.md"), "utf8"),
]);
const workerPackage = JSON.parse(workerPackageSource);
@@ -86,21 +88,21 @@ const collection = structuredData["@graph"].find(
// GitHub contains only the shell and application. Published loop records and
// generated public catalog surfaces must remain database-only.
-for (const relativePath of [
- "scripts/loop-data.mjs",
- "scripts/build-loop-pages.mjs",
- "scripts/build-skill-catalog.mjs",
- "scripts/build-social-images.mjs",
- "scripts/validate-loop-data.mjs",
- "site/catalog.json",
- "site/catalog.md",
- "site/catalog.txt",
- "site/feed.xml",
- "site/sitemap.xml",
- "site/llms.txt",
- "skills/loopy/references/catalog.md",
+for (const absolutePath of [
+ path.join(websiteRoot, "scripts/loop-data.mjs"),
+ path.join(websiteRoot, "scripts/build-loop-pages.mjs"),
+ path.join(websiteRoot, "scripts/build-skill-catalog.mjs"),
+ path.join(websiteRoot, "scripts/build-social-images.mjs"),
+ path.join(websiteRoot, "scripts/validate-loop-data.mjs"),
+ path.join(siteRoot, "catalog.json"),
+ path.join(siteRoot, "catalog.md"),
+ path.join(siteRoot, "catalog.txt"),
+ path.join(siteRoot, "feed.xml"),
+ path.join(siteRoot, "sitemap.xml"),
+ path.join(siteRoot, "llms.txt"),
+ path.join(skillRoot, "references", "catalog.md"),
]) {
- await assert.rejects(access(path.join(root, relativePath)), undefined, relativePath);
+ await assert.rejects(access(absolutePath), undefined, absolutePath);
}
const loopPageFiles = await readdir(path.join(siteRoot, "loops"), {
diff --git a/scripts/html-script-utils.mjs b/loop-library/scripts/html-script-utils.mjs
similarity index 100%
rename from scripts/html-script-utils.mjs
rename to loop-library/scripts/html-script-utils.mjs
diff --git a/scripts/seo-geo-query-benchmark.json b/loop-library/scripts/seo-geo-query-benchmark.json
similarity index 100%
rename from scripts/seo-geo-query-benchmark.json
rename to loop-library/scripts/seo-geo-query-benchmark.json
diff --git a/site/.herenow/data.json b/loop-library/site/.herenow/data.json
similarity index 100%
rename from site/.herenow/data.json
rename to loop-library/site/.herenow/data.json
diff --git a/site/.herenow/proxy.json b/loop-library/site/.herenow/proxy.json
similarity index 100%
rename from site/.herenow/proxy.json
rename to loop-library/site/.herenow/proxy.json
diff --git a/site/agents/index.html b/loop-library/site/agents/index.html
similarity index 100%
rename from site/agents/index.html
rename to loop-library/site/agents/index.html
diff --git a/site/assets/favicon.png b/loop-library/site/assets/favicon.png
similarity index 100%
rename from site/assets/favicon.png
rename to loop-library/site/assets/favicon.png
diff --git a/site/assets/ff-mark.png b/loop-library/site/assets/ff-mark.png
similarity index 100%
rename from site/assets/ff-mark.png
rename to loop-library/site/assets/ff-mark.png
diff --git a/site/assets/here-now-icon.svg b/loop-library/site/assets/here-now-icon.svg
similarity index 100%
rename from site/assets/here-now-icon.svg
rename to loop-library/site/assets/here-now-icon.svg
diff --git a/site/assets/social/loop-library-20260621-2.png b/loop-library/site/assets/social/loop-library-20260621-2.png
similarity index 100%
rename from site/assets/social/loop-library-20260621-2.png
rename to loop-library/site/assets/social/loop-library-20260621-2.png
diff --git a/site/index.html b/loop-library/site/index.html
similarity index 100%
rename from site/index.html
rename to loop-library/site/index.html
diff --git a/site/learn/index.html b/loop-library/site/learn/index.html
similarity index 100%
rename from site/learn/index.html
rename to loop-library/site/learn/index.html
diff --git a/site/script.js b/loop-library/site/script.js
similarity index 100%
rename from site/script.js
rename to loop-library/site/script.js
diff --git a/site/styles.css b/loop-library/site/styles.css
similarity index 100%
rename from site/styles.css
rename to loop-library/site/styles.css
diff --git a/worker/.dev.vars.example b/loop-library/worker/.dev.vars.example
similarity index 100%
rename from worker/.dev.vars.example
rename to loop-library/worker/.dev.vars.example
diff --git a/worker/bin/export-catalog.mjs b/loop-library/worker/bin/export-catalog.mjs
similarity index 100%
rename from worker/bin/export-catalog.mjs
rename to loop-library/worker/bin/export-catalog.mjs
diff --git a/worker/bin/import-bootstrap.mjs b/loop-library/worker/bin/import-bootstrap.mjs
similarity index 100%
rename from worker/bin/import-bootstrap.mjs
rename to loop-library/worker/bin/import-bootstrap.mjs
diff --git a/worker/bin/publish-loop.mjs b/loop-library/worker/bin/publish-loop.mjs
similarity index 100%
rename from worker/bin/publish-loop.mjs
rename to loop-library/worker/bin/publish-loop.mjs
diff --git a/worker/bin/restore-catalog.mjs b/loop-library/worker/bin/restore-catalog.mjs
similarity index 100%
rename from worker/bin/restore-catalog.mjs
rename to loop-library/worker/bin/restore-catalog.mjs
diff --git a/worker/examples/loop.json b/loop-library/worker/examples/loop.json
similarity index 100%
rename from worker/examples/loop.json
rename to loop-library/worker/examples/loop.json
diff --git a/worker/package-lock.json b/loop-library/worker/package-lock.json
similarity index 100%
rename from worker/package-lock.json
rename to loop-library/worker/package-lock.json
diff --git a/worker/package.json b/loop-library/worker/package.json
similarity index 100%
rename from worker/package.json
rename to loop-library/worker/package.json
diff --git a/worker/src/auth-votes.js b/loop-library/worker/src/auth-votes.js
similarity index 100%
rename from worker/src/auth-votes.js
rename to loop-library/worker/src/auth-votes.js
diff --git a/worker/src/catalog-store.js b/loop-library/worker/src/catalog-store.js
similarity index 100%
rename from worker/src/catalog-store.js
rename to loop-library/worker/src/catalog-store.js
diff --git a/worker/src/index.js b/loop-library/worker/src/index.js
similarity index 100%
rename from worker/src/index.js
rename to loop-library/worker/src/index.js
diff --git a/worker/src/loop-routes.js b/loop-library/worker/src/loop-routes.js
similarity index 100%
rename from worker/src/loop-routes.js
rename to loop-library/worker/src/loop-routes.js
diff --git a/worker/src/loop-schema.js b/loop-library/worker/src/loop-schema.js
similarity index 100%
rename from worker/src/loop-schema.js
rename to loop-library/worker/src/loop-schema.js
diff --git a/worker/src/render-loops.js b/loop-library/worker/src/render-loops.js
similarity index 100%
rename from worker/src/render-loops.js
rename to loop-library/worker/src/render-loops.js
diff --git a/worker/src/vote-store.js b/loop-library/worker/src/vote-store.js
similarity index 100%
rename from worker/src/vote-store.js
rename to loop-library/worker/src/vote-store.js
diff --git a/worker/test/auth-votes.test.js b/loop-library/worker/test/auth-votes.test.js
similarity index 100%
rename from worker/test/auth-votes.test.js
rename to loop-library/worker/test/auth-votes.test.js
diff --git a/worker/test/index.test.js b/loop-library/worker/test/index.test.js
similarity index 100%
rename from worker/test/index.test.js
rename to loop-library/worker/test/index.test.js
diff --git a/worker/test/loop-routes.test.js b/loop-library/worker/test/loop-routes.test.js
similarity index 100%
rename from worker/test/loop-routes.test.js
rename to loop-library/worker/test/loop-routes.test.js
diff --git a/worker/wrangler.jsonc b/loop-library/worker/wrangler.jsonc
similarity index 100%
rename from worker/wrangler.jsonc
rename to loop-library/worker/wrangler.jsonc
From 1f8aebf357d57fd2012c5e13d39a8035d588ce37 Mon Sep 17 00:00:00 2001
From: Cursor Agent
Date: Sat, 27 Jun 2026 14:46:28 +0000
Subject: [PATCH 2/2] Update GitHub repo references from loop-library to loopy
The repository was renamed to Forward-Future/loopy. Point install commands
and skill GitHub links at the new path. Live /loop-library/ site URLs and the
loop-library-forms Worker name are deployed identifiers and remain unchanged.
Co-authored-by: mberman84
---
README.md | 12 ++++++------
loop-library/site/agents/index.html | 6 +++---
loop-library/site/index.html | 8 ++++----
loop-library/site/learn/index.html | 4 ++--
loop-library/worker/src/render-loops.js | 12 ++++++------
5 files changed, 21 insertions(+), 21 deletions(-)
diff --git a/README.md b/README.md
index 75d89e8..3408b36 100644
--- a/README.md
+++ b/README.md
@@ -96,14 +96,14 @@ You need Node.js and `npx`. Pick the platform you use:
| Platform | Install command |
| --- | --- |
-| Codex | `npx skills add Forward-Future/loop-library --skill loopy --agent codex -g -y` |
-| Cursor | `npx skills add Forward-Future/loop-library --skill loopy --agent cursor -g -y` |
-| Claude Code | `npx skills add Forward-Future/loop-library --skill loopy --agent claude-code -g -y` |
+| Codex | `npx skills add Forward-Future/loopy --skill loopy --agent codex -g -y` |
+| Cursor | `npx skills add Forward-Future/loopy --skill loopy --agent cursor -g -y` |
+| Claude Code | `npx skills add Forward-Future/loopy --skill loopy --agent claude-code -g -y` |
To install it for all three at once:
```bash
-npx skills add Forward-Future/loop-library \
+npx skills add Forward-Future/loopy \
--skill loopy \
--agent codex \
--agent cursor \
@@ -115,12 +115,12 @@ Using another agent? Run the interactive installer and choose from the agents
it detects:
```bash
-npx skills add Forward-Future/loop-library --skill loopy -g
+npx skills add Forward-Future/loopy --skill loopy -g
```
The command parts mean:
-- `Forward-Future/loop-library` is the GitHub repository to install from.
+- `Forward-Future/loopy` is the GitHub repository to install from.
- `--skill loopy` selects this skill from the repository.
- `--agent ...` selects the agent that should receive it.
- `-g` makes it available in all your projects. Leave `-g` off to install it
diff --git a/loop-library/site/agents/index.html b/loop-library/site/agents/index.html
index 17f9bef..dde8810 100644
--- a/loop-library/site/agents/index.html
+++ b/loop-library/site/agents/index.html
@@ -135,7 +135,7 @@
Learn
For agents
Learn
For agents
Install Loopy
approval-gated publication preparation.
- npx skills add Forward-Future/loop-library --skill loopy -g
+ npx skills add Forward-Future/loopy --skill loopy -g
Installing Loopy still does not grant runtime permissions or
diff --git a/loop-library/site/index.html b/loop-library/site/index.html
index d6d7d03..3850efc 100644
--- a/loop-library/site/index.html
+++ b/loop-library/site/index.html
@@ -242,7 +242,7 @@
Learn
For agents
Learn
For agents