reins-method 0.1.0 → 0.1.2
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 +33 -43
- package/bin/reins +49 -0
- package/package.json +1 -1
- package/tools/installer/cli.js +11 -16
package/README.md
CHANGED
|
@@ -1,15 +1,14 @@
|
|
|
1
1
|
```
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
──────────────────────────────────────────
|
|
2
|
+
,~~_ ____ ___________ _______
|
|
3
|
+
|/\ =_ _ ~ / __ \/ ____/ _/ | / / ___/
|
|
4
|
+
_( )_( )\~~ / /_/ / __/ / // |/ /\__ \
|
|
5
|
+
\,\ _|\ \~~~ / _, _/ /____/ // /| /___/ /
|
|
6
|
+
\` \ /_/ |_/_____/___/_/ |_//____/
|
|
7
|
+
` `
|
|
8
|
+
|
|
9
|
+
structured AI pair programming method
|
|
10
|
+
──────────────────────────────────────────────────
|
|
11
|
+
agent-agnostic · stack-agnostic · globally installed
|
|
13
12
|
```
|
|
14
13
|
|
|
15
14
|
<p align="center">
|
|
@@ -21,10 +20,6 @@
|
|
|
21
20
|
|
|
22
21
|
# REINS Method
|
|
23
22
|
|
|
24
|
-
> AI is like a horse — far stronger than any human, but without a rider it goes
|
|
25
|
-
> wherever it wants. REINS is the bridle. It does not limit the horse; it gives the
|
|
26
|
-
> rider control over where that power goes.
|
|
27
|
-
|
|
28
23
|
A universal, agent-agnostic AI pair-programming workflow. Install it once, globally,
|
|
29
24
|
and use it in every project — without ever adding files to a project repository.
|
|
30
25
|
|
|
@@ -86,13 +81,9 @@ global install covers every project on the machine, in every supported agent.
|
|
|
86
81
|
|
|
87
82
|
### Why does the installer need Node, if REINS is a bash CLI?
|
|
88
83
|
|
|
89
|
-
Only the *installer* (`npx reins-method install`) uses Node
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
`npx bmad-method install`. It collects your answers, then hands them to `bin/reins
|
|
93
|
-
install --non-interactive` to do the actual file work. Everything you run
|
|
94
|
-
afterwards — `reins update`, `reins sync`, `reins new-adapter`, etc. — is plain
|
|
95
|
-
bash with no runtime dependencies. If you'd rather not use Node at all, `install.sh`
|
|
84
|
+
Only the *installer* (`npx reins-method install`) uses Node, for the arrow-key
|
|
85
|
+
menus. Everything you run afterwards — `reins update`, `reins sync`, `reins
|
|
86
|
+
new-adapter`, etc. — is plain bash with no runtime dependencies. No Node? `install.sh`
|
|
96
87
|
runs the same wizard with `read -p` prompts instead of menus.
|
|
97
88
|
|
|
98
89
|
---
|
|
@@ -176,26 +167,25 @@ or invoke `skill-creator` for guided creation. See [SKILLS.md](SKILLS.md).
|
|
|
176
167
|
## Personas, Party Mode & Code Review
|
|
177
168
|
|
|
178
169
|
Six built-in persona skills give you BMAD-style perspectives natively, with no
|
|
179
|
-
external install
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
| `reins-
|
|
185
|
-
| `reins-
|
|
186
|
-
| `reins-
|
|
187
|
-
| `reins-
|
|
188
|
-
| `reins-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
with a plain-language summary of what needs fixing before merge.
|
|
170
|
+
external install:
|
|
171
|
+
|
|
172
|
+
| Skill | Lens |
|
|
173
|
+
|---|---|
|
|
174
|
+
| `reins-business-analyst` | Methodical, evidence-based (Porter, Minto Pyramid), represents every stakeholder — including the inconvenient ones — never takes sides |
|
|
175
|
+
| `reins-technical-writer` | CommonMark/DITA/OpenAPI, writes for the reader with zero context, diagrams over walls of text |
|
|
176
|
+
| `reins-product-manager` | Jobs-to-be-Done, pragmatic and people-focused, skeptical of complexity that doesn't earn its cost |
|
|
177
|
+
| `reins-ux-designer` | Deeply empathetic, thinks in user flows and friction points, every decision serves a genuine user need |
|
|
178
|
+
| `reins-system-architect` | Calm and strategic, favors proven tech, developer productivity, ties decisions to business value |
|
|
179
|
+
| `reins-senior-engineer` | Test-first (red/green/refactor), 100% passing before review, no shortcuts |
|
|
180
|
+
|
|
181
|
+
Each is callable individually (e.g. "give me the system architect's take on
|
|
182
|
+
this"). Before a breakdown, ask for **`party-mode`** — a facilitator picks the
|
|
183
|
+
relevant personas (always the business analyst) and announces the lineup, each
|
|
184
|
+
speaks in turn, then a synthesizer distills it into what matters for the
|
|
185
|
+
breakdown. Before proposing a commit message, ask for **`code-review`** — it
|
|
186
|
+
launches independent subagents (logic, security, and requirements if a SPEC
|
|
187
|
+
exists) for adversarial, parallel review, then closes with a plain-language
|
|
188
|
+
summary of what needs fixing before merge.
|
|
199
189
|
|
|
200
190
|
---
|
|
201
191
|
|
|
@@ -329,4 +319,4 @@ authors — nothing here is a fork or a dependency):
|
|
|
329
319
|
|
|
330
320
|
## License
|
|
331
321
|
|
|
332
|
-
MIT
|
|
322
|
+
MIT — see [LICENSE](LICENSE).
|
package/bin/reins
CHANGED
|
@@ -18,6 +18,45 @@ log() { printf '%s\n' "$*"; }
|
|
|
18
18
|
err() { printf 'Error: %s\n' "$*" >&2; }
|
|
19
19
|
die() { err "$*"; exit 1; }
|
|
20
20
|
|
|
21
|
+
print_banner() {
|
|
22
|
+
local horse=$'\033[32m' rtxt=$'\033[92m' muted=$'\033[2;32m'
|
|
23
|
+
local check=$'\033[92m' text=$'\033[32m' reset=$'\033[0m'
|
|
24
|
+
|
|
25
|
+
printf '%s%s%s%s%s\n' "$horse" ' ,~~_ ' "$rtxt" '____ ___________ _______' "$reset"
|
|
26
|
+
printf '%s%s%s%s%s\n' "$horse" ' |/\ =_ _ ~ ' "$rtxt" '/ __ \/ ____/ _/ | / / ___/' "$reset"
|
|
27
|
+
printf '%s%s%s%s%s\n' "$horse" ' _( )_( )\~~ ' "$rtxt" '/ /_/ / __/ / // |/ /\__ \' "$reset"
|
|
28
|
+
printf '%s%s%s%s%s\n' "$horse" ' \,\ _|\ \~~~ ' "$rtxt" '/ _, _/ /____/ // /| /___/ /' "$reset"
|
|
29
|
+
printf '%s%s%s%s%s\n' "$horse" ' \` \ ' "$rtxt" '/_/ |_/_____/___/_/ |_//____/' "$reset"
|
|
30
|
+
printf '%s%s%s\n' "$horse" ' ` `' "$reset"
|
|
31
|
+
printf '\n'
|
|
32
|
+
printf '%s structured AI pair programming method%s\n' "$muted" "$reset"
|
|
33
|
+
printf '%s ──────────────────────────────────────────────────%s\n' "$muted" "$reset"
|
|
34
|
+
printf ' agent-agnostic · stack-agnostic · globally installed\n'
|
|
35
|
+
printf '\n'
|
|
36
|
+
|
|
37
|
+
printf '%s✓%s REINS installed to ~/.reins/%s\n' "$check" "$text" "$reset"
|
|
38
|
+
|
|
39
|
+
local agent bridge_ok=0
|
|
40
|
+
agent="$(config_get agent)"
|
|
41
|
+
if [ -n "$agent" ]; then
|
|
42
|
+
local entry
|
|
43
|
+
if entry="$(agent_bridge_target "$agent" 2>/dev/null)"; then
|
|
44
|
+
local bridge="${entry%%:*}"
|
|
45
|
+
[ -f "$bridge" ] && bridge_ok=1
|
|
46
|
+
fi
|
|
47
|
+
fi
|
|
48
|
+
if [ "$bridge_ok" -eq 1 ]; then
|
|
49
|
+
printf '%s✓%s Agent bridge configured%s\n' "$check" "$text" "$reset"
|
|
50
|
+
fi
|
|
51
|
+
|
|
52
|
+
local skill_count=0
|
|
53
|
+
if [ -d "$CORE_DIR/skills" ]; then
|
|
54
|
+
skill_count="$(find "$CORE_DIR/skills" -mindepth 1 -maxdepth 1 -type d | wc -l | tr -d ' ')"
|
|
55
|
+
fi
|
|
56
|
+
printf '%s✓%s %s core skills registered%s\n' "$check" "$text" "$skill_count" "$reset"
|
|
57
|
+
printf '\n'
|
|
58
|
+
}
|
|
59
|
+
|
|
21
60
|
config_get() {
|
|
22
61
|
# config_get <key> -> prints scalar value for "key: value" line, empty if absent
|
|
23
62
|
[ -f "$CONFIG" ] || return 0
|
|
@@ -300,6 +339,7 @@ EOF
|
|
|
300
339
|
# ---------------------------------------------------------------------------
|
|
301
340
|
|
|
302
341
|
cmd_install() {
|
|
342
|
+
print_banner
|
|
303
343
|
local non_interactive=0
|
|
304
344
|
local arg_agent="" arg_standards="" arg_historic="" arg_adapter=""
|
|
305
345
|
for arg in "$@"; do
|
|
@@ -453,6 +493,7 @@ EOF
|
|
|
453
493
|
}
|
|
454
494
|
|
|
455
495
|
cmd_update() {
|
|
496
|
+
print_banner
|
|
456
497
|
if [ -d "$REINS_HOME/.git" ]; then
|
|
457
498
|
if ! git -C "$REINS_HOME" pull --ff-only; then
|
|
458
499
|
err "git pull failed — if this checkout has no upstream tracking branch, run:"
|
|
@@ -468,6 +509,7 @@ cmd_update() {
|
|
|
468
509
|
}
|
|
469
510
|
|
|
470
511
|
cmd_new_adapter() {
|
|
512
|
+
print_banner
|
|
471
513
|
local name="${1:-}"
|
|
472
514
|
[ -n "$name" ] || die "usage: reins new-adapter <name>"
|
|
473
515
|
local dir="$USER_DIR/adapters/$name"
|
|
@@ -504,6 +546,7 @@ EOF
|
|
|
504
546
|
}
|
|
505
547
|
|
|
506
548
|
cmd_new_skill() {
|
|
549
|
+
print_banner
|
|
507
550
|
local name="${1:-}"
|
|
508
551
|
[ -n "$name" ] || die "usage: reins new-skill <name>"
|
|
509
552
|
local dir="$USER_DIR/skills/$name"
|
|
@@ -534,10 +577,12 @@ EOF
|
|
|
534
577
|
}
|
|
535
578
|
|
|
536
579
|
cmd_sync() {
|
|
580
|
+
print_banner
|
|
537
581
|
generate_bridges
|
|
538
582
|
}
|
|
539
583
|
|
|
540
584
|
cmd_link_agents() {
|
|
585
|
+
print_banner
|
|
541
586
|
# Wire newly-installed AI agents into the existing bridge files without a
|
|
542
587
|
# full bridge regeneration — handy after installing a new agent on this
|
|
543
588
|
# machine (e.g. you set up Gemini CLI after running `reins install`).
|
|
@@ -548,6 +593,7 @@ cmd_link_agents() {
|
|
|
548
593
|
}
|
|
549
594
|
|
|
550
595
|
cmd_historic() {
|
|
596
|
+
[ "${2:-}" = "--quiet" ] || print_banner
|
|
551
597
|
local mode="${1:-}"
|
|
552
598
|
case "$mode" in
|
|
553
599
|
on)
|
|
@@ -570,6 +616,7 @@ cmd_historic() {
|
|
|
570
616
|
}
|
|
571
617
|
|
|
572
618
|
cmd_status() {
|
|
619
|
+
print_banner
|
|
573
620
|
log "REINS_HOME: $REINS_HOME"
|
|
574
621
|
if [ -d "$REINS_HOME/.git" ]; then
|
|
575
622
|
log "Version: $(git -C "$REINS_HOME" rev-parse --short HEAD 2>/dev/null) ($(git -C "$REINS_HOME" log -1 --format=%cd --date=short 2>/dev/null))"
|
|
@@ -597,6 +644,7 @@ cmd_status() {
|
|
|
597
644
|
}
|
|
598
645
|
|
|
599
646
|
cmd_doctor() {
|
|
647
|
+
print_banner
|
|
600
648
|
local problems=0
|
|
601
649
|
|
|
602
650
|
[ -d "$CORE_DIR" ] || { err "missing $CORE_DIR"; problems=$((problems+1)); }
|
|
@@ -639,6 +687,7 @@ cmd_doctor() {
|
|
|
639
687
|
}
|
|
640
688
|
|
|
641
689
|
cmd_uninstall() {
|
|
690
|
+
print_banner
|
|
642
691
|
log "Uninstalling REINS Method..."
|
|
643
692
|
|
|
644
693
|
# Remove the managed block from every native config REINS may have wired
|
package/package.json
CHANGED
package/tools/installer/cli.js
CHANGED
|
@@ -29,25 +29,20 @@ async function getColors() {
|
|
|
29
29
|
async function printBanner() {
|
|
30
30
|
const c = await getColors();
|
|
31
31
|
const lines = [
|
|
32
|
-
'
|
|
33
|
-
'
|
|
34
|
-
'
|
|
35
|
-
'
|
|
36
|
-
'
|
|
37
|
-
'
|
|
38
|
-
'█ █ █████ ███ █ █ ████',
|
|
32
|
+
[' ,~~_ ', '____ ___________ _______'],
|
|
33
|
+
[' |/\\ =_ _ ~ ', '/ __ \\/ ____/ _/ | / / ___/'],
|
|
34
|
+
[' _( )_( )\\~~ ', '/ /_/ / __/ / // |/ /\\__ \\'],
|
|
35
|
+
[' \\,\\ _|\\ \\~~~ ', '/ _, _/ /____/ // /| /___/ /'],
|
|
36
|
+
[' \\` \\ ', '/_/ |_/_____/___/_/ |_//____/'],
|
|
37
|
+
[' ` `', ''],
|
|
39
38
|
];
|
|
40
|
-
const
|
|
41
|
-
|
|
42
|
-
console.log(colors[i] ? colors[i](lines[i]) : lines[i]);
|
|
39
|
+
for (const [horse, reins] of lines) {
|
|
40
|
+
console.log(c.green(horse) + c.greenBright(reins));
|
|
43
41
|
}
|
|
44
42
|
console.log('');
|
|
45
|
-
console.log(
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
),
|
|
49
|
-
);
|
|
50
|
-
console.log(c.bold('REINS is the bridle.'));
|
|
43
|
+
console.log(c.dim(c.green(' structured AI pair programming method')));
|
|
44
|
+
console.log(c.dim(c.green(' ──────────────────────────────────────────────────')));
|
|
45
|
+
console.log(' agent-agnostic · stack-agnostic · globally installed');
|
|
51
46
|
console.log('');
|
|
52
47
|
}
|
|
53
48
|
|