devflow-kit 1.3.0 → 1.3.2

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 CHANGED
@@ -5,6 +5,21 @@ All notable changes to DevFlow will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [1.3.2] - 2026-03-08
9
+
10
+ ### Changed
11
+ - **Init prompt improvements** — Agent Teams marked as experimental with recommendation to disable; ambient mode now defaults to enabled (recommended)
12
+ - **Init flags documented** — Added `--ambient`/`--no-ambient` and `--memory`/`--no-memory` to README
13
+
14
+ ---
15
+
16
+ ## [1.3.1] - 2026-03-08
17
+
18
+ ### Fixed
19
+ - **Background memory updater silent Write failures** — Added Read permission for memory files (Claude Code enforces Read-before-Write), read-only git commands for fresh context, mtime validation to detect silent failures, and stdout logging for debugging
20
+
21
+ ---
22
+
8
23
  ## [1.3.0] - 2026-03-08
9
24
 
10
25
  ### Added
@@ -815,6 +830,8 @@ devflow init
815
830
 
816
831
  ---
817
832
 
833
+ [1.3.2]: https://github.com/dean0x/devflow/compare/v1.3.1...v1.3.2
834
+ [1.3.1]: https://github.com/dean0x/devflow/compare/v1.3.0...v1.3.1
818
835
  [1.3.0]: https://github.com/dean0x/devflow/compare/v1.2.0...v1.3.0
819
836
  [1.2.0]: https://github.com/dean0x/devflow/compare/v1.1.0...v1.2.0
820
837
  [1.1.0]: https://github.com/dean0x/devflow/compare/v1.0.0...v1.1.0
package/README.md CHANGED
@@ -241,7 +241,9 @@ Session context is saved and restored automatically via Working Memory hooks —
241
241
  |--------|-------------|
242
242
  | `--plugin <names>` | Comma-separated plugin names (e.g., `implement,code-review`) |
243
243
  | `--scope <user\|local>` | Installation scope (default: user) |
244
- | `--teams` / `--no-teams` | Enable/disable experimental Agent Teams (default: off) |
244
+ | `--teams` / `--no-teams` | Enable/disable Agent Teams (experimental, default: off) |
245
+ | `--ambient` / `--no-ambient` | Enable/disable ambient mode (default: on) |
246
+ | `--memory` / `--no-memory` | Enable/disable working memory (default: on) |
245
247
  | `--verbose` | Show detailed output |
246
248
 
247
249
  ### Uninstall Options
@@ -150,9 +150,12 @@ export const initCommand = new Command('init')
150
150
  teamsEnabled = false;
151
151
  }
152
152
  else {
153
- const teamsChoice = await p.confirm({
154
- message: 'Enable Agent Teams? (peer debate in review, exploration, debugging)',
155
- initialValue: false,
153
+ const teamsChoice = await p.select({
154
+ message: 'Enable Agent Teams?',
155
+ options: [
156
+ { value: false, label: 'No (Recommended)', hint: 'Experimental — may be unstable' },
157
+ { value: true, label: 'Yes', hint: 'Advanced — peer debate in review, exploration, debugging' },
158
+ ],
156
159
  });
157
160
  if (p.isCancel(teamsChoice)) {
158
161
  p.cancel('Installation cancelled.');
@@ -166,12 +169,15 @@ export const initCommand = new Command('init')
166
169
  ambientEnabled = options.ambient;
167
170
  }
168
171
  else if (!process.stdin.isTTY) {
169
- ambientEnabled = false;
172
+ ambientEnabled = true;
170
173
  }
171
174
  else {
172
- const ambientChoice = await p.confirm({
173
- message: 'Enable ambient mode? (auto-loads relevant skills based on each prompt)',
174
- initialValue: false,
175
+ const ambientChoice = await p.select({
176
+ message: 'Enable ambient mode?',
177
+ options: [
178
+ { value: true, label: 'Yes (Recommended)', hint: 'Auto-loads relevant skills for each prompt' },
179
+ { value: false, label: 'No', hint: 'Full control — load skills manually' },
180
+ ],
175
181
  });
176
182
  if (p.isCancel(ambientChoice)) {
177
183
  p.cancel('Installation cancelled.');
@@ -179,7 +185,7 @@ export const initCommand = new Command('init')
179
185
  }
180
186
  ambientEnabled = ambientChoice;
181
187
  }
182
- // Working memory selection (defaults ON — foundational, unlike ambient's false)
188
+ // Working memory selection (defaults ON — foundational feature)
183
189
  let memoryEnabled;
184
190
  if (options.memory !== undefined) {
185
191
  memoryEnabled = options.memory;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "devflow-kit",
3
- "version": "1.3.0",
3
+ "version": "1.3.2",
4
4
  "description": "Agentic Development Toolkit for Claude Code - Enhance AI-assisted development with intelligent commands and workflows",
5
5
  "type": "module",
6
6
  "bin": {
@@ -5,7 +5,7 @@
5
5
  "name": "DevFlow Contributors",
6
6
  "email": "dean@keren.dev"
7
7
  },
8
- "version": "1.3.0",
8
+ "version": "1.3.2",
9
9
  "homepage": "https://github.com/dean0x/devflow",
10
10
  "repository": "https://github.com/dean0x/devflow",
11
11
  "license": "MIT",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "devflow-ambient",
3
3
  "description": "Ambient mode — auto-loads relevant skills for every prompt",
4
- "version": "1.3.0",
4
+ "version": "1.3.2",
5
5
  "agents": [],
6
6
  "skills": [
7
7
  "ambient-router"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "devflow-audit-claude",
3
3
  "description": "Audit CLAUDE.md files against Anthropic best practices",
4
- "version": "1.3.0",
4
+ "version": "1.3.2",
5
5
  "agents": [],
6
6
  "skills": []
7
7
  }
@@ -5,7 +5,7 @@
5
5
  "name": "DevFlow Contributors",
6
6
  "email": "dean@keren.dev"
7
7
  },
8
- "version": "1.3.0",
8
+ "version": "1.3.2",
9
9
  "homepage": "https://github.com/dean0x/devflow",
10
10
  "repository": "https://github.com/dean0x/devflow",
11
11
  "license": "MIT",
@@ -5,7 +5,7 @@
5
5
  "name": "DevFlow Contributors",
6
6
  "email": "dean@keren.dev"
7
7
  },
8
- "version": "1.3.0",
8
+ "version": "1.3.2",
9
9
  "homepage": "https://github.com/dean0x/devflow",
10
10
  "repository": "https://github.com/dean0x/devflow",
11
11
  "license": "MIT",
@@ -5,7 +5,7 @@
5
5
  "name": "DevFlow Contributors",
6
6
  "email": "dean@keren.dev"
7
7
  },
8
- "version": "1.3.0",
8
+ "version": "1.3.2",
9
9
  "homepage": "https://github.com/dean0x/devflow",
10
10
  "repository": "https://github.com/dean0x/devflow",
11
11
  "license": "MIT",
@@ -5,7 +5,7 @@
5
5
  "name": "DevFlow Contributors",
6
6
  "email": "dean@keren.dev"
7
7
  },
8
- "version": "1.3.0",
8
+ "version": "1.3.2",
9
9
  "homepage": "https://github.com/dean0x/devflow",
10
10
  "repository": "https://github.com/dean0x/devflow",
11
11
  "license": "MIT",
@@ -5,7 +5,7 @@
5
5
  "name": "DevFlow Contributors",
6
6
  "email": "dean@keren.dev"
7
7
  },
8
- "version": "1.3.0",
8
+ "version": "1.3.2",
9
9
  "homepage": "https://github.com/dean0x/devflow",
10
10
  "repository": "https://github.com/dean0x/devflow",
11
11
  "license": "MIT",
@@ -5,7 +5,7 @@
5
5
  "name": "DevFlow Contributors",
6
6
  "email": "dean@keren.dev"
7
7
  },
8
- "version": "1.3.0",
8
+ "version": "1.3.2",
9
9
  "homepage": "https://github.com/dean0x/devflow",
10
10
  "repository": "https://github.com/dean0x/devflow",
11
11
  "license": "MIT",
@@ -5,7 +5,7 @@
5
5
  "name": "DevFlow Contributors",
6
6
  "email": "dean@keren.dev"
7
7
  },
8
- "version": "1.3.0",
8
+ "version": "1.3.2",
9
9
  "homepage": "https://github.com/dean0x/devflow",
10
10
  "repository": "https://github.com/dean0x/devflow",
11
11
  "license": "MIT",
@@ -5,7 +5,7 @@
5
5
  "name": "DevFlow Contributors",
6
6
  "email": "dean@keren.dev"
7
7
  },
8
- "version": "1.3.0",
8
+ "version": "1.3.2",
9
9
  "homepage": "https://github.com/dean0x/devflow",
10
10
  "repository": "https://github.com/dean0x/devflow",
11
11
  "license": "MIT",
@@ -5,7 +5,7 @@
5
5
  "name": "DevFlow Contributors",
6
6
  "email": "dean@keren.dev"
7
7
  },
8
- "version": "1.3.0",
8
+ "version": "1.3.2",
9
9
  "homepage": "https://github.com/dean0x/devflow",
10
10
  "repository": "https://github.com/dean0x/devflow",
11
11
  "license": "MIT",
@@ -5,7 +5,7 @@
5
5
  "name": "DevFlow Contributors",
6
6
  "email": "dean@keren.dev"
7
7
  },
8
- "version": "1.3.0",
8
+ "version": "1.3.2",
9
9
  "homepage": "https://github.com/dean0x/devflow",
10
10
  "repository": "https://github.com/dean0x/devflow",
11
11
  "license": "MIT",
@@ -5,7 +5,7 @@
5
5
  "name": "DevFlow Contributors",
6
6
  "email": "dean@keren.dev"
7
7
  },
8
- "version": "1.3.0",
8
+ "version": "1.3.2",
9
9
  "homepage": "https://github.com/dean0x/devflow",
10
10
  "repository": "https://github.com/dean0x/devflow",
11
11
  "license": "MIT",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "devflow-self-review",
3
3
  "description": "Self-review workflow: Simplifier + Scrutinizer for code quality",
4
- "version": "1.3.0",
4
+ "version": "1.3.2",
5
5
  "agents": [
6
6
  "simplifier",
7
7
  "scrutinizer",
@@ -5,7 +5,7 @@
5
5
  "name": "DevFlow Contributors",
6
6
  "email": "dean@keren.dev"
7
7
  },
8
- "version": "1.3.0",
8
+ "version": "1.3.2",
9
9
  "homepage": "https://github.com/dean0x/devflow",
10
10
  "repository": "https://github.com/dean0x/devflow",
11
11
  "license": "MIT",
@@ -5,7 +5,7 @@
5
5
  "name": "DevFlow Contributors",
6
6
  "email": "dean@keren.dev"
7
7
  },
8
- "version": "1.3.0",
8
+ "version": "1.3.2",
9
9
  "homepage": "https://github.com/dean0x/devflow",
10
10
  "repository": "https://github.com/dean0x/devflow",
11
11
  "license": "MIT",
@@ -96,8 +96,10 @@ rotate_log
96
96
 
97
97
  # Read existing memory for merge context
98
98
  EXISTING_MEMORY=""
99
+ PRE_UPDATE_MTIME=0
99
100
  if [ -f "$MEMORY_FILE" ]; then
100
101
  EXISTING_MEMORY=$(cat "$MEMORY_FILE")
102
+ PRE_UPDATE_MTIME=$(get_mtime "$MEMORY_FILE")
101
103
  fi
102
104
 
103
105
  # Build instruction
@@ -119,7 +121,7 @@ else
119
121
  If recurring patterns were observed during this session (coding conventions, architectural decisions, team preferences, tooling quirks), create $PATTERNS_FILE with entries formatted as: - **Pattern name**: Brief description (discovered: YYYY-MM-DD). Only create this file if genuine patterns were observed — do not fabricate entries."
120
122
  fi
121
123
 
122
- INSTRUCTION="Update the file $MEMORY_FILE with working memory from this session. The file already has content — possibly from a concurrent session that just wrote it moments ago. Merge this session's context with the existing content to produce a single unified working memory snapshot. Both this session and the existing content represent fresh, concurrent work — integrate both fully. Working memory captures what's active now, not a changelog. Deduplicate overlapping information. Keep under 120 lines total. Use the same structure: ## Now, ## Progress, ## Decisions, ## Modified Files, ## Context, ## Session Log.
124
+ INSTRUCTION="First, Read the file $MEMORY_FILE to satisfy Claude Code's read-before-write requirement. Then update it with working memory from this session. The file already has content — possibly from a concurrent session that just wrote it moments ago. Merge this session's context with the existing content to produce a single unified working memory snapshot. Both this session and the existing content represent fresh, concurrent work — integrate both fully. Working memory captures what's active now, not a changelog. Deduplicate overlapping information. Keep under 120 lines total. Use the same structure: ## Now, ## Progress, ## Decisions, ## Modified Files, ## Context, ## Session Log.
123
125
 
124
126
  ## Progress tracks Done (completed items), Remaining (next steps), and Blockers (if any). Keep each sub-list to 1-3 items. This section reflects current work state, not historical logs.
125
127
 
@@ -144,7 +146,7 @@ $EXISTING_PATTERNS"
144
146
  If recurring patterns were observed during this session (coding conventions, architectural decisions, team preferences, tooling quirks), create $PATTERNS_FILE with entries formatted as: - **Pattern name**: Brief description (discovered: YYYY-MM-DD). Only create this file if genuine patterns were observed — do not fabricate entries."
145
147
  fi
146
148
 
147
- INSTRUCTION="Create the file $MEMORY_FILE with working memory from this session. Keep under 120 lines. Use this structure:
149
+ INSTRUCTION="First, Read the file $MEMORY_FILE if it exists (to satisfy Claude Code's read-before-write requirement). Then create it with working memory from this session. Keep under 120 lines. Use this structure:
148
150
 
149
151
  # Working Memory
150
152
 
@@ -178,12 +180,20 @@ TIMEOUT=120 # Normal runtime 30-60s; 2x margin
178
180
  DEVFLOW_BG_UPDATER=1 env -u CLAUDECODE "$CLAUDE_BIN" -p \
179
181
  --resume "$SESSION_ID" \
180
182
  --model haiku \
181
- --tools "Write" \
182
- --allowedTools "Write($CWD/.memory/WORKING-MEMORY.md)" "Write($CWD/.memory/PROJECT-PATTERNS.md)" \
183
+ --tools "Read,Write,Bash" \
184
+ --allowedTools \
185
+ "Read($CWD/.memory/WORKING-MEMORY.md)" \
186
+ "Read($CWD/.memory/PROJECT-PATTERNS.md)" \
187
+ "Write($CWD/.memory/WORKING-MEMORY.md)" \
188
+ "Write($CWD/.memory/PROJECT-PATTERNS.md)" \
189
+ "Bash(git status:*)" \
190
+ "Bash(git log:*)" \
191
+ "Bash(git diff:*)" \
192
+ "Bash(git branch:*)" \
183
193
  --no-session-persistence \
184
194
  --output-format text \
185
195
  "$INSTRUCTION" \
186
- > /dev/null 2>> "$LOG_FILE" &
196
+ >> "$LOG_FILE" 2>&1 &
187
197
  CLAUDE_PID=$!
188
198
 
189
199
  # Watchdog: kill claude if it exceeds timeout
@@ -191,7 +201,17 @@ CLAUDE_PID=$!
191
201
  WATCHDOG_PID=$!
192
202
 
193
203
  if wait "$CLAUDE_PID" 2>/dev/null; then
194
- log "Update completed for session $SESSION_ID"
204
+ # Validate the file was actually modified (detect silent Write failures)
205
+ if [ -f "$MEMORY_FILE" ]; then
206
+ NEW_MTIME=$(get_mtime "$MEMORY_FILE")
207
+ if [ "$NEW_MTIME" -gt "$PRE_UPDATE_MTIME" ]; then
208
+ log "Update completed for session $SESSION_ID"
209
+ else
210
+ log "Update finished but file was not modified for session $SESSION_ID (possible Write tool failure)"
211
+ fi
212
+ else
213
+ log "Update finished but file does not exist for session $SESSION_ID"
214
+ fi
195
215
  else
196
216
  EXIT_CODE=$?
197
217
  if [ "$EXIT_CODE" -gt 128 ]; then