reviewer-harness 1.2.0 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -1
- package/bin/cli.js +1 -1
- package/lib/skills.js +20 -5
- package/lib/sync.js +1 -1
- package/package.json +1 -1
- package/skills/clone.md +16 -0
package/README.md
CHANGED
|
@@ -176,10 +176,12 @@ Reusable playbooks, enabled per project:
|
|
|
176
176
|
- `skills add <name>` — install into the project and enable it in the config
|
|
177
177
|
- `skills remove <name>` — disable it
|
|
178
178
|
|
|
179
|
-
Bundled: `safe-editing`, `no-hallucination`, `debug-first`, `explain-bisaya`. Enabled skills render below the rules in every instruction file — and sync also generates a **slash command** for each one (`.opencode/commands/<name>.md` and `.claude/commands/<name>.md`), so every enabled skill appears in the `/` menu of OpenCode and Claude, ready to invoke on a specific task: `/safe-editing`, `/no-hallucination`, and so on.
|
|
179
|
+
Bundled: `safe-editing`, `no-hallucination`, `debug-first`, `explain-bisaya`, `clone`. Enabled skills render below the rules in every instruction file — and sync also generates a **slash command** for each one (`.opencode/commands/<name>.md` and `.claude/commands/<name>.md`), so every enabled skill appears in the `/` menu of OpenCode and Claude, ready to invoke on a specific task: `/safe-editing`, `/no-hallucination`, and so on.
|
|
180
180
|
|
|
181
181
|
**Every project, instantly:** want the skills in the `/` menu of *every* project, with no per-project setup? Run `reviewer-harness global` once — it installs all bundled skills as slash commands into the global OpenCode (`~/.config/opencode/commands`) and Claude (`~/.claude/commands`) folders. From then on, they are in the `/` menu of any project you open. (Project rules still come from `sync` inside a project.)
|
|
182
182
|
|
|
183
|
+
**A built-in pairing:** the `/safe-editing` command always carries the `no-hallucination` playbook inside it as a companion section — one call, both disciplines, so the AI that edits can never invent the code it edits with.
|
|
184
|
+
|
|
183
185
|
## Sub-agents and Slash Commands
|
|
184
186
|
|
|
185
187
|
One master definition in the harness, generated into each runtime's format:
|
package/bin/cli.js
CHANGED
|
@@ -218,7 +218,7 @@ function cmdGlobal() {
|
|
|
218
218
|
for (const { runtime, dir } of targets) {
|
|
219
219
|
let written = 0, unchanged = 0, pending = 0;
|
|
220
220
|
for (const skill of skills) {
|
|
221
|
-
const outcome = writeSafe(join(dir, `${skill.name}.md`), skillCommandContent(skill), dryRun);
|
|
221
|
+
const outcome = writeSafe(join(dir, `${skill.name}.md`), skillCommandContent(skill, skills), dryRun);
|
|
222
222
|
if (outcome.written) written++;
|
|
223
223
|
else if (outcome.dryRun && outcome.changed) pending++;
|
|
224
224
|
else unchanged++;
|
package/lib/skills.js
CHANGED
|
@@ -147,9 +147,24 @@ export function loadSkillSections(targetDir, config) {
|
|
|
147
147
|
// in the runtime's "/" menu (OpenCode and Claude list the files in
|
|
148
148
|
// their commands folders). Invoking /<skill> hands the playbook to
|
|
149
149
|
// the AI together with whatever the user types after it.
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
150
|
+
// Companion pairings: when one of these skills is rendered as a slash
|
|
151
|
+
// command, the companion's playbook is embedded in the same file —
|
|
152
|
+
// so a single call always carries both disciplines. safe-editing
|
|
153
|
+
// pairs with no-hallucination: the AI that edits must never invent
|
|
154
|
+
// the code it edits with.
|
|
155
|
+
const COMPANIONS = { "safe-editing": ["no-hallucination"] };
|
|
156
|
+
|
|
157
|
+
export function skillCommandContent(skill, allSkills = []) {
|
|
158
|
+
let content =
|
|
159
|
+
`---\ndescription: ${skill.description}\n---\n\n` + `${skill.body}\n`;
|
|
160
|
+
for (const companionName of COMPANIONS[skill.name] ?? []) {
|
|
161
|
+
const companion = allSkills.find((s) => s.name === companionName);
|
|
162
|
+
if (companion) {
|
|
163
|
+
content +=
|
|
164
|
+
`\n---\n\n## Companion playbook: ${companion.name} ` +
|
|
165
|
+
`(always paired with ${skill.name})\n\n${companion.body}\n`;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
content += `\nApply this playbook to the following: $ARGUMENTS\n`;
|
|
169
|
+
return content;
|
|
155
170
|
}
|
package/lib/sync.js
CHANGED
|
@@ -96,7 +96,7 @@ export function sync({ targetDir, dryRun = false }) {
|
|
|
96
96
|
if (skills.length) {
|
|
97
97
|
const files = [];
|
|
98
98
|
for (const skill of skills) {
|
|
99
|
-
const content = skillCommandContent(skill);
|
|
99
|
+
const content = skillCommandContent(skill, skills);
|
|
100
100
|
for (const dir of [".opencode/commands", ".claude/commands"]) {
|
|
101
101
|
const rel = `${dir}/${skill.name}.md`;
|
|
102
102
|
files.push({ file: rel, ...writeSafe(join(targetDir, rel), content, dryRun) });
|
package/package.json
CHANGED
package/skills/clone.md
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: clone
|
|
3
|
+
description: Fully clone a website's design — layout, components, animations, borders — while replacing all text and assets with your own.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
## Skill: clone
|
|
7
|
+
|
|
8
|
+
When to use: the user asks to clone a website or design, and gives a URL or reference to copy.
|
|
9
|
+
|
|
10
|
+
- Clone the DESIGN, replace the CONTENT. That is the whole rule: everything visual may be reproduced, everything owned must be replaced.
|
|
11
|
+
- First, inventory the target: sections, components, layout grid, colors, fonts, spacing, borders, and every animation (type, duration, easing, trigger). Write the inventory down before writing any code.
|
|
12
|
+
- Rebuild from the inventory with original code: reproduce the look and motion, never paste the target's source code.
|
|
13
|
+
- Replace every owned thing: all text (headings, skills, descriptions, projects), all image files, logos, and brand names become the user's own content or placeholders. Image placement and sizes may be copied; image files may not.
|
|
14
|
+
- Front-end only: a clone reproduces the look, never the backend — no login, database, or dynamic data.
|
|
15
|
+
- If the target is the user's own site, their own assets may be reused.
|
|
16
|
+
- Afterwards, validate: compare screenshots side by side, check responsive breakpoints, and audit that no third-party image, text, or brand remains. Report what was cloned and what was replaced.
|