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

npx skills add Forward-Future/loop-library --skill loopy + >npx skills add Forward-Future/loopy --skill loopy -g
@@ -343,7 +343,7 @@

diff --git a/loop-library/site/learn/index.html b/loop-library/site/learn/index.html index 340be0c..6591d43 100644 --- a/loop-library/site/learn/index.html +++ b/loop-library/site/learn/index.html @@ -133,7 +133,7 @@ Learn For agents Learn For agents Loops Learn For agents - Skill + Skill