coding-friend-cli 1.40.3 → 1.40.4

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.
@@ -6,7 +6,7 @@ import {
6
6
  import {
7
7
  loadConfig,
8
8
  resolveMemoryDir
9
- } from "./chunk-CGZNFAOB.js";
9
+ } from "./chunk-ZEOWTLWI.js";
10
10
  import {
11
11
  getMemoryMcpStatus,
12
12
  isMemoryMcpRegistered,
@@ -348,7 +348,7 @@ async function updateClaudeCommand(opts, mode) {
348
348
  }
349
349
  let refreshMemoryAfterUpdate = null;
350
350
  if (doCli) {
351
- ({ refreshMemoryAfterUpdate } = await import("./memory-LBVPVWJQ.js"));
351
+ ({ refreshMemoryAfterUpdate } = await import("./memory-NAFLQ6NN.js"));
352
352
  if (!latestCliVersion) {
353
353
  log.warn("Cannot check latest CLI version from npm.");
354
354
  } else {
@@ -93,6 +93,37 @@ var STATIC_RULES = [
93
93
  category: "Core Utilities",
94
94
  recommended: true
95
95
  },
96
+ // The cf-review scope snapshot lives under /tmp/coding-friend/review/<run-id>/.
97
+ // Only the main agent writes it (gather-diff.sh --snapshot-dir); reviewer
98
+ // subagents read it. Without these rules a background reviewer can stall for
99
+ // hours on a write-permission prompt nobody sees.
100
+ // Read/Edit/Write need a DOUBLE leading slash: a single "/" anchors at the
101
+ // settings source dir, not the filesystem root. Bash rules take the literal
102
+ // command text, so mkdir keeps one slash.
103
+ {
104
+ rule: "Bash(mkdir -p /tmp/coding-friend/review/*)",
105
+ description: "[write] Create the review scope snapshot dir \xB7 Used by: /cf-review gather-diff --snapshot-dir",
106
+ category: "Core Utilities",
107
+ recommended: true
108
+ },
109
+ {
110
+ rule: "Read(//tmp/coding-friend/review/**)",
111
+ description: "[read-only] Read the review scope snapshot \xB7 Used by: /cf-review reviewer agents",
112
+ category: "Core Utilities",
113
+ recommended: true
114
+ },
115
+ {
116
+ rule: "Edit(//tmp/coding-friend/review/**)",
117
+ description: "[modify] Update the review scope snapshot \xB7 Used by: /cf-review main agent",
118
+ category: "Core Utilities",
119
+ recommended: true
120
+ },
121
+ {
122
+ rule: "Write(//tmp/coding-friend/review/**)",
123
+ description: "[write] Write the review scope snapshot \xB7 Used by: /cf-review main agent",
124
+ category: "Core Utilities",
125
+ recommended: true
126
+ },
96
127
  // Git Operations
97
128
  {
98
129
  rule: "Bash(git status *)",
@@ -102,7 +102,13 @@ var MemoryConfigSchema = z.object({
102
102
  });
103
103
  var ReviewConfigSchema = z.strictObject({
104
104
  withCodex: z.boolean().optional(),
105
- maxRounds: z.number().int().min(1).optional()
105
+ maxRounds: z.number().int().min(1).optional(),
106
+ // Both timeouts are whole positive seconds: zero, negative and fractional
107
+ // values cannot be enforced as a deadline, so they are rejected here rather
108
+ // than coerced somewhere downstream. Deliberately NOT offered in the
109
+ // interactive `cf config` review menu — they are file-only settings.
110
+ agentTimeout: z.number().int().min(1).optional(),
111
+ nativeTimeout: z.number().int().min(1).optional()
106
112
  });
107
113
  var ConfigSchema = z.strictObject({
108
114
  language: z.string().optional(),
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  loadConfig,
3
3
  resolveMemoryDir
4
- } from "./chunk-CGZNFAOB.js";
4
+ } from "./chunk-ZEOWTLWI.js";
5
5
  import "./chunk-ITI7MXLA.js";
6
6
  import "./chunk-5UVDWG5L.js";
7
7
  import "./chunk-EVGXUDX4.js";
@@ -2,13 +2,13 @@ import {
2
2
  afterAutoApproveEnabled,
3
3
  getAllRules,
4
4
  getExistingRules
5
- } from "./chunk-PIXAQLXQ.js";
5
+ } from "./chunk-SKEWZ2ET.js";
6
6
  import {
7
7
  listMdFilesRecursive
8
8
  } from "./chunk-2DTXVMPQ.js";
9
9
  import {
10
10
  resolveLearnDir
11
- } from "./chunk-CGZNFAOB.js";
11
+ } from "./chunk-ZEOWTLWI.js";
12
12
  import {
13
13
  findStatuslineHookPath,
14
14
  getCurrentAccountEmail,
@@ -802,7 +802,7 @@ async function editPermissions() {
802
802
  )
803
803
  });
804
804
  if (choice === BACK) return;
805
- const { permissionCommand } = await import("./permission-W3NM7HOL.js");
805
+ const { permissionCommand } = await import("./permission-TORAVB2Y.js");
806
806
  switch (choice) {
807
807
  case "interactive":
808
808
  await permissionCommand({});
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  resolveLearnDir
3
- } from "./chunk-CGZNFAOB.js";
3
+ } from "./chunk-ZEOWTLWI.js";
4
4
  import "./chunk-ITI7MXLA.js";
5
5
  import {
6
6
  getLibPath
package/dist/index.js CHANGED
@@ -46,7 +46,7 @@ program.command("install").description("Install the Coding Friend plugin into a
46
46
  "--agent <agent>",
47
47
  "Operate on host agent: claude, codex, omp, or agy"
48
48
  ).option("--codex", "Alias for --agent codex").option("--omp", "Alias for --agent omp").option("--agy", "Shortcut for --agent agy (beta)").action(async (opts) => {
49
- const { installCommand } = await import("./install-B3646W7P.js");
49
+ const { installCommand } = await import("./install-3APP3HXQ.js");
50
50
  await installCommand(opts);
51
51
  });
52
52
  program.command("uninstall").description("Uninstall the Coding Friend plugin from a supported host").option("--user", "Uninstall from user scope (all projects)").option("--global", "Uninstall from user scope (all projects)").option("--project", "Uninstall from project scope").option("--local", "Uninstall from local scope").option(
@@ -80,11 +80,11 @@ program.command("init").description("Initialize coding-friend in current project
80
80
  "--trust-project",
81
81
  "For Codex, mark the current project trusted in ~/.codex/config.toml"
82
82
  ).action(async (opts) => {
83
- const { initCommand } = await import("./init-XAWQUS2X.js");
83
+ const { initCommand } = await import("./init-GL353JQR.js");
84
84
  await initCommand(opts);
85
85
  });
86
86
  program.command("config").description("Manage Coding Friend configuration").action(async () => {
87
- const { configCommand } = await import("./config-OFGL545F.js");
87
+ const { configCommand } = await import("./config-7LMHDOGW.js");
88
88
  await configCommand();
89
89
  });
90
90
  var learn = program.command("learn").description("Manage learning docs \u2014 host as a website or push to git");
@@ -96,25 +96,25 @@ Learn subcommands:
96
96
  learn push [path] Commit and push learning docs (only if learn dir is the git root)`
97
97
  );
98
98
  learn.command("host").description("Build and serve learning docs as a static website").argument("[path]", "path to docs folder").option("-p, --port <port>", "port number", "3333").action(async (path, opts) => {
99
- const { hostCommand } = await import("./host-7XKH5HLB.js");
99
+ const { hostCommand } = await import("./host-KGUAFN4Y.js");
100
100
  await hostCommand(path, opts);
101
101
  });
102
102
  learn.command("push").description("Commit and push learning docs to origin").argument("[path]", "path to docs folder").action(async (path) => {
103
- const { learnPushCommand } = await import("./learn-Q5YHKHQH.js");
103
+ const { learnPushCommand } = await import("./learn-ZNJ54LRO.js");
104
104
  await learnPushCommand(path);
105
105
  });
106
106
  program.command("host", { hidden: true }).argument("[path]", "path to docs folder").option("-p, --port <port>", "port number", "3333").action(async (path, opts) => {
107
- const { hostCommand } = await import("./host-7XKH5HLB.js");
107
+ const { hostCommand } = await import("./host-KGUAFN4Y.js");
108
108
  await hostCommand(path, opts);
109
109
  });
110
110
  program.command("mcp").description("Setup MCP server for learning docs").action(async () => {
111
- const { mcpCommand } = await import("./mcp-ZG56IYLD.js");
111
+ const { mcpCommand } = await import("./mcp-TS7MOQ3A.js");
112
112
  await mcpCommand();
113
113
  });
114
114
  program.command("mcp-serve").description(
115
115
  "Start the cf-memory MCP server (used internally by npx). When memoryDir is omitted, resolves from CLAUDE_PROJECT_DIR at runtime."
116
116
  ).argument("[memoryDir]", "path to memory directory (optional)").action(async (memoryDir) => {
117
- const { mcpServeCommand } = await import("./mcp-serve-7RWXY3J4.js");
117
+ const { mcpServeCommand } = await import("./mcp-serve-D6BHVTCY.js");
118
118
  await mcpServeCommand(memoryDir);
119
119
  });
120
120
  program.command("mcp-serve-learn").description("Start the learn MCP server (used internally by npx)").argument("<docsDir>", "path to docs directory").action(async (docsDir) => {
@@ -134,7 +134,7 @@ program.command("permission").description("Manage host permission and approval s
134
134
  "--disable-auto-approve",
135
135
  "For Codex, disable deterministic Coding Friend auto-approve"
136
136
  ).action(async (opts) => {
137
- const { permissionCommand } = await import("./permission-W3NM7HOL.js");
137
+ const { permissionCommand } = await import("./permission-TORAVB2Y.js");
138
138
  await permissionCommand(opts);
139
139
  });
140
140
  program.command("statusline").description("Setup coding-friend statusline in Claude Code").action(async () => {
@@ -145,15 +145,15 @@ program.command("update").description("Update coding-friend plugin, CLI, and sta
145
145
  "--agent <agent>",
146
146
  "Operate on host agent: claude, codex, omp, or agy"
147
147
  ).option("--codex", "Alias for --agent codex").option("--omp", "Alias for --agent omp").option("--agy", "Shortcut for --agent agy (beta)").action(async (opts) => {
148
- const { updateCommand } = await import("./update-HGEF46T5.js");
148
+ const { updateCommand } = await import("./update-NHI4DBZL.js");
149
149
  await updateCommand(opts);
150
150
  });
151
151
  program.command("status").description("Show comprehensive Coding Friend status").action(async () => {
152
- const { statusCommand } = await import("./status-GQ3ZDYZ4.js");
152
+ const { statusCommand } = await import("./status-Z7DB7Y2S.js");
153
153
  await statusCommand();
154
154
  });
155
155
  program.command("clean").description("Clean files generated by Coding Friend in docs/").action(async () => {
156
- const { cleanCommand } = await import("./clean-S57BNTWM.js");
156
+ const { cleanCommand } = await import("./clean-VD6CFY4C.js");
157
157
  await cleanCommand();
158
158
  });
159
159
  var session = program.command("session").description("[beta] Save and load Claude Code sessions across machines");
@@ -168,11 +168,11 @@ session.command("save").description("Save current Claude Code session to sync fo
168
168
  "-s, --session-id <id>",
169
169
  "session UUID to save (default: auto-detect newest)"
170
170
  ).option("-l, --label <label>", "label for this session").action(async (opts) => {
171
- const { sessionSaveCommand } = await import("./session-WU5344ZD.js");
171
+ const { sessionSaveCommand } = await import("./session-AOC37YNH.js");
172
172
  await sessionSaveCommand(opts);
173
173
  });
174
174
  session.command("load").description("Load a saved session from sync folder").action(async () => {
175
- const { sessionLoadCommand } = await import("./session-WU5344ZD.js");
175
+ const { sessionLoadCommand } = await import("./session-AOC37YNH.js");
176
176
  await sessionLoadCommand();
177
177
  });
178
178
  var memory = program.command("memory").description("AI memory system \u2014 store and search project knowledge");
@@ -192,43 +192,43 @@ Memory subcommands:
192
192
  memory mcp Show MCP server setup instructions`
193
193
  );
194
194
  memory.command("status").description("Show memory system status").action(async () => {
195
- const { memoryStatusCommand } = await import("./memory-LBVPVWJQ.js");
195
+ const { memoryStatusCommand } = await import("./memory-NAFLQ6NN.js");
196
196
  await memoryStatusCommand();
197
197
  });
198
198
  memory.command("search").description("Search memories by query").argument("<query>", "search query").action(async (query) => {
199
- const { memorySearchCommand } = await import("./memory-LBVPVWJQ.js");
199
+ const { memorySearchCommand } = await import("./memory-NAFLQ6NN.js");
200
200
  await memorySearchCommand(query);
201
201
  });
202
202
  memory.command("list").description(
203
203
  "List memories in current project, or all projects with --projects"
204
204
  ).option("--projects", "List all project databases with size and metadata").action(async (opts) => {
205
- const { memoryListCommand } = await import("./memory-LBVPVWJQ.js");
205
+ const { memoryListCommand } = await import("./memory-NAFLQ6NN.js");
206
206
  await memoryListCommand(opts);
207
207
  });
208
208
  memory.command("init").description(
209
209
  "Initialize memory system \u2014 interactive wizard (first time) or config menu"
210
210
  ).action(async () => {
211
- const { memoryInitCommand } = await import("./memory-LBVPVWJQ.js");
211
+ const { memoryInitCommand } = await import("./memory-NAFLQ6NN.js");
212
212
  await memoryInitCommand();
213
213
  });
214
214
  memory.command("config").description("Configure memory system settings").action(async () => {
215
- const { memoryConfigCommand } = await import("./memory-LBVPVWJQ.js");
215
+ const { memoryConfigCommand } = await import("./memory-NAFLQ6NN.js");
216
216
  await memoryConfigCommand();
217
217
  });
218
218
  memory.command("start-daemon").description("Start the memory daemon (Tier 2 \u2014 MiniSearch)").action(async () => {
219
- const { memoryStartDaemonCommand } = await import("./memory-LBVPVWJQ.js");
219
+ const { memoryStartDaemonCommand } = await import("./memory-NAFLQ6NN.js");
220
220
  await memoryStartDaemonCommand();
221
221
  });
222
222
  memory.command("stop-daemon").description("Stop the memory daemon").action(async () => {
223
- const { memoryStopDaemonCommand } = await import("./memory-LBVPVWJQ.js");
223
+ const { memoryStopDaemonCommand } = await import("./memory-NAFLQ6NN.js");
224
224
  await memoryStopDaemonCommand();
225
225
  });
226
226
  memory.command("rebuild").description("Rebuild the daemon search index").action(async () => {
227
- const { memoryRebuildCommand } = await import("./memory-LBVPVWJQ.js");
227
+ const { memoryRebuildCommand } = await import("./memory-NAFLQ6NN.js");
228
228
  await memoryRebuildCommand();
229
229
  });
230
230
  memory.command("mcp").description("Show MCP server setup instructions").action(async () => {
231
- const { memoryMcpCommand } = await import("./memory-LBVPVWJQ.js");
231
+ const { memoryMcpCommand } = await import("./memory-NAFLQ6NN.js");
232
232
  await memoryMcpCommand();
233
233
  });
234
234
  memory.command("rm").description("Remove a project database").option("--project-id <id>", "Project ID to remove").option("--all", "Remove all project databases").option(
@@ -236,7 +236,7 @@ memory.command("rm").description("Remove a project database").option("--project-
236
236
  "Remove orphaned projects (source dir missing or 0 memories)"
237
237
  ).action(
238
238
  async (opts) => {
239
- const { memoryRmCommand } = await import("./memory-LBVPVWJQ.js");
239
+ const { memoryRmCommand } = await import("./memory-NAFLQ6NN.js");
240
240
  await memoryRmCommand(opts);
241
241
  }
242
242
  );
@@ -7,14 +7,14 @@ import {
7
7
  getExistingRules,
8
8
  getMissingRules,
9
9
  logPluginScriptWarning
10
- } from "./chunk-PIXAQLXQ.js";
10
+ } from "./chunk-SKEWZ2ET.js";
11
11
  import {
12
12
  ensureMemoryBuilt,
13
13
  isMemoryInitialized,
14
14
  memoryInitWizard
15
- } from "./chunk-2M42TEZC.js";
15
+ } from "./chunk-DVWCO7K4.js";
16
16
  import "./chunk-HEVK3OYL.js";
17
- import "./chunk-CGZNFAOB.js";
17
+ import "./chunk-ZEOWTLWI.js";
18
18
  import {
19
19
  findStatuslineHookPath,
20
20
  getCurrentAccountEmail,
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  getLatestVersion,
3
3
  semverCompare
4
- } from "./chunk-FSQCAHWF.js";
4
+ } from "./chunk-LZPCZAGZ.js";
5
5
  import {
6
6
  getInstalledVersion
7
7
  } from "./chunk-FK4SXIF7.js";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  resolveLearnDir
3
- } from "./chunk-CGZNFAOB.js";
3
+ } from "./chunk-ZEOWTLWI.js";
4
4
  import "./chunk-ITI7MXLA.js";
5
5
  import {
6
6
  readJson
@@ -4,7 +4,7 @@ import {
4
4
  import {
5
5
  ensureMemoryBuilt,
6
6
  printMemoryMcpConfig
7
- } from "./chunk-2M42TEZC.js";
7
+ } from "./chunk-DVWCO7K4.js";
8
8
  import {
9
9
  checkLearnMcpHealth,
10
10
  checkMemoryMcpHealth,
@@ -15,7 +15,7 @@ import {
15
15
  import {
16
16
  resolveLearnDir,
17
17
  resolveMemoryDir
18
- } from "./chunk-CGZNFAOB.js";
18
+ } from "./chunk-ZEOWTLWI.js";
19
19
  import "./chunk-ITI7MXLA.js";
20
20
  import {
21
21
  isLearnMcpRegistered,
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  resolveProjectMemoryDir
3
- } from "./chunk-CGZNFAOB.js";
3
+ } from "./chunk-ZEOWTLWI.js";
4
4
  import "./chunk-ITI7MXLA.js";
5
5
  import {
6
6
  getLibPath
@@ -14,9 +14,9 @@ import {
14
14
  memoryStopDaemonCommand,
15
15
  printMemoryMcpConfig,
16
16
  refreshMemoryAfterUpdate
17
- } from "./chunk-2M42TEZC.js";
17
+ } from "./chunk-DVWCO7K4.js";
18
18
  import "./chunk-HEVK3OYL.js";
19
- import "./chunk-CGZNFAOB.js";
19
+ import "./chunk-ZEOWTLWI.js";
20
20
  import "./chunk-ITI7MXLA.js";
21
21
  import "./chunk-BQ4E66ZV.js";
22
22
  import "./chunk-KCBMCHSA.js";
@@ -9,7 +9,7 @@ import {
9
9
  getExistingRules,
10
10
  groupByCategory,
11
11
  logPluginScriptWarning
12
- } from "./chunk-PIXAQLXQ.js";
12
+ } from "./chunk-SKEWZ2ET.js";
13
13
  import {
14
14
  askScope,
15
15
  formatScopeLabel,
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  loadConfig
3
- } from "./chunk-CGZNFAOB.js";
3
+ } from "./chunk-ZEOWTLWI.js";
4
4
  import "./chunk-ITI7MXLA.js";
5
5
  import {
6
6
  readJson,
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  getExistingRules
3
- } from "./chunk-PIXAQLXQ.js";
3
+ } from "./chunk-SKEWZ2ET.js";
4
4
  import {
5
5
  listMdFilesRecursive
6
6
  } from "./chunk-2DTXVMPQ.js";
@@ -12,13 +12,13 @@ import {
12
12
  resolveLearnDir,
13
13
  resolveMemoryDir,
14
14
  sanitizeRawConfig
15
- } from "./chunk-CGZNFAOB.js";
15
+ } from "./chunk-ZEOWTLWI.js";
16
16
  import {
17
17
  getCliVersion,
18
18
  getLatestCliVersion,
19
19
  getLatestVersion,
20
20
  semverCompare
21
- } from "./chunk-FSQCAHWF.js";
21
+ } from "./chunk-LZPCZAGZ.js";
22
22
  import {
23
23
  getInstalledVersion
24
24
  } from "./chunk-FK4SXIF7.js";
@@ -5,7 +5,7 @@ import {
5
5
  isCliGlobalLinked,
6
6
  semverCompare,
7
7
  updateCommand
8
- } from "./chunk-FSQCAHWF.js";
8
+ } from "./chunk-LZPCZAGZ.js";
9
9
  import "./chunk-FK4SXIF7.js";
10
10
  import "./chunk-ITI7MXLA.js";
11
11
  import "./chunk-667NMPN4.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "coding-friend-cli",
3
- "version": "1.40.3",
3
+ "version": "1.40.4",
4
4
  "description": "CLI for coding-friend — host learning docs, setup MCP server, initialize projects",
5
5
  "type": "module",
6
6
  "bin": {