@klaudworks/rmr 1.1.1 → 1.2.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 CHANGED
@@ -8,6 +8,14 @@
8
8
 
9
9
  Inspired by [snarktank/antfarm](https://github.com/snarktank/antfarm).
10
10
 
11
+ ## Why rmr?
12
+
13
+ Coding agents produce slop. Not because they're bad, but because "go make it work" is a bad prompt, the same way it's a bad brief for a human developer. You wouldn't hand someone a one-liner and expect clean, well-structured code back. Yet that's how most people use coding agents today.
14
+
15
+ The fix is simple: break the work into steps. Plan first, then implement, then review. Loop back if the review finds problems. This is how good teams already work. rmr just lets you encode that process in a YAML file and run it automatically.
16
+
17
+ It doesn't care how you plan (markdown files, Beads, Linear, whatever) or which agent you use (Claude Code, Codex, OpenCode). You can mix and match harnesses within a single workflow too, like using Claude for planning and Codex for implementation. It just makes sure each step gets the right context, the output flows to the next step, and you can pause and pick up where you left off.
18
+
11
19
  ## Quick Start
12
20
 
13
21
  **Instructions for humans**
@@ -154,6 +162,25 @@ rmr install feature-dev
154
162
  rmr run .rmr/workflows/feature-dev/workflow.yaml
155
163
  ```
156
164
 
165
+ <details>
166
+ <summary><strong>beads</strong> (requires beads + toon)</summary>
167
+
168
+ Autonomous issue loop powered by Beads: pick the next issue, plan, implement,
169
+ review, then continue with the next issue.
170
+
171
+ See docs: [docs/workflows/beads/](docs/workflows/beads/)
172
+
173
+ Prerequisites:
174
+ - [beads](https://github.com/steveyegge/beads)
175
+ - [toon](https://github.com/toon-format/toon?tab=readme-ov-file)
176
+
177
+ ```bash
178
+ rmr install beads
179
+ rmr run .rmr/workflows/beads/workflow.yaml
180
+ ```
181
+
182
+ </details>
183
+
157
184
  ## Supported Harnesses
158
185
 
159
186
  Specify a default harness (and optionally model) at the top level of your workflow file. Individual steps can override both, so you can mix providers within a single workflow.
package/dist/index.js CHANGED
@@ -8041,6 +8041,15 @@ var isOptionSymbol = Symbol(`clipanion/isOption`);
8041
8041
  function makeCommandOption(spec) {
8042
8042
  return { ...spec, [isOptionSymbol]: true };
8043
8043
  }
8044
+ function rerouteArguments(a, b) {
8045
+ if (typeof a === `undefined`)
8046
+ return [a, b];
8047
+ if (typeof a === `object` && a !== null && !Array.isArray(a)) {
8048
+ return [undefined, a];
8049
+ } else {
8050
+ return [a, b];
8051
+ }
8052
+ }
8044
8053
  function cleanValidationError(message, { mergeName = false } = {}) {
8045
8054
  const match = message.match(/^([^:]+): (.*)$/m);
8046
8055
  if (!match)
@@ -8060,6 +8069,23 @@ ${errors.map((error) => `
8060
8069
  - ${cleanValidationError(error)}`).join(``)}`);
8061
8070
  }
8062
8071
  }
8072
+ function applyValidator(name, value, validator) {
8073
+ if (typeof validator === `undefined`)
8074
+ return value;
8075
+ const errors = [];
8076
+ const coercions = [];
8077
+ const coercion = (v) => {
8078
+ const orig = value;
8079
+ value = v;
8080
+ return coercion.bind(null, orig);
8081
+ };
8082
+ const check = validator(value, { errors, coercions, coercion });
8083
+ if (!check)
8084
+ throw formatError(`Invalid value for ${name}`, errors);
8085
+ for (const [, op] of coercions)
8086
+ op();
8087
+ return value;
8088
+ }
8063
8089
 
8064
8090
  // node_modules/clipanion/lib/advanced/Command.mjs
8065
8091
  class Command {
@@ -9388,19 +9414,208 @@ VersionCommand.paths = [[`-v`], [`--version`]];
9388
9414
  var exports_options = {};
9389
9415
  __export(exports_options, {
9390
9416
  rerouteArguments: () => rerouteArguments,
9391
- makeCommandOption: () => makeCommandOption2,
9392
- isOptionSymbol: () => isOptionSymbol2,
9393
- formatError: () => formatError2,
9394
- cleanValidationError: () => cleanValidationError2,
9417
+ makeCommandOption: () => makeCommandOption,
9418
+ isOptionSymbol: () => isOptionSymbol,
9419
+ formatError: () => formatError,
9420
+ cleanValidationError: () => cleanValidationError,
9395
9421
  applyValidator: () => applyValidator,
9396
9422
  String: () => String2,
9397
9423
  Rest: () => Rest,
9398
- Proxy: () => Proxy2,
9424
+ Proxy: () => Proxy,
9399
9425
  Counter: () => Counter,
9400
9426
  Boolean: () => Boolean2,
9401
9427
  Array: () => Array2
9402
9428
  });
9403
9429
 
9430
+ // node_modules/clipanion/lib/advanced/options/Array.mjs
9431
+ function Array2(descriptor, initialValueBase, optsBase) {
9432
+ const [initialValue, opts] = rerouteArguments(initialValueBase, optsBase !== null && optsBase !== undefined ? optsBase : {});
9433
+ const { arity = 1 } = opts;
9434
+ const optNames = descriptor.split(`,`);
9435
+ const nameSet = new Set(optNames);
9436
+ return makeCommandOption({
9437
+ definition(builder) {
9438
+ builder.addOption({
9439
+ names: optNames,
9440
+ arity,
9441
+ hidden: opts === null || opts === undefined ? undefined : opts.hidden,
9442
+ description: opts === null || opts === undefined ? undefined : opts.description,
9443
+ required: opts.required
9444
+ });
9445
+ },
9446
+ transformer(builder, key, state) {
9447
+ let usedName;
9448
+ let currentValue = typeof initialValue !== `undefined` ? [...initialValue] : undefined;
9449
+ for (const { name, value } of state.options) {
9450
+ if (!nameSet.has(name))
9451
+ continue;
9452
+ usedName = name;
9453
+ currentValue = currentValue !== null && currentValue !== undefined ? currentValue : [];
9454
+ currentValue.push(value);
9455
+ }
9456
+ if (typeof currentValue !== `undefined`) {
9457
+ return applyValidator(usedName !== null && usedName !== undefined ? usedName : key, currentValue, opts.validator);
9458
+ } else {
9459
+ return currentValue;
9460
+ }
9461
+ }
9462
+ });
9463
+ }
9464
+ // node_modules/clipanion/lib/advanced/options/Boolean.mjs
9465
+ function Boolean2(descriptor, initialValueBase, optsBase) {
9466
+ const [initialValue, opts] = rerouteArguments(initialValueBase, optsBase !== null && optsBase !== undefined ? optsBase : {});
9467
+ const optNames = descriptor.split(`,`);
9468
+ const nameSet = new Set(optNames);
9469
+ return makeCommandOption({
9470
+ definition(builder) {
9471
+ builder.addOption({
9472
+ names: optNames,
9473
+ allowBinding: false,
9474
+ arity: 0,
9475
+ hidden: opts.hidden,
9476
+ description: opts.description,
9477
+ required: opts.required
9478
+ });
9479
+ },
9480
+ transformer(builer, key, state) {
9481
+ let currentValue = initialValue;
9482
+ for (const { name, value } of state.options) {
9483
+ if (!nameSet.has(name))
9484
+ continue;
9485
+ currentValue = value;
9486
+ }
9487
+ return currentValue;
9488
+ }
9489
+ });
9490
+ }
9491
+ // node_modules/clipanion/lib/advanced/options/Counter.mjs
9492
+ function Counter(descriptor, initialValueBase, optsBase) {
9493
+ const [initialValue, opts] = rerouteArguments(initialValueBase, optsBase !== null && optsBase !== undefined ? optsBase : {});
9494
+ const optNames = descriptor.split(`,`);
9495
+ const nameSet = new Set(optNames);
9496
+ return makeCommandOption({
9497
+ definition(builder) {
9498
+ builder.addOption({
9499
+ names: optNames,
9500
+ allowBinding: false,
9501
+ arity: 0,
9502
+ hidden: opts.hidden,
9503
+ description: opts.description,
9504
+ required: opts.required
9505
+ });
9506
+ },
9507
+ transformer(builder, key, state) {
9508
+ let currentValue = initialValue;
9509
+ for (const { name, value } of state.options) {
9510
+ if (!nameSet.has(name))
9511
+ continue;
9512
+ currentValue !== null && currentValue !== undefined || (currentValue = 0);
9513
+ if (!value) {
9514
+ currentValue = 0;
9515
+ } else {
9516
+ currentValue += 1;
9517
+ }
9518
+ }
9519
+ return currentValue;
9520
+ }
9521
+ });
9522
+ }
9523
+ // node_modules/clipanion/lib/advanced/options/Rest.mjs
9524
+ function Rest(opts = {}) {
9525
+ return makeCommandOption({
9526
+ definition(builder, key) {
9527
+ var _a;
9528
+ builder.addRest({
9529
+ name: (_a = opts.name) !== null && _a !== undefined ? _a : key,
9530
+ required: opts.required
9531
+ });
9532
+ },
9533
+ transformer(builder, key, state) {
9534
+ const isRestPositional = (index) => {
9535
+ const positional = state.positionals[index];
9536
+ if (positional.extra === NoLimits)
9537
+ return true;
9538
+ if (positional.extra === false && index < builder.arity.leading.length)
9539
+ return true;
9540
+ return false;
9541
+ };
9542
+ let count = 0;
9543
+ while (count < state.positionals.length && isRestPositional(count))
9544
+ count += 1;
9545
+ return state.positionals.splice(0, count).map(({ value }) => value);
9546
+ }
9547
+ });
9548
+ }
9549
+ // node_modules/clipanion/lib/advanced/options/String.mjs
9550
+ function StringOption(descriptor, initialValueBase, optsBase) {
9551
+ const [initialValue, opts] = rerouteArguments(initialValueBase, optsBase !== null && optsBase !== undefined ? optsBase : {});
9552
+ const { arity = 1 } = opts;
9553
+ const optNames = descriptor.split(`,`);
9554
+ const nameSet = new Set(optNames);
9555
+ return makeCommandOption({
9556
+ definition(builder) {
9557
+ builder.addOption({
9558
+ names: optNames,
9559
+ arity: opts.tolerateBoolean ? 0 : arity,
9560
+ hidden: opts.hidden,
9561
+ description: opts.description,
9562
+ required: opts.required
9563
+ });
9564
+ },
9565
+ transformer(builder, key, state, context) {
9566
+ let usedName;
9567
+ let currentValue = initialValue;
9568
+ if (typeof opts.env !== `undefined` && context.env[opts.env]) {
9569
+ usedName = opts.env;
9570
+ currentValue = context.env[opts.env];
9571
+ }
9572
+ for (const { name, value } of state.options) {
9573
+ if (!nameSet.has(name))
9574
+ continue;
9575
+ usedName = name;
9576
+ currentValue = value;
9577
+ }
9578
+ if (typeof currentValue === `string`) {
9579
+ return applyValidator(usedName !== null && usedName !== undefined ? usedName : key, currentValue, opts.validator);
9580
+ } else {
9581
+ return currentValue;
9582
+ }
9583
+ }
9584
+ });
9585
+ }
9586
+ function StringPositional(opts = {}) {
9587
+ const { required = true } = opts;
9588
+ return makeCommandOption({
9589
+ definition(builder, key) {
9590
+ var _a;
9591
+ builder.addPositional({
9592
+ name: (_a = opts.name) !== null && _a !== undefined ? _a : key,
9593
+ required: opts.required
9594
+ });
9595
+ },
9596
+ transformer(builder, key, state) {
9597
+ var _a;
9598
+ for (let i = 0;i < state.positionals.length; ++i) {
9599
+ if (state.positionals[i].extra === NoLimits)
9600
+ continue;
9601
+ if (required && state.positionals[i].extra === true)
9602
+ continue;
9603
+ if (!required && state.positionals[i].extra === false)
9604
+ continue;
9605
+ const [positional] = state.positionals.splice(i, 1);
9606
+ return applyValidator((_a = opts.name) !== null && _a !== undefined ? _a : key, positional.value, opts.validator);
9607
+ }
9608
+ return;
9609
+ }
9610
+ });
9611
+ }
9612
+ function String2(descriptor, ...args) {
9613
+ if (typeof descriptor === `string`) {
9614
+ return StringOption(descriptor, ...args);
9615
+ } else {
9616
+ return StringPositional(descriptor);
9617
+ }
9618
+ }
9404
9619
  // src/lib/errors.ts
9405
9620
  class RmrError extends Error {
9406
9621
  code;
@@ -10623,7 +10838,7 @@ function bashScript() {
10623
10838
  " fi",
10624
10839
  "",
10625
10840
  ' if [[ "${prev}" == "install" ]]; then',
10626
- ' COMPREPLY=( $(compgen -W "feature-dev" -- "${cur}") )',
10841
+ ' COMPREPLY=( $(compgen -W "feature-dev beads" -- "${cur}") )',
10627
10842
  " return 0",
10628
10843
  " fi",
10629
10844
  "}",
@@ -10654,7 +10869,7 @@ function zshScript() {
10654
10869
  " fi",
10655
10870
  "",
10656
10871
  " if [[ ${words[2]} == install && $CURRENT -eq 3 ]]; then",
10657
- " compadd -- feature-dev",
10872
+ " compadd -- feature-dev beads",
10658
10873
  " return",
10659
10874
  " fi",
10660
10875
  "}",
@@ -10676,7 +10891,7 @@ function fishScript() {
10676
10891
  `complete -c ${binaryName} -n '__fish_use_subcommand' -a 'install run continue complete completion'`,
10677
10892
  `complete -c ${binaryName} -n '__fish_seen_subcommand_from continue' -a '(__rex_complete_run_id)'`,
10678
10893
  `complete -c ${binaryName} -n '__fish_seen_subcommand_from run' -a '(__rex_complete_workflow)'`,
10679
- `complete -c ${binaryName} -n '__fish_seen_subcommand_from install' -a 'feature-dev'`
10894
+ `complete -c ${binaryName} -n '__fish_seen_subcommand_from install' -a 'feature-dev beads'`
10680
10895
  ].join(`
10681
10896
  `);
10682
10897
  }
@@ -11040,7 +11255,8 @@ var adapters = {
11040
11255
  return { binary: "copilot", args: withModelArgs(options.model, args) };
11041
11256
  },
11042
11257
  buildResumeCommand(_sessionId, prompt, options) {
11043
- const args = ["-p", prompt];
11258
+ const auto = options.allowAll ? ["--allow-all", "--no-ask-user"] : [];
11259
+ const args = [...auto, "-p", prompt];
11044
11260
  return { binary: "copilot", args: withModelArgs(options.model, args) };
11045
11261
  },
11046
11262
  createStreamParser: createPassthroughParser,
@@ -0,0 +1,79 @@
1
+ # Implement
2
+
3
+ You are implementing one beads issue selected by the planner.
4
+ Use issue comments as the source of truth for research context and plan.
5
+
6
+ ## Subagent Use
7
+
8
+ - Do not use subagents for basic code exploration.
9
+ - Read files and grep directly for general repo understanding.
10
+ - Use subagents sparingly, only when a focused deep lookup is needed.
11
+
12
+ ## Workflow
13
+
14
+ 1. Determine issue id:
15
+ - Use `{{verify.issue_id}}` if present (loop-back from review).
16
+ - Otherwise use `{{plan.issue_id}}`.
17
+ 2. If needed, claim issue:
18
+ `bd update <issue-id> --status in_progress --json | toon`
19
+ 3. Read issue comments once:
20
+ `bd comments <issue-id> --json -q | toon`
21
+ - Find latest planning comment and any review feedback.
22
+ 4. Read relevant source files broadly.
23
+ 5. Confirm project checks pass before changes:
24
+ - `go build ./...`
25
+ - `go vet ./...`
26
+ 6. Implement the planned change.
27
+ 7. Verify:
28
+ - Build passes
29
+ - All tests pass -- not just the ones related to your change.
30
+ If a pre-existing test fails, investigate and fix it.
31
+ Do not skip, disable, or weaken tests to work around breakage.
32
+ - Any additional verification from the issue plan comment.
33
+ 8. Commit with a clear message describing what changed and why.
34
+ 9. Add implementation handoff comment with:
35
+ - commit hash
36
+ - what changed
37
+ - verification results
38
+ Example:
39
+ `bd comments add <issue-id> "Review target commit: <hash>\n\nImplementation summary: ...\n\nVerification: ..." --json | toon`
40
+ 10. Keep the issue open and `in_progress` for review:
41
+ - `bd update <issue-id> --status in_progress --json | toon`
42
+
43
+ ## Principles
44
+
45
+ - One atomic commit per task. The review agent expects a single coherent
46
+ change to evaluate.
47
+ - Do NOT fix unrelated issues you happen to notice -- note them in your
48
+ output so they can be filed separately.
49
+ - Do NOT gold-plate. Implement what the plan asks for, elegantly, then stop.
50
+ - Do NOT skip verification. Every change must leave the project in a
51
+ working state.
52
+
53
+ ## Output
54
+
55
+ Emit `<rmr:*>` tags at the end of your response. rmr parses these automatically.
56
+
57
+ On success:
58
+
59
+ ```
60
+ <rmr:status>done</rmr:status>
61
+ <rmr:issue_id><issue-id></rmr:issue_id>
62
+ <rmr:summary>What was implemented and why</rmr:summary>
63
+ <rmr:commit>The commit hash</rmr:commit>
64
+ <rmr:tests>Test results summary</rmr:tests>
65
+ ```
66
+
67
+ If blocked after 3 attempts:
68
+
69
+ ```
70
+ <rmr:status>human_intervention_required</rmr:status>
71
+ <rmr:issue_id><issue-id></rmr:issue_id>
72
+ <rmr:reason>What is blocking and what was tried</rmr:reason>
73
+ ```
74
+
75
+ ## Context
76
+
77
+ Reviewer feedback: {{verify.issues}}
78
+ Planned issue: {{plan.issue_id}}
79
+ Loop issue: {{verify.issue_id}}
@@ -0,0 +1,69 @@
1
+ # Planner
2
+
3
+ You are the combined research + planning step for a beads issue loop.
4
+ Pick one issue, validate it, research it, write the implementation plan to
5
+ issue comments, and hand off by issue id.
6
+
7
+ ## Command Rules
8
+
9
+ - Use `--json | toon` for beads commands.
10
+ - Prefer narrow issue-scoped reads after selection.
11
+ - Do not run `bd prime` in this loop.
12
+
13
+ ## Subagent Use
14
+
15
+ - Do not use subagents for basic code exploration.
16
+ - Read files and grep directly for general repo understanding.
17
+ - Use subagents sparingly, only when a focused deep lookup is needed.
18
+
19
+ ## Workflow
20
+
21
+ 1. Select next work (highest priority):
22
+ - `bd list --status in_progress --sort priority --limit 1 --json -q | toon`
23
+ - If an in-progress issue exists, use it.
24
+ - Otherwise: `bd ready --sort priority --limit 1 --json -q | toon`
25
+ 2. If no issue is available, stop the loop for this run:
26
+ ```
27
+ <rmr:status>done</rmr:status>
28
+ <rmr:next_state>done</rmr:next_state>
29
+ <rmr:summary>No ready beads issues.</rmr:summary>
30
+ <rmr:issue_id>N/A</rmr:issue_id>
31
+ ```
32
+ 3. If selected issue is not `in_progress`, claim it:
33
+ `bd update <issue-id> --status in_progress --json | toon`
34
+ 4. Read issue comments once:
35
+ `bd comments <issue-id> --json -q | toon`
36
+ 5. Validate problem and value. If invalid/low-value:
37
+ - Add concise evidence comment.
38
+ - Close the issue with reason.
39
+ - Emit `<rmr:next_state>plan</rmr:next_state>` to continue loop.
40
+ 6. For valid issues, research and plan in one pass:
41
+ - Local code touchpoints (paths + symbols)
42
+ - Relevant spec anchors under `spec/`
43
+ - `.cache/repos/` references when useful
44
+ - Risks, edge cases, and test guidance
45
+ 7. Write one structured comment that contains both research and plan.
46
+ 8. Keep the issue `in_progress` and hand off by `<rmr:issue_id>`.
47
+
48
+ ## Output
49
+
50
+ Valid issue handoff:
51
+
52
+ ```
53
+ <rmr:status>done</rmr:status>
54
+ <rmr:issue_id><issue-id></rmr:issue_id>
55
+ <rmr:summary>Planned issue <issue-id></rmr:summary>
56
+ ```
57
+
58
+ Invalid/low-value issue (continue loop):
59
+
60
+ ```
61
+ <rmr:status>done</rmr:status>
62
+ <rmr:next_state>plan</rmr:next_state>
63
+ <rmr:summary>Closed issue <issue-id>: <reason></rmr:summary>
64
+ <rmr:issue_id><issue-id></rmr:issue_id>
65
+ ```
66
+
67
+ ## Context
68
+
69
+ No external task input is required. Select work from beads only.
@@ -0,0 +1,91 @@
1
+ # Review
2
+
3
+ You are reviewing a change made by the implement agent.
4
+ Use the beads issue comments as the source of truth for plan, implementation
5
+ notes, and review history.
6
+
7
+ ## Subagent Use
8
+
9
+ - Do not use subagents for basic code exploration.
10
+ - Read files and grep directly for general repo understanding.
11
+ - Use subagents sparingly, only when a focused deep lookup is needed.
12
+
13
+ ## Workflow
14
+
15
+ 1. Use `{{implement.issue_id}}` as the active issue id.
16
+ 2. Read issue comments once:
17
+ `bd comments <issue-id> --json -q | toon`
18
+ - Find latest `Review target commit: <hash>` marker.
19
+ 3. Read the commit diff to see the actual changes.
20
+ 4. If the diff is not enough to understand the change (large refactors,
21
+ structural moves), read the affected files in their final state.
22
+ 5. Evaluate:
23
+ - **Correctness**: Does the change achieve what the plan intended?
24
+ - **No regressions**: Could it break existing behavior?
25
+ - **Code quality**: Clean, idiomatic code? Is the result elegant?
26
+ - **Behavioral preservation**: For refactors, does the code still do
27
+ exactly the same thing?
28
+ - **Net improvement**: Is the codebase clearly better after this change?
29
+ 6. Verify the build passes and all tests are green.
30
+ 7. Make your decision.
31
+
32
+ ## Routing Actions
33
+
34
+ - **Approve**:
35
+ - `bd comments add <issue-id> "Review: approved" --json | toon`
36
+ - `bd close <issue-id> --reason "Approved" --json | toon`
37
+ - **Request changes**:
38
+ - `bd comments add <issue-id> "Review issues: <what to fix and why>" --json | toon`
39
+ - `bd update <issue-id> --status in_progress --json | toon`
40
+ - **Escalate**:
41
+ - `bd comments add <issue-id> "Review blocked: <reason>" --json | toon`
42
+
43
+ ## What to Look For
44
+
45
+ - Semantic changes: refactors that subtly change behavior
46
+ - Missing error handling
47
+ - Test validity: new tests that do not actually test what they claim
48
+ - Unrelated changes sneaking in (but touching many files for a consistent
49
+ refactor is fine)
50
+
51
+ ## Decisions
52
+
53
+ Use `<rmr:next_state>` to route the workflow.
54
+
55
+ **Approve** -- the change is correct and improves the codebase:
56
+
57
+ ```
58
+ <rmr:status>done</rmr:status>
59
+ <rmr:issue_id><issue-id></rmr:issue_id>
60
+ <rmr:next_state>plan</rmr:next_state>
61
+ <rmr:summary>Why this change is good</rmr:summary>
62
+ ```
63
+
64
+ **Request changes** -- issues that need fixing (sends back to implement):
65
+
66
+ ```
67
+ <rmr:status>done</rmr:status>
68
+ <rmr:issue_id><issue-id></rmr:issue_id>
69
+ <rmr:next_state>implement</rmr:next_state>
70
+ <rmr:issues>What needs to be fixed and why</rmr:issues>
71
+ ```
72
+
73
+ **Escalate** -- needs human judgment:
74
+
75
+ ```
76
+ <rmr:status>human_intervention_required</rmr:status>
77
+ <rmr:issue_id><issue-id></rmr:issue_id>
78
+ <rmr:reason>Why human input is needed</rmr:reason>
79
+ ```
80
+
81
+ ## Do NOT
82
+
83
+ - Make improvements -- review only
84
+ - Refactor code touched by the commit
85
+ - Add unrelated tests
86
+ - Approve changes that fail build or tests
87
+ - Skip or weaken tests to make the suite pass
88
+
89
+ ## Context
90
+
91
+ Issue: {{implement.issue_id}}
@@ -0,0 +1,27 @@
1
+ # Beads autonomous loop for rmr.
2
+ # Three steps: plan (select + research + plan), implement, verify (review).
3
+ # verify routes back to plan after approval to continue processing issues.
4
+
5
+ id: beads
6
+ name: Beads Development Workflow
7
+ harness: claude
8
+
9
+ steps:
10
+ - id: plan
11
+ prompt_file: planner-agent.md
12
+ next_step: implement
13
+ requires:
14
+ outputs: [issue_id]
15
+
16
+ - id: implement
17
+ prompt_file: implement-agent.md
18
+ next_step: verify
19
+ requires:
20
+ inputs: [plan.issue_id]
21
+ outputs: [issue_id]
22
+
23
+ - id: verify
24
+ prompt_file: review-agent.md
25
+ next_step: plan
26
+ requires:
27
+ inputs: [implement.issue_id]
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@klaudworks/rex",
3
- "version": "1.1.1",
3
+ "version": "1.2.0",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@klaudworks/rex",
9
- "version": "1.1.1",
9
+ "version": "1.2.0",
10
10
  "dependencies": {
11
11
  "clipanion": "^4.0.0-rc.4",
12
12
  "yaml": "^2.8.2"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@klaudworks/rmr",
3
- "version": "1.1.1",
3
+ "version": "1.2.0",
4
4
  "description": "Define multi-step coding workflows for AI agents",
5
5
  "license": "MIT",
6
6
  "repository": {