@rness/cli 0.22.1 → 0.22.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/README.md CHANGED
@@ -848,6 +848,28 @@ per repository, the files to commit there.
848
848
  Exit codes: 0 success, 1 failure, 2 usage — or a refusal without a TTY.
849
849
  `RNESS_DEBUG=1` adds stack traces; `RNESS_NO_DELEGATE=1` skips the delegation.
850
850
 
851
+ ## 0.22.2 - repository names in any case
852
+
853
+ - `rness add` takes a repository name in any case, as `create` does:
854
+ `rness add dApp` declares `dapp` in `rness.json` and clones into
855
+ `org/dapp`; the URL keeps the spelling typed. `create --repos` follows, and
856
+ `add --scopes apps/Web` declares scope `web`.
857
+ - A clone whose directory differs from its name only by case (`org/dApp` for
858
+ `dapp`) is renamed `org/dapp` by `rness add`, once its origin is checked:
859
+ the confirmation says so, and `--yes` consents to it. A path in another
860
+ case is the same on macOS and Windows but not on Linux, so a teammate's
861
+ clone would not match. Two such directories are refused, named.
862
+ - `rness add` adopts a clone whose origin differs from the URL only by case
863
+ or by transport (an HTTPS clone, an SSH URL in `rness.json`). Another
864
+ repository is still refused.
865
+ - `rness sync` names each directory under `org/` it does not read on a
866
+ `not read:` line, instead of skipping it silently; for `org/dApp` the line
867
+ points at `rness add dapp`, which renames it. A declared repository whose
868
+ directory differs only by case is not cloned a second time and gets no
869
+ block until renamed.
870
+ - `--scope` takes a scope name in any case: `rness context`, `rness sync`,
871
+ and `rness_context` over MCP.
872
+
851
873
  ## 0.22.1 — what rness writes carries no em dash
852
874
 
853
875
  - Nothing rness writes carries an em dash (U+2014) any more: the `AGENTS.md`
package/dist/bin/rness.js CHANGED
@@ -4,11 +4,11 @@ import {
4
4
  catchUp,
5
5
  findDelegate,
6
6
  run
7
- } from "../chunk-SX7D5W43.js";
7
+ } from "../chunk-H5E6FMP6.js";
8
8
  import {
9
9
  VERSION,
10
10
  reportError
11
- } from "../chunk-OUZQGG6V.js";
11
+ } from "../chunk-DFGZWBBW.js";
12
12
 
13
13
  // src/bin/rness.ts
14
14
  import { pathToFileURL } from "url";
@@ -15,7 +15,7 @@ import {
15
15
  recordNotice,
16
16
  resolveScope,
17
17
  statusTabs
18
- } from "./chunk-OUZQGG6V.js";
18
+ } from "./chunk-DFGZWBBW.js";
19
19
 
20
20
  // src/commands/note.ts
21
21
  import { relative, resolve, sep } from "path";
@@ -260,4 +260,4 @@ export {
260
260
  postNote,
261
261
  noteCommand
262
262
  };
263
- //# sourceMappingURL=chunk-PW5RMU2G.js.map
263
+ //# sourceMappingURL=chunk-A7NX55WK.js.map
@@ -1,50 +1,3 @@
1
- // src/core/fs.ts
2
- import {
3
- access,
4
- lstat,
5
- readFile,
6
- rename,
7
- rm,
8
- writeFile
9
- } from "fs/promises";
10
- import { basename, dirname, join } from "path";
11
- async function exists(p) {
12
- try {
13
- await access(p);
14
- return true;
15
- } catch {
16
- return false;
17
- }
18
- }
19
- async function isSymlink(p) {
20
- try {
21
- return (await lstat(p)).isSymbolicLink();
22
- } catch (e) {
23
- if (e.code === "ENOENT") return false;
24
- throw e;
25
- }
26
- }
27
- async function readOrNull(p) {
28
- try {
29
- return await readFile(p, "utf8");
30
- } catch (e) {
31
- if (e.code === "ENOENT") return null;
32
- throw e;
33
- }
34
- }
35
- var sequence = 0;
36
- async function writeFileAtomic(p, text) {
37
- sequence += 1;
38
- const tmp = join(dirname(p), `.${basename(p)}.${process.pid}.${sequence}.tmp`);
39
- await writeFile(tmp, text, "utf8");
40
- try {
41
- await rename(tmp, p);
42
- } catch (e) {
43
- await rm(tmp, { force: true }).catch(() => void 0);
44
- throw e;
45
- }
46
- }
47
-
48
1
  // src/core/frontmatter.ts
49
2
  import { parse } from "yaml";
50
3
  var FRONT_MATTER = /^---\r?\n(?:([\s\S]*?)\r?\n)?---(?:\r?\n|$)/;
@@ -83,8 +36,8 @@ function extractTitle(source) {
83
36
  }
84
37
 
85
38
  // src/core/collect.ts
86
- import { glob, readFile as readFile2 } from "fs/promises";
87
- import { join as join2, posix, sep } from "path";
39
+ import { glob, readFile } from "fs/promises";
40
+ import { join, posix, sep } from "path";
88
41
  function toPosix(rel) {
89
42
  return rel.split(sep).join(posix.sep);
90
43
  }
@@ -111,8 +64,8 @@ async function collectMarkdown(dir) {
111
64
  for await (const rel of glob("**/*.md", { cwd: dir })) rels.push(toPosix(rel));
112
65
  const items = await Promise.all(
113
66
  rels.map(async (rel) => {
114
- const path = join2(dir, ...rel.split(posix.sep));
115
- return markdownItem(path, rel, await readFile2(path, "utf8"));
67
+ const path = join(dir, ...rel.split(posix.sep));
68
+ return markdownItem(path, rel, await readFile(path, "utf8"));
116
69
  })
117
70
  );
118
71
  return items.sort((a, b) => a.rel < b.rel ? -1 : a.rel > b.rel ? 1 : 0);
@@ -152,7 +105,7 @@ function scopeChain(manifest, scope) {
152
105
  }
153
106
 
154
107
  // src/core/context.ts
155
- import { join as join3 } from "path";
108
+ import { join as join2 } from "path";
156
109
  var COLLECTIONS = [
157
110
  "standards",
158
111
  "adr",
@@ -195,14 +148,14 @@ async function assembleContext({
195
148
  const chain = scopeChain(manifest, scope);
196
149
  const collections = await Promise.all(
197
150
  COLLECTIONS.map(
198
- (name) => assembleCollection(join3(rnessDir, name), name, chain)
151
+ (name) => assembleCollection(join2(rnessDir, name), name, chain)
199
152
  )
200
153
  );
201
154
  return { scope, collections };
202
155
  }
203
156
 
204
157
  // src/core/contract.ts
205
- import { join as join4 } from "path";
158
+ import { join as join3 } from "path";
206
159
 
207
160
  // src/core/documents.ts
208
161
  import { posix as posix2 } from "path";
@@ -239,12 +192,12 @@ var STATUSES = {
239
192
  var SKIP = /* @__PURE__ */ new Set(["adr/0000-template.md"]);
240
193
  var PLACEMENT_KEYS = ["scopes", "scope"];
241
194
  async function itemsOf(rnessDir, name, override) {
242
- const items = await collectMarkdown(join4(rnessDir, name));
195
+ const items = await collectMarkdown(join3(rnessDir, name));
243
196
  const prefix = `${name}/`;
244
197
  if (override === void 0 || !override.rel.startsWith(prefix)) return items;
245
198
  const rel = override.rel.slice(prefix.length);
246
199
  const item = markdownItem(
247
- join4(rnessDir, ...override.rel.split("/")),
200
+ join3(rnessDir, ...override.rel.split("/")),
248
201
  rel,
249
202
  override.text
250
203
  );
@@ -316,12 +269,12 @@ async function checkContract(rnessDir, override) {
316
269
 
317
270
  // src/core/contained.ts
318
271
  import { realpath } from "fs/promises";
319
- import { isAbsolute, join as join5, relative } from "path";
272
+ import { isAbsolute, join as join4, relative } from "path";
320
273
  var RNESS_PATH = /^[A-Za-z0-9_-][A-Za-z0-9._-]*(?:\/[A-Za-z0-9_-][A-Za-z0-9._-]*)*$/;
321
274
  async function containedPath(root, rel) {
322
275
  if (!RNESS_PATH.test(rel))
323
276
  throw new Error(`${rel} is not a path within .rness`);
324
- const path = join5(root, ...rel.split("/"));
277
+ const path = join4(root, ...rel.split("/"));
325
278
  const [realRoot, real] = await Promise.all([realpath(root), realpath(path)]);
326
279
  const inside = relative(realRoot, real);
327
280
  if (inside === "" || inside.startsWith("..") || isAbsolute(inside))
@@ -987,6 +940,53 @@ function parseBoard(name, value, knows = isPresetRevision) {
987
940
  };
988
941
  }
989
942
 
943
+ // src/core/fs.ts
944
+ import {
945
+ access,
946
+ lstat,
947
+ readFile as readFile2,
948
+ rename,
949
+ rm,
950
+ writeFile
951
+ } from "fs/promises";
952
+ import { basename, dirname, join as join5 } from "path";
953
+ async function exists(p) {
954
+ try {
955
+ await access(p);
956
+ return true;
957
+ } catch {
958
+ return false;
959
+ }
960
+ }
961
+ async function isSymlink(p) {
962
+ try {
963
+ return (await lstat(p)).isSymbolicLink();
964
+ } catch (e) {
965
+ if (e.code === "ENOENT") return false;
966
+ throw e;
967
+ }
968
+ }
969
+ async function readOrNull(p) {
970
+ try {
971
+ return await readFile2(p, "utf8");
972
+ } catch (e) {
973
+ if (e.code === "ENOENT") return null;
974
+ throw e;
975
+ }
976
+ }
977
+ var sequence = 0;
978
+ async function writeFileAtomic(p, text) {
979
+ sequence += 1;
980
+ const tmp = join5(dirname(p), `.${basename(p)}.${process.pid}.${sequence}.tmp`);
981
+ await writeFile(tmp, text, "utf8");
982
+ try {
983
+ await rename(tmp, p);
984
+ } catch (e) {
985
+ await rm(tmp, { force: true }).catch(() => void 0);
986
+ throw e;
987
+ }
988
+ }
989
+
990
990
  // src/core/git.ts
991
991
  import { execFile } from "child_process";
992
992
  import { dirname as dirname2, resolve } from "path";
@@ -1155,6 +1155,20 @@ var SSH_HOST = "git@github.com:";
1155
1155
  function repoUrl(host, org, repo) {
1156
1156
  return `${host}${org}/${repo}.git`;
1157
1157
  }
1158
+ function remoteKey(url) {
1159
+ let rest = url.trim();
1160
+ const scp = /^[^@/:]+@([^/:]+):(.*)$/.exec(rest);
1161
+ if (scp !== null) rest = `${scp[1]}/${scp[2]}`;
1162
+ else {
1163
+ const full = /^[a-z][a-z0-9+.-]*:\/\/(?:[^@/]*@)?([^/]*)(.*)$/i.exec(rest);
1164
+ if (full !== null)
1165
+ rest = `${(full[1] ?? "").replace(/:\d+$/, "")}${full[2] ?? ""}`;
1166
+ }
1167
+ return rest.replace(/\/+$/, "").replace(/\.git$/i, "").replace(/\/+$/, "").toLowerCase();
1168
+ }
1169
+ function sameRemote(a, b) {
1170
+ return remoteKey(a) === remoteKey(b);
1171
+ }
1158
1172
  var AUTH = [
1159
1173
  /authentication failed/i,
1160
1174
  /permission denied/i,
@@ -1510,14 +1524,15 @@ function parseRepoSpec(spec, org, host) {
1510
1524
  );
1511
1525
  }
1512
1526
  const last = url.replace(/\/+$/, "").split(/[/:]/).at(-1) ?? "";
1513
- const name = last.endsWith(".git") ? last.slice(0, -4) : last;
1527
+ const typed = last.endsWith(".git") ? last.slice(0, -4) : last;
1528
+ const name = typed.toLowerCase();
1514
1529
  if (!NAME.test(name))
1515
- throw new Error(`repository name "${name}" may only contain ${NAME_RULE}`);
1530
+ throw new Error(`repository name "${typed}" may only contain ${NAME_RULE}`);
1516
1531
  return { name, url };
1517
1532
  }
1518
1533
 
1519
1534
  // src/version.ts
1520
- var VERSION = "0.22.1";
1535
+ var VERSION = "0.22.2";
1521
1536
 
1522
1537
  // src/core/pm.ts
1523
1538
  import { execFile as execFile2 } from "child_process";
@@ -4842,15 +4857,71 @@ async function githubProvider(apiBase, wait) {
4842
4857
  });
4843
4858
  }
4844
4859
 
4860
+ // src/core/workspace.ts
4861
+ import { readdir as readdir3 } from "fs/promises";
4862
+ import { dirname as dirname3, join as join10, parse as parse2, resolve as resolve2 } from "path";
4863
+ async function findWorkspace(startDir) {
4864
+ const start = resolve2(startDir);
4865
+ const { root: fsRoot } = parse2(start);
4866
+ const ancestors = [];
4867
+ for (let dir = start; ; dir = dirname3(dir)) {
4868
+ ancestors.push(dir);
4869
+ if (dir === fsRoot) break;
4870
+ }
4871
+ for (const dir of ancestors) {
4872
+ if (await exists(join10(dir, ".rness", "rness.json")))
4873
+ return { root: dir, rnessDir: join10(dir, ".rness") };
4874
+ }
4875
+ for (const dir of ancestors) {
4876
+ if (await exists(join10(dir, "rness.json")))
4877
+ return { root: dirname3(dir), rnessDir: dir };
4878
+ }
4879
+ throw new Error(`no rness workspace found above ${startDir}`);
4880
+ }
4881
+ async function entryFor(root, name) {
4882
+ let entries;
4883
+ try {
4884
+ entries = await readdir3(join10(root, "org"));
4885
+ } catch {
4886
+ return null;
4887
+ }
4888
+ if (entries.includes(name)) return name;
4889
+ const variants = entries.filter((e) => e.toLowerCase() === name).sort();
4890
+ if (variants.length > 1)
4891
+ throw new Error(
4892
+ `${variants.map((v) => `org/${v}`).join(" and ")} both differ from org/${name} only by case: keep one, then run rness add again`
4893
+ );
4894
+ return variants[0] ?? null;
4895
+ }
4896
+ async function orgDirs(root) {
4897
+ let dirs;
4898
+ try {
4899
+ const entries = await readdir3(join10(root, "org"), { withFileTypes: true });
4900
+ dirs = entries.filter((e) => e.isDirectory()).map((e) => e.name);
4901
+ } catch {
4902
+ return { clones: /* @__PURE__ */ new Set(), unread: [] };
4903
+ }
4904
+ return {
4905
+ clones: new Set(dirs.filter(isWorkspaceClone)),
4906
+ unread: dirs.filter(
4907
+ (d) => !isWorkspaceClone(d) && !EXCLUDED_NAMES.has(d.toLowerCase())
4908
+ ).sort()
4909
+ };
4910
+ }
4911
+ async function clonesIn(root) {
4912
+ return (await orgDirs(root)).clones;
4913
+ }
4914
+
4845
4915
  // src/core/repos.ts
4846
- import { glob as glob2, readFile as readFile6, rm as rm3 } from "fs/promises";
4847
- import { isAbsolute as isAbsolute2, join as join10, posix as posix5, relative as relative2, resolve as resolve2, sep as sep2 } from "path";
4916
+ import { glob as glob2, readFile as readFile6, rename as rename2, rm as rm3 } from "fs/promises";
4917
+ import { isAbsolute as isAbsolute2, join as join11, posix as posix5, relative as relative2, resolve as resolve3, sep as sep2 } from "path";
4848
4918
  async function addRepository(input) {
4849
4919
  const { name, url } = parseRepoSpec(input.spec, input.org, input.host);
4850
- const dir = join10(input.root, "org", name);
4920
+ const orgDir = join11(input.root, "org");
4921
+ const dir = join11(orgDir, name);
4851
4922
  const repoPath = `org/${name}`;
4852
4923
  const current = input.manifest.scopes[name];
4853
- if (current !== void 0 && current.path !== repoPath)
4924
+ if (current !== void 0 && current.path.toLowerCase() !== repoPath)
4854
4925
  throw new Error(`scope "${name}" already points at ${current.path}`);
4855
4926
  const scopes = {
4856
4927
  ...input.manifest.scopes,
@@ -4864,50 +4935,69 @@ async function addRepository(input) {
4864
4935
  throw new Error(
4865
4936
  `sub-scope "${clean}" must be a relative path inside the repository`
4866
4937
  );
4867
- const base = segments.at(-1) ?? "";
4938
+ const base = (segments.at(-1) ?? "").toLowerCase();
4868
4939
  const path = `org/${name}/${clean}`;
4869
4940
  if (!NAME.test(base))
4870
4941
  throw new Error(
4871
4942
  `the last segment of sub-scope "${clean}" may only contain ${NAME_RULE}`
4872
4943
  );
4873
4944
  const existing = scopes[base];
4874
- if (existing !== void 0 && existing.path !== path)
4945
+ if (existing !== void 0 && existing.path.toLowerCase() !== path.toLowerCase())
4875
4946
  throw new Error(`scope "${base}" already points at ${existing.path}`);
4876
4947
  scopes[base] = { path, extends: [name] };
4877
- subs.push({ path, base });
4948
+ subs.push({ clean, base });
4878
4949
  }
4950
+ const entry = await entryFor(input.root, name);
4879
4951
  let action;
4880
- if (await exists(dir)) {
4881
- const origin = await originUrl(dir);
4952
+ if (entry !== null) {
4953
+ const found = join11(orgDir, entry);
4954
+ const origin = await originUrl(found);
4882
4955
  if (origin === null)
4883
- throw new Error(`org/${name} exists and is not a git clone`);
4884
- if (origin !== url)
4885
- throw new Error(`org/${name} is a clone of ${origin}, not ${url}`);
4956
+ throw new Error(`org/${entry} exists and is not a git clone`);
4957
+ if (!sameRemote(origin, url))
4958
+ throw new Error(`org/${entry} is a clone of ${origin}, not ${url}`);
4886
4959
  action = "adopted";
4887
4960
  } else {
4888
4961
  await clone(url, dir, input.credentialsFor?.(url) ?? null);
4889
4962
  action = "cloned";
4890
4963
  }
4964
+ const holder = join11(orgDir, entry ?? name);
4891
4965
  const declared = [name];
4892
- for (const { path, base } of subs) {
4893
- if (!await exists(join10(input.root, ...path.split("/")))) {
4966
+ for (const { clean, base } of subs) {
4967
+ if (!await exists(join11(holder, ...clean.split("/")))) {
4894
4968
  if (action === "cloned") await rm3(dir, { recursive: true, force: true });
4895
- throw new Error(`${path} does not exist`);
4969
+ throw new Error(`org/${entry ?? name}/${clean} does not exist`);
4896
4970
  }
4897
4971
  declared.push(base);
4898
4972
  }
4973
+ const renamed = entry !== null && entry !== name ? entry : null;
4974
+ if (renamed !== null) await renameCase(orgDir, renamed, name);
4899
4975
  const manifest = {
4900
4976
  ...input.manifest,
4901
4977
  repos: { ...input.manifest.repos, [name]: { url } },
4902
4978
  scopes
4903
4979
  };
4904
4980
  await writeManifest(input.rnessDir, manifest);
4905
- return { manifest, name, url, action, declared };
4981
+ return { manifest, name, url, action, renamed, declared };
4982
+ }
4983
+ async function renameCase(orgDir, from, to) {
4984
+ const step2 = `${from}.rness-rename`;
4985
+ if (await exists(join11(orgDir, step2)))
4986
+ throw new Error(
4987
+ `org/${step2} exists, left by an interrupted rename: move it back to org/${from}, then run rness add again`
4988
+ );
4989
+ await rename2(join11(orgDir, from), join11(orgDir, step2));
4990
+ try {
4991
+ await rename2(join11(orgDir, step2), join11(orgDir, to));
4992
+ } catch (e) {
4993
+ await rename2(join11(orgDir, step2), join11(orgDir, from));
4994
+ throw e;
4995
+ }
4906
4996
  }
4907
4997
  function cloneHolding(root, repos, dir) {
4908
4998
  for (const [name, repo] of Object.entries(repos)) {
4909
- const clone2 = resolve2(root, "org", name);
4910
- const r = relative2(clone2, resolve2(dir));
4999
+ const clone2 = resolve3(root, "org", name);
5000
+ const r = relative2(clone2, resolve3(dir));
4911
5001
  if (r === "" || !r.startsWith("..") && !isAbsolute2(r))
4912
5002
  return { name, dir: clone2, url: repo.url };
4913
5003
  }
@@ -4917,7 +5007,7 @@ async function workspaceDirs(repoDir) {
4917
5007
  let patterns = [];
4918
5008
  try {
4919
5009
  const pkg = JSON.parse(
4920
- await readFile6(join10(repoDir, "package.json"), "utf8")
5010
+ await readFile6(join11(repoDir, "package.json"), "utf8")
4921
5011
  );
4922
5012
  const w = pkg.workspaces;
4923
5013
  if (Array.isArray(w))
@@ -4934,7 +5024,7 @@ async function workspaceDirs(repoDir) {
4934
5024
  for (const pattern of patterns) {
4935
5025
  for await (const match of glob2(pattern, { cwd: repoDir })) {
4936
5026
  const rel = match.split(sep2).join(posix5.sep);
4937
- if (await exists(join10(repoDir, ...rel.split(posix5.sep), "package.json")))
5027
+ if (await exists(join11(repoDir, ...rel.split(posix5.sep), "package.json")))
4938
5028
  dirs.add(rel);
4939
5029
  }
4940
5030
  }
@@ -4948,38 +5038,6 @@ var defaultTerminal = {
4948
5038
  prompts: () => import("@clack/prompts")
4949
5039
  };
4950
5040
 
4951
- // src/core/workspace.ts
4952
- import { readdir as readdir3 } from "fs/promises";
4953
- import { dirname as dirname3, join as join11, parse as parse2, resolve as resolve3 } from "path";
4954
- async function findWorkspace(startDir) {
4955
- const start = resolve3(startDir);
4956
- const { root: fsRoot } = parse2(start);
4957
- const ancestors = [];
4958
- for (let dir = start; ; dir = dirname3(dir)) {
4959
- ancestors.push(dir);
4960
- if (dir === fsRoot) break;
4961
- }
4962
- for (const dir of ancestors) {
4963
- if (await exists(join11(dir, ".rness", "rness.json")))
4964
- return { root: dir, rnessDir: join11(dir, ".rness") };
4965
- }
4966
- for (const dir of ancestors) {
4967
- if (await exists(join11(dir, "rness.json")))
4968
- return { root: dirname3(dir), rnessDir: dir };
4969
- }
4970
- throw new Error(`no rness workspace found above ${startDir}`);
4971
- }
4972
- async function clonesIn(root) {
4973
- try {
4974
- const entries = await readdir3(join11(root, "org"), { withFileTypes: true });
4975
- return new Set(
4976
- entries.filter((e) => e.isDirectory() && isWorkspaceClone(e.name)).map((e) => e.name)
4977
- );
4978
- } catch {
4979
- return /* @__PURE__ */ new Set();
4980
- }
4981
- }
4982
-
4983
5041
  // src/core/style.ts
4984
5042
  import { styleText } from "util";
4985
5043
  var FORMAT = {
@@ -5500,7 +5558,7 @@ async function loginCommand(opts, deps = {}) {
5500
5558
  }
5501
5559
 
5502
5560
  // src/board/journal-state.ts
5503
- import { mkdir as mkdir2, readFile as readFile7, rename as rename2, rm as rm4, writeFile as writeFile2 } from "fs/promises";
5561
+ import { mkdir as mkdir2, readFile as readFile7, rename as rename3, rm as rm4, writeFile as writeFile2 } from "fs/promises";
5504
5562
  import { dirname as dirname4, join as join12 } from "path";
5505
5563
  var notedOf = (value) => {
5506
5564
  const v = value;
@@ -5520,7 +5578,7 @@ async function writeJson(file, value) {
5520
5578
  const temporary = `${file}.${process.pid}`;
5521
5579
  await writeFile2(temporary, `${JSON.stringify(value, null, 2)}
5522
5580
  `);
5523
- await rename2(temporary, file);
5581
+ await rename3(temporary, file);
5524
5582
  }
5525
5583
  async function notesPosted(rnessDir, session, plan) {
5526
5584
  const file = await gitPath(rnessDir, COUNTS);
@@ -5688,7 +5746,7 @@ async function oneSyncAtATime(key, work, options = {}) {
5688
5746
  }
5689
5747
 
5690
5748
  // src/board/noted.ts
5691
- import { mkdir as mkdir4, readFile as readFile9, rename as rename3, rm as rm6, writeFile as writeFile4 } from "fs/promises";
5749
+ import { mkdir as mkdir4, readFile as readFile9, rename as rename4, rm as rm6, writeFile as writeFile4 } from "fs/promises";
5692
5750
  import { dirname as dirname5 } from "path";
5693
5751
  var NAME2 = "rness/noted";
5694
5752
  function notedFile(rnessDir) {
@@ -5719,7 +5777,7 @@ async function writeNoted(file, noted) {
5719
5777
  `${JSON.stringify([...noted].sort(), null, 2)}
5720
5778
  `
5721
5779
  );
5722
- await rename3(temporary, file);
5780
+ await rename4(temporary, file);
5723
5781
  } catch {
5724
5782
  }
5725
5783
  }
@@ -5742,7 +5800,7 @@ async function onceSaid(rnessDir, board, lines) {
5742
5800
  }
5743
5801
 
5744
5802
  // src/board/opened.ts
5745
- import { mkdir as mkdir5, readFile as readFile10, rename as rename4, rm as rm7, writeFile as writeFile5 } from "fs/promises";
5803
+ import { mkdir as mkdir5, readFile as readFile10, rename as rename5, rm as rm7, writeFile as writeFile5 } from "fs/promises";
5746
5804
  import { dirname as dirname6 } from "path";
5747
5805
  var NAME3 = "rness/opened";
5748
5806
  function openedFile(rnessDir) {
@@ -5780,7 +5838,7 @@ async function writeOpened(file, opened) {
5780
5838
  `${JSON.stringify(Object.fromEntries(entries), null, 2)}
5781
5839
  `
5782
5840
  );
5783
- await rename4(temporary, file);
5841
+ await rename5(temporary, file);
5784
5842
  } catch {
5785
5843
  }
5786
5844
  }
@@ -6742,7 +6800,7 @@ async function run(opts, failures) {
6742
6800
  if (event === "session-end") {
6743
6801
  for (const d of acting("journal-summary"))
6744
6802
  try {
6745
- const { postSummary } = await import("./summary-5DVUIOJM.js");
6803
+ const { postSummary } = await import("./summary-K5ETHXOX.js");
6746
6804
  await postSummary({
6747
6805
  c,
6748
6806
  board: d,
@@ -6832,10 +6890,6 @@ async function pulseCreateCommand(collection, opts, deps = {}) {
6832
6890
  }
6833
6891
 
6834
6892
  export {
6835
- exists,
6836
- isSymlink,
6837
- readOrNull,
6838
- writeFileAtomic,
6839
6893
  containedPath,
6840
6894
  parseFrontMatter,
6841
6895
  extractTitle,
@@ -6855,6 +6909,10 @@ export {
6855
6909
  contractOf,
6856
6910
  PULSE,
6857
6911
  parseBoard,
6912
+ exists,
6913
+ isSymlink,
6914
+ readOrNull,
6915
+ writeFileAtomic,
6858
6916
  clone,
6859
6917
  isClean,
6860
6918
  changedPaths,
@@ -6914,6 +6972,10 @@ export {
6914
6972
  unsupportedProviderMessage,
6915
6973
  openProvider,
6916
6974
  openGitProvider,
6975
+ findWorkspace,
6976
+ entryFor,
6977
+ orgDirs,
6978
+ clonesIn,
6917
6979
  addRepository,
6918
6980
  cloneHolding,
6919
6981
  workspaceDirs,
@@ -6930,8 +6992,6 @@ export {
6930
6992
  banner,
6931
6993
  plainUi,
6932
6994
  makeUi,
6933
- findWorkspace,
6934
- clonesIn,
6935
6995
  reportError,
6936
6996
  declaredBoard,
6937
6997
  readBoards,
@@ -6959,4 +7019,4 @@ export {
6959
7019
  boardRunCommand,
6960
7020
  pulseCreateCommand
6961
7021
  };
6962
- //# sourceMappingURL=chunk-OUZQGG6V.js.map
7022
+ //# sourceMappingURL=chunk-DFGZWBBW.js.map