@ericrisco/rsc 1.3.1 → 1.3.3
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 +39 -20
- package/manifest.json +1 -1
- package/package.json +2 -2
- package/targets/gitmoji-guard.mjs +2 -1
- package/targets/session-memory-adapter.mjs +2 -1
package/README.md
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
<div align="center">
|
|
2
2
|
|
|
3
|
-
<img src="https://raw.githubusercontent.com/ericrisco/rsc-harness/main/site/og.png" alt="rsc —
|
|
3
|
+
<img src="https://raw.githubusercontent.com/ericrisco/rsc-harness/main/site/og.png" alt="rsc-harness — You decide what to build. rsc-harness builds your agent’s harness, following strict best practices instead of improvising a Frankenstein stack." width="960">
|
|
4
4
|
|
|
5
|
-
# `rsc` —
|
|
5
|
+
# `rsc-harness` — You decide what to build. It builds your agent's harness.
|
|
6
6
|
|
|
7
7
|
[](https://www.npmjs.com/package/@ericrisco/rsc)
|
|
8
8
|
[](https://www.npmjs.com/package/@ericrisco/rsc)
|
|
@@ -10,31 +10,50 @@
|
|
|
10
10
|
[](LICENSE)
|
|
11
11
|
[](https://github.com/ericrisco/rsc-harness/stargazers)
|
|
12
12
|
|
|
13
|
-
**
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
skills that fit — one at a time — into every assistant you pick, and keeps them
|
|
17
|
-
equipped as you work.
|
|
13
|
+
**You decide what to build. rsc-harness builds your agent’s harness.** Tell it whether you are
|
|
14
|
+
shipping software, running operations, researching, creating content, or mixing them. Its wizard
|
|
15
|
+
reads the project, applies strict best practices, and shows the exact harness plan before writing.
|
|
18
16
|
|
|
19
|
-
|
|
20
|
-
channel"* — **272 skills across 23 domains**, every one researched against live
|
|
21
|
-
2025-2026 sources and **adversarially scored ≥ 8.5/10** before it shipped.
|
|
17
|
+
Give this URL to your agent:
|
|
22
18
|
|
|
23
|
-
```
|
|
24
|
-
|
|
19
|
+
```text
|
|
20
|
+
Read https://ericrisco.github.io/rsc-harness/ and set up rsc for this project.
|
|
21
|
+
Ask me the onboarding questions, show me the exact plan, and wait for my acceptance before writing.
|
|
25
22
|
```
|
|
26
23
|
|
|
27
|
-
|
|
24
|
+
Or start from the terminal:
|
|
28
25
|
|
|
29
|
-
|
|
26
|
+
```bash
|
|
27
|
+
npx @ericrisco/rsc@latest onboard
|
|
28
|
+
```
|
|
30
29
|
|
|
31
|
-
|
|
32
|
-
the rest: a **memory** so it stops inventing, **arms** so it can execute, a **trade** so it stops
|
|
33
|
-
guessing, and **reflexes** so it cannot forget the rule mid-session — into whichever assistant
|
|
34
|
-
you already use, and kept in sync as you work.
|
|
30
|
+
<img src="https://raw.githubusercontent.com/ericrisco/rsc-harness/main/site/meta-harness.png" alt="rsc-harness wizard turns an outcome into a verified plan: memory, tools, knowledge and rules selected, deferred or excluded according to evidence." width="960">
|
|
35
31
|
|
|
36
32
|
</div>
|
|
37
33
|
|
|
34
|
+
## Your agent needs a harness. It should not improvise one.
|
|
35
|
+
|
|
36
|
+
A model is only the brain. Real work also needs project memory, tools, domain knowledge, rules and
|
|
37
|
+
repeatable workflows. Add those pieces ad hoc and the result becomes a **Frankenstein harness**:
|
|
38
|
+
duplicated instructions, unrelated skills, premature hooks, unnecessary MCPs and no clear owner.
|
|
39
|
+
|
|
40
|
+
Open standards already cover individual parts — [Agent Skills](https://agentskills.io/specification),
|
|
41
|
+
[MCP](https://modelcontextprotocol.io/) and [AGENTS.md](https://agents.md/) — but they do not decide
|
|
42
|
+
which complete harness this project needs. rsc-harness does that job through one guided flow:
|
|
43
|
+
|
|
44
|
+
1. **You state the outcome.** No skill, hook or MCP vocabulary required.
|
|
45
|
+
2. **The wizard reads only the project root** and asks technical level, accompaniment, project kind,
|
|
46
|
+
goal and assistants.
|
|
47
|
+
3. **A proportional plan explains every choice.** Selected, deferred and excluded pieces all have a
|
|
48
|
+
reason. Nothing writes before you accept the exact plan.
|
|
49
|
+
4. **The result is verified.** Shared sources prevent duplication; knowledge loads progressively;
|
|
50
|
+
local state stays local; deterministic checks prove the installed harness matches the plan.
|
|
51
|
+
5. **It grows from evidence.** A deferred capability is proposed later only when the project actually
|
|
52
|
+
develops the need for it.
|
|
53
|
+
|
|
54
|
+
That is what “best practices” means here: a small, separated, project-bound and auditable harness —
|
|
55
|
+
not a pile of whatever an agent happened to install.
|
|
56
|
+
|
|
38
57
|
---
|
|
39
58
|
|
|
40
59
|
## 🤖 For agents: "install this harness"
|
|
@@ -78,8 +97,8 @@ request routes through `specify` before any skill writes code.
|
|
|
78
97
|
|
|
79
98
|
## Why this exists
|
|
80
99
|
|
|
81
|
-
|
|
82
|
-
|
|
100
|
+
An improvised harness tends to grow by accumulation: more files, more context and more rules, with
|
|
101
|
+
no method deciding whether each piece belongs. rsc-harness keeps that construction disciplined:
|
|
83
102
|
|
|
84
103
|
- **Granular by default.** The unit of installation is *one skill*. Install
|
|
85
104
|
`fastapi` without ever pulling `go`. Nothing you don't use touches your context.
|
package/manifest.json
CHANGED
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ericrisco/rsc",
|
|
3
|
-
"version": "1.3.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "1.3.3",
|
|
4
|
+
"description": "A guided harness builder that turns your goal into a minimal, verified AI-agent setup using strict best practices.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
7
|
"rsc": "scripts/rsc.js",
|
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
// read. Anything it cannot read with certainty (editor commit, -F file, --amend
|
|
19
19
|
// --no-edit, an unparseable command) is ALLOWED: a guard that guesses is a guard that
|
|
20
20
|
// gets turned off. Every deny names its recovery. Opt out with .rsc/.no-gitmoji.
|
|
21
|
+
import { pathToFileURL } from 'node:url';
|
|
21
22
|
import { existsSync, readFileSync } from 'node:fs';
|
|
22
23
|
import { join } from 'node:path';
|
|
23
24
|
|
|
@@ -221,7 +222,7 @@ export function denyMessage(message) {
|
|
|
221
222
|
|
|
222
223
|
// ---- hook entrypoint -----------------------------------------------------------
|
|
223
224
|
// Skipped when imported by a test (P2: the mechanism is testable without a subprocess).
|
|
224
|
-
if (import.meta.url ===
|
|
225
|
+
if (import.meta.url === pathToFileURL(process.argv[1]).href) {
|
|
225
226
|
const root = process.argv[2] || process.cwd();
|
|
226
227
|
const allow = () => process.exit(0);
|
|
227
228
|
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
import { pathToFileURL } from 'node:url';
|
|
2
3
|
import { existsSync, readFileSync } from 'node:fs';
|
|
3
4
|
import { resolve, join, dirname } from 'node:path';
|
|
4
5
|
import { capture, resume } from './session-memory-core.mjs';
|
|
@@ -125,7 +126,7 @@ function stdinJson() {
|
|
|
125
126
|
}
|
|
126
127
|
}
|
|
127
128
|
|
|
128
|
-
if (import.meta.url ===
|
|
129
|
+
if (import.meta.url === pathToFileURL(process.argv[1]).href) {
|
|
129
130
|
const result = handleLifecycle({ target: process.argv[2], event: process.argv[3], native: stdinJson() });
|
|
130
131
|
process.stdout.write(`${JSON.stringify(result.output)}\n`);
|
|
131
132
|
}
|