@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.
- package/CHANGELOG.md +36 -0
- package/LICENSE +29 -0
- package/README.md +920 -0
- package/dist/__test-helpers__.d.ts +95 -0
- package/dist/__test-helpers__.d.ts.map +1 -0
- package/dist/__test-helpers__.js +174 -0
- package/dist/__test-helpers__.js.map +1 -0
- package/dist/bin/pi-steering.d.ts +9 -0
- package/dist/bin/pi-steering.d.ts.map +1 -0
- package/dist/bin/pi-steering.js +506 -0
- package/dist/bin/pi-steering.js.map +1 -0
- package/dist/compat.d.ts +50 -0
- package/dist/compat.d.ts.map +1 -0
- package/dist/compat.js +180 -0
- package/dist/compat.js.map +1 -0
- package/dist/defaults.d.ts +61 -0
- package/dist/defaults.d.ts.map +1 -0
- package/dist/defaults.js +106 -0
- package/dist/defaults.js.map +1 -0
- package/dist/define-config.d.ts +235 -0
- package/dist/define-config.d.ts.map +1 -0
- package/dist/define-config.js +118 -0
- package/dist/define-config.js.map +1 -0
- package/dist/define-predicate.d.ts +49 -0
- package/dist/define-predicate.d.ts.map +1 -0
- package/dist/define-predicate.js +35 -0
- package/dist/define-predicate.js.map +1 -0
- package/dist/evaluator-internals/context.d.ts +186 -0
- package/dist/evaluator-internals/context.d.ts.map +1 -0
- package/dist/evaluator-internals/context.js +219 -0
- package/dist/evaluator-internals/context.js.map +1 -0
- package/dist/evaluator-internals/override.d.ts +19 -0
- package/dist/evaluator-internals/override.d.ts.map +1 -0
- package/dist/evaluator-internals/override.js +79 -0
- package/dist/evaluator-internals/override.js.map +1 -0
- package/dist/evaluator-internals/predicates.d.ts +152 -0
- package/dist/evaluator-internals/predicates.d.ts.map +1 -0
- package/dist/evaluator-internals/predicates.js +849 -0
- package/dist/evaluator-internals/predicates.js.map +1 -0
- package/dist/evaluator-internals/speculative-synthesis.d.ts +102 -0
- package/dist/evaluator-internals/speculative-synthesis.d.ts.map +1 -0
- package/dist/evaluator-internals/speculative-synthesis.js +101 -0
- package/dist/evaluator-internals/speculative-synthesis.js.map +1 -0
- package/dist/evaluator.d.ts +101 -0
- package/dist/evaluator.d.ts.map +1 -0
- package/dist/evaluator.js +714 -0
- package/dist/evaluator.js.map +1 -0
- package/dist/helpers/walker-unknown-cwd-reason.d.ts +68 -0
- package/dist/helpers/walker-unknown-cwd-reason.d.ts.map +1 -0
- package/dist/helpers/walker-unknown-cwd-reason.js +73 -0
- package/dist/helpers/walker-unknown-cwd-reason.js.map +1 -0
- package/dist/index.d.ts +42 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +93 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/drop-unused-observers.d.ts +43 -0
- package/dist/internal/drop-unused-observers.d.ts.map +1 -0
- package/dist/internal/drop-unused-observers.js +50 -0
- package/dist/internal/drop-unused-observers.js.map +1 -0
- package/dist/internal/finalize-plugin-state.d.ts +22 -0
- package/dist/internal/finalize-plugin-state.d.ts.map +1 -0
- package/dist/internal/finalize-plugin-state.js +14 -0
- package/dist/internal/finalize-plugin-state.js.map +1 -0
- package/dist/internal/merge-observers.d.ts +30 -0
- package/dist/internal/merge-observers.d.ts.map +1 -0
- package/dist/internal/merge-observers.js +27 -0
- package/dist/internal/merge-observers.js.map +1 -0
- package/dist/internal/pattern-utils.d.ts +33 -0
- package/dist/internal/pattern-utils.d.ts.map +1 -0
- package/dist/internal/pattern-utils.js +20 -0
- package/dist/internal/pattern-utils.js.map +1 -0
- package/dist/internal/ref-text.d.ts +11 -0
- package/dist/internal/ref-text.d.ts.map +1 -0
- package/dist/internal/ref-text.js +15 -0
- package/dist/internal/ref-text.js.map +1 -0
- package/dist/internal/session-runtime.d.ts +44 -0
- package/dist/internal/session-runtime.d.ts.map +1 -0
- package/dist/internal/session-runtime.js +143 -0
- package/dist/internal/session-runtime.js.map +1 -0
- package/dist/internal/watch-matcher.d.ts +56 -0
- package/dist/internal/watch-matcher.d.ts.map +1 -0
- package/dist/internal/watch-matcher.js +179 -0
- package/dist/internal/watch-matcher.js.map +1 -0
- package/dist/loader.d.ts +97 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +527 -0
- package/dist/loader.js.map +1 -0
- package/dist/observer-dispatcher.d.ts +69 -0
- package/dist/observer-dispatcher.d.ts.map +1 -0
- package/dist/observer-dispatcher.js +184 -0
- package/dist/observer-dispatcher.js.map +1 -0
- package/dist/plugin-merger.d.ts +175 -0
- package/dist/plugin-merger.d.ts.map +1 -0
- package/dist/plugin-merger.js +450 -0
- package/dist/plugin-merger.js.map +1 -0
- package/dist/plugins/git/branch-tracker.d.ts +85 -0
- package/dist/plugins/git/branch-tracker.d.ts.map +1 -0
- package/dist/plugins/git/branch-tracker.js +181 -0
- package/dist/plugins/git/branch-tracker.js.map +1 -0
- package/dist/plugins/git/cwd-extensions.d.ts +10 -0
- package/dist/plugins/git/cwd-extensions.d.ts.map +1 -0
- package/dist/plugins/git/cwd-extensions.js +155 -0
- package/dist/plugins/git/cwd-extensions.js.map +1 -0
- package/dist/plugins/git/git-ops.d.ts +89 -0
- package/dist/plugins/git/git-ops.d.ts.map +1 -0
- package/dist/plugins/git/git-ops.js +107 -0
- package/dist/plugins/git/git-ops.js.map +1 -0
- package/dist/plugins/git/index.d.ts +225 -0
- package/dist/plugins/git/index.d.ts.map +1 -0
- package/dist/plugins/git/index.js +52 -0
- package/dist/plugins/git/index.js.map +1 -0
- package/dist/plugins/git/predicates.d.ts +312 -0
- package/dist/plugins/git/predicates.d.ts.map +1 -0
- package/dist/plugins/git/predicates.js +580 -0
- package/dist/plugins/git/predicates.js.map +1 -0
- package/dist/plugins/git/rules.d.ts +209 -0
- package/dist/plugins/git/rules.d.ts.map +1 -0
- package/dist/plugins/git/rules.js +267 -0
- package/dist/plugins/git/rules.js.map +1 -0
- package/dist/schema.d.ts +1799 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +4 -0
- package/dist/schema.js.map +1 -0
- package/dist/testing/index.d.ts +621 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +747 -0
- package/dist/testing/index.js.map +1 -0
- package/examples/README.md +83 -0
- package/examples/combined-git-discipline/README.md +52 -0
- package/examples/combined-git-discipline/node_modules/.bin/pi-steering +43 -0
- package/examples/combined-git-discipline/package.json +18 -0
- package/examples/combined-git-discipline/steering.json +27 -0
- package/examples/combined-git-discipline/steering.test.ts +42 -0
- package/examples/combined-git-discipline/steering.ts +64 -0
- package/examples/combined-git-discipline/tsconfig.json +7 -0
- package/examples/draft-prs-only/README.md +42 -0
- package/examples/draft-prs-only/node_modules/.bin/pi-steering +43 -0
- package/examples/draft-prs-only/package.json +18 -0
- package/examples/draft-prs-only/steering.json +12 -0
- package/examples/draft-prs-only/steering.test.ts +48 -0
- package/examples/draft-prs-only/steering.ts +36 -0
- package/examples/draft-prs-only/tsconfig.json +7 -0
- package/examples/dynamic-reason-runtime-cwd/README.md +148 -0
- package/examples/dynamic-reason-runtime-cwd/node_modules/.bin/pi-steering +43 -0
- package/examples/dynamic-reason-runtime-cwd/package.json +18 -0
- package/examples/dynamic-reason-runtime-cwd/steering.test.ts +130 -0
- package/examples/dynamic-reason-runtime-cwd/steering.ts +82 -0
- package/examples/dynamic-reason-runtime-cwd/tsconfig.json +7 -0
- package/examples/force-push-strict/README.md +75 -0
- package/examples/force-push-strict/node_modules/.bin/pi-steering +43 -0
- package/examples/force-push-strict/package.json +18 -0
- package/examples/force-push-strict/steering.json +12 -0
- package/examples/force-push-strict/steering.test.ts +51 -0
- package/examples/force-push-strict/steering.ts +54 -0
- package/examples/force-push-strict/tsconfig.json +7 -0
- package/examples/no-amend/README.md +52 -0
- package/examples/no-amend/node_modules/.bin/pi-steering +43 -0
- package/examples/no-amend/package.json +18 -0
- package/examples/no-amend/steering.cwd-scoped.json +12 -0
- package/examples/no-amend/steering.json +11 -0
- package/examples/no-amend/steering.test.ts +49 -0
- package/examples/no-amend/steering.ts +38 -0
- package/examples/no-amend/tsconfig.json +7 -0
- package/examples/work-item-plugin/README.md +103 -0
- package/examples/work-item-plugin/node_modules/.bin/pi-steering +43 -0
- package/examples/work-item-plugin/package.json +19 -0
- package/examples/work-item-plugin/src/index.test.ts +168 -0
- package/examples/work-item-plugin/src/index.ts +122 -0
- package/examples/work-item-plugin/src/observers/npm-test-tracker.test.ts +95 -0
- package/examples/work-item-plugin/src/observers/npm-test-tracker.ts +88 -0
- package/examples/work-item-plugin/src/observers/retest-required-tracker.test.ts +81 -0
- package/examples/work-item-plugin/src/observers/retest-required-tracker.ts +81 -0
- package/examples/work-item-plugin/src/predicates/work-item-format.test.ts +157 -0
- package/examples/work-item-plugin/src/predicates/work-item-format.ts +99 -0
- package/examples/work-item-plugin/src/rules/commit-description-check.test.ts +107 -0
- package/examples/work-item-plugin/src/rules/commit-description-check.ts +83 -0
- package/examples/work-item-plugin/src/rules/commit-requires-work-item.test.ts +79 -0
- package/examples/work-item-plugin/src/rules/commit-requires-work-item.ts +56 -0
- package/examples/work-item-plugin/src/rules/push-requires-tests.test.ts +245 -0
- package/examples/work-item-plugin/src/rules/push-requires-tests.ts +62 -0
- package/examples/work-item-plugin/tsconfig.json +8 -0
- package/package.json +88 -0
- package/skills/steering-authoring/SKILL.md +102 -0
- package/src/INVARIANTS.md +116 -0
- package/src/__test-helpers__.ts +243 -0
- package/src/bin/pi-steering.test.ts +920 -0
- package/src/bin/pi-steering.ts +584 -0
- package/src/compat.test.ts +431 -0
- package/src/compat.ts +282 -0
- package/src/defaults.test.ts +585 -0
- package/src/defaults.ts +148 -0
- package/src/define-config.test.ts +888 -0
- package/src/define-config.ts +375 -0
- package/src/define-predicate.test.ts +70 -0
- package/src/define-predicate.ts +57 -0
- package/src/evaluator-internals/context.ts +290 -0
- package/src/evaluator-internals/override.test.ts +99 -0
- package/src/evaluator-internals/override.ts +83 -0
- package/src/evaluator-internals/predicates.ts +1037 -0
- package/src/evaluator-internals/speculative-synthesis.test.ts +411 -0
- package/src/evaluator-internals/speculative-synthesis.ts +199 -0
- package/src/evaluator.test.ts +6296 -0
- package/src/evaluator.ts +1106 -0
- package/src/factory-time-load.test.ts +630 -0
- package/src/helpers/walker-unknown-cwd-reason.test.ts +73 -0
- package/src/helpers/walker-unknown-cwd-reason.ts +83 -0
- package/src/index.test.ts +836 -0
- package/src/index.ts +229 -0
- package/src/internal/drop-unused-observers.test.ts +141 -0
- package/src/internal/drop-unused-observers.ts +81 -0
- package/src/internal/finalize-plugin-state.ts +43 -0
- package/src/internal/merge-observers.ts +51 -0
- package/src/internal/pattern-utils.test.ts +52 -0
- package/src/internal/pattern-utils.ts +38 -0
- package/src/internal/ref-text.test.ts +54 -0
- package/src/internal/ref-text.ts +17 -0
- package/src/internal/session-runtime.test.ts +629 -0
- package/src/internal/session-runtime.ts +201 -0
- package/src/internal/watch-matcher.test.ts +326 -0
- package/src/internal/watch-matcher.ts +200 -0
- package/src/jsdoc-propagation.test.ts +277 -0
- package/src/loader.test.ts +1098 -0
- package/src/loader.ts +581 -0
- package/src/not-block-onunknown.test.ts +554 -0
- package/src/observer-dispatcher.test.ts +939 -0
- package/src/observer-dispatcher.ts +290 -0
- package/src/per-predicate-typing.test.ts +361 -0
- package/src/plugin-merger.test.ts +790 -0
- package/src/plugin-merger.ts +598 -0
- package/src/plugins/git/README.md +485 -0
- package/src/plugins/git/branch-tracker.test.ts +281 -0
- package/src/plugins/git/branch-tracker.ts +187 -0
- package/src/plugins/git/cwd-extensions.test.ts +230 -0
- package/src/plugins/git/cwd-extensions.ts +160 -0
- package/src/plugins/git/git-ops.test.ts +397 -0
- package/src/plugins/git/git-ops.ts +173 -0
- package/src/plugins/git/index.ts +253 -0
- package/src/plugins/git/integration.test.ts +705 -0
- package/src/plugins/git/predicates.test.ts +1401 -0
- package/src/plugins/git/predicates.ts +693 -0
- package/src/plugins/git/rules.test.ts +1001 -0
- package/src/plugins/git/rules.ts +307 -0
- package/src/schema.test.ts +259 -0
- package/src/schema.ts +1963 -0
- package/src/testing/index.test.ts +1696 -0
- 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,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
|
+
});
|