@cad0p/pi-steering 0.1.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 (246) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/LICENSE +29 -0
  3. package/README.md +920 -0
  4. package/dist/__test-helpers__.d.ts +95 -0
  5. package/dist/__test-helpers__.d.ts.map +1 -0
  6. package/dist/__test-helpers__.js +174 -0
  7. package/dist/__test-helpers__.js.map +1 -0
  8. package/dist/bin/pi-steering.d.ts +9 -0
  9. package/dist/bin/pi-steering.d.ts.map +1 -0
  10. package/dist/bin/pi-steering.js +506 -0
  11. package/dist/bin/pi-steering.js.map +1 -0
  12. package/dist/compat.d.ts +50 -0
  13. package/dist/compat.d.ts.map +1 -0
  14. package/dist/compat.js +180 -0
  15. package/dist/compat.js.map +1 -0
  16. package/dist/defaults.d.ts +61 -0
  17. package/dist/defaults.d.ts.map +1 -0
  18. package/dist/defaults.js +106 -0
  19. package/dist/defaults.js.map +1 -0
  20. package/dist/define-config.d.ts +235 -0
  21. package/dist/define-config.d.ts.map +1 -0
  22. package/dist/define-config.js +118 -0
  23. package/dist/define-config.js.map +1 -0
  24. package/dist/define-predicate.d.ts +49 -0
  25. package/dist/define-predicate.d.ts.map +1 -0
  26. package/dist/define-predicate.js +35 -0
  27. package/dist/define-predicate.js.map +1 -0
  28. package/dist/evaluator-internals/context.d.ts +186 -0
  29. package/dist/evaluator-internals/context.d.ts.map +1 -0
  30. package/dist/evaluator-internals/context.js +219 -0
  31. package/dist/evaluator-internals/context.js.map +1 -0
  32. package/dist/evaluator-internals/override.d.ts +19 -0
  33. package/dist/evaluator-internals/override.d.ts.map +1 -0
  34. package/dist/evaluator-internals/override.js +79 -0
  35. package/dist/evaluator-internals/override.js.map +1 -0
  36. package/dist/evaluator-internals/predicates.d.ts +152 -0
  37. package/dist/evaluator-internals/predicates.d.ts.map +1 -0
  38. package/dist/evaluator-internals/predicates.js +849 -0
  39. package/dist/evaluator-internals/predicates.js.map +1 -0
  40. package/dist/evaluator-internals/speculative-synthesis.d.ts +102 -0
  41. package/dist/evaluator-internals/speculative-synthesis.d.ts.map +1 -0
  42. package/dist/evaluator-internals/speculative-synthesis.js +101 -0
  43. package/dist/evaluator-internals/speculative-synthesis.js.map +1 -0
  44. package/dist/evaluator.d.ts +101 -0
  45. package/dist/evaluator.d.ts.map +1 -0
  46. package/dist/evaluator.js +714 -0
  47. package/dist/evaluator.js.map +1 -0
  48. package/dist/helpers/walker-unknown-cwd-reason.d.ts +68 -0
  49. package/dist/helpers/walker-unknown-cwd-reason.d.ts.map +1 -0
  50. package/dist/helpers/walker-unknown-cwd-reason.js +73 -0
  51. package/dist/helpers/walker-unknown-cwd-reason.js.map +1 -0
  52. package/dist/index.d.ts +42 -0
  53. package/dist/index.d.ts.map +1 -0
  54. package/dist/index.js +93 -0
  55. package/dist/index.js.map +1 -0
  56. package/dist/internal/drop-unused-observers.d.ts +43 -0
  57. package/dist/internal/drop-unused-observers.d.ts.map +1 -0
  58. package/dist/internal/drop-unused-observers.js +50 -0
  59. package/dist/internal/drop-unused-observers.js.map +1 -0
  60. package/dist/internal/finalize-plugin-state.d.ts +22 -0
  61. package/dist/internal/finalize-plugin-state.d.ts.map +1 -0
  62. package/dist/internal/finalize-plugin-state.js +14 -0
  63. package/dist/internal/finalize-plugin-state.js.map +1 -0
  64. package/dist/internal/merge-observers.d.ts +30 -0
  65. package/dist/internal/merge-observers.d.ts.map +1 -0
  66. package/dist/internal/merge-observers.js +27 -0
  67. package/dist/internal/merge-observers.js.map +1 -0
  68. package/dist/internal/pattern-utils.d.ts +33 -0
  69. package/dist/internal/pattern-utils.d.ts.map +1 -0
  70. package/dist/internal/pattern-utils.js +20 -0
  71. package/dist/internal/pattern-utils.js.map +1 -0
  72. package/dist/internal/ref-text.d.ts +11 -0
  73. package/dist/internal/ref-text.d.ts.map +1 -0
  74. package/dist/internal/ref-text.js +15 -0
  75. package/dist/internal/ref-text.js.map +1 -0
  76. package/dist/internal/session-runtime.d.ts +44 -0
  77. package/dist/internal/session-runtime.d.ts.map +1 -0
  78. package/dist/internal/session-runtime.js +143 -0
  79. package/dist/internal/session-runtime.js.map +1 -0
  80. package/dist/internal/watch-matcher.d.ts +56 -0
  81. package/dist/internal/watch-matcher.d.ts.map +1 -0
  82. package/dist/internal/watch-matcher.js +179 -0
  83. package/dist/internal/watch-matcher.js.map +1 -0
  84. package/dist/loader.d.ts +97 -0
  85. package/dist/loader.d.ts.map +1 -0
  86. package/dist/loader.js +527 -0
  87. package/dist/loader.js.map +1 -0
  88. package/dist/observer-dispatcher.d.ts +69 -0
  89. package/dist/observer-dispatcher.d.ts.map +1 -0
  90. package/dist/observer-dispatcher.js +184 -0
  91. package/dist/observer-dispatcher.js.map +1 -0
  92. package/dist/plugin-merger.d.ts +175 -0
  93. package/dist/plugin-merger.d.ts.map +1 -0
  94. package/dist/plugin-merger.js +450 -0
  95. package/dist/plugin-merger.js.map +1 -0
  96. package/dist/plugins/git/branch-tracker.d.ts +85 -0
  97. package/dist/plugins/git/branch-tracker.d.ts.map +1 -0
  98. package/dist/plugins/git/branch-tracker.js +181 -0
  99. package/dist/plugins/git/branch-tracker.js.map +1 -0
  100. package/dist/plugins/git/cwd-extensions.d.ts +10 -0
  101. package/dist/plugins/git/cwd-extensions.d.ts.map +1 -0
  102. package/dist/plugins/git/cwd-extensions.js +155 -0
  103. package/dist/plugins/git/cwd-extensions.js.map +1 -0
  104. package/dist/plugins/git/git-ops.d.ts +89 -0
  105. package/dist/plugins/git/git-ops.d.ts.map +1 -0
  106. package/dist/plugins/git/git-ops.js +107 -0
  107. package/dist/plugins/git/git-ops.js.map +1 -0
  108. package/dist/plugins/git/index.d.ts +225 -0
  109. package/dist/plugins/git/index.d.ts.map +1 -0
  110. package/dist/plugins/git/index.js +52 -0
  111. package/dist/plugins/git/index.js.map +1 -0
  112. package/dist/plugins/git/predicates.d.ts +312 -0
  113. package/dist/plugins/git/predicates.d.ts.map +1 -0
  114. package/dist/plugins/git/predicates.js +580 -0
  115. package/dist/plugins/git/predicates.js.map +1 -0
  116. package/dist/plugins/git/rules.d.ts +209 -0
  117. package/dist/plugins/git/rules.d.ts.map +1 -0
  118. package/dist/plugins/git/rules.js +267 -0
  119. package/dist/plugins/git/rules.js.map +1 -0
  120. package/dist/schema.d.ts +1799 -0
  121. package/dist/schema.d.ts.map +1 -0
  122. package/dist/schema.js +4 -0
  123. package/dist/schema.js.map +1 -0
  124. package/dist/testing/index.d.ts +621 -0
  125. package/dist/testing/index.d.ts.map +1 -0
  126. package/dist/testing/index.js +747 -0
  127. package/dist/testing/index.js.map +1 -0
  128. package/examples/README.md +83 -0
  129. package/examples/combined-git-discipline/README.md +52 -0
  130. package/examples/combined-git-discipline/node_modules/.bin/pi-steering +43 -0
  131. package/examples/combined-git-discipline/package.json +18 -0
  132. package/examples/combined-git-discipline/steering.json +27 -0
  133. package/examples/combined-git-discipline/steering.test.ts +42 -0
  134. package/examples/combined-git-discipline/steering.ts +64 -0
  135. package/examples/combined-git-discipline/tsconfig.json +7 -0
  136. package/examples/draft-prs-only/README.md +42 -0
  137. package/examples/draft-prs-only/node_modules/.bin/pi-steering +43 -0
  138. package/examples/draft-prs-only/package.json +18 -0
  139. package/examples/draft-prs-only/steering.json +12 -0
  140. package/examples/draft-prs-only/steering.test.ts +48 -0
  141. package/examples/draft-prs-only/steering.ts +36 -0
  142. package/examples/draft-prs-only/tsconfig.json +7 -0
  143. package/examples/dynamic-reason-runtime-cwd/README.md +148 -0
  144. package/examples/dynamic-reason-runtime-cwd/node_modules/.bin/pi-steering +43 -0
  145. package/examples/dynamic-reason-runtime-cwd/package.json +18 -0
  146. package/examples/dynamic-reason-runtime-cwd/steering.test.ts +130 -0
  147. package/examples/dynamic-reason-runtime-cwd/steering.ts +82 -0
  148. package/examples/dynamic-reason-runtime-cwd/tsconfig.json +7 -0
  149. package/examples/force-push-strict/README.md +75 -0
  150. package/examples/force-push-strict/node_modules/.bin/pi-steering +43 -0
  151. package/examples/force-push-strict/package.json +18 -0
  152. package/examples/force-push-strict/steering.json +12 -0
  153. package/examples/force-push-strict/steering.test.ts +51 -0
  154. package/examples/force-push-strict/steering.ts +54 -0
  155. package/examples/force-push-strict/tsconfig.json +7 -0
  156. package/examples/no-amend/README.md +52 -0
  157. package/examples/no-amend/node_modules/.bin/pi-steering +43 -0
  158. package/examples/no-amend/package.json +18 -0
  159. package/examples/no-amend/steering.cwd-scoped.json +12 -0
  160. package/examples/no-amend/steering.json +11 -0
  161. package/examples/no-amend/steering.test.ts +49 -0
  162. package/examples/no-amend/steering.ts +38 -0
  163. package/examples/no-amend/tsconfig.json +7 -0
  164. package/examples/work-item-plugin/README.md +103 -0
  165. package/examples/work-item-plugin/node_modules/.bin/pi-steering +43 -0
  166. package/examples/work-item-plugin/package.json +19 -0
  167. package/examples/work-item-plugin/src/index.test.ts +168 -0
  168. package/examples/work-item-plugin/src/index.ts +122 -0
  169. package/examples/work-item-plugin/src/observers/npm-test-tracker.test.ts +95 -0
  170. package/examples/work-item-plugin/src/observers/npm-test-tracker.ts +88 -0
  171. package/examples/work-item-plugin/src/observers/retest-required-tracker.test.ts +81 -0
  172. package/examples/work-item-plugin/src/observers/retest-required-tracker.ts +81 -0
  173. package/examples/work-item-plugin/src/predicates/work-item-format.test.ts +157 -0
  174. package/examples/work-item-plugin/src/predicates/work-item-format.ts +99 -0
  175. package/examples/work-item-plugin/src/rules/commit-description-check.test.ts +107 -0
  176. package/examples/work-item-plugin/src/rules/commit-description-check.ts +83 -0
  177. package/examples/work-item-plugin/src/rules/commit-requires-work-item.test.ts +79 -0
  178. package/examples/work-item-plugin/src/rules/commit-requires-work-item.ts +56 -0
  179. package/examples/work-item-plugin/src/rules/push-requires-tests.test.ts +245 -0
  180. package/examples/work-item-plugin/src/rules/push-requires-tests.ts +62 -0
  181. package/examples/work-item-plugin/tsconfig.json +8 -0
  182. package/package.json +88 -0
  183. package/skills/steering-authoring/SKILL.md +102 -0
  184. package/src/INVARIANTS.md +116 -0
  185. package/src/__test-helpers__.ts +243 -0
  186. package/src/bin/pi-steering.test.ts +920 -0
  187. package/src/bin/pi-steering.ts +584 -0
  188. package/src/compat.test.ts +431 -0
  189. package/src/compat.ts +282 -0
  190. package/src/defaults.test.ts +585 -0
  191. package/src/defaults.ts +148 -0
  192. package/src/define-config.test.ts +888 -0
  193. package/src/define-config.ts +375 -0
  194. package/src/define-predicate.test.ts +70 -0
  195. package/src/define-predicate.ts +57 -0
  196. package/src/evaluator-internals/context.ts +290 -0
  197. package/src/evaluator-internals/override.test.ts +99 -0
  198. package/src/evaluator-internals/override.ts +83 -0
  199. package/src/evaluator-internals/predicates.ts +1037 -0
  200. package/src/evaluator-internals/speculative-synthesis.test.ts +411 -0
  201. package/src/evaluator-internals/speculative-synthesis.ts +199 -0
  202. package/src/evaluator.test.ts +6296 -0
  203. package/src/evaluator.ts +1106 -0
  204. package/src/factory-time-load.test.ts +630 -0
  205. package/src/helpers/walker-unknown-cwd-reason.test.ts +73 -0
  206. package/src/helpers/walker-unknown-cwd-reason.ts +83 -0
  207. package/src/index.test.ts +836 -0
  208. package/src/index.ts +229 -0
  209. package/src/internal/drop-unused-observers.test.ts +141 -0
  210. package/src/internal/drop-unused-observers.ts +81 -0
  211. package/src/internal/finalize-plugin-state.ts +43 -0
  212. package/src/internal/merge-observers.ts +51 -0
  213. package/src/internal/pattern-utils.test.ts +52 -0
  214. package/src/internal/pattern-utils.ts +38 -0
  215. package/src/internal/ref-text.test.ts +54 -0
  216. package/src/internal/ref-text.ts +17 -0
  217. package/src/internal/session-runtime.test.ts +629 -0
  218. package/src/internal/session-runtime.ts +201 -0
  219. package/src/internal/watch-matcher.test.ts +326 -0
  220. package/src/internal/watch-matcher.ts +200 -0
  221. package/src/jsdoc-propagation.test.ts +277 -0
  222. package/src/loader.test.ts +1098 -0
  223. package/src/loader.ts +581 -0
  224. package/src/not-block-onunknown.test.ts +554 -0
  225. package/src/observer-dispatcher.test.ts +939 -0
  226. package/src/observer-dispatcher.ts +290 -0
  227. package/src/per-predicate-typing.test.ts +361 -0
  228. package/src/plugin-merger.test.ts +790 -0
  229. package/src/plugin-merger.ts +598 -0
  230. package/src/plugins/git/README.md +485 -0
  231. package/src/plugins/git/branch-tracker.test.ts +281 -0
  232. package/src/plugins/git/branch-tracker.ts +187 -0
  233. package/src/plugins/git/cwd-extensions.test.ts +230 -0
  234. package/src/plugins/git/cwd-extensions.ts +160 -0
  235. package/src/plugins/git/git-ops.test.ts +397 -0
  236. package/src/plugins/git/git-ops.ts +173 -0
  237. package/src/plugins/git/index.ts +253 -0
  238. package/src/plugins/git/integration.test.ts +705 -0
  239. package/src/plugins/git/predicates.test.ts +1401 -0
  240. package/src/plugins/git/predicates.ts +693 -0
  241. package/src/plugins/git/rules.test.ts +1001 -0
  242. package/src/plugins/git/rules.ts +307 -0
  243. package/src/schema.test.ts +259 -0
  244. package/src/schema.ts +1963 -0
  245. package/src/testing/index.test.ts +1696 -0
  246. package/src/testing/index.ts +1472 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,83 @@
1
+ # Rule-pack examples
2
+
3
+ Curated rule-pack examples for common workflows. Each subdirectory
4
+ ships both a TypeScript config (`steering.ts`) and a JSON config
5
+ (`steering.json`). Each has its own README with rationale.
6
+
7
+ | Example | What it enforces | Best for |
8
+ |---------|------------------|----------|
9
+ | [force-push-strict](./force-push-strict) | No force pushes of any kind (not even `--force-with-lease`) | Shared branches, strict-history teams |
10
+ | [no-amend](./no-amend) | No `git commit --amend`. Includes a cwd-scoped variant | Review-driven workflows where commit-SHA stability matters |
11
+ | [draft-prs-only](./draft-prs-only) | `gh pr create` requires `--draft` | Teams that require human review before marking ready |
12
+ | [combined-git-discipline](./combined-git-discipline) | All three above | Starting point for disciplined PR teams |
13
+ | [dynamic-reason-runtime-cwd](./dynamic-reason-runtime-cwd) | Composes a runtime-cwd predicate (`isClean`) with a two-branch `ReasonFn` using `walkerUnknownCwdReason` | Plugin authors writing rules over runtime-cwd predicates that need useful agent reasons on the walker-unknown branch |
14
+ | [work-item-plugin](./work-item-plugin) | Canonical example PLUGIN (not a rule-pack). See the plugin's own README. | Authors writing a new plugin |
15
+
16
+ Each rule-pack directory has smoke tests (`steering.test.ts`) that
17
+ verify the config compiles under the current `defineConfig` API and
18
+ exposes the expected shape. Behavioural coverage (every pattern,
19
+ every wrapper form) lives in the engine's own test suite.
20
+
21
+ ## How to use
22
+
23
+ ### TypeScript (canonical)
24
+
25
+ 1. **Copy** `steering.ts` from an example directory into one of:
26
+ - `~/.pi/steering.ts` (or `~/.pi/steering/index.ts`) — applies globally.
27
+ - `<your-project>/.pi/steering.ts` — applies to this project tree (walk-up loader).
28
+ 2. **Tweak** as needed — the exported default is a plain
29
+ [`SteeringConfig`](../src/schema.ts), so you can add rules,
30
+ merge with other packs by spreading, or import a plugin.
31
+ 3. **Verify** the rule is active by running `pi` in the target
32
+ directory; the rules load on `session_start`.
33
+
34
+ **Hover-rich authoring:** factor each rule out into a
35
+ `const myRule = { ... } as const satisfies Rule` binding before
36
+ passing it to `defineConfig`, as `dynamic-reason-runtime-cwd/steering.ts`
37
+ does. Inline rule literals inside `defineConfig({ rules: [{ ... }] })`
38
+ get their contextual type narrowed to the `const`-inferred shape and
39
+ bypass the homomorphic mapped-type linkage that surfaces source-
40
+ declared JSDoc on hover for plugin predicates (`when.isClean`, etc.).
41
+ The `as const` modifier on the binding preserves each rule's literal
42
+ `name` so `disabledRules` typo detection fires; the alternatives
43
+ (`: Rule` or bare `satisfies Rule`) restore hover but widen the
44
+ inferred type and collapse typo detection.
45
+
46
+ ### JSON
47
+
48
+ The loader does **not** load `.pi/steering.json` files directly — only
49
+ `.pi/steering.ts` / `.pi/steering/index.ts`. To migrate an existing
50
+ JSON config:
51
+
52
+ 1. Convert with the CLI: `pi-steering import-json .pi/steering.json -o .pi/steering/index.ts`
53
+ 2. Or programmatically: `fromJSON(JSON.parse(text))` from
54
+ [`compat.ts`](../src/compat.ts), if you're wrapping the conversion
55
+ in your own tooling.
56
+
57
+ Each example ships a `steering.json` for reference / migration
58
+ testing — they're authored against the v0 PoC shape so
59
+ `pi-steering import-json` round-trips them cleanly. They do **not**
60
+ participate in the loader's `.pi/` walk-up; only the `.ts` form does.
61
+
62
+ JSON is a deliberate **subset** of the TypeScript schema: pattern-string
63
+ rules, `requires` / `unless`, `when.cwd` (string pattern only), and
64
+ override flags. Plugins, observers, function-valued rule fields,
65
+ plugin-registered predicate keys (`when.<customKey>`), `when.not`,
66
+ and `when.condition` are TypeScript-only — `pi-steering import-json`
67
+ rejects them with `FromJSONError`. Equivalently: any `when` clause
68
+ member other than `when.cwd` is rejected.
69
+
70
+ If you're not ready to migrate, the v0 runtime had its own loader that
71
+ did load JSON; staying on v0 is an option until you convert.
72
+
73
+ ## Verifying a rule works
74
+
75
+ The quickest smoke-check: run the example's blocked command inside a
76
+ pi session and confirm the agent surfaces the `[steering:<rule-name>@<source>] …` block message. Each example directory's
77
+ `steering.test.ts` pins the config's structural contract; the engine's
78
+ own test suite exercises the rules against realistic inputs.
79
+
80
+ See the [package README](../README.md) for the schema details
81
+ (`pattern`, `requires`, `unless`, `when.cwd`, `reason`,
82
+ `noOverride`) and the [repo README](../../../README.md) for the
83
+ overall architecture.
@@ -0,0 +1,52 @@
1
+ # combined-git-discipline
2
+
3
+ A batteries-included rule pack that stacks the three individual PR/git-hygiene examples plus the upstream safety defaults. Drop-in starting point for teams that want disciplined PR workflows.
4
+
5
+ > **TypeScript form (canonical):** see [`steering.ts`](./steering.ts) — drop in at `~/.pi/steering.ts` or `<project-root>/.pi/steering.ts`. The loader accepts TypeScript only. The [`steering.json`](./steering.json) form is provided for reference + `pi-steering import-json` migration; the loader does NOT pick up JSON files. See [examples/README.md#json](../README.md#json) for migration steps.
6
+
7
+ ## What it enforces
8
+
9
+ From this pack (overrides the default force-push rule):
10
+
11
+ | Rule | What it blocks |
12
+ |---|---|
13
+ | `no-force-push-strict` | All `git push --force`, including `--force-with-lease`. See [`../force-push-strict`](../force-push-strict). |
14
+ | `no-amend` | `git commit --amend` — preserves review-diff continuity. See [`../no-amend`](../no-amend). |
15
+ | `pr-create-must-be-draft` | `gh pr create` without `--draft`. See [`../draft-prs-only`](../draft-prs-only). |
16
+
17
+ From the engine's built-in defaults (retained — not disabled here):
18
+
19
+ | Rule | What it blocks |
20
+ |---|---|
21
+ | `no-hard-reset` | `git reset --hard` — prevents silent loss of uncommitted work. |
22
+ | `no-rm-rf-slash` | `rm -rf /` with any flag combination or wrapper. `noOverride: true`. |
23
+ | `no-long-running-commands` | `npm run dev`, `tsc --watch`, `next dev`, etc. — stop the agent from blocking itself on a watcher. |
24
+
25
+ ## Precedence: how `disable` interacts with a new rule
26
+
27
+ The default `no-force-push` rule permits `--force-with-lease`. This pack:
28
+
29
+ 1. Turns the default off via `"disable": ["no-force-push"]`.
30
+ 2. Adds the stricter `no-force-push-strict` rule in its place.
31
+
32
+ The loader applies `disable[]` as a union across all config layers and looks up rules by `name`, so the order in which files are loaded doesn't matter — the default disappears and the strict version takes over.
33
+
34
+ ## Why these together
35
+
36
+ Each rule on its own is reasonable. Stacking them encodes a specific team discipline:
37
+
38
+ - History is append-only (`no-force-push-strict`, `no-amend`, `no-hard-reset`).
39
+ - Code review is gated by the human (`pr-create-must-be-draft`).
40
+ - The agent can't shoot everyone in the foot or wedge itself on a dev server (`no-rm-rf-slash`, `no-long-running-commands`).
41
+
42
+ Use this as a starting point and carve out exceptions with inline override comments (`# steering-override: <rule-name> — <reason>`) for the edge cases that genuinely need them.
43
+
44
+ ## When to use
45
+
46
+ - Teams that want a disciplined PR workflow without per-agent coaching
47
+ - Shared repositories where agent autonomy is useful but history integrity matters
48
+ - Starting point for building your own house rules — copy this file, tune the reasons, add more rules
49
+
50
+ ## Install
51
+
52
+ Copy [`steering.ts`](./steering.ts) to `~/.pi/steering.ts` (global) or to `<project-root>/.pi/steering.ts` (scoped via walk-up loader). For tighter scoping, add `when.cwd` to individual rules — see [`../no-amend`](../no-amend) for an example. The loader accepts TypeScript only; see [examples/README.md#json](../README.md#json) if you're migrating from a `steering.json`.
@@ -0,0 +1,43 @@
1
+ #!/bin/sh
2
+ basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
3
+ basedir_win="$basedir"
4
+ exe=""
5
+ msys=""
6
+
7
+ case `uname -a` in
8
+ *CYGWIN*|*MINGW*|*MSYS*)
9
+ if command -v cygpath > /dev/null 2>&1; then
10
+ basedir_win=`cygpath -w "$basedir"`
11
+ fi
12
+ exe=".exe"
13
+ msys="true"
14
+ ;;
15
+ *WSL2*)
16
+ if command -v wslpath > /dev/null 2>&1; then
17
+ basedir_win="$(wslpath -w "$basedir" 2> /dev/null)"
18
+ if [ $? -ne 0 ] || [ -z "$basedir_win" ]; then
19
+ basedir_win="$basedir"
20
+ else
21
+ exe=".exe"
22
+ fi
23
+ fi
24
+ ;;
25
+ esac
26
+
27
+ if [ -z "$NODE_PATH" ]; then
28
+ export NODE_PATH="/home/pier/open-source/github/pi-steering/node_modules/.pnpm/node_modules"
29
+ else
30
+ export NODE_PATH="/home/pier/open-source/github/pi-steering/node_modules/.pnpm/node_modules:$NODE_PATH"
31
+ fi
32
+ if [ -n "$exe" ] && [ -x "$basedir/node.exe" ]; then
33
+ exec "$basedir/node.exe" "$basedir_win/../@cad0p/pi-steering/dist/bin/pi-steering.js" "$@"
34
+ elif [ -x "$basedir/node" ]; then
35
+ exec "$basedir/node" "$basedir/../@cad0p/pi-steering/dist/bin/pi-steering.js" "$@"
36
+ elif command -v node >/dev/null 2>&1; then
37
+ exec node "$basedir/../@cad0p/pi-steering/dist/bin/pi-steering.js" "$@"
38
+ elif [ -n "$exe" ] && command -v node.exe >/dev/null 2>&1; then
39
+ exec node.exe "$basedir_win/../@cad0p/pi-steering/dist/bin/pi-steering.js" "$@"
40
+ else
41
+ exec node "$basedir/../@cad0p/pi-steering/dist/bin/pi-steering.js" "$@"
42
+ fi
43
+ # cmd-shim-target=/home/pier/open-source/github/pi-steering/examples/combined-git-discipline/node_modules/@cad0p/pi-steering/dist/bin/pi-steering.js
@@ -0,0 +1,18 @@
1
+ {
2
+ "name": "@examples/combined-git-discipline",
3
+ "version": "0.0.0-example",
4
+ "private": true,
5
+ "description": "Rule pack: strict force-push + no-amend + draft-PR combo.",
6
+ "type": "module",
7
+ "peerDependencies": {
8
+ "@cad0p/pi-steering": "workspace:*"
9
+ },
10
+ "devDependencies": {
11
+ "@cad0p/pi-steering": "workspace:*"
12
+ },
13
+ "scripts": {
14
+ "pretest": "pnpm --filter @cad0p/pi-steering run clean && pnpm --filter @cad0p/pi-steering run build",
15
+ "test": "node --test --experimental-strip-types 'steering.test.ts'",
16
+ "typecheck": "tsc --noEmit"
17
+ }
18
+ }
@@ -0,0 +1,27 @@
1
+ {
2
+ "disable": ["no-force-push"],
3
+ "rules": [
4
+ {
5
+ "name": "no-force-push-strict",
6
+ "tool": "bash",
7
+ "field": "command",
8
+ "pattern": "^git\\b(?:\\s+-{1,2}[A-Za-z]\\S*(?:\\s+\\S+)?)*\\s+push\\b.*(?:--force\\b|\\s-f(?:\\s|$))",
9
+ "reason": "No force pushes of any kind, including --force-with-lease."
10
+ },
11
+ {
12
+ "name": "no-amend",
13
+ "tool": "bash",
14
+ "field": "command",
15
+ "pattern": "^git\\b(?:\\s+-{1,2}[A-Za-z]\\S*(?:\\s+\\S+)?)*\\s+commit\\b.*--amend\\b",
16
+ "reason": "Don't rewrite history with --amend. Create a new commit instead."
17
+ },
18
+ {
19
+ "name": "pr-create-must-be-draft",
20
+ "tool": "bash",
21
+ "field": "command",
22
+ "pattern": "^gh\\s+pr\\s+create\\b",
23
+ "unless": "--draft\\b",
24
+ "reason": "PRs must be created as drafts. Mark ready for review only after human approval."
25
+ }
26
+ ]
27
+ }
@@ -0,0 +1,42 @@
1
+ // SPDX-License-Identifier: MIT
2
+ // Part of pi-steering / examples.
3
+
4
+ /**
5
+ * Smoke test for the combined-git-discipline rule pack.
6
+ *
7
+ * Scope: README drift guard. See `force-push-strict/steering.test.ts`
8
+ * for the rationale.
9
+ */
10
+
11
+ import assert from "node:assert/strict";
12
+ import { describe, it } from "node:test";
13
+ import config from "./steering.ts";
14
+
15
+ describe("example: combined-git-discipline", () => {
16
+ it("exports a SteeringConfig with the three expected rules", () => {
17
+ assert.ok(config.rules !== undefined);
18
+ const names = config.rules.map((r) => r.name).sort();
19
+ assert.deepEqual(
20
+ names,
21
+ ["no-amend", "no-force-push-strict", "pr-create-must-be-draft"],
22
+ `unexpected rule set: ${names.join(", ")}`,
23
+ );
24
+ });
25
+
26
+ it("disables the shipped `no-force-push` default", () => {
27
+ assert.ok(
28
+ config.disabledRules?.includes("no-force-push"),
29
+ "expected disabledRules to include 'no-force-push'",
30
+ );
31
+ });
32
+
33
+ it("every rule has tool=bash and a non-empty reason", () => {
34
+ for (const rule of config.rules ?? []) {
35
+ assert.equal(rule.tool, "bash", `rule ${rule.name} should be bash`);
36
+ assert.ok(
37
+ typeof rule.reason === "string" && rule.reason.length > 0,
38
+ `rule ${rule.name} should have a non-empty reason`,
39
+ );
40
+ }
41
+ });
42
+ });
@@ -0,0 +1,64 @@
1
+ // SPDX-License-Identifier: MIT
2
+ // Part of pi-steering / examples.
3
+
4
+ /**
5
+ * Example: combined-git-discipline rule pack.
6
+ *
7
+ * Equivalent to `steering.json` in this directory but expressed in the
8
+ * canonical TypeScript form. Drop this file in at
9
+ * `.pi/steering.ts` (or `.pi/steering/index.ts`) to activate.
10
+ *
11
+ * Combines the strict variants of three common guardrails:
12
+ *
13
+ * 1. `no-force-push-strict` - no force push of any kind (blocks
14
+ * `--force-with-lease` too; the shipped default allows it).
15
+ * 2. `no-amend` - no `git commit --amend` (rewrites history).
16
+ * 3. `pr-create-must-be-draft` - `gh pr create` must include
17
+ * `--draft`.
18
+ *
19
+ * Use this as a starting point for teams that want "disciplined PR
20
+ * flow" out of the box. Tweak individual patterns downstream.
21
+ *
22
+ * Scope note: disables the shipped `DEFAULT_RULES.no-force-push` so
23
+ * its less-strict reason message ("--force-with-lease is fine")
24
+ * doesn't leak alongside the strict variant. The other default rules
25
+ * (no-hard-reset, no-rm-rf-slash, no-long-running-commands) and the
26
+ * git plugin (no-main-commit + branch predicate) stay active — the
27
+ * plugin is opt-in, so it is declared explicitly below.
28
+ */
29
+
30
+ import { defineConfig } from "@cad0p/pi-steering";
31
+ import gitPlugin from "@cad0p/pi-steering/plugins/git";
32
+
33
+ export default defineConfig({
34
+ plugins: [gitPlugin],
35
+ disabledRules: ["no-force-push"],
36
+ rules: [
37
+ {
38
+ name: "no-force-push-strict",
39
+ tool: "bash",
40
+ field: "command",
41
+ pattern:
42
+ "^git\\b(?:\\s+-{1,2}[A-Za-z]\\S*(?:\\s+\\S+)?)*\\s+push\\b.*(?:--force\\b|\\s-f(?:\\s|$))",
43
+ reason: "No force pushes of any kind, including --force-with-lease.",
44
+ },
45
+ {
46
+ name: "no-amend",
47
+ tool: "bash",
48
+ field: "command",
49
+ pattern:
50
+ "^git\\b(?:\\s+-{1,2}[A-Za-z]\\S*(?:\\s+\\S+)?)*\\s+commit\\b.*--amend\\b",
51
+ reason:
52
+ "Don't rewrite history with --amend. Create a new commit instead.",
53
+ },
54
+ {
55
+ name: "pr-create-must-be-draft",
56
+ tool: "bash",
57
+ field: "command",
58
+ pattern: "^gh\\s+pr\\s+create\\b",
59
+ unless: "--draft\\b",
60
+ reason:
61
+ "PRs must be created as drafts. Mark ready for review only after human approval.",
62
+ },
63
+ ],
64
+ });
@@ -0,0 +1,7 @@
1
+ {
2
+ "extends": "../../tsconfig.base.json",
3
+ "compilerOptions": {
4
+ "noEmit": true
5
+ },
6
+ "include": ["steering.ts", "steering.test.ts"]
7
+ }
@@ -0,0 +1,42 @@
1
+ # draft-prs-only
2
+
3
+ A rule pack that forces `gh pr create` to include `--draft`.
4
+
5
+ > **TypeScript form (canonical):** see [`steering.ts`](./steering.ts) — drop in at `~/.pi/steering.ts` or `<project-root>/.pi/steering.ts`. The loader accepts TypeScript only. The [`steering.json`](./steering.json) form is provided for reference + `pi-steering import-json` migration; the loader does NOT pick up JSON files. See [examples/README.md#json](../README.md#json) for migration steps.
6
+
7
+ ## What it enforces
8
+
9
+ - `gh pr create --title "..."` → **blocked**
10
+ - `gh pr create --draft --title "..."` → allowed (happy path)
11
+ - `gh pr ready 42` → allowed (flipping from draft to ready is fine)
12
+ - `gh pr list`, `gh pr view`, everything else → allowed
13
+
14
+ ## How it works
15
+
16
+ The rule uses two of the schema's predicates in combination:
17
+
18
+ - `pattern: "^gh\\s+pr\\s+create\\b"` — fires on any `gh pr create` invocation.
19
+ - `unless: "--draft\\b"` — exempts the command if `--draft` is present anywhere in the argument list.
20
+
21
+ `unless` is the escape hatch baked into the schema precisely for "mostly block, but allow the safe variant" rules like this one. No need to write two patterns.
22
+
23
+ ## Why
24
+
25
+ This rule encodes a simple workflow discipline: *the agent proposes, the human disposes.*
26
+
27
+ 1. Agent produces the diff and opens the PR as a **draft**.
28
+ 2. Human reviews the diff (and optionally the agent's reasoning).
29
+ 3. Once satisfied, the human marks it ready with `gh pr ready <n>`.
30
+ 4. Merge proceeds through whatever normal review/CI path the repo has.
31
+
32
+ Blocking `gh pr create` without `--draft` prevents the failure mode where an agent publishes a review-ready PR before anyone has looked at it. The rule doesn't block `gh pr ready` because marking an already-reviewed PR ready is a normal, intended human step.
33
+
34
+ ## When to use
35
+
36
+ - Teams that require human-in-the-loop approval before a PR goes live
37
+ - Repos with reviewer rotation / auto-assignment that shouldn't be triggered by half-finished AI work
38
+ - Any workflow where "PR exists but is not ready" is a meaningful state
39
+
40
+ ## Install
41
+
42
+ Copy [`steering.ts`](./steering.ts) to `~/.pi/steering.ts` (global) or `<project-root>/.pi/steering.ts` (project-scoped). The loader accepts TypeScript only; see [examples/README.md#json](../README.md#json) if you're migrating from a `steering.json`.
@@ -0,0 +1,43 @@
1
+ #!/bin/sh
2
+ basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
3
+ basedir_win="$basedir"
4
+ exe=""
5
+ msys=""
6
+
7
+ case `uname -a` in
8
+ *CYGWIN*|*MINGW*|*MSYS*)
9
+ if command -v cygpath > /dev/null 2>&1; then
10
+ basedir_win=`cygpath -w "$basedir"`
11
+ fi
12
+ exe=".exe"
13
+ msys="true"
14
+ ;;
15
+ *WSL2*)
16
+ if command -v wslpath > /dev/null 2>&1; then
17
+ basedir_win="$(wslpath -w "$basedir" 2> /dev/null)"
18
+ if [ $? -ne 0 ] || [ -z "$basedir_win" ]; then
19
+ basedir_win="$basedir"
20
+ else
21
+ exe=".exe"
22
+ fi
23
+ fi
24
+ ;;
25
+ esac
26
+
27
+ if [ -z "$NODE_PATH" ]; then
28
+ export NODE_PATH="/home/pier/open-source/github/pi-steering/node_modules/.pnpm/node_modules"
29
+ else
30
+ export NODE_PATH="/home/pier/open-source/github/pi-steering/node_modules/.pnpm/node_modules:$NODE_PATH"
31
+ fi
32
+ if [ -n "$exe" ] && [ -x "$basedir/node.exe" ]; then
33
+ exec "$basedir/node.exe" "$basedir_win/../@cad0p/pi-steering/dist/bin/pi-steering.js" "$@"
34
+ elif [ -x "$basedir/node" ]; then
35
+ exec "$basedir/node" "$basedir/../@cad0p/pi-steering/dist/bin/pi-steering.js" "$@"
36
+ elif command -v node >/dev/null 2>&1; then
37
+ exec node "$basedir/../@cad0p/pi-steering/dist/bin/pi-steering.js" "$@"
38
+ elif [ -n "$exe" ] && command -v node.exe >/dev/null 2>&1; then
39
+ exec node.exe "$basedir_win/../@cad0p/pi-steering/dist/bin/pi-steering.js" "$@"
40
+ else
41
+ exec node "$basedir/../@cad0p/pi-steering/dist/bin/pi-steering.js" "$@"
42
+ fi
43
+ # cmd-shim-target=/home/pier/open-source/github/pi-steering/examples/draft-prs-only/node_modules/@cad0p/pi-steering/dist/bin/pi-steering.js
@@ -0,0 +1,18 @@
1
+ {
2
+ "name": "@examples/draft-prs-only",
3
+ "version": "0.0.0-example",
4
+ "private": true,
5
+ "description": "Rule pack: gh pr create must be --draft.",
6
+ "type": "module",
7
+ "peerDependencies": {
8
+ "@cad0p/pi-steering": "workspace:*"
9
+ },
10
+ "devDependencies": {
11
+ "@cad0p/pi-steering": "workspace:*"
12
+ },
13
+ "scripts": {
14
+ "pretest": "pnpm --filter @cad0p/pi-steering run clean && pnpm --filter @cad0p/pi-steering run build",
15
+ "test": "node --test --experimental-strip-types 'steering.test.ts'",
16
+ "typecheck": "tsc --noEmit"
17
+ }
18
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "rules": [
3
+ {
4
+ "name": "pr-create-must-be-draft",
5
+ "tool": "bash",
6
+ "field": "command",
7
+ "pattern": "^gh\\s+pr\\s+create\\b",
8
+ "unless": "--draft\\b",
9
+ "reason": "PRs must be created as drafts. Mark the PR ready for review only after a human has reviewed the diff. Use `gh pr ready <number>` to flip from draft to ready."
10
+ }
11
+ ]
12
+ }
@@ -0,0 +1,48 @@
1
+ // SPDX-License-Identifier: MIT
2
+ // Part of pi-steering / examples.
3
+
4
+ /**
5
+ * Smoke test for the draft-prs-only rule pack.
6
+ *
7
+ * Scope: README drift guard. See `force-push-strict/steering.test.ts`
8
+ * for the rationale.
9
+ */
10
+
11
+ import assert from "node:assert/strict";
12
+ import { describe, it } from "node:test";
13
+ import config from "./steering.ts";
14
+
15
+ describe("example: draft-prs-only", () => {
16
+ it("exports a SteeringConfig with at least one rule", () => {
17
+ assert.ok(config.rules !== undefined);
18
+ assert.ok(config.rules.length >= 1);
19
+ });
20
+
21
+ it("registers pr-create-must-be-draft", () => {
22
+ const names = config.rules!.map((r) => r.name);
23
+ assert.ok(
24
+ names.includes("pr-create-must-be-draft"),
25
+ `expected pr-create-must-be-draft in rules, got: ${names.join(", ")}`,
26
+ );
27
+ });
28
+
29
+ it("rule declares an `unless` escape hatch for --draft", () => {
30
+ const rule = config.rules!.find(
31
+ (r) => r.name === "pr-create-must-be-draft",
32
+ );
33
+ assert.ok(rule);
34
+ // Structural check: rule.unless must be declared (as a string
35
+ // pattern or RegExp). Its specific contents are pinned by the
36
+ // engine's own test suite.
37
+ assert.ok(
38
+ "unless" in rule && rule.unless !== undefined,
39
+ "rule must declare an `unless` pattern",
40
+ );
41
+ });
42
+
43
+ it("does not disable any default rules (additive)", () => {
44
+ assert.ok(
45
+ config.disabledRules === undefined || config.disabledRules.length === 0,
46
+ );
47
+ });
48
+ });
@@ -0,0 +1,36 @@
1
+ // SPDX-License-Identifier: MIT
2
+ // Part of pi-steering / examples.
3
+
4
+ /**
5
+ * Example: draft-prs-only rule pack.
6
+ *
7
+ * Equivalent to `steering.json` in this directory but expressed in the
8
+ * v0.1.0 canonical TypeScript form. Drop this file in at
9
+ * `.pi/steering.ts` (or `.pi/steering/index.ts`) to activate.
10
+ *
11
+ * What it enforces: `gh pr create` must include `--draft`. Useful on
12
+ * teams that require a human review step before flipping a PR from
13
+ * draft to ready.
14
+ *
15
+ * Scope note: does NOT conflict with any shipped `DEFAULT_RULES`.
16
+ * The rule is additive.
17
+ */
18
+
19
+ import { defineConfig } from "@cad0p/pi-steering";
20
+
21
+ export default defineConfig({
22
+ rules: [
23
+ {
24
+ name: "pr-create-must-be-draft",
25
+ tool: "bash",
26
+ field: "command",
27
+ pattern: "^gh\\s+pr\\s+create\\b",
28
+ // `unless` short-circuits the rule: if the command ALSO
29
+ // matches the unless pattern, the rule does NOT fire. Here it
30
+ // means "block gh pr create UNLESS --draft is also present".
31
+ unless: "--draft\\b",
32
+ reason:
33
+ "PRs must be created as drafts. Mark the PR ready for review only after a human has reviewed the diff. Use `gh pr ready <number>` to flip from draft to ready.",
34
+ },
35
+ ],
36
+ });
@@ -0,0 +1,7 @@
1
+ {
2
+ "extends": "../../tsconfig.base.json",
3
+ "compilerOptions": {
4
+ "noEmit": true
5
+ },
6
+ "include": ["steering.ts", "steering.test.ts"]
7
+ }