coding-friend-cli 1.26.0 → 1.27.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.
Files changed (42) hide show
  1. package/dist/{chunk-K2PSF7SF.js → chunk-BX3DRKTU.js} +7 -7
  2. package/dist/{chunk-HEBLANJO.js → chunk-JVYZ72EP.js} +81 -13
  3. package/dist/{chunk-WAFKFCAB.js → chunk-TOM2FI3W.js} +10 -10
  4. package/dist/{chunk-OARRVZL4.js → chunk-YCWRBOB3.js} +5 -5
  5. package/dist/{config-MSVSD3HA.js → config-N55LTJ76.js} +33 -20
  6. package/dist/{dev-KTEINOFU.js → dev-BSXR55PZ.js} +7 -7
  7. package/dist/{disable-7BVJGSIP.js → disable-CDOM7SSI.js} +3 -3
  8. package/dist/{enable-RO2FBKS6.js → enable-SF7742UR.js} +3 -3
  9. package/dist/{host-USZC44PR.js → host-JVLWYY5A.js} +2 -2
  10. package/dist/index.js +30 -30
  11. package/dist/{init-KPUEY6NC.js → init-QP57Q2C6.js} +43 -30
  12. package/dist/{install-65JCZGCB.js → install-G4XYNVL3.js} +6 -6
  13. package/dist/{mcp-V7PM4WTE.js → mcp-24NCFFAF.js} +5 -5
  14. package/dist/{memory-36YZTSSE.js → memory-HLMKDGWY.js} +5 -5
  15. package/dist/{permission-36BMHDYX.js → permission-K54DWLHN.js} +77 -10
  16. package/dist/permissions-O24R7WUU.js +37 -0
  17. package/dist/{session-CZ4ZJP7Q.js → session-DMQZXZ7F.js} +5 -5
  18. package/dist/{status-IJH4EZBG.js → status-K7TBUAXT.js} +16 -16
  19. package/dist/{statusline-PUPTHPBR.js → statusline-CDGADB3C.js} +2 -2
  20. package/dist/{uninstall-5MINSH35.js → uninstall-BOVKPNYN.js} +6 -6
  21. package/dist/{update-IO27DSZW.js → update-6M3YFHS6.js} +5 -5
  22. package/lib/cf-memory/README.md +2 -0
  23. package/lib/cf-memory/src/__tests__/claude-md.test.ts +238 -0
  24. package/lib/cf-memory/src/__tests__/status-frame.test.ts +136 -0
  25. package/lib/cf-memory/src/index.ts +9 -1
  26. package/lib/cf-memory/src/lib/claude-md.ts +217 -0
  27. package/lib/cf-memory/src/lib/status-frame.ts +63 -0
  28. package/lib/cf-memory/src/server.ts +9 -3
  29. package/lib/cf-memory/src/tools/delete.ts +12 -0
  30. package/lib/cf-memory/src/tools/store.ts +46 -10
  31. package/lib/cf-memory/src/tools/update.ts +54 -11
  32. package/lib/learn-mcp/package-lock.json +1385 -166
  33. package/lib/learn-mcp/package.json +5 -2
  34. package/lib/learn-mcp/src/__tests__/docs.test.ts +117 -0
  35. package/lib/learn-mcp/src/lib/docs.ts +23 -6
  36. package/lib/learn-mcp/src/tools/create-doc.ts +21 -9
  37. package/lib/learn-mcp/vitest.config.ts +8 -0
  38. package/package.json +1 -1
  39. package/dist/{chunk-KFNKH5Z7.js → chunk-2HQVNQB7.js} +3 -3
  40. package/dist/{chunk-3HTLOI34.js → chunk-GDZTU2Z4.js} +5 -5
  41. package/dist/{chunk-N2Q224HO.js → chunk-HPNRQYLM.js} +3 -3
  42. package/dist/{chunk-2TFHVNBI.js → chunk-R6HDMRYL.js} +4 -4
@@ -1,38 +1,29 @@
1
- import {
2
- applyPermissions,
3
- buildLearnDirRules,
4
- cleanupStalePluginRules,
5
- getAllRules,
6
- getExistingRules,
7
- getMissingRules,
8
- logPluginScriptWarning
9
- } from "./chunk-HEBLANJO.js";
10
- import {
11
- findStatuslineHookPath,
12
- isStatuslineConfigured,
13
- saveStatuslineConfig,
14
- selectStatuslineComponents,
15
- writeStatuslineSettings
16
- } from "./chunk-3HTLOI34.js";
17
- import {
18
- ensureShellCompletion,
19
- hasShellCompletion
20
- } from "./chunk-DMJCO6LJ.js";
21
1
  import {
22
2
  ensureMemoryBuilt,
23
3
  isMemoryInitialized,
24
4
  memoryInitWizard
25
- } from "./chunk-WAFKFCAB.js";
5
+ } from "./chunk-TOM2FI3W.js";
26
6
  import {
27
7
  memoryConfigMenu
28
- } from "./chunk-K2PSF7SF.js";
8
+ } from "./chunk-BX3DRKTU.js";
29
9
  import {
30
10
  getLibPath
31
11
  } from "./chunk-RZRT7NGT.js";
32
- import "./chunk-KFNKH5Z7.js";
12
+ import "./chunk-2HQVNQB7.js";
13
+ import {
14
+ findStatuslineHookPath,
15
+ isStatuslineConfigured,
16
+ saveStatuslineConfig,
17
+ selectStatuslineComponents,
18
+ writeStatuslineSettings
19
+ } from "./chunk-GDZTU2Z4.js";
33
20
  import {
34
21
  DEFAULT_CONFIG
35
22
  } from "./chunk-PRIH34UB.js";
23
+ import {
24
+ ensureShellCompletion,
25
+ hasShellCompletion
26
+ } from "./chunk-DMJCO6LJ.js";
36
27
  import {
37
28
  BACK,
38
29
  applyDocsDirChange,
@@ -43,18 +34,14 @@ import {
43
34
  getScopeLabel,
44
35
  injectBackChoice,
45
36
  showConfigHint
46
- } from "./chunk-N2Q224HO.js";
37
+ } from "./chunk-HPNRQYLM.js";
47
38
  import {
48
39
  commandExists,
49
40
  run
50
41
  } from "./chunk-EVGXUDX4.js";
51
- import {
52
- mergeJson,
53
- readJson,
54
- writeJson
55
- } from "./chunk-5UVDWG5L.js";
56
42
  import {
57
43
  claudeLocalSettingsPath,
44
+ claudeProjectSettingsPath,
58
45
  claudeSettingsPath,
59
46
  globalConfigPath,
60
47
  localConfigPath,
@@ -64,6 +51,20 @@ import {
64
51
  log,
65
52
  printBanner
66
53
  } from "./chunk-NREZK463.js";
54
+ import {
55
+ applyPermissions,
56
+ buildLearnDirRules,
57
+ cleanupStalePluginRules,
58
+ getAllRules,
59
+ getExistingRules,
60
+ getMissingRules,
61
+ logPluginScriptWarning
62
+ } from "./chunk-JVYZ72EP.js";
63
+ import {
64
+ mergeJson,
65
+ readJson,
66
+ writeJson
67
+ } from "./chunk-5UVDWG5L.js";
67
68
 
68
69
  // src/commands/init.ts
69
70
  import { checkbox, confirm, input, select } from "@inquirer/prompts";
@@ -816,7 +817,7 @@ async function initMenu(gitAvailable) {
816
817
  break;
817
818
  case "autoApprove": {
818
819
  const autoApproveChoice = await confirm({
819
- message: "Enable auto-approve? (auto-approves safe tool calls, blocks destructive ones, prompts for ambiguous)",
820
+ message: "Enable auto-approve? (auto-approves read-only tools + working-dir file edits, LLM classifier for unknowns)",
820
821
  default: autoApproveVal ?? false
821
822
  });
822
823
  const autoApproveTargetScope = await askScope();
@@ -825,6 +826,18 @@ async function initMenu(gitAvailable) {
825
826
  mergeJson(targetPath, { autoApprove: autoApproveChoice });
826
827
  log.success(`Saved to ${targetPath}`);
827
828
  }
829
+ if (autoApproveChoice) {
830
+ const { runDangerousRulesAudit } = await import("./permissions-O24R7WUU.js");
831
+ await runDangerousRulesAudit(
832
+ [
833
+ claudeProjectSettingsPath(),
834
+ claudeLocalSettingsPath(),
835
+ claudeSettingsPath()
836
+ ],
837
+ log,
838
+ (message) => confirm({ message, default: true })
839
+ );
840
+ }
828
841
  break;
829
842
  }
830
843
  case "permissions": {
@@ -1,10 +1,11 @@
1
1
  import {
2
2
  getLatestVersion,
3
3
  semverCompare
4
- } from "./chunk-OARRVZL4.js";
4
+ } from "./chunk-YCWRBOB3.js";
5
5
  import {
6
6
  getInstalledVersion
7
- } from "./chunk-3HTLOI34.js";
7
+ } from "./chunk-GDZTU2Z4.js";
8
+ import "./chunk-PRIH34UB.js";
8
9
  import {
9
10
  ensureShellCompletion
10
11
  } from "./chunk-DMJCO6LJ.js";
@@ -12,16 +13,14 @@ import {
12
13
  enableMarketplaceAutoUpdate,
13
14
  isMarketplaceRegistered,
14
15
  isPluginDisabled
15
- } from "./chunk-2TFHVNBI.js";
16
- import "./chunk-PRIH34UB.js";
16
+ } from "./chunk-R6HDMRYL.js";
17
17
  import {
18
18
  resolveScope
19
- } from "./chunk-N2Q224HO.js";
19
+ } from "./chunk-HPNRQYLM.js";
20
20
  import {
21
21
  commandExists,
22
22
  run
23
23
  } from "./chunk-EVGXUDX4.js";
24
- import "./chunk-5UVDWG5L.js";
25
24
  import {
26
25
  devStatePath
27
26
  } from "./chunk-TWKNGPBO.js";
@@ -29,6 +28,7 @@ import {
29
28
  log,
30
29
  printBanner
31
30
  } from "./chunk-NREZK463.js";
31
+ import "./chunk-5UVDWG5L.js";
32
32
 
33
33
  // src/commands/install.ts
34
34
  import { existsSync } from "fs";
@@ -1,26 +1,26 @@
1
1
  import {
2
2
  ensureMemoryBuilt,
3
3
  printMemoryMcpConfig
4
- } from "./chunk-WAFKFCAB.js";
5
- import "./chunk-K2PSF7SF.js";
4
+ } from "./chunk-TOM2FI3W.js";
5
+ import "./chunk-BX3DRKTU.js";
6
6
  import {
7
7
  getLibPath
8
8
  } from "./chunk-RZRT7NGT.js";
9
9
  import {
10
10
  resolveDocsDir,
11
11
  resolveMemoryDir
12
- } from "./chunk-KFNKH5Z7.js";
12
+ } from "./chunk-2HQVNQB7.js";
13
13
  import "./chunk-PRIH34UB.js";
14
- import "./chunk-N2Q224HO.js";
14
+ import "./chunk-HPNRQYLM.js";
15
15
  import {
16
16
  run
17
17
  } from "./chunk-EVGXUDX4.js";
18
- import "./chunk-5UVDWG5L.js";
19
18
  import "./chunk-TWKNGPBO.js";
20
19
  import {
21
20
  log,
22
21
  printBanner
23
22
  } from "./chunk-NREZK463.js";
23
+ import "./chunk-5UVDWG5L.js";
24
24
 
25
25
  // src/commands/mcp.ts
26
26
  import { existsSync, readdirSync } from "fs";
@@ -13,16 +13,16 @@ import {
13
13
  memoryStatusCommand,
14
14
  memoryStopDaemonCommand,
15
15
  printMemoryMcpConfig
16
- } from "./chunk-WAFKFCAB.js";
17
- import "./chunk-K2PSF7SF.js";
16
+ } from "./chunk-TOM2FI3W.js";
17
+ import "./chunk-BX3DRKTU.js";
18
18
  import "./chunk-RZRT7NGT.js";
19
- import "./chunk-KFNKH5Z7.js";
19
+ import "./chunk-2HQVNQB7.js";
20
20
  import "./chunk-PRIH34UB.js";
21
- import "./chunk-N2Q224HO.js";
21
+ import "./chunk-HPNRQYLM.js";
22
22
  import "./chunk-EVGXUDX4.js";
23
- import "./chunk-5UVDWG5L.js";
24
23
  import "./chunk-TWKNGPBO.js";
25
24
  import "./chunk-NREZK463.js";
25
+ import "./chunk-5UVDWG5L.js";
26
26
  export {
27
27
  ensureMemoryBuilt,
28
28
  isMemoryInitialized,
@@ -1,3 +1,21 @@
1
+ import {
2
+ askScope,
3
+ formatScopeLabel,
4
+ getMergedValue,
5
+ getScopeLabel
6
+ } from "./chunk-HPNRQYLM.js";
7
+ import "./chunk-EVGXUDX4.js";
8
+ import {
9
+ claudeLocalSettingsPath,
10
+ claudeProjectSettingsPath,
11
+ claudeSettingsPath,
12
+ globalConfigPath,
13
+ localConfigPath
14
+ } from "./chunk-TWKNGPBO.js";
15
+ import {
16
+ log,
17
+ printBanner
18
+ } from "./chunk-NREZK463.js";
1
19
  import {
2
20
  STATIC_RULES,
3
21
  applyPermissions,
@@ -6,17 +24,13 @@ import {
6
24
  getAllRules,
7
25
  getExistingRules,
8
26
  groupByCategory,
9
- logPluginScriptWarning
10
- } from "./chunk-HEBLANJO.js";
11
- import "./chunk-5UVDWG5L.js";
27
+ logPluginScriptWarning,
28
+ runDangerousRulesAudit
29
+ } from "./chunk-JVYZ72EP.js";
12
30
  import {
13
- claudeLocalSettingsPath,
14
- claudeSettingsPath
15
- } from "./chunk-TWKNGPBO.js";
16
- import {
17
- log,
18
- printBanner
19
- } from "./chunk-NREZK463.js";
31
+ mergeJson,
32
+ readJson
33
+ } from "./chunk-5UVDWG5L.js";
20
34
 
21
35
  // src/commands/permission.ts
22
36
  import { checkbox, confirm, select } from "@inquirer/prompts";
@@ -101,6 +115,20 @@ async function interactiveFlow(allRules, existing) {
101
115
  value: category
102
116
  });
103
117
  }
118
+ const globalCfg = readJson(globalConfigPath());
119
+ const localCfg = readJson(localConfigPath());
120
+ const autoApproveVal = getMergedValue(
121
+ "autoApprove",
122
+ globalCfg,
123
+ localCfg
124
+ );
125
+ const autoApproveScopeLabel = formatScopeLabel(
126
+ getScopeLabel("autoApprove", globalCfg, localCfg)
127
+ );
128
+ categoryChoices.push({
129
+ name: `Auto-approve ${autoApproveScopeLabel}${autoApproveVal !== void 0 ? ` (${autoApproveVal})` : ""}`,
130
+ value: "__auto_approve__"
131
+ });
104
132
  categoryChoices.push({
105
133
  name: chalk.green("\u2192 Apply changes"),
106
134
  value: "__apply__"
@@ -113,6 +141,10 @@ async function interactiveFlow(allRules, existing) {
113
141
  browsing = false;
114
142
  continue;
115
143
  }
144
+ if (chosen === "__auto_approve__") {
145
+ await autoApproveFlow();
146
+ continue;
147
+ }
116
148
  const categoryRules = groups.get(chosen);
117
149
  const selected = await checkbox({
118
150
  message: `${chosen} permissions:`,
@@ -140,6 +172,41 @@ async function interactiveFlow(allRules, existing) {
140
172
  const toRemove = managedExisting.filter((r) => !enabled.has(r));
141
173
  return { toAdd, toRemove };
142
174
  }
175
+ async function autoApproveFlow() {
176
+ const globalCfg = readJson(globalConfigPath());
177
+ const localCfg = readJson(localConfigPath());
178
+ const currentValue = getMergedValue("autoApprove", globalCfg, localCfg);
179
+ const scopeLabel = formatScopeLabel(
180
+ getScopeLabel("autoApprove", globalCfg, localCfg)
181
+ );
182
+ console.log(
183
+ chalk.bold("Auto-approve") + ` ${scopeLabel}${currentValue !== void 0 ? ` (${currentValue})` : ""}`
184
+ );
185
+ log.dim(
186
+ "Auto-approves read-only tools + working-dir file edits, LLM classifier for unknowns"
187
+ );
188
+ console.log();
189
+ const value = await confirm({
190
+ message: "Enable auto-approve?",
191
+ default: currentValue ?? false
192
+ });
193
+ const scope = await askScope();
194
+ if (scope === "back") return;
195
+ const targetPath = scope === "global" ? globalConfigPath() : localConfigPath();
196
+ mergeJson(targetPath, { autoApprove: value });
197
+ log.success(`Saved to ${targetPath}`);
198
+ if (value) {
199
+ await runDangerousRulesAudit(
200
+ [
201
+ claudeProjectSettingsPath(),
202
+ claudeLocalSettingsPath(),
203
+ claudeSettingsPath()
204
+ ],
205
+ log,
206
+ (message) => confirm({ message, default: true })
207
+ );
208
+ }
209
+ }
143
210
  async function permissionCommand(opts) {
144
211
  printBanner("\u2728 Coding Friend Permissions \u2728");
145
212
  console.log();
@@ -0,0 +1,37 @@
1
+ import {
2
+ DANGEROUS_RULE_PATTERNS,
3
+ PERMISSION_RULES,
4
+ STATIC_RULES,
5
+ applyPermissions,
6
+ auditDangerousRules,
7
+ buildLearnDirRules,
8
+ buildPluginScriptRules,
9
+ cleanupStalePluginRules,
10
+ extractTag,
11
+ getAllRules,
12
+ getExistingRules,
13
+ getMissingRules,
14
+ groupByCategory,
15
+ logPluginScriptWarning,
16
+ runDangerousRulesAudit,
17
+ stripDangerousRules
18
+ } from "./chunk-JVYZ72EP.js";
19
+ import "./chunk-5UVDWG5L.js";
20
+ export {
21
+ DANGEROUS_RULE_PATTERNS,
22
+ PERMISSION_RULES,
23
+ STATIC_RULES,
24
+ applyPermissions,
25
+ auditDangerousRules,
26
+ buildLearnDirRules,
27
+ buildPluginScriptRules,
28
+ cleanupStalePluginRules,
29
+ extractTag,
30
+ getAllRules,
31
+ getExistingRules,
32
+ getMissingRules,
33
+ groupByCategory,
34
+ logPluginScriptWarning,
35
+ runDangerousRulesAudit,
36
+ stripDangerousRules
37
+ };
@@ -1,11 +1,7 @@
1
1
  import {
2
2
  loadConfig
3
- } from "./chunk-KFNKH5Z7.js";
3
+ } from "./chunk-2HQVNQB7.js";
4
4
  import "./chunk-PRIH34UB.js";
5
- import {
6
- readJson,
7
- writeJson
8
- } from "./chunk-5UVDWG5L.js";
9
5
  import {
10
6
  claudeSessionDir,
11
7
  encodeProjectPath,
@@ -14,6 +10,10 @@ import {
14
10
  import {
15
11
  log
16
12
  } from "./chunk-NREZK463.js";
13
+ import {
14
+ readJson,
15
+ writeJson
16
+ } from "./chunk-5UVDWG5L.js";
17
17
 
18
18
  // src/commands/session.ts
19
19
  import { input, select } from "@inquirer/prompts";
@@ -1,32 +1,26 @@
1
1
  import {
2
- getExistingRules
3
- } from "./chunk-HEBLANJO.js";
2
+ getLibPath
3
+ } from "./chunk-RZRT7NGT.js";
4
+ import {
5
+ resolveMemoryDir
6
+ } from "./chunk-2HQVNQB7.js";
4
7
  import {
5
8
  getCliVersion,
6
9
  getLatestCliVersion,
7
10
  getLatestVersion,
8
11
  semverCompare
9
- } from "./chunk-OARRVZL4.js";
12
+ } from "./chunk-YCWRBOB3.js";
10
13
  import {
11
14
  getInstalledVersion
12
- } from "./chunk-3HTLOI34.js";
15
+ } from "./chunk-GDZTU2Z4.js";
16
+ import "./chunk-PRIH34UB.js";
13
17
  import "./chunk-DMJCO6LJ.js";
14
18
  import {
15
19
  detectPluginScope,
16
20
  isPluginDisabled
17
- } from "./chunk-2TFHVNBI.js";
18
- import {
19
- getLibPath
20
- } from "./chunk-RZRT7NGT.js";
21
- import {
22
- resolveMemoryDir
23
- } from "./chunk-KFNKH5Z7.js";
24
- import "./chunk-PRIH34UB.js";
25
- import "./chunk-N2Q224HO.js";
21
+ } from "./chunk-R6HDMRYL.js";
22
+ import "./chunk-HPNRQYLM.js";
26
23
  import "./chunk-EVGXUDX4.js";
27
- import {
28
- readJson
29
- } from "./chunk-5UVDWG5L.js";
30
24
  import {
31
25
  claudeSettingsPath,
32
26
  devStatePath,
@@ -34,6 +28,12 @@ import {
34
28
  localConfigPath
35
29
  } from "./chunk-TWKNGPBO.js";
36
30
  import "./chunk-NREZK463.js";
31
+ import {
32
+ getExistingRules
33
+ } from "./chunk-JVYZ72EP.js";
34
+ import {
35
+ readJson
36
+ } from "./chunk-5UVDWG5L.js";
37
37
 
38
38
  // src/commands/status.ts
39
39
  import { existsSync, readdirSync } from "fs";
@@ -4,19 +4,19 @@ import {
4
4
  saveStatuslineConfig,
5
5
  selectStatuslineComponents,
6
6
  writeStatuslineSettings
7
- } from "./chunk-3HTLOI34.js";
7
+ } from "./chunk-GDZTU2Z4.js";
8
8
  import {
9
9
  ALL_COMPONENT_IDS
10
10
  } from "./chunk-PRIH34UB.js";
11
11
  import {
12
12
  commandExists
13
13
  } from "./chunk-EVGXUDX4.js";
14
- import "./chunk-5UVDWG5L.js";
15
14
  import "./chunk-TWKNGPBO.js";
16
15
  import {
17
16
  log,
18
17
  printBanner
19
18
  } from "./chunk-NREZK463.js";
19
+ import "./chunk-5UVDWG5L.js";
20
20
 
21
21
  // src/commands/statusline.ts
22
22
  import { confirm } from "@inquirer/prompts";
@@ -5,18 +5,14 @@ import {
5
5
  import {
6
6
  isMarketplaceRegistered,
7
7
  isPluginInstalled
8
- } from "./chunk-2TFHVNBI.js";
8
+ } from "./chunk-R6HDMRYL.js";
9
9
  import {
10
10
  resolveScope
11
- } from "./chunk-N2Q224HO.js";
11
+ } from "./chunk-HPNRQYLM.js";
12
12
  import {
13
13
  commandExists,
14
14
  run
15
15
  } from "./chunk-EVGXUDX4.js";
16
- import {
17
- readJson,
18
- writeJson
19
- } from "./chunk-5UVDWG5L.js";
20
16
  import {
21
17
  claudeSettingsPath,
22
18
  devStatePath,
@@ -29,6 +25,10 @@ import {
29
25
  log,
30
26
  printBanner
31
27
  } from "./chunk-NREZK463.js";
28
+ import {
29
+ readJson,
30
+ writeJson
31
+ } from "./chunk-5UVDWG5L.js";
32
32
 
33
33
  // src/commands/uninstall.ts
34
34
  import { existsSync, rmSync } from "fs";
@@ -4,15 +4,15 @@ import {
4
4
  getLatestVersion,
5
5
  semverCompare,
6
6
  updateCommand
7
- } from "./chunk-OARRVZL4.js";
8
- import "./chunk-3HTLOI34.js";
9
- import "./chunk-DMJCO6LJ.js";
7
+ } from "./chunk-YCWRBOB3.js";
8
+ import "./chunk-GDZTU2Z4.js";
10
9
  import "./chunk-PRIH34UB.js";
11
- import "./chunk-N2Q224HO.js";
10
+ import "./chunk-DMJCO6LJ.js";
11
+ import "./chunk-HPNRQYLM.js";
12
12
  import "./chunk-EVGXUDX4.js";
13
- import "./chunk-5UVDWG5L.js";
14
13
  import "./chunk-TWKNGPBO.js";
15
14
  import "./chunk-NREZK463.js";
15
+ import "./chunk-5UVDWG5L.js";
16
16
  export {
17
17
  getCliVersion,
18
18
  getLatestCliVersion,
@@ -48,6 +48,8 @@ Detection: Tier 1 → Tier 2 → Tier 3 (first available wins).
48
48
 
49
49
  Memories are stored as Markdown files with YAML frontmatter in `docs/memory/<category>/`.
50
50
 
51
+ Convention memories (`preference` type → `conventions/` folder) are also synced to the project's `CLAUDE.md` under a `## CF Memory: Conventions` section. Entries are tracked via HTML comments (`<!-- cf:<id> -->`) and are automatically added, updated, or removed when the corresponding memory is stored, updated, or deleted.
52
+
51
53
  ## Embedding Models
52
54
 
53
55
  Tier 1 (SQLite) uses embedding models to generate vectors for semantic search. Two providers are supported: