devflow-kit 3.7.0 → 3.8.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 +359 -1
- package/README.md +11 -11
- package/dist/agents/code.md +2 -4
- package/dist/agents/design.md +1 -1
- package/dist/agents/fix.md +6 -7
- package/dist/agents/git.md +1 -1
- package/dist/agents/harden.md +1 -1
- package/dist/agents/refactor.md +2 -4
- package/dist/agents/review.md +4 -4
- package/dist/agents/skim.md +2 -2
- package/dist/agents/triage.md +2 -2
- package/dist/cli/commands/capture.js +1 -1
- package/dist/cli/commands/curation-move-io.js +102 -0
- package/dist/cli/commands/curation-move-step.js +374 -0
- package/dist/cli/commands/{learning.js → curation.js} +302 -99
- package/dist/cli/commands/gate-level-prompts.js +426 -0
- package/dist/cli/commands/gates.js +34 -11
- package/dist/cli/commands/init-seed.js +11 -8
- package/dist/cli/commands/init.js +240 -54
- package/dist/cli/commands/memory.js +2 -2
- package/dist/cli/commands/prompt-io.js +37 -0
- package/dist/cli/commands/uninstall.js +81 -9
- package/dist/cli.js +2 -2
- package/dist/commands/bug-analysis.md +24 -35
- package/dist/commands/code-review.md +32 -36
- package/dist/commands/debug.md +4 -4
- package/dist/commands/dynamic-build.md +25 -24
- package/dist/commands/dynamic-plan.md +4 -4
- package/dist/commands/dynamic-profile.md +4 -4
- package/dist/commands/dynamic-tickets.md +4 -4
- package/dist/commands/explore.md +5 -5
- package/dist/commands/implement.md +52 -81
- package/dist/commands/plan.md +5 -5
- package/dist/commands/release.md +4 -4
- package/dist/commands/research.md +5 -5
- package/dist/commands/resolve.md +28 -30
- package/dist/commands/self-review.md +4 -12
- package/dist/core/assets.js +20 -20
- package/dist/core/curate-tuning-config.js +5 -6
- package/dist/core/curation-move-notice.js +84 -0
- package/dist/core/curation-move-skip.js +36 -0
- package/dist/core/curation-move.js +35 -0
- package/dist/core/curation-queue-cleanup.js +134 -0
- package/dist/core/curation-store.js +98 -0
- package/dist/core/{learning-variants.js → curation-variants.js} +65 -41
- package/dist/core/echo-value.js +11 -5
- package/dist/core/evidence-policy.js +1 -1
- package/dist/core/feature-switch.js +95 -19
- package/dist/core/fs-atomic.js +1 -1
- package/dist/core/gate-level.js +10 -2
- package/dist/core/git.js +16 -14
- package/dist/core/ledger-root.js +82 -22
- package/dist/core/linked-path.js +4 -4
- package/dist/core/manifest-lock.js +238 -0
- package/dist/core/manifest.js +58 -14
- package/dist/core/migrations.js +1 -13
- package/dist/core/observations.js +2 -2
- package/dist/core/plugins.js +15 -15
- package/dist/core/pool.js +26 -0
- package/dist/core/project-paths.js +103 -34
- package/dist/core/queue-drain.js +2 -2
- package/dist/core/tracked-areas.js +35 -0
- package/dist/core/tracker.js +1 -1
- package/dist/{learning-off → curation-off}/agents/code.md +2 -4
- package/dist/{learning-off → curation-off}/agents/fix.md +6 -7
- package/dist/{learning-off → curation-off}/agents/refactor.md +2 -4
- package/dist/{learning-off → curation-off}/agents/review.md +3 -3
- package/dist/{learning-off → curation-off}/agents/triage.md +1 -1
- package/dist/{learning-off → curation-off}/commands/bug-analysis.md +20 -31
- package/dist/{learning-off → curation-off}/commands/code-review.md +29 -33
- package/dist/{learning-off → curation-off}/commands/debug.md +1 -1
- package/dist/{learning-off → curation-off}/commands/dynamic-build.md +22 -21
- package/dist/{learning-off → curation-off}/commands/explore.md +1 -1
- package/dist/{learning-off → curation-off}/commands/implement.md +49 -78
- package/dist/{learning-off → curation-off}/commands/plan.md +1 -1
- package/dist/{learning-off → curation-off}/commands/resolve.md +25 -27
- package/dist/{learning-off → curation-off}/commands/self-review.md +1 -9
- package/dist/hud/components/{learning-counts.js → curation-counts.js} +36 -17
- package/dist/hud/config.js +1 -1
- package/dist/hud/index.js +6 -6
- package/dist/hud/render.js +3 -3
- package/dist/skills/git/references/pr/validate-branch.md +8 -5
- package/dist/skills/git/references/tracker/github/ensure-pr-ready.md +13 -5
- package/dist/skills/git/references/tracker/jira/ensure-pr-ready.md +13 -5
- package/dist/skills/git/references/tracker/linear/ensure-pr-ready.md +13 -5
- package/dist/targets/claude-code/{learning-install.js → curation-install.js} +85 -65
- package/dist/targets/claude-code/installer.js +15 -15
- package/dist/targets/claude-code/language-stamp.js +5 -5
- package/dist/targets/claude-code/post-install.js +2 -2
- package/dist/targets/claude-code/tracker-servers.js +1 -1
- package/package.json +3 -2
- package/src/assets/agents/_partials/_code.mds +11 -11
- package/src/assets/agents/code.mds +2 -2
- package/src/assets/agents/curate.md +8 -8
- package/src/assets/agents/debug.mds +6 -6
- package/src/assets/agents/design.mds +18 -18
- package/src/assets/agents/fix.mds +6 -5
- package/src/assets/agents/git.mds +1 -1
- package/src/assets/agents/harden.mds +7 -7
- package/src/assets/agents/knowledge.mds +23 -23
- package/src/assets/agents/refactor.mds +2 -2
- package/src/assets/agents/research.mds +15 -15
- package/src/assets/agents/review.mds +43 -43
- package/src/assets/agents/skim.mds +11 -11
- package/src/assets/agents/triage.mds +22 -22
- package/src/assets/agents/validate.md +13 -26
- package/src/assets/commands/_partials/_decisions.mds +13 -13
- package/src/assets/commands/_partials/_engine.mds +8 -8
- package/src/assets/commands/_partials/_knowledge.mds +29 -15
- package/src/assets/commands/_partials/_preamble.mds +4 -4
- package/src/assets/commands/_partials/_settings.mds +2 -2
- package/src/assets/commands/_partials/_wave.mds +7 -7
- package/src/assets/commands/bug-analysis.mds +37 -48
- package/src/assets/commands/code-review.mds +46 -50
- package/src/assets/commands/debug.mds +14 -14
- package/src/assets/commands/dynamic-build.mds +38 -37
- package/src/assets/commands/dynamic-plan.mds +22 -22
- package/src/assets/commands/dynamic-profile.mds +2 -2
- package/src/assets/commands/dynamic-tickets.mds +8 -8
- package/src/assets/commands/explore.mds +20 -20
- package/src/assets/commands/implement.mds +77 -98
- package/src/assets/commands/plan.mds +27 -27
- package/src/assets/commands/release.mds +12 -12
- package/src/assets/commands/research.mds +19 -19
- package/src/assets/commands/resolve.mds +56 -50
- package/src/assets/commands/self-review.mds +20 -20
- package/src/assets/mds/git/_ops.mds +3 -1
- package/src/assets/mds/git/_ops_pr.mds +1 -1
- package/src/assets/mds/git/_ops_steps.mds +10 -4
- package/src/assets/mds/git/_pr.mds +7 -4
- package/src/assets/rules/quality.md +1 -0
- package/src/assets/scripts/hooks/background-memory-update +2 -2
- package/src/assets/scripts/hooks/capture-prompt +12 -12
- package/src/assets/scripts/hooks/capture-question +11 -11
- package/src/assets/scripts/hooks/capture-turn +12 -12
- package/src/assets/scripts/hooks/{learning-lock → curation-lock} +2 -2
- package/src/assets/scripts/hooks/curation-move +293 -0
- package/src/assets/scripts/hooks/ensure-devflow-init +45 -13
- package/src/assets/scripts/hooks/ensure-proxy +4 -4
- package/src/assets/scripts/hooks/ensure-root-gitignore +4 -4
- package/src/assets/scripts/hooks/git-marker +81 -0
- package/src/assets/scripts/hooks/json-helper.cjs +134 -51
- package/src/assets/scripts/hooks/json-parse +1 -1
- package/src/assets/scripts/hooks/lib/curation-move.cjs +1582 -0
- package/src/assets/scripts/hooks/lib/{learning-store.cjs → curation-store.cjs} +242 -118
- package/src/assets/scripts/hooks/lib/decisions-format.cjs +3 -3
- package/src/assets/scripts/hooks/lib/mkdir-lock.cjs +24 -7
- package/src/assets/scripts/hooks/lib/project-paths.cjs +132 -39
- package/src/assets/scripts/hooks/lib/render-decisions.cjs +34 -22
- package/src/assets/scripts/hooks/lib/tracked-areas.cjs +259 -0
- package/src/assets/scripts/hooks/memory-worker +1 -1
- package/src/assets/scripts/hooks/pre-compact-memory +6 -16
- package/src/assets/scripts/hooks/queue-append +228 -103
- package/src/assets/scripts/hooks/resolve-project-root +2 -2
- package/src/assets/scripts/hooks/session-start-context +143 -69
- package/src/assets/scripts/hooks/session-start-memory +3 -43
- package/src/assets/scripts/lib/project-config.cjs +12 -5
- package/src/assets/scripts/resolve-base.cjs +1043 -0
- package/src/assets/scripts/resolve-settings.cjs +42 -18
- package/src/assets/skills/agent-references/SKILL.md +5 -2
- package/src/assets/skills/agent-references/references/commands/implement-levels.md +27 -0
- package/src/assets/skills/agent-references/references/commands/implement-revalidate.md +6 -4
- package/src/assets/skills/agent-references/references/commands/resolve-levels.md +24 -0
- package/src/assets/skills/apply-decisions/SKILL.md +1 -1
- package/src/assets/skills/docs-framework/SKILL.md +7 -7
- package/src/assets/skills/docs-framework/references/patterns.md +3 -4
- package/src/assets/skills/quality-gates/SKILL.md +1 -1
- package/src/assets/skills/worktree-support/references/roots.md +2 -2
- package/templates/lint-pack/.lint-pack.conf +86 -0
- package/templates/lint-pack/README.md +190 -0
- package/templates/lint-pack/lint-pack.sh +905 -0
- package/dist/core/learning-queue-cleanup.js +0 -27
- package/dist/core/learning-store.js +0 -61
- /package/dist/{learning-off → curation-off}/agents/debug.md +0 -0
- /package/dist/{learning-off → curation-off}/agents/design.md +0 -0
- /package/dist/{learning-off → curation-off}/agents/harden.md +0 -0
- /package/dist/{learning-off → curation-off}/agents/knowledge.md +0 -0
- /package/dist/{learning-off → curation-off}/agents/research.md +0 -0
- /package/dist/{learning-off → curation-off}/agents/skim.md +0 -0
- /package/dist/{learning-off → curation-off}/commands/dynamic-plan.md +0 -0
- /package/dist/{learning-off → curation-off}/commands/dynamic-profile.md +0 -0
- /package/dist/{learning-off → curation-off}/commands/dynamic-tickets.md +0 -0
- /package/dist/{learning-off → curation-off}/commands/release.md +0 -0
- /package/dist/{learning-off → curation-off}/commands/research.md +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,363 @@ All notable changes to Devflow will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [3.8.0] - 2026-10-21
|
|
9
|
+
|
|
10
|
+
### Upgrade notes — Curation rename
|
|
11
|
+
|
|
12
|
+
The learning feature is now called curation ([#529](https://github.com/dean0x/devflow/issues/529)).
|
|
13
|
+
This is a breaking change. It releases as a minor version (3.8.0).
|
|
14
|
+
Devflow keeps no alias for the old command and the old init flags. The old switch keys stay readable, as the table shows. Read the steps that you must do by hand.
|
|
15
|
+
|
|
16
|
+
**Superseding statement for 3.6.0:** The 3.6.0 notes say that `devflow learning`, `features.learning`,
|
|
17
|
+
`.devflow/learning/` and the learning ops do not change. That statement is no longer true.
|
|
18
|
+
This release changes all of them. The 3.6.0 text stays as released.
|
|
19
|
+
|
|
20
|
+
**What you must do:**
|
|
21
|
+
- Run `devflow init` after you update.
|
|
22
|
+
- Replace `devflow learning` and the old init flags in your scripts.
|
|
23
|
+
- Delete each backup folder after `devflow curation --status` shows 0 pending rows for it.
|
|
24
|
+
A backup made on re-upgrade can hold the only copy of entries that 3.7 wrote. Check them before you delete it.
|
|
25
|
+
- Delete the leftover `.devflow/learning/` folder in each linked worktree whose main checkout has a `.devflow/` folder
|
|
26
|
+
and is not your home folder.
|
|
27
|
+
A worktree whose main checkout has no `.devflow/` folder, or is your home folder, keeps a live ledger.
|
|
28
|
+
That ledger moves like any project.
|
|
29
|
+
- Run `devflow curation --enable` if the machine switch is off and you want it on.
|
|
30
|
+
|
|
31
|
+
**Renamed names:**
|
|
32
|
+
|
|
33
|
+
| Old name | New name |
|
|
34
|
+
|----------|----------|
|
|
35
|
+
| `devflow learning` | `devflow curation` |
|
|
36
|
+
| `devflow init --learning` and `--no-learning` | `devflow init --curation` and `--no-curation` |
|
|
37
|
+
| `features.learning` in `~/.devflow/manifest.json` | `features.curation` (the old key stays as a mirror) |
|
|
38
|
+
| `features.learning` in a repository `project.json` or `config.json` | `features.curation` (the old key is still read) |
|
|
39
|
+
| `.devflow/learning/` | `.devflow/curation/` |
|
|
40
|
+
| `learning.json` (in the project folder and in `~/.devflow/`) | `curation.json` |
|
|
41
|
+
| Settings line field `LEARNING=` | `CURATION=` |
|
|
42
|
+
| Prompt markers `<!-- learning:on -->` and the build output `dist/learning-off/` | `<!-- curation:on -->` and `dist/curation-off/` |
|
|
43
|
+
| HUD label `Learning:` | `Curation:` |
|
|
44
|
+
| Session start headers `--- LEARNING MAINTENANCE ---` and `--- LEARNING PAUSED ---` | `--- CURATION MAINTENANCE ---` and `--- CURATION PAUSED ---` |
|
|
45
|
+
| Hook files `learning-lock` and `lib/learning-store.cjs` | `curation-lock` and `lib/curation-store.cjs` (init removes the old files) |
|
|
46
|
+
|
|
47
|
+
These names do not change: the `self-learning:` source stamp in rendered rows, the design-decision IDs,
|
|
48
|
+
the `decisions-*.jsonl` files, the `apply-decisions` skill, the learn-conventions family and the
|
|
49
|
+
`agents.learning.model` key (it stays an older name for the Curate agent model).
|
|
50
|
+
|
|
51
|
+
**Breaking change:**
|
|
52
|
+
- `devflow learning`, `devflow init --learning` and `devflow init --no-learning` now fail.
|
|
53
|
+
They give the unknown command or option error, and the exit code is 1.
|
|
54
|
+
- Change every script, alias and note that uses an old name.
|
|
55
|
+
|
|
56
|
+
**What the migration does:**
|
|
57
|
+
- `devflow init` moves the learning data of each project that it finds, and of the project where you run it.
|
|
58
|
+
The move takes the ledger files, the queue and the project tuning file. Entry IDs do not change.
|
|
59
|
+
Devflow renders the index again at the new path.
|
|
60
|
+
- Init also renames `~/.devflow/learning.json` to `curation.json`.
|
|
61
|
+
If both names exist, the new one wins, the old one stays, and init logs one line.
|
|
62
|
+
- The session start hook makes the same move for the project of each session.
|
|
63
|
+
It also runs when the curation switch is off.
|
|
64
|
+
- If a project already has both folders, one rule decides which folder stays.
|
|
65
|
+
If `.devflow/curation/` has a non-empty log, it wins and the old folder becomes the backup.
|
|
66
|
+
If not, the old ledger set moves in and the rest of the old folder becomes the backup.
|
|
67
|
+
Devflow never merges one ledger into the other.
|
|
68
|
+
- After an upgrade, the first `devflow` command that loads the whole manifest
|
|
69
|
+
(for example `devflow init` or `devflow flags --status`) heals `~/.devflow/manifest.json`.
|
|
70
|
+
The file then carries both `features.curation` and `features.learning` with the same value.
|
|
71
|
+
Every later write keeps the two keys equal.
|
|
72
|
+
The `--status` commands of curation, memory, knowledge and gates write nothing.
|
|
73
|
+
|
|
74
|
+
**Upgrade, downgrade and re-upgrade:**
|
|
75
|
+
- Upgrade: run `devflow init` (a full init, not `--hud-only`). Until you do, the installed prompts and agents are still the old version.
|
|
76
|
+
`devflow init --hud-only` and a plugin-only update install the new hooks and settings script, but not the new prompts.
|
|
77
|
+
The old prompts do not accept the `CURATION=` field, so they use their fail-closed settings until you run a full `devflow init`.
|
|
78
|
+
- Downgrade to 3.7: 3.7 does not read `.devflow/curation/`. It starts a new empty ledger in `.devflow/learning/`.
|
|
79
|
+
Your moved data stays in `.devflow/curation/`. The mirror key `features.learning` keeps a 3.8 opt-out in force.
|
|
80
|
+
- Re-upgrade to 3.8: the next init or session start finds both folders and applies the rule above.
|
|
81
|
+
When the folder `.devflow/curation/` has a non-empty log, it wins.
|
|
82
|
+
The queue rows of the 3.7 folder merge into the winner. The entries that 3.7 wrote stay in the backup only.
|
|
83
|
+
- The Curate model in the global tuning file: init renames `~/.devflow/learning.json` to `~/.devflow/curation.json`,
|
|
84
|
+
and 3.7 reads only the old name. After a downgrade, set the Curate model again with `devflow learning --configure`.
|
|
85
|
+
Choose the global scope. On re-upgrade, an existing `curation.json` wins and init logs one line.
|
|
86
|
+
To keep a value that you set on 3.7, delete `curation.json` first.
|
|
87
|
+
|
|
88
|
+
**The machine switch:**
|
|
89
|
+
- If `features.curation` and `features.learning` in the manifest disagree, the switch is off.
|
|
90
|
+
A reader never treats a disagreement as on.
|
|
91
|
+
- To turn it on again, run `devflow curation --enable`. This writes both keys.
|
|
92
|
+
- A 3.7 toggle writes only the old key. An opt-out made on 3.7 stays in force after you upgrade again.
|
|
93
|
+
If you ran no 3.7 `devflow init`, an enable made on 3.7 after a 3.8 disable stays off until you run `devflow curation --enable`.
|
|
94
|
+
- A 3.7 `devflow init` removes the key `features.curation`. After that, only the old key carries the opt-out.
|
|
95
|
+
A 3.7 enable made after that init then takes effect when you upgrade again.
|
|
96
|
+
- Between the package update and `devflow init`, `devflow curation --enable` and `--disable` write both keys
|
|
97
|
+
and move nothing. Only `--disable` drains the queue among these toggles. The commands `--restore`, `--clear`, `--reset`
|
|
98
|
+
and `--configure` (project scope) refuse until you run `devflow init`.
|
|
99
|
+
|
|
100
|
+
**The backup:**
|
|
101
|
+
- Where: `.devflow/learning.backup-<stamp>-<8 hex>` in the project, one folder for each move.
|
|
102
|
+
A move makes a backup only where a project had both folders.
|
|
103
|
+
- No devflow command deletes a backup, except `devflow uninstall`.
|
|
104
|
+
Uninstall removes the backups of the project at the git root of your current directory, with that project's data, after you confirm.
|
|
105
|
+
`devflow curation --reset` and `devflow curation --clear` leave the backup in place.
|
|
106
|
+
- A disable drains the queue files in the backups. `devflow curation --disable`, and `devflow init` with curation switched off,
|
|
107
|
+
remove the queue, claim, private and overflow files in each backup folder (at most 500 folders, and 200 files in each).
|
|
108
|
+
The ledger files, the swept files and the claim owner file stay in the backup.
|
|
109
|
+
Without this drain, a later `--enable` and init would merge those rows into the live queue.
|
|
110
|
+
The drain deletes nothing when a backup folder, or one of its queue files, is a symbolic link, and it says so.
|
|
111
|
+
The drain also deletes nothing when git tracks any entry under a data folder or a backup folder, or when a `.git` entry stands and git does not answer.
|
|
112
|
+
It then prints the notice that the git check shows (see Outcomes that need action).
|
|
113
|
+
If the backups cannot be listed for another reason, the drain still removes the queue files of the live and the old folder, and prints a warning that the backups were not drained.
|
|
114
|
+
- `devflow curation --status` prints one `Backup:` line for each backup folder.
|
|
115
|
+
The line shows how many pending rows the backup still holds.
|
|
116
|
+
For the first 50 folders it prints one line each. One more line counts the folders from the 51st to the 500th and their pending rows.
|
|
117
|
+
If there are more than 500 backup folders, a last line counts the folders after the 500th. Status does not read them, and no init or drain reaches them.
|
|
118
|
+
- Delete a backup folder only when `devflow curation --status` shows 0 pending rows for it.
|
|
119
|
+
Until then, a later init can still merge the rows.
|
|
120
|
+
A backup made on re-upgrade can hold the only copy of entries that 3.7 wrote. Check them before you delete it.
|
|
121
|
+
- An init merges rows from at most 50 backup folders in one run. It passes over a folder that holds no pending rows,
|
|
122
|
+
so a later folder is reached when the earlier ones are done.
|
|
123
|
+
|
|
124
|
+
**The queue cap:**
|
|
125
|
+
- A merge fills a pending queue up to 100 lines and no further.
|
|
126
|
+
A capture trim keeps the newest 100 lines and starts only above 200 lines, so a merge never causes a trim.
|
|
127
|
+
- Rows that do not fit wait in overflow files in the backup. A later init merges them as room appears.
|
|
128
|
+
Status counts them as pending rows, so the delete step waits for zero pending rows.
|
|
129
|
+
- The move drops no row, and it never causes a trim.
|
|
130
|
+
A queue that holds more than 200 lines is still trimmed to its newest 100 lines when a capture arrives.
|
|
131
|
+
This is the rule from before 3.8.0, and the move does not change it.
|
|
132
|
+
- `devflow init` drains the queue of a project where curation is off, as it did before 3.8.0.
|
|
133
|
+
|
|
134
|
+
**Outcomes that need action:**
|
|
135
|
+
- Busy: another run holds the move lock. Init prints `Ledger move skipped for <root>: a lock is held.`
|
|
136
|
+
A curation command prints `Another run is moving this project's curation data.`
|
|
137
|
+
Nothing is written. Wait a moment, then run the command again. A session start retries by itself.
|
|
138
|
+
When a queue claim holds the move, init prints `Ledger move skipped for <root>: a queue claim holds the move.`
|
|
139
|
+
A curation command prints `A Curate run holds this project's curation queue, and the move waits for it.`
|
|
140
|
+
The move runs after Curate finishes, which can take up to 15 minutes. Run the command again after that.
|
|
141
|
+
- Refused: a symbolic link sits on the path, or a private, swept or overflow queue file sits directly in the old folder.
|
|
142
|
+
Nothing moves. Init prints `Ledger move refused for <root>`.
|
|
143
|
+
The HUD and `devflow curation --status` print `Curation: move refused, see the hook log`.
|
|
144
|
+
Remove the cause, then run `devflow init` or start a new session.
|
|
145
|
+
- Skipped by the git check: git tracks any entry under `.devflow/learning/`, `.devflow/curation/` or a backup folder
|
|
146
|
+
(`.devflow/learning.backup-*`), or tracks an entry named `.devflow` ([#598](https://github.com/dean0x/devflow/issues/598)). The same outcome applies when a `.git` entry stands and git does not answer.
|
|
147
|
+
Nothing in the project changes. Init prints `Ledger move skipped for <root>` and a fixed notice that holds nothing from the repository.
|
|
148
|
+
The HUD prints `Curation: move skipped, git tracks files in the .devflow data folders`
|
|
149
|
+
or `Curation: move skipped, git did not answer`.
|
|
150
|
+
`devflow curation --status`, `--list` and `--show` print the whole notice. The HUD and these commands print the skip also when `.devflow/curation/` exists.
|
|
151
|
+
While the old folder is there, `--restore`, `--clear`, `--reset` and `--configure` (project scope) print the notice, change nothing and exit 1.
|
|
152
|
+
`--enable` and `--disable` print the notice as a warning, and their exit code does not change.
|
|
153
|
+
`--disable`, `--clear` and an init with curation off delete no queue file in these cases, and each prints the notice once.
|
|
154
|
+
When init has printed the notice in its `Ledger move skipped for <root>` line, its drain adds only `The curation queue was not drained.`
|
|
155
|
+
When git tracks files, the notice tells you to run `git ls-files .devflow`, and then `git rm --cached <file>`, in the checkout that holds the folders.
|
|
156
|
+
When git does not answer, the notice tells you to check that git runs in the project. The move runs again at the next session start or the next init.
|
|
157
|
+
A session start runs the check again in both cases.
|
|
158
|
+
- Not yet moved: `devflow curation --status`, `--list`, `--show` and the HUD print
|
|
159
|
+
`Curation: run devflow init, or open Claude Code in this project after it`.
|
|
160
|
+
They do not read the old folder.
|
|
161
|
+
- Failed: init prints `Ledger move failed for <root>` and copies nothing. The next init tries again.
|
|
162
|
+
A move that fails at session start shows the same `Curation: move refused, see the hook log` line as a refusal.
|
|
163
|
+
The hook log names the cause. The next session start tries again.
|
|
164
|
+
- Skipped, no repository: git did not name the project's repository within one second, for example on a hung mount.
|
|
165
|
+
Init prints `Ledger move skipped for <root>: git did not answer in time.` and does not count the project as moved.
|
|
166
|
+
The other projects move. The next init tries again, and a session start in the project moves it too.
|
|
167
|
+
|
|
168
|
+
**What stays behind:**
|
|
169
|
+
- Reach: a project that neither `devflow init` nor a Claude Code session reaches keeps its old
|
|
170
|
+
`.devflow/learning/` folder untouched. It moves at its next session start.
|
|
171
|
+
- Linked worktrees: if the main checkout has a `.devflow/` folder and is not your home folder,
|
|
172
|
+
the ledger of a linked worktree is the ledger of the main checkout.
|
|
173
|
+
Devflow does not move a `.devflow/learning/` folder that sits inside that worktree.
|
|
174
|
+
Delete that leftover folder by hand when you do not need it.
|
|
175
|
+
If the main checkout does not meet this condition, the `.devflow/learning/` folder of the worktree is a live ledger.
|
|
176
|
+
It moves like any project.
|
|
177
|
+
- First session: the first session start in a project with an old folder runs the move.
|
|
178
|
+
This adds a short delay to that one start. Later starts add nothing.
|
|
179
|
+
|
|
180
|
+
**Mixed-version teams:**
|
|
181
|
+
- A 3.7 install reads only `features.learning` in a committed `.devflow/project.json`.
|
|
182
|
+
A 3.8 install reads both keys and narrows when either key is `false`.
|
|
183
|
+
- Keep the old key in committed files, or set both keys, until every team member runs 3.8.
|
|
184
|
+
|
|
185
|
+
### Upgrade notes — Lint pack
|
|
186
|
+
|
|
187
|
+
**Stale-install window:**
|
|
188
|
+
- Until you run `devflow init`, the installed `/implement` and Validate do not run the lint pack.
|
|
189
|
+
|
|
190
|
+
### Upgrade notes — Base resolver
|
|
191
|
+
|
|
192
|
+
The base resolver ([#495](https://github.com/dean0x/devflow/issues/495)) adds stops and a script call.
|
|
193
|
+
Do the step below after you update.
|
|
194
|
+
|
|
195
|
+
**What you must do:**
|
|
196
|
+
- Run `devflow init` after you update. A full init installs `resolve-base.cjs` and the updated commands.
|
|
197
|
+
|
|
198
|
+
**Stops:**
|
|
199
|
+
- `/implement` stops when no usable base exists, for example in a shallow clone without the base history. `/code-review` and `/bug-analysis` stop in that case on a full-range run. The message names the cause and the fix: `git fetch --unshallow`, `git fetch origin <base>`, or a re-run (and `devflow init` if the re-run repeats the stop).
|
|
200
|
+
- The same three commands stop on a base branch name outside the allowed set, or one that git refuses. The message states the set.
|
|
201
|
+
- In `/code-review` multi-worktree mode, a rejected base blocks only that worktree.
|
|
202
|
+
- `/code-review` and `/bug-analysis` stop when the branch name does not fit the allowed characters and length. The message states the allowed characters. In `/code-review` multi-worktree mode, this blocks only that worktree.
|
|
203
|
+
- The Git agent's `validate-branch` returns BLOCKED in the same cases. `/resolve` takes its branch diff from it.
|
|
204
|
+
- The Git agent's `ensure-pr-ready` stops only on a base name outside the allowed set, or one that git refuses. For any other base stop it prints `TRACEABILITY: DEGRADED (base {REASON}; fix: {fix})` and goes on.
|
|
205
|
+
- `/dynamic-build`: a ticket whose setup reports no base commit stops with the `base-missing` escalation. Check the setup output, then re-run.
|
|
206
|
+
|
|
207
|
+
**New resolver call:**
|
|
208
|
+
- `ensure-pr-ready` calls `resolve-base.cjs` in `pr` mode with the base branch of the PR, or with the default branch when no PR applies. The call makes at most one fetch of the base branch.
|
|
209
|
+
- `/implement` passes the base ref that it resolved in Phase 1, so a normal `/implement` run makes one fetch.
|
|
210
|
+
- The `/dynamic-build` wave PR step runs `ensure-pr-ready` with no base ref, so that step makes this call.
|
|
211
|
+
- The base resolver reads the base name from standard input (`--name-stdin`), so the name is not part of shell command text ([#561](https://github.com/dean0x/devflow/issues/561)).
|
|
212
|
+
- The Git agent's `ensure-pr-ready` and `validate-branch` write the base name to a file. The step checks the status of both `gh` calls. It treats `gh` as failed when either status is not 0.
|
|
213
|
+
- In `ensure-pr-ready` and `validate-branch`, a name file whose only content is an empty line counts as empty. The default-branch path then takes `main`, or else `master`.
|
|
214
|
+
- `validate-branch` takes the default branch as the base when no PR applies: the branch has none, `gh` is missing or logged out, or the repository has no GitHub remote.
|
|
215
|
+
|
|
216
|
+
**Stale-install window:**
|
|
217
|
+
- Until you run `devflow init`, the installed commands and Git agent do not call the resolver.
|
|
218
|
+
|
|
219
|
+
**Known limits:**
|
|
220
|
+
- A fetch that stops at its 45-second bound can leave a `refs/remotes/origin/<name>.lock` file in the git directory. Later runs then report `fetch-failed` until you delete the file.
|
|
221
|
+
- The fetch needs git 2.29 or newer. With an older git, every run reports `fetch-failed` and prints the base warning.
|
|
222
|
+
- The fetch runs no askpass program. Where an askpass program is the only credential source, a remote that needs credentials gives `fetch-failed` on every run, with the base warning.
|
|
223
|
+
|
|
224
|
+
### Upgrade notes — Review markers
|
|
225
|
+
|
|
226
|
+
**What changes:**
|
|
227
|
+
- Incremental review and analysis markers are stored under the git directory of each worktree; the first run after the update covers the full branch.
|
|
228
|
+
|
|
229
|
+
### Upgrade notes — Review ranges
|
|
230
|
+
|
|
231
|
+
**What changes:**
|
|
232
|
+
- `/dynamic-build`: in single-ticket mode, the review covers the diff from the commit the ticket branch was forked from to HEAD. On a non-default start branch, that is the ticket's own commits.
|
|
233
|
+
- `/dynamic-build`: the wave evidence step lists the changed files with a diff from the base ref of the wave PR. The base ref must be a commit ID of 40 or 64 lowercase hex digits, and the diff must exit 0. If not, the step is skipped, and the run summary holds `TRACEABILITY: DEGRADED (wave base unusable)`.
|
|
234
|
+
- A Review agent with no patch file and no usable diff range returns `reviewed: false`. After one retry, the engine records a coverage gap, and the run verdict is never PASS.
|
|
235
|
+
|
|
236
|
+
### Upgrade notes — Level readers
|
|
237
|
+
|
|
238
|
+
**Stale-install window:**
|
|
239
|
+
- If an installed `/implement` or `/resolve` is newer than its installed level reference, the reference stays unreadable until you run `devflow init`.
|
|
240
|
+
|
|
241
|
+
### Upgrade notes — Polish by level
|
|
242
|
+
|
|
243
|
+
**What you must do:**
|
|
244
|
+
- The default level, `standard`, now skips Polish in `/implement` and `/resolve`. Run `devflow gates --set full` to keep Polish.
|
|
245
|
+
- A quality rule that you keep at `~/.devflow/rules/quality.md` replaces the shipped one. At `standard` and `lean`, you then lose Polish and do not get the new bullet. Add the bullet to your copy. Or run `devflow rules unshadow quality`, which deletes your copy, and then run `devflow init`.
|
|
246
|
+
|
|
247
|
+
**Stale-install window:**
|
|
248
|
+
- Until you run `devflow init`, your install has no level row that skips Polish, so Polish still runs at every level. An install from 3.7.0 has no level reference at all. The installed quality rule also lacks its new bullet.
|
|
249
|
+
|
|
250
|
+
### Upgrade notes — Harden by level
|
|
251
|
+
|
|
252
|
+
**What you must do:**
|
|
253
|
+
- At `lean`, `/implement` now skips Harden on a docs-only diff. Run `devflow gates --set standard` or `--set full` to keep Harden on every diff.
|
|
254
|
+
|
|
255
|
+
**Stale-install window:**
|
|
256
|
+
- Until you run `devflow init`, your installed level reference has no Harden row, so Harden runs at every level.
|
|
257
|
+
|
|
258
|
+
### Added
|
|
259
|
+
|
|
260
|
+
- **`devflow init` asks for the gate level** ([#543](https://github.com/dean0x/devflow/issues/543), [#507](https://github.com/dean0x/devflow/issues/507)).
|
|
261
|
+
- `devflow gates --set <level>` and `devflow init` set the machine gate level, so a user who runs `init` learns that the level exists.
|
|
262
|
+
An interactive `init` asks for it: `full`, `standard` or `lean`, each with a one-line effect.
|
|
263
|
+
On a first install the prompt starts on `standard`.
|
|
264
|
+
On a re-init it shows the current value and starts on it, so Enter keeps a valid level.
|
|
265
|
+
A malformed or `null` stored value starts the prompt on `full`, and if you accept it, init writes `full` in its place. The machine level that applies does not change.
|
|
266
|
+
- `devflow init --gate-level <full|standard|lean>` sets the machine level with no prompt, in an interactive or a non-interactive run.
|
|
267
|
+
A bad value, or no value, exits 1 before `init` writes anything and names the valid levels. The flag cannot be combined with `--hud-only`.
|
|
268
|
+
`devflow init --recommended` and a non-interactive `init` show no prompt and keep the stored value.
|
|
269
|
+
- The Recommended settings note has a `Gate level:` row.
|
|
270
|
+
The summary at the end of `init` shows the level that is set, and adds `(was X)` when the run changes the machine level that applies.
|
|
271
|
+
`init` writes the same machine default as `devflow gates --set`, and a personal `gateLevel` in a repository's `.devflow/config.json` still wins there.
|
|
272
|
+
- If `~/.devflow/manifest.json` is valid JSON with a `features` object that devflow rejects (a field is missing or mistyped, or a byte-order mark leads), a promptless `init` and `init --hud-only` keep the gate level stored in it, as it is stored, and warn that they kept the level while they replaced the file.
|
|
273
|
+
When the prompt runs, your answer is the level. If you accept a malformed or `null` value, init writes `full`.
|
|
274
|
+
- If the manifest is corrupt, is not JSON, has no `features` object, or is over 1 MiB and also one that devflow rejects, `init` cannot read the level.
|
|
275
|
+
The prompt shows `Current setting: unknown` and starts on `standard`.
|
|
276
|
+
A promptless `init` or `init --hud-only` records no level and warns that `standard` applies and that `devflow gates --set <level>` sets it again.
|
|
277
|
+
`devflow gates --status` words its manifest warning for each case.
|
|
278
|
+
- `devflow init --reset` removes the stored level, and over a rejected manifest the summary names the level it removed, as in `(was full)`.
|
|
279
|
+
A bare `devflow gates --set` names the levels in its error, as `devflow init --gate-level` does.
|
|
280
|
+
- **A lint pack template, and a lean lint pack in Validate** ([#475](https://github.com/dean0x/devflow/issues/475)).
|
|
281
|
+
- The package ships a template in `templates/lint-pack/`: a script, an example config and a README.
|
|
282
|
+
You copy it into your repository and own the copy.
|
|
283
|
+
devflow does not install, update or run the template itself.
|
|
284
|
+
- At `lean`, Phase 6 of `/implement` has Validate run your root `lint-pack` script last, after the build, typecheck, lint and test commands pass.
|
|
285
|
+
Validate finds it as a `package.json` script, else as a `Makefile` target.
|
|
286
|
+
The script reads the lines the branch changed.
|
|
287
|
+
It finds a removed flag that a doc still names, a plan ID or a tombstone phrase in new text, and an oversized function (through your own linter).
|
|
288
|
+
A match fails validation and reaches Fix as a file and line reference.
|
|
289
|
+
- Fix does not edit the lint pack, its config, its build-file entry or any `.gitattributes` to clear a match.
|
|
290
|
+
Fix does not silence the linter to clear a match, with a disable comment or a linter-config change.
|
|
291
|
+
It reports the match under Blockers.
|
|
292
|
+
To clear a match that you judge false, add an allow glob to `.lint-pack.conf`, commit it, and ask `/implement` to re-validate.
|
|
293
|
+
- A pack error does not change the validation result.
|
|
294
|
+
A git older than 2.30, a config that the script cannot read, a linter that did not run and a run that a timeout stops are pack errors, never a clean run.
|
|
295
|
+
A pack error reads `UNVERIFIED` in the `/implement` final report and in the Testing part of the PR body.
|
|
296
|
+
The pack also prints a `pack-changed` line for a changed build-file line in the compared range that names `lint-pack` or `BASE`, a `pack-dirty` line for an uncommitted change to a pack file, and the base it compared.
|
|
297
|
+
Known limit: the pack prints the base it compared (`base <sha>`), but Validate does not check that base yet, and issue [#537](https://github.com/dean0x/devflow/issues/537) adds that check.
|
|
298
|
+
If the project has no `lint-pack` script or target, Validate prints one "not configured" line.
|
|
299
|
+
- The re-validation that you ask `/implement` for runs the pack.
|
|
300
|
+
The re-validation after QA fixes, `/resolve`, `/self-review`, `/release` and `/dynamic-build` do not run it, and no level below `lean` runs it.
|
|
301
|
+
|
|
302
|
+
### Changed
|
|
303
|
+
|
|
304
|
+
- **`/implement` skips Harden at `lean` on a docs-only diff** ([#482](https://github.com/dean0x/devflow/issues/482)). At `lean`, `/implement` skips Phase 4 Harden when the diff is docs-only. The decision reads path names only. It reads no diff content and runs no detection script. Harden is skipped only when all of these hold: the compliance lens is exactly `off`; the branch diff list is not empty; no Code report names a deleted, renamed or moved path; and every changed path is the root `README.md`, the root `CHANGELOG.md` or a `.md` file under the root `docs/`. A path on that list has no segment that starts with a dot, no double quote in its name and no file name that agents load as instructions, in any letter case. No loaded instruction, rules or imported file names the path. A tests-only diff runs Harden. When the decision is unclear, Harden runs. The run report says `Harden: ran` or `Harden: SKIPPED (docs-only diff)` at `lean` only. `full` and `standard` do not change. When Harden runs, it reads the whole branch diff. `/code-review` security runs at every level. The README, the CLI reference and the command reference state the rule. Known limits at `lean` on a docs-only diff: stub and wiring detection does not run; the pitfall check of public text in README and CHANGELOG does not run; a path that only a not-yet-loaded instruction file, such as a nested one, names is not seen; and Harden does not review a delete or a rename that no Code report names ([#571](https://github.com/dean0x/devflow/issues/571)). The docs-only check reads path names. It does not look at symlinks, file-type changes, or docs files that a site generator compiles. Run `devflow gates --set standard` or `--set full` to keep Harden on every diff.
|
|
305
|
+
- **`/implement` and `/resolve` skip Polish at `standard` and `lean`** ([#481](https://github.com/dean0x/devflow/issues/481)).
|
|
306
|
+
- At `standard` and `lean`, `/implement` skips Phase 3 Polish, and `/resolve` skips Phase 6 Polish in each worktree at that level.
|
|
307
|
+
At `full`, both spawn Polish.
|
|
308
|
+
`/self-review`, `/debug` and `/dynamic-build` keep Polish at every level and read no level.
|
|
309
|
+
Harden still reads the whole branch diff, and Validate does not depend on Polish.
|
|
310
|
+
- The quality rule has one bullet that holds a subset of Polish's cleanup list: leftover debug statements, unused imports, unnecessary variables used once right after assignment, nested ternaries, checks the types enforce and catches around code that cannot throw.
|
|
311
|
+
The bullet cuts debug statements everywhere, but it keeps checks and catches at a trust boundary or a fail-closed path.
|
|
312
|
+
The Code agent applies it while it writes.
|
|
313
|
+
At `full` and `standard`, `/code-review` can report these items.
|
|
314
|
+
`devflow gates`, the `devflow init` level hints, the README, `docs/cli-reference.md` and `docs/commands.md` state the effect.
|
|
315
|
+
- Accepted risk: at `standard` and `lean`, no `/implement` agent grades naming and consistency, and Harden reports both as `SKIP (Polish agent)`.
|
|
316
|
+
No rule holds two other Polish items: language-behavior tests and verbose names.
|
|
317
|
+
Harden's test pillar partly covers language-behavior tests.
|
|
318
|
+
- At `standard` and `lean`, `/resolve` skips Polish and never spawns Harden, so debug statements in its fixes that hold no secret or token get no later pass beyond the quality rule and the review.
|
|
319
|
+
At `lean`, `/code-review` does not report the cleanup items.
|
|
320
|
+
Ticket [#568](https://github.com/dean0x/devflow/issues/568) tracks the Harden wording.
|
|
321
|
+
Run `devflow gates --set full` to keep Polish.
|
|
322
|
+
- **`/implement` and `/resolve` read the gate level** ([#480](https://github.com/dean0x/devflow/issues/480)).
|
|
323
|
+
- At `standard` and `lean`, each command reads its level reference one time for each run. At `full`, it reads no reference.
|
|
324
|
+
`/implement` reads it at the start of Phase 3.
|
|
325
|
+
`/resolve` reads it in Step 0d when any worktree is at `standard` or `lean`.
|
|
326
|
+
The references hold the phase rows, and the [#481](https://github.com/dean0x/devflow/issues/481) entry lists the rows that this release adds.
|
|
327
|
+
- The `/implement` report and the `/resolve` display name the level at every level.
|
|
328
|
+
`/resolve` also names it in `resolution-summary.md`.
|
|
329
|
+
`devflow gates` says that `/implement` and `/resolve` read the level.
|
|
330
|
+
- If a reference cannot be read, the command says `level reference unreadable: no level rows applied`.
|
|
331
|
+
It applies no row and keeps the level, so at `lean` the lint pack still runs.
|
|
332
|
+
- No level removes Validate, the CI gate, the evidence claims, the Verification Gate or the compliance directive.
|
|
333
|
+
No level changes the Triage security gate or the ESCALATED route.
|
|
334
|
+
- **Code, Fix and Refactor check the staged diff for secrets or tokens in logs or debug output before each commit** ([#584](https://github.com/dean0x/devflow/issues/584)).
|
|
335
|
+
- Each of these agents checks the staged diff of every file it commits.
|
|
336
|
+
The check runs at every level, wherever `/resolve`, `/implement`, `/debug`, `/dynamic-build` (and dynamic workflows that spawn them) or ambient mode spawn these agents.
|
|
337
|
+
Run `devflow init` to install the updated agents.
|
|
338
|
+
- **`/implement`, `/code-review`, `/bug-analysis` and `/resolve` check branch names against an allowed set** ([#495](https://github.com/dean0x/devflow/issues/495)).
|
|
339
|
+
- A base branch name outside the allowed set, or one that git refuses, stops the run. The message states the set.
|
|
340
|
+
In `/code-review` multi-worktree mode, a rejected base blocks only that worktree.
|
|
341
|
+
- An incremental `/code-review` or `/bug-analysis` run takes the full range when it cannot use the stored review head.
|
|
342
|
+
A failed patch write in `/code-review` stops the run.
|
|
343
|
+
|
|
344
|
+
### Fixed
|
|
345
|
+
|
|
346
|
+
- **`/implement`, `/code-review`, `/bug-analysis` and `/resolve` use a fresh base for branch diffs** ([#495](https://github.com/dean0x/devflow/issues/495)).
|
|
347
|
+
- A new script, `resolve-base.cjs`, makes at most one fetch of the base branch, picks the base by one stated rule and prints one status line.
|
|
348
|
+
The fetch updates only the remote-tracking ref of the base branch, and credential prompts are off for it.
|
|
349
|
+
The branch diff starts at the fork point of that base and `HEAD`.
|
|
350
|
+
- The fetch stops after 45 seconds, each local git call stops after 30 seconds, and one run has a budget of 100 seconds.
|
|
351
|
+
A local git call that gives no answer reports `resolver-unavailable`.
|
|
352
|
+
A normal `/implement` run fetches the base branch once, and a re-validation that you ask for can add one more fetch.
|
|
353
|
+
- When the fetch fails or times out, `/implement`, `/code-review` and `/bug-analysis` use the best base they have and print a warning.
|
|
354
|
+
Known limit: `/resolve` uses that base without a warning.
|
|
355
|
+
- When no usable base exists, for example in a shallow clone without the base history, `/implement` stops, and `/code-review` and `/bug-analysis` stop on a full-range run.
|
|
356
|
+
Each names the cause and a fix.
|
|
357
|
+
`/resolve` takes its branch diff from the Git agent's `validate-branch`, which returns BLOCKED in that case.
|
|
358
|
+
- Run `devflow init` after you update, to install the script and the updated commands.
|
|
359
|
+
- **SessionStart loads the current working memory once** ([#591](https://github.com/dean0x/devflow/issues/591)).
|
|
360
|
+
- It does not load pre-compaction memory snapshots, also when a snapshot is newer or the current memory is missing.
|
|
361
|
+
- SessionStart does not delete or move the existing `backup.json` file. The next PreCompact writes it again with Git state only.
|
|
362
|
+
|
|
363
|
+
---
|
|
364
|
+
|
|
8
365
|
## [3.7.0] - 2026-10-16
|
|
9
366
|
|
|
10
367
|
### Upgrade notes — Gate level
|
|
@@ -1751,7 +2108,8 @@ devflow init
|
|
|
1751
2108
|
|
|
1752
2109
|
---
|
|
1753
2110
|
|
|
1754
|
-
[Unreleased]: https://github.com/dean0x/devflow/compare/v3.
|
|
2111
|
+
[Unreleased]: https://github.com/dean0x/devflow/compare/v3.8.0...HEAD
|
|
2112
|
+
[3.8.0]: https://github.com/dean0x/devflow/compare/v3.7.0...v3.8.0
|
|
1755
2113
|
[3.7.0]: https://github.com/dean0x/devflow/compare/v3.6.0...v3.7.0
|
|
1756
2114
|
[3.6.0]: https://github.com/dean0x/devflow/compare/v3.5.0...v3.6.0
|
|
1757
2115
|
[3.5.0]: https://github.com/dean0x/devflow/compare/v3.4.0...v3.5.0
|
package/README.md
CHANGED
|
@@ -30,7 +30,7 @@ you: /implement (hand it the plan)
|
|
|
30
30
|
|
|
31
31
|
Git branch feat/42-rate-limit-upload
|
|
32
32
|
Code implements the plan — your learned decisions, pitfalls, and feature knowledge preloaded
|
|
33
|
-
Polish · Harden cleanup pass, then 9-pillar quality gate
|
|
33
|
+
Polish · Harden cleanup pass at full, then 9-pillar quality gate (lean: not on docs-only diffs)
|
|
34
34
|
Evaluate implementation matches the original request ✓
|
|
35
35
|
Validate build ✓ typecheck ✓ lint ✓ tests ✓
|
|
36
36
|
Test 5/5 QA scenarios pass
|
|
@@ -60,7 +60,7 @@ This is the **orchestrated flow** — you stay in the loop between every step. W
|
|
|
60
60
|
|
|
61
61
|
**Memory that persists.** Session context survives restarts, `/clear`, and context compaction. Your agent picks up exactly where it left off.
|
|
62
62
|
|
|
63
|
-
**
|
|
63
|
+
**Decisions and pitfalls.** A background agent detects architectural decisions and known pitfalls from your session dialogs and writes them to `.devflow/curation/decisions.md` and `.devflow/curation/pitfalls.md` — informing every future review and implementation session without any manual bookkeeping.
|
|
64
64
|
|
|
65
65
|
**Feature knowledge bases.** Curated `KNOWLEDGE.md` files per feature area — patterns, conventions, and gotchas — git-tracked and shared with your team. Planning, implementation, and review workflows load them automatically and refresh them after changes.
|
|
66
66
|
|
|
@@ -128,14 +128,14 @@ Graph runs trade tokens for autonomy: you make your calls at each wave's decisio
|
|
|
128
128
|
npx devflow-kit init
|
|
129
129
|
```
|
|
130
130
|
|
|
131
|
-
That's it. The interactive wizard offers Recommended defaults or an Advanced flow — plugin selection, feature configuration, compliance frameworks, and security settings. Ambient mode, working memory, and
|
|
131
|
+
That's it. The interactive wizard offers Recommended defaults or an Advanced flow — plugin selection, feature configuration, compliance frameworks, the gate level, and security settings. Ambient mode, working memory, and curation are on by default. Non-interactive: `npx devflow-kit init --recommended`.
|
|
132
132
|
|
|
133
133
|
## Privacy & Sharing
|
|
134
134
|
|
|
135
135
|
Everything Devflow generates lives under `.devflow/` — working memory, decisions and pitfalls, feature knowledge bases, naming conventions, docs and transient locks. On first use Devflow appends one block to your project's root `.gitignore`. It keeps per-developer runtime state on your machine and shares three things through git: the feature knowledge bases, the learned naming conventions and the team's settings in `.devflow/project.json`, which carry its [evidence policy](#evidence-policy):
|
|
136
136
|
|
|
137
137
|
```gitignore
|
|
138
|
-
# Devflow runtime data — local by default (memory,
|
|
138
|
+
# Devflow runtime data — local by default (memory, curation, docs, locks).
|
|
139
139
|
# Shared via git: feature knowledge bases under .devflow/features/ (index.md and
|
|
140
140
|
# every {slug}/KNOWLEDGE.md), .devflow/conventions.md (naming authority),
|
|
141
141
|
# .devflow/policy.json (retired; presence only) and .devflow/project.json (team settings).
|
|
@@ -188,21 +188,21 @@ A repository can commit `.devflow/project.json` to settle team-wide choices. Eve
|
|
|
188
188
|
```json
|
|
189
189
|
{"version":1,"evidence":"required","compliance":["hipaa"],
|
|
190
190
|
"tracker":{"provider":"jira","site":"https://acme.atlassian.net","key":"ACME"},
|
|
191
|
-
"reviewPublication":"auto","features":{"
|
|
191
|
+
"reviewPublication":"auto","features":{"curation":false}}
|
|
192
192
|
```
|
|
193
193
|
|
|
194
194
|
- `evidence` is the [evidence policy](#evidence-policy); `compliance` names the regulatory frameworks the repository answers to, and its presence raises the evidence floor to `required`.
|
|
195
195
|
- `tracker` selects the repository's issue tracker. Your personal `.devflow/config.json` may only narrow it, to `github` or to the same provider.
|
|
196
196
|
- `reviewPublication` is a ceiling only: it can lower your personal value, never raise it. With no personal value you get at most `auto` — a team `off` still lowers it — so a branch that commits `full` cannot switch off the visibility gate for whoever reviews it.
|
|
197
|
-
- `features` can switch memory,
|
|
197
|
+
- `features` can switch memory, curation or knowledge off for this repository, never back on. Your personal `config.json` can do the same for you. The key is `features.curation`. Devflow 3.8 reads the old key `features.learning` too, and the repository turns the feature off when either key is `false`. A 3.7 install reads only `features.learning`. In a team with mixed versions, keep the old key in the committed file, or set both keys, until every member runs 3.8.
|
|
198
198
|
|
|
199
199
|
**Adopting it.** Commit `project.json` on the default branch. `evidence` is always read from the default branch, so a feature branch cannot lower the bar it is judged by. Every other key — `tracker` with its `site` and `key`, `features` and the `reviewPublication` ceiling — is read from the branch you have checked out, so a branch that edits them sees the change at once. `compliance` is read from both and joined with your machine's frameworks: a branch can add a framework, never remove one, so a pull request that deletes `"compliance":["hipaa"]` is still reviewed under HIPAA. The default branch's copy is read from your clone's tracking branch, as fresh as your last fetch, never over the network, so a framework added on the default branch reaches the lens once your checkout has fetched it.
|
|
200
200
|
|
|
201
|
-
Each key is checked on its own, so one bad value never disables the rest: a bad `evidence` resolves to `required`, a bad `reviewPublication` to `off`, a bad `compliance` list to the generic lens. A `project.json` or `config.json` that exists but is not a JSON object is never read as absent: the settings fail closed (publication off, knowledge write-back off, the tracker reported as invalid). The compliance lens is the exception, because it only adds scrutiny: it keeps every framework a readable layer declares, and an unreadable `project.json` counts as the generic lens. Memory and
|
|
201
|
+
Each key is checked on its own, so one bad value never disables the rest: a bad `evidence` resolves to `required`, a bad `reviewPublication` to `off`, a bad `compliance` list to the generic lens. A `project.json` or `config.json` that exists but is not a JSON object is never read as absent: the settings fail closed (publication off, knowledge write-back off, the tracker reported as invalid). The compliance lens is the exception, because it only adds scrutiny: it keeps every framework a readable layer declares, and an unreadable `project.json` counts as the generic lens. Memory and curation capture fail open instead: the hooks read an unreadable file as narrowing nothing, so capture runs as your machine's switch says.
|
|
202
202
|
|
|
203
|
-
`config.json` is personal, so it must not be committed. A `config.json` that git tracks is ignored as if it were absent — otherwise a branch could commit `"reviewPublication":"full"` for whoever reviews it — and `devflow tracker|memory|
|
|
203
|
+
`config.json` is personal, so it must not be committed. A `config.json` that git tracks is ignored as if it were absent — otherwise a branch could commit `"reviewPublication":"full"` for whoever reviews it — and `devflow tracker|memory|curation|knowledge|gates --status` say so, with the fix: untrack the tracked entry with `git rm --cached`, then check or delete the file, because untracking leaves the committed bytes on disk as your personal file. Commands never read the file themselves — one local resolver folds it with your `config.json` and the machine settings, without touching the network.
|
|
204
204
|
|
|
205
|
-
**Gate level.** The gate level (`full`, `standard` or `lean`) is not a narrow-only switch: your personal `.devflow/config.json` may carry a top-level `"gateLevel"` key that raises or lowers the machine default,
|
|
205
|
+
**Gate level.** The gate level (`full`, `standard` or `lean`) is not a narrow-only switch: your personal `.devflow/config.json` may carry a top-level `"gateLevel"` key that raises or lowers the machine default, which sits in `~/.devflow/manifest.json`, and `standard` applies when neither is set. `devflow init` asks for the machine default (an interactive run only; `devflow init --gate-level <full|standard|lean>` sets it with no prompt, and `--recommended` or a non-interactive init keeps the stored value), and `devflow gates --set <level>` changes it later. A `gateLevel` in `project.json` is ignored, and no command writes the personal key. A malformed value reads as `full`. `/code-review` and `/plan` read the level: `standard` and `lean` run fewer review focuses and fewer planning agents. The security checks and, in `/plan`, the design review run at every level. The compliance gap agent runs on its own trigger at every level. At `lean` and at no other level, `/implement` has Validate run your project's `lint-pack` script last (template in `templates/lint-pack/`). The script finds the faults a linter does not, such as a removed flag that a doc still names. To clear a match that you accept, add an allow glob to `.lint-pack.conf`. Run `devflow gates --set full` to keep the full `/plan` shape and Polish. `/implement` and `/resolve` also read the level and name it in their report. At `standard` and `lean` they skip Polish, and `full` keeps it. At `lean`, `/implement` also skips Harden on a docs-only diff (the root `README.md`, the root `CHANGELOG.md` or `.md` files under the root `docs/` that no agent loads as instructions, with the compliance lens `off`), and its report says `Harden: ran` or `Harden: SKIPPED (docs-only diff)`. Run `devflow gates --set standard` or `--set full` to keep Harden on every diff. A level reference that cannot be read applies no row and keeps the level. After updating, run `devflow init`. See the [CLI reference](https://github.com/dean0x/devflow/blob/main/docs/cli-reference.md#gate-level).
|
|
206
206
|
|
|
207
207
|
## Evidence policy
|
|
208
208
|
|
|
@@ -282,7 +282,7 @@ For deep dives: [Working Memory](https://github.com/dean0x/devflow/blob/main/doc
|
|
|
282
282
|
npx devflow-kit init # Install (interactive wizard)
|
|
283
283
|
npx devflow-kit init --plugin=implement # Install specific plugin
|
|
284
284
|
npx devflow-kit ambient --enable # Toggle ambient mode (orchestrator)
|
|
285
|
-
npx devflow-kit
|
|
285
|
+
npx devflow-kit curation --enable # Toggle decision/pitfall tracking (all projects)
|
|
286
286
|
npx devflow-kit compliance --enable # Enable compliance (pick frameworks); prints the keys to add to .devflow/project.json
|
|
287
287
|
npx devflow-kit compliance --status # Show compliance state and this repo's evidence policy
|
|
288
288
|
npx devflow-kit tracker --set jira # Pick the machine's default tracker (github | jira | linear)
|
|
@@ -307,7 +307,7 @@ See [docs/cli-reference.md](https://github.com/dean0x/devflow/blob/main/docs/cli
|
|
|
307
307
|
| Tool | Role | What It Does |
|
|
308
308
|
|------|------|-------------|
|
|
309
309
|
| **[Skim](https://github.com/dean0x/skim)** | Context Optimization | Code-aware AST parsing, command rewriting, output compression |
|
|
310
|
-
| **Devflow** | Meta-Harness | Orchestrated + graph workflows, parallel review, memory,
|
|
310
|
+
| **Devflow** | Meta-Harness | Orchestrated + graph workflows, parallel review, memory, curated decisions |
|
|
311
311
|
| **[MDS](https://github.com/dean0x/mdscript)** | Prompt Engineering | Composable template language for prompts — variables, loops, conditionals, imports, compiled to clean Markdown |
|
|
312
312
|
|
|
313
313
|
## Building from Source
|
package/dist/agents/code.md
CHANGED
|
@@ -37,7 +37,7 @@ You are an autonomous implementation specialist working on a feature branch. You
|
|
|
37
37
|
## Input Context
|
|
38
38
|
|
|
39
39
|
You receive from orchestrator:
|
|
40
|
-
- **TASK_ID**: Unique identifier
|
|
40
|
+
- **TASK_ID**: Unique identifier
|
|
41
41
|
- **TASK_DESCRIPTION**: What to do
|
|
42
42
|
- **PUSH** (optional): `true` (default) | `false` — when false, commit only; orchestrator owns push/CI gate
|
|
43
43
|
- **DECISIONS_CONTEXT** (optional): Compact index of active ADR/PF entries.
|
|
@@ -76,7 +76,7 @@ You receive from orchestrator:
|
|
|
76
76
|
4. **Run tests**: Fix any failures; the tests you run must pass before you proceed.
|
|
77
77
|
**Gate ownership:** Run the targeted tests for your change in its TDD cycle, plus one affected-tests run after your last edit. In a fix mode, compile and run the named failing or regression tests. Never the full suite. Batch fixes: one build check per batch, not per edit. Only Validate runs the full suite.
|
|
78
78
|
|
|
79
|
-
5. **Commit and push**: Create atomic commits with clear messages. Reference TASK_ID. Push to remote UNLESS `PUSH: false
|
|
79
|
+
5. **Commit and push**: Create atomic commits with clear messages. Reference TASK_ID. Push to remote UNLESS `PUSH: false`. Before you commit, check the staged diff of every file you commit: no secrets or tokens in logs or debug output.
|
|
80
80
|
**Security scan (conditional):** Only when this session offers a code-scanning tool. Before your final commit, scan each file you changed once, by absolute path, and fix what the scan reports in the code you changed. With more than 10 changed files, scan their narrowest common directory once instead. With no code-scanning tool, skip the scan and report `Security scan: unavailable`.
|
|
81
81
|
|
|
82
82
|
6. **Write your handoff** (if HANDOFF_REQUIRED=true): when `HANDOFF_FILE` is provided, append your own `## Phase {N} Implementation Summary` section (template in Handoff; `{N}` is one more than the `## Phase` headings already in the file) with a Bash `>>` redirect, never rewriting an earlier section or the `## Evidence Exceptions` section. Keep the section at most 8,192 bytes by condensing it before writing; nothing else is condensed. Then end your report with the same section.
|
|
@@ -145,8 +145,6 @@ Run builds, typechecks, lints and tests in the foreground, each with an explicit
|
|
|
145
145
|
|
|
146
146
|
## Output
|
|
147
147
|
|
|
148
|
-
Return structured completion status:
|
|
149
|
-
|
|
150
148
|
```markdown
|
|
151
149
|
## Implementation Report: {TASK_ID}
|
|
152
150
|
|
package/dist/agents/design.md
CHANGED
|
@@ -33,7 +33,7 @@ The orchestrator provides:
|
|
|
33
33
|
|
|
34
34
|
**Worktree Support**: If `WORKTREE_PATH` is provided, follow the `devflow:worktree-support` skill for path resolution. If omitted, use cwd.
|
|
35
35
|
|
|
36
|
-
- **DECISIONS_CONTEXT** (optional): Compact index of active ADR/PF entries for this repository (pre-rendered to `.devflow/
|
|
36
|
+
- **DECISIONS_CONTEXT** (optional): Compact index of active ADR/PF entries for this repository (pre-rendered to `.devflow/curation/index.md` in its main worktree). `(none)` when absent. Use `devflow:apply-decisions` to Read full bodies on demand.
|
|
37
37
|
- **FEATURE_KNOWLEDGE** (optional): Per KB, the Rules bullets most relevant to the feature, the KB path and a heading index, for pattern-aware gap analysis. Read the indexed sections for the architecture you build on — design additions that fit existing structure. Follow `devflow:apply-feature-knowledge`.
|
|
38
38
|
|
|
39
39
|
## Apply Decisions
|
package/dist/agents/fix.md
CHANGED
|
@@ -30,12 +30,12 @@ disallowedTools:
|
|
|
30
30
|
|
|
31
31
|
# Fix Agent
|
|
32
32
|
|
|
33
|
-
You are an autonomous repair specialist working on a feature branch. A quality gate (validation, alignment, QA or CI) reported failures. You fix exactly the failures you are given, verify the fix and commit it.
|
|
33
|
+
You are an autonomous repair specialist working on a feature branch. A quality gate (validation, alignment, QA or CI) reported failures. You fix exactly the failures you are given, verify the fix and commit it.
|
|
34
34
|
|
|
35
35
|
## Input Context
|
|
36
36
|
|
|
37
37
|
You receive from orchestrator:
|
|
38
|
-
- **TASK_ID**: Unique identifier
|
|
38
|
+
- **TASK_ID**: Unique identifier
|
|
39
39
|
- **TASK_DESCRIPTION**: What to do
|
|
40
40
|
- **PUSH** (optional): `true` (default) | `false` — when false, commit only; orchestrator owns push/CI gate
|
|
41
41
|
- **DECISIONS_CONTEXT** (optional): Compact index of active ADR/PF entries.
|
|
@@ -57,18 +57,19 @@ You receive from orchestrator:
|
|
|
57
57
|
3. **Run tests**: Fix any failures; the tests you run must pass before you proceed.
|
|
58
58
|
**Gate ownership:** Compile and run the named failing or regression tests. Never the full suite. Batch fixes: one build check per batch, not per edit. Only Validate runs the full suite.
|
|
59
59
|
|
|
60
|
-
4. **Commit and push**: Create atomic commits with clear messages. Reference TASK_ID. Push to remote UNLESS `PUSH: false
|
|
60
|
+
4. **Commit and push**: Create atomic commits with clear messages. Reference TASK_ID. Push to remote UNLESS `PUSH: false`. Before you commit, check the staged diff of every file you commit: no secrets or tokens in logs or debug output.
|
|
61
61
|
**Security scan (conditional):** Only when this session offers a code-scanning tool. Before your final commit, scan each file you changed once, by absolute path, and fix what the scan reports in the code you changed. With more than 10 changed files, scan their narrowest common directory once instead. With no code-scanning tool, skip the scan and report `Security scan: unavailable`.
|
|
62
62
|
|
|
63
63
|
## Mode: validation-fix
|
|
64
64
|
|
|
65
|
-
When `OPERATION: validation-fix`, you are fixing failures reported by
|
|
65
|
+
When `OPERATION: validation-fix`, you are fixing failures reported by Validate.
|
|
66
66
|
|
|
67
67
|
**Inputs:** `VALIDATION_FAILURES` (structured failures from Validate agent), `SCOPE: Fix only the listed failures, no other changes`, `PUSH: false`
|
|
68
68
|
|
|
69
69
|
**Protocol:**
|
|
70
70
|
1. Fix only what is listed in `VALIDATION_FAILURES` — no additional cleanup or refactoring
|
|
71
|
-
2. Commit fixes;
|
|
71
|
+
2. Commit fixes; Validate re-runs after each attempt (max 2 attempts total)
|
|
72
|
+
3. Never edit the lint pack, its config, its build-file entry or any `.gitattributes`, or silence the linter, to clear a lint-pack match; report it under Blockers
|
|
72
73
|
|
|
73
74
|
## Mode: alignment-fix
|
|
74
75
|
|
|
@@ -126,8 +127,6 @@ Run builds, typechecks, lints and tests in the foreground, each with an explicit
|
|
|
126
127
|
|
|
127
128
|
## Output
|
|
128
129
|
|
|
129
|
-
Return structured completion status:
|
|
130
|
-
|
|
131
130
|
```markdown
|
|
132
131
|
## Implementation Report: {TASK_ID}
|
|
133
132
|
|
package/dist/agents/git.md
CHANGED
|
@@ -104,7 +104,7 @@ D4 and D11 are defined here; every other `D{N}` label is defined in the `devflow
|
|
|
104
104
|
|
|
105
105
|
Each operation's `**Output:**` template, in its reference, is its return.
|
|
106
106
|
|
|
107
|
-
Report cap: final message at most about 1,500 tokens; longer material goes to a `mktemp` file via Bash and the message gives its path. Exempt, inline in full
|
|
107
|
+
Report cap: final message at most about 1,500 tokens; longer material goes to a `mktemp` file via Bash and the message gives its path. Exempt, inline in full: every `TRACEABILITY: DEGRADED ({reason})` line, `cannot push to fork` included; every `**Status**:`, `### Status:`, `**Publication**:` and `- Test plan:` line, check-ci-status's `**Status**:` being the enum `ci-wait.cjs` is pinned to; `### TRACE_MAP` and `THREAD_MAP`; `**PR**: #{number}`; the `## Issue {ISSUE_REF}:` heading, the `<untrusted-issue-body>` body and its acceptance criteria; the `- **Branch name**:`, `- **Issue ID**:`, `- **PR link line**:` and `- **Branch token**:` lines; manage-debt's issue reference; the `## PR Evidence` block; the validate-branch and ensure-pr-ready fields `branch`, `base_branch`, `base_ref`, `branch_slug`, `pr_number`, `review_count` and `diff_files`; and the JSON returns `issueId`, `prLinkLine`, `merged`, `reason`, `mergeSha`, `treeEqual` and `undone`.
|
|
108
108
|
|
|
109
109
|
## Principles
|
|
110
110
|
|
package/dist/agents/harden.md
CHANGED
|
@@ -40,7 +40,7 @@ You are a meticulous self-review specialist. You evaluate implementations agains
|
|
|
40
40
|
You receive from orchestrator:
|
|
41
41
|
- **TASK_DESCRIPTION**: What was implemented
|
|
42
42
|
- **FILES_CHANGED**: List of modified files from Code agent output
|
|
43
|
-
- **DECISIONS_CONTEXT** (optional): Compact index of active ADR/PF entries for this repository (pre-rendered to `.devflow/
|
|
43
|
+
- **DECISIONS_CONTEXT** (optional): Compact index of active ADR/PF entries for this repository (pre-rendered to `.devflow/curation/index.md` in its main worktree). `(none)` when absent. Use `devflow:apply-decisions` to Read full bodies on demand.
|
|
44
44
|
- **FEATURE_KNOWLEDGE** (optional): Per KB, the Rules bullets and the KB path, with no heading index, for pattern compliance checking. Check implementation against each bullet's anti-pattern, gotcha or invariant; Read a KB section from its path for more. Follow `devflow:apply-feature-knowledge`.
|
|
45
45
|
|
|
46
46
|
**Worktree Support**: If `WORKTREE_PATH` is provided, follow the `devflow:worktree-support` skill for path resolution. If omitted, use cwd.
|
package/dist/agents/refactor.md
CHANGED
|
@@ -34,7 +34,7 @@ You are an autonomous editing specialist working on a feature branch. You apply
|
|
|
34
34
|
## Input Context
|
|
35
35
|
|
|
36
36
|
You receive from orchestrator:
|
|
37
|
-
- **TASK_ID**: Unique identifier
|
|
37
|
+
- **TASK_ID**: Unique identifier
|
|
38
38
|
- **TASK_DESCRIPTION**: What to do
|
|
39
39
|
- **PUSH** (optional): `true` (default) | `false` — when false, commit only; orchestrator owns push/CI gate
|
|
40
40
|
- **DECISIONS_CONTEXT** (optional): Compact index of active ADR/PF entries.
|
|
@@ -55,7 +55,7 @@ You receive from orchestrator:
|
|
|
55
55
|
3. **Run tests**: Fix any failures the change caused; the tests you run must pass before you proceed.
|
|
56
56
|
**Gate ownership:** Run the tests of the touched modules once. Never the full suite. Only Validate runs the full suite.
|
|
57
57
|
|
|
58
|
-
4. **Commit and push**: Create atomic commits with clear messages. Reference TASK_ID. Push to remote UNLESS `PUSH: false
|
|
58
|
+
4. **Commit and push**: Create atomic commits with clear messages. Reference TASK_ID. Push to remote UNLESS `PUSH: false`. Before you commit, check the staged diff of every file you commit: no secrets or tokens in logs or debug output.
|
|
59
59
|
**Security scan (conditional):** Only when this session offers a code-scanning tool. Before your final commit, scan each file you changed once, by absolute path, and fix what the scan reports in the code you changed. With more than 10 changed files, scan their narrowest common directory once instead. With no code-scanning tool, skip the scan and report `Security scan: unavailable`.
|
|
60
60
|
|
|
61
61
|
## Mode: edit
|
|
@@ -94,8 +94,6 @@ Run builds, typechecks, lints and tests in the foreground, each with an explicit
|
|
|
94
94
|
|
|
95
95
|
## Output
|
|
96
96
|
|
|
97
|
-
Return structured completion status:
|
|
98
|
-
|
|
99
97
|
```markdown
|
|
100
98
|
## Implementation Report: {TASK_ID}
|
|
101
99
|
|