moflo 4.10.21 → 4.10.22

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.
@@ -62,12 +62,8 @@ An advanced code quality analysis specialist that performs comprehensive code re
62
62
 
63
63
  ### Phase 1: Initial Scan
64
64
  ```bash
65
- # Comprehensive code scan
66
- # (removed: 'npx claude-flow' invocation does not exist in moflo consumers)
67
-
68
- # Load project context
69
- # (removed: 'npx claude-flow' invocation does not exist in moflo consumers)
70
- # (removed: 'npx claude-flow' invocation does not exist in moflo consumers)
65
+ # Comprehensive code scan + project context via moflo semantic search
66
+ flo-search "<area, symbol, or concern under review>"
71
67
  ```
72
68
 
73
69
  ### Phase 2: Deep Analysis
@@ -90,13 +86,9 @@ An advanced code quality analysis specialist that performs comprehensive code re
90
86
  - Identify security vulnerabilities
91
87
 
92
88
  ### Phase 3: Report Generation
93
- ```bash
94
- # Store analysis results
95
- # (removed: 'npx claude-flow' invocation does not exist in moflo consumers)
96
-
97
- # Generate recommendations
98
- # (removed: 'npx claude-flow' invocation does not exist in moflo consumers)
99
- ```
89
+ Persist analysis results and recommendations to moflo memory (namespace
90
+ `learnings`) via the `mcp__moflo__memory_store` tool, so future reviews build
91
+ on them rather than rediscovering the same issues.
100
92
 
101
93
  ## Integration Points
102
94
 
@@ -17,9 +17,9 @@ Search these namespaces depending on your task:
17
17
 
18
18
  On chunk hits where `navigation` is non-null, traverse via `mcp__moflo__memory_get_neighbors`. Bulk `mcp__moflo__memory_retrieve` is a protocol violation — see `.claude/guidance/moflo-memory-protocol.md`.
19
19
 
20
- # Backend API Developer v2.0.0-alpha
20
+ # Backend API Developer
21
21
 
22
- You are a specialized Backend API Developer agent with **self-learning** and **continuous improvement** capabilities powered by Agentic-Flow v2.0.0-alpha.
22
+ You are a specialized Backend API Developer agent with **self-learning** and **continuous improvement** capabilities powered by moflo's memory and ReasoningBank pattern learning.
23
23
 
24
24
  ## 🧠 Self-Learning Protocol
25
25
 
@@ -54,6 +54,34 @@ export function fileSha256(absPath) {
54
54
  }
55
55
  }
56
56
 
57
+ /**
58
+ * Compute sha256 of file content with line endings normalized to LF.
59
+ *
60
+ * moflo ships every text asset with LF endings, so `knownContentHashes` are LF
61
+ * hashes. But Windows consumers routinely end up with CRLF copies (git
62
+ * `core.autocrlf=true` on checkout, editors rewriting on save). A raw-byte hash
63
+ * of a CRLF file never matches the LF manifest hash, so the hash-gated prune
64
+ * would silently never fire on Windows — defeating the whole #948/#932 cleanup
65
+ * for the platform where it's needed most. Normalizing CRLF (and lone CR) to LF
66
+ * before hashing recovers those files. This is a Rule #1 (cross-platform)
67
+ * requirement, not an optimization.
68
+ *
69
+ * latin1 round-trips bytes 1:1 (no UTF-8 multibyte corruption) so the digest is
70
+ * byte-identical to hashing a genuinely-LF file.
71
+ *
72
+ * @param {string} absPath
73
+ * @returns {string|null} `sha256:<hex>` of the LF-normalized content, or null
74
+ */
75
+ export function fileSha256NormalizedEol(absPath) {
76
+ try {
77
+ const buf = readFileSync(absPath);
78
+ const normalized = buf.toString('latin1').replace(/\r\n?/g, '\n');
79
+ return 'sha256:' + createHash('sha256').update(normalized, 'latin1').digest('hex');
80
+ } catch {
81
+ return null;
82
+ }
83
+ }
84
+
57
85
  /**
58
86
  * Load + validate the retired-files manifest. Returns `{ entries: [] }` for
59
87
  * any failure mode (missing file, invalid JSON, wrong shape) — the launcher
@@ -108,6 +136,15 @@ export function classifyRetiredFile(projectRoot, entry) {
108
136
  if (entry.knownContentHashes.includes(actualHash)) {
109
137
  return { action: 'prune', actualHash };
110
138
  }
139
+ // Raw bytes didn't match. Retry with LF-normalized content: a Windows
140
+ // consumer's CRLF copy of a known-shipped (LF) file must still be recognized
141
+ // as un-customized and pruned. Without this the prune never fires on Windows
142
+ // (Rule #1 cross-platform). `actualHash` stays the raw on-disk hash so the
143
+ // report reflects what's actually on disk.
144
+ const normalizedHash = fileSha256NormalizedEol(abs);
145
+ if (normalizedHash && entry.knownContentHashes.includes(normalizedHash)) {
146
+ return { action: 'prune', actualHash };
147
+ }
111
148
  return { action: 'preserve', actualHash };
112
149
  }
113
150
 
@@ -2,5 +2,5 @@
2
2
  * Auto-generated by build. Do not edit manually.
3
3
  * Source of truth: root package.json → scripts/sync-version.mjs
4
4
  */
5
- export const VERSION = '4.10.21';
5
+ export const VERSION = '4.10.22';
6
6
  //# sourceMappingURL=version.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "moflo",
3
- "version": "4.10.21",
3
+ "version": "4.10.22",
4
4
  "description": "MoFlo — AI agent orchestration for Claude Code. A standalone, opinionated toolkit with semantic memory, learned routing, gates, spells, and the /flo issue-execution skill.",
5
5
  "main": "dist/src/cli/index.js",
6
6
  "type": "module",
@@ -95,7 +95,7 @@
95
95
  "@typescript-eslint/eslint-plugin": "^7.18.0",
96
96
  "@typescript-eslint/parser": "^7.18.0",
97
97
  "eslint": "^8.0.0",
98
- "moflo": "^4.10.21-rc.1",
98
+ "moflo": "^4.10.21",
99
99
  "tsx": "^4.21.0",
100
100
  "typescript": "^5.9.3",
101
101
  "vitest": "^4.0.0"