dorfl 0.3.1 → 0.4.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/dist/advance-drivers.d.ts +1 -1
- package/dist/advance-lifecycle-template.js +6 -6
- package/dist/advance-lifecycle-template.js.map +1 -1
- package/dist/brand.d.ts +1 -1
- package/dist/brand.js +1 -1
- package/dist/cli.d.ts +9 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +119 -11
- package/dist/cli.js.map +1 -1
- package/dist/config-override.d.ts +1 -1
- package/dist/do-autopick.d.ts +1 -1
- package/dist/do-config.d.ts.map +1 -1
- package/dist/do-config.js +1 -1
- package/dist/do-config.js.map +1 -1
- package/dist/env-config.d.ts +1 -1
- package/dist/env-config.js +1 -1
- package/dist/identity.d.ts +1 -1
- package/dist/install-ci.js +2 -2
- package/dist/install-ci.js.map +1 -1
- package/dist/intake-trigger-template.js +2 -2
- package/dist/lifecycle-pools.d.ts +1 -1
- package/dist/mirror-pool-scan.d.ts +2 -2
- package/dist/mirror-pool-scan.js +1 -1
- package/dist/mirror-pool-scan.js.map +1 -1
- package/dist/prd-to-spec.d.ts +8 -57
- package/dist/prd-to-spec.d.ts.map +1 -1
- package/dist/prd-to-spec.js +17 -99
- package/dist/prd-to-spec.js.map +1 -1
- package/dist/protocol/WORK-CONTRACT.md +1 -1
- package/dist/repo-config.d.ts +11 -11
- package/dist/repo-config.d.ts.map +1 -1
- package/dist/repo-config.js +9 -9
- package/dist/repo-mirror.d.ts +6 -6
- package/dist/repo-mirror.d.ts.map +1 -1
- package/dist/repo-mirror.js +6 -6
- package/dist/repo-mirror.js.map +1 -1
- package/dist/resync-protocol.d.ts +73 -0
- package/dist/resync-protocol.d.ts.map +1 -0
- package/dist/resync-protocol.js +114 -0
- package/dist/resync-protocol.js.map +1 -0
- package/dist/run.d.ts +1 -1
- package/dist/run.js +1 -1
- package/dist/run.js.map +1 -1
- package/dist/scan.d.ts +2 -2
- package/dist/scan.js +5 -5
- package/dist/scan.js.map +1 -1
- package/dist/skills/convert-from-prd-to-spec/SKILL.md +2 -2
- package/dist/skills/drive-tasks/SKILL.md +1 -1
- package/dist/skills/from-idea/SKILL.md +2 -2
- package/dist/skills/setup/SKILL.md +2 -2
- package/dist/skills/setup/protocol/WORK-CONTRACT.md +1 -1
- package/dist/verify-workflow-template.d.ts +1 -1
- package/dist/verify-workflow-template.js +1 -1
- package/package.json +1 -1
- package/src/advance-drivers.ts +1 -1
- package/src/advance-lifecycle-template.ts +6 -6
- package/src/brand.ts +1 -1
- package/src/cli.ts +168 -11
- package/src/config-override.ts +1 -1
- package/src/do-autopick.ts +1 -1
- package/src/do-config.ts +1 -1
- package/src/env-config.ts +1 -1
- package/src/identity.ts +1 -1
- package/src/install-ci.ts +2 -2
- package/src/intake-trigger-template.ts +2 -2
- package/src/lifecycle-pools.ts +1 -1
- package/src/mirror-pool-scan.ts +3 -3
- package/src/prd-to-spec.ts +26 -148
- package/src/repo-config.ts +11 -11
- package/src/repo-mirror.ts +7 -7
- package/src/resync-protocol.ts +162 -0
- package/src/run.ts +2 -2
- package/src/scan.ts +5 -5
- package/src/verify-workflow-template.ts +1 -1
package/dist/scan.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scan.js","sourceRoot":"","sources":["../src/scan.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"scan.js","sourceRoot":"","sources":["../src/scan.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,7 +17,7 @@ It is authored for the ONE cutover that exists (`prd → spec`), not pre-general
|
|
|
17
17
|
Run the purpose-named migration command; it owns everything deterministic and gated. Do NOT re-implement its layers in the skill — the skill CALLS the command and reads its report.
|
|
18
18
|
|
|
19
19
|
1. **Preview first:** run `dorfl prd-to-spec --dry-run`. It reports exactly what each layer WOULD do, touching nothing. Read the report; proceed only if it looks right.
|
|
20
|
-
2. **Apply:** run `dorfl prd-to-spec`. In ONE command it: checks quiescence (refuses loudly on a dirty tree / a held per-item lock / an in-progress work-branch, NAMING the offender); re-syncs the repo's `work/protocol/*` contract from the package-canonical source (never the target's old copy) and bumps `work/protocol/VERSION`; converts the DATA — the `work/**` folders (via `git mv`), the item frontmatter + inert path/token refs across ALL items INCLUDING terminal history (`work/tasks/done/`, `work/specs/tasked/`), the
|
|
20
|
+
2. **Apply:** run `dorfl prd-to-spec`. In ONE command it: checks quiescence (refuses loudly on a dirty tree / a held per-item lock / an in-progress work-branch, NAMING the offender); re-syncs the repo's `work/protocol/*` contract from the package-canonical source (never the target's old copy) and bumps `work/protocol/VERSION`; converts the DATA — the `work/**` folders (via `git mv`), the item frontmatter + inert path/token refs across ALL items INCLUDING terminal history (`work/tasks/done/`, `work/specs/tasked/`), the `dorfl.json` config keys, and the inert git refs (lock refs + work-branches); and then runs its OWN forward+reverse leak scan over the converted tree as the command's acceptance gate.
|
|
21
21
|
3. **Gate on green:** only proceed to Half 2 when the command reports a clean/green result (no quiescence refusal, no leaks). If it refused, resolve the named offender (commit/stash, release the lock, land/prune the branch) and re-run. The command is idempotent: a second run on an already-migrated repo is a no-op.
|
|
22
22
|
|
|
23
23
|
### Half 2 — judgement: sweep the prose the command SKIPS
|
|
@@ -46,7 +46,7 @@ The command is the FAST PATH, not a hard dependency (adopt/convert is a runner-a
|
|
|
46
46
|
2. `resyncProtocol` — copy the canonical `work/protocol/*` contract and bump `VERSION`.
|
|
47
47
|
3. `migrateFolders` — `git mv` the `work/**` lifecycle folders to the new spelling.
|
|
48
48
|
4. `migrateItemContent` — rewrite the frontmatter field key + inert path/token refs across every item (including terminal history).
|
|
49
|
-
5. `migrateConfig` — rename the
|
|
49
|
+
5. `migrateConfig` — rename the `dorfl.json` config keys, preserving their values.
|
|
50
50
|
6. `migrateRefs` — rename the inert lock refs + work-branches.
|
|
51
51
|
7. `scanForLeaks` — run the forward+reverse gate over the converted tree.
|
|
52
52
|
|
|
@@ -140,7 +140,7 @@ From the READY set, order by: (a) **dependency** (a task that unlocks others fir
|
|
|
140
140
|
dorfl do task:<slug> --isolated
|
|
141
141
|
```
|
|
142
142
|
|
|
143
|
-
**`--isolated` is the one flag this skill mandates. Everything else — review mode, integration mode, harness, model — is LET TO CONFIG** (resolved `flag > env > per-repo > global > default`), so do NOT hardcode `--review`/`--propose`/`--merge` here: the repo's
|
|
143
|
+
**`--isolated` is the one flag this skill mandates. Everything else — review mode, integration mode, harness, model — is LET TO CONFIG** (resolved `flag > env > per-repo > global > default`), so do NOT hardcode `--review`/`--propose`/`--merge` here: the repo's `dorfl.json` decides, and `do --propose` is already the default. (`--isolated` reads the target repo's committed `dorfl.json` from the arbiter's main, so per-repo `harness`/`verify`/`noPR`/`review` apply automatically — no `--harness`/env workaround.) **At the START of a drive, CONFIRM the run mode with the user** — do they want Gate 2 (`--review`, off by default — the human-first family default), and propose vs merge integration? — and add `--review` / `--merge` / etc. as explicit per-run OVERRIDES only when the user asks; otherwise let config drive every build of the drive.
|
|
144
144
|
|
|
145
145
|
After a failed/aborted isolated run, a stale job worktree can linger and block the next build's mirror fetch — run `dorfl gc` (or `gc --force --yes` once you've confirmed the work is safe on the arbiter) to reap it before continuing. Use a **generous timeout** — `do` runs a build agent + the full gate + (if enabled) the Gate-2 review and can take well over an hour for a big task. If you interrupt it, KILL the spawned `do`/agent process tree explicitly (an abort of your wrapper does NOT stop the child); the isolated worktree is then reaped/recovered via `gc` + the kept arbiter branch (your checkout is untouched).
|
|
146
146
|
|
|
@@ -13,7 +13,7 @@ It is an **on-ramp** (per `work/SKILL.md`'s taxonomy — a starting situation th
|
|
|
13
13
|
## What it is NOT (the boundaries that keep it thin)
|
|
14
14
|
|
|
15
15
|
- **NOT a spec-producer of its own.** `to-spec` writes the spec (it owns the spec shape, the `work/protocol/spec-template.md`, the launch-snapshot banner, the `specs/ready/` target, the two autonomy axes). from-idea is the FRONT DOOR that calls it. Read the two names as a pair: `from-idea` owns the on-ramp (setup + the interview); `to-spec` is the synthesis primitive it hands the conversation to. Do not reimplement any of to-spec here.
|
|
16
|
-
- **NOT a scaffolder of its own.** `setup` owns the `work/` skeleton, the `work/protocol/` docs, `CONTEXT.md`, the
|
|
16
|
+
- **NOT a scaffolder of its own.** `setup` owns the `work/` skeleton, the `work/protocol/` docs, `CONTEXT.md`, the `dorfl.json` `verify`/`prepare` gate, and the empty-vs-populated detection. from-idea CALLS setup; it never hand-rolls a "is this a contract repo?" check or writes `CONTEXT.md` itself (that forks setup's detection and drifts). The one-way direction is fixed: **from-idea calls setup; setup never calls from-idea** (setup stays a focused adoption primitive). setup's empty-repo branch MAY _mention_ from-idea as the next step — a discoverability pointer, never an invocation.
|
|
17
17
|
- **NOT adversarial grilling.** Stress-testing a plan/design before building is the personal `grilling` skill's job. from-idea clarifies only enough to be spec-worthy and DEFERS the rest (see the interview floor below). If the user wants the idea grilled, that is a separate move after the spec lands.
|
|
18
18
|
|
|
19
19
|
## The sequence (honor BOTH human checkpoints; never auto-commit)
|
|
@@ -52,7 +52,7 @@ So you interview ONCE. When setup's A2 asks "what is this repo about?", you alre
|
|
|
52
52
|
|
|
53
53
|
**Always invoke `setup`** — do NOT hand-roll a `test -d work/` to decide whether to. setup's A1 already detects empty-vs-populated and does the right thing in each case, and re-running it on an existing contract repo **re-syncs the `work/protocol/` docs** (the one legitimate clobber) so the repo picks up protocol updates. Skipping setup would skip that refresh and fork its detection logic.
|
|
54
54
|
|
|
55
|
-
- **Empty / new repo (the common from-idea case):** setup does Phase A — scaffolds `work/`, copies `work/protocol/`, writes `CONTEXT.md` (from the description you gathered in step 1) and
|
|
55
|
+
- **Empty / new repo (the common from-idea case):** setup does Phase A — scaffolds `work/`, copies `work/protocol/`, writes `CONTEXT.md` (from the description you gathered in step 1) and `dorfl.json` (the `verify`/`prepare` gate it detects, presented for confirmation at its HARD STOP). Phase B is empty.
|
|
56
56
|
- **Existing contract repo (adding a new idea to a repo already set up):** setup's Phase A is a near-no-op + protocol re-sync; the scaffold already exists. You then go straight to step 3. **Flag the Phase-B-hijack seam:** if the repo is populated with convertible material, be explicit that the intent is "scaffold/refresh and accept a NEW idea", not "migrate everything" — do not let setup's Phase-B conversion hijack the from-idea session. (A new idea is not migration of existing material.)
|
|
57
57
|
|
|
58
58
|
Honor setup's HARD STOP: present the plan, wait for confirmation, then it scaffolds. Feed it the description from step 1 so its A2 does not re-ask.
|
|
@@ -37,7 +37,7 @@ An **ADR** (`docs/adr/`) records a **DECISION + its why** — the rejected optio
|
|
|
37
37
|
`ls`/glob the repo first. For EACH artifact setup would write, if it ALREADY exists, do NOT overwrite — report it and leave it (or, for `dorfl.json` / `CONTEXT.md`, offer to MERGE-in only the missing keys/sections). Only CREATE what is missing. This is what makes setup safe to run on a populated repo and idempotent to re-run.
|
|
38
38
|
|
|
39
39
|
- If `work/` already has the folders → skip them. **If `work/` is on the LEGACY FLAT layout** (top-level `backlog/` / `prd/` / `observations/` / … instead of the `notes/` / `tasks/` / `specs/` umbrellas) → do NOT silently scaffold a second, parallel tree beside it; surface it and offer the documented migration mapping (see A5b).
|
|
40
|
-
- **`work/protocol/` is the ONE exception to never-clobber — it is protocol-owned, not repo-owned.** The repo's `work/` _items_ (tasks/specs/notes) are sacred and never touched; but the `work/protocol/` reference docs are verbatim copies setup owns, so re-running setup **re-syncs** them (overwrite with the current canonical copies + bump `work/protocol/VERSION`). This is how a repo picks up protocol updates. Never hand-edit `work/protocol/<doc>` in a target repo — edits belong in setup's canonical `protocol/` source and propagate via re-sync.
|
|
40
|
+
- **`work/protocol/` is the ONE exception to never-clobber — it is protocol-owned, not repo-owned.** The repo's `work/` _items_ (tasks/specs/notes) are sacred and never touched; but the `work/protocol/` reference docs are verbatim copies setup owns, so re-running setup **re-syncs** them (overwrite with the current canonical copies + bump `work/protocol/VERSION`). This is how a repo picks up protocol updates. (If `dorfl` is installed, `dorfl sync` is the focused, non-interactive way to do JUST this re-sync — no re-scan/conversation — and can additionally `--add-skills` to refresh the operator's packaged skills.) Never hand-edit `work/protocol/<doc>` in a target repo — edits belong in setup's canonical `protocol/` source and propagate via re-sync.
|
|
41
41
|
- If `CONTEXT.md` exists → do not overwrite; offer to APPEND a "domain terms" section if absent, else leave it.
|
|
42
42
|
- If `dorfl.json` exists → do not overwrite; report its `verify`/`harness` and offer to fill only ABSENT keys.
|
|
43
43
|
- **Detect Phase B material — do NOT skip dotfolders that might hold meaningful content.** While inventorying, note any **convertible material**: a `tasks/` folder, a `TODO.md`, an issue-tracker export, `docs/` design notes / RFCs, plan files, and **substantial source code** (code that embodies decisions). A plain `ls` of the visible top level is NOT enough: a hidden (dot-prefixed) folder can hold real sources (design docs, plans, tasks, notes), and a missed source is silently under-routed (a rich design doc that should be a spec never gets seen). So look inside dotfolders too, and judge each by whether it _could plausibly contain documents/plans/notes_ worth converting. **Skip only the noise** — `.git/`, `node_modules/` and other dependency dirs, build output, and anything `.gitignore`d are never sources. This detection decides whether Phase B runs (see A4 / Phase B). A repo with only a README that says "clean slate" (or nothing) → Phase B is empty; finish after Phase A.
|
|
@@ -110,7 +110,7 @@ work/
|
|
|
110
110
|
protocol/ # the propagated protocol docs (copied below)
|
|
111
111
|
```
|
|
112
112
|
|
|
113
|
-
The two won't-proceed terminals are deliberately named DIFFERENTLY per regime (`tasks/cancelled/` vs `specs/dropped/`) — a slug-collision correctness fix (a dropped task and a dropped spec sharing a slug must not collide on one bare-slug path); see `work/protocol/WORK-CONTRACT.md`. Then **copy the protocol docs verbatim into `work/protocol/`** from this skill's `protocol/` directory (`WORK-CONTRACT.md`, `CLAIM-PROTOCOL.md`, `REVIEW-PROTOCOL.md`, `task-template.md`, `spec-template.md`, `ADR-FORMAT.md`) and write `work/protocol/VERSION` — creating them if absent, RE-SYNCING (overwriting) them if present (protocol-owned, per A1); write `CONTEXT.md` and `dorfl.json` if absent (or merge-in missing keys per A1). NOTE: `dorfl.json` (plain, non-dotfile) is the name setup CREATES and dorfl PREFERS; a repo that already committed the legacy
|
|
113
|
+
The two won't-proceed terminals are deliberately named DIFFERENTLY per regime (`tasks/cancelled/` vs `specs/dropped/`) — a slug-collision correctness fix (a dropped task and a dropped spec sharing a slug must not collide on one bare-slug path); see `work/protocol/WORK-CONTRACT.md`. Then **copy the protocol docs verbatim into `work/protocol/`** from this skill's `protocol/` directory (`WORK-CONTRACT.md`, `CLAIM-PROTOCOL.md`, `REVIEW-PROTOCOL.md`, `task-template.md`, `spec-template.md`, `ADR-FORMAT.md`) and write `work/protocol/VERSION` — creating them if absent, RE-SYNCING (overwriting) them if present (protocol-owned, per A1); write `CONTEXT.md` and `dorfl.json` if absent (or merge-in missing keys per A1). NOTE: `dorfl.json` (plain, non-dotfile) is the name setup CREATES and dorfl PREFERS; a repo that already committed the legacy `dorfl.json` (dotfile) is still honoured on READ (dorfl falls back to it), so on a re-run against a legacy repo, MERGE-into the existing `dorfl.json` in place rather than creating a second `dorfl.json` (do not end up with both).
|
|
114
114
|
|
|
115
115
|
**Run the gate ONCE and report (catch a wrong `verify` immediately).** After writing `dorfl.json`, actually EXECUTE the `verify` command once and report green/red — the cheapest moment to discover the gate is wrong (a typo, a missing script, deps not installed), instead of at first build. If red, say WHY (e.g. "`format:check` failed — run `format` first" / "`build` needs deps installed") and offer to adjust the gate or note the prep step; do NOT silently leave a red gate. (Deps clearly not installed = the env-prep gap — that is what the `prepare` field is FOR: put the install in `prepare` (A3b), do NOT contort `verify` to hide it.)
|
|
116
116
|
|
|
@@ -210,7 +210,7 @@ The autonomy gate is TWO orthogonal binary fields (both default to omitted = fal
|
|
|
210
210
|
- **`humanOnly: true` — the DECIDED axis.** _Should a human drive this, regardless of how complete the spec is?_ A product/design/security/judgement call, or an `AGENTS.md`-type rule. Driven by a decision (in the spec conversation, or the tasker's own judgement). On a SPEC it means "a human must drive the tasking". On a TASK it is the NARROW "never-for-agents BY NATURE" guard (secrets/release/security) that **survives even when the task resides in the agent pool `work/tasks/ready/`**. Task `humanOnly` is NOT the tool for ordinary "a human should review this before the agent builds it" — that job belongs to POSITION (the runner births the task STAGED in `work/tasks/backlog/`; a human promotes the approved ones into the pool `work/tasks/ready/`). See "Task `humanOnly` is NARROW" below.
|
|
211
211
|
- **`needsAnswers: true` — the DISCOVERED axis.** _Are there unresolved questions blocking autonomous progress?_ The spec is incomplete; **the open questions live in the body**. Once answered, the flag is cleared and an agent may proceed.
|
|
212
212
|
- They are **orthogonal** — four honest states. e.g. `humanOnly:true, needsAnswers:false` = fully specified but a human must own it; `humanOnly:false, needsAnswers:true` = anyone can do it once the questions are answered.
|
|
213
|
-
- **Repo policy `autoBuild`** answers the question the _repo_ owns: _may agents auto-build undeclared items here?_ The build member of the symmetric per-action gate family (`autoBuild`/`autoTask`/`observationTriage`). Per-repo config key (
|
|
213
|
+
- **Repo policy `autoBuild`** answers the question the _repo_ owns: _may agents auto-build undeclared items here?_ The build member of the symmetric per-action gate family (`autoBuild`/`autoTask`/`observationTriage`). Per-repo config key (`dorfl.json`), resolved like `integration`: **CLI flag (`--auto-build` / `--no-auto-build`) > env (`DORFL_AUTO_BUILD`) > per-repo config > global config > built-in default (`false`)**.
|
|
214
214
|
|
|
215
215
|
**Predicate (same shape at both levels):** an item is **auto-eligible** iff `needsAnswers` is not `true` AND `humanOnly` is not `true` AND `autoBuild` is `true`. A human is never bound by it (a human may task/build a flagged item — the gate binds the agent, like the runner-vs-human stance on `verify`).
|
|
216
216
|
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
*
|
|
14
14
|
* The workflow is deliberately thin: it wires the same composite setup action
|
|
15
15
|
* the other capabilities use, then runs `dorfl verify` — the deterministic shell
|
|
16
|
-
* gate the repo declares in
|
|
16
|
+
* gate the repo declares in `dorfl.json`. No agent, no provider secrets, no
|
|
17
17
|
* `gh` mutation; it is read-only with respect to `work/`.
|
|
18
18
|
*
|
|
19
19
|
* `merge_group` is present (with no extra wiring) so a follow-on Tier-2 task
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
*
|
|
14
14
|
* The workflow is deliberately thin: it wires the same composite setup action
|
|
15
15
|
* the other capabilities use, then runs `dorfl verify` — the deterministic shell
|
|
16
|
-
* gate the repo declares in
|
|
16
|
+
* gate the repo declares in `dorfl.json`. No agent, no provider secrets, no
|
|
17
17
|
* `gh` mutation; it is read-only with respect to `work/`.
|
|
18
18
|
*
|
|
19
19
|
* `merge_group` is present (with no extra wiring) so a follow-on Tier-2 task
|
package/package.json
CHANGED
package/src/advance-drivers.ts
CHANGED
|
@@ -93,7 +93,7 @@ export interface PerformAdvanceMultiOptions extends SharedAdvanceContext {
|
|
|
93
93
|
/**
|
|
94
94
|
* The per-machine {@link ConfigOverrideMap}. Threaded into the in-place pool
|
|
95
95
|
* scan (`scanRepoPaths`) so the per-machine override applies to advance
|
|
96
|
-
* autopick eligibility — WITHOUT it the committed
|
|
96
|
+
* autopick eligibility — WITHOUT it the committed `dorfl.json` silently
|
|
97
97
|
* beats the override on this path (the in-place advance autopick mirror of the
|
|
98
98
|
* `do` autopick defect).
|
|
99
99
|
*/
|
|
@@ -176,7 +176,7 @@ on:
|
|
|
176
176
|
# Override an engine gate for THIS manual run only, riding the env layer of
|
|
177
177
|
# flag > env > per-repo > global > default. Modelled as \`type: choice\` with a
|
|
178
178
|
# BLANK first option (not \`type: boolean\`, which cannot represent "unset"):
|
|
179
|
-
# blank ⇒ emit NOTHING (the committed
|
|
179
|
+
# blank ⇒ emit NOTHING (the committed dorfl.json wins, today's
|
|
180
180
|
# behaviour); a non-blank choice ⇒ export the matching DORFL_* for this
|
|
181
181
|
# run. The blank is load-bearing: env-config coercion THROWS on an empty
|
|
182
182
|
# string, so the per-job step below only writes when the input is non-blank.
|
|
@@ -247,11 +247,11 @@ env:
|
|
|
247
247
|
# ── The engine GATE FAMILY is resolved FROM CONFIG, not carried here ─────────
|
|
248
248
|
# CI is NOT a special policy surface (ADR ci-config-policy-and-gate-family §5):
|
|
249
249
|
# it runs the SAME engine gates, resolved through flag > env > per-repo > global
|
|
250
|
-
# > default. The SAME
|
|
250
|
+
# > default. The SAME dorfl.json the laptop uses applies here. This
|
|
251
251
|
# workflow emits NO DORFL_AUTO_BUILD / DORFL_AUTO_TASK /
|
|
252
252
|
# DORFL_OBSERVATION_TRIAGE / DORFL_SURFACE_BLOCKERS line on a
|
|
253
253
|
# SCHEDULE/PUSH tick, so the env layer carries NO defaults there — your committed
|
|
254
|
-
#
|
|
254
|
+
# dorfl.json wins (then the global config, then the strict built-in
|
|
255
255
|
# defaults autoBuild:false / autoTask:false / observationTriage:'off' /
|
|
256
256
|
# surfaceBlockers:false). The ONE exception is a manual \`workflow_dispatch\` where
|
|
257
257
|
# you fill a gate override input (above): the per-job step then exports that ONE
|
|
@@ -260,7 +260,7 @@ env:
|
|
|
260
260
|
# \`enumerate\` scan (it gates the matrix pools via observationTriage/surfaceBlockers
|
|
261
261
|
# /autoTask/autoBuild), not just the agent-running jobs — or the override is inert
|
|
262
262
|
# for the very pools it targets. To enable CI autonomy durably, set the gate(s) in
|
|
263
|
-
#
|
|
263
|
+
# dorfl.json (applies everywhere) — NOT by re-running install-ci (ADR §6:
|
|
264
264
|
# install-ci is one-time).
|
|
265
265
|
|
|
266
266
|
jobs:
|
|
@@ -477,7 +477,7 @@ jobs:
|
|
|
477
477
|
- name: advance one item in-place (merge ⇒ rebase + CAS land on main)
|
|
478
478
|
# In-place (no --isolated/--remote). \`--merge\` ties the integration mode
|
|
479
479
|
# to THIS (matrix) shape: it sits at the top of the precedence chain, so
|
|
480
|
-
# the workflow mode always wins over the repo's
|
|
480
|
+
# the workflow mode always wins over the repo's \`dorfl.json\` default.
|
|
481
481
|
# Cross-job land safety comes from the engine's CAS-retry loop, not from
|
|
482
482
|
# this workflow's job shape. \`gh\` (merge / PR housekeeping) reads
|
|
483
483
|
# \`GH_TOKEN\` from the env.
|
|
@@ -644,7 +644,7 @@ export function validateAdvanceLifecycleWorkflow(
|
|
|
644
644
|
// The workflow emits NO active gate env line for any of AUTO_BUILD / AUTO_TASK
|
|
645
645
|
// / OBSERVATION_TRIAGE / SURFACE_BLOCKERS: the env layer is the OPTIONAL CI-only
|
|
646
646
|
// override layer, NOT the carrier of defaults. Emitting any of them would FORCE
|
|
647
|
-
// env to win over the repo's own
|
|
647
|
+
// env to win over the repo's own dorfl.json (the precedence is
|
|
648
648
|
// flag > env > per-repo > global > default), silently shadowing per-repo gate
|
|
649
649
|
// config in CI — exactly the bug this task closes. A user who genuinely wants a
|
|
650
650
|
// CI-SPECIFIC override adds the env var themselves (the opt-in CI override the
|
package/src/brand.ts
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
*
|
|
9
9
|
* - the `DORFL_` env-var prefix (a missed one is read as "unset" — the
|
|
10
10
|
* worst kind of failure: silent);
|
|
11
|
-
* - the
|
|
11
|
+
* - the `dorfl.json` per-repo config filename;
|
|
12
12
|
* - the `~/.dorfl/` workspaces-dir default + the `dorfl` config
|
|
13
13
|
* dir name;
|
|
14
14
|
* - the `.dorfl-job.json` per-job record filename;
|
package/src/cli.ts
CHANGED
|
@@ -114,6 +114,7 @@ import {
|
|
|
114
114
|
type PrdToSpecResult,
|
|
115
115
|
type DataLeak,
|
|
116
116
|
} from './prd-to-spec.js';
|
|
117
|
+
import {resyncProtocol, type ResyncResult} from './resync-protocol.js';
|
|
117
118
|
import {sweepRemoteMergedBranches} from './reap-branches.js';
|
|
118
119
|
import {sweepOrphanSidecars} from './orphan-sidecar.js';
|
|
119
120
|
import {sweepLedgerDuplicates, formatLedgerSweep} from './ledger-lint.js';
|
|
@@ -232,7 +233,7 @@ function loadGlobalAndOverride(configPath: string | undefined): {
|
|
|
232
233
|
|
|
233
234
|
/**
|
|
234
235
|
* Resolve the effective config for a `do --remote <r>` run, layering the target
|
|
235
|
-
* repo's COMMITTED
|
|
236
|
+
* repo's COMMITTED `dorfl.json` (read from `<arbiter>/main` via the hub
|
|
236
237
|
* mirror) into the SAME `flag > env > per-repo > global > default` chain in-place
|
|
237
238
|
* `do` uses. This is the no-checkout analogue of {@link resolveRepoConfig}: there
|
|
238
239
|
* is no working tree, so the bytes come from the arbiter's `main` instead of the
|
|
@@ -247,7 +248,7 @@ function loadGlobalAndOverride(configPath: string | undefined): {
|
|
|
247
248
|
* the arbiter was momentarily offline.
|
|
248
249
|
*
|
|
249
250
|
* The config read uses {@link ensureMirrorMain} (main-only, NO-prune), NOT the
|
|
250
|
-
* all-heads pruning {@link ensureMirror}: `git show main
|
|
251
|
+
* all-heads pruning {@link ensureMirror}: `git show main:dorfl.json` only
|
|
251
252
|
* needs `main`, and the all-heads `+refs/heads/*:refs/heads/*` fetch would let a
|
|
252
253
|
* `work/<slug>` branch CHECKED OUT in some stale job worktree block it (git
|
|
253
254
|
* refuses to fetch into a checked-out branch), throwing the read into its
|
|
@@ -493,7 +494,7 @@ function resolveDefaultArbiterForCwd(
|
|
|
493
494
|
// The SAME per-repo config read in-place `do` uses (`resolveRepoConfig` on the
|
|
494
495
|
// cwd), so `--isolated` resolves the arbiter remote NAME (`defaultArbiter`)
|
|
495
496
|
// through the identical `flag > env > per-repo > global > default` chain. An
|
|
496
|
-
// absent
|
|
497
|
+
// absent `dorfl.json` falls back to the global/default (`origin`).
|
|
497
498
|
return resolveRepoConfig({repoPath: cwd, global, flags, override}).config
|
|
498
499
|
.defaultArbiter;
|
|
499
500
|
}
|
|
@@ -910,6 +911,91 @@ function printLeak(leak: DataLeak): void {
|
|
|
910
911
|
);
|
|
911
912
|
}
|
|
912
913
|
|
|
914
|
+
/**
|
|
915
|
+
* A minimal interactive yes/no confirmation (default NO). Prompts on stderr
|
|
916
|
+
* (stdout stays reserved for machine/report output) and reads one line from
|
|
917
|
+
* stdin. Callers only reach this on an interactive (TTY) session — a non-TTY
|
|
918
|
+
* path decides WITHOUT prompting (so a scripted run never hangs). Returns true
|
|
919
|
+
* only for an explicit `y`/`yes`.
|
|
920
|
+
*/
|
|
921
|
+
function confirmYesNo(message: string): Promise<boolean> {
|
|
922
|
+
return new Promise((resolvePrompt) => {
|
|
923
|
+
const rl = createInterface({input: process.stdin, output: process.stderr});
|
|
924
|
+
rl.question(`${message} [y/N] `, (answer) => {
|
|
925
|
+
rl.close();
|
|
926
|
+
const a = answer.trim().toLowerCase();
|
|
927
|
+
resolvePrompt(a === 'y' || a === 'yes');
|
|
928
|
+
});
|
|
929
|
+
});
|
|
930
|
+
}
|
|
931
|
+
|
|
932
|
+
interface SyncFlags {
|
|
933
|
+
/** The repo working-tree root to sync (default: cwd). */
|
|
934
|
+
repo?: string;
|
|
935
|
+
/** Report what WOULD change, touching nothing. */
|
|
936
|
+
dryRun?: boolean;
|
|
937
|
+
/**
|
|
938
|
+
* ALSO (re-)install the packaged dorfl skills into the operator's own harness
|
|
939
|
+
* dir(s), NON-INTERACTIVELY. This flag IS the confirmation: it BYPASSES the
|
|
940
|
+
* interactive ask. Without it, an interactive (TTY) session PROMPTS once
|
|
941
|
+
* before installing, and a non-TTY session skips the skills step entirely
|
|
942
|
+
* (so a scripted `sync` never hangs). Either way, the protocol re-sync half
|
|
943
|
+
* always runs.
|
|
944
|
+
*/
|
|
945
|
+
addSkills?: boolean;
|
|
946
|
+
/** With `--add-skills` (or a confirmed prompt): scope the skills install to <cwd>/.agents/skills/ instead of the global default. */
|
|
947
|
+
local?: boolean;
|
|
948
|
+
json?: boolean;
|
|
949
|
+
}
|
|
950
|
+
|
|
951
|
+
/**
|
|
952
|
+
* Human-readable report for the deterministic protocol re-sync half of
|
|
953
|
+
* `dorfl sync`. Groups the docs into changed / unchanged / skipped and names the
|
|
954
|
+
* VERSION file. `dryRun` reframes it as "WOULD" so a preview reads honestly.
|
|
955
|
+
* A SKIPPED doc (unresolvable source) is surfaced LOUDLY — the contract in the
|
|
956
|
+
* target repo is incomplete for that doc.
|
|
957
|
+
*/
|
|
958
|
+
export function formatSyncReport(
|
|
959
|
+
result: ResyncResult,
|
|
960
|
+
dryRun: boolean,
|
|
961
|
+
): string {
|
|
962
|
+
const lines: string[] = [];
|
|
963
|
+
const changed = result.docs.filter((d) => !d.unchanged && !d.skipped);
|
|
964
|
+
const unchanged = result.docs.filter((d) => d.unchanged);
|
|
965
|
+
const skipped = result.docs.filter((d) => d.skipped);
|
|
966
|
+
const verb = dryRun ? 'WOULD sync' : 'Synced';
|
|
967
|
+
lines.push(
|
|
968
|
+
dryRun
|
|
969
|
+
? '=== dorfl sync (DRY RUN — nothing written) ==='
|
|
970
|
+
: '=== dorfl sync ===',
|
|
971
|
+
);
|
|
972
|
+
lines.push(
|
|
973
|
+
`Protocol: ${verb} ${result.docs.length} doc(s) — ` +
|
|
974
|
+
`${changed.length} changed, ${unchanged.length} unchanged, ` +
|
|
975
|
+
`${skipped.length} skipped.`,
|
|
976
|
+
);
|
|
977
|
+
for (const d of changed) {
|
|
978
|
+
lines.push(` ~ ${d.dest}`);
|
|
979
|
+
}
|
|
980
|
+
for (const d of skipped) {
|
|
981
|
+
lines.push(
|
|
982
|
+
` !! ${d.name}: SOURCE could not be resolved — NOT copied ` +
|
|
983
|
+
'(the contract doc is missing in the package).',
|
|
984
|
+
);
|
|
985
|
+
}
|
|
986
|
+
if (changed.length > 0 || skipped.length === result.docs.length) {
|
|
987
|
+
lines.push(
|
|
988
|
+
`VERSION: ${dryRun ? 'WOULD bump' : 'bumped'} ${result.versionPath}` +
|
|
989
|
+
(skipped.length === result.docs.length
|
|
990
|
+
? ' (no doc synced — no bump)'
|
|
991
|
+
: '.'),
|
|
992
|
+
);
|
|
993
|
+
} else {
|
|
994
|
+
lines.push(`VERSION: unchanged (${result.versionPath} — already current).`);
|
|
995
|
+
}
|
|
996
|
+
return lines.join('\n');
|
|
997
|
+
}
|
|
998
|
+
|
|
913
999
|
interface StatusFlags {
|
|
914
1000
|
config?: string;
|
|
915
1001
|
workspace?: string;
|
|
@@ -1893,7 +1979,7 @@ export function buildProgram(): Command {
|
|
|
1893
1979
|
const slug = resolveTaskOnlySlug(rawSlug);
|
|
1894
1980
|
// Resolve the `promptGuidance` NUDGE namespace through the SAME chain the
|
|
1895
1981
|
// gate family uses (env > per-repo > global > default), so e.g. a
|
|
1896
|
-
// `promptGuidance.testFirst:true` in
|
|
1982
|
+
// `promptGuidance.testFirst:true` in `dorfl.json` strengthens the
|
|
1897
1983
|
// wrapper line for `dorfl prompt` exactly as it would in `do`/`run`.
|
|
1898
1984
|
const cwd = process.cwd();
|
|
1899
1985
|
const global = loadConfig();
|
|
@@ -2052,7 +2138,7 @@ export function buildProgram(): Command {
|
|
|
2052
2138
|
}
|
|
2053
2139
|
|
|
2054
2140
|
// Resolve the integration mode at completion time, highest first:
|
|
2055
|
-
// --merge/--propose flag > per-repo
|
|
2141
|
+
// --merge/--propose flag > per-repo dorfl.json > global > default.
|
|
2056
2142
|
// The flag sits at the TOP of the same chain the autonomous runner uses
|
|
2057
2143
|
// (per-repo > global > default), so human and autonomous paths agree.
|
|
2058
2144
|
const flagMode = integrationFromFlags(flags);
|
|
@@ -2296,7 +2382,7 @@ export function buildProgram(): Command {
|
|
|
2296
2382
|
const cwd = process.cwd();
|
|
2297
2383
|
const {global, override} = loadGlobalAndOverride(flags.config);
|
|
2298
2384
|
// Resolve the integration mode at integrate-time, highest first:
|
|
2299
|
-
// --merge/--propose flag > per-repo
|
|
2385
|
+
// --merge/--propose flag > per-repo dorfl.json > global > default.
|
|
2300
2386
|
// (Same chain `complete` uses — `do` is the autonomous twin.)
|
|
2301
2387
|
let flagMode;
|
|
2302
2388
|
try {
|
|
@@ -2320,7 +2406,7 @@ export function buildProgram(): Command {
|
|
|
2320
2406
|
// ORTHOGONAL: `--isolated` + `--remote` is REDUNDANT (a foreign `--remote` is
|
|
2321
2407
|
// already isolated), so we accept it and `--remote` WINS (see `## Decisions`).
|
|
2322
2408
|
//
|
|
2323
|
-
// In BOTH cases the repo's COMMITTED
|
|
2409
|
+
// In BOTH cases the repo's COMMITTED `dorfl.json` is reachable on
|
|
2324
2410
|
// `<arbiter>/main` (the mirror), so we layer it — `flag > env > per-repo >
|
|
2325
2411
|
// global > default` parity with in-place `do` (task
|
|
2326
2412
|
// `remote-do-reads-per-repo-config-from-arbiter-main`). Only the whitelisted
|
|
@@ -2440,7 +2526,7 @@ export function buildProgram(): Command {
|
|
|
2440
2526
|
// mirror fetch runs under). These are host-only by definition (rejected
|
|
2441
2527
|
// per-repo), so reading them from global+flags first is correct and stable.
|
|
2442
2528
|
const bootstrap = resolveGlobalConfig(global, remoteFlags);
|
|
2443
|
-
// Source the committed
|
|
2529
|
+
// Source the committed `dorfl.json` from `<arbiter>/main` via the
|
|
2444
2530
|
// hub mirror, then layer ONLY its whitelisted keys through the EXISTING
|
|
2445
2531
|
// per-repo machinery. The read refreshes ONLY `main` (no-prune), so a
|
|
2446
2532
|
// `work/<slug>` branch checked out in a stale worktree can never block it,
|
|
@@ -2495,7 +2581,7 @@ export function buildProgram(): Command {
|
|
|
2495
2581
|
// Single-job build path: gate the REBASED tip (the default) unconditionally.
|
|
2496
2582
|
freshWorktreeGate: remoteConfig.freshWorktreeGate,
|
|
2497
2583
|
// Cross-job merge-serialiser CAS-retry cap (resolved through the per-repo
|
|
2498
|
-
// chain on the arbiter-side
|
|
2584
|
+
// chain on the arbiter-side `dorfl.json` too) — spec
|
|
2499
2585
|
// `land-time-reverify-and-parallel-merge-ceiling` Story 5.
|
|
2500
2586
|
mergeRetries: remoteConfig.mergeRetries,
|
|
2501
2587
|
noPR: remoteConfig.noPR,
|
|
@@ -2895,7 +2981,7 @@ export function buildProgram(): Command {
|
|
|
2895
2981
|
const cwd = process.cwd();
|
|
2896
2982
|
const {global, override} = loadGlobalAndOverride(flags.config);
|
|
2897
2983
|
// Resolve the integration mode this invocation asks for, highest first:
|
|
2898
|
-
// --merge/--propose flag > per-repo
|
|
2984
|
+
// --merge/--propose flag > per-repo dorfl.json > global > default.
|
|
2899
2985
|
// The SAME chain `do`/`complete` use (via `integrationFromFlags`), so the
|
|
2900
2986
|
// human, the autonomous runner, and the CI workflow all resolve the SAME
|
|
2901
2987
|
// order. This is what ties the CI dispatch `integrationMode` to the actual
|
|
@@ -2959,7 +3045,7 @@ export function buildProgram(): Command {
|
|
|
2959
3045
|
);
|
|
2960
3046
|
process.exit(1);
|
|
2961
3047
|
}
|
|
2962
|
-
// Source the arbiter's COMMITTED
|
|
3048
|
+
// Source the arbiter's COMMITTED `dorfl.json` from `<arbiter>/main`
|
|
2963
3049
|
// via the hub mirror + layer ONLY its whitelisted keys — the SAME
|
|
2964
3050
|
// resolution `do --isolated` uses, so the gate family (autoBuild/autoTask/
|
|
2965
3051
|
// observationTriage/surfaceBlockers) + selectionOrder + integration resolve
|
|
@@ -3541,6 +3627,77 @@ export function buildProgram(): Command {
|
|
|
3541
3627
|
);
|
|
3542
3628
|
});
|
|
3543
3629
|
|
|
3630
|
+
// `dorfl sync`: bring an already-onboarded repo up to the CURRENT protocol.
|
|
3631
|
+
// Always re-syncs `work/protocol/*` + bumps VERSION (the deterministic slice of
|
|
3632
|
+
// `setup`, shared with `prd-to-spec` via `resync-protocol.ts`). `--add-skills`
|
|
3633
|
+
// ADDITIONALLY (re-)installs the packaged skills into the operator's harness
|
|
3634
|
+
// dir(s), NON-INTERACTIVELY (the flag IS the confirmation); without it an
|
|
3635
|
+
// interactive session PROMPTS once and a non-TTY session skips skills.
|
|
3636
|
+
program
|
|
3637
|
+
.command('sync')
|
|
3638
|
+
.helpGroup(HEADLINE_GROUP)
|
|
3639
|
+
.description(
|
|
3640
|
+
"Bring THIS repo up to the current dorfl protocol: re-sync work/protocol/* from the package's canonical contract docs and bump work/protocol/VERSION (idempotent — a no-op when already current). This is how a repo that adopted an older protocol picks up the latest. Optionally ALSO (re-)installs the packaged dorfl skills into your own harness: pass --add-skills to do it non-interactively (the flag bypasses the ask), otherwise an interactive run prompts once (a non-TTY run skips skills). Runs IN-PLACE (no git commit/push — the human commits the result).",
|
|
3641
|
+
)
|
|
3642
|
+
.option('--repo <dir>', 'the repo working-tree root to sync (default: cwd)')
|
|
3643
|
+
.option(
|
|
3644
|
+
'--dry-run',
|
|
3645
|
+
'REPORT what the protocol re-sync WOULD change, touching nothing (no writes; skills are never installed under --dry-run)',
|
|
3646
|
+
)
|
|
3647
|
+
.option(
|
|
3648
|
+
'--add-skills',
|
|
3649
|
+
'ALSO (re-)install the packaged dorfl skills into your own harness dir(s), non-interactively. This flag IS the confirmation — it bypasses the interactive ask.',
|
|
3650
|
+
)
|
|
3651
|
+
.option(
|
|
3652
|
+
'--local',
|
|
3653
|
+
'with skills install: scope to <cwd>/.agents/skills/ instead of the global ~/.agents/skills/ default',
|
|
3654
|
+
)
|
|
3655
|
+
.option('--json', 'output the raw protocol re-sync result as JSON')
|
|
3656
|
+
.action(async (flags: SyncFlags) => {
|
|
3657
|
+
const repoPath = flags.repo ?? process.cwd();
|
|
3658
|
+
const dryRun = flags.dryRun === true;
|
|
3659
|
+
|
|
3660
|
+
// 1. The deterministic protocol re-sync (always runs).
|
|
3661
|
+
const resync = resyncProtocol(repoPath, {
|
|
3662
|
+
dryRun,
|
|
3663
|
+
sourceCommit: 'dorfl sync',
|
|
3664
|
+
});
|
|
3665
|
+
if (flags.json) {
|
|
3666
|
+
console.log(JSON.stringify(resync, null, 2));
|
|
3667
|
+
} else {
|
|
3668
|
+
console.log(formatSyncReport(resync, dryRun));
|
|
3669
|
+
}
|
|
3670
|
+
|
|
3671
|
+
// A doc whose source could not be resolved is a broken package — exit
|
|
3672
|
+
// non-zero so a scripted `sync` notices the incomplete contract.
|
|
3673
|
+
const anySkipped = resync.docs.some((d) => d.skipped);
|
|
3674
|
+
|
|
3675
|
+
// 2. The OPTIONAL skills install. Never under --dry-run (a preview writes
|
|
3676
|
+
// nothing). `--add-skills` authorises it directly (bypasses the ask);
|
|
3677
|
+
// otherwise an interactive TTY prompts once, and a non-TTY skips.
|
|
3678
|
+
if (!dryRun) {
|
|
3679
|
+
let doSkills = flags.addSkills === true;
|
|
3680
|
+
if (!doSkills && process.stdin.isTTY) {
|
|
3681
|
+
const scope = flags.local === true ? 'project-local' : 'global';
|
|
3682
|
+
doSkills = await confirmYesNo(
|
|
3683
|
+
`Also (re-)install the packaged dorfl skills into your ${scope} harness dir(s)?`,
|
|
3684
|
+
);
|
|
3685
|
+
}
|
|
3686
|
+
if (doSkills) {
|
|
3687
|
+
const result = installSkills({global: flags.local !== true});
|
|
3688
|
+
console.log(formatSkillsAddReport(result, flags.local === true));
|
|
3689
|
+
} else if (flags.addSkills !== true && !process.stdin.isTTY) {
|
|
3690
|
+
console.error(
|
|
3691
|
+
'>> Skills not installed (non-interactive run; pass --add-skills to install them).',
|
|
3692
|
+
);
|
|
3693
|
+
}
|
|
3694
|
+
}
|
|
3695
|
+
|
|
3696
|
+
if (anySkipped) {
|
|
3697
|
+
process.exit(1);
|
|
3698
|
+
}
|
|
3699
|
+
});
|
|
3700
|
+
|
|
3544
3701
|
program
|
|
3545
3702
|
.command('prd-to-spec')
|
|
3546
3703
|
.helpGroup(ADVANCED_GROUP)
|
package/src/config-override.ts
CHANGED
|
@@ -6,7 +6,7 @@ import {defaultConfigPath, type PartialConfig} from './config.js';
|
|
|
6
6
|
* The **per-machine config override layer** (ADR
|
|
7
7
|
* `per-machine-config-override-layer`): a single file at
|
|
8
8
|
* `<configDir>/config.override.json` (sibling of `config.json`) that overrides
|
|
9
|
-
* the COMMITTED per-repo
|
|
9
|
+
* the COMMITTED per-repo `dorfl.json` but is itself overridden by env
|
|
10
10
|
* and flags. It gives the laptop a stable, file-based, high-precedence per-
|
|
11
11
|
* machine lever symmetric to CI's `DORFL_*` env, fixing "I can't make
|
|
12
12
|
* this checkout override what the repo committed without an env var whose
|
package/src/do-autopick.ts
CHANGED
|
@@ -52,7 +52,7 @@ export interface PerformDoMultiOptions extends SharedDoOptions {
|
|
|
52
52
|
* The per-machine {@link ConfigOverrideMap}. Threaded into the in-place pool
|
|
53
53
|
* scan (`scanRepoPaths`) so the override applies to autopick eligibility just
|
|
54
54
|
* as it does to the single-`do` resolution — WITHOUT it the committed
|
|
55
|
-
*
|
|
55
|
+
* `dorfl.json` silently beats the per-machine override on this path.
|
|
56
56
|
*/
|
|
57
57
|
override?: ConfigOverrideMap;
|
|
58
58
|
/**
|
package/src/do-config.ts
CHANGED
|
@@ -539,7 +539,7 @@ export function doNeedsAgentCmd(config: Config): boolean {
|
|
|
539
539
|
*/
|
|
540
540
|
export const NO_AGENT_CMD_MESSAGE =
|
|
541
541
|
'no harness configured and no agentCmd set — nothing would run. Pass ' +
|
|
542
|
-
'--harness pi (or set harness/agentCmd in
|
|
542
|
+
'--harness pi (or set harness/agentCmd in dorfl.json or global config).';
|
|
543
543
|
|
|
544
544
|
/**
|
|
545
545
|
* The shared up-front message for the PR-INTENT pre-flight refusal: a `propose`
|
package/src/env-config.ts
CHANGED
|
@@ -7,7 +7,7 @@ import {brand, constantCase} from './brand.js';
|
|
|
7
7
|
* A per-machine context (a CI job, a developer's shell) can set ANY {@link Config}
|
|
8
8
|
* key via an `DORFL_*` environment variable WITHOUT committing a file —
|
|
9
9
|
* including the host-only keys (`piBin`, `agentCmd`, …) that the per-repo
|
|
10
|
-
*
|
|
10
|
+
* `dorfl.json` deliberately rejects.
|
|
11
11
|
*
|
|
12
12
|
* Env is a legitimate *per-machine source* — exactly like a CLI flag or the
|
|
13
13
|
* global `~/.config/dorfl/config.json` — so it is NOT subject to the
|
package/src/identity.ts
CHANGED
|
@@ -76,7 +76,7 @@ export interface IdentityProviders {
|
|
|
76
76
|
* A configured runner identity (a bot). The WHOLE block is optional — absent ⇒
|
|
77
77
|
* fully ambient (today's behaviour, byte-for-byte). When present, `auth` is
|
|
78
78
|
* MANDATORY (both transports stated); `name`/`email` default in; `providers` is
|
|
79
|
-
* optional. HOST-ONLY: rejected in a per-repo
|
|
79
|
+
* optional. HOST-ONLY: rejected in a per-repo `dorfl.json` (it carries
|
|
80
80
|
* secrets and is per-machine), so it lives only in the global config.
|
|
81
81
|
*/
|
|
82
82
|
export interface Identity {
|
package/src/install-ci.ts
CHANGED
|
@@ -300,11 +300,11 @@ export async function installCI(
|
|
|
300
300
|
log("CI autonomy is OFF by default (the engine's strict default).");
|
|
301
301
|
log(
|
|
302
302
|
'The emitted advance workflow sets NO DORFL_* gate env, so your\n' +
|
|
303
|
-
' committed
|
|
303
|
+
' committed dorfl.json wins (precedence: flag > env > per-repo > global > default).',
|
|
304
304
|
);
|
|
305
305
|
log('To enable CI autonomy, EITHER:');
|
|
306
306
|
log(
|
|
307
|
-
' - set the gate(s) in
|
|
307
|
+
' - set the gate(s) in `dorfl.json` (applies everywhere), e.g.\n' +
|
|
308
308
|
' { "autoBuild": true, "autoTask": true }',
|
|
309
309
|
);
|
|
310
310
|
log(
|
|
@@ -295,9 +295,9 @@ env:
|
|
|
295
295
|
# ── The engine GATE FAMILY, surfaced as the DORFL_* env block ─────────
|
|
296
296
|
# CI is NOT a special policy surface (ADR ci-config-policy-and-gate-family §5):
|
|
297
297
|
# it runs the SAME engine gates, resolved through flag > env > per-repo > global
|
|
298
|
-
# > default. The SAME
|
|
298
|
+
# > default. The SAME dorfl.json the laptop uses applies here; this env
|
|
299
299
|
# block is the optional CI-only override. Change behaviour by editing these
|
|
300
|
-
# values (or a GitHub repo variable /
|
|
300
|
+
# values (or a GitHub repo variable / dorfl.json key) — NOT by re-running
|
|
301
301
|
# install-ci (ADR §6: install-ci is one-time).
|
|
302
302
|
#
|
|
303
303
|
# \`intake\` itself is GATE-FREE (the explicit invocation is its own
|
package/src/lifecycle-pools.ts
CHANGED
|
@@ -116,7 +116,7 @@ export interface LifecyclePoolGates {
|
|
|
116
116
|
* `LifecyclePoolGates`. Placement acknowledged above; ratified as intentional
|
|
117
117
|
* so the gate colocates with its sibling create-side gates.
|
|
118
118
|
* 4. **`surfaceStaging` in `REPO_ALLOWED_KEYS` is intentional** so a repo's
|
|
119
|
-
*
|
|
119
|
+
* `dorfl.json` can flip it via the normal resolution chain.
|
|
120
120
|
*/
|
|
121
121
|
surfaceStaging?: boolean;
|
|
122
122
|
}
|