loop-engineering
+ +Reference implementation — loop-audit on every PR; readiness score 100.
+diff --git a/.github/ISSUE_TEMPLATE/add-adopter.yml b/.github/ISSUE_TEMPLATE/add-adopter.yml new file mode 100644 index 0000000..9377178 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/add-adopter.yml @@ -0,0 +1,72 @@ +name: Add my project to Adopters +description: List your loop setup on the showcase and docs/adopters.md +title: "Adopter: " +labels: + - docs +body: + - type: markdown + value: | + Share how you run loops from this repo (or an adaptation). We'll add your project to [docs/adopters.md](https://github.com/cobusgreyling/loop-engineering/blob/main/docs/adopters.md) and the [showcase adopters wall](https://cobusgreyling.github.io/loop-engineering/#adopters). + + **Optional:** paste your Loop Ready badge from `npx @cobusgreyling/loop-audit . --badge`. + + - type: input + id: project + attributes: + label: Project + description: Repo URL or product name + placeholder: https://github.com/you/your-repo + validations: + required: true + + - type: input + id: patterns + attributes: + label: Pattern(s) + description: e.g. Daily Triage + Issue Triage + placeholder: daily-triage, issue-triage + validations: + required: true + + - type: dropdown + id: tool + attributes: + label: Primary tool + options: + - Grok + - Claude Code + - Codex + - Cursor + - Windsurf + - GitHub Actions + - Mixed + validations: + required: true + + - type: dropdown + id: level + attributes: + label: Readiness level (honest) + options: + - L1 + - L2 + - L3 + validations: + required: true + + - type: textarea + id: notes + attributes: + label: One-line notes + description: What worked or what broke — failures welcome + placeholder: L1 daily triage for 2 weeks; killed CI sweeper after token spike + validations: + required: true + + - type: textarea + id: badge + attributes: + label: Loop Ready badge (optional) + description: Output of `npx @cobusgreyling/loop-audit . --badge` + render: text + placeholder: "[](...)" \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 90fd442..6d22ef8 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -6,6 +6,9 @@ contact_links: - name: "\ud83d\udc1b Report an issue with the docs site or showcase" url: https://github.com/cobusgreyling/loop-engineering/issues/new?labels=docs about: "Use the bug report template for the reference itself." + - name: "\ud83c\udf10 Add my project to Adopters" + url: https://github.com/cobusgreyling/loop-engineering/issues/new?template=add-adopter.yml + about: "List your loop on the showcase adopters wall and docs/adopters.md." labels: - name: "pattern-request" diff --git a/.github/workflows/audit.yml b/.github/workflows/audit.yml index 3813b8e..1ea74f0 100644 --- a/.github/workflows/audit.yml +++ b/.github/workflows/audit.yml @@ -16,7 +16,7 @@ jobs: audit: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v7 - uses: actions/setup-node@v6 with: diff --git a/.github/workflows/changelog-drafter.yml b/.github/workflows/changelog-drafter.yml index c9350c4..c16b98d 100644 --- a/.github/workflows/changelog-drafter.yml +++ b/.github/workflows/changelog-drafter.yml @@ -13,7 +13,7 @@ jobs: draft: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v7 with: fetch-depth: 0 diff --git a/.github/workflows/daily-triage.yml b/.github/workflows/daily-triage.yml index d0430f7..f553b7a 100644 --- a/.github/workflows/daily-triage.yml +++ b/.github/workflows/daily-triage.yml @@ -15,7 +15,7 @@ jobs: triage: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v7 - name: Record run start id: timing @@ -121,14 +121,27 @@ jobs: node scripts/append-run-log.mjs "$ENTRY" echo "outcome=${OUTCOME}" >> "$GITHUB_OUTPUT" + # These run the SAME gates a PR-triggered workflow would. Their outcomes + # (not a hardcoded value) drive the commit statuses posted below, so the + # loop cannot mark its own change green unless the real gates passed. - name: Run validate gates (for PR status) id: validate_gates + continue-on-error: true run: bash scripts/ci-validate-gates.sh - name: Run audit gates (for PR status) id: audit_gates + continue-on-error: true run: bash scripts/ci-audit-gates.sh + - name: Fail the run if either gate failed + if: steps.validate_gates.outcome == 'failure' || steps.audit_gates.outcome == 'failure' + run: | + echo "validate gates: ${{ steps.validate_gates.outcome }}" + echo "audit gates: ${{ steps.audit_gates.outcome }}" + echo "One or more dogfood gates failed — not opening/merging an automated PR." + exit 1 + - name: Open PR for STATE.md + loop-run-log if changed id: pr env: @@ -186,16 +199,25 @@ jobs: core.setFailed('Missing head_sha for commit statuses'); return; } + const toState = (outcome) => (outcome === 'success' ? 'success' : 'failure'); const checks = [ - { context: 'validate', description: 'Pattern/registry gates (daily-triage inline)' }, - { context: 'audit', description: 'Loop readiness gates (daily-triage inline)' }, + { + context: 'validate', + description: 'Pattern/registry gates (daily-triage inline)', + state: toState('${{ steps.validate_gates.outcome }}'), + }, + { + context: 'audit', + description: 'Loop readiness gates (daily-triage inline)', + state: toState('${{ steps.audit_gates.outcome }}'), + }, ]; for (const check of checks) { await github.rest.repos.createCommitStatus({ owner: context.repo.owner, repo: context.repo.repo, sha, - state: 'success', + state: check.state, context: check.context, description: check.description, target_url: `${context.serverUrl}/${context.repo.owner}/${context.repo.repo}/actions/runs/${context.runId}`, diff --git a/.github/workflows/publish-goal-audit-bootstrap.yml b/.github/workflows/publish-goal-audit-bootstrap.yml index e393884..4b044fc 100644 --- a/.github/workflows/publish-goal-audit-bootstrap.yml +++ b/.github/workflows/publish-goal-audit-bootstrap.yml @@ -15,7 +15,7 @@ jobs: publish: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v7 with: repository: cobusgreyling/goal-engineering ref: main diff --git a/.github/workflows/release-goal-audit.yml b/.github/workflows/release-goal-audit.yml index 9585b44..9bd1dc2 100644 --- a/.github/workflows/release-goal-audit.yml +++ b/.github/workflows/release-goal-audit.yml @@ -13,7 +13,7 @@ jobs: test-and-publish: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v7 - uses: actions/setup-node@v6 with: diff --git a/.github/workflows/release-loop-audit.yml b/.github/workflows/release-loop-audit.yml index da7f27c..efb2c8d 100644 --- a/.github/workflows/release-loop-audit.yml +++ b/.github/workflows/release-loop-audit.yml @@ -13,7 +13,7 @@ jobs: test-and-publish: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v7 - uses: actions/setup-node@v6 with: diff --git a/.github/workflows/release-loop-cost.yml b/.github/workflows/release-loop-cost.yml index 5e5c66d..d0a11c5 100644 --- a/.github/workflows/release-loop-cost.yml +++ b/.github/workflows/release-loop-cost.yml @@ -13,7 +13,7 @@ jobs: test-and-publish: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v7 - uses: actions/setup-node@v6 with: diff --git a/.github/workflows/release-loop-init.yml b/.github/workflows/release-loop-init.yml index 606065b..5cf5fe6 100644 --- a/.github/workflows/release-loop-init.yml +++ b/.github/workflows/release-loop-init.yml @@ -13,7 +13,7 @@ jobs: publish: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v7 - uses: actions/setup-node@v6 with: diff --git a/.github/workflows/validate-patterns.yml b/.github/workflows/validate-patterns.yml index ca0c68e..4e66670 100644 --- a/.github/workflows/validate-patterns.yml +++ b/.github/workflows/validate-patterns.yml @@ -10,7 +10,7 @@ jobs: validate: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v7 - uses: actions/setup-node@v6 with: diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index b5d1199..0c6ab30 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -53,7 +53,8 @@ Also add an entry to `patterns/registry.yaml`. ## Community - **Questions**: [GitHub Discussions](https://github.com/cobusgreyling/loop-engineering/discussions) (preferred) or issue with label `question` -- **Show your loop**: post in Discussions or add a row to [docs/adopters.md](./docs/adopters.md) +- **Show your loop**: [Add Adopter issue](https://github.com/cobusgreyling/loop-engineering/issues/new?template=add-adopter.yml), Discussions, or a row in [docs/adopters.md](./docs/adopters.md) +- **Loop Ready badge**: `npx @cobusgreyling/loop-audit . --badge` — paste into your README - **Good first issues**: look for label [`good first issue`](https://github.com/cobusgreyling/loop-engineering/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) - **Security**: see [SECURITY.md](./SECURITY.md) — do not file public issues for exploitable vulnerabilities diff --git a/README.md b/README.md index 7889208..7adca20 100644 --- a/README.md +++ b/README.md @@ -66,7 +66,7 @@ A loop is a recursive goal: you define a purpose and the AI iterates (often with | [Loop Design Checklist](docs/loop-design-checklist.md) | Ship readiness rubric | | [Patterns](patterns/README.md) | 7 production patterns + [interactive picker](https://cobusgreyling.github.io/loop-engineering/#interactive) | | [Starters](starters/) | Clone-and-run kits (Grok, Claude Code, Codex) | -| [loop-audit](tools/loop-audit/) | Loop Readiness Score CLI (v1.4 + activity detection) — `npx @cobusgreyling/loop-audit . --suggest` | +| [loop-audit](tools/loop-audit/) | Loop Readiness Score CLI (v1.4 + activity detection) — `npx @cobusgreyling/loop-audit . --suggest` · `--badge` for README | | [loop-init](tools/loop-init/) | Scaffold starters + budget/run-log (v1.2) — `npx @cobusgreyling/loop-init . --pattern daily-triage --tool grok` | | [loop-cost](tools/loop-cost/) | Token spend estimator — `npx @cobusgreyling/loop-cost` | | [Goal Engineering](https://github.com/cobusgreyling/goal-engineering) | Companion: Grok Build `/goal` — run-until-done objectives (`npx @cobusgreyling/goal-audit`) | @@ -148,6 +148,9 @@ npx @cobusgreyling/loop-cost --pattern daily-triage --level L1 # 3. Audit readiness (budget + run-log now scored) npx @cobusgreyling/loop-audit . --suggest +# Optional: paste Loop Ready badge into your README +npx @cobusgreyling/loop-audit . --badge + # 4. See scores climb: empty → L1 → L2 bash scripts/before-after-demo.sh diff --git a/docs/adopters.md b/docs/adopters.md index a293c3f..380aa0a 100644 --- a/docs/adopters.md +++ b/docs/adopters.md @@ -2,9 +2,21 @@ Forks and stars mean people are trying this in their own stacks. If you run a loop from this repo (or adapted from it), add yourself here via PR. +## Loop Ready badge + +Show your readiness level in your README: + +```bash +npx @cobusgreyling/loop-audit . --badge +``` + +Paste the markdown output into your README. Re-run after you graduate L1 → L2 → L3. + ## How to list your project -Open a PR that adds a row to the table below: +**Fast path:** [open the Add Adopter issue](https://github.com/cobusgreyling/loop-engineering/issues/new?template=add-adopter.yml) — we'll add your row. + +Or open a PR that adds a row to the table below: | Field | What to include | |-------|-----------------| diff --git a/docs/assets/css/showcase.css b/docs/assets/css/showcase.css index 5ba09a6..d122118 100644 --- a/docs/assets/css/showcase.css +++ b/docs/assets/css/showcase.css @@ -712,4 +712,81 @@ section { margin-left: 8px; } -.copy-btn:hover { background: rgba(62,232,197,0.2); } \ No newline at end of file +.copy-btn:hover { background: rgba(62,232,197,0.2); } + +/* Adopters */ +.adopters-cta { + display: flex; + align-items: center; + justify-content: space-between; + gap: 24px; + flex-wrap: wrap; + padding: 24px 28px; + background: var(--bg-elevated); + border: 1px solid var(--border); + border-radius: var(--radius); + margin-bottom: 28px; +} + +.adopters-cta h3 { + font-size: 1.1rem; + margin-bottom: 8px; +} + +.adopters-cta p { + color: var(--text-muted); + font-size: 0.9rem; + margin-bottom: 10px; +} + +.inline-cmd { + display: inline-block; + font-family: var(--font-mono); + font-size: 0.8rem; + background: var(--bg-card); + padding: 6px 10px; + border-radius: 6px; + border: 1px solid var(--border); +} + +.adopters-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); + gap: 16px; +} + +.adopter-card { + padding: 20px; + background: var(--bg-elevated); + border: 1px solid var(--border); + border-radius: var(--radius); +} + +.adopter-card h4 { + font-size: 1rem; + margin-bottom: 8px; +} + +.adopter-meta { + font-size: 0.8rem; + color: var(--accent-2); + margin-bottom: 10px; +} + +.adopter-note { + font-size: 0.85rem; + color: var(--text-muted); + line-height: 1.5; +} + +.adopter-placeholder { + border-style: dashed; + display: flex; + flex-direction: column; + gap: 8px; +} + +.adopter-placeholder .btn { + align-self: flex-start; + margin-top: 4px; +} \ No newline at end of file diff --git a/docs/index.html b/docs/index.html index da437e6..52eb1af 100644 --- a/docs/index.html +++ b/docs/index.html @@ -37,6 +37,7 @@
Community
+
+ Forks mean people are trying this. Listed projects run (or adapted) loops from this reference.
+ Add yours via the Add Adopter issue
+ or a PR to docs/adopters.md.
+
Paste a badge in your README after loop-audit — social proof for your team and contributors.
npx @cobusgreyling/loop-audit . --badge
+ Reference implementation — loop-audit on every PR; readiness score 100.
+Off-peak scan; verifier caught doc/API drift.
+Propose labels only week one; pairs with morning STATE.md triage.
+One line on what worked or broke — failures are first-class.
+ List yours → +