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
72 changes: 72 additions & 0 deletions .github/ISSUE_TEMPLATE/add-adopter.yml
Original file line number Diff line number Diff line change
@@ -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: "[![Loop Ready L2 (58/100)](...)](...)"
3 changes: 3 additions & 0 deletions .github/ISSUE_TEMPLATE/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/audit.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/changelog-drafter.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ jobs:
draft:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v7
with:
fetch-depth: 0

Expand Down
30 changes: 26 additions & 4 deletions .github/workflows/daily-triage.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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:
Expand Down Expand Up @@ -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}`,
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/publish-goal-audit-bootstrap.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/release-goal-audit.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/release-loop-audit.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/release-loop-cost.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/release-loop-init.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/validate-patterns.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
3 changes: 2 additions & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
5 changes: 4 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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`) |
Expand Down Expand Up @@ -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

Expand Down
14 changes: 13 additions & 1 deletion docs/adopters.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 |
|-------|-----------------|
Expand Down
79 changes: 78 additions & 1 deletion docs/assets/css/showcase.css
Original file line number Diff line number Diff line change
Expand Up @@ -712,4 +712,81 @@ section {
margin-left: 8px;
}

.copy-btn:hover { background: rgba(62,232,197,0.2); }
.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;
}
Loading