@valescoagency/runway 0.4.0 → 0.6.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.
Files changed (45) hide show
  1. package/README.md +87 -6
  2. package/dist/commands/doctor.js +67 -631
  3. package/dist/commands/init.js +2 -311
  4. package/dist/commands/run.js +39 -12
  5. package/dist/commands/upgrade-repo.js +2 -251
  6. package/dist/config.js +53 -67
  7. package/dist/diagnostics/base-branch.js +45 -0
  8. package/dist/diagnostics/claude-auth-mode.js +51 -0
  9. package/dist/diagnostics/docker-image.js +119 -0
  10. package/dist/diagnostics/docker.js +40 -0
  11. package/dist/diagnostics/gh.js +51 -0
  12. package/dist/diagnostics/git-state.js +73 -0
  13. package/dist/diagnostics/git.js +9 -0
  14. package/dist/diagnostics/index.js +180 -0
  15. package/dist/diagnostics/linear-api-key.js +14 -0
  16. package/dist/diagnostics/linear-config.js +133 -0
  17. package/dist/diagnostics/linear-scope.js +25 -0
  18. package/dist/diagnostics/node.js +18 -0
  19. package/dist/diagnostics/op-token.js +14 -0
  20. package/dist/diagnostics/op.js +9 -0
  21. package/dist/diagnostics/policy.js +35 -0
  22. package/dist/diagnostics/render.js +69 -0
  23. package/dist/diagnostics/runway-scaffold.js +31 -0
  24. package/dist/diagnostics/varlock.js +9 -0
  25. package/dist/finalize.js +35 -0
  26. package/dist/git.js +121 -29
  27. package/dist/github.js +136 -21
  28. package/dist/hitl.js +104 -0
  29. package/dist/implement.js +149 -0
  30. package/dist/linear.js +257 -65
  31. package/dist/orchestrator.js +111 -364
  32. package/dist/policy.js +0 -11
  33. package/dist/prompts.js +54 -55
  34. package/dist/repo-upgrade.js +268 -0
  35. package/dist/review.js +82 -0
  36. package/dist/sandcastle.js +60 -0
  37. package/dist/scaffolder-dockerfile.js +27 -0
  38. package/dist/scaffolder-image.js +26 -0
  39. package/dist/scaffolder-preflight.js +66 -0
  40. package/dist/scaffolder-varlock.js +67 -0
  41. package/dist/scaffolder-verify.js +102 -0
  42. package/dist/scaffolder.js +54 -0
  43. package/dist/subprocess.js +40 -0
  44. package/dist/telemetry.js +31 -0
  45. package/package.json +9 -1
package/README.md CHANGED
@@ -44,14 +44,23 @@ Linear (Todo, team=VA)
44
44
  runway (this CLI, on your Mac, run from inside the target repo)
45
45
  ↓ for each issue
46
46
  │ sandcastle.run({ agent: claudeCode, sandbox: docker, cwd: process.cwd(), ... })
47
+ │ iter 1 → IMPL: DONE | IMPL: BLOCKED — <reason> | IMPL: CONTINUE
48
+ │ iter 2 → same, with previous iteration's summary injected
49
+ │ …
47
50
  │ → branch agent/<issue-id>, commits, tests
48
51
 
49
- sandcastle.run({ ..., prompt: review template })
50
- → REVIEW: APPROVED | REVIEW: REJECTED — <reason>
52
+ if BLOCKED HITL (skip review)
53
+ else:
54
+ │ sandcastle.run({ ..., prompt: review template })
55
+ │ → REVIEW: APPROVED | REVIEW: REJECTED — <reason>
51
56
 
52
57
  ├── approved → git push → gh pr create → Linear "In Review"
53
- └── rejected → Linear label "ready-for-human", comment with reason
58
+ └── rejected → Linear comment with reason, then `ready-for-human` label
54
59
  ↓ next issue
60
+
61
+ [runway] per-issue outcomes:
62
+ VA-312 APPROVED → PR opened https://github.com/.../pull/42
63
+ VA-313 HITL Sub-agent review rejected: TOCTOU race in …
55
64
  ```
56
65
 
57
66
  ## Prerequisites
@@ -237,8 +246,11 @@ invocation — re-run runway after fixing the underlying config to retry
237
246
  it.
238
247
 
239
248
  The CLI exits with 0 even if some issues hit HITL or errored — those
240
- are normal outcomes. Check Linear for the `ready-for-human` label and the
241
- per-issue comments for what happened.
249
+ are normal outcomes. Every run prints a per-issue verdict trail on
250
+ exit (`APPROVED PR opened <url>` / `HITL <reason>` /
251
+ `REVERTED → Todo <reason>` / `INFRA_ERROR <reason>`) so you can scan
252
+ results without opening Linear; the same content also lives on the
253
+ issue as a Linear comment.
242
254
 
243
255
  ## Linear conventions
244
256
 
@@ -262,6 +274,48 @@ These names are configurable per env var; the queries match by name so
262
274
  your Linear workspace's actual state names need to line up with what
263
275
  you set.
264
276
 
277
+ ## Write-path policy
278
+
279
+ Runway tells the impl agent which paths it must **not** write to. By
280
+ default the denylist is:
281
+
282
+ ```
283
+ .github/workflows/** .env* *.pem *.key pnpm-lock.yaml .sandcastle/**
284
+ ```
285
+
286
+ When an issue's acceptance criteria require modifying a forbidden path,
287
+ the agent is instructed to emit `IMPL: BLOCKED — issue requires
288
+ modifying <path>, which working-style policy forbids` rather than
289
+ silently skipping the work. Runway routes those to HITL with the
290
+ reason attached.
291
+
292
+ Two layers of override:
293
+
294
+ **Per repo** — drop a `.runway/policy.yml` in the target repo root:
295
+
296
+ ```yaml
297
+ # Grants write access to specific paths from the default denylist.
298
+ allowedPaths:
299
+ - .github/workflows/**
300
+
301
+ # Or replace the denylist entirely (use with care).
302
+ # forbiddenPaths:
303
+ # - .env*
304
+ # - "*.pem"
305
+ ```
306
+
307
+ **Per invocation** — comma-separated globs, removed from the effective
308
+ denylist for one `runway run`:
309
+
310
+ ```bash
311
+ runway run --allow-paths='.github/workflows/**'
312
+ runway run --allow-paths='.github/workflows/**,scripts/ci/*.sh'
313
+ ```
314
+
315
+ `runway doctor` surfaces the active policy under Environment so you
316
+ can see what an agent run can and can't touch (e.g. `impl policy:
317
+ .runway/policy.yml + --allow-paths (5 forbidden paths)`).
318
+
265
319
  ## Base branch
266
320
 
267
321
  Runway auto-detects the repo's default branch at the start of every
@@ -277,6 +331,30 @@ when `origin/HEAD` isn't set and you don't want to run
277
331
  resolved base branch (detected or overridden) in its Environment
278
332
  section.
279
333
 
334
+ ## Implementation pass
335
+
336
+ The impl agent runs in a Sandcastle container with
337
+ [`prompts/implement.md`](prompts/implement.md). It iterates up to
338
+ `RUNWAY_MAX_ITERATIONS` times (default 5) and must end every iteration
339
+ with one of:
340
+
341
+ ```
342
+ IMPL: DONE
343
+ IMPL: BLOCKED — <one-line reason>
344
+ IMPL: CONTINUE
345
+ ```
346
+
347
+ - `DONE` → runway stops the loop and runs the sub-agent reviewer.
348
+ - `BLOCKED — <reason>` → runway routes the issue to HITL with the
349
+ reason attached; the reviewer pass does **not** run.
350
+ - `CONTINUE` → runway runs another iteration (up to `maxIterations`).
351
+
352
+ Between iterations, runway prepends a `## Previous iterations` block
353
+ to the next prompt — running commit log + tail of the last iteration's
354
+ final message — so the agent doesn't re-explore the repository from
355
+ scratch every time. Converged issues typically exit after 1–2
356
+ iterations.
357
+
280
358
  ## Sub-agent review
281
359
 
282
360
  Every implementation run is followed by a fresh Sandcastle run with
@@ -306,4 +384,7 @@ These are tractable, just not v1.
306
384
 
307
385
  ## Status
308
386
 
309
- v0.1scaffold complete, untested against a live queue.
387
+ 0.6.0production-shaped and dogfooded against live Linear queues.
388
+ The end-to-end pipeline (init → run → review → PR) is stable; surface
389
+ may still shift as the orchestrator's policy and iteration mechanics
390
+ mature. See [CHANGELOG.md](./CHANGELOG.md) for per-release detail.