diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json
index d1f64b9..ab5ffac 100644
--- a/.claude-plugin/marketplace.json
+++ b/.claude-plugin/marketplace.json
@@ -5,13 +5,13 @@
},
"metadata": {
"description": "keepwright — set up and continuously keep engineering quality and architecture true in any git repo.",
- "version": "2.0.1"
+ "version": "2.0.2"
},
"plugins": [
{
"name": "keepwright",
"description": "Interactive wizard that scaffolds a quality architecture (CLAUDE.md, rules, GitHub Actions with AI review, validators, hooks) and keeps it audited and enforced over time.",
- "version": "2.0.1",
+ "version": "2.0.2",
"author": {
"name": "Leonardo Candiani"
},
diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json
index 00c7901..807f5d7 100644
--- a/.claude-plugin/plugin.json
+++ b/.claude-plugin/plugin.json
@@ -1,6 +1,6 @@
{
"name": "keepwright",
- "version": "2.0.1",
+ "version": "2.0.2",
"description": "Set up and continuously keep engineering quality and architecture true in any git repo. Interactive wizard, deterministic scaffolding, multi-agent audits, and AI PR review wired to OAuth.",
"author": {
"name": "Leonardo Candiani"
diff --git a/AUTHORS.md b/AUTHORS.md
index 3580416..43d8d20 100644
--- a/AUTHORS.md
+++ b/AUTHORS.md
@@ -15,8 +15,7 @@ Paraná, Rio de Janeiro, and Maranhão.
- GitHub: [@sixquasar](https://github.com/sixquasar)
- Site: [sixquasar.pro](https://sixquasar.pro)
-- Role: refining the methodology in real production (SixClaw, SixClaw CEO,
- Cote.Zap, Ofertix, Sixosteria, Vox, Lupe, EasyQuote), validating the rules on
+- Role: refining the methodology in real production, validating the rules on
client projects, ongoing contributions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index f0d1ad8..ff3e42e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,6 +5,21 @@ All notable changes to this project are documented here.
Format based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
versioning follows [SemVer](https://semver.org/).
+## [2.0.2] — 2026-06-05
+
+### Fixed
+
+- Workflow templates are now fully generic, so they fit any repo. The PR
+ auto-review and `@claude` mention workflows no longer hardcode
+ `runs-on: [self-hosted, ...]` — they use `{{RUNNER}}` from the config
+ (default `ubuntu-latest`; self-hosted only when chosen). The critical-file
+ detection greps now come from the config's `criticalFiles[]` instead of
+ example project paths.
+
+### Removed
+
+- Client project names dropped from `AUTHORS.md` and the 1.0.0 changelog entry.
+
## [2.0.1] — 2026-06-05
### Fixed
@@ -94,7 +109,7 @@ First public release. Skill consolidated around a 10-phase flow.
**Co-authorship**: Leonardo Candiani ([@leonardocandiani](https://github.com/leonardocandiani))
and SixQuasar ([@sixquasar](https://github.com/sixquasar)) — a tech company
founded by Leonardo Candiani, Ricardo, and Rodrigo. Refined in production on
-SixClaw, Cote.Zap, Ofertix, Sixosteria, Vox, and Lupe.
+real-world projects.
### Added
diff --git a/scripts/lib/placeholders.ts b/scripts/lib/placeholders.ts
index aea5eab..c604865 100644
--- a/scripts/lib/placeholders.ts
+++ b/scripts/lib/placeholders.ts
@@ -59,6 +59,7 @@ export function buildPlaceholderMap(
config: KeepwrightConfig,
): Record {
const today = new Date().toISOString().slice(0, 10);
+ const crit = config.criticalFiles ?? [];
return {
PROJECT: config.project,
PROJECT_UPPER: config.project.toUpperCase(),
@@ -68,9 +69,16 @@ export function buildPlaceholderMap(
STACK: config.stack,
LAYERS_REF: (config.layers ?? []).join(", "),
REVIEW_MODEL: DEFAULT_REVIEW_MODEL,
+ // GitHub Actions runner. self-hosted only when the config asks for it;
+ // otherwise the generic GitHub-hosted runner, so workflows run in any repo.
+ RUNNER: config.runner === "self-hosted" ? "[self-hosted, linux, x64]" : "ubuntu-latest",
CURRENT_DATE: today,
DATE_YYYY_MM_DD: today,
DATE: today,
+ // criticalFiles[0..1] feed the PR auto-review grep patterns. Left as a
+ // literal {{CRITICAL_FILE_n}} for the maintainer to fill when unset.
+ ...(crit[0] ? { CRITICAL_FILE_1: crit[0] } : {}),
+ ...(crit[1] ? { CRITICAL_FILE_2: crit[1] } : {}),
};
}
diff --git a/templates/workflows/claude-mention.yml.template b/templates/workflows/claude-mention.yml.template
index 6d32bcb..0e366a0 100644
--- a/templates/workflows/claude-mention.yml.template
+++ b/templates/workflows/claude-mention.yml.template
@@ -50,7 +50,7 @@ jobs:
name: Check trigger + key
# Loop-safe: greps @claude in the event body. The bot's own comment does
# NOT contain "@claude" → guard skips → no infinite recursion.
- runs-on: [self-hosted, linux, x64]
+ runs-on: {{RUNNER}}
outputs:
go: ${{ steps.decide.outputs.go }}
pr_or_issue: ${{ steps.decide.outputs.pr_or_issue }}
@@ -90,7 +90,7 @@ jobs:
name: Claude responds
needs: guard
if: ${{ needs.guard.outputs.go == 'true' }}
- runs-on: [self-hosted, linux, x64]
+ runs-on: {{RUNNER}}
steps:
- uses: actions/checkout@v5
with:
diff --git a/templates/workflows/pr-auto-review.yml.template b/templates/workflows/pr-auto-review.yml.template
index f6abf51..5d1bcca 100644
--- a/templates/workflows/pr-auto-review.yml.template
+++ b/templates/workflows/pr-auto-review.yml.template
@@ -17,7 +17,7 @@ concurrency:
jobs:
auto-review:
name: Heuristic auto-review
- runs-on: [self-hosted, linux, x64]
+ runs-on: {{RUNNER}}
steps:
- uses: actions/checkout@v5
with: { fetch-depth: 0 }
@@ -30,34 +30,31 @@ jobs:
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ # These patterns come from keepwright.config.json criticalFiles[]. Edit
+ # them to match YOUR repo's load-bearing files (schemas, auth, core
+ # runtime, senders — anything a reviewer must watch).
- name: Detect critical layer changes
id: critical
run: |
- if grep -qE "(src/utils/types|src/utils/schemas)" changed_files.txt; then
- echo "schema_changed=true" >> $GITHUB_OUTPUT
+ if grep -qE "{{CRITICAL_FILE_1}}" changed_files.txt; then
+ echo "critical1_changed=true" >> $GITHUB_OUTPUT
fi
- if grep -qE "src/whatsapp/sender\.ts" changed_files.txt; then
- echo "sender_changed=true" >> $GITHUB_OUTPUT
- fi
- if grep -qE "src/runtime/(claude-interactive|invoker-stream)\.ts" changed_files.txt; then
- echo "runtime_changed=true" >> $GITHUB_OUTPUT
+ if grep -qE "{{CRITICAL_FILE_2}}" changed_files.txt; then
+ echo "critical2_changed=true" >> $GITHUB_OUTPUT
fi
if grep -qE "\.claude/rules/" changed_files.txt; then
echo "rules_changed=true" >> $GITHUB_OUTPUT
fi
- # CUSTOMIZE: replace sender_changed/runtime_changed with warnings for
- # YOUR critical files. The example below is generic — adapt the
- # mentioned invariants to your project.
- name: Warn critical file 1 changed
- if: steps.critical.outputs.sender_changed == 'true'
+ if: steps.critical.outputs.critical1_changed == 'true'
run: |
gh pr comment ${{ github.event.pull_request.number }} --body "⚠️ **{{CRITICAL_FILE_1}} changed** — confirm invariants {{INVARIANT_REFS}} in \`.claude/rules/01-invariants.md\`. E2E smoke required."
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Warn critical file 2 changed
- if: steps.critical.outputs.runtime_changed == 'true'
+ if: steps.critical.outputs.critical2_changed == 'true'
run: |
gh pr comment ${{ github.event.pull_request.number }} --body "⚠️ **{{CRITICAL_FILE_2}} changed** — confirm invariants {{INVARIANT_REFS}}. E2E smoke required."
env:
@@ -109,7 +106,7 @@ jobs:
check-key:
name: Check Claude token
- runs-on: [self-hosted, linux, x64]
+ runs-on: {{RUNNER}}
outputs:
has_key: ${{ steps.check.outputs.has_key }}
steps:
@@ -123,7 +120,7 @@ jobs:
claude-review:
name: Claude AI review (informational)
- runs-on: [self-hosted, linux, x64]
+ runs-on: {{RUNNER}}
needs: check-key
if: ${{ needs.check-key.outputs.has_key == 'true' && !github.event.pull_request.draft }}
timeout-minutes: 20
@@ -165,7 +162,7 @@ jobs:
with: { fetch-depth: 1 }
# setup-node@v4 required BEFORE the deterministic publish step.
- # myoung34/github-runner self-hosted does NOT guarantee native Node.
+ # Not all runners ship Node natively, so install it explicitly.
# Without it, the node parser reading claude-execution-output.json
# fails silently.
- name: Setup Node (deterministic publish)