devflow-kit 3.7.0 → 3.9.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 +479 -1
- package/README.md +15 -15
- package/dist/agents/code.md +6 -8
- package/dist/agents/design.md +1 -1
- package/dist/agents/fix.md +7 -8
- package/dist/agents/git.md +3 -3
- 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 +9 -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/curation.js +808 -0
- package/dist/cli/commands/gate-level-prompts.js +428 -0
- package/dist/cli/commands/gates.js +35 -11
- package/dist/cli/commands/init-seed.js +11 -8
- package/dist/cli/commands/init.js +244 -57
- package/dist/cli/commands/memory.js +60 -13
- package/dist/cli/commands/prompt-io.js +37 -0
- package/dist/cli/commands/uninstall.js +157 -17
- package/dist/cli.js +2 -2
- package/dist/commands/bug-analysis.md +25 -36
- package/dist/commands/code-review.md +40 -44
- package/dist/commands/debug.md +5 -5
- package/dist/commands/dynamic-build.md +26 -25
- package/dist/commands/dynamic-plan.md +5 -5
- package/dist/commands/dynamic-profile.md +5 -5
- package/dist/commands/dynamic-tickets.md +5 -5
- package/dist/commands/explore.md +6 -6
- package/dist/commands/implement.md +53 -82
- package/dist/commands/plan.md +6 -6
- package/dist/commands/release.md +5 -5
- package/dist/commands/research.md +6 -6
- package/dist/commands/resolve.md +39 -41
- package/dist/commands/self-review.md +5 -13
- package/dist/core/area-pause-notice.js +44 -0
- 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 +35 -0
- package/dist/core/curation-move.js +35 -0
- package/dist/core/curation-queue-cleanup.js +135 -0
- package/dist/core/curation-store.js +99 -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 +11 -9
- 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 +19 -19
- 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 +159 -0
- package/dist/core/tracker.js +1 -1
- package/dist/{learning-off → curation-off}/agents/code.md +6 -8
- package/dist/{learning-off → curation-off}/agents/fix.md +7 -8
- 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 +8 -1
- package/dist/{learning-off → curation-off}/commands/bug-analysis.md +20 -31
- package/dist/{learning-off → curation-off}/commands/code-review.md +37 -41
- package/dist/{learning-off → curation-off}/commands/debug.md +2 -2
- package/dist/{learning-off → curation-off}/commands/dynamic-build.md +23 -22
- package/dist/{learning-off → curation-off}/commands/explore.md +2 -2
- package/dist/{learning-off → curation-off}/commands/implement.md +50 -79
- package/dist/{learning-off → curation-off}/commands/plan.md +2 -2
- package/dist/{learning-off → curation-off}/commands/resolve.md +36 -38
- package/dist/{learning-off → curation-off}/commands/self-review.md +2 -10
- package/dist/hud/components/{learning-counts.js → curation-counts.js} +63 -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/post-resolution-summary.md +12 -11
- package/dist/skills/git/references/pr/post-review-summary.md +12 -11
- package/dist/skills/git/references/pr/update-pr-evidence.md +2 -2
- package/dist/skills/git/references/pr/validate-branch.md +8 -5
- package/dist/skills/git/references/publication-gate.md +6 -7
- package/dist/skills/git/references/tracker/github/ensure-pr-ready.md +13 -5
- package/dist/skills/git/references/tracker/github/manage-debt.md +6 -2
- package/dist/skills/git/references/tracker/jira/ensure-pr-ready.md +13 -5
- package/dist/skills/git/references/tracker/jira/manage-debt.md +6 -2
- package/dist/skills/git/references/tracker/linear/ensure-pr-ready.md +13 -5
- package/dist/skills/git/references/tracker/linear/manage-debt.md +6 -2
- 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 +6 -6
- 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/evaluate.md +6 -12
- package/src/assets/agents/fix.mds +7 -6
- package/src/assets/agents/git.mds +3 -3
- 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 +29 -22
- package/src/assets/agents/validate.md +30 -50
- package/src/assets/commands/_partials/_decisions.mds +22 -20
- 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 +3 -3
- 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 +53 -57
- 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 +66 -60
- package/src/assets/commands/self-review.mds +20 -20
- package/src/assets/mds/git/_ops.mds +9 -2
- package/src/assets/mds/git/_ops_pr.mds +21 -11
- package/src/assets/mds/git/_ops_steps.mds +20 -4
- package/src/assets/mds/git/_pr.mds +21 -18
- package/src/assets/mds/git/_references.mds +6 -7
- package/src/assets/mds/tracker/_github.mds +1 -4
- package/src/assets/mds/tracker/_jira.mds +1 -4
- package/src/assets/mds/tracker/_linear.mds +1 -4
- package/src/assets/rules/quality.md +1 -0
- package/src/assets/scripts/ci-wait.cjs +389 -92
- package/src/assets/scripts/hooks/background-memory-update +81 -3
- 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 +176 -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} +308 -122
- 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 +42 -22
- package/src/assets/scripts/hooks/lib/tracked-areas.cjs +452 -0
- package/src/assets/scripts/hooks/memory-permission +10 -2
- package/src/assets/scripts/hooks/memory-worker +12 -1
- package/src/assets/scripts/hooks/pre-compact-memory +17 -16
- package/src/assets/scripts/hooks/queue-append +444 -102
- package/src/assets/scripts/hooks/resolve-project-root +2 -2
- package/src/assets/scripts/hooks/session-start-context +198 -72
- package/src/assets/scripts/hooks/session-start-memory +42 -43
- package/src/assets/scripts/lib/project-config.cjs +12 -5
- package/src/assets/scripts/pr-evidence.cjs +5 -2
- package/src/assets/scripts/resolve-base.cjs +1043 -0
- package/src/assets/scripts/resolve-settings.cjs +283 -45
- package/src/assets/scripts/verify-evidence.cjs +307 -75
- package/src/assets/skills/agent-references/SKILL.md +11 -2
- package/src/assets/skills/agent-references/references/commands/implement-levels.md +29 -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 +25 -0
- package/src/assets/skills/agent-references/references/synthesize/review.md +4 -4
- package/src/assets/skills/agent-references/references/triage/severity-tiers.md +43 -0
- package/src/assets/skills/agent-references/references/validate/passed-alone.md +14 -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/cli/commands/learning.js +0 -554
- 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
|
@@ -3,7 +3,7 @@ description: Execute a single task through implementation, quality gates, and PR
|
|
|
3
3
|
---
|
|
4
4
|
# Implement Command
|
|
5
5
|
|
|
6
|
-
Orchestrate a single task through implementation by spawning specialized agents.
|
|
6
|
+
Orchestrate a single task through implementation by spawning specialized agents.
|
|
7
7
|
|
|
8
8
|
## Usage
|
|
9
9
|
|
|
@@ -34,8 +34,6 @@ $ARGUMENTS
|
|
|
34
34
|
|
|
35
35
|
Note: a bare digit run is a reference **only** under `github`, and that adjudication belongs to the Git agent, never to this command — the command layer holds no provider knowledge, so deciding it here would be a guess dressed as a rule.
|
|
36
36
|
|
|
37
|
-
> **Tip**: For best results, run `/plan` first to produce a design artifact, then pass it to `/implement`.
|
|
38
|
-
|
|
39
37
|
## Phases
|
|
40
38
|
|
|
41
39
|
### Re-validation Continuation Path
|
|
@@ -44,9 +42,9 @@ When the user explicitly asks to re-validate, re-check, or re-run quality gates
|
|
|
44
42
|
|
|
45
43
|
### Phase 1: Setup
|
|
46
44
|
|
|
47
|
-
**Produces:** TASK_ID, BASE_BRANCH, EXECUTION_PLAN, DECISIONS_CONTEXT, FEATURE_KNOWLEDGE, FEATURE_KNOWLEDGE_RULES, PR_DESCRIPTION_GUIDANCE, ISSUE_NUMBER, ISSUE_PR_LINK, EVIDENCE_POLICY, ISSUE_REQUIRED, APPLY_CONVENTIONS, REQUIRE_NON_AUTHOR_APPROVAL, PR_EXCEPTIONS, TEST_PLAN, EVIDENCE_FILE, PR_TEST_PLAN_BLOCK, REVIEW_PUBLICATION
|
|
45
|
+
**Produces:** TASK_ID, BASE_BRANCH, BASE_REF, EXECUTION_PLAN, DECISIONS_CONTEXT, FEATURE_KNOWLEDGE, FEATURE_KNOWLEDGE_RULES, PR_DESCRIPTION_GUIDANCE, ISSUE_NUMBER, ISSUE_PR_LINK, EVIDENCE_POLICY, ISSUE_REQUIRED, APPLY_CONVENTIONS, REQUIRE_NON_AUTHOR_APPROVAL, PR_EXCEPTIONS, TEST_PLAN, EVIDENCE_FILE, PR_TEST_PLAN_BLOCK, REVIEW_PUBLICATION, GATE_LEVEL
|
|
48
46
|
|
|
49
|
-
Record the current branch name as `BASE_BRANCH`. Stop the run unless it matches `^[A-Za-z0-9._
|
|
47
|
+
Record the current branch name as `BASE_BRANCH`. Stop the run unless it matches `^(?![-#]|origin\/|(?:@|(?:FETCH_|ORIG_|MERGE_)?HEAD)$)(?!.*\.\.)[A-Za-z0-9._\/+@,#-]{1,200}$` (judge the match by reading; never pass the value to a command), telling the user it allows only ASCII letters, digits and `._/+@,#-`, at most 200; no leading `-` or `#`, no `origin/` prefix, no `..`, not `@` or a HEAD name.
|
|
50
48
|
|
|
51
49
|
**Docs root (D-DOCS-ROOT).** Every `.devflow/docs/` path this command reads or writes lives at the checkout's toplevel, never under the directory the session started in. Resolve `{worktree}` from the start directory — `WORKTREE_PATH` if provided, otherwise cwd (`devflow:worktree-support`) — by running
|
|
52
50
|
|
|
@@ -79,7 +77,7 @@ If `PR_DESCRIPTION_GUIDANCE` was not set above (non-plan paths: issue input or t
|
|
|
79
77
|
|
|
80
78
|
**Empty input.** When `COMMAND_INPUT` is empty — a plan handoff arrives this way, with the plan already in the conversation — there is no argument to name the branch from, and the Git agent sees none of this conversation. Write the description yourself: one line, taken from the plan's title or, with no plan, from the conversation. Send it as the setup-task `TASK_DESCRIPTION` below.
|
|
81
79
|
|
|
82
|
-
Spawn Git agent to set up
|
|
80
|
+
Spawn Git agent to set up the task:
|
|
83
81
|
|
|
84
82
|
```
|
|
85
83
|
Agent(subagent_type="Git"):
|
|
@@ -94,33 +92,14 @@ Derive branch name from issue or description, create feature branch, and fetch i
|
|
|
94
92
|
Return the branch setup summary."
|
|
95
93
|
```
|
|
96
94
|
|
|
97
|
-
The issue token is forwarded **unclassified
|
|
98
|
-
SHAPE alone — how many tokens `COMMAND_INPUT` has, and whether it ends in `.md`.
|
|
99
|
-
|
|
100
|
-
`setup-task` is the one step that has resolved a provider, and therefore the only
|
|
101
|
-
one that knows what an issue reference looks like on this machine: `#123`,
|
|
102
|
-
`PROJ-12` and `ENG-12` are three providers' spellings of the same thing. A
|
|
103
|
-
`starts with #` test here would be a github test wearing a neutral name — it
|
|
104
|
-
reclassifies every other provider's reference as a task description, so the
|
|
105
|
-
branch is derived from prose and no issue is ever fetched, with nothing reporting
|
|
106
|
-
a problem. Token COUNT is the gate that stays provider-neutral: every one of
|
|
107
|
-
those spellings is a single token, and no free-text task description is.
|
|
95
|
+
The issue token is forwarded **unclassified**; routing is by SHAPE alone (the token count of `COMMAND_INPUT` and a `.md` ending). Only `setup-task` has resolved a provider, so a `starts with #` test would be a github test that reclassifies `PROJ-12` and `ENG-12` as task descriptions: the branch comes from prose, no issue is fetched and nothing reports it. Token COUNT is provider-neutral: every issue spelling is one token and no free-text description is.
|
|
108
96
|
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
- **Extension.** A path ending in `.md` is a plan document, never an issue
|
|
112
|
-
reference — it goes to `PLAN_ARTIFACT_PATH` and neither of the other two keys.
|
|
113
|
-
`ISSUE_INPUT` then carries the plan's frontmatter `issue` instead, never the
|
|
114
|
-
path (Plan Document Handling step 4).
|
|
115
|
-
- **Token count.** A single token is an issue reference. Two or more is prose:
|
|
116
|
-
forwarding only its FIRST token would send `/implement fix the login bug` to
|
|
117
|
-
the Git agent as `ISSUE_INPUT: fix` with no description at all, and
|
|
118
|
-
`setup-task` fetches whatever it is handed — so the command would derive a
|
|
119
|
-
branch from a failed lookup and drop the request on the floor.
|
|
97
|
+
- **Extension.** A path ending in `.md` is a plan document, never an issue reference: it goes to `PLAN_ARTIFACT_PATH` only, and `ISSUE_INPUT` carries the plan's frontmatter `issue`, never the path (Plan Document Handling step 4).
|
|
98
|
+
- **Token count.** One token is an issue reference; two or more is prose. Forwarding the FIRST token alone would send `/implement fix the login bug` as `ISSUE_INPUT: fix` with no description, so the request is dropped.
|
|
120
99
|
|
|
121
100
|
**Capture from Git agent output** (used throughout flow):
|
|
122
101
|
- `TASK_ID`: The branch name created by Git agent (use as TASK_ID for rest of flow)
|
|
123
|
-
- `BASE_BRANCH`: Branch this feature was created from (for PR target)
|
|
102
|
+
- `BASE_BRANCH`: Branch this feature was created from (for PR target); stop unless it passes the setup check
|
|
124
103
|
- `ISSUE_NUMBER`: the provider-canonical issue identifier for this task — the same value the Git agent emits as `ISSUE_ID` (if provided, or created by the Git agent's issue-first step in setup-task)
|
|
125
104
|
- `branch_slug`: `TASK_ID` with every `/` replaced by `-`. It names `handoff-{branch_slug}.md` and `evidence-{branch_slug}.md` only when it matches `^[A-Za-z0-9._-]{1,200}$`; any other branch name stops the run here, telling the user it cannot name those files.
|
|
126
105
|
|
|
@@ -165,13 +144,13 @@ node "$HOME/.devflow/scripts/verify-evidence.cjs" render --plan "{worktree}/.dev
|
|
|
165
144
|
|
|
166
145
|
- `EVIDENCE_FILE` — `{worktree}/.devflow/docs/evidence-{branch_slug}.md`, its `## Evidence Exceptions` section now a byte copy of `PR_EXCEPTIONS` (absent when that is `(none)`).
|
|
167
146
|
|
|
168
|
-
**Resolve the settings line** once per worktree root, reusing a line this run already resolved for the same root. `{root}` is the worktree the values are for — the repository root
|
|
147
|
+
**Resolve the settings line** once per worktree root, reusing a line this run already resolved for the same root. `{root}` is the worktree the values are for — the repository root in a one-worktree run:
|
|
169
148
|
|
|
170
149
|
```bash
|
|
171
150
|
node "$HOME/.devflow/scripts/resolve-settings.cjs" "{root}" 2>/dev/null; echo "exit=$?"
|
|
172
151
|
```
|
|
173
152
|
|
|
174
|
-
Accept the output only when it is exactly two lines: `exit=0` last and, before it, one line of the form `TRACKER=<github|jira|linear> TRACKER_SOURCE=<project|personal|machine|default> TRACKER_WARN=<none|mismatch|invalid> SITE=<none|https://<host>> KEY=<none|<key>> REVIEW_PUBLICATION=<off|auto|full> COMPLIANCE=<off|generic|<id>[,<id>…]> MEMORY=<on|off>
|
|
153
|
+
Accept the output only when it is exactly two lines: `exit=0` last and, before it, one line of the form `TRACKER=<github|jira|linear> TRACKER_SOURCE=<project|personal|machine|default> TRACKER_WARN=<none|mismatch|invalid> SITE=<none|https://<host>> KEY=<none|<key>> REVIEW_PUBLICATION=<off|auto|full> COMPLIANCE=<off|generic|<id>[,<id>…]> MEMORY=<on|off> CURATION=<on|off> KNOWLEDGE=<on|off> GATE_LEVEL=<full|standard|lean>` — these fields, in this order, nothing else, where `<host>` is a lowercase dotted host name alone, `<key>` is 2–10 of `A-Z`, `0-9` and `_` starting with a letter, and each `<id>` is one of `gdpr`, `hipaa`, `pci-dss`, `soc2`, `iso-27001`, `sox`. **Anything else** (a non-zero exit, no line, extra text, or a missing, reordered or unlisted field or value) ⇒ use `TRACKER=github TRACKER_SOURCE=default TRACKER_WARN=invalid SITE=none KEY=none REVIEW_PUBLICATION=off COMPLIANCE=generic MEMORY=off CURATION=off KNOWLEDGE=off GATE_LEVEL=full` instead.
|
|
175
154
|
|
|
176
155
|
The accepted line is the only source of these values.
|
|
177
156
|
|
|
@@ -190,7 +169,7 @@ Pass `COMPLIANCE_DIRECTIVE` to every Code and Fix spawn, on a line of its own.
|
|
|
190
169
|
|
|
191
170
|
### Load DECISIONS_CONTEXT
|
|
192
171
|
|
|
193
|
-
When the settings line says `
|
|
172
|
+
When the settings line says `CURATION=off`, set `DECISIONS_CONTEXT` to `(none)` and skip this step, locating no ledger and reading no index.
|
|
194
173
|
|
|
195
174
|
The decisions ledger belongs to the repository, not to one checkout: a linked worktree reads the main worktree's copy, a subdirectory session the repository root's. Locate it with ONE git call, run from the start directory — `WORKTREE_PATH` if provided, otherwise cwd (`devflow:worktree-support`):
|
|
196
175
|
|
|
@@ -204,11 +183,11 @@ Line 1 is the checkout's toplevel, line 2 the common git directory. A git older
|
|
|
204
183
|
2. **The toplevel** — line 1, or on an older git the line after the echoed flag.
|
|
205
184
|
3. **The start directory itself** — when the command failed or printed no absolute toplevel (outside a git repository).
|
|
206
185
|
|
|
207
|
-
This is the rule the
|
|
186
|
+
This is the rule the curation hooks apply, so you read the index the Curate agent writes.
|
|
208
187
|
|
|
209
188
|
**Step 1 — Read the pre-rendered index:**
|
|
210
189
|
|
|
211
|
-
Attempt to read `{ledger}/.devflow/
|
|
190
|
+
Attempt to read `{ledger}/.devflow/curation/index.md`.
|
|
212
191
|
|
|
213
192
|
- If the file exists and contains non-empty content: use that content as `DECISIONS_CONTEXT`.
|
|
214
193
|
- If the file is absent or empty: set `DECISIONS_CONTEXT` to `(none)`.
|
|
@@ -280,12 +259,14 @@ A KB with no Rules section labels its entries `Rules ({section name}):` and give
|
|
|
280
259
|
|
|
281
260
|
**One git call, then direct reads — no `.cjs` script.**
|
|
282
261
|
|
|
262
|
+
**Fresh base.** Before Phase 2, write `BASE_BRANCH` with the Write tool to the file that `F="$(mktemp)" && echo "F=$F"` prints, after one Read of it. If the Write tool fails, treat the value as missing; never write it with a shell command. Then run `F="{name file}"; trap 'rm -- "$F"' EXIT; cd "{worktree}" && node "$HOME/.devflow/scripts/resolve-base.cjs" local --name-stdin < "$F"; echo "exit=$?"`. Output other than one `BASE_REF=` line (40 or 64 hex, or `none`) with `exit=0` counts as `NOTE=stop`, `REASON=resolver-unavailable`. Record `BASE_REF`. By `NOTE`: `none` continues; `info` prints one plain line; `degraded` records `TRACEABILITY: DEGRADED (base {REASON}; fix: {fix})`; `stop` (`BASE_REF=none`) stops the run, naming REASON and its fix. Fix by REASON: no-merge-base `git fetch --unshallow`; no-ref or timeout `git fetch origin <base>` (`<base>` stays as written); resolver-unavailable `re-run; if it repeats, run devflow init`; invalid-name the allowed set, never the name; any other REASON none, and `; fix: {fix}` is left out.
|
|
263
|
+
|
|
283
264
|
### Phase 2: Implement
|
|
284
265
|
|
|
285
266
|
**Produces:** CODE_AGENT_OUTPUT, FILES_CHANGED
|
|
286
267
|
**Requires:** TASK_ID, BASE_BRANCH, EXECUTION_PLAN
|
|
287
268
|
|
|
288
|
-
|
|
269
|
+
Setup context is the plan document, issue body or conversation.
|
|
289
270
|
|
|
290
271
|
**Strategy Selection**:
|
|
291
272
|
- If plan document provided: use `execution-strategy` from frontmatter (if absent, use the table below)
|
|
@@ -299,7 +280,7 @@ Based on Setup context (plan document, issue body, or conversation context), use
|
|
|
299
280
|
|
|
300
281
|
---
|
|
301
282
|
|
|
302
|
-
**SINGLE_CODE_AGENT
|
|
283
|
+
**SINGLE_CODE_AGENT**:
|
|
303
284
|
|
|
304
285
|
```
|
|
305
286
|
Agent(subagent_type="Code"):
|
|
@@ -316,7 +297,7 @@ DECISIONS_CONTEXT: {decisions_context}
|
|
|
316
297
|
|
|
317
298
|
---
|
|
318
299
|
|
|
319
|
-
**SEQUENTIAL_CODE_AGENTS
|
|
300
|
+
**SEQUENTIAL_CODE_AGENTS**:
|
|
320
301
|
|
|
321
302
|
Spawn Code agents one at a time. Each appends its own phase section to the handoff file, and the next reads only the section before it:
|
|
322
303
|
|
|
@@ -354,11 +335,11 @@ HANDOFF_REQUIRED: {true if not last phase}
|
|
|
354
335
|
HANDOFF_FILE: {worktree}/.devflow/docs/handoff-{branch_slug}.md"
|
|
355
336
|
```
|
|
356
337
|
|
|
357
|
-
**Handoff Protocol**: Each
|
|
338
|
+
**Handoff Protocol**: Each Code agent with HANDOFF_REQUIRED=true appends its own `## Phase {N} Implementation Summary` section, at most 8,192 bytes, to `{worktree}/.devflow/docs/handoff-{branch_slug}.md`, never rewriting an earlier section and keeping any `## Evidence Exceptions` section byte-identical; the next Code agent reads only the section of the phase immediately before its own through HANDOFF_FILE. The orchestrator writes no phase section. Delete `{worktree}/.devflow/docs/handoff-{branch_slug}.md` once the PR exists — after Phase 9 (cleanup).
|
|
358
339
|
|
|
359
340
|
---
|
|
360
341
|
|
|
361
|
-
**PARALLEL_CODE_AGENTS
|
|
342
|
+
**PARALLEL_CODE_AGENTS**:
|
|
362
343
|
|
|
363
344
|
Spawn multiple Code agents **in a single message**, each with independent subtask:
|
|
364
345
|
|
|
@@ -386,18 +367,20 @@ DECISIONS_CONTEXT: {decisions_context}
|
|
|
386
367
|
{COMPLIANCE_DIRECTIVE}"
|
|
387
368
|
```
|
|
388
369
|
|
|
389
|
-
**Independence criteria** (all must be true for PARALLEL_CODE_AGENTS):
|
|
390
|
-
- No shared contracts or interfaces
|
|
391
|
-
- No integration points between subtasks
|
|
392
|
-
- Different files/modules with no imports between them
|
|
393
|
-
- Each subtask is self-contained
|
|
370
|
+
**Independence criteria** (all must be true for PARALLEL_CODE_AGENTS): no shared contracts, interfaces or integration points between subtasks; different files/modules with no imports between them.
|
|
394
371
|
|
|
395
372
|
### Phase 3: Polish
|
|
396
373
|
|
|
397
374
|
**Produces:** POLISH_OUTPUT
|
|
398
|
-
**Requires:**
|
|
375
|
+
**Requires:** BASE_REF, GATE_LEVEL
|
|
399
376
|
|
|
400
|
-
|
|
377
|
+
**Gate level.** At `standard` or `lean`, once per run, run `d="${CLAUDE_CONFIG_DIR:-}"; case "$d" in /*) ;; *) d="$HOME/.claude" ;; esac; printf '%s\n' "$d"` in Bash and Read `<that directory>/skills/devflow:agent-references/references/commands/implement-levels.md` with the Read tool, and apply each row to the phase it names.
|
|
378
|
+
|
|
379
|
+
- No row or rule overrides the next two lines.
|
|
380
|
+
- If the Read fails, or the file has no `## Phases` heading with the `| Phase | standard | lean |` header, or a row breaks its grammar, apply no row, keep `GATE_LEVEL` and say `level reference unreadable: no level rows applied`.
|
|
381
|
+
- Validate, the CI gate, the evidence claims and the compliance directive run at every level. An enabled compliance lens keeps Harden.
|
|
382
|
+
|
|
383
|
+
After the Code agent completes, spawn Polish agent to polish the code. The Phase 6 Validate covers its commits. `{branch_diff}` is the output of `git diff --name-only --diff-filter=d {BASE_REF}...HEAD`, run again at each spawn; a non-zero exit stops, and an empty list counts only on exit 0.
|
|
401
384
|
|
|
402
385
|
```
|
|
403
386
|
Agent(subagent_type="Polish"):
|
|
@@ -411,9 +394,9 @@ Commit any improvements with a conventional-commit message."
|
|
|
411
394
|
### Phase 4: Self-Review
|
|
412
395
|
|
|
413
396
|
**Produces:** HARDEN_OUTPUT
|
|
414
|
-
**Requires:**
|
|
397
|
+
**Requires:** BASE_REF
|
|
415
398
|
|
|
416
|
-
After
|
|
399
|
+
After Phase 3, spawn Harden agent as the quality gate:
|
|
417
400
|
|
|
418
401
|
```
|
|
419
402
|
Agent(subagent_type="Harden"):
|
|
@@ -429,7 +412,7 @@ Harden agent reports `### Status: PASS | FIXED | BLOCKED`. **If BLOCKED:** repor
|
|
|
429
412
|
### Phase 5: Alignment Check
|
|
430
413
|
|
|
431
414
|
**Produces:** ALIGNMENT_RESULT
|
|
432
|
-
**Requires:**
|
|
415
|
+
**Requires:** BASE_REF, EXECUTION_PLAN
|
|
433
416
|
|
|
434
417
|
After Harden agent passes, spawn Evaluate agent to validate alignment. Evaluate agent receives `FEATURE_KNOWLEDGE_RULES` as acceptance context only; pattern and anti-pattern judgments belong to Harden agent:
|
|
435
418
|
|
|
@@ -466,13 +449,15 @@ Validate alignment with request and plan. Report ALIGNED or MISALIGNED with deta
|
|
|
466
449
|
### Phase 6: Validate
|
|
467
450
|
|
|
468
451
|
**Produces:** VALIDATION_RESULT, VALIDATED_HEAD
|
|
469
|
-
**Requires:**
|
|
452
|
+
**Requires:** BASE_REF, GATE_LEVEL
|
|
470
453
|
|
|
471
454
|
Validate takes the one full-suite slot, after every commit it must cover: Code, Polish, Harden and the alignment fixes. After Evaluate agent passes, spawn Validate agent. `FILES_CHANGED` is the branch diff:
|
|
472
455
|
|
|
473
456
|
```
|
|
474
457
|
Agent(subagent_type="Validate"):
|
|
475
|
-
"
|
|
458
|
+
"GATE_LEVEL: {GATE_LEVEL}
|
|
459
|
+
BASE_SHA: {BASE_REF}
|
|
460
|
+
FILES_CHANGED: {branch_diff}
|
|
476
461
|
VALIDATION_SCOPE: full
|
|
477
462
|
Run build, typecheck, lint, test. Report pass/fail with failure details."
|
|
478
463
|
```
|
|
@@ -511,7 +496,7 @@ Run build, typecheck, lint, test. Report pass/fail with failure details."
|
|
|
511
496
|
### Phase 7: QA Testing
|
|
512
497
|
|
|
513
498
|
**Produces:** QA_RESULT
|
|
514
|
-
**Requires:**
|
|
499
|
+
**Requires:** BASE_REF, EXECUTION_PLAN, TEST_PLAN, VALIDATED_HEAD
|
|
515
500
|
|
|
516
501
|
After Phase 6 passes, spawn Test agent for scenario-based acceptance testing:
|
|
517
502
|
|
|
@@ -568,21 +553,22 @@ Verify the qa-fix commits did not break anything."
|
|
|
568
553
|
### Phase 9: Open PR
|
|
569
554
|
|
|
570
555
|
**Produces:** PR_NUMBER
|
|
571
|
-
**Requires:** BASE_BRANCH, TASK_ID, ISSUE_NUMBER, ISSUE_PR_LINK, PR_EXCEPTIONS, PR_TEST_PLAN_BLOCK, PR_DESCRIPTION_GUIDANCE, APPLY_CONVENTIONS, CODE_AGENT_OUTPUT
|
|
556
|
+
**Requires:** BASE_BRANCH, BASE_REF, TASK_ID, ISSUE_NUMBER, ISSUE_PR_LINK, PR_EXCEPTIONS, PR_TEST_PLAN_BLOCK, PR_DESCRIPTION_GUIDANCE, APPLY_CONVENTIONS, CODE_AGENT_OUTPUT
|
|
572
557
|
|
|
573
|
-
Run once, after the gates, under every strategy.
|
|
558
|
+
Run once, after the gates, under every strategy. No Code agent opens a PR: the Git agent does, and it pastes `ISSUE_PR_LINK`, `PR_EXCEPTIONS` and `PR_TEST_PLAN_BLOCK` through their paste gates and scrubs the body (D11) before `gh pr create`. This command renders no link line and creates no PR itself: the Git agent's Phase-1 rendering is the only one, forwarded verbatim.
|
|
574
559
|
|
|
575
560
|
```
|
|
576
561
|
Agent(subagent_type="Git"):
|
|
577
562
|
"OPERATION: ensure-pr-ready
|
|
578
563
|
WORKTREE_PATH: {worktree}
|
|
579
564
|
BASE_BRANCH: {base branch}
|
|
565
|
+
BASE_REF: {BASE_REF}
|
|
580
566
|
TASK_ID: {task-id}
|
|
581
567
|
ISSUE_NUMBER: {ISSUE_ID captured in Phase 1, or (none)}
|
|
582
568
|
ISSUE_PR_LINK: {ISSUE_PR_LINK captured in Phase 1, or (none)}
|
|
583
569
|
PR_EXCEPTIONS: {the ## Evidence Exceptions section of {worktree}/.devflow/docs/handoff-{branch_slug}.md verbatim, or (none)}
|
|
584
570
|
PR_TEST_PLAN_BLOCK: {PR_TEST_PLAN_BLOCK verbatim, or (none)}
|
|
585
|
-
PR_DESCRIPTION_GUIDANCE: {pr_description_guidance from Phase 1 unless it is (none), then the Code agents' reports from CODE_AGENT_OUTPUT in spawn order — Implementation, Commits and Key Decisions, and a sequential agent's ## Phase {N} Implementation Summary}
|
|
571
|
+
PR_DESCRIPTION_GUIDANCE: {pr_description_guidance from Phase 1 unless it is (none), then the Code agents' reports from CODE_AGENT_OUTPUT in spawn order — Implementation, Commits and Key Decisions, and a sequential agent's ## Phase {N} Implementation Summary, then Validate's `Lint pack:` line if UNVERIFIED, for Testing}
|
|
586
572
|
APPLY_CONVENTIONS: {APPLY_CONVENTIONS}
|
|
587
573
|
COMMIT_UNCOMMITTED: false
|
|
588
574
|
Open the pull request for this branch and return the pre-flight summary."
|
|
@@ -620,7 +606,7 @@ git push origin HEAD; echo "exit=$?"
|
|
|
620
606
|
**Produces:** EVIDENCE_RESULT
|
|
621
607
|
**Requires:** PR_NUMBER, EVIDENCE_FILE, REVIEW_PUBLICATION
|
|
622
608
|
|
|
623
|
-
Run once, after Phase 10, under every strategy
|
|
609
|
+
Run once, after Phase 10, under every strategy. Skip it only when Phase 9 stopped the run. A `ci` TP reads `INDETERMINATE` only when the CI gate could not tell or did not run.
|
|
624
610
|
|
|
625
611
|
**Push first.** Every claim is keyed to the HEAD an agent reported, and a Harden or Fix agent may have committed without pushing; a claim whose SHA is not in the PR reads `UNVERIFIED`. So push the branch once before the script — never force, and no retry:
|
|
626
612
|
|
|
@@ -640,13 +626,13 @@ Drop the `--evidence` pair when that file does not exist or its path does not ma
|
|
|
640
626
|
|
|
641
627
|
### Phase 12: Report
|
|
642
628
|
|
|
643
|
-
**Requires:** VALIDATION_RESULT, ALIGNMENT_RESULT, QA_RESULT, PR_NUMBER, EVIDENCE_RESULT
|
|
629
|
+
**Requires:** VALIDATION_RESULT, ALIGNMENT_RESULT, QA_RESULT, PR_NUMBER, EVIDENCE_RESULT, GATE_LEVEL
|
|
644
630
|
|
|
645
|
-
Display completion summary with phase status, PR info, and next steps.
|
|
631
|
+
Display completion summary with phase status, `Gate level: {GATE_LEVEL}` with any level note, Validate's `Lint pack:` line if any, PR info, and next steps.
|
|
646
632
|
|
|
647
633
|
Show the test plan's evidence from Phase 11: `Test plan: {VERIFIED-CI + ATTESTED-LOCAL}/{total} verified (VERIFIED-CI {n}, ATTESTED-LOCAL {n})`, read from the `EVIDENCE` line and never inferred, then its `**Body**:` / `**Comment**:` line verbatim. Without an `EVIDENCE` line, show `Test plan: evidence unavailable`; with no test plan, `Test plan: missing`.
|
|
648
634
|
|
|
649
|
-
If any Git agent output emitted `TRACEABILITY: DEGRADED ({reason})` lines during the run, or Phase 10's push, Phase 11's push or Phase 11's script output carried one, surface them verbatim in the report under a `### Traceability` subsection so the user can act on them.
|
|
635
|
+
If any Git agent output emitted `TRACEABILITY: DEGRADED ({reason})` lines during the run, or the fresh base step, Phase 10's push, Phase 11's push or Phase 11's script output carried one, surface them verbatim in the report under a `### Traceability` subsection so the user can act on them.
|
|
650
636
|
|
|
651
637
|
If Phase 9 listed uncommitted files, show them as a `### Uncommitted files` subsection: the user commits them or discards them.
|
|
652
638
|
|
|
@@ -654,14 +640,6 @@ If Phase 1 recorded an evidence exception, show its `## Evidence Exceptions` lin
|
|
|
654
640
|
|
|
655
641
|
### Feature Knowledge Write-Back (Conditional)
|
|
656
642
|
|
|
657
|
-
Resolve `{worktree}` as the checkout's toplevel, because feature knowledge bases are committed with the branch (D-PROMPT-ROOT): from the start directory — `WORKTREE_PATH` if provided, otherwise cwd (`devflow:worktree-support`) — run
|
|
658
|
-
|
|
659
|
-
```bash
|
|
660
|
-
git -C "{start}" rev-parse --show-toplevel
|
|
661
|
-
```
|
|
662
|
-
|
|
663
|
-
and use its one-line output. If the command fails (outside a git repository), `{worktree}` is the start directory itself. All paths below are relative to `{worktree}`.
|
|
664
|
-
|
|
665
643
|
**Step 1 — Check the opt-out gate, with `{root}` = `{worktree}`:** take the settings line resolved above for that root, resolving it with the settings block when this run has not yet.
|
|
666
644
|
|
|
667
645
|
If the settings line says `KNOWLEDGE=off`, skip write-back entirely. The machine switch (`devflow knowledge --disable`), the repository and the personal settings can each turn knowledge off, and none can turn it back on (D-FEATURES-NARROW-ONLY). The fail-closed line says `KNOWLEDGE=off` too, so an unresolvable line skips write-back.
|
|
@@ -706,13 +684,10 @@ When the Knowledge agent reports `KB_COMMIT: skipped (detached HEAD)`, the files
|
|
|
706
684
|
## Architecture
|
|
707
685
|
|
|
708
686
|
```
|
|
709
|
-
/implement
|
|
710
|
-
│
|
|
711
|
-
├─ Re-validation Path (when user says "re-validate"/"re-check"/"re-run gates")
|
|
712
|
-
│ └─ Branch safety → skip Phase 2 → record BASE_BRANCH → Phases 3-8 → Phase 9, 11, 12
|
|
687
|
+
/implement
|
|
713
688
|
│
|
|
714
689
|
├─ Phase 1: Setup
|
|
715
|
-
├─ Phase 2: Implement
|
|
690
|
+
├─ Phase 2: Implement
|
|
716
691
|
├─ Phase 3: Polish
|
|
717
692
|
├─ Phase 4: Self-Review
|
|
718
693
|
├─ Phase 5: Alignment Check
|
|
@@ -721,7 +696,7 @@ When the Knowledge agent reports `KB_COMMIT: skipped (detached HEAD)`, the files
|
|
|
721
696
|
├─ Phase 8: Re-Validate (only if a qa-fix committed)
|
|
722
697
|
├─ Phase 9: Open PR (every strategy, outside the strategy branches)
|
|
723
698
|
├─ Phase 10: CI Status Gate (every strategy)
|
|
724
|
-
├─ Phase 11: Evidence (every strategy
|
|
699
|
+
├─ Phase 11: Evidence (every strategy)
|
|
725
700
|
├─ Phase 12: Report
|
|
726
701
|
│
|
|
727
702
|
└─ Feature Knowledge Write-Back (Conditional)
|
|
@@ -729,15 +704,11 @@ When the Knowledge agent reports `KB_COMMIT: skipped (detached HEAD)`, the files
|
|
|
729
704
|
|
|
730
705
|
## Principles
|
|
731
706
|
|
|
732
|
-
1. **Orchestration only** - Command spawns agents, never does work itself; the inline calls are the bounded plumbing the charter allows: the Phase 10 and
|
|
733
|
-
2. **
|
|
734
|
-
3. **
|
|
735
|
-
4. **
|
|
736
|
-
5. **Validate agent owns validation** - Never run `npm test`, `npm run build`, or similar in main session; always delegate to Validate agent
|
|
737
|
-
6. **Fix agent owns fixes** - Never implement fixes in main session; spawn Fix agent for validation failures and alignment fixes
|
|
738
|
-
7. **Loop limits** - Max 2 validation retries, max 2 alignment fix iterations, max 2 QA retries before escalating to user; the CI gate allows at most 3 waits and 2 fixes
|
|
739
|
-
8. **CI awareness** - CI status is checked before merge under every strategy, once Phase 9 has opened the PR; test-plan evidence (Phase 11) is recorded under every strategy once the PR exists
|
|
707
|
+
1. **Orchestration only** - Command spawns agents, never does work itself (no tests, builds or fixes); "Spawn X" means call the Agent tool; the inline calls are the bounded plumbing the charter allows: the fresh base step's resolver calls (Phase 1, re-validation), the Phase 10 and 11 pushes, the Phase 10 ci-wait call, the Phase 11 evidence publish call and the evidence script checks
|
|
708
|
+
2. **Honest reporting** - Display agent outputs directly
|
|
709
|
+
3. **Loop limits** - Max 2 validation retries, max 2 alignment fix iterations, max 2 QA retries before escalating to user; the CI gate allows at most 3 waits and 2 fixes
|
|
710
|
+
4. **CI awareness** - CI status is checked before merge; test-plan evidence (Phase 11) is recorded under every strategy
|
|
740
711
|
|
|
741
712
|
## Error Handling
|
|
742
713
|
|
|
743
|
-
If any agent fails, report the phase, agent type
|
|
714
|
+
If any agent fails, report the phase, agent type and error. Offer: retry the phase, investigate, or escalate to user.
|
package/dist/commands/plan.md
CHANGED
|
@@ -108,13 +108,13 @@ If the user says "skip" or "just proceed" — skip remaining questions, present
|
|
|
108
108
|
**Produces:** SKIM_CONTEXT, DECISIONS_CONTEXT, FEATURE_KNOWLEDGE, FEATURE_KNOWLEDGE_RULES, GATE_LEVEL
|
|
109
109
|
**Requires:** CONFIRMED_SCOPE
|
|
110
110
|
|
|
111
|
-
**Resolve the settings line** once per worktree root, reusing a line this run already resolved for the same root. `{root}` is the worktree the values are for — the repository root
|
|
111
|
+
**Resolve the settings line** once per worktree root, reusing a line this run already resolved for the same root. `{root}` is the worktree the values are for — the repository root in a one-worktree run:
|
|
112
112
|
|
|
113
113
|
```bash
|
|
114
114
|
node "$HOME/.devflow/scripts/resolve-settings.cjs" "{root}" 2>/dev/null; echo "exit=$?"
|
|
115
115
|
```
|
|
116
116
|
|
|
117
|
-
Accept the output only when it is exactly two lines: `exit=0` last and, before it, one line of the form `TRACKER=<github|jira|linear> TRACKER_SOURCE=<project|personal|machine|default> TRACKER_WARN=<none|mismatch|invalid> SITE=<none|https://<host>> KEY=<none|<key>> REVIEW_PUBLICATION=<off|auto|full> COMPLIANCE=<off|generic|<id>[,<id>…]> MEMORY=<on|off>
|
|
117
|
+
Accept the output only when it is exactly two lines: `exit=0` last and, before it, one line of the form `TRACKER=<github|jira|linear> TRACKER_SOURCE=<project|personal|machine|default> TRACKER_WARN=<none|mismatch|invalid> SITE=<none|https://<host>> KEY=<none|<key>> REVIEW_PUBLICATION=<off|auto|full> COMPLIANCE=<off|generic|<id>[,<id>…]> MEMORY=<on|off> CURATION=<on|off> KNOWLEDGE=<on|off> GATE_LEVEL=<full|standard|lean>` — these fields, in this order, nothing else, where `<host>` is a lowercase dotted host name alone, `<key>` is 2–10 of `A-Z`, `0-9` and `_` starting with a letter, and each `<id>` is one of `gdpr`, `hipaa`, `pci-dss`, `soc2`, `iso-27001`, `sox`. **Anything else** (a non-zero exit, no line, extra text, or a missing, reordered or unlisted field or value) ⇒ use `TRACKER=github TRACKER_SOURCE=default TRACKER_WARN=invalid SITE=none KEY=none REVIEW_PUBLICATION=off COMPLIANCE=generic MEMORY=off CURATION=off KNOWLEDGE=off GATE_LEVEL=full` instead.
|
|
118
118
|
|
|
119
119
|
The accepted line is the only source of these values.
|
|
120
120
|
|
|
@@ -123,7 +123,7 @@ Spawn Skim agent for codebase context:
|
|
|
123
123
|
```
|
|
124
124
|
Agent(subagent_type="Skim"):
|
|
125
125
|
"Orient in codebase for design planning: {feature/issues}
|
|
126
|
-
|
|
126
|
+
CURATION: {CURATION from the settings line}
|
|
127
127
|
Run rskim on source directories (NOT repo root) to identify:
|
|
128
128
|
- Existing patterns and conventions in the affected area
|
|
129
129
|
- File structure and module boundaries
|
|
@@ -142,7 +142,7 @@ and using its one-line output. If the command fails (outside a git repository),
|
|
|
142
142
|
|
|
143
143
|
### Load DECISIONS_CONTEXT
|
|
144
144
|
|
|
145
|
-
When the settings line says `
|
|
145
|
+
When the settings line says `CURATION=off`, set `DECISIONS_CONTEXT` to `(none)` and skip this step, locating no ledger and reading no index.
|
|
146
146
|
|
|
147
147
|
The decisions ledger belongs to the repository, not to one checkout: a linked worktree reads the main worktree's copy, a subdirectory session the repository root's. Locate it with ONE git call, run from the start directory — `WORKTREE_PATH` if provided, otherwise cwd (`devflow:worktree-support`):
|
|
148
148
|
|
|
@@ -156,11 +156,11 @@ Line 1 is the checkout's toplevel, line 2 the common git directory. A git older
|
|
|
156
156
|
2. **The toplevel** — line 1, or on an older git the line after the echoed flag.
|
|
157
157
|
3. **The start directory itself** — when the command failed or printed no absolute toplevel (outside a git repository).
|
|
158
158
|
|
|
159
|
-
This is the rule the
|
|
159
|
+
This is the rule the curation hooks apply, so you read the index the Curate agent writes.
|
|
160
160
|
|
|
161
161
|
**Step 1 — Read the pre-rendered index:**
|
|
162
162
|
|
|
163
|
-
Attempt to read `{ledger}/.devflow/
|
|
163
|
+
Attempt to read `{ledger}/.devflow/curation/index.md`.
|
|
164
164
|
|
|
165
165
|
- If the file exists and contains non-empty content: use that content as `DECISIONS_CONTEXT`.
|
|
166
166
|
- If the file is absent or empty: set `DECISIONS_CONTEXT` to `(none)`.
|
package/dist/commands/release.md
CHANGED
|
@@ -52,17 +52,17 @@ Read `.release/RELEASE-FLOW.md`:
|
|
|
52
52
|
|
|
53
53
|
**Produces:** DECISIONS_CONTEXT, FEATURE_KNOWLEDGE, FEATURE_KNOWLEDGE_RULES
|
|
54
54
|
|
|
55
|
-
**Resolve the settings line** once per worktree root, reusing a line this run already resolved for the same root. `{root}` is the worktree the values are for — the repository root
|
|
55
|
+
**Resolve the settings line** once per worktree root, reusing a line this run already resolved for the same root. `{root}` is the worktree the values are for — the repository root in a one-worktree run:
|
|
56
56
|
|
|
57
57
|
```bash
|
|
58
58
|
node "$HOME/.devflow/scripts/resolve-settings.cjs" "{root}" 2>/dev/null; echo "exit=$?"
|
|
59
59
|
```
|
|
60
60
|
|
|
61
|
-
Accept the output only when it is exactly two lines: `exit=0` last and, before it, one line of the form `TRACKER=<github|jira|linear> TRACKER_SOURCE=<project|personal|machine|default> TRACKER_WARN=<none|mismatch|invalid> SITE=<none|https://<host>> KEY=<none|<key>> REVIEW_PUBLICATION=<off|auto|full> COMPLIANCE=<off|generic|<id>[,<id>…]> MEMORY=<on|off>
|
|
61
|
+
Accept the output only when it is exactly two lines: `exit=0` last and, before it, one line of the form `TRACKER=<github|jira|linear> TRACKER_SOURCE=<project|personal|machine|default> TRACKER_WARN=<none|mismatch|invalid> SITE=<none|https://<host>> KEY=<none|<key>> REVIEW_PUBLICATION=<off|auto|full> COMPLIANCE=<off|generic|<id>[,<id>…]> MEMORY=<on|off> CURATION=<on|off> KNOWLEDGE=<on|off> GATE_LEVEL=<full|standard|lean>` — these fields, in this order, nothing else, where `<host>` is a lowercase dotted host name alone, `<key>` is 2–10 of `A-Z`, `0-9` and `_` starting with a letter, and each `<id>` is one of `gdpr`, `hipaa`, `pci-dss`, `soc2`, `iso-27001`, `sox`. **Anything else** (a non-zero exit, no line, extra text, or a missing, reordered or unlisted field or value) ⇒ use `TRACKER=github TRACKER_SOURCE=default TRACKER_WARN=invalid SITE=none KEY=none REVIEW_PUBLICATION=off COMPLIANCE=generic MEMORY=off CURATION=off KNOWLEDGE=off GATE_LEVEL=full` instead.
|
|
62
62
|
|
|
63
63
|
The accepted line is the only source of these values.
|
|
64
64
|
|
|
65
|
-
When the settings line says `
|
|
65
|
+
When the settings line says `CURATION=off`, set `DECISIONS_CONTEXT` to `(none)` and skip this step, locating no ledger and reading no index.
|
|
66
66
|
|
|
67
67
|
The decisions ledger belongs to the repository, not to one checkout: a linked worktree reads the main worktree's copy, a subdirectory session the repository root's. Locate it with ONE git call, run from the start directory — `WORKTREE_PATH` if provided, otherwise cwd (`devflow:worktree-support`):
|
|
68
68
|
|
|
@@ -76,9 +76,9 @@ Line 1 is the checkout's toplevel, line 2 the common git directory. A git older
|
|
|
76
76
|
2. **The toplevel** — line 1, or on an older git the line after the echoed flag.
|
|
77
77
|
3. **The start directory itself** — when the command failed or printed no absolute toplevel (outside a git repository).
|
|
78
78
|
|
|
79
|
-
This is the rule the
|
|
79
|
+
This is the rule the curation hooks apply, so you read the index the Curate agent writes.
|
|
80
80
|
|
|
81
|
-
Read `{ledger}/.devflow/
|
|
81
|
+
Read `{ledger}/.devflow/curation/index.md`. If the file is absent or empty, set `DECISIONS_CONTEXT` to `(none)`; otherwise use the file content as `DECISIONS_CONTEXT`.
|
|
82
82
|
|
|
83
83
|
Hand each agent that takes `DECISIONS_CONTEXT` a slice, not the whole index: the index lines whose title, scope or area touch the files and task it works on, verbatim, led by `(slice: N of M entries — full index: <absolute index path>)` and closed by the index footer. When unsure, include the line. Siblings over one diff share ONE slice.
|
|
84
84
|
|
|
@@ -41,19 +41,19 @@ git -C "{start}" rev-parse --show-toplevel
|
|
|
41
41
|
|
|
42
42
|
and using its one-line output. If the command fails (outside a git repository), `{worktree}` is the start directory itself. Every docs path below is written `{worktree}/.devflow/docs/…`; a repo-relative docs path handed to an agent always travels with a `WORKTREE_PATH` naming the checkout it is relative to.
|
|
43
43
|
|
|
44
|
-
**Resolve the settings line** once per worktree root, reusing a line this run already resolved for the same root. `{root}` is the worktree the values are for — the repository root
|
|
44
|
+
**Resolve the settings line** once per worktree root, reusing a line this run already resolved for the same root. `{root}` is the worktree the values are for — the repository root in a one-worktree run:
|
|
45
45
|
|
|
46
46
|
```bash
|
|
47
47
|
node "$HOME/.devflow/scripts/resolve-settings.cjs" "{root}" 2>/dev/null; echo "exit=$?"
|
|
48
48
|
```
|
|
49
49
|
|
|
50
|
-
Accept the output only when it is exactly two lines: `exit=0` last and, before it, one line of the form `TRACKER=<github|jira|linear> TRACKER_SOURCE=<project|personal|machine|default> TRACKER_WARN=<none|mismatch|invalid> SITE=<none|https://<host>> KEY=<none|<key>> REVIEW_PUBLICATION=<off|auto|full> COMPLIANCE=<off|generic|<id>[,<id>…]> MEMORY=<on|off>
|
|
50
|
+
Accept the output only when it is exactly two lines: `exit=0` last and, before it, one line of the form `TRACKER=<github|jira|linear> TRACKER_SOURCE=<project|personal|machine|default> TRACKER_WARN=<none|mismatch|invalid> SITE=<none|https://<host>> KEY=<none|<key>> REVIEW_PUBLICATION=<off|auto|full> COMPLIANCE=<off|generic|<id>[,<id>…]> MEMORY=<on|off> CURATION=<on|off> KNOWLEDGE=<on|off> GATE_LEVEL=<full|standard|lean>` — these fields, in this order, nothing else, where `<host>` is a lowercase dotted host name alone, `<key>` is 2–10 of `A-Z`, `0-9` and `_` starting with a letter, and each `<id>` is one of `gdpr`, `hipaa`, `pci-dss`, `soc2`, `iso-27001`, `sox`. **Anything else** (a non-zero exit, no line, extra text, or a missing, reordered or unlisted field or value) ⇒ use `TRACKER=github TRACKER_SOURCE=default TRACKER_WARN=invalid SITE=none KEY=none REVIEW_PUBLICATION=off COMPLIANCE=generic MEMORY=off CURATION=off KNOWLEDGE=off GATE_LEVEL=full` instead.
|
|
51
51
|
|
|
52
52
|
The accepted line is the only source of these values.
|
|
53
53
|
|
|
54
54
|
### Load DECISIONS_CONTEXT
|
|
55
55
|
|
|
56
|
-
When the settings line says `
|
|
56
|
+
When the settings line says `CURATION=off`, set `DECISIONS_CONTEXT` to `(none)` and skip this step, locating no ledger and reading no index.
|
|
57
57
|
|
|
58
58
|
The decisions ledger belongs to the repository, not to one checkout: a linked worktree reads the main worktree's copy, a subdirectory session the repository root's. Locate it with ONE git call, run from the start directory — `WORKTREE_PATH` if provided, otherwise cwd (`devflow:worktree-support`):
|
|
59
59
|
|
|
@@ -67,11 +67,11 @@ Line 1 is the checkout's toplevel, line 2 the common git directory. A git older
|
|
|
67
67
|
2. **The toplevel** — line 1, or on an older git the line after the echoed flag.
|
|
68
68
|
3. **The start directory itself** — when the command failed or printed no absolute toplevel (outside a git repository).
|
|
69
69
|
|
|
70
|
-
This is the rule the
|
|
70
|
+
This is the rule the curation hooks apply, so you read the index the Curate agent writes.
|
|
71
71
|
|
|
72
72
|
**Step 1 — Read the pre-rendered index:**
|
|
73
73
|
|
|
74
|
-
Attempt to read `{ledger}/.devflow/
|
|
74
|
+
Attempt to read `{ledger}/.devflow/curation/index.md`.
|
|
75
75
|
|
|
76
76
|
- If the file exists and contains non-empty content: use that content as `DECISIONS_CONTEXT`.
|
|
77
77
|
- If the file is absent or empty: set `DECISIONS_CONTEXT` to `(none)`.
|
|
@@ -166,7 +166,7 @@ Analyze the research question to infer research types needed (min 2, max 5). For
|
|
|
166
166
|
|
|
167
167
|
Only if `codebase` type is in RESEARCH_PLAN.
|
|
168
168
|
|
|
169
|
-
Spawn `Agent(subagent_type="Skim")` with `
|
|
169
|
+
Spawn `Agent(subagent_type="Skim")` with `CURATION` from the settings line, targeting codebase areas relevant to the research question.
|
|
170
170
|
|
|
171
171
|
Skip and set ORIENT_OUTPUT = "(none)" if `codebase` type is not in RESEARCH_PLAN.
|
|
172
172
|
|