devflow-kit 2.4.0 → 3.0.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 +229 -0
- package/README.md +111 -18
- package/dist/agents/git.md +822 -0
- package/dist/cli/commands/agents.js +6 -1
- package/dist/cli/commands/ambient.js +160 -145
- package/dist/cli/commands/attribution-prompts.js +1 -1
- package/dist/cli/commands/capture.js +29 -55
- package/dist/cli/commands/compliance-prompts.js +1 -1
- package/dist/cli/commands/compliance.js +48 -55
- package/dist/cli/commands/context.js +17 -32
- package/dist/cli/commands/debug.js +65 -26
- package/dist/cli/commands/flags.js +3 -3
- package/dist/cli/commands/hud.js +34 -10
- package/dist/cli/commands/init-seed.js +61 -27
- package/dist/cli/commands/init.js +649 -240
- package/dist/cli/commands/install-report.js +200 -0
- package/dist/cli/commands/knowledge/index.js +2 -2
- package/dist/cli/commands/knowledge/toggle.js +35 -37
- package/dist/cli/commands/learning.js +79 -57
- package/dist/cli/commands/legacy-hooks.js +11 -14
- package/dist/cli/commands/memory.js +134 -135
- package/dist/cli/commands/prompt-io.js +4 -4
- package/dist/cli/commands/proxy.js +23 -41
- package/dist/cli/commands/security.js +81 -29
- package/dist/cli/commands/skills.js +71 -7
- package/dist/cli/commands/tracker-prompts.js +145 -0
- package/dist/cli/commands/tracker.js +277 -0
- package/dist/cli/commands/uninstall.js +520 -169
- package/dist/cli.js +2 -0
- package/dist/commands/bug-analysis.md +58 -14
- package/dist/commands/code-review.md +110 -32
- package/dist/commands/debug.md +55 -11
- package/dist/commands/dynamic-build.md +344 -73
- package/dist/commands/dynamic-plan.md +77 -27
- package/dist/commands/dynamic-profile.md +25 -11
- package/dist/commands/dynamic-tickets.md +76 -15
- package/dist/commands/explore.md +37 -7
- package/dist/commands/implement.md +314 -62
- package/dist/commands/plan.md +146 -32
- package/dist/commands/release.md +64 -17
- package/dist/commands/research.md +34 -8
- package/dist/commands/resolve.md +196 -68
- package/dist/commands/self-review.md +45 -9
- package/dist/core/agent-models.js +55 -12
- package/dist/core/assets.js +58 -2
- package/dist/core/compliance-compose.js +27 -27
- package/dist/core/evidence-policy.js +363 -0
- package/dist/core/feature-config.js +200 -65
- package/dist/core/feature-switch.js +112 -0
- package/dist/core/flags.js +34 -6
- package/dist/core/fs-atomic.js +27 -0
- package/dist/core/hook-log-dirs.js +104 -0
- package/dist/core/learning-tuning-config.js +5 -3
- package/dist/core/ledger-root.js +102 -0
- package/dist/core/manifest.js +38 -10
- package/dist/core/mds-variants.js +798 -0
- package/dist/core/migrations.js +49 -23
- package/dist/core/model-discovery.js +12 -1
- package/dist/core/plugins.js +361 -12
- package/dist/core/project-paths.js +1 -18
- package/dist/core/proxy-log.js +8 -6
- package/dist/core/proxy-state.js +11 -8
- package/dist/core/reference-sweep.js +136 -0
- package/dist/core/same-location.js +25 -0
- package/dist/core/tracker.js +494 -0
- package/dist/hud/components/config-counts.js +15 -4
- package/dist/hud/components/learning-counts.js +14 -0
- package/dist/hud/config.js +2 -1
- package/dist/hud/cost-history.js +2 -4
- package/dist/hud/git.js +52 -7
- package/dist/hud/index.js +7 -9
- package/dist/skills/git/references/decision-markers.md +19 -0
- package/dist/skills/git/references/learn-conventions.md +56 -0
- package/dist/skills/git/references/pr/check-ci-status.md +14 -0
- package/dist/skills/git/references/pr/check-merge-readiness.md +28 -0
- package/dist/skills/git/references/pr/ensure-pr-ready.md +24 -0
- package/dist/skills/git/references/pr/fetch-review-threads.md +22 -0
- package/dist/skills/git/references/pr/post-resolution-summary.md +40 -0
- package/dist/skills/git/references/pr/post-review-summary.md +42 -0
- package/dist/skills/git/references/pr/resolve-review-threads.md +35 -0
- package/dist/skills/git/references/pr/update-pr-evidence.md +14 -0
- package/dist/skills/git/references/pr/validate-branch.md +18 -0
- package/dist/skills/git/references/publication-gate.md +13 -0
- package/dist/skills/git/references/tracker/_mcp.md +153 -0
- package/dist/skills/git/references/tracker/github/associate-release.md +18 -0
- package/dist/skills/git/references/tracker/github/backlink-shipped-issues.md +40 -0
- package/dist/skills/git/references/tracker/github/create-release.md +11 -0
- package/dist/skills/git/references/tracker/github/ensure-pr-ready.md +16 -0
- package/dist/skills/git/references/tracker/github/ensure-traceable-issue.md +69 -0
- package/dist/skills/git/references/tracker/github/fetch-issue.md +32 -0
- package/dist/skills/git/references/tracker/github/fetch-issues-batch.md +17 -0
- package/dist/skills/git/references/tracker/github/gather-release-evidence.md +19 -0
- package/dist/skills/git/references/tracker/github/manage-debt.md +101 -0
- package/dist/skills/git/references/tracker/github/post-wave-report.md +28 -0
- package/dist/skills/git/references/tracker/github/setup-task.md +26 -0
- package/dist/skills/git/references/tracker/jira/associate-release.md +18 -0
- package/dist/skills/git/references/tracker/jira/backlink-shipped-issues.md +49 -0
- package/dist/skills/git/references/tracker/jira/create-release.md +17 -0
- package/dist/skills/git/references/tracker/jira/ensure-pr-ready.md +22 -0
- package/dist/skills/git/references/tracker/jira/ensure-traceable-issue.md +53 -0
- package/dist/skills/git/references/tracker/jira/fetch-issue.md +14 -0
- package/dist/skills/git/references/tracker/jira/fetch-issues-batch.md +15 -0
- package/dist/skills/git/references/tracker/jira/gather-release-evidence.md +18 -0
- package/dist/skills/git/references/tracker/jira/manage-debt.md +37 -0
- package/dist/skills/git/references/tracker/jira/post-wave-report.md +33 -0
- package/dist/skills/git/references/tracker/jira/setup-task.md +31 -0
- package/dist/skills/git/references/tracker/linear/associate-release.md +18 -0
- package/dist/skills/git/references/tracker/linear/backlink-shipped-issues.md +53 -0
- package/dist/skills/git/references/tracker/linear/create-release.md +17 -0
- package/dist/skills/git/references/tracker/linear/ensure-pr-ready.md +22 -0
- package/dist/skills/git/references/tracker/linear/ensure-traceable-issue.md +53 -0
- package/dist/skills/git/references/tracker/linear/fetch-issue.md +14 -0
- package/dist/skills/git/references/tracker/linear/fetch-issues-batch.md +15 -0
- package/dist/skills/git/references/tracker/linear/gather-release-evidence.md +18 -0
- package/dist/skills/git/references/tracker/linear/manage-debt.md +37 -0
- package/dist/skills/git/references/tracker/linear/post-wave-report.md +33 -0
- package/dist/skills/git/references/tracker/linear/setup-task.md +32 -0
- package/dist/skills/git/references/trust-rule.md +7 -0
- package/dist/targets/claude-code/claude-paths.js +59 -57
- package/dist/targets/claude-code/compliance-install.js +49 -65
- package/dist/targets/claude-code/hooks.js +108 -3
- package/dist/targets/claude-code/installer.js +1187 -32
- package/dist/targets/claude-code/legacy.js +5 -0
- package/dist/targets/claude-code/post-install.js +366 -151
- package/dist/targets/claude-code/tracker-install.js +134 -0
- package/package.json +8 -6
- package/src/assets/agents/code.md +45 -6
- package/src/assets/agents/design.md +2 -1
- package/src/assets/agents/git.mds +825 -0
- package/src/assets/agents/knowledge.md +3 -3
- package/src/assets/agents/learning.md +11 -0
- package/src/assets/agents/review.md +3 -1
- package/src/assets/agents/synthesize.md +1 -1
- package/src/assets/agents/test.md +16 -5
- package/src/assets/agents/tracker.md +474 -0
- package/src/assets/agents/validate.md +7 -5
- package/src/assets/commands/_partials/_compliance.mds +19 -1
- package/src/assets/commands/_partials/_decisions.mds +15 -3
- package/src/assets/commands/_partials/_docs_root.mds +35 -0
- package/src/assets/commands/_partials/_engine.mds +13 -11
- package/src/assets/commands/_partials/_evidence_policy.mds +30 -0
- package/src/assets/commands/_partials/_factory.mds +1 -1
- package/src/assets/commands/_partials/_knowledge.mds +27 -9
- package/src/assets/commands/_partials/_plan_contract.mds +22 -7
- package/src/assets/commands/_partials/_preamble.mds +2 -2
- package/src/assets/commands/_partials/_publication.mds +8 -2
- package/src/assets/commands/_partials/_settings.mds +28 -0
- package/src/assets/commands/_partials/_ticket_template.mds +3 -2
- package/src/assets/commands/_partials/_tracker.mds +18 -0
- package/src/assets/commands/_partials/_wave.mds +16 -10
- package/src/assets/commands/bug-analysis.mds +31 -19
- package/src/assets/commands/code-review.mds +67 -41
- package/src/assets/commands/debug.mds +13 -7
- package/src/assets/commands/dynamic-build.mds +274 -66
- package/src/assets/commands/dynamic-plan.mds +50 -23
- package/src/assets/commands/dynamic-profile.mds +24 -11
- package/src/assets/commands/dynamic-tickets.mds +63 -16
- package/src/assets/commands/explore.mds +4 -5
- package/src/assets/commands/implement.mds +234 -67
- package/src/assets/commands/plan.mds +91 -33
- package/src/assets/commands/release.md +64 -17
- package/src/assets/commands/research.mds +11 -9
- package/src/assets/commands/resolve.mds +150 -78
- package/src/assets/commands/self-review.mds +24 -25
- package/src/assets/mds/git/_pr.mds +331 -0
- package/src/assets/mds/git/_references.mds +135 -0
- package/src/assets/mds/tracker/_common.mds +156 -0
- package/src/assets/mds/tracker/_github.mds +472 -0
- package/src/assets/mds/tracker/_jira.mds +407 -0
- package/src/assets/mds/tracker/_linear.mds +449 -0
- package/src/assets/mds/tracker/_mcp.mds +305 -0
- package/src/assets/scripts/hooks/assets/orchestrator-charter.md +5 -8
- package/src/assets/scripts/hooks/background-memory-update +40 -19
- package/src/assets/scripts/hooks/capture-prompt +18 -8
- package/src/assets/scripts/hooks/capture-question +18 -8
- package/src/assets/scripts/hooks/capture-turn +27 -13
- package/src/assets/scripts/hooks/debug-trace +11 -6
- package/src/assets/scripts/hooks/ensure-devflow-init +33 -6
- package/src/assets/scripts/hooks/ensure-proxy +9 -8
- package/src/assets/scripts/hooks/ensure-root-gitignore +236 -60
- package/src/assets/scripts/hooks/git-marker +48 -0
- package/src/assets/scripts/hooks/hook-log-init +3 -1
- package/src/assets/scripts/hooks/json-helper.cjs +228 -5
- package/src/assets/scripts/hooks/lib/project-paths.cjs +1 -20
- package/src/assets/scripts/hooks/log-paths +80 -0
- package/src/assets/scripts/hooks/memory-worker +22 -13
- package/src/assets/scripts/hooks/pre-compact-memory +44 -15
- package/src/assets/scripts/hooks/preamble +1 -4
- package/src/assets/scripts/hooks/queue-append +146 -28
- package/src/assets/scripts/hooks/resolve-project-root +101 -7
- package/src/assets/scripts/hooks/session-start-context +534 -20
- package/src/assets/scripts/hooks/session-start-memory +38 -15
- package/src/assets/scripts/lib/project-config.cjs +633 -0
- package/src/assets/scripts/pr-evidence.cjs +1961 -0
- package/src/assets/scripts/redact-secrets.cjs +490 -62
- package/src/assets/scripts/release-trace.cjs +1143 -0
- package/src/assets/scripts/resolve-evidence-policy.cjs +1145 -0
- package/src/assets/scripts/resolve-settings.cjs +1054 -0
- package/src/assets/scripts/verify-evidence.cjs +1822 -0
- package/src/assets/skills/compliance/SKILL.md +4 -2
- package/src/assets/skills/docs-framework/SKILL.md +11 -10
- package/src/assets/skills/docs-framework/references/patterns.md +10 -17
- package/src/assets/skills/gap-analysis/SKILL.md +2 -2
- package/src/assets/skills/git/SKILL.md +8 -78
- package/src/assets/skills/git/references/github-api.md +179 -141
- package/src/assets/skills/git/references/patterns.md +11 -6
- package/src/assets/skills/review-methodology/SKILL.md +1 -1
- package/src/assets/skills/review-methodology/references/patterns.md +6 -61
- package/src/assets/skills/review-methodology/references/violations.md +14 -22
- package/src/assets/skills/worktree-support/SKILL.md +1 -1
- package/src/assets/skills/worktree-support/references/roots.md +29 -0
- package/src/targets/claude-code/templates/managed-settings.json +25 -9
- package/src/assets/agents/git.md +0 -938
|
@@ -4,10 +4,11 @@ argument-hint: "[tickets-dir | issue-list]"
|
|
|
4
4
|
output-dir: dist/commands
|
|
5
5
|
---
|
|
6
6
|
@import { authoring_preamble } from "./_partials/_preamble.mds"
|
|
7
|
+
@import { docs_root } from "./_partials/_docs_root.mds"
|
|
7
8
|
@import { agent_roster, agent_caveats } from "./_partials/_roster.mds"
|
|
8
9
|
@import { acceptance_criteria_contract } from "./_partials/_plan_contract.mds"
|
|
9
|
-
|
|
10
|
-
{authoring_preamble()}
|
|
10
|
+
@import { issue_ref_grammar, issue_capture_contract } from "./_partials/_tracker.mds"
|
|
11
|
+
{{authoring_preamble()}}
|
|
11
12
|
|
|
12
13
|
---
|
|
13
14
|
|
|
@@ -15,14 +16,14 @@ output-dir: dist/commands
|
|
|
15
16
|
|
|
16
17
|
This command instructs you to construct and run a Claude Code dynamic Workflow that plans all tickets in parallel, challenges each plan (gaps, edge cases, side-effects), produces well-structured acceptance criteria and a test plan for each ticket (consumed by `/devflow:dynamic-build`'s Gate 2), runs a cross-plan conflict critic, auto-resolves decisions matching the user's preference profile, and writes per-ticket plan files + one `DECISIONS-NEEDED.md`.
|
|
17
18
|
|
|
18
|
-
{agent_roster()}
|
|
19
|
+
{{agent_roster()}}
|
|
19
20
|
|
|
20
|
-
{agent_caveats()}
|
|
21
|
+
{{agent_caveats()}}
|
|
21
22
|
|
|
22
23
|
---
|
|
23
24
|
|
|
24
|
-
**Requires:** ticket files directory or
|
|
25
|
-
**Produces:** per-ticket plan files + `DECISIONS-NEEDED.md` at
|
|
25
|
+
**Requires:** ticket files directory or tracker issue list; optional `~/.devflow/preference-profile.md`
|
|
26
|
+
**Produces:** per-ticket plan files + `DECISIONS-NEEDED.md` at `{worktree}/.devflow/docs/design/{slug}/{ts}/`
|
|
26
27
|
|
|
27
28
|
---
|
|
28
29
|
|
|
@@ -32,13 +33,17 @@ Before authoring, verify:
|
|
|
32
33
|
|
|
33
34
|
1. **Workflow tool available:** if the `Workflow` tool is not in your available tools, STOP and tell the user: "The Workflow tool is not available in this session. dynamic-plan requires Claude Code's dynamic workflow runtime."
|
|
34
35
|
2. **`agentType` support:** confirmed available (spike F5, 2026-06-11).
|
|
35
|
-
3. **
|
|
36
|
-
4. **No-remote path:** if the repo has no remote,
|
|
36
|
+
3. **Tracker paths:** a list of issue references or URLs is read through the Git agent, which resolves the configured tracker and its access itself and reports `TRACEABILITY: DEGRADED ({reason})` when it cannot read an issue — then fall back to reading ticket `.md` files from a local path. No tracker CLI is checked here.
|
|
37
|
+
4. **No-remote path:** if the repo has no remote, read ticket files from the provided local path; the Git agent reports DEGRADED for any issue it cannot reach.
|
|
37
38
|
|
|
38
39
|
---
|
|
39
40
|
|
|
40
41
|
### Pre-authoring setup
|
|
41
42
|
|
|
43
|
+
{{docs_root()}}
|
|
44
|
+
|
|
45
|
+
Pass `{worktree}` to the workflow as its `root` argument.
|
|
46
|
+
|
|
42
47
|
**1. Apply decisions context**
|
|
43
48
|
|
|
44
49
|
Apply the `devflow:apply-decisions` algorithm to the DECISIONS_CONTEXT loaded per the preamble above: scan the index, Read relevant entries, note verbatim ADR/PF IDs to inject into Design agent and Evaluate agent prompts.
|
|
@@ -56,11 +61,15 @@ If present, note its contents as `PREFERENCE_PROFILE`. This will be used to auto
|
|
|
56
61
|
|
|
57
62
|
Determine the ticket source (in priority order):
|
|
58
63
|
- A directory of ticket `.md` files (from `/devflow:dynamic-tickets` output)
|
|
59
|
-
- A list of
|
|
64
|
+
- A list of candidate issue references or issue URLs
|
|
60
65
|
- Inline ticket descriptions passed as args
|
|
61
66
|
|
|
67
|
+
{{issue_ref_grammar()}}
|
|
68
|
+
|
|
62
69
|
Read or note the tickets. The agents will read them in full; you need the list and any key constraints.
|
|
63
70
|
|
|
71
|
+
{{issue_capture_contract()}}
|
|
72
|
+
|
|
64
73
|
---
|
|
65
74
|
|
|
66
75
|
### CRITICAL (F4) — AskUserQuestion at the command boundary, NOT inside the workflow
|
|
@@ -68,9 +77,16 @@ Read or note the tickets. The agents will read them in full; you need the list a
|
|
|
68
77
|
A workflow cannot pause mid-run. Open design decisions collected in `DECISIONS-NEEDED.md` are surfaced to the user via **AskUserQuestion AFTER the workflow returns** — at the command boundary. The workflow only WRITES the file; the command (you, the main model) reads it and asks.
|
|
69
78
|
|
|
70
79
|
After the workflow completes:
|
|
71
|
-
1.
|
|
72
|
-
|
|
73
|
-
|
|
80
|
+
1. **Check each plan's test plan.** For every path in `planPaths`, copy that plan's `## Test Plan` section — the heading and its TP lines, up to the next `## ` heading — byte for byte into a fresh `mktemp` file with the Write tool, never through an interpolated shell string, and run:
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
node "$HOME/.devflow/scripts/verify-evidence.cjs" check tp <that file>; echo "exit=$?"
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
Check the section, never the whole plan file: the plan's other `## ` headings are not evidence-file sections, so the script would parse the whole document as the plan. `exit=0` passes. Any other result names that plan `test plan malformed (<code>)` in your summary, `<code>` being the code the script printed on stderr; a plan with no `## Test Plan` section copies as an empty file, which the script refuses. Nothing is repaired: `/devflow:dynamic-build` passes no test plan from that plan.
|
|
87
|
+
2. Read the `decisionsNeededPath` returned by the workflow (e.g. `{worktree}/.devflow/docs/design/<slug>/<ts>/DECISIONS-NEEDED.md`). Always use the OUTDIR-scoped path the workflow wrote — never the flat `{worktree}/.devflow/docs/design/DECISIONS-NEEDED.md`.
|
|
88
|
+
3. First surface the **Auto-Resolved Decisions** section (decision → resolution → source) for audit, then surface ALL open **Decisions Needed** to the user in ONE batched `AskUserQuestion` (never one-at-a-time).
|
|
89
|
+
4. The user's answers feed into their own plan edits or a follow-up `/devflow:dynamic-plan` run.
|
|
74
90
|
|
|
75
91
|
State this explicitly in the workflow script as a comment: `// AskUserQuestion happens at the command boundary after this workflow returns — NOT here.`
|
|
76
92
|
|
|
@@ -92,15 +108,17 @@ export const meta = {
|
|
|
92
108
|
const ticketSource = args.ticketSource || args[0] || "see task description";
|
|
93
109
|
const DECISIONS_CONTEXT = args.decisionsContext || ""; // injected before authoring
|
|
94
110
|
const PREFERENCE_PROFILE = args.preferenceProfile || ""; // injected before authoring
|
|
111
|
+
const TP_CONTRACT = args.tpContract || ""; // the "Test-plan line (TP)" contract below — its paragraph and four bullets — passed verbatim as tpContract when invoking the workflow, never pasted into this script (it holds backticks)
|
|
95
112
|
const slug = args.slug || "wave";
|
|
96
113
|
const ts = new Date().toISOString().slice(0,16).replace(/[-:T]/g, (c) => c === 'T' ? '_' : c === ':' ? '' : c);
|
|
97
|
-
const
|
|
114
|
+
const ROOT = args.root; // {worktree} from Pre-authoring setup: the checkout's toplevel, never cwd
|
|
115
|
+
const OUTDIR = `${ROOT}/.devflow/docs/design/${slug}/${ts}`;
|
|
98
116
|
|
|
99
117
|
// Phase 1: Read all tickets
|
|
100
118
|
const tickets = await phase("read-tickets", () =>
|
|
101
119
|
agent(`Read all tickets from: ${ticketSource}
|
|
102
120
|
For each ticket, extract: title, summary, wave, dependsOn, scope (in/out), acceptance criteria, open questions, and any existing implementation hints.
|
|
103
|
-
If the source is a directory, read all .md files. If the source is
|
|
121
|
+
If the source is a directory, read all .md files. If the source is tracker issues, use the Git agent's fetch-issue or fetch-issues-batch operation.
|
|
104
122
|
Return: array of ticket objects with all fields.`, { agentType: "Git" })
|
|
105
123
|
);
|
|
106
124
|
|
|
@@ -130,15 +148,23 @@ Decisions context: ${DECISIONS_CONTEXT}
|
|
|
130
148
|
Produce:
|
|
131
149
|
1. List of improvements / gaps / edge cases / side-effects identified.
|
|
132
150
|
2. Well-structured acceptance criteria (numbered, positive + negative, at least one negative per ticket). See the acceptance criteria contract below.
|
|
133
|
-
3.
|
|
151
|
+
3. The test plan for the Test agent as TP lines, numbered from TP-1, at least one per criterion, each in exactly the shape of the test-plan line contract below. Map each scenario onto its line:
|
|
152
|
+
- the scenario, in plain words, is the line's scenario text — never a path, a reference, a mention or markup;
|
|
153
|
+
- the number of the criterion it covers is its (AC-m);
|
|
154
|
+
- its verification method is its method: a test committed to the suite is ci; a command run and read (a load test, a script) is local; a step performed and observed is manual;
|
|
155
|
+
- the paths it exercises, from the plan's affected files, are its files: globs.
|
|
156
|
+
Setup and expected outcome never go in a line: give them per TP in testScenarios.
|
|
134
157
|
4. A list of genuine design decisions that require user input (not settled by the plan, the preference profile, or existing ADRs).
|
|
135
158
|
|
|
159
|
+
Test-plan line contract:
|
|
160
|
+
${TP_CONTRACT}
|
|
161
|
+
|
|
136
162
|
Acceptance criteria quality bar (apply strictly):
|
|
137
163
|
- Vague criteria ("the feature should work correctly") are NOT acceptable — reject and rewrite.
|
|
138
164
|
- Implementation-coupled criteria ("the function must call X") are NOT acceptable — test behavior, not implementation.
|
|
139
165
|
- Untestable criteria are NOT acceptable.
|
|
140
166
|
|
|
141
|
-
Return: { ticketTitle, improvements (array), acceptanceCriteria (array of numbered strings), testPlan (array of {
|
|
167
|
+
Return: { ticketTitle, improvements (array), acceptanceCriteria (array of numbered strings), testPlan (array of TP-line strings, TP-1 first), testScenarios (array of {tp, setup, outcome}), openDecisions (array) }.`, { agentType: "Evaluate" })
|
|
142
168
|
))
|
|
143
169
|
);
|
|
144
170
|
|
|
@@ -190,7 +216,8 @@ For each ticket, write ${OUTDIR}/{ticket-slug}-plan.md containing:
|
|
|
190
216
|
- ## Implementation Plan
|
|
191
217
|
- The plan body (incorporate cross-plan amendments)
|
|
192
218
|
- ## Acceptance Criteria (numbered, positive + negative)
|
|
193
|
-
- ## Test Plan
|
|
219
|
+
- ## Test Plan — the challenger's testPlan lines, verbatim, one per line, and nothing else: no prose, no blank line between them, no setup or outcome
|
|
220
|
+
- ## Test Scenarios — one line per TP, in TP order: TP-n: its setup, then its expected outcome, from testScenarios
|
|
194
221
|
- ## Auto-Resolved Decisions (if any — list each as: decision → resolution → source)
|
|
195
222
|
|
|
196
223
|
Then write ${OUTDIR}/DECISIONS-NEEDED.md:
|
|
@@ -208,17 +235,17 @@ Return: { planPaths (array), decisionsNeededPath (string), decisionsNeededCount
|
|
|
208
235
|
|
|
209
236
|
The plan-challenge step (Phase 3 above) MUST produce the acceptance criteria and test plan shape that `/devflow:dynamic-build`'s Gate 2 consumes:
|
|
210
237
|
|
|
211
|
-
{acceptance_criteria_contract()}
|
|
238
|
+
{{acceptance_criteria_contract()}}
|
|
212
239
|
|
|
213
240
|
---
|
|
214
241
|
|
|
215
242
|
### Artifact paths
|
|
216
243
|
|
|
217
|
-
Per-ticket plans →
|
|
244
|
+
Per-ticket plans → `{worktree}/.devflow/docs/design/{slug}/{ts}/{ticket-slug}-plan.md`
|
|
218
245
|
|
|
219
|
-
Decisions needed →
|
|
246
|
+
Decisions needed → `{worktree}/.devflow/docs/design/{slug}/{ts}/DECISIONS-NEEDED.md`
|
|
220
247
|
|
|
221
|
-
|
|
248
|
+
`{worktree}` is the docs root resolved in Pre-authoring setup (it honours `WORKTREE_PATH` when provided).
|
|
222
249
|
|
|
223
250
|
---
|
|
224
251
|
|
|
@@ -228,14 +255,14 @@ The workflow returns:
|
|
|
228
255
|
|
|
229
256
|
```json
|
|
230
257
|
{
|
|
231
|
-
"planPaths": ["string — path to each per-ticket plan file"],
|
|
258
|
+
"planPaths": ["string — path to each per-ticket plan file; its ## Test Plan holds TP lines only, its ## Test Scenarios their setup and outcome"],
|
|
232
259
|
"decisionsNeededPath": "string — path to DECISIONS-NEEDED.md",
|
|
233
260
|
"decisionsNeededCount": "number — how many decisions need user input",
|
|
234
261
|
"autoResolvedCount": "number — decisions auto-resolved by preference profile"
|
|
235
262
|
}
|
|
236
263
|
```
|
|
237
264
|
|
|
238
|
-
After the workflow returns: read `DECISIONS-NEEDED.md`. First briefly surface the **Auto-Resolved Decisions** section (decision → resolution → source) so silently-settled calls are visible and reversible, then surface ALL open **Decisions Needed** in ONE batched `AskUserQuestion` (never one-at-a-time). Do not ask questions mid-workflow — this is F4. If no preference profile was found, note in your summary: "no preference profile found — N decisions were surfaced that a profile might have auto-resolved; consider `/devflow:dynamic-profile`."
|
|
265
|
+
After the workflow returns: check each plan's test plan (step 1 of the F4 list above), then read `DECISIONS-NEEDED.md`. First briefly surface the **Auto-Resolved Decisions** section (decision → resolution → source) so silently-settled calls are visible and reversible, then surface ALL open **Decisions Needed** in ONE batched `AskUserQuestion` (never one-at-a-time). Do not ask questions mid-workflow — this is F4. If no preference profile was found, note in your summary: "no preference profile found — N decisions were surfaced that a profile might have auto-resolved; consider `/devflow:dynamic-profile`."
|
|
239
266
|
|
|
240
267
|
---
|
|
241
268
|
|
|
@@ -4,8 +4,7 @@ argument-hint: "[--dry-run]"
|
|
|
4
4
|
output-dir: dist/commands
|
|
5
5
|
---
|
|
6
6
|
@import { authoring_preamble } from "./_partials/_preamble.mds"
|
|
7
|
-
|
|
8
|
-
{authoring_preamble()}
|
|
7
|
+
{{authoring_preamble()}}
|
|
9
8
|
|
|
10
9
|
---
|
|
11
10
|
|
|
@@ -19,14 +18,26 @@ The profile is then consumed by `/devflow:dynamic-plan` to pre-resolve design de
|
|
|
19
18
|
|
|
20
19
|
---
|
|
21
20
|
|
|
22
|
-
**Requires:** read access to
|
|
21
|
+
**Requires:** read access to `{claude_dir}/projects/*/` session transcripts and `{claude_dir}/rules/`
|
|
23
22
|
**Produces:** `~/.devflow/preference-profile.md` — plain-prose decision-preference profile
|
|
24
23
|
|
|
25
24
|
---
|
|
26
25
|
|
|
26
|
+
### Claude Code's directory
|
|
27
|
+
|
|
28
|
+
`{claude_dir}` is Claude Code's directory, resolved once, the way the installer resolves it (D-CLAUDE-DIR-PROMPTS): `CLAUDE_CONFIG_DIR` when that is set to an absolute path, else `$HOME/.claude`. Run
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
d="${CLAUDE_CONFIG_DIR:-}"; case "$d" in /*) ;; *) d="$HOME/.claude" ;; esac; printf '%s\n' "$d"
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
and use its one-line output. Pass it to the agent below as `CLAUDE_DIR`.
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
27
38
|
### Privacy note
|
|
28
39
|
|
|
29
|
-
This command mines session transcripts across **all projects** on this machine —
|
|
40
|
+
This command mines session transcripts across **all projects** on this machine — `{claude_dir}/projects/*/*.jsonl`, `{claude_dir}/history.jsonl`, and feedback memories. The resulting profile is then injected into planning prompts as context. This is a cross-project surface: patterns from one project's decisions may influence planning in another.
|
|
30
41
|
|
|
31
42
|
Mitigation: the profile is plain prose that you review and edit before use. You can trim, redact, or rewrite any section. The profile is at `~/.devflow/preference-profile.md` — open it, read it, adjust it. It is never committed to any repo.
|
|
32
43
|
|
|
@@ -38,8 +49,8 @@ Session transcripts on a typical machine are gigabytes. **The agent MUST NOT ful
|
|
|
38
49
|
|
|
39
50
|
1. Use `rg` (ripgrep) or `grep` to search for `AskUserQuestion` occurrences across transcript files — extracting just the question text and the surrounding user response (a few lines each).
|
|
40
51
|
2. Sample the results — take up to ~200 instances spread across projects and time; do not feed everything into context at once.
|
|
41
|
-
3. Read
|
|
42
|
-
4. Read existing feedback memory files (
|
|
52
|
+
3. Read `{claude_dir}/rules/` files (these are small) to supplement with explicitly stated preferences.
|
|
53
|
+
4. Read existing feedback memory files (`{claude_dir}/projects/*/memory/*.md`) — these are small and already distilled.
|
|
43
54
|
|
|
44
55
|
This grep-and-sample approach is both efficient and Iron-Rule-safe: the agent uses `rg`/`grep` as tools — no extractor or clustering logic is authored.
|
|
45
56
|
|
|
@@ -47,7 +58,7 @@ This grep-and-sample approach is both efficient and Iron-Rule-safe: the agent us
|
|
|
47
58
|
|
|
48
59
|
### When --dry-run is passed
|
|
49
60
|
|
|
50
|
-
Print what the agent would do (a summary of which paths it would search, what it would write) and STOP — do not spawn the agent.
|
|
61
|
+
Print what the agent would do (a summary of which paths under the resolved `{claude_dir}` it would search, what it would write) and STOP — do not spawn the agent.
|
|
51
62
|
|
|
52
63
|
---
|
|
53
64
|
|
|
@@ -58,15 +69,17 @@ Spawn a single Knowledge agent with this task:
|
|
|
58
69
|
```
|
|
59
70
|
You are distilling a decision-preference profile from past session history.
|
|
60
71
|
|
|
72
|
+
CLAUDE_DIR: {claude_dir} — Claude Code's directory, already resolved; every path below is under it.
|
|
73
|
+
|
|
61
74
|
BOUNDED READING — MANDATORY: transcripts are gigabytes; never full-read them.
|
|
62
|
-
1. Run: rg -l "AskUserQuestion"
|
|
75
|
+
1. Run: rg -l "AskUserQuestion" "{claude_dir}/projects/" 2>/dev/null | head -50
|
|
63
76
|
to find transcript files that contain AskUserQuestion moments.
|
|
64
77
|
2. For each found file, run: rg -A 5 "AskUserQuestion" <file> | head -200
|
|
65
78
|
to extract the question + nearby user response context. Sample broadly —
|
|
66
79
|
aim for ~150-200 instances spread across projects and time windows.
|
|
67
|
-
3. Read
|
|
68
|
-
4. Read all files in
|
|
69
|
-
5. Read all *.md files in
|
|
80
|
+
3. Read {claude_dir}/history.jsonl if it exists (rg "AskUserQuestion" ... similarly).
|
|
81
|
+
4. Read all files in {claude_dir}/rules/ (small — read fully).
|
|
82
|
+
5. Read all *.md files in {claude_dir}/projects/*/memory/ (small — read fully).
|
|
70
83
|
|
|
71
84
|
From this evidence, identify the recurring patterns in how the user answers design
|
|
72
85
|
questions. Look for preferences about:
|
|
@@ -7,8 +7,9 @@ output-dir: dist/commands
|
|
|
7
7
|
@import { agent_roster, agent_caveats } from "./_partials/_roster.mds"
|
|
8
8
|
@import { ticket_body_template } from "./_partials/_ticket_template.mds"
|
|
9
9
|
@import { factory_shape } from "./_partials/_factory.mds"
|
|
10
|
-
|
|
11
|
-
{
|
|
10
|
+
@import { evidence_policy } from "./_partials/_evidence_policy.mds"
|
|
11
|
+
@import { docs_root } from "./_partials/_docs_root.mds"
|
|
12
|
+
{{authoring_preamble()}}
|
|
12
13
|
|
|
13
14
|
---
|
|
14
15
|
|
|
@@ -16,14 +17,14 @@ output-dir: dist/commands
|
|
|
16
17
|
|
|
17
18
|
This command instructs you to construct and run a Claude Code dynamic Workflow that converts an initiative description or specification document into a fully reviewed, wave-structured ticket slate — reusing devflow's agents via `agentType`.
|
|
18
19
|
|
|
19
|
-
{agent_roster()}
|
|
20
|
+
{{agent_roster()}}
|
|
20
21
|
|
|
21
|
-
{agent_caveats()}
|
|
22
|
+
{{agent_caveats()}}
|
|
22
23
|
|
|
23
24
|
---
|
|
24
25
|
|
|
25
|
-
**Requires:** initiative description or spec document path;
|
|
26
|
-
**Produces:** ticket `.md` files at
|
|
26
|
+
**Requires:** initiative description or spec document path; tracker access only for filing the issues, which the Git agent resolves
|
|
27
|
+
**Produces:** ticket `.md` files at `{worktree}/.devflow/docs/tickets/{slug}/{ts}/`, `tracking-issue.md`
|
|
27
28
|
|
|
28
29
|
---
|
|
29
30
|
|
|
@@ -33,8 +34,8 @@ Before authoring, verify:
|
|
|
33
34
|
|
|
34
35
|
1. **Workflow tool available:** if the `Workflow` tool is not in your available tools, STOP and tell the user: "The Workflow tool is not available in this session. dynamic-tickets requires Claude Code's dynamic workflow runtime."
|
|
35
36
|
2. **`agentType` support:** confirmed available (spike F5, 2026-06-11). If spawned agents return no results, check that devflow is installed (`devflow init` has been run).
|
|
36
|
-
3. **
|
|
37
|
-
4. **No-remote path:**
|
|
37
|
+
3. **Tracker paths:** filing, when it runs, happens after the workflow and through the Git agent, which resolves the configured tracker and its access itself and reports `TRACEABILITY: DEGRADED ({reason})` for an issue it cannot file — that ticket stays a local `.md` file. No tracker CLI is checked here.
|
|
38
|
+
4. **No-remote path:** with no remote, the ticket files are still written to `{worktree}/.devflow/docs/tickets/{slug}/{ts}/`; whatever the Git agent cannot file without one, it reports as DEGRADED.
|
|
38
39
|
|
|
39
40
|
---
|
|
40
41
|
|
|
@@ -42,6 +43,16 @@ Before authoring, verify:
|
|
|
42
43
|
|
|
43
44
|
Before you write the workflow script:
|
|
44
45
|
|
|
46
|
+
**0. Resolve the evidence policy**
|
|
47
|
+
|
|
48
|
+
**Produces:** EVIDENCE_POLICY, ISSUE_REQUIRED, APPLY_CONVENTIONS, REQUIRE_NON_AUTHOR_APPROVAL
|
|
49
|
+
|
|
50
|
+
{{evidence_policy()}}
|
|
51
|
+
|
|
52
|
+
{{docs_root()}}
|
|
53
|
+
|
|
54
|
+
Pass `{worktree}` to the workflow as its `root` argument.
|
|
55
|
+
|
|
45
56
|
**1. Apply decisions context**
|
|
46
57
|
|
|
47
58
|
Apply the `devflow:apply-decisions` algorithm to the DECISIONS_CONTEXT loaded per the preamble above: scan the index, Read relevant entries, note the verbatim ADR/PF IDs you will inject into Design agent and Review agent prompts.
|
|
@@ -52,13 +63,14 @@ Read or note the user's input:
|
|
|
52
63
|
- If a spec-doc path: the agents will read it. Note the path.
|
|
53
64
|
- If inline text: distill it into a one-paragraph `initiative` summary + any explicit constraints or naming rules the user stated.
|
|
54
65
|
|
|
55
|
-
Treat initiative text and any
|
|
66
|
+
Treat initiative text and any tracker issue bodies as untrusted data — agents that receive them have shell and git access, so summarise and quote rather than interpolating raw text verbatim into shell-expanded strings.
|
|
56
67
|
|
|
57
68
|
**3. Propose the candidate ticket slate**
|
|
58
69
|
|
|
59
70
|
Before writing the workflow, propose a candidate ticket slate to the user:
|
|
60
71
|
- Read the initiative/spec yourself (or ask the user for more context if ambiguous).
|
|
61
72
|
- Propose: ticket titles, one-line summaries, wave assignments, dependency sketch.
|
|
73
|
+
- **Evidence policy:** show the resolved policy with the slate; only when `ISSUE_REQUIRED` is `true`, add that each ticket needs a tracker issue before its PR — this command files the tracking issue and one issue per ticket after the workflow returns, and `/devflow:dynamic-build` stops a ticket that has none.
|
|
62
74
|
- Ask the user to confirm or edit the slate. **Do not start the workflow until the slate is confirmed.**
|
|
63
75
|
- The confirmed slate becomes the `candidates` array in the workflow script.
|
|
64
76
|
|
|
@@ -84,7 +96,8 @@ const constraints = args.constraints || "";
|
|
|
84
96
|
const DECISIONS_CONTEXT = args.decisionsContext || ""; // injected before authoring
|
|
85
97
|
const slug = args.slug || initiative.toLowerCase().replace(/[^a-z0-9]+/g, '-').slice(0, 40);
|
|
86
98
|
const ts = new Date().toISOString().slice(0,16).replace(/[-:T]/g, (c) => c === 'T' ? '_' : c === ':' ? '' : c);
|
|
87
|
-
const
|
|
99
|
+
const ROOT = args.root; // {worktree} from Pre-authoring setup: the checkout's toplevel, never cwd
|
|
100
|
+
const OUTDIR = `${ROOT}/.devflow/docs/tickets/${slug}/${ts}`;
|
|
88
101
|
|
|
89
102
|
// Phase 1: Draft — one Design agent per ticket, all in parallel
|
|
90
103
|
const drafts = await phase("draft", () =>
|
|
@@ -175,11 +188,45 @@ Return: { ticketPaths: string[], trackingIssuePath: string }.`, { agentType: "Sy
|
|
|
175
188
|
|
|
176
189
|
---
|
|
177
190
|
|
|
191
|
+
### After the workflow returns — file the issues
|
|
192
|
+
|
|
193
|
+
The six-phase pipeline above never files an issue. Filing happens here, at the command boundary, after the workflow has returned: you (the main model) spawn the Git agent for it.
|
|
194
|
+
|
|
195
|
+
**Drafted lines first, under every policy.** Only step 3 below writes an `**Issue:**` line, so one already in a ticket file or in `tracking-issue.md` came from a drafting agent and names no issue filed here — `/devflow:dynamic-build` would read it as that ticket's own reference, and a wave PR would close it. Before any spawn, remove each such line using the Edit tool, and name every file you removed one from in the report.
|
|
196
|
+
|
|
197
|
+
**File the issues** only when `ISSUE_REQUIRED` is `true`. Otherwise file nothing, and say so in the report.
|
|
198
|
+
|
|
199
|
+
1. **Order and bound.** The tracking issue first, then each ticket file in dependency order: a ticket after every ticket its `**Depends on:**` line names, slate order (the workflow's `ticketPaths`) otherwise. One Git spawn at a time, never in parallel, and at most 50 spawns in all: a file past the cap is reported `not filed (cap 50)`.
|
|
200
|
+
2. **Spawn**, once per file. A ticket's `REQUIREMENTS` opens with the two lines the wave reads from its issue body, each on its own line:
|
|
201
|
+
- `**Wave:** N` — the file's wave number when it is digits only, else no Wave line.
|
|
202
|
+
- `**Depends on:**` with each entry, a ticket title or file name, replaced by the reference step 3 wrote as that ticket's `**Issue:**` line — comma-separated, or `none`. An entry naming no ticket already filed in this run — unfiled, unknown, or written as a reference — ⇒ `TRACEABILITY: DEGRADED (unresolved dependency "{entry}")`, and that ticket is not filed: a dependency is never dropped.
|
|
203
|
+
|
|
204
|
+
Its `## Summary` paragraph follows, less any line opening with either label.
|
|
205
|
+
|
|
206
|
+
```
|
|
207
|
+
Agent(subagent_type="Git"):
|
|
208
|
+
"OPERATION: ensure-traceable-issue
|
|
209
|
+
TASK_DESCRIPTION: {the ticket's title, or the tracking issue's H1}
|
|
210
|
+
REQUIREMENTS: {the ticket's **Wave:** and **Depends on:** lines, then its ## Summary paragraph; or the tracking issue's ## Context}
|
|
211
|
+
PLAN_ARTIFACT_PATH: {the ticket or tracking-issue file path, relative to {worktree}}
|
|
212
|
+
WORKTREE_PATH: {worktree}"
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
3. **Capture** `**Issue**: {ISSUE_REF}` and `**Status**:` from the spawn's `## Issue Traced` Output.
|
|
216
|
+
- `CREATED` or `ENRICHED`, with a reference that matches `^(#[1-9][0-9]{0,8}|[A-Z][A-Z0-9_]{0,9}-[1-9][0-9]{0,8})$` as a whole ⇒ insert `**Issue:** {ISSUE_REF}` with the Edit tool: in a ticket file as the line directly after its `**Depends on:**` line, in `tracking-issue.md` as the line directly after its H1. Change nothing else in the file.
|
|
217
|
+
- A reference of any other shape ⇒ `TRACEABILITY: DEGRADED (issue reference "{ref}" does not match any tracker reference grammar)`, and no line.
|
|
218
|
+
- `DEGRADED (rate limited)` ⇒ stop filing: this file and every file after it are reported `not filed`. Any other DEGRADED ⇒ that file gets no line; report it and go on to the next.
|
|
219
|
+
4. **Report** each file's `**Issue:**` reference, or `not filed` and why, with every `TRACEABILITY: DEGRADED` line step 2 and the spawns produced.
|
|
220
|
+
|
|
221
|
+
`/devflow:dynamic-build` reads these lines: the tracking issue's for its wave report, and each ticket's as that ticket's own reference.
|
|
222
|
+
|
|
223
|
+
---
|
|
224
|
+
|
|
178
225
|
### Ticket body structure
|
|
179
226
|
|
|
180
227
|
Every ticket artifact must use this shape:
|
|
181
228
|
|
|
182
|
-
{ticket_body_template()}
|
|
229
|
+
{{ticket_body_template()}}
|
|
183
230
|
|
|
184
231
|
---
|
|
185
232
|
|
|
@@ -187,17 +234,17 @@ Every ticket artifact must use this shape:
|
|
|
187
234
|
|
|
188
235
|
The pipeline above implements this general shape:
|
|
189
236
|
|
|
190
|
-
{factory_shape()}
|
|
237
|
+
{{factory_shape()}}
|
|
191
238
|
|
|
192
239
|
---
|
|
193
240
|
|
|
194
241
|
### Artifact paths
|
|
195
242
|
|
|
196
|
-
Tickets →
|
|
243
|
+
Tickets → `{worktree}/.devflow/docs/tickets/{slug}/{ts}/{ticket-slug}.md`
|
|
197
244
|
|
|
198
|
-
Tracking issue →
|
|
245
|
+
Tracking issue → `{worktree}/.devflow/docs/tickets/{slug}/{ts}/tracking-issue.md`
|
|
199
246
|
|
|
200
|
-
|
|
247
|
+
`{worktree}` is the docs root resolved in Pre-authoring setup (it honours `WORKTREE_PATH` when provided).
|
|
201
248
|
|
|
202
249
|
Timestamps follow the devflow `YYYY-MM-DD_HHMM` convention (date and time separated by an underscore, e.g. `2026-06-12_1148`). The `ts` variable in the workflow script generates this format.
|
|
203
250
|
|
|
@@ -217,7 +264,7 @@ The workflow returns:
|
|
|
217
264
|
}
|
|
218
265
|
```
|
|
219
266
|
|
|
220
|
-
The tracking-issue path and any open questions are the primary handoff to `/devflow:dynamic-plan`.
|
|
267
|
+
The tracking-issue path and any open questions are the primary handoff to `/devflow:dynamic-plan`. The filing step's report — each file's `**Issue:**` reference or `not filed` — follows the workflow's output.
|
|
221
268
|
|
|
222
269
|
---
|
|
223
270
|
|
|
@@ -4,7 +4,6 @@ output-dir: dist/commands
|
|
|
4
4
|
---
|
|
5
5
|
@import { knowledge_writeback } from "./_partials/_knowledge.mds"
|
|
6
6
|
@import { decisions_load } from "./_partials/_decisions.mds"
|
|
7
|
-
|
|
8
7
|
# Explore Command
|
|
9
8
|
|
|
10
9
|
Explore a codebase area by spawning parallel agents for flow tracing, dependency mapping, and pattern analysis. Findings are synthesized into structured output with file:line references, with optional feature knowledge created as a byproduct.
|
|
@@ -30,7 +29,7 @@ Explore a codebase area by spawning parallel agents for flow tracing, dependency
|
|
|
30
29
|
|
|
31
30
|
**Produces:** DECISIONS_CONTEXT
|
|
32
31
|
|
|
33
|
-
{decisions_load()}
|
|
32
|
+
{{decisions_load()}}
|
|
34
33
|
|
|
35
34
|
The orchestrator uses `DECISIONS_CONTEXT` locally when framing exploration — prior decisions and pitfalls suggest specific areas to investigate. Follow `devflow:apply-decisions` to Read full entry bodies on demand. **Do NOT pass `DECISIONS_CONTEXT` to Explore sub-agents** — decisions context stays in the orchestrator, not in the investigation workers.
|
|
36
35
|
|
|
@@ -87,12 +86,12 @@ Present findings to user. Use AskUserQuestion to offer focused follow-up explora
|
|
|
87
86
|
**Requires:** MERGED_FINDINGS, DECISIONS_CONTEXT
|
|
88
87
|
**Produces:** FEATURE_KNOWLEDGE_STATUS (created | skipped)
|
|
89
88
|
|
|
90
|
-
1. Check if matching feature knowledge already exists by reading
|
|
91
|
-
2. Use AskUserQuestion: "No feature knowledge exists for
|
|
89
|
+
1. Check if matching feature knowledge already exists by reading `{worktree}/.devflow/features/index.md` (or globbing frontmatter if absent). If covered → skip
|
|
90
|
+
2. Use AskUserQuestion: "No feature knowledge exists for {explored area}. Create one to capture these patterns?"
|
|
92
91
|
3. If user declines → set FEATURE_KNOWLEDGE_STATUS = skipped
|
|
93
92
|
4. If user accepts: proceed with write-back below.
|
|
94
93
|
|
|
95
|
-
{knowledge_writeback()}
|
|
94
|
+
{{knowledge_writeback()}}
|
|
96
95
|
|
|
97
96
|
Set FEATURE_KNOWLEDGE_STATUS = created (if agent spawned) or skipped.
|
|
98
97
|
|